MCP specification 2026-07-28
The revision that made MCP stateless. The initialize handshake is gone, every request carries its own protocol version, servers advertise themselves through server/discover, and change notifications move to subscriptions/listen.
Status
The current protocol version is 2026-07-28.
[source]
How the version is agreed
There is no negotiation handshake. Every request carries its protocol version, and the server accepts or rejects each request independently.
[source]
Clients seen speaking it
- Claude Code version 2.1.296, observed
Key changes
Make MCP stateless: remove the initialize/notifications/initialized handshake. Every request now carries its protocol version and client capabilities in _meta (io.modelcontextprotocol/protocolVersion, io.modelcontextprotocol/clientCapabilities).
[source]Add server/discover: servers MUST implement this RPC to advertise their supported protocol versions, capabilities, and identity.
[source]Remove protocol-level sessions and the Mcp-Session-Id header from the Streamable HTTP transport.
[source]Replace the HTTP GET endpoint and resources/subscribe/resources/unsubscribe with subscriptions/listen
[source]Remove ping, logging/setLevel, and notifications/roots/list_changed.
[source]Move experimental tasks out of the core protocol and into an official extension (io.modelcontextprotocol/tasks).
[source]Require ttlMs and cacheScope fields on results returned by tools/list, prompts/list, resources/list, resources/read, and resources/templates/list via a new CacheableResult interface.
[source]Deprecate the Roots, Sampling, and Logging features
[source]