1. 为什么你的 MCP 在 Trae、Cursor 里总是连不上
如果你正在用 TypeScript 写 MCP Server,大概率会遇到一个很尴尬的局面:代码在本地node dist/server.js跑得好好的,npx @modelcontextprotocol/inspector也能连上,但一放进 Trae 或 Cursor 的 MCP 配置里,编辑器就只给你一句冷冰冰的MCP server failed to start或者干脆静默不加载。问题往往不在你的工具实现,而在编辑器启动 MCP 子进程时的环境变量、工作目录、Node 路径和网络出口跟你手动跑 shell 完全不是一回事。
MCP(Model Context Protocol)本质上是让 LLM 通过标准输入输出或 HTTP 去调用你定义的工具,它解决的是模型知识截止和无法执行外部动作的问题。你可以把它理解成给编辑器装插件:编辑器是宿主,MCP Server 是插件进程,而 TaoToken 在这里扮演的是统一的 Key 与 API 通道,让你的 MCP 工具在调用模型能力时不用在每个编辑器里重复配一堆分散的密钥。这篇面向 TypeScript 开发者,聚焦 Trae 和 Cursor 两个编辑器的配置落地,给出可直接复制的settings.json/config.toml骨架、CC Switch 切换要点,以及三步验证动作,确认你的 MCP 工具真的在编辑器内被调用了。
我试过把同一个 MCP Server 分别塞进两个编辑器,踩过的坑集中在三处:一是command用了npx但编辑器 PATH 里找不到;二是args里的相对路径在编辑器工作目录下解析失败;三是模型侧通道没统一,工具能列出但调用时报鉴权错误。下面按顺序拆开讲。
2. TaoToken 前置:统一 Key 与 API 通道
在动手改编辑器配置之前,先把模型侧的通道理顺。TaoToken 提供统一的 API 入口,你只需要在控制台生成一个 Key,后续无论是 MCP 工具内部调用模型,还是编辑器本身的模型对话,都走同一个通道,省得在 Trae、Cursor、终端三处各维护一份密钥。
你需要做两件事。第一,打开控制台创建 API Key,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,生成后复制保存,它只会完整显示一次。第二,确认你的 MCP Server 或编辑器要用的 Base URL 指向 https://taotoken.net/api ,注意这个 API 地址不带任何查询参数,直接填即可。
如果你只是想让编辑器里的模型对话先跑通,可以先用模型对话页面验证 Key 是否有效: https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。这一步能排除掉「Key 本身有问题」这个变量,后面排查 MCP 时就只剩配置问题。
对于长期在 Trae、Cursor 里做编码和 Agent 任务的场景,可以考虑 Coding Plan,它更适合高频调用: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。接入细节和参数说明统一看文档: https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
注意:Key 不要硬编码进提交到 Git 的 MCP 配置里。编辑器配置文件通常在用户目录下,但仍建议用环境变量引用,后面骨架里会体现。
3. 可复制配置:TypeScript MCP Server 骨架
先确保你的 MCP Server 本身是可独立运行的。基于官方@modelcontextprotocol/sdk,一个最小可用的 TypeScript 服务端长这样,我加了注释方便对照:
// src/server.ts import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { z } from 'zod'; const server = new McpServer({ name: 'ts-mcp-server', version: '1.0.0', }); // 注册一个加法工具,用于验证调用链 server.registerTool( 'ts-add', { title: 'Addition Tool', description: 'Add two numbers', inputSchema: { a: z.number(), b: z.number() }, }, async ({ a, b }) => ({ content: [{ type: 'text', text: String(a + b) }], }) ); const transport = new StdioServerTransport(); await server.connect(transport); console.error('MCP server running on stdio');package.json关键字段如下,注意type必须是module,main指向编译产物:
{ "name": "ts-mcp-server", "version": "1.0.0", "type": "module", "main": "dist/server.js", "scripts": { "build": "tsc", "start": "node dist/server.js" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.17.0", "zod": "^3.25.76" }, "devDependencies": { "@types/node": "^20.0.0", "typescript": "^5.9.2" } }编译一次:npm install && npm run build,确认dist/server.js存在。这一步不做,编辑器里配了也是白配。
3.1 Cursor 的 settings.json 骨架
Cursor 的 MCP 配置入口在 首选项 → Cursor Settings → MCP → Add new global MCP Server。它实际写入的是一个 JSON 文件,骨架如下:
{ "mcpServers": { "ts-mcp-server": { "command": "node", "args": ["/absolute/path/to/your-project/dist/server.js"], "env": { "TAOTOKEN_API_KEY": "${env:TAOTOKEN_API_KEY}", "TAOTOKEN_BASE_URL": "https://taotoken.net/api" } } } }三个要点。command用node而不是npx,因为编辑器子进程的 PATH 经常找不到 npx;args必须是绝对路径,相对路径会以编辑器的工作目录为基准解析,几乎必错;env里用${env:...}引用系统环境变量,避免把 Key 写死在文件里。
3.2 Trae 的 config.toml 骨架
Trae 的 MCP 入口在 设置 → MCP → 添加 → 手动添加,它支持 JSON 也支持 TOML。如果你用 TOML,骨架如下:
[mcp_servers.ts-mcp-server] command = "node" args = ["/absolute/path/to/your-project/dist/server.js"] [mcp_servers.ts-mcp-server.env] TAOTOKEN_API_KEY = "${TAOTOKEN_API_KEY}" TAOTOKEN_BASE_URL = "https://taotoken.net/api"Trae 里还有一个容易忽略的点:使用 Chat 时要手动选择 Builder with MCP 模式,否则工具列表不会注入到对话上下文里,你会误以为 MCP 没加载。
3.3 CC Switch 切换要点
当你在多个项目或多个 Key 之间切换时,CC Switch 能帮你快速换配置。核心是三点:切换前确认目标配置里的args路径指向当前项目的dist/server.js;切换后重启编辑器或重新加载 MCP 面板,因为子进程不会热重载;如果切换后工具消失,先看 MCP 面板的日志,通常是旧进程没退干净导致端口或 stdio 占用。
4. 三步验证:确认 MCP 工具真的被调用
配置写完不代表能用,按下面三步验证,每步都有明确的成功信号。
第一步,脱离编辑器验证 Server 本身。运行:
npx @modelcontextprotocol/inspector node dist/server.js终端会输出一个本地地址,浏览器打开后点 Connect,在 Tools 面板里应该能看到ts-add。手动填a=1, b=2执行,返回3就说明 Server 没问题。这一步失败,问题在你的代码或 Node 版本,跟编辑器无关。
第二步,在编辑器里验证工具注册。Cursor 打开 MCP 面板,Trae 打开 MCP 设置页,确认ts-mcp-server状态是绿色或已连接,工具列表里出现ts-add。如果状态是红色,点开日志看报错,常见的是Cannot find module或ENOENT,对应路径和依赖问题。
第三步,在对话里触发调用。Cursor 的 Chat 或 Trae 的 Builder with MCP 模式下,输入「用 ts-add 算一下 12 加 30」。成功时你会看到类似Called MCP tool: ts-add的提示,并返回42。这一步跑通,说明从编辑器到 MCP Server 再到工具执行的整条链路是通的。
5. 本篇常见错排查
报错MCP server failed to start且无更多信息。九成是command或args路径问题。把command换成node的绝对路径试试,用which node查出来填进去。args里的路径用realpath dist/server.js确认。
工具列表为空但状态是已连接。检查你的registerTool是否在server.connect之前执行。如果用了异步初始化,确保 await 顺序正确。另外 Trae 要确认处于 Builder with MCP 模式。
调用工具时报鉴权或 401。说明 MCP 工具内部调用模型时 Key 没传进去。检查env里的TAOTOKEN_API_KEY是否被正确注入,可以在工具实现里临时打印process.env.TAOTOKEN_API_KEY是否存在(不要打印值)。Base URL 确认是https://taotoken.net/api,不要多加斜杠或路径。
改了配置但行为没变。编辑器不会自动重启 MCP 子进程。Cursor 在 MCP 面板点刷新或重启编辑器;Trae 重新加载 MCP 设置页。切换配置后尤其要注意旧进程残留。
Node 版本报错。SDK 要求 Node.js v18 及以上,用node -v确认。低于这个版本会在导入阶段就失败,表现为编辑器里完全看不到工具。
6. 把通道固定下来,后面就省事了
配置跑通之后,建议把 Key 和 Base URL 统一走 TaoToken 的环境变量,这样 Trae、Cursor 以及你终端里的调试命令共用一套,换机器或换项目时只改环境变量,不动编辑器配置文件。需要新建或轮换 Key 时到控制台操作: https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。如果你在 Claude Code 或 Anthropic 风格的接入里也要用同一通道,参考: https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode_anthropic&utm_campaign=rewrite 。
最后留一个实用习惯:每次改完 MCP 配置,先跑一遍 inspector 确认 Server 独立可用,再进编辑器验证。这个顺序能帮你把「代码问题」和「配置问题」彻底分开,排查时间至少砍一半。