术语
本页使用以下术语,以便在不同协议修订版之间实现互操作性:- 现代:按每次请求的元数据传递版本、身份和能力的协议版本(修订版
2026-07-28及之后)。 - 传统:通过
initialize握手建立会话的协议版本(2025-11-25及之前)。 - 双时代:同时支持现代和传统版本的实现。
协议版本协商
每个请求都会在其_meta 字段中声明它正在使用的协议版本。在 HTTP 上,这一版本也会通过
MCP-Protocol-Version header
传递。
如果服务器不实现所请求的版本(无论该版本对服务器来说是未知的,还是服务器已知但选择不支持的版本),它 MUST 返回一个
UnsupportedProtocolVersionError
,并列出它所支持的版本:
supported 列表中选择一个双方都支持的版本并重试该请求;如果不存在兼容版本,则应向用户显示错误。
服务器 MUST 实现
server/discover。客户端
MAY 在发送任何其他请求之前调用它,以便提前了解服务器支持的版本,但这不是必需的:客户端可以直接发起任何 RPC,并在其首选版本不受支持时处理 UnsupportedProtocolVersionError。
扩展协商
客户端和服务器可以就超出核心协议之外的可选扩展支持进行协商。扩展在能力的extensions 字段中进行声明,该字段是一个从扩展标识符到各扩展设置对象的映射。扩展标识符必须遵循_meta 键命名规则,并带有强制前缀。
以下是一个客户端的示例,它声明支持标识为 io.modelcontextprotocol/ui 的MCP Apps 扩展:
io.modelcontextprotocol/tasks 的Tasks 扩展示例:
向后兼容基于初始化的版本
希望同时支持 旧版 客户端(期望initialize 握手)和 现代 客户端(使用按请求元数据)的服务器 MAY 实现这两种行为。
需要与这两类服务器互操作的客户端,会通过绑定页面中指定的、与传输相关的机制来检测服务器所属的时代:
- stdio:
使用
server/discover探测,并在任何未被识别为现代错误的错误上回退。 - Streamable HTTP:
尝试一次现代请求,并在回退前检查
400 Bad Request的响应体。
UnsupportedProtocolVersionError)
表明服务器是现代的:客户端会改用受支持的版本重试,而不是回退。其他任何情况都表明服务器是旧版的。
时代判定是服务器的属性,而不是某个单独请求的属性。客户端 SHOULD 在服务器进程生命周期内(stdio)或来源(HTTP)缓存该结果,并且 MAY 在同一服务器配置重启后继续持久化该结果;如果后续缓存假设失效,则应重新探测。
只支持 现代 版本的服务器,在对任何传输上的 initialize 请求返回的任何错误中,SHOULD 指明其支持的协议版本:旧版客户端没有前向回退机制,而这条消息可能是它们能够向用户展示的唯一诊断信息。
兼容性矩阵
下表总结了客户端和服务器时代每种组合的预期结果:
双时代 服务器 会根据客户端的打开方式来选择行为:
- 携带现代按请求
_meta的请求会以无状态方式按本修订版本提供服务。 initialize请求会选择旧版语义,其作用域限定为 stdio 进程(stdio)或会话(HTTP),具体取决于协商得到的旧版协议版本。