Wink Pings

MCP removed sessions, and state was moved somewhere the model can see

This round of Anthropic's MCP update removes the initialize handshake and Mcp-Session-Id. Servers can run behind ordinary round-robin load balancing, in serverless, and at the edge, but three capabilities were forced to be rebuilt. More interestingly, state did not disappear; it just moved from the header into parameters the model can read.

MCP is a protocol that lets models call external tools. MCP servers used to be like making a phone call: the client and server first did an initialize handshake, the server returned a session id, and every subsequent request carried it. This session was a live object inside a particular server process, holding the negotiated state.

The problem is concrete. State lived in only one process, so a load balancer couldn't freely distribute requests across three MCP server instances. Teams could only use sticky sessions to pin the same client to the same machine, or stuff session state into shared storage. Autoscaling got stuck, and a single restart would lose all open sessions.

What Daily Dose of Data Science calls Anthropic's biggest MCP update so far simply removes these. The initialize handshake and the Mcp-Session-Id header are gone; each request carries the protocol version, client identity, and capabilities itself in the _meta field. If a client wants to get the capability list in advance, it can call server/discover, but that isn't mandatory.

Put another way: before, the waiter taking orders in a restaurant was the only one who knew the order, and things got messy when the waiter went off shift. Now every order is a written ticket, and any waiter can pick it up. Requests can land on any instance behind an ordinary round-robin load balancer, with no need for a shared session store. MCP servers become ordinary HTTP services, can run in serverless and edge environments, and can survive restarts.

Removing sessions breaks three capabilities, so each was rebuilt in its own way.

When a tool needs to ask the user something mid-call, it used to push the question down by keeping a stream open. Now the server returns input_required, and the client retries with the answer.

Method and tool names move into two headers, Mcp-Method and Mcp-Name. A gateway or rate limiter can route and meter without parsing the JSON-RPC body.

List responses carry ttlMs and cacheScope. Clients can cache the tool catalog and don't need to fetch it again on every reconnect.

The most noteworthy point here: state didn't disappear; it just changed location. Applications that need continuity get an explicit handle from a tool, and the model passes it back as a parameter on the next call. A session id was hidden in a header, invisible to the model; a handle lives in parameters, so the model can read it, carry it across tools, and recover after a failed call.

So this update reduces deployment burden but shifts responsibility at the design level. A reply rightly reminded us: authentication, long-running tasks, and per-user context still need somewhere to live. Stateless transport does not mean these concerns automatically disappear.

Original tweet: https://x.com/DailyDoseOfDS_/status/2119459958198808965

发布时间: 2026-11-09 18:29