MCP spec 2026-07-28 (current): what changed
2026-07-28 is the current revision of the Model Context Protocol
specification, published on 28 July 2026. It is the largest revision since the
protocol launched, and it is the version VerifyMCP treats as up to date: a
server that speaks it earns full protocol-recency credit when we score it.
It is also the first revision that is not backwards compatible on the wire.
Everything up to and including 2025-11-25 opened a connection with an
initialize handshake. This revision removes that handshake entirely, so a
client and a server on opposite sides of the line cannot talk to each other at
all. The spec calls the two halves legacy and modern.
What changed versus 2025-11-25
The major changes, as listed in the official changelog, are:
- A stateless core. The
initialize/notifications/initializedhandshake is gone. Every request now carries its own protocol version and client capabilities in_meta, under the keysio.modelcontextprotocol/protocolVersionandio.modelcontextprotocol/clientCapabilities. A version the server does not implement comes back as anUnsupportedProtocolVersionError(-32022) listing the versions it does support. - No more sessions. The
Mcp-Session-Idheader and protocol-level sessions are removed from the Streamable HTTP transport, and list endpoints no longer vary per connection. A server that needs state across calls now mints an explicit handle and passes it as an ordinary tool argument. server/discover. Servers must implement a new discovery RPC that reports their supported protocol versions, capabilities and identity in one call. Clients may call it up front, and on stdio it doubles as the backwards-compatibility probe.- Multi Round-Trip Requests (MRTR) replace server-initiated requests. Rather
than sending its own
sampling/createMessageorelicitation/create, a server returns anInputRequiredResultcarryinginputRequests, and the client retries the original request withinputResponses. Every result now carries aresultTypeof either"complete"or"input_required"; a result from an earlier-protocol server that omits the field must be read as"complete". subscriptions/listenreplaces the HTTP GET endpoint and theresources/subscribepair, as a single long-lived POST-response stream that clients opt in to per notification type.- Official extensions. MCP Apps (interactive UI) and MCP Tasks (long-running
work) graduated out of the core protocol into a formal extensions framework,
advertised through a new
extensionsfield on client and server capabilities. - Response caching. List and read results now carry
ttlMsandcacheScope, so clients can cache instead of polling. - Standard request headers. Streamable HTTP POSTs must mirror the JSON-RPC
method into
Mcp-Method, and the tool or resource name intoMcp-Name, so intermediaries can route without parsing the body. A server rejects a request whose headers disagree with its body. - Removals:
ping,logging/setLevel,notifications/roots/list_changed, and SSE stream resumability (Last-Event-ID).
What is now deprecated
This revision also adopted a formal feature lifecycle and deprecation policy, with a minimum twelve-month deprecation window and a published registry. Newly deprecated, and still fully functional in the meantime:
- Roots, Sampling and Logging. Pass directories through tool parameters or
resource URIs instead of Roots, integrate with an LLM provider directly
instead of Sampling, and log to
stderror OpenTelemetry instead of Logging. - The HTTP+SSE transport, deprecated since
2025-03-26, is now classified Deprecated under the policy and is eligible for removal in a future revision. Migrate to Streamable HTTP. - OAuth Dynamic Client Registration (RFC 7591), in favour of
Client ID Metadata Documents,
where the client ID is an HTTPS URL the authorisation server resolves on
demand. Authorisation servers advertise support with
client_id_metadata_document_supported.
Why it matters
The stateless core is the headline: without a handshake or a session, an MCP server is an ordinary request/response HTTP service, so it can run on serverless and edge infrastructure and scale horizontally without sticky routing. That is what most of the removals in this revision exist to make possible.
The cost is a real migration. A client that only speaks initialize cannot
reach a modern-only server, and it has no way to fall forward, so the spec
expects clients to carry both eras for a while: try a modern request, inspect
the body of a 4xx before falling back, and treat a recognised modern error as
proof the server is modern rather than a reason to retry as legacy.
Because it is the current revision, a server that speaks 2026-07-28 earns full
protocol-recency credit in the
remote endpoint rubric. 2025-11-25 remains
inside the supported window and also keeps full marks. If yours negotiates
something older, see negotiate a current protocol
version.
Read the full revision
modelcontextprotocol.io/specification/2026-07-28 (or the changelog).
Previous
- Previous revision: 2025-11-25
- Back to all specification versions