把 AsyncOpenAI 的 base_url 改到 TaoToken 通道后,让 Codex 跑通 MCP stdio

发布时间:2026/9/19 21:24:53
把 AsyncOpenAI 的 base_url 改到 TaoToken 通道后,让 Codex 跑通 MCP stdio 把 AsyncOpenAI 的 base_url 改到 TaoToken 通道后让 Codex 跑通 MCP stdio在 MCP Python SDK 里写 FastMCP 服务端和 stdio 客户端时最容易卡住的不是mcp.tool()的注册逻辑而是客户端里AsyncOpenAI的base_url到底填什么。很多人把server.py跑起来了stdio_client也连上了list_tools()能打印出add_2_numbers但一到chat.completions.create就报连接错误或 404。这篇就从「接入配置」视角把AsyncOpenAI的base_url改到 TaoToken 通道https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 让 Codex 按原文的 stdio 步骤真正跑通工具调用。一、原问题与场景stdio 通了模型通道没通原文用 MCP Python SDK 写了一个 FastMCP 服务端暴露add_2_numbers、multiply_2_numbers这类mcp.tool()客户端用stdio_client拉起server.py再用AsyncOpenAI把工具列表交给大模型识别。问题出在客户端__init__里这一行self.client AsyncOpenAI(api_keyapi_key, base_urlbase_url)api_key、base_url、model三个参数是从config.json读进来的。如果base_url还是默认的 OpenAI 地址或者填成了带/v1的地址AsyncOpenAI在发chat.completions.create时就会走到错误的端点。表现是stdio 握手成功、工具列表打印正常但模型请求直接抛异常process_query里的while assistant_message.tool_calls永远进不去add_2_numbers也就永远不会被调用。所以这条的核心不是改 MCP 协议代码而是把客户端的模型通道指向 TaoToken让AsyncOpenAI的请求能正常返回tool_calls。二、TaoToken 前置先拿 Key再定 base_url在改config.json之前先去 TaoToken 官网创建一个 Key官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end创建 Key 的页面在控制台的 API Keys 里登录后直接新建即可拿到形如YOUR_API_KEY的字符串后面填进config.json的llm.api_key这里要强调一个容易踩的点TaoToken 的 API 地址是https://taotoken.net/api不要带/v1。AsyncOpenAI内部会自己拼接路径如果你写成https://taotoken.net/api/v1最终请求会变成/api/v1/chat/completions这种重复路径直接 404。原文客户端里base_url是透传给AsyncOpenAI的所以这个值必须干净。如果你还没创建 Key可以先看接入文档确认当前支持的模型 ID再决定config.json里model填哪个。模型对话页面可以用来先验证通道是否通再回到 MCP 客户端里跑工具调用。三、可复制配置config.json 与客户端改动原文客户端main()里是这样读配置的with open(config.json, r) as f: config json.load(f) client Stdio_MCPClient( config[llm][api_key], config[llm][base_url], config[llm][model] )所以只需要改config.json不用动Stdio_MCPClient的构造逻辑。把文件改成{ llm: { api_key: YOUR_API_KEY, base_url: https://taotoken.net/api, model: MODEL_ID } }三个字段对应关系api_keyTaoToken 控制台创建的 Key填YOUR_API_KEY的位置base_url固定https://taotoken.net/api结尾不要加/v1也不要加斜杠model填 TaoToken 接入文档里列出的模型 ID不要照抄 OpenAI 的gpt-4-turbo之类客户端代码本身不需要改AsyncOpenAI那一行因为它已经把base_url透传进去了。唯一要确认的是connect_to_stdio_server里commandpython、args[server.py]的路径对server.py里mcp.run(transportstdio)没有被改成 sse。如果你用的是 Codex 这类 CLI 工具去拉起这个客户端注意 Codex 自己的config.toml和这里的config.json是两套配置不要混。MCP 客户端的模型通道由config.json决定Codex 只负责按 stdio 启动server.py。四、验证请求与成功结果改完config.json后按原文步骤跑python client.py预期看到的第一段输出是 stdio 连接成功成功链接到testserver服务对应的tools [add_2_numbers, multiply_2_numbers]这说明stdio_client已经拉起server.pylist_tools()也拿到了mcp.tool()注册的函数。接着在Query:提示符下输入Query: 帮我算一下 3 加 5 等于多少如果模型通道配置正确会看到calling tools add_2_numbers, with args {a: 3, b: 5} Result: 8 AI: 3 加 5 等于 8这里的calling tools add_2_numbers就是process_query里session.call_tool(tool_name, tool_args)被触发的证据。也就是说AsyncOpenAI返回了tool_calls客户端把add_2_numbers的参数解析出来通过 stdio 发给服务端执行再把result.content[0].text塞回messages做第二轮chat.completions.create。如果只想先验证模型通道不想跑完整 MCP 流程可以单独写一个最小脚本import asyncio from openai import AsyncOpenAI async def main(): client AsyncOpenAI( api_keyYOUR_API_KEY, base_urlhttps://taotoken.net/api ) resp await client.chat.completions.create( modelMODEL_ID, messages[{role: user, content: hi}] ) print(resp.choices[0].message.content) asyncio.run(main())这个能通再回去跑 MCP 客户端就能把问题范围缩小到 MCP 层而不是通道层。五、本篇常见错排查错误 1base_url 带了/v1现象是chat.completions.create报 404 或Not Found。检查config.json里base_url是不是写成了https://taotoken.net/api/v1。改成https://taotoken.net/api即可。错误 2api_key 没换还是占位符现象是 401 或invalid api key。确认config.json里llm.api_key是 TaoToken 控制台创建的真实 Key不是YOUR_API_KEY字面量。错误 3model 填了 OpenAI 的模型名现象是模型不存在或 400。TaoToken 通道的model要用接入文档里列出的 ID不要直接抄原文示例里的gpt-4-turbo。错误 4stdio 连上了但 tool_calls 为空如果list_tools()打印正常但模型回复里没有tool_calls先确认available_tools的构造是否正确self.available_tools [ { type: function, function: { name: tool.name, description: tool.description, parameters: tool.inputSchema } } for tool in response.tools ]这段是把 MCP 的inputSchema映射成 OpenAI function calling 的parameters。如果tool.description为空模型可能不触发调用给mcp.tool()函数补上 docstring。错误 5server.py 路径不对stdio_client的args[server.py]是相对当前工作目录的。如果从别的目录启动client.py会报找不到server.py。用绝对路径或先cd到文件所在目录。错误 6Codex 拉起时环境变量没传如果通过 Codex 的config.toml配置 MCP server注意env字段要显式传api_key等变量否则客户端读不到。原文connect_to_stdio_server的env{}是空字典需要按需补。六、语义一致 CTA这条的改动点只有一个把AsyncOpenAI的base_url指向 TaoToken 通道让 MCP stdio 客户端的模型请求能正常返回tool_calls。如果你在配置config.json或创建 Key 时卡住可以直接去 API Keys 页面和接入文档对照字段想先确认模型通道是否通用模型对话页面发一条最小请求即可如果是要长期跑 Codex MCP 这类编码 Agent 场景Coding Plan 更适合持续调用。把base_url改对之后原文的stdio_client、ClientSession、call_tool这套流程就能完整跑通add_2_numbers这类mcp.tool()也会真正被大模型识别并调用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询