Structural Comparison Matrix
| # | Change | Old behavior | New behavior | Status |
|---|---|---|---|---|
| 1 | Protocol-level sessions | Mcp-Session-Id header, sticky routing | Explicit server-minted handles as tool arguments | Breaking |
| 2 | Handshake | One-time initialize/initialized exchange | Per-request _meta version/capability fields | Breaking |
| 3 | Server discovery | Implicit, via initialize | Mandatory server/discover RPC | Breaking (new requirement) |
| 4 | Change notifications | Persistent SSE GET stream, all types | Opt-in subscriptions/listen, typed | Breaking |
| 5 | Health check / log level | ping, logging/setLevel RPCs | No direct replacement; log level via _meta | Breaking (removed) |
| 6 | Long-running tasks | Experimental core, blocking tasks/result | Formal extension, polling via tasks/get | Breaking |
| 7 | Result shape | Implicit result, server-initiated mid-call requests | Mandatory resultType, client-driven MRTR pattern | Breaking |
| 8 | Stream resumability | Last-Event-ID, resume in place | None; re-issue the request as new | Breaking (removed) |
| 9 | Roots, Sampling, Logging | Core features | Deprecated, 12-month minimum runway | Deprecated |
| 10 | OAuth client registration | Dynamic Client Registration (RFC 7591) | Client ID Metadata Documents | Deprecated |
Every row above is drawn directly from the spec’s own changelog entry for that change, not summarized from memory. Full mechanism, exact spec language, and migration path live in each linked post.
The 10 changes, in detail
- MCP Removes Protocol-Level Sessions (Mcp-Session-Id): cross-call state now requires explicit, server-minted handles, not a session header.
- MCP Replaces initialize Handshake With _meta Fields: version and capability negotiation happens per-request now, not once at connection start.
- MCP Servers Must Now Implement server/discover: a new mandatory RPC, since there’s no
initializecall left to fall back on for discovery. - MCP Replaces SSE Subscriptions With subscriptions/listen: clients must explicitly opt into each notification type they care about.
- MCP Removes the ping and logging/setLevel Methods: no direct replacement for either; log level moves to a per-request
_metafield. - MCP Moves Tasks Out of Core Into an Extension: a namespace change and a control-flow rewrite, from blocking to polling.
- MCP Requires resultType on Every Returned Result: every response needs an explicit discriminator; the MRTR pattern replaces server-initiated mid-call requests.
- MCP Removes SSE Resumability (Last-Event-ID Gone): a broken stream now means re-issuing the whole request, not resuming in place.
- MCP Deprecates Roots, Sampling, and Logging: a deprecation with a runway, not an immediate break.
- MCP Deprecates OAuth Dynamic Client Registration: a migration path to Client ID Metadata Documents, at the authorization layer.
Why this happened in one revision
MCP’s 2026-07-28 revision moves the protocol from a connection-oriented, session-based design toward a stateless core, a structural shift that touches transport, discovery, notifications, and result handling all at once rather than landing as incremental point changes. None of the mechanisms above are speculative: every one is drawn directly from the official specification changelog, published the same day as the revision itself.
Browse the rest of the AI Productivity archive for more MCP and agent-tooling coverage.







