跳到主要内容
SecondHome

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 仅作为其流式传输的一种技术选型。

支持自定义通讯机制

自定义的通讯机制需满足以下要求:

  1. 消息格式规范:遵循 MCP 定义的 JSON-RPC 标准;
  2. 交互生命周期管理:符合 MCP 协议 对客户端与服务端通信流程的约束

还未有社区提供自定义实现,不做展开。

Server-sent events 实现

虽然 MCP 最新规范采用 Streamable HTTP 作为底层通信机制,但简而言之,它是在标准 SSE(Server-Sent Events)流式传输基础上的扩展实现。具体特性包括:

  1. 双向通信支持:在保留 SSE 流式传输能力的同时,新增对传统 request/response 模式的支持
  2. 会话管理:通过 Mcp-Session-Id 头部字段维护客户端与服务端的会话状态
  3. 连接机制:
    • 使用 SSE 的 HTTP 长连接实现服务端到客户端的流式输出
    • 流式输出协议作为可选功能,实际仍基于标准 SSE 实现

参考资料

  1. MCP Specification: Transports
  2. sysid blog: Server Sent Events
  3. HTML Live Standard

相关阅读

持续耕种,欢迎订阅 🌱

RSS全站 ·原创 ·策展 ·雷达;公众号「炼金术」同步更新。