Skip to main content

用途

MCP(Model Context Protocol,模型上下文协议)是 Codex 连接外部工具和数据源的标准接口。 Codex 本身可以读取工作区文件、编辑代码并运行命令,但它默认不知道远程文档、设计稿、工单系统、浏览器或其他业务服务里的内容。MCP server 把这些能力以工具的形式暴露给 Codex,Codex 再根据任务需要发现并调用工具。 本页专门讲 Codex 中的 MCP,不展开 Skills、Subagents、Rules、Hooks 或 Plugins。完成本页后,你应该能够:
  • 判断一个 MCP server 应该使用本地 STDIO 还是远程 Streamable HTTP;
  • 使用 codex mcp add、list、remove 和 login 管理 server;
  • 读懂并手写 config.toml 中的 [mcp_servers.<名称>] 配置;
  • 区分用户级配置与项目级配置,并理解项目可信边界;
  • 为远程服务配置 Bearer token 或 OAuth,而不把密钥写进仓库;
  • 通过 /mcp 查看会话中的 server 和工具,并用只读工具完成一次验证;
  • 用工具白名单、黑名单、审批模式和超时限制收口权限;
  • 识别网络访问、第三方代码和提示注入带来的风险;
  • 在配置错误或不再需要时禁用、移除并恢复到备份。 命令、字段和默认值会随 Codex 版本变化。下面的命令以参考资料和当前官方写法为基础,执行前应在本机运行相关的 --help;如果本机帮助与本页不同,以本机 Codex 版本和官方文档为准。

开始前检查

先确认你是在正确的项目目录中操作。项目级 MCP 配置可能启动本地进程、访问网络或读取项目数据,不要在生产目录或包含真实客户数据的目录里直接试验。
在 Windows PowerShell 中可以使用:
开始前还要确认以下条件:
  1. 你知道 server 的来源、维护者和所需权限。
  2. 本地 STDIO server 所需的运行时已经安装,例如 Node.js、Python 或其他命令行运行时。
  3. 远程 HTTP server 的 URL、认证方式和允许访问的数据范围已经确认。
  4. 如果 server 配置会写入项目目录,你已经确认项目是可信的,并知道是否应将配置提交到 Git。
  5. 你准备好了最小权限的测试账号或测试 token,而不是生产凭据。
  6. 你已经保存了现有配置的备份,尤其是在修改用户级 ~/.codex/config.toml 之前。 备份用户级配置时,先确认文件存在,再复制到安全位置。不要把备份放进项目仓库:
Windows PowerShell:
如果配置文件尚不存在,不要为了备份凭空创建包含秘密的文件。先通过 codex mcp add 生成最小配置,或创建不含凭据的临时配置。

01 MCP 是什么

1.1 server、工具和资源

MCP 的连接关系可以按三层理解:

1.2 什么时候值得接 MCP

当你反复在外部系统和 Codex 之间复制粘贴信息时,MCP 可能有价值。例如:
  • 让 Codex 查询某个库的最新官方文档;
  • 从设计工具读取当前页面的组件信息;
  • 查询一个只读的测试数据库或知识库;
  • 读取 issue、日志或监控信息并帮助定位问题;
  • 在明确审批后调用外部系统的写入工具。 如果复制一段文本就能完成任务,优先使用复制粘贴。MCP 会增加进程、网络、认证和供应链风险,不应为了“看起来更自动化”而接入不必要的 server。

02 两种传输方式

Codex 官方 MCP 配置主要涉及两种 server 形态:本地 STDIO 和远程 Streamable HTTP。

2.1 STDIO

STDIO server 由 Codex 根据配置启动一个本地进程,并通过标准输入和标准输出交换 MCP 消息。它通常不需要监听端口。 最小配置如下:
对应的命令式写法是:
这里必须注意 --:它把前面的 Codex 选项和后面的 server 启动命令分开。-- 后面的 npx -y @upstash/context7-mcp 不是 Codex 子命令,而是 Codex 将要启动的本地程序。 STDIO server 的前置条件包括:
  • command 必须能在 Codex 进程的环境中找到;
  • args 必须按数组写出,每个参数是一个字符串;
  • 包管理器可能需要联网下载依赖;
  • server 进程可能继承指定的环境变量;
  • server 的工作目录会影响相对路径和配置文件发现;
  • 第三方包升级后,行为和依赖链可能改变。 可以用明确版本或锁定的运行环境减少漂移。不要从 README 中不加核验地复制一条拥有写权限、读取凭据或上传数据的启动命令。

