协议版本: 2025-06-18
标准输入输出
在 标准输入输出 transport中:- 客户端将 MCP 服务器作为子进程启动。
- 服务器从标准输入(
stdin)读取JSON-RPC消息并将消息发送至标准输出(stdout)。 - 消息是独立的JSON-RPC请求、通知或响应。
- 消息由换行符分隔,并且严禁包含嵌入式换行符。
- 服务器可以将UTF-8字符串写入其标准错误流(
stderr)用于日志记录目的。客户端可以捕获、转发或忽略此日志记录。
服务器不得向 - 客户端不得向服务器的
stdin写入任何非有效MCP消息的内容。
stdout写入任何非有效 MCP 消息的内容。
可流式HTTP
这取代了协议版本2024-11-05中的HTTP+SSE
传输。请参阅下面的向后兼容性
指南。
https://example.com/mcp 这样的URL。
安全警告
当实现Streamable HTTP传输时:- 服务器必须验证所有传入连接的
Origin头部,以防止DNS重新绑定攻击 - 在本地运行时,服务器 应当 仅绑定到本地主机(127.0.0.1),而不是所有网络接口(0.0.0.0)
- 服务器应当对所有连接实施适当的认证机制
向服务器发送消息
从客户端发送的每个 JSON-RPC 消息 必须 是对 MCP 端点进行全新的 HTTP POST 请求。- 客户端必须使用HTTP POST方法向MCP端点发送JSON-RPC消息。
- 客户端必须包含一个
Accept头,将application/json和text/event-stream列为支持的 content types。 - POST请求的主体必须是单个JSON-RPC 请求、通知或响应。
- 如果输入是JSON-RPC 响应或通知:
- 如果服务器接受输入,服务器必须返回HTTP状态码202 Accepted且无响应体。
- 如果服务端无法接收输入,它必须返回一个HTTP错误状态码(例如,400 错误请求)。HTTP响应体可以包含一个JSON-RPC错误响应,该响应不含
id。
- 如果输入的是一个JSON-RPC 请求,服务器必须返回
Content-Type: text/event-stream以启动SSE流,或者Content-Type: application/json以返回一个 JSON 对象。客户端必须 同时支持这两种情况。 - 如果服务器发起SSE流:
- SSE流应当最终包含对POST请求体中发送的JSON-RPC请求的JSON-RPC响应。
- 服务器可以在发送JSON-RPC响应之前发送JSON-RPC请求和通知。这些消息应当与发起请求的客户端请求相关。
- 服务器在发送所接收JSON-RPC请求的JSON-RPC响应之前不应关闭SSE流,除非会话过期。
- 当JSON-RPC 响应发送后,服务器应该关闭SSE流。
- 断开连接可以在任何时间发生(例如由于网络条件)。
因此:
- 断开连接 不应 被理解为客户端取消其请求。
- 若要取消,客户端应明确发送一条MCP
CancelledNotification取消通知。 - 为避免因断开连接导致消息丢失,服务器可以使数据流支持断点续传功能。
监听来自服务器的消息
- 客户端可以向MCP端点发出HTTP GET请求。这可用于打开SSE流,使服务器能够与客户端通信,而无需客户端首先通过HTTP POST发送数据。
- 客户端必须包含一个
Accept头部,列出text/event-stream作为支持的内容类型。 - 服务器必须要么返回
Content-Type: text/event-stream作为对此HTTP GET的响应,或者返回HTTP 405方法不被允许,表明服务器在此端点不提供SSE流。 - 如果服务器发起了SSE流:
- 服务器可以通过流发送JSON-RPC 请求和通知。
- 这些消息应该与客户端同时运行的任何JSON-RPC 请求不相关。
- 服务器不允许在流上发送JSON-RPC 响应,除非是在 恢复与先前客户端请求相关联的流的情况下。
- 服务器可以在任何时候关闭SSE流。
- 客户端可以随时关闭SSE流。
多连接
- 客户端可以同时保持连接到多个SSE流。
- 服务器 必须 仅通过一个已连接的流发送其每个 JSON-RPC 消息;即,它 不可 在多个流上广播相同的消息。
- 消息丢失的风险 可能 通过使流可恢复来缓解。
可恢复性与重投递
为了支持恢复中断的连接,并重新发送可能丢失的消息:- 服务器 可以附加一个
id字段到它们的SSE事件,如同在 SSE标准中描述的那样。- 如果该字段存在,此ID必须在指定会话内的所有流中全局唯一——或者,若未采用会话管理,则在特定客户端的全部流中保持唯一性。
- 如果客户端希望在连接中断后恢复,它应当向MCP端点发起HTTP GET请求,并包含
Last-Event-ID头部来指明它最后接收到的事件ID。- 服务器可以使用此头部来重放那些在最后一个事件ID之后本应发送的消息,在被断开连接的流上,并从该点恢复流。
- 服务器不得重放那些本应在不同流上传递的消息。
会话管理
一个MCP“会话”包括了客户端与服务器之间逻辑上相关的交互,从初始化阶段开始。为了支持想要建立有状态会话的服务器:- 使用可流式HTTP传输的服务器可以在初始化时分配一个会话ID,方法是将其包含在包含
InitializeResult的HTTP响应的Mcp-Session-Id头中。<!-->- 会话ID 应该是全局唯一的且具备密码学安全性(例如,使用安全方式生成的UUID、JWT或密码学哈希值)。
- 会话ID 必须仅包含可见ASCII字符(范围从0x21到0x7E)。
- 如果服务器在初始化期间返回了
Mcp-Session-Id,使用可流式HTTP传输的客户端必须在其所有后续HTTP请求的Mcp-Session-Id标头中包含它。- 需要会话ID的服务器应当对不包含
Mcp-Session-Id标头的请求(除初始化外)以HTTP 400 Bad Request响应。
- 需要会话ID的服务器应当对不包含
- 服务器可以随时终止会话,之后对于包含该会话ID的请求,它必须以HTTP 404 Not Found进行响应。
- 当客户端收到包含
Mcp-Session-Id的请求返回HTTP 404响应时,它必须通过发送不附带会话ID的新InitializeRequest来启动新会话。 - 当客户端不再需要特定会话时(例如,因为用户正在离开客户端应用),应当向MCP端点发送带有
Mcp-Session-Id头的HTTP DELETE请求,以显式终止会话。- 服务器可以对此请求返回HTTP 405 Method Not Allowed响应, 表明服务器不允许客户端终止会话。
序列图
协议版本头
如果使用 HTTP 协议,客户端必须在所有向 MCP 服务器的后续请求中包含MCP-Protocol-Version: HTTP 标头,以便 MCP 服务器能够根据 MCP 协议版本进行响应。
例如:MCP-Protocol-Version: 2025-06-18
客户端发送的协议版本 应当 是初始化期间协商的版本。
为了实现向后兼容,如果服务器未接收到MCP-Protocol-Version
头部,且无法通过其他方式识别版本——例如依赖
初始化期间协商的协议版本——服务器应当假定协议
版本为2025-03-26。
如果服务器收到包含无效或不支持的 MCP-Protocol-Version 的请求, 它 必须 以 400 Bad Request 响应.
向后兼容性
客户端和服务器可以通过以下方式保持与已弃用的 HTTP+SSE 传输协议(来自协议版本2024-11-05)的向后兼容性: 服务器想要支持老旧客户端,应当:- 继续同时托管旧传输的SSE和POST端点,以及为新可流式HTTP传输定义的“MCP端点”。
- 同时也可以将旧的POST端点与新的MCP端点结合使用,但 这可能会引入不必要的复杂性。
- 接受来自用户的MCP服务器URL,该URL可能指向使用旧传输协议或新传输协议的服务器。
- 向服务器URL尝试POST一个
InitializeRequest,并携带如上定义的Accept头部:- 如果成功,客户端可以认为这是一个支持新可流式HTTP传输协议的服务器。
- 如果失败且返回HTTP 4xx状态码(例如,405 Method Not Allowed 或 404 Not Found):
- 向服务器URL发出GET请求,期望这将开启一个SSE流,并且返回一个
endpoint事件作为首个事件。 - 当
endpoint事件到达时,客户端可以假设这是一个运行旧版HTTP+SSE传输的服务器,并在所有后续通信中都使用这种传输方式。
- 向服务器URL发出GET请求,期望这将开启一个SSE流,并且返回一个