Transport
Streamable HTTP, mounted at the gateway origin. Because the transport is the router’s fallback, it answers on the origin root and on any path the gateway does not otherwise claim. A request must accept both content types, or the gateway returns 406:text/event-stream frames on that POST
response. SSE keep-alive is disabled.
Protocol version and sessions
Version negotiation happens at the transport. The gateway echoes any protocol version it recognizes and falls back to2025-11-25 for a version it does
not.
Session behavior follows from the version the client asks for:
For a modern stateless client,
GET on the origin returns 405 Method Not
Allowed — there is no server-to-client stream to open, and stateless SSE
resume via Last-Event-ID is not offered. Legacy-protocol clients holding a
valid session id can still open the GET stream.
Never send
Mcp-Session-Id expecting it to select your workspace. The
gateway does not consult it for scoping. The workspace anchor that backs
file, sandbox, and browser-artifact tools is derived server-side from the
gateway and the authenticated user, and nothing comes off the wire.Methods
The gateway implements four methods and declines the rest.What is not implemented
The gateway advertises tools only. It does not declare resources, prompts, logging, or completions capabilities.
There is no resource or prompt implementation behind any of these. An empty
resources/list is not an empty gateway — it is a gateway that does not serve
resources at all.
No list_changed notification
notifications/tools/list_changed is never sent. Bindings can change, a
gateway’s presentation mode can change, and a connector’s upstream server can
change its own tools on someone else’s deploy schedule — none of it produces a
notification.
The only staleness signal a client gets is the ttlMs freshness hint on
tools/list. See tools/list.
Server info
initialize returns:
capabilities carries tools and nothing else — note that listChanged is not
advertised, consistent with the section above.
Authentication
Gateways are Public, Private, or Private with dynamic client registration. Each gateway origin is its own OAuth authorization server, with discovery at/.well-known/oauth-authorization-server and
/.well-known/oauth-protected-resource.
A token minted for one gateway does not validate at another.
Authentication
Header forms, admission rules, and the advertised OAuth metadata.
tools/call, and including anonymous requests to a public
gateway. No available budget returns 402 Payment Required; a failure to
determine the state returns 503.
tools/call allocates budget a second time, at dispatch, and reports that
failure inside the JSON-RPC envelope rather than as an HTTP status — see
Call a tool.
Limits
tools/call and tools/list share the request budget — it is flood control,
not per-method fairness. Exceeding it returns JSON-RPC -32029; exceeding the
handshake limit returns HTTP 429 with Retry-After: 60. Both limiters fail
open if their counter is unreachable.
Anonymous callers on a public gateway are keyed by peer IP rather than sharing
one bucket, so one abusive client cannot starve the rest.
Errors and limits
Error codes and retry guidance.
What reaches the tool list
Three capability kinds surface on a gateway: plugins (WASM), built-ins, and connectors (REST, MCP registry servers, custom MCP servers). Not every built-in is MCP-reachable. Each declares an exposure scope, and the gateway surface requires the MCP flag:Computernever appears on an MCP gateway — it is agent-surface only.- Plugin Builder, Skill Builder, and Workflow Builder appear on MCP gateways but not in workflows.
- Everything else is available on all three surfaces.
Autonomy on this surface
MCP is an unattended surface: there is no live channel to ask a human for approval. A call that would pause for approval auto-denies instead, with the reasonnon_interactive_surface.
Each listed tool carries its static autonomy outcome so a well-built client can
skip calls that will deterministically fail. See
tools/list.