首页 / 资讯中心 / 文章详情

TypeScript MCP SDK 进阶:高级特性与最佳实践,把 endpoint 改到 TaoToken

TypeScript MCP SDK 进阶:高级特性与最佳实践,把 endpoint 改到 TaoToken ★ FEATURED ARTICLE
1. 从本地 stdio 到远端统一通道TypeScript MCP SDK 进阶要解决的真实问题如果你已经用 TypeScript MCP SDK 写过几个本地 stdio 服务大概率会遇到一个分水岭工具在本地跑得好好的一旦想让团队其他人、或者让远端 Agent 调用就得处理 endpoint、鉴权、模型路由这一堆事。TypeScript MCP SDK 进阶的核心其实不是把工具写得更花哨而是把「本地能跑」变成「远端可稳定调用」。这篇就围绕高级特性工具注册、资源订阅、传输层扩展和最佳实践演示怎么把 endpoint 改到 TaoToken 统一 Key/API 通道完成从本地 MCP 服务端到远端调用的切换。先说清楚 MCP SDK 是什么、能做什么、适合谁。MCPModel Context Protocol是一套让模型和外部工具/资源对话的协议TypeScript SDK 让你用 TS 写服务端把函数注册成「工具」、把数据注册成「资源」、把模板注册成「提示」。适合的人很明确前端/Node.js 技术栈的开发者想复用现有类型定义不想为了写个工具再学一门语言。它的高级特性里工具注册支持 Standard SchemaZod v4、Valibot 等资源订阅支持动态 URI 和变更通知传输层可以从 stdio 扩展到 Streamable HTTP还能挂到 Express、Fastify、Hono 上。问题在于很多教程到「本地 Inspector 能调通」就结束了。真实项目里你的 MCP 服务端往往要调用远端模型或远端工具这时候 endpoint 指向哪里、Key 怎么管、模型 ID 怎么传就成了必须解决的问题。我试过的做法是本地开发用 stdio 快速迭代需要远端能力时把 endpoint 切到 TaoToken 的统一通道Key 和模型 ID 通过环境变量注入代码里不写死。这样本地和远端只差一份配置不用改业务逻辑。下面按「原问题 → 前置准备 → 可复制配置 → 验证 → 排障 → 下一步」的顺序展开。每一段都给可跟做的命令和片段你可以边看边改自己的项目。2. TaoToken 前置准备Key、Base URL 与模型 ID 三件套在动手改 endpoint 之前先把 TaoToken 这边的三件套准备好API Key、Base URL、Model ID。这三样是后面所有配置的基础缺一个都跑不通。第一步拿到 API Key。打开 TaoToken 控制台进入 API Keys 页面创建一个新 Key。建议按项目命名比如mcp-ts-dev方便后面区分。创建后立刻复制保存页面刷新后就看不到了。如果你还没账号可以先从官网入口进去了解整体能力再决定用哪种套餐。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content控制台创建 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsoleAPI Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys第二步确认 Base URL。TaoToken 的 API 入口是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 OpenAI 兼容的 base URL 使用。很多 SDK 要求 base URL 以/v1结尾或者不带具体看客户端实现但 TaoToken 这边统一用https://taotoken.net/api即可。第三步选 Model ID。这一步最容易被忽略。不同模型对工具调用tool calling的支持程度不一样MCP 场景下你要选一个支持 function calling 的模型。在模型对话页面可以先试一下确认模型能正常返回工具调用结构再写进配置。注意Key 只显示一次务必当场保存。不要把它提交到 Git也不要在前端代码里硬编码。后面我们会用.env文件加.gitignore的方式管理。如果你打算长期做编码类 Agent可以考虑 Coding Plan它更适合高频调用场景如果只是验证模型能不能用先用模型对话页面测一下最省事。模型对话验证模型https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchatCoding Plan长期编码https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc前置准备做完你应该手上有三样东西一个sk-开头的 Key、https://taotoken.net/api这个 Base URL、一个确认支持工具调用的 Model ID。接下来进入代码配置。3. 可复制配置把 endpoint 改到 TaoToken 的完整片段这一节是重点给的是可以直接复制进项目的配置。分三块环境变量模板、MCP 服务端代码、以及客户端侧的 settings 片段。先建环境变量文件。在项目根目录创建.env# .env TAOTOKEN_API_KEYsk-你的Key TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODEL_ID你的模型ID MCP_SERVER_PORT3000同时创建.gitignore确保.env不被提交# .gitignore .env node_modules/ dist/然后是 MCP 服务端代码。这里用 TypeScript MCP SDK v2 的写法注册一个工具并在工具内部通过 TaoToken 的 endpoint 调用远端模型。注意registerTool是 v2 的 API不是 v1 的tool。// src/server.ts import { McpServer } from modelcontextprotocol/server; import { StdioServerTransport } from modelcontextprotocol/server/stdio; import * as z from zod/v4; const server new McpServer({ name: taotoken-mcp-server, version: 1.0.0, }); // 读取环境变量不写死 const API_KEY process.env.TAOTOKEN_API_KEY; const BASE_URL process.env.TAOTOKEN_BASE_URL ?? https://taotoken.net/api; const MODEL_ID process.env.TAOTOKEN_MODEL_ID; if (!API_KEY || !MODEL_ID) { throw new Error(缺少 TAOTOKEN_API_KEY 或 TAOTOKEN_MODEL_ID); } // 注册一个「问模型」工具内部走 TaoToken 统一通道 server.registerTool( ask-model, { description: 把问题转发给远端模型并返回回答, inputSchema: z.object({ prompt: z.string().min(1).describe(要问模型的问题), }), }, async ({ prompt }) { const resp await fetch(${BASE_URL}/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${API_KEY}, }, body: JSON.stringify({ model: MODEL_ID, messages: [{ role: user, content: prompt }], }), }); if (!resp.ok) { const text await resp.text(); return { content: [{ type: text, text: 请求失败 ${resp.status}: ${text} }], isError: true, }; } const data await resp.json(); const answer data.choices?.[0]?.message?.content ?? (空回答); return { content: [{ type: text, text: answer }] }; } ); async function main() { const transport new StdioServerTransport(); await server.connect(transport); console.error(MCP server started on stdio); } main().catch(console.error);如果你用的是 Claude Code 这类客户端配置通常放在settings.json里。下面是一个可复制的片段把 MCP 服务端和 TaoToken 的 Base URL、Key、Model ID 三件套都写全{ mcpServers: { taotoken-ts: { command: npx, args: [tsx, src/server.ts], env: { TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_MODEL_ID: 你的模型ID } } } }如果你用的是 Cline 或带 MCP 支持的编辑器配置结构类似核心就是command、args、env三块。Cline MCP 的配置里同样要保证 Base URL、Key、Model ID 三件套齐全缺一个都会在调用时报鉴权或模型不存在。提示不要把 Key 直接写进settings.json提交到仓库。更稳妥的做法是settings.json里只写env的引用真实值放本地.env或者用系统环境变量注入。配置写完后安装依赖npm install modelcontextprotocol/server zod npm install -D tsx typescript types/node到这里endpoint 已经改到 TaoToken 了。下一步是验证它真的能跑通。4. 验证请求启动服务并调用工具返回预期结果配置写完不验证等于没写。这一节给一个端到端的验证动作启动 MCP 服务端调用ask-model工具确认返回的是模型真实回答而不是报错。先确认环境变量被正确加载。如果你用tsx直接跑Node 不会自动读.env需要显式加载。两种方式任选一种# 方式一用 dotenv 预加载 npm install dotenv node -r dotenv/config node_modules/.bin/tsx src/server.ts # 方式二用 tsx 的 --env-fileNode 20.6 npx tsx --env-file.env src/server.ts启动后stderr 会打印MCP server started on stdio。注意是 stderr不是 stdout。stdio 传输模式下 stdout 是协议通道任何console.log都会污染协议导致客户端解析失败这一点后面排障会再讲。接下来用 MCP Inspector 验证npx modelcontextprotocol/inspector npx tsx --env-file.env src/server.tsInspector 启动后在浏览器里打开它给出的地址找到ask-model工具输入{ prompt: 用一句话解释什么是 MCP 协议 }点击调用。预期结果是返回一段模型生成的回答比如「MCP 是一种让模型与外部工具和数据源标准化交互的协议」。如果返回的是请求失败 401说明 Key 有问题如果返回请求失败 404多半是 Base URL 或路径拼错了如果返回(空回答)检查 Model ID 是否支持对话。再验证一个边界情况传入空字符串。因为 schema 里写了z.string().min(1)SDK 会在进入处理函数之前就拦截返回参数校验错误。这说明 Standard Schema 的校验生效了不用你在函数里手动判空。如果你想直接在命令行里验证 TaoToken 通道本身是否通可以先用 curl 打一发curl -s https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: $TAOTOKEN_MODEL_ID, messages: [{role: user, content: ping}] } | head -c 500返回里有choices字段就说明通道没问题问题在 MCP 侧返回 401 就说明 Key 或鉴权头有问题。这个 curl 是排障时最有用的一步能快速把「通道问题」和「代码问题」分开。验证通过后你的 TypeScript MCP SDK 服务端就已经完成了从本地 stdio 到 TaoToken 远端通道的切换。工具注册、参数校验、远端调用三件事都跑通了。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来对照都是我在接入过程中实际遇到过的。每条给现象、原因、解决。401 Unauthorized。现象是调用工具返回请求失败 401。原因通常是三种Key 没传、Key 传错、Key 被环境变量覆盖成空。排查顺序先在终端echo $TAOTOKEN_API_KEY确认变量有值再用上面的 curl 直接打一发排除 MCP 代码问题最后检查settings.json里的env是否把 Key 写成了占位符没替换。注意 Authorization 头必须是Bearer加 Key中间一个空格少空格也会 401。local proxy failed。现象是客户端连不上 MCP 服务端报本地代理失败。这个报错通常和 MCP 服务端进程没起来有关不是网络代理问题。排查手动在终端跑一遍npx tsx --env-file.env src/server.ts看是否报错退出如果报Cannot find module是依赖没装如果报缺少 TAOTOKEN_API_KEY是环境变量没加载。确认手动能跑起来后再检查settings.json里的command和args路径是否正确相对路径在不同工作目录下会失效建议用绝对路径或确认工作目录。reading choices 报错。现象是代码里访问data.choices[0]时报Cannot read properties of undefined (reading choices)。原因是返回体结构和你预期的不一样可能是错误响应被当成了正常响应。解决在解析前先判断resp.ok不 ok 就直接返回错误文本解析后用可选链data.choices?.[0]?.message?.content避免直接下标访问。另外确认你请求的路径是/v1/chat/completions路径错了返回的可能是 HTML 错误页json()解析会直接抛异常。OAuth 相关报错。现象是客户端提示需要 OAuth 授权或 token 失效。MCP 的远端传输支持 OAuth 流程但如果你只是用 API Key 走统一通道不需要走 OAuth。排查确认你的客户端配置里没有误开 OAuth 模式确认 Base URL 指向的是https://taotoken.net/api而不是某个需要 OAuth 的地址如果客户端强制要求 OAuth检查是不是把 MCP 服务端的传输类型配错了stdio 模式下不应该触发 OAuth。stdout 被污染。这个不报特定错误但表现为客户端连接后立刻断开或者收到无法解析的消息。原因是在 stdio 模式下往 stdout 写了非协议内容最常见的就是console.log。解决所有日志改console.error包括调试信息。SDK 内部用 stdout 传 JSON-RPC你写一行console.log(debug)就会让客户端解析失败。Zod 版本不兼容。现象是 schema 校验通过但类型推断报错或者导入zod/v4失败。原因是项目里装了 Zod v3。解决确认package.json里 zod 版本是 v4导入路径写zod/v4。v3 和 v4 可以共存但别在同一个 schema 里混用。把这几条对照一遍基本能覆盖接入 TaoToken 时 90% 的报错。遇到新报错先用 curl 验证通道再缩小到 MCP 代码最后查客户端配置这个顺序最省时间。6. 下一步把统一通道用进长期编码与 Agent 场景走到这里你已经完成了 TypeScript MCP SDK 从本地到远端的切换工具注册用 Standard Schema 做类型安全endpoint 指向 TaoToken 统一通道Key 和 Model ID 通过环境变量注入端到端验证也跑通了。接下来怎么用取决于你的场景。如果你只是偶尔验证模型能力模型对话页面足够改改 prompt 就能测。如果你在做长期编码类 Agent频繁调用工具和模型Coding Plan 更合适配额和稳定性都更贴合高频场景。如果你要把这套 MCP 服务端接进 Claude Code 或 Cline 这类客户端接入文档里有各客户端的配置示例照着改settings.json就行。一个实用建议把ask-model这个工具当成模板后面加新工具时复用同一套环境变量和请求封装。抽一个callModel(prompt)函数出来工具处理函数只负责参数校验和结果包装远端调用逻辑集中在一处。这样换模型、换 endpoint 只改一个地方不用满项目找。最后提醒一句Key 管理别偷懒。.env加.gitignore是最低要求团队协作时用密钥管理服务或 CI 注入别把 Key 贴进聊天记录或 issue。MCP 服务端一旦暴露在公网鉴权就是第一道防线Base URL 和 Key 分开管理出问题也好定位。API Keys创建与管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys接入文档各客户端配置https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc模型对话验证模型https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchatCoding Plan长期编码https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan
阅读完成 · 觉得有帮助?
咨询建站