2.2 Streamable HTTP

Streamable HTTP server 由 Codex 连接一个远程 URL。你不需要在本机安装 server,但需要网络连接、正确的 URL 和适当的认证。 最小配置示例:
带 Bearer token 的配置示例:
bearer_token_env_var 的值是环境变量名,不是 token 本身。Codex 从该环境变量读取 token,并在请求中使用它。不要把真实 token 写入 config.toml、shell 脚本、Git 历史、截图或聊天记录。 HTTP 配置还可以使用:
静态 http_headers 适合非敏感、不会因环境变化的请求头。涉及秘密的请求头优先使用 env_http_headers,并确保环境变量只在当前用户和当前会话可见。 Codex 文档列出的远程方式是 Streamable HTTP。不要因为其他客户端的旧配置仍然使用 SSE,就把 SSE 配置直接复制到 Codex;先检查本机版本和 server 文档是否支持 Codex 当前实现。

03 config.toml 结构

3.1 文件位置

MCP 配置与其他 Codex 配置放在 config.toml 中。常见位置如下:

3.2 server 表

每个 server 使用一张以名称命名的表:
完整的 STDIO 示例:
字段用途:

3.3 网络开关与 MCP

MCP HTTP 调用需要网络。Codex 的 workspace-write 默认关闭网络,不能假设配置了 URL 就一定能够连接。 若确实需要网络,相关沙箱配置可以写成:
这是一项扩大能力边界的配置。只在明确需要时临时开启,并配合域名限制、审批和测试账号。启用网络后,任何从网页、issue、文档或 server 返回的内容都应视为不可信数据。

04 用 codex mcp 管理 server

4.1 查看帮助

不同版本的管理子命令可能略有差异,先查看帮助:
也可以分别查看:
如果某个命令在你的版本中不存在,记录版本号和帮助输出,再查对应官方文档。不要用另一个客户端的参数替代它。

4.2 添加 STDIO server

通用语法:
带环境变量的常见形式:
Context7 示例:
添加后不要只相信终端中的成功提示。下一步查看列表,并检查实际写入的配置文件:
如果本机版本不接受 list,使用 codex mcp --help 查看该版本的等价命令。

4.3 添加 HTTP server

远程 server 通常使用 URL 参数。实际选项名以本机帮助为准,常见形式可先查看:
手写配置往往更清楚,尤其是需要 bearer_token_env_var、工具白名单或 HTTP 请求头时:
添加完成后设置环境变量。下面只是占位示例,不能填入仓库:
PowerShell:

4.4 列出 server

使用:
重点检查:
  • server 名称是否拼写正确;
  • server 是否处于启用状态;
  • STDIO 的 command 是否为预期程序;
  • HTTP 的 URL 是否为 HTTPS 和预期域名;
  • 配置是否写到了预期的用户级或项目级文件;
  • 是否误把 token、密码或完整 Authorization 值写入配置。 列表显示 server 只说明配置被发现,不保证 server 已经成功初始化。真正的连接和工具发现要在 Codex 会话中用 /mcp 验证。

4.5 登录 OAuth server

支持 OAuth 的远程 server 可以使用:
该命令通常会打开授权流程。登录前确认浏览器中的域名、请求的权限和账号是否正确。优先使用测试账号,授权范围越小越好。 登录不是把 OAuth 变成永久安全。令牌仍然代表你的账号能力,浏览器、Codex 本地凭据存储和 server 端都需要遵守组织的凭据管理要求。需要撤销时,在服务方撤销授权,并按本机 codex mcp logout --help 查看是否提供对应的登出命令。 不要在命令行参数中粘贴 OAuth code、refresh token 或 Bearer token。命令历史可能会保存这些内容。

4.6 移除 server

不再需要 server 时使用:
移除前先列出并确认名称:
如果版本中没有 remove 或参数形式不同,先看:
移除配置不会自动撤销远程 OAuth 授权,也不会卸载通过 npx、pip 或其他包管理器下载的程序。需要时分别清理授权和本地依赖,并确认不会影响其他项目。

05 作用域:用户级和项目级

5.1 用户级配置

