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]

Read the 2026-07-28 specification

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

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]

Full changelog

Other revisions

© 2026 ABWaters. Thinking out loud.