MCP Goes Stateless

The 2026-07-28 MCP specification landed yesterday, and it is the biggest revision the protocol has had: MCP moves from a bidirectional, stateful protocol to request/response and stateless. The pieces that matter:

  • The initialize handshake is gone
  • Protocol-level sessions are gone
  • Cross-call state becomes explicit handles in tool arguments
  • Elicitation survives statelessness via multi round-trip requests

What was removed

The initialize/notifications/initialized handshake no longer exists. Every request now carries its own protocol version and client capabilities in _meta fields, so a server learns everything it needs from the request in front of it.

Sessions went with it. The Mcp-Session-Id header is removed from the Streamable HTTP transport, and the list endpoints (tools/list, resources/list, prompts/list) may no longer vary per connection. A server that needs state across calls mints an explicit handle and passes it back as an ordinary tool argument, per SEP-2567 in the changelog.

The consequence for anyone hosting MCP servers: any request can land on any instance. Sticky routing and shared session stores stop being protocol requirements and become implementation choices.

The part worth copying: input_required

Statelessness usually kills interactive flows, and elicitation was the stateful feature worth saving. The answer is Multi Round-Trip Requests: a server that needs more information returns resultType: "input_required" with the questions attached, and the client retries the original call with the answers in inputResponses. The state lives in the retried request, not in the server.

That pattern generalises beyond MCP. It is the same shape as a coworker asking a question and waiting rather than holding a lock open: park the pending work in the message instead of the process.

What it means for a server author

I maintain an MCP server (the jcodemunch code index), so the practical read matters to me. Nothing breaks on day one: earlier spec revisions keep working, the deprecated features (Roots, Sampling, Logging, and the old HTTP+SSE transport) carry a minimum twelve-month window, and all four Tier-1 SDKs shipped support on publication day after a ten-week release-candidate soak that started in May.

The direction is the story. A stateless MCP server is a plain web service: horizontally scalable, cacheable (the revision adds response caching), deployable behind any load balancer. The protocol stops asking infrastructure for special treatment, which is usually the moment a platform’s hosting story goes from bespoke to boring, in the good sense.