发布于

MCP 协议新选择:Streamable HTTP 详解

作者
  • avatar
    姓名
    Terry
    Twitter

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):

  1. 打开设置 → MCP 服务器
  2. 点击添加:
    • 名称: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 + SSEStreamable HTTP
连接恢复❌ 不支持✅ 支持
服务器压力高(长连接)低(可无状态)
基础设施兼容一般✅ 纯 HTTP,兼容性好
部署复杂度复杂简单

总结

Streamable HTTP 是 MCP 协议的一次重要演进:

  • 更灵活:支持无状态和有状态两种模式
  • 更可靠:支持断线恢复,不丢失上下文
  • 更简单:纯 HTTP 实现,部署方便
  • 更兼容:与现有基础设施无缝集成

如果你的 AI 应用需要长时间运行的任务、不稳定的网络环境,或者需要水平扩展,Streamable HTTP 是更好的选择。


参考链接: