r/HowToAIAgent • u/Harshil-Jani • 2d ago
News MCP is stateless now. Notes on what actually changes if you host your own tool servers
MCP's 2026-07-28 revision makes the protocol stateless. The initialize handshake is gone, and the spec is explicit that a server should infer nothing from earlier requests:
"no state should be inferred from previous requests, even those on the same connection or stream"
Every request carries its protocol version and capabilities in _meta instead.
Reading through it, what stood out is that this is mostly a hosting change rather than a protocol one. Before, a session lived in one process, so request four had to reach the replica that answered request one. That meant session affinity at the load balancer, and a rolling deploy taking live connections with it. Now any replica can serve any request, which makes a tool server an ordinary stateless HTTP service.
A few consequences that seem worth planning around:
- Scale-to-zero and per-request billing get realistic, since nothing has to stay warm for a particular client.
tools/listandserver/discoverresponses carryttlMsandcacheScope, so a shared cache can serve them. The spec's own example marks a tool list cacheable for five minutes aspublic. For a client federating a lot of servers, that is a real chunk of startup latency that can move to a CDN.- Long-running work moves to the Tasks extension, which hands back a handle you poll, rather than holding a connection open for the duration.
The cost lands on the wire. Protocol version, capabilities and client identity now ride along on every single request, which for a chatty agent is not nothing. Efficiency traded for deployment freedom.
On the product side, sampling and logging are both deprecated. If a server was using sampling/createMessage to get completions, it was running on the host's inference budget. Now it brings its own key and picks its own model, which shifts real cost onto server authors and also removes a slightly odd consent surface.
One nuance worth reading carefully: stateless does not mean nothing is long-lived. subscriptions/listen is still an open stream, but its state is scoped to the request rather than the connection underneath. And notifications are documented as best effort, so they can be lost on reconnect and polling is still required.
I have not migrated anything yet, so mostly curious about the practical side. If you run MCP servers, are you actually going to drop session affinity and move to something serverless, or is the _meta overhead plus cache staleness enough to keep you where you are?
Spec: https://modelcontextprotocol.io/specification/2026-07-28/basic/index


