模型上下文协议(MCP)是一种无状态协议:处理请求所需的所有信息都包含在请求本身中。服务器独立处理每个请求;不应从先前请求中推断任何状态,即使这些请求来自同一连接或流。 尤其是,打开的连接或 STDIO 进程不是对话或会话:客户端可以在同一传输上交错发送无关请求,而服务器不得将连接或进程身份视为对话或会话连续性的代理。 具体而言:Documentation Index
Fetch the complete documentation index at: https://mcp.zhcndoc.com/llms.txt
Use this file to discover all available pages before exploring further.
- 服务器不得依赖同一连接上的先前请求来建立上下文(例如,能力、协议版本、客户端身份)。每个请求都在其
_meta字段中提供这些元数据。 - 服务器不得要求客户端复用同一连接来执行相关操作。
- 需要跨多个请求保存的状态(例如,长时间运行的任务、应用层句柄)必须通过客户端在每个请求中传递的显式标识符来引用。
subscriptions/listen 这样的长生命周期请求仍然是请求/响应模式——响应只是一个打开的通知流。它们的状态作用域属于请求本身,而不是底层连接。
关于按请求模型如何映射到 SDK 代码的演练,请参见
架构指南。
协议版本协商
每个请求都会在其_meta 字段中声明它所使用的协议版本。在 HTTP 中,这一信息也会通过
MCP-Protocol-Version header 传递。
如果服务器未实现请求的版本(无论是服务器未知该版本,还是服务器已知但选择不支持该版本),它必须返回一个
UnsupportedProtocolVersionError,并列出其支持的版本:
supported 列表中选择一个双方都支持的版本并重试请求;如果不存在兼容版本,则向用户展示错误。
服务器必须实现 server/discover。客户端可以在发送任何其他请求之前先调用它,以便提前了解服务器支持的版本,但这不是强制要求——客户端也可以直接发起任意 RPC,并在其首选版本不受支持时处理 UnsupportedProtocolVersionError。
与基于初始化的版本保持向后兼容
希望同时支持旧版客户端(它们期望initialize 握手)和现代客户端(它们使用按请求元数据)的服务器可以同时实现这两种行为。需要与这两类服务器互操作的客户端可以检测当前是哪一种:
- HTTP. 直接尝试发送现代请求。在收到
400 Bad Request时,在决定回退之前检查响应体:400也会被现代服务器用于UnsupportedProtocolVersionError、MissingRequiredClientCapabilityError和 header 验证失败,因此仅凭状态码无法判断是否为旧版服务器。- 如果响应体包含可识别的现代 JSON-RPC 错误,例如
UnsupportedProtocolVersionError, 则服务器使用的是现代版本的 MCP——请改用其公布的supported版本之一重试,或修正请求。不要回退到initialize。 - 如果响应体为空,或不包含可识别的现代 JSON-RPC 错误,则回退到
initialize,并在后续请求中继续使用旧版协议。
- 如果响应体包含可识别的现代 JSON-RPC 错误,例如
- STDIO. 由于没有可用于驱动回退的逐请求状态码,
同时支持两个时代的客户端应当先通过
server/discover探测, 并在_meta中设置其首选的现代版本。如果服务器返回Method not found(-32601),则回退到旧版initialize握手。如果服务器返回UnsupportedProtocolVersionError,则 服务器使用的是一种不带initialize的 MCP 版本——请使用其公布的supported列表中的某个版本,而不是回退到initialize。
UnsupportedProtocolVersionError 即可。
扩展协商
客户端和服务器可以就核心协议之外的可选扩展进行协商。扩展会在能力的extensions 字段中声明,该字段是一个从扩展标识符到各扩展设置对象的映射。
带扩展的客户端能力示例: