1. Linux 服务器上 Codex MCP 连接超时到底卡在哪
如果你在 Linux 服务器上跑 Codex CLI,大概率见过这条报错:MCP client for codex_apps timed out after 30 seconds,后面还跟着一句提示,让你去 config.toml 里加startup_timeout_sec。这个问题的本质不是网络断了,而是 MCP 服务端进程在默认 30 秒内没完成握手,客户端就判定启动失败,直接把codex_apps标记为不可用。
MCP 是 Model Context Protocol 的缩写,你可以把它理解成 Codex 和外部工具之间的“插线板协议”。Codex 启动时会拉起配置里声明的每个 MCP server,每个 server 都要在限定时间内完成初始化并回报能力列表。服务器环境里常见的坑有三个:一是进程启动本身慢(Node 冷启动、依赖加载、磁盘 IO 抖动),二是环境变量里的代理设置让本地回环请求绕了远路,三是 config.toml 里根本没写startup_timeout_sec,吃的是默认值。
这篇面向的是在 Linux 服务器上用 Codex CLI、并且已经配了 MCP server 的开发者。我会给出可直接复制的 config.toml 骨架、startup_timeout_sec的调优步骤、连接验证命令,以及一套排查顺序。实测下来,大部分超时问题靠“清代理 + 调超时 + 验证回环”三步就能定位。
2. 动手前先把 TaoToken 的接入信息准备好
调 MCP 之前,Codex 本身得能正常访问模型服务。我这边习惯用 TaoToken 做统一入口,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,API 地址是 https://taotoken.net/api 。它的作用是给你一个兼容常见协议的服务端点,Codex CLI 里配置 base_url 和 key 就能用,不用在服务器上折腾多套凭证。
你需要准备两样东西:一个可用的 API Key,以及确认服务器能连通 API 端点。Key 在控制台的 API Keys 页面生成,地址是 https://taotoken.net/console/api-keys 。生成后先别急着写进 config.toml,用 curl 验一下连通性,避免把网络问题和 MCP 超时混在一起排查。
# 先确认基础连通性,这一步不通后面都白搭 curl -sS -o /dev/null -w "%{http_code}\n" \ --max-time 10 \ https://taotoken.net/api返回 200 或 401 都说明网络层通了(401 只是没带 key)。如果这里就超时,先解决服务器出网问题,再回头看 MCP。想快速验证模型是否可用,可以直接在模型对话页试一条请求:https://taotoken.net/model-chat ,比在服务器上反复改配置快得多。
3. config.toml 配置骨架与 startup_timeout_sec 调优
Codex 的 MCP 配置通常放在~/.codex/config.toml或项目级目录下。下面是一份可复制的骨架,重点看[mcp_servers.xxx]段里的startup_timeout_sec:
# ~/.codex/config.toml # 模型服务接入(以 TaoToken 为例) model_provider = "taotoken" model = "gpt-4o" [model_providers.taotoken] base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" # MCP server 定义 [mcp_servers.codex_apps] command = "npx" args = ["-y", "@your-org/codex-apps-mcp"] startup_timeout_sec = 60 tool_timeout_sec = 120 [mcp_servers.filesystem] command = "npx" args = ["-y", "@modelcontextprotocol/server-filesystem", "/data/workspace"] startup_timeout_sec = 45startup_timeout_sec控制的是“从拉起进程到完成初始化握手”的秒数,默认 30。服务器上 Node 冷启动 + npx 拉包经常超过 30 秒,所以第一刀先加到 60。tool_timeout_sec是单次工具调用的超时,和启动超时是两码事,别混。调优顺序建议这样:
先只改startup_timeout_sec,从 30 提到 60,重启 Codex 观察是否还报超时。如果还报,说明不是单纯慢,而是进程根本没起来或卡在网络上,这时候加再大也没用,得去查代理和依赖。如果 60 能过但偶尔抖,可以提到 90,但不建议无脑上 300,那只会把真正的启动失败拖成“假死”。
环境变量里的代理是另一个高频元凶。服务器上如果残留了http_proxy之类指向一个不可达的本地端口,MCP 进程访问 127.0.0.1 的回环请求也会被塞进代理,直接卡死到超时。清理方式:
unset http_proxy https_proxy all_proxy no_proxy unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY如果你确实需要代理才能出网,那就把回环地址排除掉,别让本地请求走代理:
export no_proxy=127.0.0.1,localhost export NO_PROXY=127.0.0.1,localhost注意这种 export 只对当前 shell 生效,换个终端就没了。要持久化就写进~/.bashrc或 systemd 的Environment=里,但写之前先确认代理地址是真实可用的,否则等于给自己埋雷。
4. 验证 MCP 是否真的起来了
改完配置别急着开 Codex 干活,先单独验证 MCP server 能不能手动跑起来。这一步能把“配置问题”和“进程问题”分开:
# 手动执行 MCP server 命令,看它是否能正常启动并输出 npx -y @your-org/codex-apps-mcp --help # 带超时跑,模拟 Codex 的启动窗口 timeout 60 npx -y @your-org/codex-apps-mcp如果手动跑 60 秒内能出初始化日志,说明进程没问题,超时是 Codex 侧配置或环境差异导致的。如果手动跑也卡住,那就是依赖或网络问题,跟startup_timeout_sec无关。
接着验证 Codex 侧的 MCP 状态。Codex CLI 一般有列出 MCP server 的命令,跑一下看codex_apps是否显示为 ready:
codex mcp list # 或 codex --list-mcp-servers成功时你会看到类似codex_apps: ready的输出,而不是failed或timed out。如果还是失败,把 Codex 的日志级别调高再看:
RUST_LOG=debug codex 2>&1 | grep -i mcp日志里会明确写出是“spawn failed”还是“handshake timeout”。前者查 command 路径和权限,后者才轮到startup_timeout_sec。这一步能省掉大量瞎调参数的时间。
5. 本篇常见错误排查清单
报错一:MCP client for codex_apps timed out after 30 seconds说明startup_timeout_sec没生效或没写。先确认你改的是 Codex 实际读取的那个 config.toml,项目级配置会覆盖全局配置。用codex config path之类的命令确认路径,别改错文件。
报错二:改了超时还是超时大概率是代理残留。按第 3 节的 unset 清一遍,再确认no_proxy包含 127.0.0.1。服务器上 systemd 启动的进程不会继承你 shell 里的 export,得在 unit 文件里单独配。
报错三:command not found: npxCodex 拉起的子进程 PATH 可能和你登录 shell 不一样。把 command 写成绝对路径,比如/usr/local/bin/npx,或者用which npx查出来填进去。
报错四:手动能跑,Codex 里就超时检查 Codex 运行用户和手动执行用户是否一致,权限和 HOME 目录不同会导致 npx 缓存路径不可写,冷启动变慢。必要时给 MCP 进程单独设env段指定 HOME。
报错五:间歇性超时服务器负载高时 Node 启动会抖。把startup_timeout_sec提到 90,同时看下dmesg有没有 OOM 记录。内存不足时进程被 kill,表现也是超时。
6. 后续接入与长期使用建议
MCP 调通之后,日常接入就顺了。API Key 的管理和轮换在控制台完成:https://taotoken.net/console/api-keys ,建议给服务器单独建一个 key,方便出问题时快速吊销。接入细节和参数说明看文档:https://taotoken.net/doc ,里面有针对不同客户端的配置示例。
如果你只是偶尔验证模型连通性,用模型对话页最快:https://taotoken.net/model-chat 。但如果你要在服务器上长期跑编码任务、挂 Agent 或者做批量代码处理,建议直接上 Coding Plan,省得每次手动配超时和凭证:https://taotoken.net/coding-plan 。Claude Code 相关的接入配置也有单独说明:https://taotoken.net/claude-code 。
最后留一个我踩过的坑:startup_timeout_sec调大之后,Codex 启动会明显变慢,因为它在等每个 MCP server 握手。如果你配了五六个 server,每个都 60 秒,最坏情况启动要等好几分钟。所以超时值要按 server 实际启动速度给,别一刀切全设 120。先手动timeout测出每个 server 的真实启动耗时,再往上加 20 到 30 秒余量,这样既不会误杀,也不会拖慢启动。