使用说明
codex mcp
包装的MCP服务器 OpenAI 代码专家 --启动编码代理,轮询其进度,并管理来自任何MCP客户端的权限。支持两者 app-server (全功能)和 exec (不带应用服务器的codex变体的回退)模式。
特性
- 4个工具,功能齐全 —
codex,codex_reply,codex_session,codex_check - 异步非阻塞 --会话在后台运行,轮询结果
- 完整的权限管理 --三层模型:审批策略、沙盒隔离、异步审批仲裁
- 零配置 --继承您的本地
~/.codex/config.toml自动地 - 会话管理 --列出、检查、取消、中断、分叉会话
- 事件流 --基于指针的分页,带有pin保护的事件缓冲区
- 静态只读资源 —
codex-mcp:///server-info,codex-mcp:///compat-report,codex-mcp:///config,codex-mcp:///gotchas,codex-mcp:///quickstart,codex-mcp:///errors
先决条件
- Node.js >= 18
- OpenAI Codex命令行界面 已安装并配置(
codex在PATH中)
快速开始
npx(不安装)
npx @leo000001/codex-mcp
全局安装
npm install -g @leo000001/codex-mcp
codex-mcp
Windows shell包装器(如果需要)
pwsh -NoProfile -Command "npx -y @leo000001/codex-mcp"
MCP客户端配置
添加到您的MCP客户端配置中(例如Claude Desktop、Cursor等):
{
"mcpServers": {
"codex": {
"command": "npx",
"args": ["-y", "@leo000001/codex-mcp"]
}
}
}
克劳德代码
claude mcp add codex-mcp -- npx -y @leo000001/codex-mcp
或添加到 ~/.claude/settings.json:
{
"mcpServers": {
"codex-mcp": {
"command": "npx",
"args": ["-y", "@leo000001/codex-mcp"]
}
}
}
STDIO保护模式
codex-mcp 包括用于stdout污染风险的启动飞行前防护。
CODEX_MCP_STDIO_MODE=auto(默认):当风险升高时,运行时会发出警告CODEX_MCP_STDIO_MODE=strict:在阻断风险(如TTY stdio)方面快速失败,将启发式风险作为警告CODEX_MCP_STDIO_MODE=off:禁用飞行前防护
执行回退模式
当codex二进制文件不支持时 app-server (例如,内部变体,如 codex-internal),codex mcp自动回退到 codex exec --json 模式。
| 环境变量 | 默认值 | 描述 |
|---|---|---|
CODEX_MCP_BINARY |
codex |
要使用的codex二进制文件的名称 |
CODEX_MCP_MODE |
自动检测 | 强制 app-server 或 exec 模式(跳过检测) |
Exec模式支持多回合上下文 通过 codex exec resume.第一回合使用 codex exec,后续使用 codex exec resume <threadId>.
执行模式限制:
- 无批准/用户输入交互
threadFork/threadResume扔EXEC_NOT_SUPPORTEDsandbox/profile/cwd/outputSchema覆盖仅适用于第一轮(exec-resume不支持这些标志)
检查 codex-mcp:///server-info clientMode 字段以检测哪个模式处于活动状态。
示例:
CODEX_MCP_STDIO_MODE=strict npx -y @leo000001/codex-mcp
$env:CODEX_MCP_STDIO_MODE = "strict"; npx -y @leo000001/codex-mcp
工具
codex --开始新会话
异步启动Codex代理会话。立即返回 sessionId.
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
prompt |
string | 是 | 食品法典委员会代理的任务或问题 |
approvalPolicy |
string | 是 | 审批策略: untrusted, on-failure, on-request, never --调用者必须根据自己的权限级别进行设置 |
sandbox |
string | 是 | 沙盒模式: read-only, workspace-write, danger-full-access --调用者必须根据自己的权限级别进行设置 |
effort |
string | 否 | 推理努力: none, minimal, low, medium, high, xhigh默认值: low;根据任务复杂性增加/减少 |
cwd |
string | 否 | 工作目录。默认值:服务器cwd |
model |
string | 否 | 模型覆盖。默认值:从 ~/.codex/config.toml |
profile |
string | 否 | config.toml 配置文件名称(传递为 codex app-server -p) |
advanced |
object | 否 | 低频选项(见下文) |
advanced object parameters (9 low-frequency parameters)
| 参数 | 类型 | 说明 |
|---|---|---|
advanced.baseInstructions |
string | 替换默认指令(线程级) |
advanced.developerInstructions |
string | 开发人员说明(线程级) |
advanced.personality |
string | 个性: none, friendly, pragmatic (默认值:从 ~/.codex/config.toml) |
advanced.summary |
string | 推理摘要: auto, concise, detailed, none (默认值:从 ~/.codex/config.toml) |
advanced.config |
对象 | 覆盖 config.toml 值(传递为 codex app-server -c key=value) |
advanced.ephemeral |
boolean | 不要持久化线程。违约: false |
advanced.outputSchema |
object | 结构化输出的JSON模式 |
advanced.images |
string[] | 本地映像路径(添加 localImage 输入) |
advanced.approvalTimeoutMs |
number | 等待审批的自动拒绝超时(ms)。违约: 60000 |
退货: { sessionId, threadId, status: "running" | "idle", pollInterval }
{
"prompt": "Fix the failing tests in src/",
"approvalPolicy": "on-request",
"sandbox": "workspace-write",
"effort": "high",
"cwd": "/path/to/project",
"model": "o4-mini"
}
资源
如果您的MCP客户端支持资源,则此服务器会公开一些 只读 资源:
codex-mcp:///server-info(JSON):静态服务器元数据(版本/平台/运行时)codex-mcp:///compat-report(JSON):跨后端适配器兼容性的能力摘要codex-mcp:///config(Markdown):配置映射指南,包括如何使用codex.advanced.configcodex-mcp:///gotchas(Markdown):实际限制/陷阱codex-mcp:///quickstart(Markdown):最小工作流示例codex-mcp:///errors(Markdown):错误代码目录+恢复提示
codex_reply --继续会话
向现有会话发送后续消息。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
sessionId |
string | 是 | 来自的会话ID codex |
prompt |
string | 是 | 后续消息 |
model |
string | 否 | 覆盖此回合的模型 |
approvalPolicy |
string | 否 | 覆盖审批策略 |
effort |
string | 否 | 覆盖推理努力(none, minimal, low, medium, high, xhigh) |
summary |
string | 否 | 覆盖推理摘要(auto, concise, detailed, none) |
personality |
string | 否 | 覆盖个性(none, friendly, pragmatic) |
sandbox |
string | 否 | 覆盖沙盒(read-only, workspace-write, danger-full-access) |
cwd |
string | 否 | 覆盖工作目录 |
outputSchema |
object | 否 | 结构化输出的JSON模式 |
退货: { sessionId, threadId, status: "running" | "idle", pollInterval }
{
"sessionId": "sess_abc123",
"prompt": "Now add error handling for the edge cases"
}
codex_session --管理会话
列出、检查、取消、中断、分叉会话或清理后台终端。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
action |
string | 是 | "list", "get", "cancel", "interrupt", "fork",或 "clean_background_terminals" |
sessionId |
string | 用于获取/取消/中断/fork/clean_background_terminal | 目标会话ID |
includeSensitive |
boolean | 否 | 包含 cwd/profile/config/threadId 在 get默认值: false |
退货:
action="list"→{ sessions: PublicSessionInfo[] }action="get"→PublicSessionInfo(或SensitiveSessionInfo当includeSensitive=true)action="cancel"|"interrupt"→{ success: true, message }action="fork"→{ sessionId, threadId, status: "idle", pollInterval }action="clean_background_terminals"→{ success: true, message }
{ "action": "list" }
{ "action": "get", "sessionId": "sess_abc123", "includeSensitive": true }
{ "action": "cancel", "sessionId": "sess_abc123" }
{ "action": "interrupt", "sessionId": "sess_abc123" }
{ "action": "fork", "sessionId": "sess_abc123" }
{ "action": "clean_background_terminals", "sessionId": "sess_abc123" }
codex_check --投票事件和回复
查询正在运行的会话中的事件、响应审批请求或回答用户输入。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
action |
string | 是 | "poll", "respond_permission",或 "respond_user_input" |
sessionId |
string | 是 | 目标会话ID |
cursor |
number | No | 增量轮询的事件游标(action="poll").对于 respond_*,codex mcp应用单调光标级数: max(cursor, sessionLastCursor). |
maxEvents |
number | 否 | 保持小。 poll 违约: 1 (最小值 1;仅为追赶而增加)。 respond_* 违约: 0 (推荐;紧凑型ACK,无事件回放)。 |
responseMode |
string | 否 | 响应整形模式: minimal (默认), delta_compact, full |
pollOptions |
object | 否 | 可选控件: includeEvents (默认值 true), includeActions (默认值 true), includeResult (默认值 true), maxBytes (默认为无限制) |
requestId |
string | 用于respond_permission/user_input | 来自的请求ID actions[] |
decision |
string | 对于respond_permission | 对于命令审批: "accept", "acceptForSession", "acceptWithExecpolicyAmendment", "decline", "cancel";对于文件更改: "accept", "acceptForSession", "decline", "cancel" |
execpolicy_amendment |
string[] | 用于acceptWithExecpolicyAmendment | Exec保单修订列表(在以下情况下为必填项 decision="acceptWithExecpolicyAmendment") |
denyMessage |
string | 否 | 关于拒绝的内部注释(未发送到应用服务器) |
answers |
object | For respond_user_input | For respond_user_input: question-id -> { answers: string[] } |
回报(投票和回复_*): { sessionId, status, pollInterval?, cursorResetTo?, events, nextCursor, actions?, result? }
{ "action": "poll", "sessionId": "sess_abc123", "cursor": 0 }
{
"action": "respond_permission",
"sessionId": "sess_abc123",
"requestId": "req_xyz",
"decision": "accept"
}
{
"action": "respond_user_input",
"sessionId": "sess_abc123",
"requestId": "req_abc",
"answers": { "question_id": { "answers": ["choice_1"] } }
}
事件轮询语义
codex_check(action="poll") 返回一个带有光标分页的仅追加事件流:
cursor:您想要的第一个事件id(使用前面的nextCursor)nextCursor:在下一次投票中传递此信息cursorResetTo当存在时,较旧的活动会被驱逐;从此光标重新启动以避免出现空白maxEvents:每次调用返回的最大事件数- 如果
cursor如果省略,codex mcp将从该会话的最后一个使用的游标继续。 - 如果
responseMode省略,codex mcp使用minimal. pollOptions.includeEvents/includeActions/includeResult默认true.pollOptions.maxBytes是可选的,并强制执行尽力而为的有效载荷截断(truncated,truncatedFields).respond_*默认为压缩ACK(events: [],没有光标前进),除非您明确传递maxEvents.poll默认为maxEvents=1保持有效载荷较小;暂时增加(例如10-20)当你需要更快地赶上的时候。- 如果
poll被称为maxEvents=0,codex mcp将其视为1以避免无操作轮询循环。 - 对于
respond_*,更喜欢maxEvents=0而不是1:0保持批准ACK最小,并避免在同一呼叫中消耗/重放流事件。使用1-5只有当你明确需要即时事件时。 - 对于
poll,保持窗口较小,以减少有效载荷峰值和上下文压力。
事件类型包括 output, progress, approval_request, approval_result, result, error.
批准/结果/错误被固定,以降低驱逐风险。
批准和用户输入
当代理请求批准或用户输入时, poll 包括a actions[] 列表。回复:
respond_permission:decision是其中之一accept,acceptForSession,decline,cancel.- 对于命令批准,
acceptWithExecpolicyAmendment支持并要求execpolicy_amendment.
- 对于命令批准,
respond_user_input:发送answers被问题所困扰id.- 对于命令批准,
actions[]可能包括commandActions和proposedExecpolicyAmendment更丰富的评论UI。
待批准后自动拒绝 advanced.approvalTimeoutMs.
Auth回调注释:如果应用服务器发送 account/chatgptAuthTokens/refresh,codex mcp返回JSON-RPC错误 -32000 因为外部ChatGPT令牌刷新超出了此服务器的范围。
会话生命周期和清理
会话在后台自动清理:
idle>30分钟→ 取消running/waiting_approval>4小时→ 取消cancelled/error>5分钟→ 从内存中删除
错误模型
工具返回错误如下:
{ "content": [{ "type": "text", "text": "Error [CODE]: message" }], "isError": true }
常见代码包括 INVALID_ARGUMENT, SESSION_NOT_FOUND, SESSION_BUSY, SESSION_NOT_RUNNING, REQUEST_NOT_FOUND, CANCELLED, INTERNAL.
客户端兼容性说明
- 工具响应如下
@modelcontextprotocol/sdksCallToolResult合同:content(JSON文本以实现广泛兼容性),可选structuredContent(规范对象),以及isError.structuredContent总是物体形状的;当工具返回标量/数组时,codex mcp将其包装为{ "value": ... }.Claude Desktop和其他客户倾向于浮出水面content直接显示文本,显示原始JSON blob,因此它们应该回退到structuredContent当他们需要键入数据时(只要有结构化输出可用,Cursor就会自动执行此操作)。 - 当操作失败时,我们设置
isError: true并返回Error [CODE]: message在content阵列,而不是引发MCP传输错误。这使STDIO通道保持健康,因此即使在工具报告问题时,Claude、Cursor和其他MCP客户端也会保持连接。 codex-mcp使用MCP stdio传输(src/index.ts),因此stdout保留用于换行符分隔的JSON,所有诊断都转到stderr。stdout上的任何其他内容,包括shell/profile横幅(例如PowerShell的哦,我的豪华警告)或打印提示的CLI包装器,都会破坏Claude/Cursor的MCP握手。跑pwsh -NoProfile,禁用配置文件横幅,或包装命令,以便stdout在将其管道传输到客户端之前保持安静。- 在内部执行Windows命令
codex app-server在某些环境中,可能仍会继承PowerShell配置文件的副作用。一旦在stdout上发出codex mcp,就无法对其进行过滤;如果命令回合嘈杂或因配置文件错误而失败,请清理PowerShell配置文件并首选approvalPolicy="on-failure"/"never"以减少审批流失。 - 如果Windows命令输出显示mojibake,则在shell中强制UTF-8(
chcp 65001和$OutputEncoding = [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()). - 启动保护行为由以下因素控制
CODEX_MCP_STDIO_MODE(auto/strict/off).使用strict在CI或硬化环境中,在阻断污染风险方面快速失败(同时仍然出现启发式风险警告)。 - 可重试传输/API中断发出为
progress事件与data.method="codex-mcp/reconnect"和willRetry=true,因此客户端可以显示重新连接状态,而不会将其视为终端故障。 - 审批/用户输入流程取决于
actions[]返回的数组codex_check(action="poll").Claude和Cursor从该负载中呈现批准按钮,因此他们需要在pollInterval,荣誉cursorResetTo,并在内回复approvalTimeoutMs以避免自动下降。
典型工作流程
1. codex(prompt="Fix bug X") → { sessionId, threadId, status: "running" }
2. codex_check(action="poll", ...) → events[], status, actions[]
3. codex_check(action="respond_permission", decision="accept") (if needed)
4. codex_check(action="poll", ...) → result when status="idle"
5. codex_reply(prompt="Also add tests") → new turn starts
6. codex_check(action="poll", ...) → poll until done
权限模型
三层保护:
| 层 | 机制 | 选项 |
|---|---|---|
| 0 | 审批策略 | never, on-failure, on-request, untrusted |
| 1 | 沙箱 | read-only, workspace-write, danger-full-access |
| 2 | 异步审批 | 命令执行+文件更改审批 codex_check |
建筑
相同平台假设:codex mcp假设mcp客户端和服务器在同一台机器上运行。所有通信都使用stdio(本地IPC),子进程共享本地文件系统和
~/.codex/config.toml,以及cwd路径指的是本地文件系统。
MCP Client ←stdio→ codex-mcp server ←stdio→ codex app-server ←→ Codex Agent (app-server mode)
MCP Client ←stdio→ codex-mcp server ←stdio→ codex exec --json ←→ Codex Agent (exec fallback)
(same machine, stdio transport)
每个会话都会生成一个独立的子进程。在应用服务器模式下,它通过stdio使用JSON-RPC协议。在exec回退模式下,它使用 codex exec --json JSONL输出 codex exec resume 适用于多回合背景。
发展
git clone https://github.com/xihuai18/codex-mcp.git
cd codex-mcp
npm install
npm run build
npm run typecheck
npm test
npm run check:stdio
npm run check:stdio:strict
端到端本地测试计划(在MCP客户端中安装/配置后):
- 完整指南(LLM操作员手册):
docs/E2E_LOCAL_TEST_PLAN.md - 快速英语检查表:运行
codex→ 投票与codex_check(action="poll")→ 通过以下方式回复respond_permission/respond_user_input如果actions[]出现→ 继续轮询,直到status是idle/error/cancelled.
