The Model Context Protocol just dropped a major revision that fundamentally changes how clients and servers talk. As of the 2026-07-28 spec update, MCP is officially stateless. The initialize handshake is gone, the Mcp-Session-Id header is dead, and every single request must now carry its own context. If you are running MCP servers in production pipelines, this is not a patch-level update; it is an architectural shift.
The Death of the Handshake
Under previous versions, establishing a connection required a multi-step dance: send initialize, negotiate capabilities, wait for the server to issue a session ID, and echo that ID on every subsequent call. The new spec deletes all of that. Instead, clients embed their protocol version and capabilities directly into the _meta field of every request, using namespaced keys like io.modelcontextprotocol/protocolVersion. If a server doesn't support the version, it returns an UnsupportedProtocolVersionError instead of failing a handshake. For most simple integrations, this means your connection setup code is now obsolete.
Explicit State Over Implicit Sessions
Removing session headers doesn't mean servers can't keep state, but it does mean they can no longer rely on the connection to track it. If your server previously stored cursors or transaction data in memory keyed by Mcp-Session-Id, that code will break. The new pattern requires explicit handles: the server mints an identifier, returns it in a tool result, and the client passes it back as a standard argument on the next call. This approach is actually more robust for horizontal scaling, as explicit handles survive load balancers and restarts better than connection-bound sessions ever did.
Multi Round-Trip Requests Replace Callbacks
The spec also introduces Multi Round-Trip Requests (MRTR) to replace the old server-initiated callbacks for sampling and elicitation. Since the protocol is now stateless, a server cannot hold a request open to wait for client input. Instead, it returns a result with resultType: "input_required" and a list of needed inputs. The client then gathers the data and retries the original request with inputResponses attached. Note that Roots, Sampling, and Logging are now deprecated as standalone features, so if you relied on server-driven logging, you need a new plan.
Caching and Breaking Changes
SEP-2549 introduces native caching hints for tools and resources, using ttlMs and cacheScope fields in the result body. This is a cheap win for pipelines that constantly rediscover server capabilities. However, the revision is littered with smaller breaking changes that will trip up your monitoring. HTTP requests now require Mcp-Method and Mcp-Name headers, ping and logging/setLevel are removed, and SSE resumability is gone. Error codes have also been renumbered, with resource-not-found shifting to -32602. If your error handling matches specific codes, update those patterns immediately.
Migration Strategy for Data Teams
For teams running MCP in data pipelines, the migration path is clear but non-trivial. Start by auditing your code for references to initialize, Mcp-Session-Id, and hard-coded error numbers. Refactor any stateful server logic to use explicit handles, and replace server-initiated callbacks with the new MRTR retry loop. While the spec offers backward compatibility during rollout, you should test in a low-traffic environment first. Watch for UnsupportedProtocolVersionError to ensure your client and server revisions can coexist before promoting to production.
Key Takeaways
- MCP is now stateless: the initialize handshake and Mcp-Session-Id header are removed, requiring clients to embed protocol context in the _meta field of every request.
- Server state must be explicit: servers now mint handles returned in tool results, which clients pass back as arguments, improving scalability over connection-bound sessions.
- Multi Round-Trip Requests (MRTR) replace server callbacks: servers return resultType: "input_required" when they need client input, forcing a retry loop instead of holding connections open.
- Breaking changes include new HTTP headers (Mcp-Method, Mcp-Name), renumbered error codes (resource-not-found is now -32602), and the removal of ping and SSE resumability.
The Bottom Line
MCP 2026-07-28 trades implicit connection state for explicit, per-request context. For simple clients, the migration is mostly an SDK upgrade, but for servers relying on session state or callbacks, it is a real refactor. Read the changelog before you upgrade; the smaller breaking changes are the ones that surprise you in production.