术语
本页使用以下术语来表示跨协议修订版的互操作性:- 现代(Modern):将版本、身份和能力作为每请求元数据来传达的协议版本(修订版
2026-07-28及更高版本)。 - 旧式(Legacy):通过
initialize握手建立会话的协议版本(2025-11-25及更早版本)。 - 双时代(Dual-era):同时支持现代和旧式版本的实现。
协议版本协商
每个请求都在其_meta 字段中声明它所使用的协议版本。在 HTTP 上,这还通过 MCP-Protocol-Version header 携带。
如果服务器不实现所请求的版本(无论该版本对服务器是未知的,还是一个服务器选择不支持的已知版本),它**必须(MUST)**以一个列出它所支持版本的 UnsupportedProtocolVersionError 响应:
supported 列表中选择一个双方都支持的版本并重试该请求,或者在不存在兼容版本时向用户呈现一个错误。
服务器**必须(MUST)实现 server/discover。客户端可以(MAY)**在发送任何其他请求之前调用它以预先了解服务器所支持的版本,但并非必须:客户端完全可以内联调用任何 RPC,并在其首选版本不受支持时处理 UnsupportedProtocolVersionError。
扩展协商
客户端和服务器可以协商对核心协议之外的可选扩展的支持。扩展在能力的extensions 字段中公布,该字段是一个从扩展标识符到每扩展设置对象的映射。扩展标识符**必须(MUST)**遵循 _meta 键命名规则,带一个强制的前缀。
以下是一个客户端公布标识为 io.modelcontextprotocol/ui 的 MCP Apps 扩展的示例:
io.modelcontextprotocol/tasks 的 Tasks 扩展的示例:
与基于初始化的版本的向后兼容
一个希望同时支持旧式客户端(期望initialize 握手)和现代客户端(使用每请求元数据)的服务器**可以(MAY)**实现两种行为。
一个需要与两种服务器互操作的客户端使用特定于传输的机制检测服务器的时代,这些机制在绑定页面中指定:
- stdio:用
server/discover探测,并在任何不是已识别的现代错误的错误上回退。 - Streamable HTTP:尝试一个现代请求,并在回退之前检查
400 Bad Request的正文。
UnsupportedProtocolVersionError)标识一个现代服务器:客户端以一个受支持的版本重试,而不是回退。任何其他情况标识一个旧式服务器。
时代判定是服务器的属性,而不是单个请求的属性。客户端**应当(SHOULD)在服务器进程(stdio)或 origin(HTTP)的生命周期内缓存该结果,并可以(MAY)**在同一服务器配置的重启之间持久化它,若缓存的假设后来失败则重新探测。
一个仅支持现代版本的服务器**应当(SHOULD)**在它返回给 initialize 请求的任何错误中(在任何传输上)指明它所支持的协议版本:旧式客户端没有前向回退(fall-forward)机制,而此消息可能是它们能够向用户呈现的唯一诊断。
兼容性矩阵
以下矩阵总结了客户端和服务器时代每种组合的预期结果:
一个双时代服务器根据客户端如何开场来选择其行为:
- 一个携带现代每请求
_meta的请求根据本修订版被无状态地服务。 - 一个
initialize请求选择旧式语义,其范围限定于 stdio 进程(stdio)或会话(HTTP),如协商出的旧式协议版本所指定。