【大模型理论篇】MCP协议中sse、stdio、streamable_http含义
1. 背景
在 MCP(Model Context Protocol)中,stdio、SSE、Streamable HTTP 是三种不同的 传输(transport)机制,用于在客户端(agent)与 MCP 服务器之间传递 JSON-RPC 消息、通知、响应等。不过,在最新协议版本中,MCP 协议定义了两种标准传输(standard transport):stdio
和 Streamable HTTP。 旧版的 HTTP + SSE 传输在这个版本被 弃用 / 替代,不再作为标准机制,而作为兼容选项保留。 在 Streamable HTTP 中,服务器可以 可选地使用 SSE(Server-Sent Events)来进行流式推送。也就是说,SSE 在新的传输机制里变为一种手段,而不是独立的标准机制。
2. stdio 传输标准
使用场景:客户端以子进程方式启动 MCP 服务器。
通信方式:服务器从 stdin
读取 JSON-RPC 消息,从 stdout
输出 JSON-RPC 消息(批消息 / 请求 / 通知 / 响应)。
消息格式要求:
用换行分隔各条消息;
消息本身 不得包含嵌入换行;
stderr
:服务器可以写 UTF-8 字符串到 stderr 用于日志,客户端可以选择捕获或忽略。
限制:本地进程间通信,无法直接用于远程 / 网络场景。
3. Streamable HTTP 传输(MCP 推荐标准)
这是目前官方规范中被定义为标准的网络传输方案。
基本结构
服务器必须提供一个单一的 HTTP 端点(称为 MCP endpoint),支持 POST 和 GET 方法。
客户端通过 HTTP POST 向该端点发送 JSON-RPC 消息(请求 / 通知 / 批量消息)。请求头中必须带上
Accept: application/json, text/event-stream
。如果 POST 请求中包含 JSON-RPC 请求(即客户端希望得到响应),服务器必须在响应中选择一种方式:
- 返回标准
application/json
(整体响应一次性返回)- 或者返回
Content-Type: text/event-stream
(即 SSE 流式响应)若采用 SSE 流式响应:
- 在 SSE 流中,服务器可逐渐发送 JSON-RPC 通知、请求以及最终响应。
- 流关闭前,服务器应确保对每个客户端请求至少发送一次对应的响应。
- 中断重连支持:服务器可分配 SSE 事件
id
字段,客户端重连时使用Last-Event-ID
请求续流。客户端也可以发起 HTTP GET 请求到同一端点,以建立一个 SSE 流,供服务器用于主动推送通知 / 请求。
在 GET 请求中,如果服务器支持 SSE 推送,返回
Content-Type: text/event-stream
;否则可以返回405 Method Not Allowed
。
会话管理
在初始化阶段(第一次
InitializeRequest
/ 响应)中,服务器 可选择在响应 header 中返回Mcp-Session-Id
。若给出
Mcp-Session-Id
,客户端后续所有请求必须包含该 header,否则服务器可返回 400 错误。会话可被服务器终止(之后任何持有该 session id 的请求都应当被拒绝返回 404)。
客户端在无需会话时,可发 HTTP DELETE 请求(带
Mcp-Session-Id
)以显式结束会话(服务器可以支持也可以拒绝,返回 405 表示不支持)。
多连接 / 并发 / 重发
客户端可同时维持多个 SSE 流(多个连接)用于接收消息,但服务器必须保证每条 JSON-RPC 消息只在 一个 SSE 流上发送。
若连接意外中断,客户端重连时可以使用
Last-Event-ID
来请求服务器重发漏掉的事件(基于事件 ID)— 但服务器并非强制必须支持续流。
向后兼容(旧 HTTP + SSE 机制)
- 尽管 HTTP+SSE 已被替代为旧机制,服务器若希望兼容老客户端,可以同时保留旧 SSE 端点与 MCP endpoint。客户端在 POST 初始化失败时,可以退回使用旧模式。
客户端设计时应对两种情况做兼容处理。
4. 总结
基于官方规范,总结如下:
-
SSE 不再是 MCP 的独立标准传输
在新规范里,SSE 只是 Streamable HTTP 机制中的一种可选响应方式,而不是与 stdio / streamable_http 平级的传输方式。 -
HTTP + SSE 机制已被 “弃用 / 替代”
过去的版本中把 HTTP + SSE 当做标准方案,但在最新版本里,已经改为被淘汰状态,仅作为兼容机制被保留。 -
Streamable HTTP 更为灵活
它允许对每个请求选择 “一次性 JSON 响应” 或 “升级为 SSE 流式响应”;不仅仅是 “总是 SSE” 或 “总是 JSON”。 -
会话管理机制 是这个版本的一个新增 / 强化点
之前我提到 session ID 的概念,但在新的规范里这个机制更为明确、强制性更高。 -
断线续流 / 重发机制 在规范里被制度化(使用 SSE event
id
+Last-Event-ID
)作为可选支持。
5. 参考
【1】https://modelcontextprotocol.io/specification/2025-03-26/basic/transports