1. 从「只会聊天」到「真能干活」:MCP 服务器到底解决了什么
如果你用过 Claude Desktop 或 Cursor,大概率遇到过这种尴尬:你让它帮你看看项目里某个配置文件写了什么,它只能礼貌地回你一句「我无法访问你的本地文件」。它能写代码、能解释概念,但一到「动手」环节就卡住了。MCP(Model Context Protocol)就是来补这块短板的——它是一套让 AI 助手安全连接外部工具、数据源和服务的开放协议。你可以把 MCP 服务器理解成给 AI 装上的「手和脚」:读文件、跑命令、查目录、调接口,这些原本只能你自己敲键盘做的事,现在可以交给 AI 通过标准协议去触发。
这篇教程面向想让 AI 真正调用本地工具干活的 Node.js 开发者。我会从零带你搭一个能跑的 MCP 服务器,给出可复制的骨架代码、Claude Desktop 的 settings 配置片段,以及用 TaoToken 统一 Key 接入 Claude 的方式。全程不需要你懂协议底层细节,跟着敲就能跑通。核心检索词先摆在这:MCP 服务器、Node.js SDK、Claude、统一 Key 接入。适合谁?适合已经会用 Node.js 写点脚本、想让 AI 帮你自动处理文件或系统信息的开发者。不适合谁?如果你连npm install都没跑过,建议先补一下 Node 基础再回来。
我试过把这套流程走通之后,最直观的感受是:以前要手动复制粘贴给 AI 的内容,现在一句「帮我读一下 xxx 文件」就搞定了。下面进入正题。
2. 前置准备:Node 环境、SDK 安装与 TaoToken 统一 Key
2.1 环境要求与检查
动手前先确认版本。MCP 的 Node.js SDK 对运行时版本有要求,建议 Node 18 以上:
node --version npm --version如果版本低于 18,去 Node 官网装个 LTS 版本。包管理器用 npm 或 pnpm 都行,我下面统一用 npm,避免你多装东西。
2.2 初始化项目并安装 MCP SDK
新建目录,初始化,装 SDK:
mkdir mcp-demo-server cd mcp-demo-server npm init -y npm install @modelcontextprotocol/sdk装完后package.json里会多出依赖项。这里有个坑要提前说:SDK 版本迭代较快,不同小版本的 API 命名可能有差异。如果你跑代码时报「xxx is not a function」,先npm ls @modelcontextprotocol/sdk看装的是哪个版本,再对照官方 README 调整。我下面给的代码基于较稳定的写法,尽量兼容。
2.3 TaoToken 统一 Key 的定位
MCP 服务器本身是「工具提供方」,它不负责跟大模型对话。真正跟 Claude 对话的是 Claude Desktop 或 Cursor 这类客户端。那 TaoToken 在这里扮演什么角色?它是一个统一接入层:你不需要在多个客户端里分别配置不同的模型凭证,而是用一把 Key 走通模型调用。对于 MCP 场景,它的价值在于——当你的 MCP 工具被 Claude 调用、Claude 需要回传结果给模型时,模型侧的接入可以统一管理。
获取 Key 的入口在控制台,创建后复制保存。注意:Key 只显示一次,丢了只能重建。接入文档里有各客户端的配置示例,建议先扫一眼再动手。
提示:Key 属于敏感凭证,不要硬编码进提交到 Git 的代码里。用环境变量或本地配置文件承载。
3. 可复制配置:MCP 服务器骨架 + Claude settings 片段
3.1 最小可运行服务器骨架
创建server.js,这是一个带工具注册的完整骨架:
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js"; import fs from "fs/promises"; import os from "os"; const server = new Server( { name: "mcp-demo-server", version: "1.0.0" }, { capabilities: { tools: {} } } ); // 声明工具清单 server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: "read_file", description: "读取指定路径的文本文件内容", inputSchema: { type: "object", properties: { path: { type: "string", description: "文件绝对路径" } }, required: ["path"], }, }, { name: "system_info", description: "获取当前机器的系统信息", inputSchema: { type: "object", properties: {} }, }, ], })); // 处理工具调用 server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (name === "read_file") { const content = await fs.readFile(args.path, "utf-8"); return { content: [{ type: "text", text: content }] }; } if (name === "system_info") { const info = { platform: os.platform(), arch: os.arch(), cpus: os.cpus().length, totalMemGB: Math.round(os.totalmem() / 1024 / 1024 / 1024), }; return { content: [{ type: "text", text: JSON.stringify(info, null, 2) }] }; } throw new Error(`未知工具: ${name}`); }); const transport = new StdioServerTransport(); await server.connect(transport); console.error("MCP 服务器已启动");注意package.json里要加"type": "module",否则import语法会报错:
{ "name": "mcp-demo-server", "version": "1.0.0", "type": "module", "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0" } }3.2 Claude Desktop 配置片段
找到 Claude Desktop 的配置文件位置:macOS 在~/Library/Application Support/Claude/claude_desktop_config.json,Windows 在%APPDATA%\Claude\claude_desktop_config.json。写入:
{ "mcpServers": { "demo-server": { "command": "node", "args": ["/绝对路径/mcp-demo-server/server.js"], "env": { "NODE_ENV": "production" } } } }args里的路径必须是绝对路径,相对路径在客户端启动子进程时解析会出问题,这是新手最容易踩的坑之一。
3.3 参数对照表
| 配置项 | 作用 | 常见错误值 |
|---|---|---|
| command | 启动命令 | 写成nodejs导致找不到 |
| args | 脚本路径数组 | 用相对路径 |
| env | 环境变量 | 把 Key 明文写这里提交 Git |
4. 验证请求:启动、连接与工具调用测试
4.1 先单独启动服务器
在终端直接跑:
node server.js如果看到MCP 服务器已启动且进程不退出,说明 stdio 传输层正常。按 Ctrl+C 退出,因为接下来要让 Claude Desktop 来拉起它。
4.2 重启客户端并确认连接
完全退出 Claude Desktop(不是关窗口,是退出进程),再重新打开。在对话里输入:
请调用 system_info 工具,告诉我这台机器的信息如果配置正确,Claude 会请求调用工具,你确认后它会返回平台、CPU 核数、内存等信息。这一步成功,说明 MCP 链路通了。
4.3 用 TaoToken 统一 Key 跑通模型侧
工具能调用了,但模型侧如果没配好,Claude 可能无法正常回传结果。这时候用 TaoToken 的统一 Key 接入。在客户端里把模型接入指向 TaoToken 的 API 地址,Key 填你在控制台创建的那把。接入文档里有针对不同客户端的完整字段说明,照着填即可。配好后重新发起一次工具调用,观察是否正常返回。
4.4 验证成功的判断标准
三个信号同时出现才算跑通:终端无报错、Claude 界面显示工具调用卡片、返回内容与工具逻辑一致。缺任何一个,去下一节排查。
5. 本篇常见错排查:从报错到定位
5.1 「Cannot find module」类错误
多半是依赖没装全或路径写错。先npm install重装,再确认args里的路径真实存在。Windows 用户注意路径分隔符,JSON 里要用双反斜杠或正斜杠。
5.2 服务器启动后立刻退出
stdio 模式下,如果主进程没有保持事件循环,进程会直接结束。检查你是否在connect之后还有异步操作没 await,或者有没有意外调用process.exit()。
5.3 工具列表为空
ListToolsRequestSchema的 handler 没注册成功,或者 SDK 版本 API 变了。打印一下server对象看方法是否存在,必要时降级 SDK 版本。
5.4 调用工具报「未知工具」
工具名大小写不一致,或者inputSchema的required字段和实际传参对不上。把request.params完整打印出来对比。
5.5 模型侧无响应
如果工具调用卡片出现了但结果回不来,检查 TaoToken 的 Key 是否有效、API 地址是否填对。排障优先看接入文档里的错误码说明,再对照 API Keys 页面确认 Key 状态。
注意:调试时把日志写到 stderr,不要写 stdout。stdio 传输下 stdout 是协议通道,混入日志会破坏消息格式导致客户端解析失败。
6. 下一步:把 MCP 用进日常编码流
跑通最小示例后,你可以按同样套路扩展工具:加一个list_dir读目录、加一个run_lint跑 ESLint、加一个git_status看仓库状态。每加一个工具,就是在给 AI 多装一只手。
如果你打算长期用 MCP 配合编码和 Agent 工作流,建议了解一下 Coding Plan,它更适合高频、长时间的编码场景,比单次调用更划算。模型对话入口可以用来快速验证工具返回的内容是否符合预期,接入文档则是排障时的第一手资料。API Keys 页面管理你的凭证,控制台看整体用量。
最后留一个实用技巧:把 MCP 服务器的工具描述写清楚,尤其是description字段。Claude 是靠这段描述判断该不该调用你的工具的。描述写得越具体,AI 选错工具的概率越低。这比事后调 prompt 有效得多。