Request
params.cursor to fetch a later page. Pages hold 50 tools; the cursor
is an opaque offset returned as nextCursor.
Response
Tool names
The wire name is{namespace}_{tool} — one underscore, no double underscore.
The namespace comes from the capability’s namespace field, which is unique per
account.
Do not assume a namespace from the capability’s display name — read it from
GET /v1/capabilities.
Caching
cacheScope is private on every gateway, always — never public.
The response is a function of the calling principal, not just the gateway. Two
callers on one gateway legitimately receive different lists: autonomy
annotations are computed per caller, and since workspace-anchor withholding
landed, so is the membership of the list. A shared cache could serve an
authenticated caller’s fuller tool list to an anonymous one.
ttlMs is 300000 (5 minutes). It is a freshness hint, not a snapshot
guarantee — the list may change before it expires, and pages carry no cross-page
consistency guarantee. Because
no list_changed notification is ever sent, this TTL
is the only staleness signal a client gets.
Staleness never grants authority. A stale allow annotation is a hint that the
gate re-evaluates at dispatch and can still deny.
Clients on protocol versions before 2026-07-28 receive both fields and will
simply ignore them.
Withheld tools
Some tools cannot function without a workspace anchor. On an MCP gateway, an anonymous caller has no anchor, so those tools are removed from the list entirely rather than advertised and then failed at call time. They are also removed from the discovery corpus, so they are not callable by name either.
Browser’s
markdown, content, extract_json, scrape, and links work
sessionlessly and stay listed.
Guessing a withheld tool’s name and calling it returns an invalid-tool-name
error — the same shape as a tool that does not exist, so the response does not
confirm it is there.
Autonomy annotations
Each capability tool carries its static autonomy verdict:
Two properties to design around:
- Denied tools stay listed. Omitting them would churn the surface on every policy edit and hide deliberate “exposed but never autonomous” intent.
- No
reasonis on the wire.tools/listis reachable unauthenticated on public gateways, and the reason would name the account’s policy internals.
_meta entry as “unknown”, never as “allowed”.
Presentation modes
A gateway renders its tools in one of four modes, set per gateway:
Adaptive is the platform default. In Discovery and Unified modes the underlying
tools are not directly callable — reaching them goes through the meta-tool.
Errors
Missing or invalid credentials fail during transport authentication, before this
method runs — see Authentication.