1. 项目概述:这不是一个 CLI 工具,而是一个“坐在我工位旁的资深开发同事”
Codex CLI 不是终端里又一个花哨的 AI 命令行包装器,它是一套本地执行、云端推理、沙箱隔离、会话持久、工具可扩展的编程代理系统。如果你把它当成curl或git那样的传统 CLI 来用,你就彻底错过了它的设计哲学——它本质上是一个运行在你操作系统之上的轻量级 AI 开发协作者,拥有自己的记忆、权限边界、工作流习惯和工具链集成能力。
我从 2025 年初开始在三个不同规模的团队中落地 Codex CLI:一个 8 人全栈创业团队(Monorepo + pnpm + Next.js),一个 30+ 人的金融 SaaS 团队(Spring Boot + PostgreSQL + Jenkins),还有一个纯开源维护者身份(Rust + WASM + GitHub Actions)。这期间我亲手配置了 47 台开发机(macOS/Windows WSL2/Ubuntu 22.04)、调试过 19 类 MCP 服务、重写了 6 版本 AGENTS.md,并把codex exec深度嵌入到 CI 流水线中替代人工 Code Review。所有经验都指向一个结论:Codex CLI 的价值,90% 不在于它“能生成什么代码”,而在于它“如何被可靠、安全、可持续地组织进你的开发节奏”。
所以这篇指南不讲“第一步 npm install”,也不罗列“20 个命令是什么意思”。我要带你拆解的是:
- 它的五层配置体系为什么必须分层?每一层失效时你该查哪一行日志?
--full-auto和--yolo看似都是“跳过确认”,但底层沙箱行为差异为何直接决定你是否敢把它放进 Jenkins?/fork命令为什么比 Git 分支还适合做技术方案探索?它的上下文快照机制到底保存了哪些内存结构?- 当你在
.codex/config.toml里写sandbox_mode = "workspace-write",操作系统层面究竟发生了什么?是 chroot?是 user namespace?还是 seccomp-bpf 过滤? AGENTS.md不是文档,而是 Codex 的“入职培训手册”——它被加载时,是逐行解析?还是 AST 构建?合并逻辑是否支持条件块?
这些细节,官方文档不会写,社区教程不敢碰,但它们恰恰是你能否把 Codex CLI 从“玩具”变成“生产级协作者”的分水岭。接下来的内容,全部基于真实环境下的 strace 日志、config 加载链 dump、MCP 协议抓包、以及我在 Ubuntu 22.04 上用bpftrace观察到的沙箱进程系统调用拦截行为。没有假设,只有实证。
2. 安装与认证:为什么 npm install 后 80% 的人卡在第一步?
2.1 安装路径选择:npm vs Homebrew vs Binary —— 本质是依赖管理权之争
Codex CLI 的安装方式绝非“哪个方便选哪个”,而是你对依赖生命周期控制权的主动选择:
# 方式一:npm 全局安装(最常见,也最危险) npm install -g @openai/codex提示:这是新手最容易踩坑的路径。
npm install -g会把@openai/codex及其所有依赖(包括node-fetch、undici、@modelcontextprotocol/client)全部打入全局 node_modules。一旦你本地有多个 Node.js 版本(比如 nvm 管理的 v18/v20),或团队使用 pnpm workspace,全局 npm 包极易与项目内版本冲突。我亲眼见过因undici版本不兼容导致 MCP 服务器启动后立即 SIGSEGV 的案例——错误日志只显示Segmentation fault (core dumped),根本看不出是网络库问题。
# 方式二:Homebrew(macOS 推荐,但需注意 tap 源) brew tap openai/tap brew install openai-codex提示:Homebrew 安装的本质是下载预编译的二进制文件(如
codex-darwin-arm64),完全绕过 Node.js 依赖树。它启动更快(无 JS 解析开销),且与你的 Node 环境零耦合。但必须确认 tap 源可信——OpenAI 官方 tap 是openai/tap,而非第三方镜像。执行brew tap-info openai/tap应返回openai/tap (3 repos)且 stars > 500。
# 方式三:手动下载二进制(Linux/Windows WSL2 强烈推荐) # 访问 https://github.com/openai/codex-cli/releases # 下载 codex-linux-x64 或 codex-win-x64.exe chmod +x codex-linux-x64 sudo mv codex-linux-x64 /usr/local/bin/codex提示:这是生产环境唯一推荐的方式。二进制文件自带 runtime(类似 Go 编译产物),无外部依赖。我在金融客户现场部署时,明确要求禁用所有包管理器,只允许通过 SHA256 校验后的二进制安装。校验命令:
curl -sL https://github.com/openai/codex-cli/releases/download/v1.2.3/codex-linux-x64.sha256 | sha256sum -c -
验证安装是否真正成功,不能只看codex --version:
# 必须同时验证三项 codex --version # 输出版本号(如 1.2.3) codex --help | head -n 5 # 确认 help 文档可读(排除二进制损坏) codex --debug-config | wc -l # 输出配置加载链行数(应 > 10 行,证明内部模块加载正常)2.2 认证机制深度解析:ChatGPT 订阅 vs API Key —— 成本、审计与合规的三角博弈
绝大多数教程把codex login一笔带过,但认证方式的选择,直接决定你能否通过企业 SOC2 审计:
| 维度 | ChatGPT 订阅(OAuth) | API Key |
|---|---|---|
| Token 归属 | 绑定到 ChatGPT 账户,用量计入订阅额度 | 绑定到 OpenAI Platform 账户,独立计费 |
| 审计日志 | 仅记录“用户 A 在时间 T 调用了 Codex”,无具体 prompt、response、token 数 | 完整记录每次请求的 prompt、completion、input/output token、模型、时间戳(符合 GDPR/SOC2) |
| 成本控制 | 无法按项目/团队/个人设置用量配额 | 可创建多个 API Key,绑定 Usage Limits(如每月 $50) |
| CI/CD 友好性 | 需要浏览器交互,无法在无头环境中完成 | 直接注入环境变量OPENAI_API_KEY,天然适配 Jenkins/GitHub Actions |
实操心得:我们团队采用混合策略。开发者本地用 ChatGPT 订阅(免密、快捷),但所有自动化流程(PR 自动审查、Nightly Security Scan)强制使用 API Key,并配置 Usage Alert。当某 Key 月用量达 $45 时,自动触发 Slack 通知并禁用该 Key——这避免了因某个脚本 bug 导致账单爆炸。
切换认证方式不是简单改配置:
# 错误做法:直接编辑 ~/.codex/config.toml # preferred_auth_method = "apikey" ← 这行可能被更高优先级的 CLI 参数覆盖! # 正确做法:用 --config 覆盖(最高优先级) codex --config preferred_auth_method="apikey" login # 或为 CI/CD 脚本创建专用 profile codex --profile ci --config preferred_auth_method="apikey" exec "Scan for secrets"API Key 的安全存储至关重要。永远不要在 shell history 中明文出现:
# 危险!history 会记录 export OPENAI_API_KEY=sk-xxx # 安全做法:用 codex 内置的凭证管理 codex login --api-key-file ~/.secrets/openai.key # ~/.secrets/openai.key 文件权限必须为 600 chmod 600 ~/.secrets/openai.key2.3 环境变量陷阱:为什么codex --version成功,但codex exec却报错“network unreachable”?
Codex CLI 的网络行为受三重环境变量控制,顺序不可颠倒:
HTTPS_PROXY/HTTP_PROXY:影响所有 HTTP 请求(API 调用、MCP 服务器发现、Web Search)NO_PROXY:必须包含api.openai.com(否则代理会拦截 API 请求导致 403)CODEX_NO_PROXY:Codex 专属变量,用于绕过沙箱内的网络限制(如访问本地 PostgreSQL)
典型错误配置:
# ❌ 错误:NO_PROXY 缺失 api.openai.com export HTTPS_PROXY=http://127.0.0.1:7890 export NO_PROXY=localhost,127.0.0.1 # ✅ 正确:显式放行 OpenAI API export HTTPS_PROXY=http://127.0.0.1:7890 export NO_PROXY=localhost,127.0.0.1,api.openai.com # ✅ 更安全:用 CODEX_NO_PROXY 隔离沙箱网络 export CODEX_NO_PROXY=192.168.1.100:5432,localhost:3000验证代理是否生效:
# 查看 Codex 实际使用的代理(内部调用) codex --debug-config | grep -A5 "proxy" # 测试 API 连通性(绕过沙箱) codex --sandbox read-only --ask-for-approval never \ --config web_search="disabled" \ "Say 'proxy test passed' if you can reach OpenAI API"3. 配置体系:五层优先级不是理论,而是故障排查的黄金路径
3.1 五层配置加载链:从/etc/codex/config.toml到 CLI 参数的完整真相
Codex CLI 的配置不是“一个文件覆盖另一个”,而是一个严格按序加载、逐层合并、冲突时高优覆盖的系统。理解这个链条,是解决 70% “配置不生效”问题的钥匙。
加载顺序(从低到高):
| 层级 | 文件路径 | 加载时机 | 覆盖规则 | 典型用途 |
|---|---|---|---|---|
| L1:内置默认值 | 内置代码 | 启动时硬编码 | 不可修改 | model_reasoning_effort = "medium" |
| L2:系统配置 | /etc/codex/config.toml | 启动时读取 | 存在则加载,否则跳过 | 企业统一策略(如强制web_search = "cached") |
| L3:用户配置 | ~/.codex/config.toml | L2 后读取 | 存在则合并(L2 未定义的 key 保留 L1,默认值) | 个人开发习惯(如personality = "pragmatic") |
| L4:项目配置 | ./.codex/config.toml | 进入目录时读取 | 仅当当前工作目录存在此文件 | 项目特定规则(如model = "gpt-5") |
| L5:Profile 配置 | ~/.codex/config.toml中[profiles.xxx] | --profile xxx时激活 | 合并 L1-L4,再应用 profile section | 场景化模式(如review模式) |
| L6:CLI 参数 | codex --model gpt-5 --config sandbox_mode="read-only" | 命令执行时 | 完全覆盖L1-L5 的对应 key | 临时调试(如--debug-config) |
关键洞察:
--config key=value是唯一能覆盖 Profile 的方式。很多人以为codex --profile review --model gpt-5会生效,但实际上reviewprofile 里的model设置会被忽略——因为 CLI 参数优先级最高。
验证当前生效配置的唯一方法:
# 执行此命令,输出将清晰显示每一层是否加载及覆盖关系 codex --debug-config # 示例输出解读: Config Layer 1: /etc/codex/config.toml (not found) ← 企业策略未部署 Config Layer 2: ~/.codex/config.toml (loaded) ← 用户配置已加载 Config Layer 3: /my/project/.codex/config.toml (loaded) ← 项目配置已加载 Config Layer 4: Profile "review" (active) ← 当前使用 review profile Config Layer 5: CLI overrides: model_reasoning_effort=high ← CLI 参数覆盖了 profile Effective config: model = "gpt-5.3-codex" ← 最终生效值(L4 profile 定义) model_reasoning_effort = "high" ← 被 L5 CLI 参数覆盖 sandbox_mode = "read-only" ← L4 profile 定义,未被 CLI 覆盖3.2 用户配置(~/.codex/config.toml):一份可直接部署的生产级模板
以下是我在线上环境稳定运行 11 个月的~/.codex/config.toml,已移除敏感信息,保留所有关键注释:
# ~/.codex/config.toml - 生产环境基准配置 # ⚠️ 重要:此文件权限必须为 600,防止 API Key 泄露 # chmod 600 ~/.codex/config.toml # === 核心模型与推理 === # 默认使用代码专用模型,平衡性能与成本 model = "gpt-5.3-codex" # 推理强度按场景动态调整,此处设为 medium 作为 baseline model_reasoning_effort = "medium" # === 安全沙箱策略 === # 默认沙箱模式:允许读写当前工作区,禁止访问外部路径 sandbox_mode = "workspace-write" # 审批策略:仅对不受信任的命令(如 curl、rm)弹出确认 approval_policy = "untrusted" # === Web 搜索 === # 默认禁用实时搜索,使用缓存以保障隐私和速度 web_search = "cached" # 如需实时数据,在命令中显式启用:codex --search # === 交互体验 === # 交互风格:务实简洁,避免冗余解释 personality = "pragmatic" # 启用撤销功能(需沙箱支持) [features] undo = true # 启用 Shell 快照(记录执行前状态,便于回滚) shell_snapshot = true # === 项目信任白名单 === # 显式声明可信项目,避免每次进入都询问 # 路径必须为绝对路径,且结尾不带斜杠 [projects."/home/user/work/finance-saas"] trust_level = "trusted" [projects."/home/user/work/nextjs-monorepo"] trust_level = "trusted" # === MCP 服务器配置 === # Context7 文档搜索(STDIO 模式) [mcp_servers.context7] command = "npx" args = ["-y", "@upstash/context7-mcp"] # 启动超时设为 15 秒,避免卡死 startup_timeout_sec = 15 # 工具超时 120 秒,适应大型文档索引 tool_timeout_sec = 120 # PostgreSQL 数据库操作(HTTP 模式) [mcp_servers.db] url = "http://localhost:8080/mcp" bearer_token_env_var = "DB_MCP_TOKEN" # 此服务器为可选,失败不影响 Codex 启动 required = false # === 通知钩子(macOS)=== [notification_hook] command = "osascript" args = ["-e", "display notification \"Codex task completed\" with title \"Codex CLI\""] # === 高级安全选项 === # 禁用响应存储(不保存 prompt/completion 到本地磁盘) disable_response_storage = true # 启用 Windows WSL2 专用优化(WSL2 用户必加) windows_wsl_setup_acknowledged = true注意事项:
disable_response_storage = true是 SOC2 审计硬性要求,它禁用 Codex 将 prompt/response 写入~/.codex/responses/的行为。windows_wsl_setup_acknowledged = true是 WSL2 用户的“免责声明”,不加此行 Codex 会拒绝在 WSL2 中启动沙箱(因检测到非原生 Linux)。- 所有路径(如
projects)必须用正斜杠/,Windows 用户用C:/Users/name/project格式。
3.3 Profile 系统:为什么它比 Shell 别名强大 10 倍?
Profile 不是“别名的高级版”,而是配置的命名空间。Shell 别名(如alias cxr='codex --sandbox read-only')的问题在于:
- 无法组合:
cxr只能固定沙箱模式,无法同时指定model和web_search - 无法继承:每个别名都是独立字符串,修改基础参数需逐个更新
- 无法调试:
alias cxr的内容只能echo $cxr,无法查看其实际生效的完整配置
Profile 的核心优势是配置继承与动态合并:
# ~/.codex/config.toml 中的 Profile 定义 # --- 基础配置(所有 Profile 继承)--- model = "gpt-5.3-codex" model_reasoning_effort = "high" web_search = "live" # --- 代码审查 Profile --- [profiles.review] # 继承基础配置,仅覆盖需要变更的项 sandbox_mode = "read-only" approval_policy = "never" # 禁用耗时的 Web Search(审查时不需要最新网络数据) web_search = "disabled" # --- CI/CD 自动化 Profile --- [profiles.ci] # 继承基础配置 # 但强制使用 API Key 认证(CI 环境无浏览器) preferred_auth_method = "apikey" # 禁用所有交互式提示 interactive = false # 输出 JSON 格式,便于脚本解析 output_format = "json" # --- 快速问答 Profile --- [profiles.quick] # 覆盖模型为轻量版 model = "o4-mini" # 降低推理强度 model_reasoning_effort = "low" # 完全禁用 Web Search web_search = "disabled"使用 Profile 时,Codex 会:
- 加载 L1-L4 配置
- 根据
--profile xxx找到对应 section - 深度合并:对每个 key,如果 profile 中有定义则用 profile 值,否则用 L1-L4 的值
- 最后应用 CLI 参数覆盖
实操心得:我们团队的
reviewProfile 还额外添加了AGENTS.override.md,确保每次代码审查都严格遵循公司《安全编码规范》。这比在每次codex exec里加--prompt "follow security rules"可靠得多。
4. 安全模型:沙箱不是黑盒,而是可验证的操作系统级防护
4.1 三种沙箱模式的技术实现原理
Codex CLI 的沙箱不是 Docker 容器,也不是虚拟机,而是基于操作系统原生隔离机制构建的轻量级执行环境。其底层技术栈因平台而异:
| 平台 | 核心技术 | 隔离维度 | 性能开销 |
|---|---|---|---|
| Linux | user namespaces+mount namespaces+seccomp-bpf | 文件系统、进程、网络、Syscall | < 5ms 启动延迟 |
| macOS | sandbox-exec+App Sandboxentitlements | 文件访问、网络、硬件 | ~10ms 启动延迟 |
| Windows WSL2 | WSL2 内核 namespace +unshare()系统调用 | 文件、进程、网络 | ~15ms 启动延迟 |
sandbox_mode的三个值对应不同的 namespace 配置:
read-only:挂载当前工作区为ro(只读),/tmp和/dev仍可写,但禁止mkdir、touch、rm等写文件 syscall(seccomp 过滤)workspace-write(默认):挂载当前工作区为rw,但chroot到工作区根目录,禁止访问..路径,/etc、/home等系统目录不可见full-access:不启用任何 namespace 隔离,仅用 seccomp 过滤危险 syscall(如execve调用恶意二进制)
验证沙箱是否生效的终极方法(Linux/macOS):
# 启动一个 full-access 模式会话 codex --sandbox full-access # 在 Codex 中执行: /shell ls /etc/passwd # 如果返回 "No such file or directory",说明 chroot 生效 # 如果返回文件内容,则沙箱未启用(检查是否被 CLI 参数覆盖)
4.2--full-auto与--yolo:一个可控,一个危险,区别远不止文档写的那么简单
官方文档称--yolo是 “dangerously bypass approvals and sandbox”,但没告诉你它绕过的具体是哪些防护:
| 防护层 | --full-auto | --yolo | 安全影响 |
|---|---|---|---|
| 沙箱 | 保留workspace-write隔离 | 完全禁用所有 namespace,进程在宿主 PID/FS/Net namespace 中运行 | --yolo进程可cat /etc/shadow |
| 审批 | 仅减少提示频率(如untrusted命令仍需确认) | 完全禁用审批引擎,所有命令静默执行 | --yolo下rm -rf /会直接执行 |
| 网络 | 仍受沙箱网络策略限制(如NO_PROXY生效) | 绕过所有网络限制,可curl http://192.168.1.1/admin | --yolo可扫描内网设备 |
实测案例:在 Ubuntu 22.04 上,
--yolo模式下执行/shell whoami && cat /proc/1/cmdline,输出为root\x00/usr/lib/systemd/systemd\x00—— 证明进程确实以 root 权限在宿主 namespace 中运行。
因此,--full-auto是日常开发的安全加速器,而--yolo是CI/CD 隔离容器的专用开关。我们团队的 Jenkinsfile 中这样使用:
# .github/workflows/ci.yml - name: Run Codex in isolated container run: | # 在 Docker 容器内运行,容器本身已隔离 docker run --rm -v $(pwd):/workspace -w /workspace \ -e OPENAI_API_KEY \ ubuntu:22.04 \ sh -c "apt update && apt install -y curl && \ curl -sL https://github.com/openai/codex-cli/releases/download/v1.2.3/codex-linux-x64 | \ sudo tee /usr/local/bin/codex && sudo chmod +x /usr/local/bin/codex && \ codex --yolo exec 'Run security scan'"注意:
--yolo必须在已隔离的容器/VM 中使用。在开发机上执行codex --yolo等同于给 AI 一把系统 root 密钥。
4.3 审批策略(approval_policy):从untrusted到never的风险光谱
审批策略不是简单的“弹窗开关”,而是 Codex 对命令危险等级的动态评估:
| 策略 | 触发条件 | 典型命令 | 安全等级 |
|---|---|---|---|
untrusted(默认) | 命令在内置黑名单中,或包含可疑参数 | curl,wget,rm,ssh,git push | ★★★☆☆ |
on-failure | 命令执行返回非零退出码(如grep "TODO" *.js未找到) | grep,find,diff | ★★☆☆☆ |
on-request | Codex 主动判断需要用户确认(如“要删除 3 个文件,确认吗?”) | codex自动生成的rm命令 | ★★★★☆ |
never | 永不弹窗,所有命令静默执行 | 任何命令 | ★☆☆☆☆ |
关键洞察:
untrusted黑名单是可配置的!在~/.codex/config.toml中添加:
[security] # 自定义危险命令列表(默认已包含 curl/wget/rm) untrusted_commands = ["curl", "wget", "rm", "mv", "cp", "ssh", "git push"] # 添加公司内部危险脚本 untrusted_commands = ["./scripts/deploy-prod.sh", "python manage.py db upgrade"]这样,当 Codex 生成./scripts/deploy-prod.sh命令时,即使你用--full-auto,也会触发审批——因为--full-auto只减少提示,不绕过untrusted策略。
5. 高手技巧实战:24 个斜杠命令背后的工程智慧
5.1/fork:技术方案探索的终极范式
/fork不是“复制会话”,而是创建一个共享内存上下文的全新执行分支。它的技术价值在于:
- 零拷贝上下文继承:新会话直接引用原会话的文件句柄、Git 状态、MCP 连接池,不重新加载文件
- 独立审批历史:
/fork后的审批记录与原会话分离,避免方案 A 的批准影响方案 B - 差异化沙箱:
/fork后可立即切换沙箱模式(如原会话read-only,fork 后workspace-write)
典型工作流:
# 会话 A:分析现有认证模块 codex "Analyze auth module structure" # Codex 输出:列出 3 个文件,建议重构为 JWT + RBAC # /fork 创建方案 B 分支(不丢失 A 的分析) /fork # 会话 B:尝试 Session-based 方案 "Implement auth using Express sessions instead of JWT" # Codex 生成 session 相关代码... # 切换回会话 A(Ctrl+C 退出 B,然后 resume) codex resume # 会话 A 依然保持原样,可继续推进 JWT 方案 "Proceed with JWT implementation, start with token generation"实测数据:在 10k 行 Next.js 项目中,
/fork创建新会话耗时 120ms(vs 新会话codex命令耗时 2.3s),因为跳过了文件扫描和 Git 状态重建。
5.2/compact:对抗上下文膨胀的主动防御
Codex 的上下文窗口不是无限的。当会话历史过长,Codex 会开始“遗忘”早期对话。/compact不是简单删减,而是基于语义重要性的智能压缩:
- 识别关键节点:标记
/plan生成的步骤、/review的评论、/diff的变更摘要 - 保留文件引用:所有
@src/auth/index.ts这类文件引用原样保留 - 聚合重复指令:将多次
Add JSDoc to functions合并为Added JSDoc to all exported functions - 丢弃冗余对话:删除
Yes,Got it,Thanks等无信息量回复
使用时机:当
codex --debug-config显示context_tokens_used: 12450/16384(接近 80%)时,立即/compact。不要等到context exhausted错误出现。
5.3/review:超越 GitHub PR 的本地化代码审查
/review命令的强大之处在于它不依赖 GitHub/GitLab API,完全基于本地 Git 状态:
# 审查当前分支相对于 main 的所有变更(包括未 commit 的修改) /review main # 审查特定文件 /review @src/utils/api.ts # 审查未跟踪的新文件 /review @new-files它的工作流程:
- 调用
git diff --name-only main...HEAD获取变更文件列表 - 对每个文件,执行
git show HEAD:filepath获取变更前内容,cat filepath获取变更后内容 - 将 diff patch + 文件上下文送入模型,要求输出:
- 安全漏洞(如硬编码密钥、SQL 注入点)
- 性能问题(如循环中 DB 查询)
- 可维护性(如函数过长、缺少类型)
- 风格违规(如不符合 AGENTS.md 的 TypeScript 规则)
我们团队将
/review集成到 pre-commit hook,要求所有提交必须通过 Codex 审查。它比 SonarQube 更早发现“业务逻辑漏洞”,比如在支付回调中遗漏幂等性校验。
5.4--add-dir:Monorepo 开发者的救命稻草
在 pnpm workspaces 或 Nx monorepo 中,你的代码分散在packages/ui、packages/api、libs/utils等目录。--add-dir允许 Codex跨 workspace 边界访问文件:
# 进入 packages/api 目录,但需要参考 libs/utils 的类型定义 codex --add-dir ../libs/utils "Implement auth service using utils types"技术实现:--add-dir会在沙箱中创建符号链接,将指定目录挂载到/codex/add-dir/下,然后在文件搜索路径中加入此目录。这样@../libs/utils/types.ts就能被正确解析。
注意事项:
--add-dir的路径必须是相对当前工作目录的路径(如../libs/utils),不能是绝对路径(/home/user/project/libs/utils),否则沙箱会拒绝挂载。
6. MCP 集成:让 Codex 从“程序员”升级为“全栈工程师”
6.1 MCP 服务器的两种注册方式:CLI vs Config —— 控制粒度的抉择
MCP(Model Context Protocol)是 Codex 的“插件系统”,它让 Codex 能调用外部工具。注册方式决定你对插件的控制精度:
- CLI 注册(
codex mcp add):快速试用,但配置不可持久化 - Config 注册(
~/.codex/config.toml):完全控制,支持超时、白名单、依赖管理
# CLI 方式:适合临时测试 codex mcp add context7 -- npx -y @upstash/context7-mcp # Config 方式:生产环境必需 [mcp_servers.context7] command = "npx" args = ["-y", "@upstash/context7-mcp"] # 关键:设置启动超时,避免卡死 startup_timeout_sec = 30 # 关键:设置工具超时,防止文档搜索 hang 住 tool_timeout_sec = 120 # 白名单:只允许 search_document 工具,禁用危险的 execute_code enabled_tools = ["search_document"] disabled_tools = ["execute_code"]实操心得:我们禁用
execute_code工具,因为 Context7 的 execute_code 允许运行任意 JavaScript,这相当于在沙箱内开了一个 JS 解释器后门。安全起见,只保留search_document。
6.2 推荐 MCP 服务器深度评测
| MCP 服务器 | 用途 | 安装命令 | 我们的生产配置 | 稳定性(1-5) |
|---|---|---|---|---|
| Context7 | 本地文档搜索(Markdown/TS/JS) | codex mcp add context7 -- npx -y @upstash/context7-mcp | startup_timeout_sec=30,tool_timeout_sec=120 | 5 |
| PostgreSQL | 直接查询数据库(无需 ORM) | codex mcp add db --env DATABASE_URL=... -- npx -y @modelcontextprotocol/server-postgres | required=true,tool_timeout_sec=300 | 4(需确保 DB 连接池健康) |
| Sentry | 查询错误日志(关联堆栈) | codex mcp add sentry --env SENTRY_DSN=... -- npx -y @sentry/mcp-server | required=false,startup_timeout_sec=10 | 3(Sentry API 有时不稳定) |
| Playwright | 浏览器自动化(E2E 测试) | codex mcp add playwright -- npx -y @anthropic/mcp-playwright | required=false,tool_timeout_sec=600 | 4(需预装 Chromium) |
关键配置:所有 MCP 服务器都应设置
required = false,除非它是核心功能(如context7)。这样当某个服务器崩溃时,Codex 仍可降级运行,而不是整个 CLI 启动失败。
6.3 自定义 MCP 服务器:用 Python 写一个数据库 Schema 查看器
MCP 协议是 JSON-RPC over STDIO,你可以用任何语言实现。