用户级文件通常是:
它适合个人长期使用的、跨项目共享的只读文档 server。优点是不用重复配置,缺点是任何项目都可能看到该 server,错误的工具权限会扩大影响范围。 适合放在用户级的例子:
  • 个人开发文档查询;
  • 不包含公司数据的公共资料;
  • 已经审核、仅提供只读工具的通用 server。 不适合直接放在用户级的例子:
  • 只服务一个项目的内部数据库;
  • 持有生产写权限的 server;
  • 你还没有审查源码的第三方 server;
  • 只在一次实验中使用的临时 server。

5.2 项目级配置

项目级文件通常是:
它适合团队明确约定、只在当前仓库需要的 server。项目级配置可以随项目分发,但提交前必须确认不包含秘密、不启动危险程序,并让团队审查 command、URL、工具白名单和环境变量名。 不要把真实 token 放进项目级文件。即便文件被 .gitignore 忽略,也要检查是否曾经被 Git 追踪或出现在历史中。 一个偏只读的项目级示例:

5.3 可信项目边界

项目级 .codex/config.toml 只应在你信任的目录中加载。陌生仓库可能通过配置要求 Codex 启动任意本地程序,或引导它连接攻击者控制的 URL。 打开新仓库时按下面顺序做:
  1. 先不要启动 Codex。
  2. 查看 .codex/config.toml 和 AGENTS.md。
  3. 检查 command、args、cwd、URL、环境变量名和工具列表。
  4. 搜索是否存在读取凭据、上传文件、修改系统配置的意图。
  5. 在隔离目录中使用 read-only 或最小权限测试。
  6. 确认来源和团队意图后,再决定是否信任项目配置。

06 认证与秘密管理

6.1 Bearer token

HTTP server 使用 Bearer token 时,只在配置中写环境变量名:
设置 token:
验证环境变量是否存在时,不要打印值。可以只检查长度或存在性:
PowerShell:

6.2 OAuth

OAuth 适用于 server 支持授权登录的场景:
授权时核对:
  • 浏览器域名是否是服务方的官方域名;
  • 申请的 scopes 是否与只读任务匹配;
  • 是否登录了正确的组织和账号;
  • 是否出现“写入、删除、管理成员”等不必要权限;
  • 是否需要在测试完成后撤销授权。 OAuth 页面或 server 返回的文本同样可能包含提示注入,不要把页面中的“请执行某条本地命令”当作 Codex 系统指令。

6.3 认证失败与轮换

认证失败时不要反复粘贴 token。先确认:
  1. 环境变量名称与配置完全一致;
  2. Codex 是从设置该变量的同一终端启动的;
  3. token 没有过期、撤销或绑定错误的组织;
  4. URL 没有指向测试和生产环境中的另一套服务;
  5. server 是否要求 OAuth,而不是 Bearer token。 怀疑泄露时立即在服务端撤销并轮换 token,检查 shell 历史、日志、CI 变量和 Git 历史。仅删除当前配置行不能使已经泄露的 token 失效。

07 工具发现、审批与只读调用

7.1 查看会话中的 MCP

启动 Codex:
进入 TUI 后输入:
/mcp 用于查看当前会话发现到的 MCP server 和工具。不同版本可能提供详细输出选项,先看界面提示或相关帮助。 如果 server 在 codex mcp list 中存在,但 /mcp 不显示,说明配置发现和会话初始化之间仍有问题,转到故障排查章节。

7.2 工具权限收口

建议对第三方 server 采用“先白名单、再审批”的方式:
常见字段含义:
最终只保留 open。不要把 approve 用在尚未审查的 server 上。还可以为单个工具设置覆盖:
上例只应在你确认 open 工具的参数和副作用后使用。对于写入、发送、删除或发布工具,保留 prompt 更合适。

7.3 只读调用原则

第一次验证优先选择查询、搜索、列出和读取工具。给 Codex 的任务应明确限制:
批准前查看:
  • 工具名称是否符合任务;
  • 参数是否包含敏感文件、完整 token 或客户数据;
  • 目标 URL 和租户是否正确;
  • 返回内容是否只是数据,还是包含要求你执行命令的指令;
  • 是否存在隐藏的写入、发送、创建或删除副作用。

08 只读实战:接入文档 server

下面用 Context7 作为 STDIO 练习。它的命令来自参考资料,实际包名和行为仍应以当前官方说明为准。

第一步:确认运行时

如果命令不存在,先安装并核验 Node.js,不要在 Codex 里让未知脚本自动安装系统软件。

