一、概述
2025 年 3 月 26 日,模型上下文协议(Model Context Protocol,简称 MCP)引入了一项关键更新:用 Streamable HTTP 替代原先的 HTTP + SSE 作为默认传输方式。
这一变更在解决原有方案中连接不可恢复、服务端长连接压力大等问题的同时,依然保留了 SSE 带来的流式响应优势。
HTTP + SSE 的缺陷
远程 MCP
通过 HTTP + SSE
的传输方式工作,存在以下问题,这也是它所被替换的根本原因:
- 不支持恢复连接
- 要求服务器保持高可用的长连接
- 服务器只能通过
SSE
发送消息
不支持恢复连接
如果客户端和服务器之间的 SSE
连接中断了,就无法 “从端点继续”,只能重新开始新的连接,之前的上下文可能会丢失。
要求服务器保持高可用的长连接
服务器必须一直保持一个稳定、不中断的 SSE
长连接,否则通信就中断。
服务器只能通过 SSE
发送消息
服务器无法在已有的请求之外,主动地发送消息给客户端,除了通过专门的 /sse 通道。换句话说,它是“单向被动响应”,而不是“任意时机推送”。
二、Streamable HTTP
Streamable HTTP
并不是传统意义上的 流式 HTTP(Streaming HTTP
),它指的是一种 兼具以下特性的传输机制:
-
以普通
HTTP
请求为基础,客户端用POST/GET
发请求; -
服务器可选地将响应升级为
SSE
流,实现 流式传输 的能力(当需要时); -
去中心化、无强制要求持续连接,支持
stateless
模式; -
客户端和服务端之间的消息传输更加灵活,比如同一个
/message
端点可用于发起请求和接收SSE
流; -
不再需要单独的
/sse
端点,一切通过统一的/message
协议层处理。
Streamable HTTP 的优势
-
支持无状态服务器:无需维持高可用的长连接
-
纯
HTTP
实现:MCP
可在纯HTTP
服务中实现,无需SSE
支持 -
兼容基础设施:因为 “只是 HTTP”,可以与中间件和现有基础设施良好集成
-
向后兼容:是当前
HTTP+SSE
传输方式的渐进式改进 -
灵活的传输方式:服务器可选择是否使用
SSE
进行流式响应
从 HTTP+SSE 到 Streamable HTTP 的变化
-
移除了
/sse
端点 -
所有客户端 → 服务端的消息都通过
/message
(或类似端点)发送 -
所有客户端 → 服务端的请求都可以被服务器升级为
SSE
,以发送通知或请求 -
服务器可以选择建立会话
ID
以维护状态 -
客户端可以通过对
/message
发送一个空的GET
请求启动SSE
流 -
该方法兼容旧版本的实现,并允许服务器保持无状态(如果有需要)
Streamable HTTP请求示例
无状态服务器模式
场景:简单工具 API 服务,如数学计算、文本处理等。
实现:
客户端 服务器
| |
|-- POST /message (计算请求) -------->|
| |-- 执行计算
|<------- HTTP 200 (计算结果) --------|
| |
优势:极简部署,无需状态管理,适合无服务器架构和微服务。
流式进度反馈模式
场景:长时间运行的任务,如大文件处理、复杂 AI 生成等。
实现:
客户端 服务器
| |
|-- POST /message (处理请求) -------->|
| |-- 启动处理任务
|<------- HTTP 200 (SSE开始) ---------|
| |
|<------- SSE: 进度10% ---------------|
|<------- SSE: 进度30% ---------------|
|<------- SSE: 进度70% ---------------|
|<------- SSE: 完成 + 结果 ------------|
| |
优势:提供实时反馈,但不需要永久保持连接状态。
复杂 AI 会话模式
场景:多轮对话 AI 助手,需要维护上下文。
实现:
客户端 服务器
| |
|-- POST /message (初始化) ---------->|
|<-- HTTP 200 (会话ID: abc123) -------|
| |
|-- GET /message (会话ID: abc123) --->|
|<------- SSE流建立 ------------------|
| |
|-- POST /message (问题1, abc123) --->|
|<------- SSE: 思考中... -------------|
|<------- SSE: 回答1 -----------------|
| |
|-- POST /message (问题2, abc123) --->|
|<------- SSE: 思考中... -------------|
|<------- SSE: 回答2 -----------------|
优势:维护会话上下文,支持复杂交互,同时允许水平扩展。
断线恢复模式
场景:不稳定网络环境下的 AI 应用使用。
实现:
客户端 服务器
| |
|-- POST /message (初始化) ---------->|
|<-- HTTP 200 (会话ID: xyz789) -------|
| |
|-- GET /message (会话ID: xyz789) --->|
|<------- SSE流建立 ------------------|
| |
|-- POST /message (长任务, xyz789) -->|
|<------- SSE: 进度30% ---------------|
| |
| [网络中断] |
| |
|-- GET /message (会话ID: xyz789) --->|
|<------- SSE流重新建立 ---------------|
|<------- SSE: 进度60% ---------------|
|<------- SSE: 完成 ------------------|
优势:提高弱网环境下的可靠性,改善用户体验。
三、Streamable HTTP demo演示
目前我所了解到的,Java,Nodejs,这些都已经支持了Streamable HTTP。
Spring AI Alibaba 官方网站:https://java2ai.com/
之前用的fastmcp框架,目前不支持Streamable HTTP,但是官方表示,未来会支持,具体发布时间待定。
所以本文要演示Streamable HTTP,只能用Nodejs了,Java代码,我也不会。
mcp-server-code-runner
mcp-server-code-runner是github里面的一个支持Streamable HTTP的项目,github地址:https://github.com/formulahendry/mcp-server-code-runner
安装 Node.js
从 https://nodejs.org/en 安装 LTS 版的 Node.js 即可。
运行Streamable HTTP
从github上面下载代码之后,进入项目代码目录,运行以下命令即可
npm install
npm run build
npm run start:streamableHttp
执行之后,会输出:
> mcp-server-code-runner@0.1.6 start:streamableHttp
> node dist/streamableHttp.js
Code Runner MCP Streamable HTTP Server listening on port 3088
这里可以看到,监听端口是3088
Cherry Studio添加Streamable HTTP
请确保你的Cherry Studio客户端是最新版本,因为只有最新版本,才支持Streamable HTTP
下载地址:https://github.com/CherryHQ/cherry-studio/releases
安装完成后,点击MCP服务器
添加MCP服务器
名称:streamable-http-mcp
类型:Streamable HTTP
URL:http://localhost:3088/mcp
注意:url后面是mcp,因为官方给的sdk,url后面就是mcp
这里新增了请求头,如果你觉得MCP Server暴露在公网,任何人都可以接入MCP Server不安全,这里是可以做token校验的
需要修改MCP Server里面的逻辑代码,建立请求之前,就校验token。如果是非法token,就返回401错误。
保存成功后,点击工具
这里可以看到一个工具run-code
MCP测试
新建一个默认助手,在对话框,选择MCP设置,选择添加的MCP服务器,streamable-http-mcp
根据github项目提示,演示了3个问题,分别是:
Run the JavaScript Code: console.log(5+6)
Where is temporary folder in my OS? Use run-code tool
How many CPUs do I have in my machine? Use run-code tool
转换为中文
运行JavaScript代码:console.log(5+6)
我的操作系统中的临时文件夹在哪里?使用运行代码工具
我的机器上有多少个CPU?使用运行代码工具
分别输入3个问题
运行JavaScript代码:console.log(5+6)
答案是11,是正确的
我的操作系统中的临时文件夹在哪里?使用运行代码工具
答案是,C:\Users\98733\AppData\Local\Temp,也是对的。
我的机器上有多少个CPU?使用运行代码工具
打开任务管理,选择性能,右下角可以看到核心数
确实是8个,也是正确的。
网上找了一些文章,使用的python的,基本上都是通过FastAPI来实现的,但是测试下来,效果都不好。
有些代码运行没问题,但是Cherry Studio客户端添加会出现各种报错。
即使添加MCP服务器没报错,但是在聊天窗口调用MCP服务器还是会出现各种报错。
怎么办呢?目前也没有找到能正常使用的python框架,只能等待fastmcp官方更新吧,希望快一些。
本文参考链接:
https://juejin.cn/post/7493404904725741603
https://www.cnblogs.com/formulahendry/p/18837144
https://www.cnblogs.com/alisystemsoftware/p/18842223
所有评论(0)