MCP协议Streamable HTTP

笔记哥 / 04-24 / 43点赞 / 0评论 / 685阅读
# 一、概述 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` 流 - 该方法兼容旧版本的实现,并允许服务器保持无状态(如果有需要) ![](https://cdn.res.knowhub.vip/c/2504/24/fc4c1a05.png?G1YAAMTydJz4v%2fOiuo06fJsoEpoBiSyCSgnr9Z6z9i3y%2fU6lxWe0Pn1%2f%2bEvr0wXJoFWFyqyG4Gm4UgaUNbAABSTjGg4%3d) # 三、Streamable HTTP demo演示 目前我所了解到的,Java,Nodejs,这些都已经支持了Streamable HTTP。 之前用的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上面下载代码之后,进入项目代码目录,运行以下命令即可 ```csharp npm install npm run build npm run start:streamableHttp ``` 执行之后,会输出: ```csharp > 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 目前最新版本是v1.2.7 ![](https://cdn.res.knowhub.vip/c/2504/24/db46ea78.png?G1cAAETn9LwU6CDovtMdbIlTE20GLNIIKiWs13vO2jfR9wcYmp%2fR%2boz94TetzyC5VLgygWGsSAEqRd0AtyRQ9%2bKVJa8R) 安装完成后,点击MCP服务器 ## 添加MCP服务器 名称:streamable-http-mcp 类型:Streamable HTTP URL:http://localhost:3088/mcp ![](https://cdn.res.knowhub.vip/c/2504/24/a91a3f29.png?G1YAAER17rxg3aiIfice0wSBBJoBiSyCSgnr9e491y3y%2fW4wxqfXNnx9%2bEttw0UTFRfEYAeI4I1aWFioCAl6JmbkOLsD) **注意:url后面是mcp,因为官方给的sdk,url后面就是mcp** **这里新增了请求头,如果你觉得MCP Server暴露在公网,任何人都可以接入MCP Server不安全,这里是可以做token校验的** **需要修改MCP Server里面的逻辑代码,建立请求之前,就校验token。如果是非法token,就返回401错误。** 保存成功后,点击工具 这里可以看到一个工具run-code ![](https://cdn.res.knowhub.vip/c/2504/24/d107a889.png?G1UAAMR0rnGCXr%2bAbiMO1QSBBJoBiSyCSgnr9Z6z9k30%2fSEQy89ofcb%2b8JfWZxCrMS6QQByGpMW4OrNWR6qi6lqQ1wg%3d) ## MCP测试 新建一个默认助手,在对话框,选择MCP设置,选择添加的MCP服务器,streamable-http-mcp ![](https://cdn.res.knowhub.vip/c/2504/24/3a60d660.png?G1cAAMT0bJzotdrANvqh%2f4lHQjNgkUZQKWG93nv3aUTf7wLR%2bMw%2blp8Pv%2bljOXFSRgUJxKAIQZSLSUJGDlxgGSa1xD0d)  根据github项目提示,演示了3个问题,分别是: ```csharp 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 ``` 转换为中文 ```csharp 运行JavaScript代码:console.log(5+6) 我的操作系统中的临时文件夹在哪里?使用运行代码工具 我的机器上有多少个CPU?使用运行代码工具 ``` 分别输入3个问题 ### 运行JavaScript代码:console.log(5+6) ![](https://cdn.res.knowhub.vip/c/2504/24/c98e5665.png?G1cAAETn9LyUgrjAvtMdbIlTE20GLNIIKiWs13vO2jfR94dAND%2bj9Rn7w29an0FclOEggVQoUhBlq7WAzRK7sV7i6nmNAA%3d%3d) 答案是11,是正确的 ### 我的操作系统中的临时文件夹在哪里?使用运行代码工具 ![](https://cdn.res.knowhub.vip/c/2504/24/094972ab.png?G1cAAMTP0x8n7t0P7TbqoE0UCc2ARRpBpYT1es9Z%2byb6%2fiYQi8%2bofbb94Te1z0asxrhAAnEYQhDj4gnFXAOnrMhm6nGNBg%3d%3d) 答案是,C:\Users\98733\AppData\Local\Temp,也是对的。 ### 我的机器上有多少个CPU?使用运行代码工具 ![](https://cdn.res.knowhub.vip/c/2504/24/143ff7b6.png?G1YAAETn9LwUwBJx3%2bkOtsSpiWsGJLIIKiWs1%2fP%2f%2b1xE7xfKinzPPlacD3%2fpYwVJgXBjUlZjIHmFuFVwcU9AFbPWPO8Z) 打开任务管理,选择性能,右下角可以看到核心数 ![](https://cdn.res.knowhub.vip/c/2504/24/64849cff.png?G1cAAER17rxg7RzE%2bZ14TBMEEmwGLNIIKiWs1%2fP%2fa18i7xcKtXyP1mfsD79pfYbwMMIhCi0wpKBGB6ggE%2btJdysVeY0A)  确实是8个,也是正确的。 网上找了一些文章,使用的python的,基本上都是通过FastAPI来实现的,但是测试下来,效果都不好。 有些代码运行没问题,但是Cherry Studio客户端添加会出现各种报错。 即使添加MCP服务器没报错,但是在聊天窗口调用MCP服务器还是会出现各种报错。 怎么办呢?目前也没有找到能正常使用的python框架,只能等待fastmcp官方更新吧,希望快一些。 本文参考链接: https://juejin.cn/post/7493404904725741603