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