July 28, 2026

The protocol
goes stateless.

The specification published on 2025-11-25 has been replaced. The release candidate locked on May 21. The final published on July 28. The spec calls it a breaking change in those words, and every line below links to the pull request that made it.

2025-11-25 current spec published
2026-05-21 release candidate locked
2026-07-28 the final published
2027-07-28 deprecation floor, SEP-2596
The shape of the change arrows: -> client speaks, <- server answers

the spec being replaced retired jul 28

-> initialize a handshake before anything else

<- Mcp-Session-Id your state lives on their server

<- sampling, roots/list the server calls the client back

-> Last-Event-ID resume a broken stream

from July 28 the stateless shape

-> any request _meta carries protocol version and capabilities

<- resultType complete, or input_required

-> follow-up request multi round-trip: the client always initiates

-> server/discover capabilities on demand; servers MUST implement it

Same tools, same servers; what changes is who is allowed to start a sentence. Every method above has its row and its pull request in the list below.

  • removed
    initialize, notifications/initialized

    Every request now carries its own protocol version and client capabilities in _meta.

    SEP-2575
  • removed
    Mcp-Session-Id, protocol level sessions

    Cross call state becomes server minted handles, passed back as ordinary tool arguments.

    SEP-2567
  • removed
    Last-Event-ID, SSE resumability

    A broken response stream loses the in flight request. Clients re-issue it as a new one.

    SEP-2575
  • removed
    The HTTP GET endpoint, resources/subscribe, resources/unsubscribe

    Replaced by subscriptions/listen: one long lived POST response stream carrying the change notifications a client opted into. A server still exposing GET for notifications, or answering resources/subscribe, is talking to nobody.

    SEP-2575
  • removed
    ping, logging/setLevel, notifications/roots/list_changed

    Log level moves per request into _meta.

    SEP-2575
  • added
    server/discover

    Servers MUST implement it, to advertise supported versions, capabilities and identity.

    SEP-2575
  • added
    resultType on every result

    Either complete, or input_required for a multi round trip interim result.

    SEP-2322
  • added
    Multi Round-Trip Requests

    Replaces every server initiated request: roots/list, sampling/createMessage, elicitation/create.

    SEP-2322
  • added
    Mcp-Method, Mcp-Name

    Headers on Streamable HTTP POST. Mcp-Method on every request, Mcp-Name only on tools/call, resources/read and prompts/get. A header that disagrees with the body is rejected.

    SEP-2243
  • added
    ttlMs, cacheScope

    Now required on every list and resource read result, so clients can cache and stop polling.

    SEP-2549
  • deprecated
    Roots, Sampling, Logging

    Still fully functional, but new implementations should not adopt them.

    SEP-2577
  • deprecated
    Dynamic Client Registration

    In favor of Client ID Metadata Documents. Kept for servers that do not support CIMD yet.

    PR #2858
  • moved
    Tasks

    Out of the core protocol and into an official extension, io.modelcontextprotocol/tasks.

    SEP-2663
The previous pattern of server-initiated requests is no longer supported. This is a breaking change.
MCP specification, Multi Round-Trip Requests ->

And yet nothing breaks that day.

The same release adopts a feature lifecycle policy with a minimum twelve-month deprecation window, so a server written against the old spec keeps working for a year while you move. This is not an emergency, and a tool that measures things for a living should be the last one to tell you it is.

It is simply the date on which does mine still comply stops being a matter of opinion. That is what efaimo check --mcp is for, and the commands page shows it run against the official reference server.

One delta this page does not show. Everything above is what changed from the 2025-11-25 specification, but the release candidate that locked on 2026-05-21 is also not the document that published: server identity moved out of DiscoverResult into _meta, and three error codes were renumbered. efaimo had read the candidate, so for four days after publication its own rules reported identity as unknown for precisely the servers that had finished migrating. The delta, and the commands to reproduce it, are an Agent Skill.