Codex 调 Context7 MCP Server 之前,~/.codex/config.toml 里其实躺着两段完全不同的配置:一段管模型请求走哪条通道,一段管外部工具怎么启动。TaoToken 只管前一段——把模型 Key 和 Base URL 给到 Codex,去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建就行;后一段 [mcp_servers.context7] 的 stdio 启动,仍然按原文第 9.5.1 节的写法来。很多人把这两件事搅在一起,改完 config.toml 一跑,报错也不知道该往哪边查。下面这条路径先把模型通道接稳,再回头接 Context7,顺序别反。
1. 先分清 config.toml 里的模型通道和 MCP 通道
1.1 第 9.5.1 节的 [mcp_servers.context7] 到底在启动什么
原文这一节的核心动作很朴素:Codex 从 ~/.codex/config.toml 读取 MCP 配置,看到 [mcp_servers.context7] 这一段,就用你写的 command 和 args 起一个子进程。典型的 stdio 写法就是 command = "npx"、args = ["-y", "@upstash/context7-mcp"],Codex 通过标准输入输出跟这个子进程说 JSON-RPC,先 tools/list,再按需要 tools/call。
注意这里没有任何一行跟「模型走哪个服务商」有关。Context7 MCP Server 是本地被拉起来的 npm 包,它不认识你的 API Key,也不关心你的 Base URL 是什么。它只干一件事:你把问题递过来,它去把相关文档片段取回来,再顺着 stdio 返回给 Codex。
所以真正会出岔子的环节有两个,而且互相独立:一是 Codex 自己发模型请求时有没有可用凭据;二是这个 npx 子进程能不能起来、工具能不能被列举出来。混着改,等于同时拧两个水龙头,还怪水压不够。
1.2 为什么 tools/list 还没发出去,401 就先回来了
一个很常见的现象:你在 Codex 会话里输入「帮我查一下这个库的用法」,期待它去调 Context7 的工具,结果界面上先弹出来一个模型请求失败。原因不复杂——Codex 的每一次回合都是先走模型推理,模型决定要不要调外部工具,然后才轮到 MCP。
也就是说,模型通道不通,你连「工具被列举出来」这一步都走不到。看起来像是 Context7 没配好,实际上请求压根没到 MCP 那层。把这两种失败分开看,是这篇内容想解决的第一件事。
2. 在 config.toml 里把 Codex 的模型 provider 指到 TaoToken
2.1 先拿到 API Key 和模型 ID
打开 TaoToken 注册账号,进控制台创建一把 API Key,复制出来先放好。本文所有示例里这把 Key 一律写成 YOUR_API_KEY,你替换成自己那把即可。
模型 ID 不要凭记忆写,也不要照抄别人博客里带日期后缀的字符串,以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 上的模型广场当时列表为准。不同账号可见的模型可能不一样,抄错 ID 的报错通常长得像「模型不存在」,跟 Key 失效完全两回事。
2.2 model_provider 与 base_url 的完整写法
Codex 的模型配置走 ~/.codex/config.toml,不是环境变量那一套,更不要把它跟别的工具的 ANTHROPIC_* 变量混在一起。参考下面这段,把 provider 指向 TaoToken:
# ~/.codex/config.toml model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"然后在 shell 里把 Key 交给环境变量,Codex 会按 env_key 指定的名字去读:
export TAOTOKEN_API_KEY=YOUR_API_KEY几个必须说清楚的点:
| 配置项 | 该填什么 | 不该填什么 |
|---|---|---|
| base_url | https://taotoken.net/api | 末尾加 /v1、加 utm 参数 |
| env_key | TAOTOKEN_API_KEY | 直接把明文 Key 写进 toml |
| model | 模型广场当时列表里的 ID | 自己拼的日期后缀 |
| wire_api | 按你的 Codex 版本与模型广场说明选 chat 或 responses | 两边都写、或者留空靠猜 |
2.3 一个容易混的点:Base URL 末尾不要带 /v1
工具里的 Base URL 用的是 https://taotoken.net/api,这一条在本文里反复出现,不是啰嗦。很多客户端默认会在后面自己补路径,你手一抖写成 https://taotoken.net/api/v1,最终拼出来的地址就会多一层,报 404 而不是 401,看起来像服务挂了,其实只是路径重复。
还有一件事要顺手纠正:注册、创建 Key、看用量走的是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 这个落地页;填进 config.toml 的是 https://taotoken.net/api。两者不要互换,更不要把带 utm 的完整地址塞进 base_url,那是给人点的,不是给程序调的。
改完先别急着接 MCP,直接codex起一个会话,随便问一句最普通的文本问题。模型能正常回,说明通道这一半已经通了,后面的问题才好定位。
3. 回到第 9.5.1 节,把 Context7 的 stdio 项加进去
3.1 [mcp_servers.context7] 的 command 和 args 写法
模型通道通了,再往同一个 config.toml 里追加 MCP 段。原文用的是 stdio 方式启动,配置长这样:
# ~/.codex/config.toml(接在上面那段后面) [mcp_servers.context7] command = "npx" args = ["-y", "@upstash/context7-mcp"]保存之后不需要重启什么服务,Codex 在启动或重载时会读这段,届时才会去拉起 npx 子进程。第一次执行会因为要下载 @upstash/context7-mcp 而稍慢,网络环境不顺的时候可能直接失败——这一类和模型通道无关,属于 npm 拉包的问题。
3.2 bearer_token_env_var 和 TaoToken 的 Key 不是一回事
看过其它 MCP 文档的人会问:要不要给 context7 配一个 bearer_token_env_var?答案取决于这个 MCP Server 自己要不要鉴权,以及它走的是 stdio 还是 Streamable HTTP。TaoToken 在这段配置里不出场,它不替 MCP Server 做认证,也不参与 stdio 或 Streamable HTTP 的协议流程。
换句话说,TaoToken 提供的是 Codex 发模型请求时用的 Key 和 Base URL;Context7 这个进程用什么方式被启动、要不要额外令牌,是 Context7 自己的事。把两把 Key 混成一把,是这一节最容易犯的错。
4. codex mcp list --json 与 /mcp 里确认工具真的被发现
4.1 命令行侧:codex mcp list --json 看什么
配置写完之后,先不动模型,用命令行确认 MCP 项被读到了:
codex mcp list --json输出里你关心的有三样:context7 这一项在不在、command 和 args 是不是你写的那组、有没有明显的启动错误。如果这里就已经报错,别去折腾模型通道,先把 MCP 段修好。如果这里正常列出来了,说明配置语法没问题,接下来才轮到会话里实际调用。
4.2 会话侧:/mcp 面板与一次最小只读调用
进 Codex 会话输入 /mcp,能看到的工具列表就是从 Context7 那个子进程 tools/list 拿回来的。列表为空通常有两类原因:子进程根本没起来,或者起来了但握手阶段就断了。前者去看 npx 的报错,后者看是不是有别的输出污染了 stdout——stdio 模式下任何往标准输出打的日志都可能把 JSON-RPC 搅乱。
确认工具在列表里之后,做一次最小的只读调用,比如让它查某个公开库的用法说明。这一步只验证「模型能发起工具调用、MCP 能返回结果」,不要一上来就丢复杂任务。
如果你还要让 Codex 帮忙看数据库相关的东西,记住边界:它只能生成或解释 SQL,诊断语句要由你在本地或 SQL*Plus 里执行,再把结果和报错贴回对话。别指望它直接连上你的库去跑。
5. 模型侧和 MCP 侧的报错怎么分开看
5.1 模型侧:401、404 与模型名不认
模型通道的报错通常出现在你还没看到任何工具调用的时候。401 基本是 Key 的问题:没导出环境变量、导出的是空字符串、或者 Key 被删了。404 多半是 base_url 多写了 /v1 或者少了路径。提示模型不存在,则对照模型广场的当前列表核一遍 ID。这三类都在 config.toml 的前半段解决,和 [mcp_servers.context7] 没有关系。
5.2 MCP 侧:npx 拉不到包、进程起了但工具为空
MCP 侧的报错出现在模型已经能正常回话之后。/mcp 里看不到工具、或者每次调用都提示工具不存在,先去终端手动跑一次npx -y @upstash/context7-mcp,看它本身能不能启动。能启动但 Codex 里看不到,再回头看 command 的路径、工作目录、以及有没有日志写到 stdout。
两边都对但合并起来还是不灵,通常是配置写在了两个不同的 config.toml 里,或者改了文件没有重新进入会话。这类问题不复杂,只是需要一次只动一个变量。
6. 跑通之后去控制台对一下这次调用
配置保存后,先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错。如果要长期挂着 Codex 写代码,打开 Coding Plan 看看套餐够不够用;Key 的管理在 控制台 API Keys 里;回头想核一遍 Codex 侧的字段含义,可以对照 Claude Code 接入文档 里的环境变量部分,思路是相通的。
顺手回 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看一眼用量页,确认刚才那几轮对话有没有记上账。有记录,说明模型通道确实是走这条线出去的,接下来再往 Context7 里加更复杂的 MCP Server,你至少知道该从哪一半开始排查。