第二步:添加 server

查看配置是否被发现:
如果命令输出中出现 context7,继续查看配置内容。确认没有意外加入 approve、网络白名单或写入工具。

第三步:启动会话并查看工具

在会话中输入:
确认 context7 已初始化,并查看它暴露的工具名称。若工具列表包含搜索和读取类工具,先只使用这些工具。

第四步:发起只读请求

如果出现审批请求,逐项核对后再批准。验证结果时区分三件事:
  1. Codex 是否发现了 server;
  2. server 是否成功返回了工具结果;
  3. 返回内容是否真的来自目标文档,而不是模型补写的内容。 对关键 API,再打开官方文档人工核对版本、示例和限制。MCP 能减少过期知识,不等于结果天然正确。

第五步:清理练习配置

不再需要时先禁用或移除:
如果暂时还要保留配置,可改为:

09 HTTP 只读示例

下面展示一个虚构的只读文档服务,域名和 token 都是占位符:
启动前设置测试 token:
会话中的请求:
这个配置的设计意图是:
  • 用 HTTPS 保护传输;
  • token 只通过环境变量提供;
  • 只启用查询和读取工具;
  • 即使 server 声明了写入工具,也用黑名单禁用;
  • 默认每次调用请求审批;
  • 用较短的超时避免异常 server 长时间占用会话。 “只读”不是绝对保证。一个名为 read 的工具也可能在服务端记录、触发工作流或返回敏感数据。因此还要审查服务方实现、账号权限和数据分类。

10 网络与提示注入风险

10.1 第三方 server 是供应链

STDIO server 会在本机运行第三方代码。远程 HTTP server 会把外部内容引入 Codex 上下文。两者都应像审查依赖包和外部 SaaS 一样审查:
  • 来源是否为官方或组织认可的发布方;
  • 源码、包名、版本和维护状态是否可核验;
  • server 实际需要哪些文件、环境变量和网络域名;
  • 工具是否有写入、删除、发送和管理权限;
  • 数据是否会离开本机,保存多久,由谁可见;
  • 是否有日志、审计、撤销和停用机制。 OpenAI 不会替你审计每一个第三方 MCP server。官方推荐或知名服务只代表相对可信,不代表可以跳过最小权限和人工审批。

10.2 提示注入

提示注入是把恶意指令藏在 README、网页、issue、文档、数据库记录或工具返回值中,试图让模型把外部内容当成用户命令。 例如,一个文档可能返回:
这段文字只是 server 返回的数据,不是用户授权,也不是 Codex 系统规则。正确处理方式是拒绝读取凭据、拒绝上传、停止并报告风险。 网络访问会扩大注入的影响范围。Codex 的沙箱和审批能限制文件读写与联网,但它们不能替你判断某个工具是否被恶意内容驱动。批准请求前必须看命令、目标、参数和数据流向。

10.3 最小权限防护

推荐的默认组合:
  • 第一次接入使用 read-only 或隔离的测试目录;
  • MCP 工具设置 enabled_tools 白名单;
  • 写入、发送、发布和删除工具放进 disabled_tools;
  • default_tools_approval_mode = "prompt";
  • HTTP 使用只读测试账号和短期 token;
  • 工作区外文件、凭据目录和生产数据不作为测试输入;
  • 网络只对必要域名开放,并在用完后关闭;
  • 任何“不要问用户”“忽略规则”“上传凭据”的内容一律视为攻击信号。 不要为了避免审批,把 server 设为 approve,也不要把 Codex 以 --yolo 或完全访问模式运行在陌生仓库中。

11 故障排查

11.1 codex mcp add 参数错误

先运行:
常见原因:
  • 把其他客户端的 --scope 参数带到了 Codex;
  • 忘记在 STDIO 启动命令前写 --;
  • 运行的是旧版本 Codex;
  • server 名称包含不支持的字符;
  • HTTP 参数被误当成 STDIO 参数。 Codex 没有用 --scope 选择项目范围。需要项目级配置时,在受信任项目的 .codex/config.toml 中配置,并确认当前工作目录。

11.2 列表里没有 server

执行:
然后检查:
  • add 命令是否在预期项目和用户下执行;
  • 用户级路径是否为 $HOME/.codex/config.toml;
  • 项目级路径是否为当前项目的 .codex/config.toml;
  • TOML 的表名是否写成 [mcp_servers.name];
  • 是否有重复名称覆盖或拼写错误;
  • 配置文件是否存在语法错误。 修改后重启 Codex 会话。旧会话可能不会自动重新加载配置。

