codex-mcp-bridge
This MCP server bridges Claude, Codex, and Antigravity by relaying tasks between native desktop conversations and independent CLI background workers.
Inspect background relay health, CLI readiness, and recent diagnostics.
List available background workers and task delivery receipts.
Send explicitly authorized work to Codex, Claude, or Antigravity background workers with project path and request ID.
Read or wait for durable background delivery results without replaying unknown work.
Create, list, read, and continue Codex threads/sessions.
Delegate work to a new Codex session and wait for replies.
Interrupt running Codex turns, open threads in Codex Desktop, and stop the shared Codex app-server.
Check and prepare project onboarding, workspace trust, and shared messaging authorization.
Check the local Codex bridge environment, platform support, and app-server status.
Support native desktop handoffs, independent background workers, and remote Codex-over-SSH workflows.
Integrates with OpenAI's Codex CLI and app-server, letting Claude delegate prompts to Codex, resume existing Codex threads, and monitor them in the Codex desktop app.
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-mcp-bridgeSend to my active Codex thread: fix the failing tests in auth.test.ts"
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-mcp-bridge
MCP server for Claude Desktop to send prompts directly into an existing Codex thread, through a shared Codex app-server. Runs on macOS, Windows, and Linux.
Not codex exec (which creates a new session every time). The bridge speaks JSON-RPC with the real Codex app-server, so the thread keeps its history, cwd, model, and rollout file.
Architecture
Claude Desktop ──stdio──> codex-mcp-bridge ──WebSocket──> codex app-server (ws://127.0.0.1:8791)
│
Codex TUI ──codex --remote ws://127.0.0.1:8791───────────────────┘ (cùng app-server, cùng thread live)The app-server is a singleton per port. The bridge probes
http://127.0.0.1:8791/readyz; if it is not alive, it spawns a detached one (codex app-server --listen ws://127.0.0.1:8791), and that app-server keeps running independently after the bridge exits.Every client pointing to the same URL uses the same app-server →
thread/resumewiththreadIdrejoins the actual running thread instead of starting a new session.The bridge keeps exactly one WebSocket, initializes once, and routes notifications by
threadId, so multiple threads running in parallel never interfere with each other.
Related MCP server: webgpt MCP
Tools
Tool | Description |
| Sends a prompt as a user turn into |
| Lists threads (id, title, cwd, last updated, status) — use it to get the right |
| Opens a new Codex thread in a |
| Reads the thread's recent conversation without sending anything. |
| Stops a running turn. |
| macOS: brings the thread up in the Codex desktop app via |
| Reports the environment: platform, resolved |
send_to_codex_thread accepts additional timeoutSec (default 240), cwd, model, effort, and openInApp (macOS — opens the thread in the app before sending so you can watch live). Timing out does not cancel the turn — the bridge returns whatever it has gathered along with turnId; continue reading with read_codex_thread or stop with interrupt_codex_turn.
Install into Claude Desktop
npm install
node scripts/install-claude-desktop.mjsThe script detects the platform, creates the config file if it doesn't exist, backs up the old one (*.bak-<ngày>-codexbridge), and preserves all existing keys:
OS | Config path |
macOS |
|
Windows |
|
Linux |
|
Result on macOS:
{
"mcpServers": {
"codex-bridge": {
"command": "/Users/<user>/.local/node/v24.18.0/bin/node",
"args": ["/Users/<user>/code/codex-mcp-bridge/src/index.mjs"],
"env": {
"CODEX_BIN": "/Users/<user>/.local/bin/codex",
"CODEX_APP_SERVER_URL": "ws://127.0.0.1:8791"
}
}
}
}Restart Claude Desktop after installing.
Resolve the codex binary: Claude Desktop (and launchd) launch the MCP server with a trimmed PATH, so codex is often not on PATH. The bridge searches in this order — CODEX_BIN → the platform's usual install locations → PATH:
OS | Search order |
macOS / Linux |
|
Windows |
|
On macOS/Linux, codex is a Node script with shebang #!/usr/bin/env node, so the bridge also injects PATH (current node directory + /opt/homebrew/bin + /usr/local/bin + system dirs) into child processes — without this step, spawning the app-server dies immediately at the shebang.
macOS
Run the app-server in the background with launchd
node scripts/install-launch-agent.mjsCreate ~/Library/LaunchAgents/com.codex-mcp-bridge.app-server.plist (RunAtLoad + KeepAlive on crash, ThrottleInterval 10s) then launchctl bootstrap gui/$UID. The app-server is already alive from login, so the bridge doesn't have to spawn it, and threads are always in the live state.
launchctl print gui/$UID/com.codex-mcp-bridge.app-server | head -20 # trạng thái
node scripts/install-launch-agent.mjs --uninstall # gỡLog: ~/Library/Logs/codex-mcp-bridge/app-server.{out,err}.log.
View threads directly in the Codex desktop app
The Codex desktop app on macOS is /Applications/ChatGPT.app and registers the codex:// scheme. The bridge uses codex://threads/<threadId> to open the correct thread:
open_codex_thread { threadId: "01a0…", background: true }
send_to_codex_thread { threadId: "01a0…", prompt: "…", openInApp: true }This is how the person assigning the task can watch Codex doing the work instead of having to read back the rollout ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl after it finishes.
Limitations on macOS
The Codex desktop app runs its own app-server via stdio (
ChatGPT.app/Contents/Resources/codex … app-server) and does not accept an external endpoint. Threads opened in the app can still be sent to via the bridge, but by resuming from the.jsonlrollout rather than attaching live. Do not send to a thread currently running a turn in the desktop app — two app-servers writing to the same rollout can corrupt the history. Checkstatuswithlist_codex_threadsfirst, and only send whenidle/notLoaded.A repo on an NTFS partition of a dual-boot machine (
/Volumes/...) is read-only on macOS — macOS mounts NTFS read-only. Keep a separate checkout on an APFS volume (e.g.~/code/codex-mcp-bridge) to run and edit.codex app-server daemon startusesunix://transport with control socket~/.codex/app-server-control/app-server-control.sock. The bridge does not use this path (a framing protocol different from WebSocket, and no public API yet) — it always talks overws://.
Environment
Variable | Default | Meaning |
|
| The shared app-server endpoint. |
| auto-detected | Path to |
|
|
|
|
| How to answer approval requests from Codex. Set |
| auto-detected per OS | Force the config path when running |
| auto-detected | Force the |
About approval: Codex will ask to approve commands/patches if approval_policy is not never. No one is sitting in front of Claude Desktop to click, so the bridge automatically answers according to CODEX_BRIDGE_APPROVAL and logs to stderr. The default approve matches the configuration approval_policy = "never" + sandbox_mode = "danger-full-access" in ~/.codex/config.toml; if you tighten the sandbox, consider switching to deny.
Sharing the app-server with an interactive Codex session
Open the TUI pointing at the same endpoint so threads in the TUI and the bridge see them as one:
codex --remote ws://127.0.0.1:8791Run the app-server manually (independent of bridge autostart):
codex app-server --listen ws://127.0.0.1:8791Testing
npm run checkQuick check: the bridge starts, autostarts the app-server if needed, lists threads.
npm run smokeSmoke test creates a new thread, sends 2 consecutive turns, and verifies Codex remembers the codeword from the previous turn — i.e., the thread is truly continuous rather than a new session each time.
Check the environment from inside Claude: call the codex_bridge_status tool.
Available Tools
16 toolscodex_bridge_statusCheck the Codex bridge environmentARead-only
Report how this bridge is wired on the current machine: platform, resolved codex binary, app-server endpoint and whether it is live, plus desktop deep-link support and macOS integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Optional intended target project directory to check before sending; does not grant access |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description earns credit by disclosing the concrete contents of the report (platform, resolved codex binary, app-server endpoint and liveness, deep-link support, macOS integrations), which is meaningful for a tool with no output schema.
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 front-loaded sentence that enumerates the reported fields without filler. The list is dense but each item adds information rather than restating the 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?
With no output schema, the description appropriately describes what the report contains, and annotations cover safety. The remaining gap is guidance on when in a workflow to run it and how to interpret a 'not live' result.
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?
There is a single optional parameter with 100% schema description coverage, so the schema carries the semantics. The description never mentions 'cwd' or explains what checking an intended target directory yields, so 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 ('Report') and a specific resource (how the bridge is wired on this machine), then enumerates the facets checked. It is clearly a diagnostic/status tool, distinguishable in kind from the action-oriented siblings like open_codex_thread or stop_codex_app_server, though no sibling is named.
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?
Usage is only implied: a status/diagnostic tool that an agent would naturally call as a preflight before delegating. There is no explicit statement of when to call it versus inspect_bridge_project or prepare_bridge_project, nor any exclusion or prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delegate_to_codexDelegate work to a new Codex sessionADestructive
Create a named Codex session at the requested project directory, send Claude's prompt into it, return Codex's reply, and hand the session to Codex Desktop without leaving the bridge writer lock behind. Use for independent new work when the user explicitly or through standing instructions authorizes new conversations. Desktop creation returns a durable deliveryId; on timeout continue with wait_codex_reply instead of resending. In Desktop mode, supply a fresh requestId per independent task and keep it on retries; omit requestId in legacy app-server mode. Use send_to_codex_thread for unfinished work.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute project directory where Codex must work | |
| name | No | Optional Codex session title; otherwise one is derived from the prompt | |
| model | No | Model override, e.g. gpt-5.6-luna | |
| effort | No | Override reasoning effort (default whatever ~/.codex/config.toml says) | |
| prompt | Yes | The complete task Claude is delegating to Codex. The prompt for the recipient agent, with an explicit From Codex or From Claude header naming the actual author, all agent-authored text in English including the header purpose, and the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim | |
| openInApp | No | Explicitly show the task in Codex Desktop while it runs. Default is false unless CODEX_BRIDGE_OPEN_IN_APP=1; normal delivery does not navigate or focus a window. | |
| requestId | No | Desktop creation identity: fresh UUID for each independent new task; retain exactly on retries. Omitting it preserves legacy title/prompt deduplication and can return an older task. Not supported in legacy app-server mode. | |
| timeoutSec | No | How long to observe the task (Desktop caps the entire call, including creation, at 40s; the task continues and its threadId is returned) | |
| releaseAfterTurn | No | Unsubscribe this thread after a terminal turn; open Desktop only after its unload is confirmed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/non-idempotent/open-world, and the description adds genuinely new behavioral facts: the bridge writer lock is released, Desktop creation yields a durable deliveryId, timeout means continue rather than resend, and the 40s Desktop cap lets the task keep running. This is exactly the beyond-annotation context the dimension rewards.
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?
Front-loaded with the full operation sequence, then the mode-specific rules, then the sibling pointer. Dense but each clause carries operational information; a few phrases (e.g. the lock-release detail) sit awkwardly mid-sentence, slightly impeding scanability.
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?
With 9 parameters, no output schema, and a mode split (Desktop vs legacy app-server), the description covers what comes back (Codex's reply, deliveryId, threadId) and how to proceed on timeout. Nothing an agent needs before calling it 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 coverage is 100%, so the baseline is 3, but the description adds real semantics for requestId (fresh UUID per independent task, retained on retries, omitted in legacy app-server mode) and for timeout/resend behavior that the schema property text alone frames more narrowly. It stops short of explaining cwd/name/model choices, so not a 5.
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 concrete verb chain (create session, send prompt, return reply, hand off to Desktop) on a specific resource, and explicitly contrasts itself with send_to_codex_thread for 'unfinished work'. An agent can distinguish this from start_codex_thread or send_to_worker 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?
It states when to use it ('independent new work when the user explicitly or through standing instructions authorizes new conversations') and names two alternatives with their triggering conditions: wait_codex_reply on Desktop timeout, and send_to_codex_thread for unfinished work. Exclusions are explicit rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_bridge_projectCheck project onboardingARead-onlyIdempotent
Read workspace trust and this bridge process's effective messaging authorization without changing files. Reports the authorization mode separately from shared project-policy state; a missing policy is a prerequisite only when nextActions says so. Distinguishes configured files from untested live connections. Same-project and new-task checks are reported as not checked here. Card extension authorization is a separate check. Does not send messages or create conversations.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Exact existing project directory selected by the user; worktrees resolve to their verified primary repository | |
| taskCards | No | Include the existing card extension's authorization/connection checks in nextActions; does not silently edit extension settings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/idempotent annotations: it warns that authorization mode is reported separately from shared project-policy state and that a missing policy is only a prerequisite when nextActions says so, which prevents a common misreading of results. It also clarifies that configured files are distinguished from untested live connections. What it omits is any indication of the response shape or how nextActions is structured.
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 non-mutation guarantee and the core purpose are front-loaded, and every sentence carries distinct information with no filler. The telegraphic fragments ('Card extension authorization is a separate check.') are efficient but slightly staccato, making the paragraph read as a checklist rather than a coherent framing.
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?
With no output schema, the description carries the burden of explaining what comes back, and it does so at a useful level: authorization mode, project-policy state, configured-versus-live distinction, and nextActions. The result is sufficient to interpret a response correctly, though the exact fields of nextActions remain undefined.
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 both cwd and taskCards are already documented, including the worktree resolution rule and the no-silent-edit guarantee. The description only indirectly touches taskCards via 'Card extension authorization is a separate check' and adds no new meaning for cwd, so the baseline of 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?
Opens with a specific verb and resource set: 'Read workspace trust and this bridge process's effective messaging authorization without changing files.' That is clearly distinct from mutation-oriented siblings such as prepare_bridge_project and from thread/worker messaging tools, though it never names those siblings directly.
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?
Provides meaningful scoping guidance: card extension authorization is a separate check, same-project and new-task checks are not performed here, and it 'does not send messages or create conversations.' This effectively excludes the wrong use cases, but it stops short of pointing at which sibling to call instead for those excluded checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interrupt_codex_turnInterrupt a Codex turnBDestructiveIdempotent
Stop a turn that is still running in a Codex thread.
| Name | Required | Description | Default |
|---|---|---|---|
| turnId | Yes | Turn id reported by send_to_codex_thread | |
| threadId | Yes | Codex thread id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, and the description is consistent with them. It adds the useful state precondition (the turn must still be running) but does not disclose what happens to the interrupted turn's partial output, whether the thread remains usable, or what errors surface if the turn already completed.
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 sentence with zero filler, and the key qualifier ('still running') is front-loaded. It is arguably under-sized for a destructive operation, but there is no wasted text to trim.
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?
This is a destructive, open-world mutation with no output schema, and the description leaves the important consequences unexplained: what happens to in-flight output, whether the thread state is preserved, and what the caller receives on success or on an already-finished turn. An agent has to guess at the aftermath of the interrupt.
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%, so threadId and turnId are already documented, including the pointer that turnId comes from send_to_codex_thread. The description adds no further meaning about either parameter, 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?
The description states a specific verb ('Stop') and resource ('a turn that is still running in a Codex thread'), which is more precise than the title. It implicitly distinguishes itself from stop_codex_app_server by scoping to a single turn, but never names that sibling to make the distinction explicit.
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 'still running' precondition implies when the tool applies, but there is no explicit guidance on when to interrupt versus letting a turn finish, nor any pointer to stop_codex_app_server for the server-level alternative. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_codex_threadsList Codex threadsARead-only
List recent Codex threads (id, title, cwd, last update, status) so you can pick the exact threadId to talk to.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Only threads whose session cwd matches this path exactly | |
| limit | No | How many threads to return (default 15) | |
| loadedOnly | No | Only threads currently loaded/live inside this app-server (default false) | |
| searchTerm | No | Substring filter on the thread title |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, open-world operation. The description adds useful context by naming returned fields (id, title, cwd, last update, status), but it does not discuss ordering, pagination defaults, or whether archived threads are included.
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 tightly written sentence that front-loads the operation and immediately explains its purpose. Nothing is redundant or misplaced.
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 full schema coverage and annotations covering safety, the description is nearly complete. It names the returned fields and the selection purpose, though it could mention ordering or default recency 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 description coverage is 100%, so all four parameters are already documented in the schema. The description does not add parameter-level meaning beyond what the schema provides, so the baseline of 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?
The description states a specific verb and resource ('List recent Codex threads') and clarifies the output fields, so the agent can distinguish it from thread-reading or messaging tools. It implies the downstream action ('pick the exact threadId to talk to') but does not name the sibling tool 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?
It gives implied usage: call this to find a threadId before talking to a thread. It does not explicitly state when not to use it, nor does it name alternative tools such as open_codex_thread or read_codex_thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workersList background workersARead-onlyIdempotent
List independently identified CLI workers and this caller's background task receipts. These are separate from Desktop chats; never use a native chat ID as a worker destination.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds context the annotations do not: the listing includes both CLI workers and background task receipts, and worker identities are distinct from chat IDs — a real behavioral caveat for downstream calls.
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 short sentences, front-loaded with what is listed and followed by the disambiguation caveat. Every clause carries information; there is no 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?
With no parameters, no output schema, and read-only annotations, the description covers what the tool returns at a functional level and how its identifiers differ from chat IDs. It could mention roughly what fields a worker entry has, but nothing needed to invoke it correctly is absent.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter-level detail is missing.
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 two concrete resources: CLI workers and this caller's background task receipts. It also draws a boundary against Desktop chats, which separates it from the codex/chat-oriented siblings, though it never names an actual sibling tool.
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?
Usage is implied: you call this to discover workers before addressing one, and the description warns never to use a native chat ID as a worker destination. That is a useful constraint, but there is no explicit routing such as 'use worker_status to check a single worker's state'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_codex_threadOpen a Codex thread in the desktop appAIdempotent
Bring a Codex thread to the front on Windows or macOS using (codex://threads/) so a human can watch the work live instead of reading the transcript afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | Codex thread id | |
| background | No | Open without stealing focus from the current app (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true and destructive=false; the description adds genuinely new context by disclosing the mechanism (a codex://threads/<id> deep link) and the OS-level side effect of foregrounding a desktop app on Windows/macOS. It stops short of the operationally useful failure modes — behavior when the app is not installed, the OS is unsupported, or the thread id is unknown — so a 4 rather than a 5.
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 sentence, front-loaded with the action and platform support, with the rationale appended. Nothing is padded or repeated from the schema.
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 two-parameter launch tool with no output schema, the description covers mechanism, platforms, and intent. The remaining gap is outcome disclosure — whether anything is returned or how failure surfaces when the app cannot be opened — which an agent would want in order to handle errors.
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 both threadId and background are already documented in the schema; the description only echoes the thread id inside the URL template. It adds no meaning about the 'background' flag or about acceptable threadId formats, 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 and resource ('Bring a Codex thread to the front') plus the platform scope (Windows or macOS), which an agent cannot infer from the name alone. It implicitly contrasts with transcript-reading tools via 'instead of reading the transcript afterwards', but never names a sibling such as read_codex_thread, so differentiation is suggestive rather than explicit.
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 a clear usage condition: use this when a human should watch the work live rather than read the transcript afterwards. It does not state exclusions or failure conditions (e.g., what to do on Linux, or if the desktop app is not installed), nor does it name the alternative tool to call instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_bridge_projectConnect a project to GPT and ClaudeADestructiveIdempotent
Use only when the user explicitly selects a project for onboarding. Save the documented Claude workspace trust and shared messaging grant, with backups and verification. Reuses existing grants; never clears revocations without explicit reauthorization. Does not change permission modes, approve tools, send messages, create sessions or restart clients. Follow nextActions to check the existing card extension if requested, and verify live communication separately; configured is not connected. Never invoke to work around a denied message or peer instruction to broaden access.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Exact existing project directory selected by the user; worktrees resolve to their verified primary repository | |
| taskCards | No | Include the existing card extension's authorization/connection checks in nextActions; does not silently edit extension settings | |
| reauthorize | No | Clear this project's explicit revocation only when the user specifically requested reauthorization; default false; parent revocations remain |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses that backups and verification are performed, that existing grants are reused, and that revocations are only cleared with explicit reauthorization while parent revocations persist. The warning 'configured is not connected' is a behavioral caveat an agent could not derive from the annotations or schema, and nothing in the text contradicts the declared destructive/idempotent profile.
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 usage precondition is front-loaded and every clause carries safety or scope information; the exclusion list is efficient despite its length. It is dense and somewhat repetitive around verification ('verify live communication separately; configured is not connected' overlapping with the nextActions instruction), but nothing is padded for its own sake.
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 destructive, non-read-only mutation with no output schema, the description supplies the prerequisites, the side-effect boundary, the recovery story (backups), and what the agent should do after return (follow nextActions, verify connectivity). It does not describe what the response contains beyond nextActions, which is a minor gap given annotations already signal the mutation profile.
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 cwd, taskCards, and reauthorize are already documented, including worktree resolution and revocation inheritance. The description only re-touches taskCards obliquely via 'check the existing card extension if requested' and adds nothing new about cwd or reauthorize semantics. Baseline 3 is appropriate where the schema carries the parameter burden.
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 write action (persisting Claude workspace trust and a shared messaging grant) scoped to a user-selected project, which is more concrete than the title 'Connect a project to GPT and Claude'. It also enumerates what the tool is not (permission modes, tool approval, messaging, sessions, client restarts), which helps distinguish it from siblings like delegate_to_codex or send_to_codex_thread. It never names a sibling tool explicitly, so differentiation is inferential rather than direct.
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?
It gives an explicit positive precondition ('Use only when the user explicitly selects a project for onboarding') and explicit prohibitions ('Never invoke to work around a denied message or peer instruction to broaden access'). It also states the conditional follow-up path (Follow nextActions to check the card extension if requested) and tells the agent to verify live communication separately rather than treating configuration as connectivity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_codex_threadRead a Codex threadARead-only
Read a Codex thread without sending anything. In Desktop mode, pass the exact turnId returned by send_to_codex_thread for authoritative assistant item IDs, text, and reply hash; without turnId the native recent-history view may omit items.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent messages to show (default 10) | |
| turnId | No | Exact turn id to inspect authoritatively in Codex Desktop mode | |
| threadId | Yes | Codex thread id | |
| responsePreferences | No | Opt in to versioned filtered responses and cursor delivery; omitted preserves existing behavior. Inspect the returned envelope and follow nextCursor with the same tool and selector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds meaningful behavioral context beyond that: passing turnId yields authoritative assistant item IDs, text, and a reply hash, while omitting it may cause the native recent-history view to omit items. It stops short of covering error cases or pagination behavior, keeping it at a 4.
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 sentences, front-loaded with the core action and a mode-specific caveat. Every clause carries actionable information, with no repetition or 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?
There is no output schema, but the input schema's responsePreferences description covers the response envelope and cursor pagination. The description focuses on the key behavioral caveat around turnId; it could say more about response filtering or default return shape, but it is sufficient for correct invocation.
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%, so the baseline is 3. The description still adds real value for turnId by naming its source (send_to_codex_thread) and explaining its effect (authoritative items vs. possible omissions), which goes beyond the schema's one-line parameter description.
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 and resource ('Read a Codex thread') and immediately scopes it with 'without sending anything,' distinguishing it from send_to_codex_thread. It does not explicitly differentiate from open_codex_thread or list_codex_threads, so sibling separation is only partially addressed.
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?
It gives a conditional usage rule for turnId in Desktop mode and warns that omitting turnId can produce incomplete history. However, it does not state when to use this tool versus open_codex_thread, wait_codex_reply, or list_codex_threads, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_worker_deliveryRead background deliveryARead-onlyIdempotent
Read or wait for a durable background task receipt using its original requestId. A queued receipt is not a completed response. Failed and unknown receipts include the report block to show directly in this chat. Unknown work is never automatically replayed.
| Name | Required | Description | Default |
|---|---|---|---|
| waitSec | No | Maximum seconds to wait for a terminal receipt; zero returns immediately. | |
| requestId | Yes | The original request ID returned by send_to_worker. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds real behavioral context: queued is not completed, failed/unknown receipts carry a report block for direct display, and unknown work is never auto-replayed. It stops short of describing timeout behavior for waitSec or the set of terminal states.
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?
Four short sentences, front-loaded with the core action and scoping constraint. Each sentence carries information; only the 'show directly in this chat' phrasing is slightly incidental.
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 two-parameter read-only poll tool with no output schema, the description covers what comes back at a high level (receipt, report block on failure) and the non-replay guarantee. Output shape details are not needed given the annotations and schema coverage.
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?
With 100% schema description coverage, both parameters are already documented, including waitSec's semantics. The description aligns with the schema by noting requestId originates from send_to_worker, but adds no format or edge-case detail beyond it.
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 (read/wait) on a specific resource (durable background task receipt) keyed by requestId. It distinguishes itself from send_to_worker by referencing 'its original requestId' and by clarifying that a queued receipt is not a completed response, though it does not explicitly name siblings like worker_status.
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?
Makes the polling/waiting context clear and warns against treating a queued receipt as a final answer. It does not explicitly state when to prefer worker_status or list_workers, leaving the sibling routing implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_to_codex_threadSend a prompt to a Codex threadADestructive
Send a prompt as a new user turn inside an existing Codex thread and wait for Codex to answer. Use only for the same unfinished task, including follow-up fixes, clarifications, or results; independent new work belongs in a new conversation when authorized. The thread keeps its full history, cwd and model. Use list_codex_threads first if you do not know the threadId. Desktop-owned tasks must use Desktop native delivery; an open task is a valid destination. A Desktop send prepares a durable deliveryId before dispatch. An ambiguous acknowledgement is marked unconfirmed, never accepted without evidence. If it times out, continue automatically with wait_codex_reply using that ID; never resend to obtain the answer. If legacy delivery reports an active writer, inspect codex_bridge_status and repair the native relay/configuration. Do not close the task, create a replacement, or ask the user to copy the message manually.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Expected destination directory; Desktop always checks the verified sender's project and cannot change the task's workspace | |
| name | No | Optional title to show for this Codex session | |
| model | No | Override the model for this turn | |
| effort | No | Override reasoning effort (default whatever ~/.codex/config.toml says) | |
| prompt | Yes | The message to send to Codex as a new user turn. The prompt for the recipient agent, with an explicit From Codex or From Claude header naming the actual author, all agent-authored text in English including the header purpose, and the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim | |
| threadId | Yes | Codex thread id (UUID) - get it from list_codex_threads | |
| openInApp | No | Explicitly open the thread in Codex Desktop so a human can watch it live. Default is false unless CODEX_BRIDGE_OPEN_IN_APP=1; normal delivery does not navigate or focus a window. | |
| timeoutSec | No | How long to observe the task (Desktop caps the entire call at 40s; the task continues and its threadId is returned) | |
| releaseAfterTurn | No | Unsubscribe this thread after a terminal turn; open Desktop only after its unload is confirmed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true, openWorld=true, idempotent=false, and the description adds real behavioral context beyond them: a durable deliveryId is prepared before dispatch, ambiguous acknowledgements are marked unconfirmed rather than accepted, and Desktop calls are capped at 40s while the task continues. The no-resend and no-manual-copy rules are exactly the failure-mode guidance an agent needs.
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?
Purpose and the core usage constraint are front-loaded in the first two sentences, and no sentence is filler. The trailing runbook of edge cases (unconfirmed acks, legacy writer, don't close the task) is dense and slightly sprawling, but each clause maps to a real failure mode rather than restating the schema.
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, non-idempotent, destructive, long-running call with no output schema, the description covers the risky parts: sync vs. async behavior, the 40s Desktop cap, return of a threadId, and what to do on timeout or ambiguity. Nothing an agent must know to invoke it safely 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 coverage is 100% and each parameter carries a detailed description, so the schema does the heavy lifting and baseline 3 applies. The description only marginally supplements it, notably that the thread retains cwd and model, which hints that model/cwd are per-turn overrides rather than durable state changes.
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 (send a prompt as a new user turn inside an existing Codex thread) plus the blocking behavior (wait for the answer). It also draws the line against the obvious sibling by saying independent new work belongs in a new conversation, which separates it from start_codex_thread and delegate_to_codex.
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 (same unfinished task, follow-up fixes, clarifications, results) and when-not (independent new work in a new conversation). It also routes to concrete siblings for the prerequisite and recovery paths: list_codex_threads when the threadId is unknown, wait_codex_reply on timeout, codex_bridge_status when a legacy writer blocks delivery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_to_workerSend work to a background agentADestructiveIdempotent
Queue explicitly authorized work to a separate background CLI worker in an explicitly selected, authorized project. This does not address, open or resume any Desktop chat. Generate requestId once and keep it for retries; an uncertain result must be inspected with read_worker_delivery, never resent under another ID. Use worker-relay tools for subsequent cross-agent delegation. Work continues independently when Desktop apps close or freeze.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute path to the explicitly selected and authorized project. | |
| agent | Yes | The separate CLI agent that will perform this authorized task. | |
| prompt | Yes | Complete authorized task brief, including context, scope, constraints and completion criteria. Never request a Desktop chat substitution. | |
| requestId | Yes | Generate once for this independent task and reuse for retries; inspect this ID after any uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag idempotentHint=true and openWorldHint=true, and the description reinforces idempotency with concrete retry semantics (generate requestId once, reuse on retry, inspect rather than resend). It also adds context annotations cannot express — the work continues independently when Desktop apps close or freeze. The gap is destructiveHint=true: nothing explains what side effects are possible or what authorization guarantees make them safe, so the strongest annotation hint goes unelaborated.
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?
Four sentences, front-loaded with the positive action before the exclusions and the retry rule, with no filler. Mild cost: 'explicitly' appears three times and the authorization caveat is restated in both description and schema, making it slightly denser than needed.
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 destructive, open-world, idempotent queued job with no output schema, the description covers preconditions, retry discipline and the recovery tool. The one omission is what a successful call yields — a delivery identifier an agent then passes to read_worker_delivery — which is only inferable from the recovery instruction rather than stated.
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%, so baseline is 3. The description still adds meaning beyond the schema for requestId — generate once, persist across retries, and resolve ambiguity via read_worker_delivery rather than a new ID — which is a usage contract the pattern/format definition cannot convey. The 'explicitly authorized project' framing similarly adds an authorization bar to cwd that the schema only calls 'absolute path'.
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 and resource — queue authorized work to a separate background CLI worker in a selected project — and immediately draws the boundary against the Desktop-chat siblings ("does not address, open or resume any Desktop chat"). Between that exclusion and the pointer to worker-relay tools, an agent can distinguish this from delegate_to_codex, send_to_codex_thread and start_codex_thread 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?
It gives explicit when-not guidance (no Desktop chat substitution), an explicit recovery path for a specific failure mode (uncertain result → read_worker_delivery, never resend under another ID), and routes follow-on delegation to the worker-relay tools. The preconditions — explicitly authorized project and explicitly selected cwd — are stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_codex_threadStart a new Codex threadADestructive
Start a new Codex task when the user explicitly or through standing instructions authorizes a new conversation for independent work. In Desktop mode include the initial prompt and a fresh requestId to create and assign a visible task atomically; keep requestId unchanged on retries. Continue unfinished work with send_to_codex_thread and its original threadId. Use delegate_to_codex to also wait for its reply.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute working directory for the new Codex session | |
| name | No | Optional title to show for the new Codex session | |
| model | No | Model override, e.g. gpt-5.6-luna | |
| prompt | No | Initial task; required with CODEX_BRIDGE_DESKTOP_TASKS=1, starts immediately. The prompt for the recipient agent, with an explicit From Codex or From Claude header naming the actual author, all agent-authored text in English including the header purpose, and the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim | |
| requestId | No | Desktop creation identity: fresh UUID per independent task, same UUID on retries. Omit only for legacy title/prompt deduplication. Not supported in legacy app-server mode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real operational context beyond the annotations: Desktop-mode task creation is atomic, prompt is required when CODEX_BRIDGE_DESKTOP_TASKS=1, and requestId must be reused on retries. However, annotations declare destructiveHint=true and openWorldHint=true, and the description never explains what side effects or persistence justify the destructive flag, so the safety profile stays opaque.
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?
Usage condition is front-loaded, then the Desktop-mode mechanics, then sibling routing — a sensible order. Sentences are dense but each carries distinct information; the requestId clause is slightly repetitive with the schema.
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 five-parameter creation tool with full schema coverage and no output schema, the description covers authorization, mode requirements, retry identity, and sibling routing. Remaining gaps are the unexplained destructive/edit side effects and the absence of any mention of what the call returns (e.g., the new threadId needed for follow-up).
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%, so all five parameters are already documented in the schema, including the requestId retry/dedup rules and the prompt formatting contract. The description restates the requestId retry discipline and prompt requirement without adding format or mode details the schema lacks, so it sits at baseline.
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 gives a specific verb+resource ('Start a new Codex task') and scopes it to 'a new conversation for independent work', which separates it from send_to_codex_thread (continue unfinished work) and delegate_to_codex (also waits for the reply). It never addresses the closely related sibling open_codex_thread, leaving an obvious ambiguity unresolved.
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?
It states the authorization condition for use ('explicitly or through standing instructions') and names two alternatives with the condition that selects each. It gives no negative guidance and does not explain when open_codex_thread would be preferred over this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_codex_app_serverStop the shared Codex app-serverADestructiveIdempotent
Stop the shared app-server this bridge talks to. Use it when work is handed off and the Codex desktop app is open: two app-servers on the same ~/.codex state make the app stutter. The bridge starts a new one automatically the next time it needs it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal idempotent and destructive, and the description adds meaningful context beyond them: the shared-server scope, the stuttering problem it prevents, and automatic restart by the bridge on next use. It does not detail effects on in-flight Codex threads, but 'when work is handed off' and the auto-start note cover the main behavioral concerns.
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 short sentences, each earning its place: what it stops, when to use it and why, and what happens next. The key trigger is front-loaded after the opening statement.
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 zero-parameter, no-output-schema tool, the description covers purpose, trigger conditions, rationale, and post-call behavior. The sibling context and annotations complete the picture without requiring extra prose.
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?
The tool has zero parameters and 100% schema coverage, so there is no parameter meaning to add. The description correctly implies this is a direct action with no inputs.
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 and resource: 'Stop the shared app-server this bridge talks to.' It distinguishes this tool from the thread/turn siblings by naming the bridge's app-server as the target, making its unique role clear.
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?
It gives an explicit trigger: 'Use it when work is handed off and the Codex desktop app is open,' plus the reason ('two app-servers on the same ~/.codex state make the app stutter'). It also reassures about the next startup, so an agent knows when it is safe and expected to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_codex_replyContinue waiting for a Codex replyARead-onlyIdempotent
Continue a Desktop creation or send using its deliveryId; an unconfirmed acknowledgement does not prove delivery, including after MCP reconnect. Never sends a message or creates a task. On timeout, call again with the same deliveryId; do not ask the user to fetch the answer or resend. Stops for approval, user input or a verification error. Only the original verified Claude session and accounts can use the receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| deliveryId | Yes | Exact deliveryId returned by send_to_codex_thread, delegate_to_codex or start_codex_thread | |
| timeoutSec | No | Bounded observation time, default 40 seconds; repeat with the same receipt if still running | |
| responsePreferences | No | Opt in to versioned filtered responses and cursor delivery; omitted preserves existing behavior. Inspect the returned envelope and follow nextCursor with the same tool and selector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnly/idempotent, and the description adds real behavioral context beyond them: an unconfirmed acknowledgement does not prove delivery even after MCP reconnect, retries must reuse the same deliveryId, and only the original verified Claude session and accounts can use the receipt. Those auth and idempotency semantics are not derivable from the annotations or schema.
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?
Four dense sentences, front-loaded with the core action and the most failure-prone guidance (retry with the same deliveryId). The opening clause 'Continue a Desktop creation or send using its deliveryId' is slightly awkward, but no sentence 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?
There is no output schema, and the description compensates by naming terminal outcomes (stops for approval, user input, verification error) and the retry loop. It does not describe the response envelope shape, though the nested responsePreferences schema covers cursor delivery, so the remaining gap is minor.
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%, so the baseline is 3, but the description earns extra credit by explaining the receipt lifecycle: the deliveryId persists across timeout retries and is the handle the agent must reuse rather than re-send. It adds no detail on responsePreferences, but the schema already documents that envelope and cursor flow.
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 states a specific action on a specific resource: continue waiting on a Desktop creation/send identified by deliveryId, and it explicitly says it 'Never sends a message or creates a task,' which separates it from send_to_codex_thread and delegate_to_codex. It never names those siblings directly, so the differentiation 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?
It gives explicit when-to-use rules ('On timeout, call again with the same deliveryId'), explicit when-not-to ('do not ask the user to fetch the answer or resend'), and explicit stop conditions (approval, user input, verification error). This is the strongest dimension of the definition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worker_statusInspect background relayARead-onlyIdempotent
Inspect the independent background relay, CLI readiness and recent diagnostic reports. Desktop apps may be closed or frozen. Transport readiness is separate from each CLI's authentication/model readiness. authentication-unverified with canAcceptWork=true is informational: that CLI lacks an auth probe and may run authorized work. Do not call it an authentication failure; report actual job failures from their receipts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a safe, read-only, idempotent status inspection. The description adds substantial non-obvious behavioral context: transport readiness is separate from CLI authentication/model readiness, authentication-unverified can still accept work, and actual job failures should be reported from receipts.
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 front-loaded with the core purpose and each subsequent sentence adds relevant interpretive guidance. It is slightly dense, but there is no obvious filler or repetition.
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?
With no output schema, the description does more than most by explaining key status semantics and avoiding a common misreading of authentication-unverified. It still does not describe the overall response shape or clarify its relationship to sibling status tools, which keeps it from being fully 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?
The tool has zero parameters, so there are no parameter semantics for the description to clarify. A baseline score of 4 is appropriate because the schema is empty and complete for this status-inspection operation.
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 gives a specific verb/resource set: inspecting the independent background relay, CLI readiness, and recent diagnostic reports. It is clear what the tool does, but it does not explicitly differentiate itself from sibling status/list tools such as list_workers or codex_bridge_status.
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?
It provides useful usage context for interpreting statuses, including that desktop apps may be closed/frozen and that authentication-unverified with canAcceptWork=true is informational rather than a failure. However, it does not say when to use this tool instead of alternatives like list_workers or codex_bridge_status.
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.
6 tool updates
v1.26.3- Changed
delegate_to_codex1 field changed- changed
Input schema / properties / openInApp / descriptionPrevious value: -"Show the task in Codex Desktop; native tasks open immediately while running"New value: +"Explicitly show the task in Codex Desktop while it runs. Default is false unless CODEX_BRIDGE_OPEN_IN_APP=1; normal delivery does not navigate or focus a window."
- Added
list_workers - Added
read_worker_delivery - Changed
send_to_codex_thread1 field changed- changed
Input schema / properties / openInApp / descriptionPrevious value: -"Open the thread in Codex Desktop on Windows or macOS so a human can watch it live"New value: +"Explicitly open the thread in Codex Desktop so a human can watch it live. Default is false unless CODEX_BRIDGE_OPEN_IN_APP=1; normal delivery does not navigate or focus a window."
- Added
send_to_worker - Added
worker_status
11 tool updates
v1.23.0- Changed
codex_bridge_status1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
delegate_to_codex2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / requestId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
inspect_bridge_project1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
interrupt_codex_turn1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_codex_threads1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
open_codex_thread1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
prepare_bridge_project1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
read_codex_thread1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
send_to_codex_thread1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
start_codex_thread2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / requestId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
wait_codex_reply2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / deliveryId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
8 tool updates
v1.22.2- Changed
codex_bridge_status2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / cwdAdded value: +{ + "description": "Optional intended target project directory to check before sending; does not grant access", + "type": "string" +}
- Changed
delegate_to_codex1 field changed- changed
Input schema / properties / prompt / descriptionPrevious value: -"The complete task Claude is delegating to Codex. The prompt for the recipient agent, in English with the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"New value: +"The complete task Claude is delegating to Codex. The prompt for the recipient agent, with an explicit From Codex or From Claude header naming the actual author, all agent-authored text in English including the header purpose, and the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"
- Added
inspect_bridge_project - Added
prepare_bridge_project - Changed
read_codex_thread1 field changed- added
Input schema / properties / responsePreferencesAdded value: +{ + "additionalProperties": false, + "description": "Opt in to versioned filtered responses and cursor delivery; omitted preserves existing behavior. Inspect the returned envelope and follow nextCursor with the same tool and selector.", + "properties": { + "delivery": { + "additionalProperties": false, + "properties": { + "options": { + "additionalProperties": false, + "properties": { + "cursor": { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + "maxBytes": { + "maximum": 98304, + "minimum": 8192, + "type": "integer" + } + }, + "type": "object" + }, + "type": { + "const": "cursorPagination", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "filter": { + "additionalProperties": false, + "properties": { + "includeReasoning": { + "type": "boolean" + }, + "includeToolPayloads": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" +}
- Changed
send_to_codex_thread1 field changed- changed
Input schema / properties / prompt / descriptionPrevious value: -"The message to send to Codex as a new user turn. The prompt for the recipient agent, in English with the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"New value: +"The message to send to Codex as a new user turn. The prompt for the recipient agent, with an explicit From Codex or From Claude header naming the actual author, all agent-authored text in English including the header purpose, and the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"
- Changed
start_codex_thread1 field changed- changed
Input schema / properties / prompt / descriptionPrevious value: -"Initial task; required with CODEX_BRIDGE_DESKTOP_TASKS=1, starts immediately. The prompt for the recipient agent, in English with the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"New value: +"Initial task; required with CODEX_BRIDGE_DESKTOP_TASKS=1, starts immediately. The prompt for the recipient agent, with an explicit From Codex or From Claude header naming the actual author, all agent-authored text in English including the header purpose, and the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"
- Added
wait_codex_reply
3 tool updates
v1.19.3- Changed
delegate_to_codex1 field changed- added
Input schema / properties / requestIdAdded value: +{ + "description": "Desktop creation identity: fresh UUID for each independent new task; retain exactly on retries. Omitting it preserves legacy title/prompt deduplication and can return an older task. Not supported in legacy app-server mode.", + "format": "uuid", + "type": "string" +}
- Changed
send_to_codex_thread1 field changed- changed
Input schema / properties / cwd / descriptionPrevious value: -"Override the working directory for this turn"New value: +"Expected destination directory; Desktop always checks the verified sender's project and cannot change the task's workspace"
- Changed
start_codex_thread1 field changed- added
Input schema / properties / requestIdAdded value: +{ + "description": "Desktop creation identity: fresh UUID per independent task, same UUID on retries. Omit only for legacy title/prompt deduplication. Not supported in legacy app-server mode.", + "format": "uuid", + "type": "string" +}
3 tool updates
v1.18.0- Changed
delegate_to_codex1 field changed- changed
Input schema / properties / prompt / descriptionPrevious value: -"The complete task Claude is delegating to Codex"New value: +"The complete task Claude is delegating to Codex. The prompt for the recipient agent, in English with the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"
- Changed
send_to_codex_thread1 field changed- changed
Input schema / properties / prompt / descriptionPrevious value: -"The message to send to Codex, exactly as a user would type it"New value: +"The message to send to Codex as a new user turn. The prompt for the recipient agent, in English with the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"
- Changed
start_codex_thread1 field changed- changed
Input schema / properties / prompt / descriptionPrevious value: -"Initial task; required with CODEX_BRIDGE_DESKTOP_TASKS=1, starts immediately"New value: +"Initial task; required with CODEX_BRIDGE_DESKTOP_TASKS=1, starts immediately. The prompt for the recipient agent, in English with the sections Goal, Context, Task, Scope, Constraints, Done when, Reply format (omit any that do not apply); text the user supplied is sent verbatim"
1 tool update
v1.16.1- Changed
read_codex_thread1 field changed- added
Input schema / properties / turnIdAdded value: +{ + "description": "Exact turn id to inspect authoritatively in Codex Desktop mode", + "type": "string" +}
TDQS
Scored across 16 tools
Several tools have genuinely overlapping purposes: delegate_to_codex vs start_codex_thread vs send_to_codex_thread all create/send into Codex sessions, and inspect_bridge_project vs worker_status vs codex_bridge_status vs list_workers are all status/inspection tools with subtle distinctions. The verbose descriptions try to carve boundaries, but an agent could easily misselect among the thread-management and status tools.
Most tools follow a predictable snake_case verb_noun pattern (send_to_codex_thread, list_codex_threads, prepare_bridge_project). The main deviations are noun-first status tools (worker_status, codex_bridge_status) and a few verb_to_noun names, which are minor but break the pattern.
Sixteen tools is just above the comfortable 3-15 range but reasonable for a bridge that manages Codex threads, background workers, project trust, and app-server lifecycle. The count is slightly heavy but each tool maps to a real operation.
Coverage is broad: thread list/read/start/send/delegate/interrupt/open, worker send/read/list/status, project inspect/prepare, and bridge status/stop. Minor gaps exist (no thread archive/delete, no explicit worker task cancellation), but core lifecycles are covered.
Maintenance
Related MCP Connectors
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Connect ChatGPT and Claude to your Mac, Windows or Linux with secure MCP remote access.
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server for managing Claude Code conversation sessions1238 npmMIT
- FlicenseNot gradedqualityDmaintenanceLocal MCP server for Codex to send prompts to ChatGPT Web Pro extension and manage repository tasks safely.1-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that bridges Claude Desktop with Claude Code, allowing users to delegate tasks to Claude Code directly from Claude Desktop conversations, supporting both synchronous and background execution with session reuse.8 npmMIT
- AlicenseAqualityDmaintenanceMCP server that lets Claude Code drive the local Codex CLI as a sub-agent for concurrent queries and optional file/shell actions, using the CLI's existing login and sessions.484 npm1MIT