用途
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 配置可能启动本地进程、访问网络或读取项目数据,不要在生产目录或包含真实客户数据的目录里直接试验。- 你知道 server 的来源、维护者和所需权限。
- 本地 STDIO server 所需的运行时已经安装,例如 Node.js、Python 或其他命令行运行时。
- 远程 HTTP server 的 URL、认证方式和允许访问的数据范围已经确认。
- 如果 server 配置会写入项目目录,你已经确认项目是可信的,并知道是否应将配置提交到 Git。
- 你准备好了最小权限的测试账号或测试 token,而不是生产凭据。
- 你已经保存了现有配置的备份,尤其是在修改用户级
~/.codex/config.toml之前。 备份用户级配置时,先确认文件存在,再复制到安全位置。不要把备份放进项目仓库:
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_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 使用一张以名称命名的表:3.3 网络开关与 MCP
MCP HTTP 调用需要网络。Codex 的workspace-write 默认关闭网络,不能假设配置了 URL 就一定能够连接。
若确实需要网络,相关沙箱配置可以写成:
04 用 codex mcp 管理 server
4.1 查看帮助
不同版本的管理子命令可能略有差异,先查看帮助:4.2 添加 STDIO server
通用语法:list,使用 codex mcp --help 查看该版本的等价命令。
4.3 添加 HTTP server
远程 server 通常使用 URL 参数。实际选项名以本机帮助为准,常见形式可先查看:bearer_token_env_var、工具白名单或 HTTP 请求头时:
4.4 列出 server
使用:- server 名称是否拼写正确;
- server 是否处于启用状态;
- STDIO 的 command 是否为预期程序;
- HTTP 的 URL 是否为 HTTPS 和预期域名;
- 配置是否写到了预期的用户级或项目级文件;
- 是否误把 token、密码或完整 Authorization 值写入配置。
列表显示 server 只说明配置被发现,不保证 server 已经成功初始化。真正的连接和工具发现要在 Codex 会话中用
/mcp验证。
4.5 登录 OAuth server
支持 OAuth 的远程 server 可以使用:codex mcp logout --help 查看是否提供对应的登出命令。
不要在命令行参数中粘贴 OAuth code、refresh token 或 Bearer token。命令历史可能会保存这些内容。
4.6 移除 server
不再需要 server 时使用:remove 或参数形式不同,先看:
npx、pip 或其他包管理器下载的程序。需要时分别清理授权和本地依赖,并确认不会影响其他项目。
05 作用域:用户级和项目级
5.1 用户级配置
用户级文件通常是:- 个人开发文档查询;
- 不包含公司数据的公共资料;
- 已经审核、仅提供只读工具的通用 server。 不适合直接放在用户级的例子:
- 只服务一个项目的内部数据库;
- 持有生产写权限的 server;
- 你还没有审查源码的第三方 server;
- 只在一次实验中使用的临时 server。
5.2 项目级配置
项目级文件通常是:.gitignore 忽略,也要检查是否曾经被 Git 追踪或出现在历史中。
一个偏只读的项目级示例:
5.3 可信项目边界
项目级.codex/config.toml 只应在你信任的目录中加载。陌生仓库可能通过配置要求 Codex 启动任意本地程序,或引导它连接攻击者控制的 URL。
打开新仓库时按下面顺序做:
- 先不要启动 Codex。
- 查看
.codex/config.toml和AGENTS.md。 - 检查 command、args、cwd、URL、环境变量名和工具列表。
- 搜索是否存在读取凭据、上传文件、修改系统配置的意图。
- 在隔离目录中使用
read-only或最小权限测试。 - 确认来源和团队意图后,再决定是否信任项目配置。
06 认证与秘密管理
6.1 Bearer token
HTTP server 使用 Bearer token 时,只在配置中写环境变量名:6.2 OAuth
OAuth 适用于 server 支持授权登录的场景:- 浏览器域名是否是服务方的官方域名;
- 申请的 scopes 是否与只读任务匹配;
- 是否登录了正确的组织和账号;
- 是否出现“写入、删除、管理成员”等不必要权限;
- 是否需要在测试完成后撤销授权。 OAuth 页面或 server 返回的文本同样可能包含提示注入,不要把页面中的“请执行某条本地命令”当作 Codex 系统指令。
6.3 认证失败与轮换
认证失败时不要反复粘贴 token。先确认:- 环境变量名称与配置完全一致;
- Codex 是从设置该变量的同一终端启动的;
- token 没有过期、撤销或绑定错误的组织;
- URL 没有指向测试和生产环境中的另一套服务;
- server 是否要求 OAuth,而不是 Bearer token。 怀疑泄露时立即在服务端撤销并轮换 token,检查 shell 历史、日志、CI 变量和 Git 历史。仅删除当前配置行不能使已经泄露的 token 失效。
07 工具发现、审批与只读调用
7.1 查看会话中的 MCP
启动 Codex:/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 练习。它的命令来自参考资料,实际包名和行为仍应以当前官方说明为准。第一步:确认运行时
第二步:添加 server
context7,继续查看配置内容。确认没有意外加入 approve、网络白名单或写入工具。
第三步:启动会话并查看工具
context7 已初始化,并查看它暴露的工具名称。若工具列表包含搜索和读取类工具,先只使用这些工具。
第四步:发起只读请求
- Codex 是否发现了 server;
- server 是否成功返回了工具结果;
- 返回内容是否真的来自目标文档,而不是模型补写的内容。 对关键 API,再打开官方文档人工核对版本、示例和限制。MCP 能减少过期知识,不等于结果天然正确。
第五步:清理练习配置
不再需要时先禁用或移除:09 HTTP 只读示例
下面展示一个虚构的只读文档服务,域名和 token 都是占位符:- 用 HTTPS 保护传输;
- token 只通过环境变量提供;
- 只启用查询和读取工具;
- 即使 server 声明了写入工具,也用黑名单禁用;
- 默认每次调用请求审批;
- 用较短的超时避免异常 server 长时间占用会话。
“只读”不是绝对保证。一个名为
read的工具也可能在服务端记录、触发工作流或返回敏感数据。因此还要审查服务方实现、账号权限和数据分类。
10 网络与提示注入风险
10.1 第三方 server 是供应链
STDIO server 会在本机运行第三方代码。远程 HTTP server 会把外部内容引入 Codex 上下文。两者都应像审查依赖包和外部 SaaS 一样审查:- 来源是否为官方或组织认可的发布方;
- 源码、包名、版本和维护状态是否可核验;
- server 实际需要哪些文件、环境变量和网络域名;
- 工具是否有写入、删除、发送和管理权限;
- 数据是否会离开本机,保存多久,由谁可见;
- 是否有日志、审计、撤销和停用机制。 OpenAI 不会替你审计每一个第三方 MCP server。官方推荐或知名服务只代表相对可信,不代表可以跳过最小权限和人工审批。
10.2 提示注入
提示注入是把恶意指令藏在 README、网页、issue、文档、数据库记录或工具返回值中,试图让模型把外部内容当成用户命令。 例如,一个文档可能返回: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 mcp list 和 /mcp 验证。
12.2 移除配置
确定不再使用时:[mcp_servers.example] 表以及其嵌套的工具配置。编辑前保存备份,避免误删其他 server。
12.3 恢复备份
如果本次修改只涉及用户级配置,并且备份确认是修改前版本,可以恢复: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未显示意外文件变化。