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:

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":

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:

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.