ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Claude Code 配 TaoToken:跑通 MCP Server 的 Resources 与 Tools

Claude Code 配 TaoToken:跑通 MCP Server 的 Resources 与 Tools 你在 Claude Code 里输入“帮我看看 GitHub 仓库里最新的 issue”它却回你“我无法访问 GitHub”这种断点就是 MCP 要补的位置。先把模型通道底座铺好TaoToken 的落地页 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 能创建 API KeyClaude Code 的 Base URL 填 https://taotoken.net/apiMCP Server 仍然由 Claude Code 托管。接下来按原文的路径走一遍创建最小 MCP Server把它写进 ~/.claude/config.json再在对话里触发 resources/list 和 tools/call。模型侧消耗 Token、计费归 TaoToken资源与工具进程归 Claude Code 管两边别混。1. 从“AI 看不到 GitHub issue”说起MCP 到底补了哪块拼图1.1 对话模型缺的不是智商是取数与动手的通道你在对话框里问“查看我 GitHub 上最新的 issue”模型本身并不会因为不会说话而答不上来它缺的是一条被允许访问 GitHub 的通道。早期做法很直接每个 AI 应用自己写 GitHub 集成、自己处理 token、自己分页、自己解析响应。Slack 要写一套Notion 要写一套文件系统再写一套。代码重复不说换一个 AI 客户端还要重写。MCP 把这件事拆成了标准动作客户端先问服务端“你有什么资源”再问“你有什么工具”需要读数据走resources/read需要执行动作走tools/call。通道一旦标准化Claude Code、其他 MCP Client 就能用同一套方式接进来。1.2 Resources 与 Tools 在 Claude Code 里的分工Resources 是只读数据源用 URI 标识例如github://repo/README.md、filesystem://Documents/notes.md、demo://hello。Claude Code 想读时会发resources/list拿到资源清单再用resources/read按 URI 取内容。Tools 是动作入口带名字、描述和输入参数 schema例如greet(name)、create_issue(title, body)。Claude Code 决定调用工具时会发tools/call把参数塞进 arguments。把这两类能力分开AI 就不会把“读一段文本”和“改一个文件”混成一件事。后面配置 MCP Server 时最先看到的也是这两组方法。1.3 三层结构里谁管模型、谁管工具MCP 的通信链路可以简化为三层Claude Code 这类 MCP Client 负责把自然语言转成协议请求MCP Host 负责拉起并管理服务端进程MCP Server 负责真正读 GitHub、读目录、调本地脚本。模型通道底座是另一条线Claude Code 的对话与工具决策要消耗模型 Token这一段由 TaoToken 提供兼容通道。两条线在 Claude Code 里交汇但职责不重叠。TaoToken 不托管 MCP ServerMCP Server 也不关心你的模型 Key把它们混成一个地址后面排障会非常痛苦。2. 先把 Claude Code 的模型通道接到 TaoToken2.1 在官网创建 Key并确认要填的模型 ID打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并登录在控制台创建一把 API Key。Key 不要写进文章、截图或 Git 仓库配置里统一用YOUR_API_KEY占位。模型 ID 以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场当时列表为准不要凭记忆写一个带日期后缀的名字。Claude Code 侧要填的是 Base URLhttps://taotoken.net/api末尾不要加/v1。这个地址只负责模型 API 请求和 MCP Server 的 stdio 进程没有关系。2.2 ~/.claude/settings.json 里的 env 怎么写Claude Code 可以把模型接入参数放在~/.claude/settings.json的env里也可以用环境变量。配置文件形式如下把占位符替换成你从官网创建的值{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_ID } }如果你更喜欢在 shell 里临时导出对照写export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_MODELYOUR_MODEL_IDANTHROPIC_BASE_URL一定不要写成带/v1的形式ANTHROPIC_AUTH_TOKEN用你在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建的 Key。改完以后重新打开 Claude Code先让它回一句普通对话确认模型通道通了再去折腾 MCP Server。2.3 为什么 MCP Server 不需要配置到 TaoToken 里MCP Server 是 Claude Code 拉起的子进程常见通信方式是 stdioClaude Code 启动node /path/to/server.js通过标准输入输出发 JSON-RPC 消息。TaoToken 的 Base URL 只处理模型请求不处理resources/list或tools/call。如果你把 MCP Server 的地址填进ANTHROPIC_BASE_URLClaude Code 连模型都会失败。正确的分工是模型通道填https://taotoken.net/apiMCP 配置填~/.claude/config.json。两边各自独立排障时也能快速判断是模型侧问题还是工具侧问题。3. 手写最小 MCP Serverresources/list 与 tools/call 从零跑通3.1 初始化项目与依赖先建一个独立目录避免把 MCP Server 代码和业务项目混在一起。Node 环境准备好后执行mkdir my-mcp-server cd my-mcp-server npm init -y npm pkg set typemodule npm install modelcontextprotocol/sdktypemodule是为了后面用 ESM 写法。原文里的server.js可以继续用我这里改成server.mjs减少和 CommonJS 项目冲突的概率。装完依赖后在目录里新建server.mjs下一步把 Resources 和 Tools 两个能力都塞进去。3.2 server.mjs 里同时暴露 Resource 和 Tool下面这段代码提供两个能力一个只读资源demo://hello一个工具greet。你可以把它当成最小可跑模板再按业务替换。import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; const server new Server( { name: taotoken-demo-server, version: 0.1.0 }, { capabilities: { resources: {}, tools: {} } } ); server.setRequestHandler(resources/list, async () { return { resources: [ { uri: demo://hello, name: Hello Resource, description: 一段只读文本用来验证 resources/list 与 resources/read, mimeType: text/plain } ] }; }); server.setRequestHandler(resources/read, async (request) { const { uri } request.params; if (uri ! demo://hello) { throw new Error(Resource not found: ${uri}); } return { contents: [ { uri, mimeType: text/plain, text: Hello from the MCP server hosted by Claude Code. } ] }; }); server.setRequestHandler(tools/list, async () { return { tools: [ { name: greet, description: 按名字返回一句问候, inputSchema: { type: object, properties: { name: { type: string, description: 要问候的人名 } }, required: [name] } } ] }; }); server.setRequestHandler(tools/call, async (request) { const { name, arguments: args } request.params; if (name ! greet) { throw new Error(Unknown tool: ${name}); } return { content: [ { type: text, text: Hello, ${args.name}. tools/call reached the server. } ] }; }); async function main() { const transport new StdioServerTransport(); await server.connect(transport); console.error(MCP Server is listening on stdio); } main().catch((error) { console.error(MCP Server failed:, error); process.exit(1); });resources/list返回资源清单resources/read按 URI 返回内容tools/list返回工具定义tools/call根据名字和参数执行。Claude Code 不会自动把text当成最终回答它会把结果带回模型再决定怎么回你。模型这一步消耗的 Token 走 TaoToken 通道工具进程本身不消耗模型额度。3.3 把 Server 写进 ~/.claude/config.json打开~/.claude/config.json加入mcpServers。如果文件里已经有其他配置只追加这一节不要覆盖。路径必须是绝对路径否则 Claude Code 的工作目录一变node就找不到文件。{ mcpServers: { my-first-server: { command: node, args: [/absolute/path/to/my-mcp-server/server.mjs] } } }保存后Claude Code 下次启动会读取这个文件拉起node子进程并发送initialize。服务端返回能力清单以后客户端再用resources/list和tools/list拉取可用项。这里没有出现任何模型 Key也不需要把https://taotoken.net/api填进来。MCP 配置只管进程怎么起、用哪些参数。3.4 github 与 filesystem 两个现成 Server 的配置差异除了手写 Server原文还提到 github、filesystem 这类现成服务。它们和my-first-server一样都是mcpServers下的条目只是启动命令和参数不同。filesystem 需要给一个允许访问的目录github 需要个人访问令牌。配置形态可以写成{ mcpServers: { filesystem: { command: npx, args: [ -y, modelcontextprotocol/server-filesystem, /absolute/path/to/your/project ] }, github: { command: npx, args: [-y, modelcontextprotocol/server-github], env: { GITHUB_PERSONAL_ACCESS_TOKEN: YOUR_GITHUB_TOKEN } } } }filesystem 的能力边界由传入目录决定只给它需要的项目路径。github 的 token 权限按最小范围申请能读 issue、读仓库就够了。MCP Server 只负责把资源列表和工具调用暴露给 Claude Code真正的执行发生在本机子进程里。模型仍然通过 TaoToken 通道做决策工具参数和返回内容则在本地流转。不要把数据库连接串、生产机器密码直接塞进 MCP Server 配置除非你清楚权限范围。4. 回到 Claude Code 对话里验证resources/list 和 tools/call 真的发生了吗4.1 重启后先确认 MCP Server 在线修改~/.claude/config.json后重启 Claude Code。部分版本会在启动时打印 MCP 连接日志能看到taotoken-demo-server或my-first-server初始化成功。如果没有明显日志直接在对话里问“当前有哪些 MCP Server”或者“列出 my-first-server 提供的 resources”。Claude Code 内部会发resources/list如果配置生效它会看到demo://hello。如果这一步就报错先不要怀疑模型通道优先检查 JSON 语法、绝对路径和node是否在 PATH 中。4.2 用自然语言触发 greet 和 hello 资源确认资源清单后继续触发工具。输入“调用 my-first-server 的 greet 工具向 Alice 问好。”Claude Code 会先看tools/list找到greet的inputSchema再把{ name: Alice }塞进tools/call。服务端返回文本Claude Code 再组织成一句回答。你也可以让它读资源“读取 demo://hello 的内容。”这时走的是resources/read不是tools/call。把这两种请求分别试一次就能确认 Resources 与 Tools 两条路径都通了。4.3 查 TaoToken 用量确认模型调用在计费工具调用跑通以后回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 查看用量记录。一次对话里Claude Code 可能发多次模型请求第一次决定要不要调工具第二次把工具结果整理成回答。只要ANTHROPIC_BASE_URL指向https://taotoken.net/api这些模型请求就会走 TaoToken 通道。如果用量里没有记录先检查 Claude Code 是否真的重启过再确认环境变量或settings.json没有被其他配置覆盖。MCP 工具本身不会产生模型费用费用来自模型往返。5. 排障MCP Server 已启动但 Claude Code 说 Unknown tool 或资源为空5.1 路径、进程与配置节错误Unknown tool: greet不一定代表代码写错。先看~/.claude/config.json的mcpServers键名是否和对话里说的一致再确认args指向的server.mjs是绝对路径。再手动执行node /absolute/path/to/my-mcp-server/server.mjs如果它立刻退出并打印错误Claude Code 自然也连不上。还有一种情况是文件里出现两个mcpServers节点JSON 后者覆盖前者看起来配置了实际没生效。把配置合并到一个对象里保存后重启。5.2 Base URL 多 /v1 或 Key 无效先让模型对话能跑如果 Claude Code 在调用 MCP 之前就回不了话或者报鉴权错误先把 MCP 放一边检查 TaoToken 配置。ANTHROPIC_BASE_URL必须是https://taotoken.net/api不要写成https://taotoken.net/api/v1。ANTHROPIC_AUTH_TOKEN用从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建的那把 Key别把 MCP 的 GitHub token 填进来。模型通道通了tools/call才有机会被模型决定。模型都没通MCP 再正确也只会停在本地。5.3 tools/call 的名称、参数 schema 与资源 URI 对不上tools/call的name必须和tools/list返回的名字完全一致大小写都算。arguments要满足inputSchema例如greet要求name是字符串传数字就可能被拒绝。资源侧同理resources/read收到的 URI 要和resources/list里声明的demo://hello一致写成demo://hello/可能就命中不到。排障时把 Claude Code 的日志和 Server 端console.error对照看比反复改模型参数有效。6. 安全边界与下一步把 github、filesystem 挂上去之后6.1 最小权限目录白名单与 GitHub token 范围filesystem Server 一旦挂进 Claude Code模型就能通过resources/read读你允许的目录。只传项目目录不要传整个用户主目录。github Server 的 token 也一样能读 issue 和仓库内容即可不要给删除仓库的权限。MCP 的权限控制在 Server 侧Claude Code 只负责发起请求。你给 Server 多大能力模型就能在多大范围内调用工具。权限收紧不会影响跑通反而让排障更干净。6.2 不要越过 AI 编程工具的边界Claude Code 和 Codex 可以生成、解释、对照代码或 SQL但不要把它们写成能直连生产库、生产机器执行操作。诊断 SQL、编译、运行命令应当由你在本地或对应客户端执行再把输出贴回对话。MCP Server 可以帮你读取本地文件、查询允许的资源但涉及业务系统的执行动作仍要留在你的权限边界内。模型通道只负责推理与计费不替你做运维决策。6.3 下一步模型对话、Coding Plan、创建 Key、Claude Code 文档跑通之后先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息确认模型 ID 和 Base URL 没填错。如果准备长期让 Claude Code 调 MCP打开 Coding Plan 看套餐是否够用Key 在 控制台 API Keys 创建Claude Code 环境变量对照见 接入文档。想确认这次resources/list和tools/call背后的模型请求有没有记上账回 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 看用量就够了。MCP Server 继续由 Claude Code 托管TaoToken 只做模型通道底座两边各司其职后面加更多 Server 也不会乱。
返回列表