用CherryStudio调试云端MCP服务器
用CherryStudio调试云端MCP服务器
之前已经实现了STDIO方式调试MCP服务器,但是STDIO只能本地通信,不适合上云。本文记录如何启动一个官方sdk中的Streamable http server,把它部署到公网,并通过AI集成客户端cherry studio调试并调用tools。由于其中很多原理尚未明确,这里只描述过程,不深究原因。
前期准备
云服务器准备
在华为云开一台ECS,之后在安全组放行3000和80端口,确保后续的nginx能被外网连接。
安装必要的包
依次执行以下命令:
安装node:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs build-essential
node -v
npm -v安装pnpm:
npm install -g pnpmnginx配置
由于Streamable http的安全要求,默认只允许来自localhost的源访问,防止host header攻击。如果不配置代理,在外网直接访问3000端口,就会报以下错误:
{"jsonrpc":"2.0","error":{"code":-32000,"message":"Invalid Host: <server ip>"},"id":null}所以需要在服务器配一道反向代理,外网访问ip实际上访问的是nginx,nginx再从内部转发到localhost,这样MCP服务器就会认为源来自localhost。
安装nginx:
sudo apt update
sudo apt install nginx -y启动:
sudo systemctl start nginx
sudo systemctl enable nginx此时访问服务器ip,就能看到nginx的welcome页面。然后新建文件:
sudo nano /etc/nginx/conf.d/mcp.conf配置反向代理:
server {
listen 80;
server_name <server ip>;
location /mcp {
proxy_pass http://127.0.0.1:3000/mcp;
# 关键:修改Host头
proxy_set_header Host localhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# SSE支持
proxy_http_version 1.1;
proxy_set_header Connection "";
# 防止SSE缓冲
proxy_buffering off;
proxy_cache off;
# 长连接
proxy_read_timeout 86400;
}
}写好后运行检查:
sudo nginx -t重启nginx:
sudo systemctl restart nginx到这一步就算配置好了。注意,一定不要漏掉防止SSE缓冲。
启动MCP Server
下载官方sdk
官方TypeScript的sdk仓库:

下载后,进入typescript-sdk/examples/server,执行pnpm i安装所有依赖。安装后就可以手动启动simpleStreamableHttp.ts:
pnpm tsx src/simpleStreamableHttp.ts它会跑在本地3000端口。其实到了这一步,就算全部完成了。后面要做的只是如何稳定连接并调试它。
配置inspector脚本
首先尝试用inspector调试,如果inspector能连上那就说明远程访问没问题。首先安装:
pnpm add @modelcontextprotocol/inspector之后在package.json中:
"inspector": "npx @modelcontextprotocol/inspector tsx src/simpleStreamableHttp.ts"这样在命令行直接pnpm inspector即可启动调试器。
注意
理论上如果使用inspector启动开发服务器,是直接可以连上的(inspector会自动启动那个脚本)。但是不知道为什么,我在测试时点击连接会显示服务器未启动,必须手动在另一个终端先启动一次:pnpm tsx src/simpleStreamableHttp.ts。不过生产环境不需要inspector,这个问题我暂时不打算解决。
打开调试器后,选Streamable http,url填http://<server-ip>/mcp(不要写端口号,nginx已经自动代理了),不使用代理。点击连接,应该就能连上并查看tools。
配置Cherry Studio
由于调试器不太方便配置llm,所以就需要一个集成客户端来测试MCP服务器是否能与agent配合。我一开始用的是vscode的cline插件,它在使用STDIO连接时没问题,但是一旦使用Streamable http,就会报400错误,目前认为这个问题的来源是cline的连接流程和其它方案不同,它的流程是:
Cline
├─ GET /mcp (SSE)
└─ POST /mcp initialize但MCP官方的写法是:
POST /mcp initialize
▼
server 创建 session
▼
GET /mcp (SSE)也就是说cline会在没有initialize的情况下试图连接sse,这样服务器会判定你没有sessionId,抛400。这个问题当然可以在源码层面解决,但是我还是希望一切以官方标准来,所以干脆换一个客户端测试。
下载
从这个链接下载cherry studio。
自定义MCP服务器
点右上角设置,按下图把刚才配好的信息填进去,然后点启用按钮,点击后应该就能看见现有的示例工具了:

与AI对话测试
点击主页聊天框下面的锤子图标,点manual,然后把刚才添加的这个服务器配进去,问他你都有哪些tools,应该就能看到它检查后的回复:

后续开发
后面要做的其实就是往这个示例MCP中塞自定义的tools,找到这部分代码,用server.registerTool方法按如下格式写进去即可:
server.registerTool(
'greet',
{
title: 'Greeting Tool', // Display name for UI
description: 'A simple greeting tool',
inputSchema: z.object({
name: z.string().describe('Name to greet')
})
},
async ({ name }): Promise<CallToolResult> => {
return {
content: [
{
type: 'text',
text: `Hello, ${name}!`
}
]
};
}
);