codex-app-server-mcp
Enables delegation of tasks to OpenAI Codex through a persistent codex app-server process, with tools for starting and continuing threads, waiting on results, responding to approval requests, steering or interrupting turns, running code reviews, and managing parallel worktree-isolated tasks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@codex-app-server-mcpHave Codex implement dark mode in this repo, then review its diff."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
codex-app-server-mcp
An MCP server that lets Claude Code (or any MCP client) delegate work to OpenAI Codex: Claude plans and reviews, Codex does the hands-on work.
Most Codex MCP wrappers shell out to codex exec once per task. This one keeps a single long-lived codex app-server process and speaks its JSON protocol directly, so it can do things exec can't:
Persistent threads: follow-ups go to the same Codex thread with its full context.
Async, never times out: every call returns within
wait_secondswith a progress snapshot; keep going withcodex_wait.Two-way: when Codex needs an approval or asks a question, the turn pauses and the request is handed to Claude (
codex_respond) instead of hanging.Steer and interrupt: add instructions to a running turn, or stop it.
Native code review, plus a steerable "adversarial" mode that challenges the design.
Parallel work: many threads at once, batch
codex_wait, optional isolated git worktree per task.Resume anything: continue threads started in the Codex app or CLI, or after a restart.
Live status, model list, structured output, web search, context compaction.
Tools
Tool | What it does |
| Start a task (new thread needs |
| Wait on one thread or a batch ( |
| Non-blocking peek: status, what Codex is doing right now, pending requests. |
| Answer a pending request: approvals take |
| Add instructions to the turn that's currently running. |
| Stop the running turn. |
| Codex's native read-only review of |
| Compact a long thread's history to free up context. |
| Models available to your Codex login, with supported reasoning efforts. |
| Recent Codex threads (including ones from the Codex app/CLI). |
Every task tool returns the same report:
{
"thread_id": "01a14aa3-…",
"turn_id": "01a14aa3-…",
"status": "waitingForInput",
"latest_message": "I need to clear the build directory first.",
"files_changed": [],
"commands_run": 3,
"recent_commands": [{ "command": "npm test", "exitCode": 1 }],
"pending_requests": [
{ "request_id": "req_1", "type": "approve_command", "command": "rm -rf build", "cwd": "/repo", "reason": null }
],
"hint": "Codex is blocked on these requests — answer each with codex_respond, then codex_wait."
}status is inProgress, waitingForInput, completed, interrupted or failed. A review adds review, a worktree run adds worktree: { path, branch }, and a running turn adds current_activity.
Related MCP server: subcodex-mcp
Install
Requires Node ≥ 20 and the Codex CLI (npm i -g @openai/codex, logged in).
claude mcp add --scope user codex -- npx -y codex-app-server-mcpThen start a new Claude Code session and say something like "Have Codex implement X in this repo, then review its diff."
Any other MCP client: use the command npx -y codex-app-server-mcp (stdio). If the client can't find codex on its PATH (common with nvm), add -e CODEX_BIN="$(which codex)".
From source: git clone https://github.com/Goudu666/codex-app-server-mcp.git && cd codex-app-server-mcp && npm install, then point your client at node server.mjs.
Configuration
Env var | Default | |
|
| Default sandbox for new threads: |
|
| Default approval policy: |
| from | Default model |
| from | Default reasoning effort |
|
| Path to the Codex CLI |
Permissions
By default Codex can write inside the working directory and asks before anything beyond that. Those requests come back to Claude as pending_requests, and Claude decides or asks you, then calls codex_respond.
Full autonomy, where Codex can touch anything your user can and never asks:
claude mcp add --scope user codex -e CODEX_SANDBOX=danger-full-access -e CODEX_APPROVAL=never -- npx -y codex-app-server-mcpor per task: codex_run({ ..., sandbox: "danger-full-access", approval: "never" }). The sandbox is fixed once a thread starts; the approval policy can change between turns. MCP servers inside Codex that request a form (elicitation) are auto-declined.
Parallel work
codex_run({ cwd, prompt: "A", worktree: true, wait_seconds: 0 }) → thread a
codex_run({ cwd, prompt: "B", worktree: true, wait_seconds: 0 }) → thread b
codex_wait({ thread_ids: [a, b] }) → both reportsworktree: true creates ~/.codex-mcp/worktrees/<repo>-<stamp> on a new branch codex/<stamp>. Worktrees are kept for you to inspect and merge. Remove them with git worktree remove <path>.
Notes
codex app-serveris marked experimental by OpenAI, so the protocol may change between Codex versions. Tested with codex-cli 0.163.0. To check a new version, regenerate the types withcodex app-server generate-ts --out <dir>.files_changedlists edits made through Codex's patch tool. Edits made via shell commands show up inrecent_commandsinstead. Review the actual diff.Each new thread starts the MCP servers from your Codex config, so the first turn may take a few seconds.
The default
wait_secondsof 240 has worked well in practice; raise it if your MCP client's tool-call timeout allows.
Development
npm test # offline: real MCP server against a fake app-server (test/fake-codex.mjs)
node test/e2e.mjs /tmp/scratch [repo] # real Codex: models, run, respond, structured output, review (uses quota)
node test/resume.mjs <thread_id> # continue an existing thread from a fresh process中文说明
让 Claude Code 通过 MCP 指挥 Codex:Claude 负责拆任务、验收,Codex 负责动手。多数同类项目每个任务都起一个 codex exec;这个项目常驻一个 codex app-server 进程,直接走它的 JSON 协议,所以能做到下面这些:
线程持久:追加指令发到同一个线程,上下文一直在。
异步、不超时:每次调用最多阻塞
wait_seconds秒,到时返回当前进度,之后用codex_wait接着等。双向沟通:Codex 要审批或者反问时,回合会暂停,请求交给 Claude 用
codex_respond回答,不会一直卡着。追加指令与中断:
codex_steer给正在跑的回合补充指令,codex_interrupt中途停下。原生代码审查:
codex_review,加上adversarial: true会挑战设计本身,不只是找 bug。并行:可以同时开多个线程,
codex_wait批量等待;worktree: true给每个任务一个独立的 git worktree,互不覆盖。能续接:Codex app / CLI 里开的线程,或者重启前的线程,都能接着用。
另外还有:实时状态、模型列表、结构化输出、联网搜索、压缩上下文。
权限默认值:workspace-write + on-request。Codex 只能写工作目录,超出范围要先问,问题会交给 Claude 回答。想完全放开就设 CODEX_SANDBOX=danger-full-access 和 CODEX_APPROVAL=never,具体见上面的 Permissions 一节。
安装只要一行:claude mcp add --scope user codex -- npx -y codex-app-server-mcp。工具列表和配置项见上文。codex app-server 目前是 experimental,Codex 升级后协议可能会变。
License
MIT
Available Tools
10 toolscodex_compactCompact a Codex threadB
Summarize a long Codex thread's history to free up its context window. Runs in the background.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It does disclose that the operation 'Runs in the background' (async execution), which is genuine behavioral value beyond structured fields. However, it omits whether the original history is preserved or replaced, whether compaction is reversible, and any auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action and outcome front-loaded and zero filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param, no-output-schema tool, the description covers the action and async nature adequately. But it leaves the parameter undocumented and omits the data-modifying implications of compaction, so it is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter (thread_id) is never mentioned in the description. The name implies it operates on 'a thread,' but the description adds no meaning about what thread_id should be, its format, or how it is obtained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (summarize/compact) and resource (a Codex thread's history), plus the outcome (free up its context window). It distinguishes itself from siblings by being the only compaction tool, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use it via 'a long Codex thread's history' and 'free up its context window,' which hints at context-exhaustion scenarios. But there is no explicit when/when-not guidance, no prerequisites, and no routing to or from siblings like codex_threads or codex_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_interruptInterrupt a Codex turnC
Stop the running turn on a Codex thread.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It states that the turn is stopped, but does not disclose what happens to the thread afterward, whether the interruption is reversible, whether permissions are required, or what side effects occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. Every word contributes to stating the action and target.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and 0% parameter description coverage, the description is too thin. It omits parameter semantics and behavioral details that an agent would need to invoke the tool confidently in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate for the undocumented thread_id parameter. It only mentions "a Codex thread," which weakly implies the parameter identifies a thread, but gives no format, requiredness, or other meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ("Stop") and resource ("the running turn on a Codex thread"), making the core action immediately clear. It does not, however, differentiate this tool from siblings like codex_steer or codex_run, which could also affect a running turn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as codex_steer or codex_wait. The closest thing is the implied condition that a turn is running, but no prerequisites, exclusions, or alternative-routing advice are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_modelsList Codex modelsB
Models available to this Codex login, with supported reasoning efforts.
| Name | Required | Description | Default |
|---|---|---|---|
| include_hidden | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose one behavioral fact — the listing is scoped to the current Codex login rather than global — but says nothing about whether the call is read-only, whether it hits a network/auth boundary, caching, or what shape the list takes. It leans on the obvious read-only nature of a 'list' without confirming it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste; the resource and scope come first. It is efficient, though arguably too terse to be fully self-sufficient, which keeps it just under the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional param and no output schema, the description covers what is returned at a high level but omits the meaning of include_hidden and any note on output format. Adequate but with a clear, easily closed gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter (include_hidden) is never explained in the description. The agent cannot tell from either source whether hidden models should be included by default or why to enable it, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Codex models) and adds scope detail — models available to 'this Codex login' with supported reasoning efforts. No sibling (codex_run, codex_status, codex_threads, etc.) overlaps with model enumeration, so the agent can immediately place it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention that this is the discovery step preceding codex_run, and no stated alternatives or conditions. Usage is only loosely inferable from the name and resource, which matches the calibration's 'no when-to-use, no prerequisites' = 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_respondAnswer CodexB
Answer a request Codex is blocked on (listed in pending_requests). Approvals take decision: accept | acceptForSession | decline | cancel. Questions take answers: { : "answer" }. Ask the user first when the request is something they should decide.
| Name | Required | Description | Default |
|---|---|---|---|
| answers | No | ||
| decision | No | ||
| request_id | Yes | ||
| wait_seconds | No | Seconds to block before returning a progress snapshot (default 240). Returns early when the turn finishes or Codex needs an answer. The turn keeps running after this returns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the two modes (approvals consume a decision; questions consume an answers map), which is real behavioral context, but it omits side effects, permission needs, or what happens after a decision is submitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose followed by the mode-specific input formats. Little waste, though the final sentence reads as an instruction rather than tool-contract information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must stand alone. It covers the two request shapes and their inputs, but leaves return/blocking behavior largely to the wait_seconds schema and does not describe outcomes of the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%, so the description is expected to compensate. It clarifies the answers map semantics ({question id: "answer"}) and restates the decision enum values, but leaves request_id and the mode-dependent usage of decision vs answers partially implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: answer a request Codex is blocked on, and ties it to the pending_requests list. It distinguishes the two request types (approvals vs questions), making the tool's role clear, though it doesn't explicitly name how it differs from siblings like codex_steer or codex_wait.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one usage instruction ('Ask the user first when the request is something they should decide') and implies usage when a request is pending, but never states when to prefer this over codex_wait or codex_status, and offers no alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_reviewCodex code reviewB
Run Codex's native code review (read-only) in a git repo. The review text comes back in the "review" field. Pass focus and/or adversarial: true for a steerable review that challenges the design, not just bugs.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute path inside the git repository. | |
| focus | No | What to concentrate on, e.g. "concurrency and error handling". | |
| model | No | ||
| effort | No | ||
| target | No | uncommitted changes, the branch vs base_branch, or one commit_sha. | uncommitted |
| commit_sha | No | ||
| adversarial | No | Challenge the approach and assumptions, not just find bugs. | |
| base_branch | No | ||
| wait_seconds | No | Seconds to block before returning a progress snapshot (default 240). Returns early when the turn finishes or Codex needs an answer. The turn keeps running after this returns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two useful traits: the operation is read-only, and the output lands in the 'review' field. It does not cover whether a thread/run is spawned, how it interacts with codex_wait/status/interrupt siblings, or authentication needs. Partial disclosure for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with the core action and the return-field location front-loaded, then the steering hint. No filler. Could be slightly tighter but earns nearly every clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no output schema, explaining that results arrive in the 'review' field is valuable, and the schema documents target/wait_seconds. But the description omits how this relates to the thread-lifecycle siblings (wait/status/interrupt/respond), leaving the agent to infer the async workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56%, so several parameters (model, effort, commit_sha, base_branch) rely on the schema alone. The description does add real meaning for 'focus' and especially 'adversarial' ('challenges the design, not just bugs'), which enriches beyond the schema text. This compensates for some but not all of the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Run Codex's native code review (read-only) in a git repo.' The 'native code review' phrasing distinguishes it from the generic codex_run sibling. It stops short of explicitly contrasting with codex_run's capabilities, so the boundary is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional guidance for one mode ('Pass focus and/or adversarial: true for a steerable review'), which implies when the deeper mode is appropriate. However, it never says when to choose codex_review over codex_run, nor any prerequisites such as needing a thread or authenticated Codex. Usage is implied, not fully framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_runRun a Codex taskA
Give Codex (OpenAI coding agent) a task. Starts a new thread, or continues an existing one when thread_id is given. Blocks up to wait_seconds, then returns status, Codex's latest message, files changed and commands run. status "inProgress" → codex_wait; "waitingForInput" → answer pending_requests with codex_respond. Run several threads in parallel by calling codex_run with wait_seconds: 0 for each, then codex_wait with all thread_ids. Review Codex's changes yourself before reporting them as done.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Absolute working directory. Required for a new thread. | |
| model | No | Model override (see codex_models). Defaults to Codex config. | |
| effort | No | Reasoning effort override, e.g. low | medium | high | xhigh (see codex_models). | |
| prompt | Yes | Instructions for Codex. Be specific: goal, files, constraints, what "done" looks like. | |
| sandbox | No | Sandbox for a new (or resumed) thread; fixed after that. Default: workspace-write. | |
| approval | No | When Codex must ask before acting; can change between turns. "never" auto-approves everything. Default: on-request. | |
| worktree | No | New thread only: run in a fresh git worktree + branch (codex/<stamp>) of cwd's repo, so parallel tasks never collide. The worktree is kept for you to inspect/merge. | |
| thread_id | No | Continue this existing Codex thread (keeps its context). | |
| web_search | No | New thread only: enable live web search for Codex. | |
| wait_seconds | No | Seconds to block before returning a progress snapshot (default 240). Returns early when the turn finishes or Codex needs an answer. The turn keeps running after this returns. | |
| output_schema | No | JSON Schema the final message must follow (structured output). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the blocking model (blocks up to wait_seconds, returns early on completion or input request), that the turn keeps running after return, and exactly what is returned (status, latest message, files changed, commands run). It does not surface sandbox/approval safety implications or that sandbox is fixed per thread, but those live in the schema descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core action comes first, followed by mode selection, return contract, status routing, and the parallel recipe. Every sentence is actionable and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter orchestration tool with no output schema, the description fully covers the call/return/continue loop an agent needs, including the return payload and the follow-up tool for each status. Nothing required to drive the multi-step workflow correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters are already documented. The description adds a little meaning to thread_id (keeps context) and wait_seconds (returns early, turn keeps running), but largely restates what the schema provides; baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Give Codex a task") and immediately distinguishes the two modes (new thread vs. continuing via thread_id). It routes to named siblings codex_wait and codex_respond, so an agent can tell it apart from the other codex_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use routing: status "inProgress" → codex_wait, "waitingForInput" → codex_respond, plus a concrete parallelization recipe (call with wait_seconds: 0, then codex_wait with all thread_ids). It also names when to use thread_id (continuing an existing thread) and adds a self-review caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_statusPeek at CodexA
Non-blocking snapshot of Codex threads in this session: status, what Codex is doing right now, pending requests.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_ids | No | Defaults to every thread used in this session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that the call is non-blocking and returns current activity plus pending requests, which is real behavioral context. But it says nothing about whether it mutates state, whether calling it has side effects, or any auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence front-loads the key trait ('Non-blocking snapshot') and then enumerates the payload. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-required-parameter read tool with full schema coverage and no output schema, the description covers what the agent needs: it is non-blocking and what information it surfaces. Sibling differentiation is implicit rather than explicit, which is the main gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional parameter is fully documented in the schema ('Defaults to every thread used in this session'). The description adds no parameter-level detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a non-blocking snapshot of Codex threads, returning status, activity, and pending requests. The scope ('in this session') and the read-only framing distinguish it from siblings like codex_run, codex_wait, and codex_interrupt.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'non-blocking' framing implies this is the polling/inspection tool to use instead of blocking calls like codex_wait, and 'peek' signals an observation-only call. However, it never explicitly says when to use this versus codex_wait, codex_threads, or codex_status alternatives, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_steerSteer a running Codex turnC
Add instructions to the turn Codex is currently working on, without stopping it.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | ||
| thread_id | Yes | ||
| wait_seconds | No | Seconds to block before returning a progress snapshot (default 240). Returns early when the turn finishes or Codex needs an answer. The turn keeps running after this returns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it only discloses that the turn keeps running. It does not say what happens if no turn is active, whether instructions are queued or injected immediately, whether steering can fail, or what the call returns — all material for a mutation-style tool. The useful blocking behavior is documented only in the schema's wait_seconds field, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler and the key constraint ('without stopping it') placed up front. It is arguably under-specified rather than over-long, but on conciseness and structure alone it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, no-annotation, no-output-schema tool, one sentence leaves significant gaps: failure modes, whether an active turn is required, and the return/progress behavior are all unaddressed. The description does not do enough to let an agent invoke this correctly in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: only wait_seconds is documented, while prompt and thread_id (both required) have no description anywhere. The description adds no parameter meaning at all — it never mentions what the prompt should contain, whether it is additive to the original task, or how thread_id is obtained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (add instructions / steer) and a specific target (the turn Codex is currently working on), which is clear enough to separate it from codex_run or codex_status. It stops short of naming the sibling it is most easily confused with (codex_respond, which presumably supplies the answer Codex is waiting for), so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Without stopping it' implies the precondition that a turn is already running and that this is the non-disruptive alternative to codex_interrupt, but the agent must infer that. No explicit when-to-use, when-not-to-use, or named alternative (e.g., use codex_respond when Codex is blocked on a question) is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_threadsList Codex threadsA
List recent Codex threads (including ones from the Codex app/CLI), newest first. Continue one with codex_run + thread_id.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Only threads with exactly this working directory. | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It does disclose source coverage (app/CLI threads) and sort order (newest first), which is useful, but says nothing about read-only nature, pagination beyond the limit param, or what fields each thread entry contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the core purpose and ordering front-loaded before the follow-up hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should ideally sketch the return shape; it only implies a thread_id exists. For a simple two-optional-param list tool with no annotations, this is adequate but leaves the agent guessing about returned fields and pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: 'cwd' is documented in the schema but 'limit' only carries default/min/max with no explanation. The description adds no parameter meaning at all, so it fails to compensate for the undocumented half.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List recent Codex threads'), adds scope ('including ones from the Codex app/CLI') and ordering ('newest first'). An agent can distinguish it from the codex_run/codex_status siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the next step: 'Continue one with codex_run + thread_id.' That is actionable context, but there is no statement of when NOT to use this tool or how it relates to other listing/status siblings such as codex_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
codex_waitWait for CodexA
Wait for turns on one or more Codex threads, then return their reports. mode "all" (default) returns when every thread is done or blocked on a request; "any" returns as soon as one is.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | all | |
| thread_id | No | ||
| thread_ids | No | Several threads (batch wait). | |
| wait_seconds | No | Seconds to block before returning a progress snapshot (default 240). Returns early when the turn finishes or Codex needs an answer. The turn keeps running after this returns. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It does well on the core trait: it blocks, returns early when a turn finishes or Codex needs an answer, and the turn keeps running afterward (reinforced in wait_seconds). However, it says nothing about permissions, concurrency, or what a 'blocked on a request' state means operationally for the caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and return, then the mode behavior. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter blocking tool with no annotations and no output schema, the description covers return timing and the mode switch reasonably well. It omits authentication needs, whether the call is safe/idempotent, and what the returned 'reports' contain, leaving gaps for a tool whose whole purpose is a side-effect-free wait.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: mode and thread_id have no schema descriptions, while thread_ids and wait_seconds do. The description compensates for mode by defining 'all' vs 'any' semantics, but adds nothing for thread_id or the relationship between thread_id and thread_ids, leaving half the surface unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wait) and resource (turns on Codex threads) plus the return payload (reports), so an agent knows this blocks until turns resolve. It does not explicitly contrast itself with siblings like codex_status, but the blocking-wait semantics are distinctive enough to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the mode-based return conditions (all vs any), which implicitly tells the agent when the call completes, but never says when to prefer this over codex_status or how it relates to codex_run. Usage is implied rather than stated with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.2.0- First observed
codex_compact - First observed
codex_interrupt - First observed
codex_models - First observed
codex_respond - First observed
codex_review - First observed
codex_run - First observed
codex_status - First observed
codex_steer - First observed
codex_threads - First observed
codex_wait
TDQS
Scored across 10 tools
Each tool targets a clearly distinct action in the Codex thread lifecycle. codex_run, codex_wait, and codex_status have explicit boundaries described in their docs, and codex_respond vs codex_steer are differentiated as answering blocked requests versus adding live instructions. No overlapping purposes that would cause misselection.
All tools use a consistent codex_ prefix with lower snake_case and a predictable verb/noun pattern. Names are immediately readable and follow the same convention throughout.
10 tools is well-scoped for managing Codex agent sessions. Each tool covers a necessary operation—run, wait, status, interrupt, review, compact, models, threads, respond, steer—without redundancy.
The surface covers a full agent-session lifecycle: start/continue, monitor, wait, interrupt, respond, steer, review, compact, and list models/threads. Minor gaps exist, such as no explicit thread deletion/archival or full transcript retrieval, but core workflows are covered.
Maintenance
Related MCP Connectors
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
A paid remote MCP for OpenAI Codex context compressor, built to return verdicts, receipts, usage log
No-data MCP handoff for local Claude Code to Codex harness moves. $49 lifetime.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables Claude Code to delegate tasks to OpenAI's Codex CLI (GPT-5.4) with structured execution traces, parallel execution, session persistence, and adversarial code review.15MIT
- AlicenseBqualityDmaintenanceMCP server that enables Claude Code to delegate code generation and debugging to OpenAI Codex, with stall detection and auto-recovery.224 npmMIT
- AlicenseAqualityAmaintenanceEnables Claude Code to delegate coding tasks—investigation, review, long-running background jobs, and optional file edits—to a locally installed OpenAI Codex CLI, with the model and reasoning effort chosen per task and read-only execution by default. Follow-up requests reuse Codex's existing context, and write-enabled delegations can be confined to a managed git worktree so the user's own checkout stays untouched.861 npmMIT
- FlicenseCqualityBmaintenanceEnables Codex to delegate already-scoped coding tasks to Claude Code and manage the resulting execution and fresh read-only review sessions, returning deterministic PASS/FAIL results through a local MCP interface.715-