The 2026-07-28 release candidate is published. The final Model Context Protocol specification ships on July 28 — twelve days from now. Here is the part that matters before you clear your afternoon: nothing you run today stops working on the 28th. The new lifecycle policy guarantees at least twelve months between a feature going Deprecated and being Removed. So this is not a fire drill.
It is, though, the last moment to migrate against a surface that has stopped moving. The RC is the freeze. If you're going to do the work — and you should, because every host is about to optimize for the new shape — do it in the order below, from loudest failure to quietest.
Nothing breaks on the 28th. But the RC is the last window to migrate against a frozen surface.
1. Rip out the handshake (the stateless core)#
The biggest structural change: sessions are gone from the protocol layer. There is no more initialize / initialized handshake and no Mcp-Session-Id header to carry. Every request now describes itself and can route to any server instance.
What to do:
- Delete the handshake logic on both client and server.
- Route on the
Mcp-Methodheader instead of a session. - Drop your sticky-session config and the shared session store — a plain round-robin load balancer is now enough. This is the whole reason the change exists: remote MCP servers were carrying session infrastructure they no longer need. (We walked through the reasoning when the RC first surfaced, in MCP goes stateless.)
- On the client, you can now cache
tools/listresponses, because they no longer depend on session state.
This one fails loudly if you miss it, which is the good kind of failure.
2. Migrate off the three deprecated primitives#
Three original capabilities are deprecated: Roots, Sampling, and Logging. They are the exact three where the server reached back through the connection into your runtime — which is precisely what an enterprise security review flags. (The why is worth reading in full: what the 2026-07-28 spec cuts and why.)
The replacements are all "make it explicit":
- Roots → pass paths as tool parameters or resource URIs. The path arrives as an argument you can see and audit, not as the server rummaging through your filesystem layout.
- Sampling → give the server its own LLM provider credentials and call the API directly. Stop borrowing the client's model through the connection.
- Logging → emit to
stderr(for stdio servers) or OpenTelemetry. Keep logs off the protocol wire.
These keep working for at least twelve months, so there's no emergency. But new servers should stop emitting them today — you don't want to ship a primitive that every host is learning to treat as legacy.
3. Update the auth client#
The authorization rewrite adds zero new mechanisms; it makes MCP behave like a boring OAuth 2.1 / OpenID Connect resource server so it plugs into the identity providers enterprises already run. (Six SEPs, broken down in the auth rewrite.) The concrete client-side moves:
- Validate the
issparameter — it's now mandatory. If you don't check the issuer, you fail the spec and open a confused-deputy gap. - Declare
application_typeexplicitly during registration. - Review the clarified scope-accumulation rules so you're not silently over-granting.
4. The silent breaker: one error code#
Save this for last only because it's fast, not because it's minor. The JSON-RPC error code for resource-not-found changed from -32002 to -32602.
A handshake removal breaks with a stack trace. An error-code change breaks with a wrong answer. If any client logic branches on -32002 to detect a missing resource, it will now misclassify every miss and keep running. Grep your codebase for the literal -32002 and fix each site. That's the whole task.
What you can safely ignore for now#
Extensions are opt-in and negotiated — you don't have to adopt any of them to be compliant. The one exception is Tasks: if you used the experimental 2025-11-25 Tasks API, migrate it to the new extension lifecycle (tasks/get, tasks/update, tasks/cancel), where a tool call returns a task handle the client drives. Everything else — MCP Apps' sandboxed HTML UI, the rest of the ext-* catalog — is additive. Reach for it when you have the problem, not because the spec version bumped.
The one-line version: stateless core first (loud), then unwind Roots/Sampling/Logging (no rush, but start now), then harden auth, then grep for -32002. Twelve days is plenty — if you spend them in that order.



