Dive into MCP——基于 SSE 的通讯机制
约 7 分钟原创Agentic#mcp#agents
MCP 支持的通讯机制
如果你熟悉 Web 应用开发,尤其是基于 Java 的 Web 开发,那么可以这样类比:早期的 Tool Use 能力类似于 HTTP/HTML 协议(当然,Tool Use 的复杂度和规范性远远远不及这些协议),而 MCP 通讯机制规范则相当于 J2EE(Servlet)规范,其配套的 SDK 则类似于 Tomcat Web 容器 和 Spring 开发框架,为开发者提供了标准化的运行环境和工具支持。
stdio
stdio 更接近早前的 tool use 的模式。只是它进一步规范了,服务端必须是一个子进程,消息载体必须是 JSON-RPC 格式,文本必须使用 UTF-8 进行编码等等。
Streamable HTTP (SSE)
以下是 Deepseek 根据 MCP 官网最新 spec 给出的,Streamable HTTP 与 SSE 两者的区别及关系:
Streamable HTTP 与 SSE 的区别
1. 协议层次与用途:
• SSE(Server-Sent Events):是一种基于 HTTP 的单向通信技术(服务器→客户端),属于 HTML5 标准的一部分。它通过长连接允许服务器主动推送事件流(如 `text/event-stream`),适合实时更新场景(如新闻推送)。
• Streamable HTTP:是 MCP 协议定义的一种传输机制,用于支持双向 JSON-RPC 通信。它整合了 HTTP 的 POST/GET 方法,并可选使用 SSE 作为流式传输的实现方式,但不仅限于 SSE。
2. 通信模式:
• SSE:仅支持客户端通过 HTTP GET 建立连接,服务器单向推送事件流。
• Streamable HTTP:
◦ 客户端通过 HTTP POST 发送请求(如 JSON-RPC 消息)。
◦ 服务器通过 HTTP 响应或 SSE 流 返回结果,支持双向通信(客户端发请求,服务器主动推送消息)。
3. 灵活性:
• SSE:固定使用 `text/event-stream` 内容类型,仅支持服务器到客户端的单向流。
• Streamable HTTP:
◦ 允许服务器选择响应方式(`application/json` 单次响应或 `text/event-stream` 流式响应)。
◦ 支持多路复用(客户端可同时连接多个 SSE 流)。
---
Streamable HTTP 的实现方式
1. 基于 HTTP 协议:
• 与 HTML 无关:Streamable HTTP 的实现不依赖 HTML,而是完全基于 HTTP 协议。SSE 虽然是 HTML5 特性,但其底层仍是基于 HTTP 的长连接。
• 端点设计:服务器需提供一个统一的 HTTP 端点(如 `/mcp`),同时支持 `POST` 和 `GET` 方法。
2. 消息发送(客户端→服务器):
• 客户端通过 HTTP POST 发送 JSON-RPC 消息(请求、通知、批量消息)。
• 服务器根据内容类型(`Accept` 头)返回:
◦ `application/json`:单次响应。
◦ `text/event-stream`:启动 SSE 流,持续返回多个响应或主动推送消息。
3. 消息接收(服务器→客户端):
• 客户端通过 HTTP GET 建立 SSE 流,监听服务器推送的 JSON-RPC 请求或通知。
• 服务器可在 SSE 流中发送与当前请求无关的主动消息(如异步事件)。
4. 会话与状态管理:
• Session ID:服务器可通过 `Mcp-Session-Id` 头管理会话状态,客户端需在后续请求中携带此 ID。
• 断线重连:支持通过 SSE 的 `Last-Event-ID` 机制恢复流,避免消息丢失。
---
总结
• Streamable HTTP 是 SSE 的超集:它在 HTTP 协议上定义了一套完整的双向通信机制,可选使用 SSE 实现流式传输,但也可回退到普通 JSON 响应。
• 与 HTML 无关:Streamable HTTP 的实现基于 HTTP 协议和 JSON-RPC,不依赖 HTML,SSE 仅作为其流式传输的一种技术选型。
支持自定义通讯机制
自定义的通讯机制需满足以下要求:
- 消息格式规范:遵循 MCP 定义的 JSON-RPC 标准;
- 交互生命周期管理:符合 MCP 协议 对客户端与服务端通信流程的约束
还未有社区提供自定义实现,不做展开。
Server-sent events 实现
虽然 MCP 最新规范采用 Streamable HTTP 作为底层通信机制,但简而言之,它是在标准 SSE(Server-Sent Events)流式传输基础上的扩展实现。具体特性包括:
- 双向通信支持:在保留 SSE 流式传输能力的同时,新增对传统 request/response 模式的支持
- 会话管理:通过 Mcp-Session-Id 头部字段维护客户端与服务端的会话状态
- 连接机制:
- 使用 SSE 的 HTTP 长连接实现服务端到客户端的流式输出
- 流式输出协议作为可选功能,实际仍基于标准 SSE 实现