- 发布于
MCP 协议新选择:Streamable HTTP 详解
- 作者

- 姓名
- Terry
MCP 协议新选择:Streamable HTTP 详解
一个场景引出的问题
想象你正在开发一个 AI 编程助手,用户通过对话框让 AI 执行代码:
用户:帮我运行 console.log(5+6)
AI 助手 → 代码执行服务器 → 返回 11
这背后就是 MCP 协议在工作。但问题来了:
- 如果代码执行需要 10 秒,客户端要一直等待吗?
- 如果网络断了,用户的代码是不是白跑了?
- 服务器同时能支持多少个这样的长连接?
这些问题,传统的 HTTP+SSE 传输方式很难优雅解决。2025 年 3 月 26 日,MCP 官方推出了 Streamable HTTP,彻底改变了这一切。
为什么 HTTP+SSE 不够用
在了解新协议之前,先搞清楚旧方案的问题。
连接中断即失败
HTTP+SSE 使用长连接推送消息。一旦网络波动,连接断开,之前的上下文全部丢失。用户可能需要重新发起请求。
服务器压力大
服务器必须维护每个客户端的持久连接。如果有 1000 个用户同时在线,服务器就要hold住 1000 个长连接。
只能被动响应
SSE 通道只能单向推送。服务器没办法主动给客户端发消息,只能通过这个固定的 /sse 端点。
Streamable HTTP 是什么
Streamable HTTP 不是"流式 HTTP",而是一种兼具灵活性和扩展性的传输机制。
它的核心特性:
| 特性 | 说明 |
|---|---|
| 普通 HTTP 为基础 | 客户端用 POST/GET 发请求 |
| 可选的 SSE 流式响应 | 服务器根据需要决定是否开启流式传输 |
| 无状态模式支持 | 服务器可以不维护连接状态 |
| 统一端点 | 所有消息通过 /message 端点处理 |
四种典型使用场景
根据业务需求,Streamable HTTP 提供了四种模式。
模式一:无状态服务器
适合简单工具调用,比如数学计算、文本处理。
客户端 ──POST /message (计算请求)──► 服务器
客户端 ◄──HTTP 200 (计算结果)────── 服务器
特点:服务器不需要记住任何东西,请求完就结束。适合无服务器架构(Serverless)。
模式二:流式进度反馈
适合长时间运行的任务,比如大文件处理、AI 内容生成。
客户端 ──POST /message (处理请求)──► 服务器
客户端 ◄──HTTP 200 (SSE开始)─────── 服务器
客户端 ◄──SSE: 进度10% ──────────── 服务器
客户端 ◄──SSE: 进度30% ──────────── 服务器
客户端 ◄──SSE: 完成 + 结果 ──────── 服务器
用户能看到实时进度,体验更好。
模式三:复杂 AI 会话
适合多轮对话的 AI 助手,需要维护上下文。
客户端 ──POST /message (初始化)────► 服务器
客户端 ◄──HTTP 200 (会话ID: abc)─── 服务器
客户端 ──GET /message (会话ID: abc)──► 服务器
客户端 ◄──SSE流建立 ───────────────── 服务器
客户端 ──POST /message (问题1, abc)──► 服务器
客户端 ◄──SSE: 思考中... ──────────── 服务器
客户端 ◄──SSE: 回答1 ──────────────── 服务器
服务器通过会话 ID 维护状态,支持复杂交互。
模式四:断线恢复
适合网络不稳定的环境。
客户端 ──POST /message (初始化)────► 服务器
客户端 ◄──HTTP 200 (会话ID: xyz)─── 服务器
客户端 ──GET /message (会话ID: xyz)──► 服务器
客户端 ◄──SSE流建立 ───────────────── 服务器
客户端 ──POST /message (任务, xyz)───► 服务器
客户端 ◄──SSE: 进度30% ────────────── 服务器
[网络中断]
客户端 ──GET /message (会话ID: xyz)──► 服务器
客户端 ◄──SSE流重新建立 ────────────── 服务器
客户端 ◄──SSE: 进度60% ────────────── 服务器
客户端 ◄──SSE: 完成 ────────────────── 服务器
即使网络中断,也能从断点继续,不会丢失进度。
实战演示:搭建 Streamable HTTP 服务器
接下来用 Node.js 演示如何运行一个支持 Streamable HTTP 的 MCP 服务器。
准备工作
确保安装了 Node.js(推荐 LTS 版本),然后克隆官方示例:
git clone https://github.com/formulahendry/mcp-server-code-runner.git
cd mcp-server-code-runner
npm install
npm run build
npm run start:streamableHttp
启动后,服务器监听 3088 端口:
Code Runner MCP Streamable HTTP Server listening on port 3088
客户端配置
以 Cherry Studio 为例(确保版本 >= v1.2.7):
- 打开设置 → MCP 服务器
- 点击添加:
- 名称:
streamable-http-mcp - 类型:
Streamable HTTP - URL:
http://localhost:3088/mcp
- 名称:
注意:URL 末尾的 /mcp 是必须的,这是官方 SDK 的默认路径。
安全性增强
如果服务器要暴露到公网,可以添加请求头验证:
// 在服务器接收请求时校验 Authorization 头
if (request.headers.authorization !== `Bearer ${VALID_TOKEN}`) {
return new Response('Unauthorized', { status: 401 })
}
功能测试
在 AI 助手中启用该 MCP 服务器后,可以测试以下功能:
运行 JavaScript 代码:
运行代码:console.log(5 + 6)
// 返回: 11
查看系统信息:
我的临时文件夹在哪里?
// 返回: C:\Users\xxx\AppData\Local\Temp
我的 CPU 有几个核心?
// 返回: 8
与传统方案的对比
| 对比项 | HTTP + SSE | Streamable HTTP |
|---|---|---|
| 连接恢复 | ❌ 不支持 | ✅ 支持 |
| 服务器压力 | 高(长连接) | 低(可无状态) |
| 基础设施兼容 | 一般 | ✅ 纯 HTTP,兼容性好 |
| 部署复杂度 | 复杂 | 简单 |
总结
Streamable HTTP 是 MCP 协议的一次重要演进:
- 更灵活:支持无状态和有状态两种模式
- 更可靠:支持断线恢复,不丢失上下文
- 更简单:纯 HTTP 实现,部署方便
- 更兼容:与现有基础设施无缝集成
如果你的 AI 应用需要长时间运行的任务、不稳定的网络环境,或者需要水平扩展,Streamable HTTP 是更好的选择。
参考链接: