Skip to main content

Documentation Index

Fetch the complete documentation index at: https://modelcontextprotocol.io/llms.txt

Use this file to discover all available pages before exploring further.

This document lists changes made to the Model Context Protocol (MCP) specification since the previous revision, 2025-11-25.

Major changes

  1. Remove protocol-level sessions and the Mcp-Session-Id header 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).
  2. Make MCP stateless: remove the initialize/notifications/initialized handshake. 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 return UnsupportedProtocolVersionError (SEP-2575).
  3. 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).
  4. Replace the HTTP GET endpoint and resources/subscribe/resources/unsubscribe with subscriptions/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 with io.modelcontextprotocol/subscriptionId. Request-scoped notifications such as notifications/progress and notifications/message continue to flow on the response stream of the request they relate to, not the subscriptions/listen stream (SEP-2575).
  5. Remove ping, logging/setLevel, and notifications/roots/list_changed. Log level is now set per-request via io.modelcontextprotocol/logLevel in _meta; servers MUST NOT emit notifications/message for requests that did not include this field (SEP-2575).
  6. Move experimental tasks out of the core protocol and into an official extension (io.modelcontextprotocol/tasks). The redesigned extension replaces the blocking tasks/result method with polling via tasks/get and a new tasks/update for client-to-server input, removes tasks/list, and allows servers to return task handles unsolicited without per-request opt-in (SEP-2663).
  7. Multi Round-Trip Requests (MRTR) pattern introduced which replaces the previous approach of sending server-initiated requests, such as roots/list, sampling/createMessage, or elicitation/create. Servers return inputRequests, a new resultType containing the additional information needed to process the request. Clients respond with inputResponses on the next request providing the requested information. (SEP-2322).
  8. 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.

Minor changes

  1. Add extensions field to ClientCapabilities and ServerCapabilities to support optional extensions beyond the core protocol.
  2. Document OpenTelemetry trace context propagation conventions for _meta keys (traceparent, tracestate, baggage) (SEP-414).
  3. Servers SHOULD return tools from tools/list in a deterministic order to enable client-side caching and improve LLM prompt cache hit rates.
  4. Require standard MCP request headers (Mcp-Method, Mcp-Name) on Streamable HTTP POST requests, and add support for custom headers from tool parameters via x-mcp-header (SEP-2243).
  5. 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. ttlMs is 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 existing listChanged notifications (SEP-2549).
  6. Change resource not found error code from -32002 to -32602 (Invalid Params) to align with JSON-RPC specification.

Other schema changes

N/A

Governance and process updates

N/A

Process changes

  1. Formalize PR-based SEP workflow with markdown files in seps/ directory, PR-derived numbering, sponsor responsibilities, and status management via PR labels (SEP-1850).

Full changelog

For a complete list of all changes that have been made since the last protocol revision, see GitHub.