This document lists changes made to the Model Context Protocol (MCP) specification since the previous revision, 2025-11-25.Documentation Index
Fetch the complete documentation index at: https://modelcontextprotocol.io/llms.txt
Use this file to discover all available pages before exploring further.
Major changes
-
Remove protocol-level sessions and the
Mcp-Session-Idheader from the Streamable HTTP transport. List endpoints (tools/list,resources/list,prompts/list) no longer vary per-connection. Servers that need cross-call state use explicit, server-minted handles passed as ordinary tool arguments (SEP-2567). -
Make MCP stateless: remove the
initialize/notifications/initializedhandshake. Every request now carries its protocol version, client identity, and client capabilities in_meta(io.modelcontextprotocol/protocolVersion,io.modelcontextprotocol/clientInfo,io.modelcontextprotocol/clientCapabilities). Version mismatches returnUnsupportedProtocolVersionError(SEP-2575). -
Add
server/discover: servers MUST implement this RPC to advertise their supported protocol versions, capabilities, and identity. Clients MAY call it before any other request for up-front version selection, or use it as a backward-compatibility probe on STDIO (SEP-2575). -
Replace the HTTP GET endpoint and
resources/subscribe/resources/unsubscribewithsubscriptions/listen: a single long-lived POST-response stream for opted-in server-to-client change notifications. Clients opt in to specific types (toolsListChanged,promptsListChanged,resourcesListChanged,resourceSubscriptions); the server acknowledges and tags notifications withio.modelcontextprotocol/subscriptionId. Request-scoped notifications such asnotifications/progressandnotifications/messagecontinue to flow on the response stream of the request they relate to, not thesubscriptions/listenstream (SEP-2575). -
Remove
ping,logging/setLevel, andnotifications/roots/list_changed. Log level is now set per-request viaio.modelcontextprotocol/logLevelin_meta; servers MUST NOT emitnotifications/messagefor requests that did not include this field (SEP-2575). -
Move experimental tasks out of the core protocol and into an official extension (
io.modelcontextprotocol/tasks). The redesigned extension replaces the blockingtasks/resultmethod with polling viatasks/getand a newtasks/updatefor client-to-server input, removestasks/list, and allows servers to return task handles unsolicited without per-request opt-in (SEP-2663). -
Multi Round-Trip Requests (MRTR) pattern introduced which replaces the previous approach of sending server-initiated requests, such as
roots/list,sampling/createMessage, orelicitation/create. Servers returninputRequests, a new resultType containing the additional information needed to process the request. Clients respond withinputResponseson the next request providing the requested information. (SEP-2322).
Minor changes
- Add
extensionsfield toClientCapabilitiesandServerCapabilitiesto support optional extensions beyond the core protocol. - Document OpenTelemetry trace context propagation conventions for
_metakeys (traceparent,tracestate,baggage) (SEP-414). - Servers SHOULD return tools from
tools/listin a deterministic order to enable client-side caching and improve LLM prompt cache hit rates. - Require standard MCP request headers (
Mcp-Method,Mcp-Name) on Streamable HTTP POST requests, and add support for custom headers from tool parameters viax-mcp-header(SEP-2243). - Require
ttlMsandcacheScopefields on results returned bytools/list,prompts/list,resources/list,resources/read, andresources/templates/listvia a newCacheableResultinterface.ttlMsis a freshness hint (in milliseconds) allowing clients to cache responses and reduce polling;cacheScope("public"or"private") controls whether shared intermediaries may cache the response. Both fields complement existinglistChangednotifications (SEP-2549). - Change resource not found error code from
-32002to-32602(Invalid Params) to align with JSON-RPC specification.
Deprecated
Features listed here remain part of the specification but are scheduled for removal under the feature lifecycle and deprecation policy. New implementations should not adopt them. The deprecated features registry tracks every feature currently in the Deprecated state.-
Deprecate the Roots, Sampling, and Logging features
(SEP-2577).
These features remain fully functional during the deprecation window but new
implementations should not add support for them. Suggested migrations: pass
directories or files via tool parameters, resource URIs, or server
configuration instead of Roots; integrate directly with LLM provider APIs
instead of Sampling; log to
stderr(stdio) or use OpenTelemetry instead of Logging. -
Reclassify the HTTP+SSE transport (deprecated since protocol version
2025-03-26) as Deprecated under the feature lifecycle policy (SEP-2596). Migrate to Streamable HTTP. -
Reclassify the
includeContextvalues"thisServer"and"allServers"(soft-deprecated since protocol version2025-11-25) as Deprecated (SEP-2596). Omit the field or use"none"; these values will be removed no later than the Sampling feature itself.
Other schema changes
schema.jsonnow correctly reflects that the Typescript definition of wminimum/maximum/default arenumber’s and not justintegers. This was casued by using the generator using--defaultNumberType integer(PR#2710).
Governance and process updates
- Adopt a specification feature lifecycle and deprecation policy defining the Active, Deprecated, and Removed feature states, a minimum twelve-month deprecation window, and a registry of deprecated features (SEP-2596).
Process changes
- Formalize PR-based SEP workflow with markdown files in
seps/directory, PR-derived numbering, sponsor responsibilities, and status management via PR labels (SEP-1850).