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
Aninitialize-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:
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:
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 carriesx-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.