Skip to main content
POST /mcp answers two protocol legs, both stateless. The client picks the leg, and the API serves either on the same route with the same key. Connecting a client says which leg each client takes, as far as a live call confirmed it. This page shows the wire.

The initialize-era leg

An initialize-era client sends the plain handshake. It gets one text/event-stream frame, and the frame closes as soon as the server writes it, so a proxy has nothing to hold open:
The frame answers the protocol version the client named when the server speaks it, else the newest the server speaks. The real frame also carries serverInfo.version, the API version that answers, the figure at the top of the changelog. This page leaves it out, because it moves with every release. The API writes the frame before the tool runs. So a charged tools/call on this leg is billed per call, at the largest cost its page can have, served or refused. meta.credits.charged carries that weight.

The 2026-07-28 leg

The 2026-07-28 leg adds three headers and the two _meta protocol keys inside params. The answer is application/json with cache-control: private, no-cache and no x-accel-buffering. Mcp-Protocol-Version and Mcp-Method go on every message. Mcp-Name carries the name or the uri the body names, on a tools/call, a resources/read and a prompts/get alike:
Swap tools/call for server/discover or tools/list, and drop Mcp-Name: those two methods name nothing. resources/read and prompts/get still need it, with godmode://concepts or who_owns_this_house as the value. Without it the route answers 400 with JSON-RPC -32020. The message says that the request headers and the body disagree, because the body carries params.uri or params.name and the required header is absent. On this leg a charged tools/call pays one credit per record new to your account, plus the tool’s base. A record the account already saw costs nothing. meta.credits.charged is the ledger’s figure.

What both legs share

Every answer carries x-request-id, the id to quote in a bug report. It also carries one label per loaded market on x-dataset-version and x-data-end, the values meta.coverage[] carries too. The server sends no Mcp-Session-Id, invites no change stream (listChanged and subscribe are false) and answers a notification with 202 and no body. GET /mcp and DELETE /mcp answer 405. The three error shapes a call can meet are on Errors over MCP.