The flow
Two auth relationships and two run modes, around one control-plane engine. Your agent connects to the MCP surface; the engine comprehends the API once, then serves and calls it — injecting credentials at call time and staying out of the data path.Your agent connects to the MCP surface; Gecko comprehends the API once, then injects credentials at call time and stays out of the data path.
gecko add stays zero-login; the identity plane gates only the hosted
surface. In recorded mode the request is built and proven well-formed but the
response is synthesized from the schema — it never touches the provider plane. In
live mode access injects credentials and the agent gets the real API’s data
directly; that data never passes through Gecko.
Invariants
Control plane, never data plane
Stores the API surface, tool defs, and correctness metadata only — never response
payloads, user data, or secrets.
The engine is API-agnostic
Everything API-specific reduces to data (the spec) plus one adapter seam,
Session.auth_headers(). Adding an API doesn’t touch ingest/catalog/tools/caller.One code path, two modes
recorded and live differ only at the transport edge. The free offline
simulation comes first; live smoke is the final check.Auth is invisible to the agent
Tool defs never expose auth headers. The agent describes intent; Gecko injects
credentials at call time.
Module map
The comprehension logic is the product and lives in the package; the MCP server, the client, and the scripts are thin transport.The one seam that matters
Adding a new API should not require touching ingest, catalog, tools, or the caller. The only API-specific code is, at most, an auth adapter — an object that implements:{}); a paywalled API supplies
a session that returns its tokens. See Access & auth.
Outcome logging (control-plane safe)
The validator and the evaluation harness append outcome metadata only — tool name, rank, ok/reason — to a JSONL log. They never write response payloads. Turning that metadata into a richer, multi-API correctness signal is V2 work and is not live today; see Status.Security posture
- Ingested spec/doc content is treated as untrusted input.
- URLs are validated before fetching (no SSRF — private/loopback/link-local ranges and non-http schemes blocked).
- Secrets come from the environment/session and are never logged or persisted; errors redact tokens before they’re raised.
- Stdlib-first networking (
urllib); minimal dependencies, so the engine ports anywhere.