SSE and Streamable HTTP
MCP(Model Context Protocol) 里两种流式传输机制的差异是什么?以及为什么社区从 SSE(Server-Sent Events) 慢慢转向 Streamable HTTP?
1. SSE 和 Streamable HTTP 在 MCP 里的区别
SSE (Server-Sent Events)
- 协议:基于 HTTP/1.x 的单向推送,服务器持续通过
Content-Type: text/event-stream推送事件。 - 特性:
- 只能 服务器 → 客户端 单向流。
- 事件是基于文本的、UTF-8 编码。
- 连接保持长时间打开,数据通过
\n\n分隔。 - 浏览器原生支持
EventSource,实现简单。
- 在 MCP 中的使用:主要用于模型响应的流式传输(像 ChatGPT 一样逐字输出)。
Streamable HTTP
-
协议:利用 HTTP 响应体本身作为流通道,客户端读取分块(chunked transfer)或 HTTP/2 帧。
-
特性:
- 不依赖额外事件封装,直接在响应体中发送 JSON/二进制片段。
- 支持 双向交互(尤其在 HTTP/2/HTTP/3 中可以用 request/response stream 组合实现)。
- 传输效率更高,数据结构更灵活(不限制必须是 UTF-8 文本)。
-
在 MCP 中的使用:作为替代 SSE 的新流式响应标准,既能流式传输模型输出,也能嵌入更多元数据。
2. 为什么 MCP 社区在放弃 SSE,转向 Streamable HTTP
| 问题 | SSE 的限制 | Streamable HTTP 的优势 |
|---|---|---|
| 双向流 | 只能服务器推送,不能客户端回流数据 | 可以在 HTTP/2 多路复用下实现双向流 |
| 传输类型 | 只能是 UTF-8 文本,不能直接传二进制 | 支持二进制、JSON、混合数据 |
| 分帧结构 | 需要手动封装成 event: 格式,解析麻烦 |
可以直接发送结构化 JSON/Protobuf |
| HTTP 版本限制 | 基本只依赖 HTTP/1.1,HTTP/2 支持有限 | 原生支持 HTTP/1.1、HTTP/2、HTTP/3 |
| 中间代理兼容性 | 某些反向代理、CDN 会断开长连接 | 分块响应在代理和缓存系统中更健壮 |
| 浏览器生态 | 浏览器支持好,但 MCP 不局限于浏览器客户端 | 在 CLI、SDK、嵌入式中更易实现 |
核心原因: MCP 协议不仅要在浏览器跑,还要在 CLI、桌面端、服务端之间通信,SSE 的单向文本流限制和代理兼容性问题在多端环境下变得明显,而 Streamable HTTP 更通用、更灵活、更高效。
3. 总结一句话
MCP 社区转向 Streamable HTTP 是因为它能在 HTTP/1.1/2/3 上提供更通用、更高性能、更灵活的流式通信能力,而不受 SSE 单向文本流的限制。
4. SSE vs Streamable HTTP 在 MCP 协议中的数据流对比图
┌───────────────────────────────────┐
│ 客户端 (MCP Client) │
└───────────────┬───────────────────┘
│
┌───────────────┴───────────────────┐
│ │
SSE(单向推送) Streamable HTTP(分块流)
───────────────────────────────────────────────────────────────────────
HTTP 请求:
GET /stream POST /inference (或 GET)
Content-Type: application/json
服务器响应:
Content-Type: text/event-stream
event: data Content-Type: application/json
data: { "token": "你" } ┌───────────── 分块1 ──────────────┐
│ { "token": "你" } │
event: data ├───────────── 分块2 ──────────────┤
data: { "token": "好" } │ { "token": "好" } │
├───────────── 分块3 ──────────────┤
... │ { "token": "啊" } │
└──────────────────────────────────┘
方向:
仅服务器 → 客户端 双向可能:客户端也可流式上传数据(HTTP/2/3)
数据类型:
UTF-8 文本 JSON / 二进制 / 混合
Last modified on 2025-08-13