ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MCP Server 开发实战:把 Codex 的 Key 改到 TaoToken 后跑通 @McpTool

MCP Server 开发实战:把 Codex 的 Key 改到 TaoToken 后跑通 @McpTool MCP Server 开发实战里最容易把人卡住的位置不在 McpTool 注解而在注解之外的调试循环。TaoToken 解决的是这个循环里的模型通道问题先到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 API Key再把 Codex 的 Base URL 指到 https://taotoken.net/api。按那篇 MCP 全解析教程做到第八章读者要用 Java Spring AI 搭一个天气查询 Server把 get_weather 暴露成工具最后在 claude_desktop_config.json 里填本地 http://localhost:8080/message 地址做联调。这个流程里 Codex 要反复做同一件事生成代码骨架、解释 Spring 报错、调整 application.yml、确认 /message 端点是否正常。每走一步都是一次模型调用官方 Key 的消耗节奏、多 Key 切换、本地认证参数全都会变成干扰项。TaoToken 的作用就是把这些干扰收敛成一把 Key、一个 Base URL一次配置支撑整章开发、联调和排障。1. 真正的摩擦力不在 McpTool而在模型通道Spring AI 对 MCP 的封装其实很薄。给一个 Java 类加 Component再给方法加 McpToolSpring 启动时就会把它注册成 MCP 工具Claude Desktop、Cherry Studio 这类客户端通过 tools/list 发现它通过 tools/call 调用它。原教程第八章的核心就是这一套注解加一个 STREAMABLE 的传输配置。但真正动手时摩擦大多发生在代码之外。读者跟着教程从 pom.xml 开始搭项目会遇到Spring AI 版本和 Maven 仓库对不对得上、application.yml 里 protocol 和 type 怎么写、本地 8080 有没有被占用、claude_desktop_config.json 填完以后 Claude Desktop 为什么连不上。这些问题本身不复杂但每一个都要靠“把报错丢给 Codex → Codex 分析 → 改配置 → 再跑一次”来解决。模型通道不稳定时问题会叠加官方 Key 额度到了、另一个 Key 忘了在哪换、环境变量被上一个项目改掉。工具还没调通认证先把人绕晕了。TaoToken 在这个场景里解决的是模型通道的收敛问题。它提供一个统一的 API Base URL 和 API Key让 Codex 这类编程工具不再依赖某个官方账号的额度状态。开发 McpTool 时Codex 只关心代码和报错模型调用全部走同一把 Key。环境变量少了复现问题的变量也少了。2. 准备材料到 TaoToken 创建 Key 并确认模型 ID2.1 注册并创建 YOUR_API_KEY打开 TaoToken注册登录后进入控制台的 API Keys 页面创建一把新 Key。本文统一用 YOUR_API_KEY 作为占位符你创建出来的真实 Key 是一段类似 sk- 开头的字符串。Key 只在创建时完整显示一次建议立刻复制到本地密码管理器里再开始配置 Codex。不要把它提交到 git 仓库也不要写进 Spring Boot 项目里——它是 Codex 的模型身份不是 MCP Server 的一部分。2.2 模型 ID 以模型广场为准在同一个落地页里找到模型广场看当前列表里有哪些模型。Codex 配置里需要填写的是模型 ID而不是界面上的展示名。模型广场上的列表会随服务调整变化所以这一篇不写死某个具体 ID读者在配置时以模型广场当时列表为准把看到的模型 ID 完整复制到配置里即可。官网落地页、接口地址、Key 之间的关系可以记成下面这张表用途地址说明注册、创建 Key、查看模型广场与用量https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end在浏览器里访问Codex 填写的 Base URLhttps://taotoken.net/api写进 config.toml末尾不带 /v1API KeyYOUR_API_KEY创建后复制按导出方式写入环境变量3. Codex config.toml把 Base URL 指到 TaoToken3.1 一份可运行的配置Codex 的模型供应商配置在 ~/.codex/config.toml。打开这个文件把下面内容合并进去如果文件里已有其他配置先备份model 模型ID # 替换为 TaoToken 模型广场当前列出的模型 ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在当前 shell 里导出这把 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY保存 config.toml 后先在一个新终端里跑codex --version或随便发起一次对话确认 Codex 已经能通过自定义 provider 发起请求。model 那行的引号里要填你在模型广场复制的模型 ID如果填了一个模型广场上不存在的 IDCodex 会报模型不存在。3.2 落地页、接口、Key 三者不要混这一步值得单独提出来因为读者最容易在这里绕晕。官网落地页只用于注册账号、创建 Key、查看模型广场和用量记录真正写进 Codex 配置的接口地址是 https://taotoken.net/api末尾不要加 /v1也不要带任何 UTM 参数。浏览器的地址栏和工具的 base_url是两个完全不同的东西。表格里那两行地址一行是给人点的一行是让程序连的用错了就会出现下一章里的 404 或认证失败。4. Spring AI 实战pom.xml、application.yml 与 WeatherTools这一章对应原教程第八章。Codex 的角色是帮你写这些文件和代码、在你把报错贴回来时做解释实际执行 mvn 编译、启动 Spring Boot 的是你自己的本地终端。4.1 pom.xml 里的依赖Spring AI 的 MCP Server Starter 已经封装了服务端的大部分工作。在 pom.xml 中加入dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-mcp-server-webmvc/artifactId version1.0.0-M6/version /dependency版本号以 Maven 仓库或 Spring AI 文档当时可用的版本为准。加完依赖后执行 mvn dependency:resolve 或直接 mvn spring-boot:run让 Maven 把依赖拉下来顺便验证本机的 Java 和 Maven 环境没有其他隐藏问题。4.2 application.yml 里的 STREAMABLE 模式在 src/main/resources/application.yml 里配置 MCP Server 的协议spring: ai: mcp: server: name: My MCPServer version: 1.0.0 protocol: STREAMABLE type: SYNCprotocol 选 STREAMABLESpring AI 就会按 Streamable HTTP 协议暴露一个统一的 /message 端点。type 用 SYNC 即可get_weather 这种同步返回的工具不需要异步处理。4.3 用 McpTool 暴露 get_weather新建一个 WeatherTools 类标注 Component方法上标注 McpToolComponent public class WeatherTools { McpTool(name get_weather, description 获取某个城市的实时天气) public String getWeather( McpToolParam(description 城市名称, required true) String city) { return city 今天晴25°C适合户外活动; } McpTool(name get_forecast, description 获取某个城市未来七天的天气预报) public String getForecast( McpToolParam(description 城市名称, required true) String city, McpToolParam(description 天数, required false) Integer days) { int d days ! null ? days : 7; return city 未来 d 天以晴为主温度22到30°C; } }Spring AI 启动扫描时会根据注解自动生成工具定义get_weather 的 inputSchema 里会有一个必填的 city 字段说明文字也会带进去。这样 Claude Desktop 这类客户端就能在 tools/list 里看到这个工具并在合适的时候发起 tools/call。4.4 带上下文的工具与进度推送如果工具执行时间较长可以声明一个 McpSyncRequestContext 参数把进度推给客户端McpTool(name process_large_file, description 处理大文件展示进度推送) public String processLargeFile( McpSyncRequestContext context, McpToolParam(description 文件路径, required true) String filePath) { context.info(开始处理文件: filePath); context.progress(p - p.progress(0.0).total(1.0).message(读取中...)); context.progress(p - p.progress(1.0).total(1.0).message(完成)); return 文件处理完成 filePath; }进度推送是 Streamable HTTP 相对旧版 SSE 的一个重要改进客户端发起 tools/call 时如果带上 Accept: text/event-stream服务端就可以用事件流把 progress 和最终 result 一起返回。这个能力在 JSON-RPC 层只是普通的 Notification在传输层却是靠 /message 端点按需升级出来的。4.5 本地启动在项目根目录执行mvn spring-boot:run启动日志里能看到 MCP Server 的名称 My MCPServer 和协议信息。此时 /message 端点已经注册Spring Boot 默认监听 8080 端口。如果 8080 被占用换一个端口后联调配置里的 url 要同步改。这里每一步都在本地执行Codex 只负责生成代码和解释报错不会也不应该直接连你的生产环境去执行东西。5. Streamable HTTP 联调claude_desktop_config.json 填 /message5.1 为什么联调只填一个 /message原教程在传输层演进部分提到旧的 HTTPSSE 方案有 /initialize、/sse、/tools/call 等多个入口SSE 长连接一断之前的上下文就全丢了服务器为了维持推送通道只能为每个客户端保持一条长连接水平扩展很难做。Streamable HTTP 把这些入口收敛成一个 POST /message普通请求直接返回 JSON-RPC 响应需要流式结果时客户端在请求头里带 Accept: text/event-stream连接才按需升级成 SSE。有了统一的 /messageclaude_desktop_config.json 里只需要一个 url。这里要区分另一个容易混淆的点Web 应用里给前端打字效果的 SSE 并不过时它是应用层的数据流MCP 旧版 HTTPSSE 是协议传输层被替代的是这一层。原教程第九章反复强调这一点在联调时也适用——Claude Desktop 连的是 MCP Server 的协议端点不是聊天接口。5.2 Claude Desktop 连接本地 Server启动 Spring Boot 后打开 Claude Desktop 的配置文件 claude_desktop_config.json加入{ mcpServers: { weather-server: { url: http://localhost:8080/message, transport: streamable-http } } }注意这里的地址是本地 MCP Server 的地址不是模型服务的接口地址。模型服务的 Base URL 是写给 Codex 这类模型客户端用的Claude Desktop 在这里扮演 MCP Client连接的是你刚启动的 Spring Boot 进程。注意claude_desktop_config.json 里填 http://localhost:8080/messageCodex 的 config.toml 里填 https://taotoken.net/api两者在联调环节同时存在不要混淆。5.3 验证 get_weather 被调用先用 curl 确认端点活着curl -X POST http://localhost:8080/message \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:1,method:initialize,params:{protocolVersion:2025-03-26,capabilities:{},clientInfo:{name:curl-client,version:1.0.0}}}能返回 JSON-RPC 的 result说明 MCP Server 已经按 Streamable HTTP 起来了。这段 curl 可以让 Codex 帮你生成但要在你的本地终端执行再把结果贴回对话。然后打开 Claude Desktop在对话里问“北京今天天气怎么样”。Claude 会先通过 tools/list 发现 get_weather再发起 tools/call 调用本地接口最终回给你“北京今天晴25°C适合户外活动”。这个结果由本地 Java 方法生成不是模型编出来的。5.4 回控制台对一次用量联调结束后回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 看控制台的用量记录。你会发现get_weather 的调用本身不消耗模型 token真正消耗的是前面开发阶段 Codex 生成代码、解释报错、帮你改配置的那些对话。把用量记录和时间点对照一下就能清楚看到这次 MCP Server 实战到底在模型调用上花了多少。6. 排障模型 ID、401、/v1 和本地端口6.1 model not found 或模型不存在Codex 报模型不存在几乎都是 model 字段里的值不是模型广场上的正式 ID。打开模型广场复制当时的模型 ID替换 config.toml 里 model 引号中的内容再新开终端运行 Codex。不要凭记忆补一个版本号或日期后缀模型广场列出什么就填什么。6.2 401 / 403YOUR_API_KEY 没有生效。检查 config.toml 里 env_key 写的环境变量名和 export 时的名字是否完全一致保存配置后是否新开了终端export 命令里是否有额外的引号或空格。用echo $TAOTOKEN_API_KEY确认环境变量已经存在。Key 本身如果创建后一直没复制那就回控制台重置一把新的。6.3 404 或 connection refused如果错误信息里的地址是 https://taotoken.net/api/... 后面还有路径说明 base_url 被拼接错了。Codex 的 base_url 只写到 https://taotoken.net/api末尾不要加 /v1也不要带任何 UTM 参数。浏览器里打开官网用的地址和配置文件里填的接口地址是两个不同用途的地址不要在配置文件里混用。6.4 Claude Desktop MCP 连接失败这一般和模型通道无关而是本地 Server 没起来。确认 mvn spring-boot:run 还在前台运行终端里没有报错用 5.3 的 curl 确认 /message 有响应再检查 claude_desktop_config.json 里的端口和启动日志里的端口是否一致。Claude Desktop 改完配置后需要重启才会重新加载 MCP Server 列表。7. 收尾跑通后去控制台对一次用量7.1 这次跑通留下了什么一个能跑起来的 MCP ServerSpring Boot 项目里有 pom.xml、application.yml、WeatherToolsClaude Desktop 里多了一个 weather-server 配置开发环境里多了一份 Codex 的模型通道配置。以后再开新项目Codex 不需要重新换 Key、改环境变量模型通道保持稳定开发 McpTool 时可以专心处理注解和协议本身。7.2 下一步可以从这几步开始如果只想快速确认 Key 和模型 ID 都没问题先在 TaoToken 模型对话 里发一条测试消息。要长期在 Codex 或 Claude Code 里写代码可以看 Coding Plan 的套餐是否够用。需要重建 Key 或检查当前 Key 状态去 控制台 API Keys。如果接下来要把 Claude Code 也接到 TaoToken环境变量对照表在 接入文档。
返回列表