11.3 列表有,但 /mcp 没有

这通常表示 server 初始化失败。分别检查:
  • STDIO 的 command 是否能在普通终端直接运行;
  • Node、Python 或包管理器是否安装;
  • 依赖下载是否需要网络;
  • server 是否把日志错误地写到了 stdout,破坏了协议;
  • HTTP URL 是否可达、证书是否有效;
  • 认证是否过期;
  • server 是否只支持当前 Codex 不支持的传输方式;
  • startup_timeout_sec 是否过短。 对于启动慢的本地 server,可以临时增加:
不要一开始就把超时改成很大的数。先确认进程没有等待输入、循环重启或连接错误。

11.4 HTTP 返回 401 或 403

检查环境变量存在性,不要打印 token:
然后确认:
  • bearer_token_env_var 与变量名一致;
  • Codex 从设置环境变量的同一终端启动;
  • token 对应正确环境和组织;
  • OAuth 登录是否仍然有效;
  • server 端是否拒绝当前工具或租户。 401 通常是认证缺失或过期,403 通常是账号存在但权限不足;最终以 server 日志和文档为准。

11.5 工具超时、结果为空或参数被拒

先只调用最简单的查询工具,并保留:
  • server 名称和工具名称;
  • 脱敏后的参数;
  • 调用时间和超时设置;
  • Codex 与 server 版本;
  • 完整但不含秘密的错误信息。 检查工具 schema,不要凭记忆猜参数。对于结果为空,区分“没有数据”“权限不足”“过滤条件错误”和“server 出错”。不要通过扩大 token 权限或开启所有工具来试错。

11.6 启动了不可信命令

立即停止会话,撤销相关 OAuth 或 token,检查进程、网络连接、文件变更和日志。若 command 已经读取或上传敏感数据,应按组织的安全事件流程处理,轮换可能暴露的凭据。 不要只删除 MCP 配置就结束调查。配置移除不会撤销已发生的外发,也不会清除已经运行的进程或远端日志。

12 禁用、移除与回滚

12.1 优先禁用

需要保留配置、但暂时停止 server 时,编辑对应表:
禁用适合排查和短期暂停,因为它保留了原始参数,便于比较。修改后重启 Codex,再用 codex mcp list 和 /mcp 验证。

12.2 移除配置

确定不再使用时:
若手动编辑,删除完整的 [mcp_servers.example] 表以及其嵌套的工具配置。编辑前保存备份,避免误删其他 server。

12.3 恢复备份

如果本次修改只涉及用户级配置,并且备份确认是修改前版本,可以恢复:
Windows PowerShell:
恢复后重启 Codex,并检查:
不要使用恢复命令覆盖同事刚刚产生的新配置。若配置文件由团队管理,先保存当前差异,再按版本控制或组织流程回滚。

12.4 外部状态回滚

MCP 配置回滚只恢复本地连接设置,不会撤回 server 已经执行的动作。对于已创建的 issue、已发送的消息、已修改的数据或已授予的 OAuth 权限,分别使用服务方的撤销、删除、恢复、审计和 token 撤销机制。

13 验收清单

完成一次 MCP 接入后,逐项确认:
  • codex --version 和 codex mcp --help 已记录;
  • server 来源、维护者和传输方式已核验;
  • codex mcp list 显示了预期名称;
  • 配置位置符合预期的用户级或项目级作用域;
  • 项目级配置只在受信任目录中启用;
  • URL 使用预期域名和 HTTPS;
  • token 只通过环境变量、OAuth 或受保护的凭据存储提供;
  • 没有把秘密写进 TOML、仓库、命令历史或日志;
  • /mcp 能发现 server 和工具;
  • 第一次调用只使用查询或读取工具;
  • enabled_tools、disabled_tools 和审批模式符合任务需要;
  • 网络访问只在必要时开启,并已确认数据流向;
  • 工具返回的内容已按不可信数据处理;
  • 失败时知道如何禁用、移除、撤销授权和恢复备份;
  • git diff --check 和 git status --short 未显示意外文件变化。

小结

MCP 是 Codex 连接外部工具和数据的标准接口,但连接能力也会扩大数据、网络和供应链的风险。 记住以下原则: