Skip to main content
本页定义客户端和服务器如何就它们所讲的内容达成一致:在每个请求上声明的协议版本;通过能力协商的可选扩展;以及与早期的、基于握手的协议修订版的互操作性。 不存在协商握手。每个请求都携带其协议版本,服务器独立地接受或拒绝每个请求:

术语

本页使用以下术语来表示跨协议修订版的互操作性:
  • 现代(Modern):将版本、身份和能力作为每请求元数据来传达的协议版本(修订版 2026-07-28 及更高版本)。
  • 旧式(Legacy):通过 initialize 握手建立会话的协议版本(2025-11-25 及更早版本)。
  • 双时代(Dual-era):同时支持现代和旧式版本的实现。

协议版本协商

每个请求都在其 _meta 字段中声明它所使用的协议版本。在 HTTP 上,这还通过 MCP-Protocol-Version header 携带。 如果服务器不实现所请求的版本(无论该版本对服务器是未知的,还是一个服务器选择不支持的已知版本),它**必须(MUST)**以一个列出它所支持版本的 UnsupportedProtocolVersionError 响应:
客户端**应当(SHOULD)**从 supported 列表中选择一个双方都支持的版本并重试该请求,或者在不存在兼容版本时向用户呈现一个错误。 服务器**必须(MUST)实现 server/discover。客户端可以(MAY)**在发送任何其他请求之前调用它以预先了解服务器所支持的版本,但并非必须:客户端完全可以内联调用任何 RPC,并在其首选版本不受支持时处理 UnsupportedProtocolVersionError

扩展协商

客户端和服务器可以协商对核心协议之外的可选扩展的支持。扩展在能力的 extensions 字段中公布,该字段是一个从扩展标识符到每扩展设置对象的映射。扩展标识符**必须(MUST)**遵循 _meta 键命名规则,带一个强制的前缀。 以下是一个客户端公布标识为 io.modelcontextprotocol/uiMCP Apps 扩展的示例:
一个标识为 io.modelcontextprotocol/tasksTasks 扩展的示例:
每个扩展指定其设置对象的 schema;一个空对象表示支持但无额外设置。 如果一方支持某个扩展而另一方不支持,支持的一方**必须(MUST)要么回退到核心协议行为,要么以一个适当的错误拒绝该请求。扩展应当(SHOULD)**记录它们预期的回退行为。

与基于初始化的版本的向后兼容

一个希望同时支持旧式客户端(期望 initialize 握手)和现代客户端(使用每请求元数据)的服务器**可以(MAY)**实现两种行为。 一个需要与两种服务器互操作的客户端使用特定于传输的机制检测服务器的时代,这些机制在绑定页面中指定:
  • stdio:用 server/discover 探测,并在任何不是已识别的现代错误的错误上回退。
  • Streamable HTTP:尝试一个现代请求,并在回退之前检查 400 Bad Request 的正文。
在这两种情况下,一个已识别的现代 JSON-RPC 错误(例如 UnsupportedProtocolVersionError)标识一个现代服务器:客户端以一个受支持的版本重试,而不是回退。任何其他情况标识一个旧式服务器。 时代判定是服务器的属性,而不是单个请求的属性。客户端**应当(SHOULD)在服务器进程(stdio)或 origin(HTTP)的生命周期内缓存该结果,并可以(MAY)**在同一服务器配置的重启之间持久化它,若缓存的假设后来失败则重新探测。 一个仅支持现代版本的服务器**应当(SHOULD)**在它返回给 initialize 请求的任何错误中(在任何传输上)指明它所支持的协议版本:旧式客户端没有前向回退(fall-forward)机制,而此消息可能是它们能够向用户呈现的唯一诊断。

兼容性矩阵

以下矩阵总结了客户端和服务器时代每种组合的预期结果: 一个双时代服务器根据客户端如何开场来选择其行为:
  • 一个携带现代每请求 _meta 的请求根据本修订版被无状态地服务。
  • 一个 initialize 请求选择旧式语义,其范围限定于 stdio 进程(stdio)或会话(HTTP),如协商出的旧式协议版本所指定。
一个双时代服务器**可以(MAY)**在同一端点或进程上并发地服务两个时代。