2025 年 3 月 26 日,MCP 协议把默认传输从 HTTP+SSE 换成 Streamable HTTP;Cherry Studio 的新版也支持了这种类型。原本我以为配好 mcp-server-code-runner 就能直接跑,实际测试时却卡在模型 API 通道上:通道不稳,模型根本不会走到“调用 run-code”那一步。为了让这套 Streamable HTTP MCP 任务顺利跑完,模型通道我用 TaoToken 来配,API Key 从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建。下面的步骤会按原文 demo 的节奏走:先讲协议变化,再装环境、启动本地 MCP 服务、配 Cherry Studio,最后跑完三个测试。
1. Streamable HTTP 替代 HTTP+SSE,改了什么
1.1 HTTP+SSE 的旧问题
在 Streamable HTTP 出现之前,远程 MCP 默认走的是 HTTP + SSE。SSE 本身适合服务器向客户端推送,但把它当 MCP 的传输层时,问题很快暴露出来。最麻烦的是连接不可恢复:客户端和服务器之间的 SSE 连接一旦中断,整条链路就断了,只能重新建连,之前的请求上下文也跟着丢。如果一次工具调用刚好在断连时进行,调用结果是回不来的。
第二个问题是服务器必须维持一条长期不中断的 SSE 连接。远程 MCP 服务一旦部署在云服务器或容器里,长连接会一直被占用,服务端压力不小;中间再挂一层网关或负载均衡,这条长连接往往还会被拦截,导致莫名其妙的断流。第三个问题是消息方向太死板:服务器只能在专门的 SSE 通道里发消息,没法在普通 HTTP 请求之外主动把进度或新请求推给客户端。三种问题叠加,开发者在 Cherry Studio 这类客户端里加远程 MCP 服务器时,就会遇到“添加成功但一调用就超时”的怪现象。
1.2 新传输的四种工作模式
Streamable HTTP 并没有完全抛弃 SSE,而是把它变成一种可选能力。客户端照样用 POST / GET 发普通 HTTP 请求;服务器需要实时推送时,可以把这次响应升级成 SSE 流;不需要时,直接返回普通 JSON 就行。原来的 /sse 端点被移除,所有消息统一走 /message 这类端点。会话状态也变得更灵活,无状态服务器可以不保存任何上下文,复杂对话则用一个 session ID 把多轮请求串起来。
四种工作模式可以这样理解。无状态模式适合一次性工具调用,比如数学计算、文本处理,客户端 POST 请求过去,服务器算完直接返回结果,不保存任何东西。流式进度反馈模式适合耗时任务,服务器把响应升级成 SSE 流,不断推送进度百分比,最后再推完整结果。复杂 AI 会话模式在首次请求时生成 session ID,后续多轮对话都带着这个 ID,服务器据此维护上下文。断线恢复模式则利用 session ID 的特性,网络中断后客户端重新发起带同一 ID 的 GET 请求,就能接上之前的流。MCP 从 HTTP+SSE 换到 Streamable HTTP,核心变化就是把“必须维持的长连接”改成“按需升级、可恢复的会话”,这个设计也让 Cherry Studio 这类客户端更容易对接各种网关和中间件。
2. 准备环境:Node.js LTS,以及一个能用的 API Key
2.1 安装 Node.js LTS
mcp-server-code-runner 是 Node.js 项目,想跑 Streamable HTTP demo,先装 Node.js。去 nodejs.org 下载 LTS 版,Windows 和 macOS 都有安装包,一路默认安装就行。装完在终端里执行 node -v 和 npm -v,能输出版本号就说明环境没问题。这篇 demo 不需要 Java、不需要 Python,Node 就够了。
2.2 去 TaoToken 官网创建 API Key
模型通道这一步,我用的是 TaoToken。打开 TaoToken 注册并登录,进控制台创建一个 API Key。创建完成后把生成的字符串复制到本地,下文统一用 YOUR_API_KEY 代替它。我建议在创建时就给 Key 加个备注,比如 cherry-studio-streamable,这样以后多个 Key 混在一起时,能一眼看出哪个是给 Cherry Studio 用的。
2.3 Key 和 Base URL 的分工
TaoToken 的官网落地页和接口地址是两回事,别混在一起用。注册、创建 Key、看用量、看模型广场,都去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 完成;填进 Cherry Studio 的接口地址则是 https://taotoken.net/api,末尾不要加 /v1。很多配置卡住就是因为习惯性在 Base URL 后面多写了 /v1,导致请求路径变成 /api/v1/message,服务端自然不认。记住这个分工:落地页是给人操作的,接口地址是给工具填的。
3. 启动 mcp-server-code-runner 的 Streamable HTTP 服务
3.1 安装依赖并构建
在本地找一个干净目录,把项目源码拉下来:
git clone https://github.com/formulahendry/mcp-server-code-runner.git
cd mcp-server-code-runner
npm install
npm run build
如果机器上没有装 git,也可以直接从 GitHub 页面下载 ZIP 包,解压后进入目录执行 npm install 和 npm run build。构建过程会生成 dist 目录,里面就是编译后的 Streamable HTTP 服务入口。
3.2 确认服务监听 3088 端口
构建完成后,启动服务:
npm run start:streamableHttp
执行之后,终端会看到 node dist/streamableHttp.js 对应的输出,提示 Streamable HTTP Server 正在监听 3088 端口。看到 listening on port 3088 这一行,本地 MCP 服务就绪。注意它监听的是本机回环地址,只给当前电脑上的 Cherry Studio 用,不要把 3088 端口直接映射到公网。
3.3 URL 的 /mcp 路径从哪来
这个 demo 的项目代码把 MCP 的 message 端点挂在了 /mcp 路径下,所以等一下在 Cherry Studio 里填的 URL 是 http://localhost:3088/mcp,不是 http://localhost:3088,也不是 http://localhost:3088/sse。原来的 /sse 端点已经被去掉,新协议下统一走 /mcp。漏掉这个后缀,Cherry Studio 连接 MCP 服务器时会一直报握手失败。
4. Cherry Studio 接入 TaoToken 模型通道
4.1 添加模型供应商
Cherry Studio 的模型通道和 MCP 服务器是两套独立配置,先配模型通道。打开 Cherry Studio 的「设置」,进入「模型服务」,点「添加供应商」。名称填 TaoToken;Base URL 填 https://taotoken.net/api;API Key 填刚创建的 YOUR_API_KEY。这里需要留意模型 ID,填法以 TaoToken 官网模型广场实际列出为准,就是之前登录 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 后能看到的那份模型清单,不要在模型 ID 里照抄旧教程中带日期后缀的名字。添加完成后,在对话框顶部把默认模型切换到这个供应商对应的模型,先发一条任意消息测连通性。能收到回复,模型通道就通了。
4.2 为什么先解决模型通道,再测 MCP
MCP 工具调用的链路比普通对话长。用户在 Cherry Studio 里发一句“运行 console.log(5+6)”,模型要先理解意图,决定调用 run-code,生成参数;Cherry Studio 把请求转发给本地 MCP 服务器;mcp-server-code-runner 执行完代码,把结果返回给模型;模型再组织语言把最终答案回复出来。任何一次模型请求失败,整个调用链就会断在中间,用户看到的就是“模型回了一句话,但工具没执行”。所以模型通道不稳定时,问题往往不出在 MCP 服务器,而出在最前面那段模型通信上。把模型供应商切到 TaoToken 后,模型请求的 base 地址和 Key 都固定下来,线路上少了很多变数,再测 MCP 时就能明确区分是工具问题还是通道问题。
5. 在 Cherry Studio 里添加 Streamable HTTP MCP 服务器
5.1 类型选 Streamable HTTP,URL 填对
Cherry Studio 老版本只支持 SSE 类型的 MCP 服务器,看不到 Streamable HTTP 选项。先确认客户端是最新版,如果版本太旧,去 GitHub 的 CherryHQ/cherry-studio releases 页面更新。然后在左侧找到「MCP 服务器」,点「添加」,按下表填写:
| 配置项 | 值 |
|---|---|
| 名称 | streamable-http-mcp |
| 类型 | Streamable HTTP |
| URL | http://localhost:3088/mcp |
请求头这一项可以先留空。Cherry Studio 的表单支持自定义请求头,如果你把 mcp-server-code-runner 部署到远程服务器,又担心任何人拿到 URL 就能调用,可以在服务端代码里加 token 校验逻辑,再把对应的认证头填到这里。本地跑 demo 不需要这么重的防护,保持默认即可。
5.2 确认 run-code 工具注册成功
保存之后,MCP 服务器列表里会出现 streamable-http-mcp,状态显示为已连接。点进详情,切到「工具」页,能看到一个名为 run-code 的工具。出现 run-code 就说明 MCP 握手成功、工具列表已经同步到客户端。如果工具列表是空的,先检查 URL 是否漏了 /mcp 后缀,再确认 mcp-server-code-runner 的终端窗口还开着。都没问题的话,重启一次 Cherry Studio 再回来看。
6. 三项 MCP 测试:代码执行、临时目录、CPU 核心数
6.1 让模型理解并调用 run-code
新建一个默认助手,在对话框顶部的 MCP 设置里勾选 streamable-http-mcp。此时模型可以读取到 run-code 的说明,当用户指令里包含“运行代码”“使用 run-code 工具”这类意图时,模型会生成对应的工具调用请求。整个过程不需要手动触发工具,Cherry Studio 会在模型决定调用后自动把请求发给本地 MCP 服务器。
6.2 逐项跑原文的三条测试指令
第一条指令是:运行 JavaScript 代码:console.log(5+6)。模型收到后调用 run-code,参数就是这段 JS 代码,mcp-server-code-runner 在本地 Node 进程里执行,输出 11 并返回给模型,模型最后在对话框里回复 11。这段代码实际执行靠的是 mcp-server-code-runner,模型只负责理解意图和解读结果;对话过程中消耗的 token 由 TaoToken 通道提供。
第二条指令是:我的操作系统中的临时文件夹在哪里?使用 run-code 工具。模型会调用 run-code,从运行环境中读出临时目录路径。Windows 下返回的是 C:\Users<你的用户名>\AppData\Local\Temp 这种格式,macOS 下则是带 $TMPDIR 对应的绝对路径。返回的内容和当前机器实际环境一致,不会出现另一个人的用户名。
第三条指令是:我的机器上有多少个 CPU?使用 run-code 工具。模型调用 run-code 获取本机核心数。可以打开任务管理器,切到「性能」标签页,在 CPU 条目下方核对核心数。三条测试全部通过,就说明 Streamable HTTP MCP 从模型通道到工具执行再到结果回传,整条链路都是通的。
6.3 核对结果:11、临时路径、核心数
三个测试各有各的意义。console.log(5+6) 验证的是最基础的代码执行能力,能返回 11 说明 run-code 工作正常。临时文件夹测试验证的是工具能否访问系统环境变量并返回非固定结果。CPU 核心数测试验证的是工具能拿系统级硬件信息。如果这三项都过了,MCP 服务器本身已经没有问题,后续再出现调用失败,优先怀疑的反而是模型通道。
7. 排障:模型通道不稳定时 MCP 卡在哪
7.1 run-code 没触发,先查模型通道
如果你输入同样的话,模型只是回了一句“我来帮你运行一下”然后就没有下文,这属于模型没有走到工具调用阶段,优先怀疑模型通道。回到「模型服务」里核对 Base URL,应该是 https://taotoken.net/api,而不是 https://taotoken.net/api/v1;再看 API Key 是不是创建出来的完整值。想确认请求到底有没有发出去,可以登录 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 查看用量:一次对话会产生 token 消费记录,有记录说明通道是通的,没有记录说明请求根本没到达模型供应商。
7.2 MCP 服务连不上,先查端口和版本
如果 Cherry Studio 添加 MCP 服务器时直接报错,先看终端里 mcp-server-code-runner 是否还在运行。服务端口 3088 被占用时,启动会报 EADDRINUSE,Windows 用 netstat -ano | findstr 3088 查占用进程,macOS 或 Linux 用 lsof -i :3088 查。杀掉占用进程后重启服务,再回 Cherry Studio 点重连。另一个常见原因是 Cherry Studio 版本太旧,列表里根本没有 Streamable HTTP 这个类型可选,这种情况只能升级客户端。
7.3 当前 Python 实现的坑
我也试过网上几套基于 FastAPI 的 Python Streamable HTTP 实现,有的能正常启动,Cherry Studio 添加 MCP 服务器也不报错,但一到对话里调用 run-code 就超时;有的在握手阶段就断了。折腾下来,最可靠的还是 mcp-server-code-runner 这个 Node 示例。Python 生态里 fastmcp 对 Streamable HTTP 的支持还在路上,想用纯 Python 跑通这套流程的话,建议先等官方更新,别在第三方实现上浪费时间。
跑完三项测试,我最大的感受是 Streamable HTTP 简化了连接维持,但真正决定 MCP 好不好用的是模型通道的稳定性。TaoToken 帮我把这部分固定下来:一个 Key、一个 Base URL、按需切换模型,剩下的事情交给 Cherry Studio。如果你也卡在模型通道这一环,直接去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建一个 Key,按照第 4 节的字段填进「模型服务」,再回到对话里发一句 console.log(5+6),看到 11 的那一刻,整条链路就通了。




被折叠的 条评论
为什么被折叠?



