Expand description
MCP protocol version + era model, and version negotiation for both eras.
MCP versions are YYYY-MM-DD date strings marking the last backward-incompatible
change; they sort chronologically as plain strings. Two eras
(modelcontextprotocol.io/specification/draft/basic/versioning §terminology):
- Legacy — an
initializehandshake + session (2025-11-25and earlier). The client advertises its latest version ininitialize; the server echoes it if supported, else returns one it does (client adopts or disconnects). - Modern — stateless, per-request
_meta(2026-07-28+). There is no handshake: every request declares its version, and an unsupported version is rejected per request with anUnsupportedProtocolVersionerror (-32022) listing the server’ssupportedversions; the client retries with a mutual one. A dual-era client detects the server’s era once and caches it.
Structs§
- Unsupported
Protocol Version - The payload of an
UNSUPPORTED_PROTOCOL_VERSION_CODEerror’sdata— the modern era’s version-negotiation signal (versioning §protocol-version-negotiation).
Enums§
- Era
- A protocol era: how version/identity/capabilities are conveyed and whether the connection is session-based.
Constants§
- DEFAULT_
NEGOTIATED_ VERSION - The version a legacy Streamable HTTP server assumes when a request carries no
MCP-Protocol-Versionheader (transports §protocol-version-header). - FIRST_
MODERN_ VERSION - The first modern (stateless) revision — the era boundary. Any well-formed
date
>=this is Modern; anything earlier is Legacy. - HEADER_
MISMATCH_ CODE - The MCP-reserved JSON-RPC error code for a Streamable-HTTP header/body mismatch
or a missing/malformed required routing header (
-32020). - LATEST_
LEGACY_ VERSION - The latest legacy revision — what the
initializehandshake advertises. - LATEST_
MODERN_ VERSION - The latest modern revision (advertised where the peer is known to be modern).
- META_NS
- The
_metakey namespace carrying per-request protocol metadata in the modern era (io.modelcontextprotocol/{protocolVersion,clientInfo,clientCapabilities}). - PROTOCOL_
VERSION - The version advertised in a legacy
initializehandshake. Kept as the latest legacy revision: the handshake path speaks legacy until the modern (stateless) dialect is wired into the client (a later phase). A modern client declares its version per-request instead (LATEST_MODERN_VERSION). - SUPPORTED_
PROTOCOL_ VERSIONS - Every MCP revision this library understands, newest first (dates sort
chronologically). To support a newly-released revision, add its date at the
front. The head is the latest overall; era-specific latests are
LATEST_MODERN_VERSION/LATEST_LEGACY_VERSION. - UNSUPPORTED_
PROTOCOL_ VERSION_ CODE - The MCP-reserved JSON-RPC error code for an unsupported protocol version
(
-32022, modern negotiation).
Functions§
- best_
mutual_ version - Given a modern server’s advertised
supportedversions (from a-32022error), pick the best mutually-supported one to retry with — our newest that the server also supports.None⇒ no common version (surface to the user). - era_of
- The
Eraa protocol version belongs to. A well-formed date>=FIRST_MODERN_VERSION(including unknown future dates) isEra::Modern; anything else isEra::Legacy(the safe default — legacy is the older, wider-deployed behavior). - is_
date_ version - Does
shave the MCPYYYY-MM-DDversion shape? (Cheap structural check, not a calendar validation — enough to tell a date revision from a bogus string.) - is_
modern_ error_ code - Is
codea JSON-RPC error code only a modern server emits? Used for era detection (versioning §backward-compatibility): a-32022(UnsupportedProtocolVersion) or-32020(HeaderMismatch) in the body of a failed modern probe identifies a modern server, so the client retries rather than falling back toinitialize. Generic codes (e.g.-32601method-not- found) are ambiguous across eras and are NOT modern-defining. - is_
supported_ version - Is
va revision this library explicitly understands? - negotiate_
version - Negotiate the session version from a legacy server’s
initializeresponse (lifecycle §version-negotiation). The server echoes our advertised version if it supports it, else returns another it supports.