尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

【MCP教程系列】用 nodejs+TypeScript 打包自己的 MCP 服务并接入 Cline:TaoToken 统一 Key 配置实战

发布时间:2026/9/26 2:50:34

资讯中心
01
ARTICLE

【MCP教程系列】用 nodejs+TypeScript 打包自己的 MCP 服务并接入 Cline:TaoToken 统一 Key 配置实战

【MCP教程系列】用 nodejs+TypeScript 打包自己的 MCP 服务并接入 Cline:TaoToken 统一 Key 配置实战
1. 从零手搓 MCP 服务为什么我建议你先跑通 Cline 这条链路MCPModel Context Protocol这两年在 AI 工具圈里出现得越来越频繁简单说它是一套让大模型能调用外部工具的协议标准。你可以把它理解成给 AI 装了一个 USB 接口模型本身只会聊天但通过 MCP它能去读文件、查数据库、调你自己的业务接口。而 Cline 是 VS Code 里一个很能打的 AI 编码助手它原生支持 MCP所以把自建服务接进 Cline是验证我写的 MCP 到底能不能用最快的方式。这篇要解决的核心问题很具体用 nodejs TypeScript 从零打包一个 MCP 服务通过 npm 本地构建最后在 Cline 的 settings.json 里配置好让 Cline 能真正调用到你写的工具函数。同时我会把模型调用的 Key 统一走 TaoToken 的 API 通道这样你后面换模型、加工具都不用到处改配置。适合谁看会一点 Node.js、装过 VS Code、想搞明白 MCP 服务从代码到被 AI 调用完整闭环的人。不需要你之前写过 MCP但需要你能看懂 TypeScript 的基本类型标注。整条链路我会给全可复制的 package.json、tsconfig.json、入口文件和 Cline 配置片段你照着敲一遍就能跑通。我试过把服务拆成先本地 stdio 跑通、再进 Cline 验证两步走比一上来就折腾远程部署省心得多下面按这个节奏来。2. 前置准备TaoToken 统一 Key 与 API 通道配置在写代码之前先把模型调用这一环的凭证准备好。MCP 服务本身负责暴露工具但工具内部如果要调大模型比如做总结、做意图识别就需要一个稳定的 API 通道。我这边统一用 TaoToken 来管 Key好处是一个 Key 能覆盖多种模型MCP 服务里不用为每个模型单独维护一套鉴权逻辑。你需要做两件事第一拿到 API Key。访问 TaoToken 控制台创建密钥地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 创建后复制那串 sk- 开头的字符串先存到本地环境变量里别硬编码进代码。第二确认 API 基地址。TaoToken 的 API 入口是 https://taotoken.net/api 这个地址在后面的 MCP 服务里会作为请求 base URL 使用。注意它和官网首页不是一回事代码里填的是 API 域名。配置环境变量的方式Linux/macOS 直接在终端里export TAOTOKEN_API_KEYsk-你的密钥 export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的密钥 $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api注意环境变量只在当前终端会话有效。如果你希望持久化写进 ~/.zshrc 或 ~/.bashrcWindows 用系统环境变量面板。MCP 服务被 Cline 拉起时继承的是 Cline 进程的环境所以更稳妥的做法是在 Cline 的配置里显式传 env这个第 4 节会讲。如果你还想先手动验证一下 Key 能不能用可以打开模型对话页面 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 发一条消息试试能正常返回就说明 Key 和通道都没问题。这一步别跳过否则后面 MCP 报错你会分不清是代码问题还是 Key 问题。3. 可复制配置package.json、tsconfig.json 与 MCP 服务入口现在进入正题。先建目录、初始化项目mkdir my-mcp-server cd my-mcp-server npm init -y3.1 package.json把生成的 package.json 改成下面这样。关键点是type: module用 ESM、bin字段让 npm 打包后能作为命令执行、以及 MCP SDK 依赖。{ name: my-mcp-server, version: 1.0.0, description: A custom MCP server built with nodejs and TypeScript, type: module, bin: { my-mcp-server: ./dist/index.js }, scripts: { build: tsc, start: node dist/index.js, dev: tsc node dist/index.js }, dependencies: { modelcontextprotocol/sdk: ^1.0.0 }, devDependencies: { typescript: ^5.4.0, types/node: ^20.11.0 } }装依赖npm install3.2 tsconfig.json在项目根目录新建 tsconfig.json。目标是编译到 ES2022、模块用 NodeNext这样和 ESM 的 package.json 匹配。{ compilerOptions: { target: ES2022, module: NodeNext, moduleResolution: NodeNext, outDir: ./dist, rootDir: ./src, strict: true, esModuleInterop: true, skipLibCheck: true, declaration: true }, include: [src/**/*] }3.3 MCP 服务入口 src/index.ts这是核心。我用 stdio 传输方式Cline 本地拉起服务最常用这种定义一个工具summarize_text它接收一段文本内部调用 TaoToken 的 API 做处理。这样既演示了 MCP 工具注册又演示了统一 Key 的用法。import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { CallToolRequestSchema, ListToolsRequestSchema, } from modelcontextprotocol/sdk/types.js; const API_KEY process.env.TAOTOKEN_API_KEY ?? ; const BASE_URL process.env.TAOTOKEN_BASE_URL ?? https://taotoken.net/api; const server new Server( { name: my-mcp-server, version: 1.0.0 }, { capabilities: { tools: {} } } ); // 注册工具列表 server.setRequestHandler(ListToolsRequestSchema, async () ({ tools: [ { name: summarize_text, description: 对输入文本做简短总结返回一句话摘要, inputSchema: { type: object, properties: { text: { type: string, description: 需要总结的文本 }, }, required: [text], }, }, ], })); // 处理工具调用 server.setRequestHandler(CallToolRequestSchema, async (request) { if (request.params.name ! summarize_text) { throw new Error(未知工具: ${request.params.name}); } const text String(request.params.arguments?.text ?? ); const resp await fetch(${BASE_URL}/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${API_KEY}, }, body: JSON.stringify({ model: gpt-4o-mini, messages: [ { role: system, content: 你是一个总结助手只输出一句话摘要。 }, { role: user, content: text }, ], }), }); if (!resp.ok) { const errText await resp.text(); throw new Error(API 请求失败: ${resp.status} ${errText}); } const data (await resp.json()) as any; const summary data.choices?.[0]?.message?.content ?? 无结果; return { content: [{ type: text, text: summary }], }; }); const transport new StdioServerTransport(); await server.connect(transport); console.error(my-mcp-server 已启动stdio);几个容易踩的点先说明console.error而不是console.log因为 stdio 传输下 stdout 是协议通道你往 stdout 打日志会污染 JSON-RPC 消息导致 Cline 解析失败。这个坑我第一次写的时候卡了半小时。3.4 编译与本地启动npm run build编译成功后 dist/index.js 就生成了。本地直接跑TAOTOKEN_API_KEYsk-你的密钥 node dist/index.js如果看到 stderr 输出已启动说明服务进程正常。此时它会在 stdio 上等待 JSON-RPC 消息你手动敲键盘是没反应的这是正常的验证要靠 Cline。4. 接入 Clinesettings.json 骨架与调用验证4.1 Cline 的 MCP 配置位置Cline 的 MCP 服务配置写在 VS Code 的 settings.json 里键名是cline.mcpServers。打开命令面板CtrlShiftP输入 Open User Settings (JSON)在文件里加上这一段{ cline.mcpServers: { my-mcp-server: { command: node, args: [/绝对路径/my-mcp-server/dist/index.js], env: { TAOTOKEN_API_KEY: sk-你的密钥, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }要点args里必须是 dist/index.js 的绝对路径相对路径 Cline 解析不到。env里显式传 Key这样不依赖系统环境变量换机器也能跑。如果你把服务发布到了 npm也可以把 command 换成npxargs 写[-y, my-mcp-server]。4.2 验证调用保存 settings.json 后重启 VS Code 或者重载窗口。打开 Cline 面板找到 MCP 服务器列表应该能看到my-mcp-server处于已连接状态并且列出了summarize_text这个工具。然后在 Cline 对话框里输入类似帮我调用 summarize_text把这段话总结一下MCP 是一种让大模型调用外部工具的协议Cline 原生支持它……如果一切正常Cline 会发起工具调用你的服务收到请求、转发给 TaoToken 的 API、拿到摘要、返回给 Cline 展示。看到摘要文字出现就说明整条闭环通了。4.3 参数对照表配置项作用示例值command启动服务的可执行程序nodeargs传给命令的参数数组[/abs/path/dist/index.js]env.TAOTOKEN_API_KEY模型调用鉴权sk-xxxxenv.TAOTOKEN_BASE_URLAPI 基地址https://taotoken.net/api传输方式本地进程通信stdio5. 本篇常见错误排查跑不通的时候按下面这几类对号入座基本能定位到问题。服务连不上 / Cline 显示红色九成是路径问题。检查 args 里的路径是不是绝对路径文件是不是真的存在先ls dist/index.js确认。另外确认 node 在 PATH 里可以在终端which node看。工具列表为空说明服务启动了但 ListTools 没返回。检查你有没有在server.connect之前注册ListToolsRequestSchema处理器顺序反了会拿不到工具。调用时报 API 请求失败: 401Key 不对或没传进去。先确认 env 里的 TAOTOKEN_API_KEY 是完整的 sk- 串没有多余空格。再确认 BASE_URL 是 https://taotoken.net/api 而不是官网首页地址。Cline 报 JSON 解析错误 / 协议错乱几乎可以肯定是你在代码里用了console.log。stdio 传输下 stdout 只能走协议消息所有调试输出改用console.error。改了代码但行为没变忘了重新npm run build。Cline 拉起的是 dist 里的编译产物不是 src。养成改完就 build 的习惯或者用npm run dev。fetch 报错找不到模块Node 版本太低。内置 fetch 需要 Node 18建议直接上 Node 20。用node -v确认。提示排查时最有用的一招是先在终端手动跑一遍node dist/index.js看 stderr 有没有报错。终端能跑通、Cline 跑不通问题就在配置终端都跑不通问题在代码。6. 后续怎么走把 Key 和通道固定下来服务跑通之后你会发现真正省事的地方在于模型调用全部收敛到 TaoToken 这一条通道上。以后你想换模型、加新工具、调参数只改 MCP 服务里的请求体Key 和 base URL 都不用动。Cline 那边也只需要维护一份 settings.json。如果你打算长期用 Cline 做编码和 Agent 任务建议了解一下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它更适合高频调用的场景。接入过程中如果遇到鉴权或协议层的细节问题接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面把 API 通道的用法讲得比较细。最后留一个实用建议把 MCP 服务的工具拆得细一点一个工具只干一件事描述写清楚。Cline 是靠工具描述来决定调不调、怎么调的描述含糊它就容易调错。我现在的习惯是每加一个工具先在 Cline 里手动触发一次确认参数和返回都符合预期再继续加下一个。这样出问题的时候范围小好定位。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。