Skip to main content
Glama

codex-mcp-bridge

English version

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/resume with threadId rejoins 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

send_to_codex_thread

Sends a prompt as a user turn into threadId, waits for turn/completed, and returns Codex's reply + activity trail (commands run, files modified).

list_codex_threads

Lists threads (id, title, cwd, last updated, status) — use it to get the right threadId. loadedOnly: true shows only threads that are live in the app-server. On macOS each line also includes the deep link codex://threads/<id>.

start_codex_thread

Opens a new Codex thread in a cwd, returns threadId.

read_codex_thread

Reads the thread's recent conversation without sending anything.

interrupt_codex_turn

Stops a running turn.

open_codex_thread

macOS: brings the thread up in the Codex desktop app via codex://threads/<id> so the user can watch directly. background: true opens it without stealing focus.

codex_bridge_status

Reports the environment: platform, resolved codex binary, whether the app-server endpoint is alive, LaunchAgent + desktop app on macOS. Use it first when the bridge has issues.

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.mjs

The 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

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

${XDG_CONFIG_HOME:-~/.config}/Claude/claude_desktop_config.json

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

~/.local/bin/codex → ~/.npm-global/bin/codex → /opt/homebrew/bin/codex → /usr/local/bin/codex → ~/.volta/bin → ~/.bun/bin → ~/.cargo/bin → ~/.codex/packages/standalone/current/codex → /Applications/ChatGPT.app/Contents/Resources/codex (macOS only)

Windows

%LOCALAPPDATA%\Programs\OpenAI\Codex\bin\codex.exe → %APPDATA%\npm\codex.cmd → %ProgramFiles%\nodejs\codex.cmd

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.mjs

Create ~/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 .jsonl rollout 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. Check status with list_codex_threads first, and only send when idle/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 start uses unix:// 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 over ws://.

Environment

Variable

Default

Meaning

CODEX_APP_SERVER_URL

ws://127.0.0.1:8791

The shared app-server endpoint.

CODEX_BIN

auto-detected

Path to codex for autostart.

CODEX_BRIDGE_AUTOSTART

1

0 = do not spawn the app-server; it must already be running.

CODEX_BRIDGE_APPROVAL

approve

How to answer approval requests from Codex. Set deny to refuse.

CLAUDE_DESKTOP_CONFIG

auto-detected per OS

Force the config path when running install-claude-desktop.mjs.

CODEX_EXE

auto-detected

Force the codex path for the two installer scripts.

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:8791

Run the app-server manually (independent of bridge autostart):

codex app-server --listen ws://127.0.0.1:8791

Testing

npm run check

Quick check: the bridge starts, autostarts the app-server if needed, lists threads.

npm run smoke

Smoke 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

12 tools
codex_bridge_statusCheck the Codex bridge environmentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoOptional intended target project directory to check before sending; does not grant access

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower. The description adds that this is a local environment introspection covering binary resolution, endpoint liveness, and OS integrations, but it discloses no further behavior beyond what is inspected and does not repeat or conflict with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence that lists the inspected facets without filler. It is slightly dense as a single clause chain, but every enumerated item earns its place by telling the agent what the report contains.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the enumeration of reported fields (platform, binary, endpoint, liveness, deep-link, macOS integrations) usefully stands in for a return-value description. The remaining gap is that it never states prerequisites or the recommended moment to run the check.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single optional parameter and 100% schema description coverage, the schema already fully documents 'cwd', including the important non-granting caveat. The description adds nothing about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Report' plus the resource 'how this bridge is wired on the current machine' is specific, and the description enumerates the exact facets inspected (platform, resolved codex binary, app-server endpoint and liveness, deep-link support, macOS integrations). This unambiguously separates it from every sibling, which all operate on threads, turns, or project preparation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to call this instead of the thread/agent siblings or when not to call it. Usage is only implied: the liveness and endpoint fields suggest a pre-flight/troubleshooting check before delegating, which an agent can infer but is never told.

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 sessionA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesAbsolute project directory where Codex must work
nameNoOptional Codex session title; otherwise one is derived from the prompt
modelNoModel override, e.g. gpt-5.6-luna
effortNoOverride reasoning effort (default whatever ~/.codex/config.toml says)
promptYesThe 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
openInAppNoShow the task in Codex Desktop; native tasks open immediately while running
requestIdNoDesktop 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.
timeoutSecNoHow long to observe the task (Desktop caps the entire call, including creation, at 40s; the task continues and its threadId is returned)
releaseAfterTurnNoUnsubscribe this thread after a terminal turn; open Desktop only after its unload is confirmed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructive/openWorld/idempotent=false annotations: it discloses that the bridge writer lock must not be left behind, that Desktop creation returns a durable deliveryId and caps calls at 40s while the task continues, and that requestId/deduplication behavior differs between Desktop and legacy app-server modes. This is exactly the operational context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The four sentences are dense but front-loaded, leading with the full action and following with authorization, timeout, and mode-specific rules. Slightly crowded with mode-switching advice, but each clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, multi-mode mutation tool with no output schema, the description covers authorization, timeout recovery, mode-specific requestId handling, and session handoff. It does not explain return values (deliveryId/threadId) beyond the schema, which is acceptable given the schema carries them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 cross-cutting semantics: fresh requestId per independent task retained on retries, omitting it can return an older task, and requestId is unsupported in legacy app-server mode. It also clarifies the timeout-continue path, though per-parameter detail largely duplicates the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource sequence (create session, send prompt, return reply, hand off to Desktop) and explicitly contrasts with the sibling send_to_codex_thread for unfinished work. An agent can distinguish it from start_codex_thread and open_codex_thread without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Specifies when to use it ('independent new work when the user explicitly or through standing instructions authorizes new conversations'), names the fallback on timeout (wait_codex_reply instead of resending), and routes unfinished work to send_to_codex_thread. Explicit when/alternatives coverage.

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 onboardingA
Read-onlyIdempotent

Read workspace trust and shared messaging authorization without changing files. Distinguishes configured files from untested live connections. Card extension authorization is a separate check. Does not send messages or create conversations.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesExact existing project directory selected by the user; worktrees resolve to their verified primary repository
taskCardsNoInclude the existing card extension's authorization/connection checks in nextActions; does not silently edit extension settings

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint, idempotentHint and closed-world behavior, so the bar is lower, and the description still adds genuine context: it separates 'configured files' from 'untested live connections' and scopes card extension authorization as a distinct check. This goes beyond what the structured fields convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, front-loaded sentences with no filler; the read-only scope leads and the exclusions follow. Slightly repetitive since 'Does not send messages' overlaps with the readOnlyHint annotation, but the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description hints at what the inspection yields (configured vs. untested connections) and clearly bounds what it will not do. It is adequate for a two-parameter read tool, though it could say more about the returned onboarding state.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with only two params, so the schema carries the semantics; the description's note that card extension authorization is a 'separate check' loosely relates to taskCards but adds no syntax or behavioral detail for cwd. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('workspace trust and shared messaging authorization') plus the non-mutating constraint. It carves out adjacent concerns ('Card extension authorization is a separate check'), but never names the obvious sibling prepare_bridge_project, so an agent must infer the read/inspect vs. prepare pairing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through negation ('without changing files', 'Does not send messages or create conversations'), which rules out a few wrong uses, but there is no explicit when-to-use statement or named alternative for the read-vs-prepare decision. The agent gets boundaries, not routing.

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 turnA
DestructiveIdempotent

Stop a turn that is still running in a Codex thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
turnIdYesTurn id reported by send_to_codex_thread
threadIdYesCodex thread id

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true and readOnlyHint=false, so the description carries a lower burden. It adds the useful condition that the turn must be still running, but it does not disclose side effects such as whether partial output is lost or whether the thread remains usable after interruption.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no redundant content. It conveys the action, target, and condition in twelve words, making it highly efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with full schema coverage and annotations covering the destructive and idempotent nature, the description captures the core action and the key condition (still running). It lacks only minor detail about post-interruption behavior, which is not essential for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters have clear descriptions in the schema (turnId is reported by send_to_codex_thread, threadId is the Codex thread id). The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Stop') and resource ('a turn ... in a Codex thread'), clearly distinguishing it from sibling tools that operate on threads or the app server. The qualifying phrase 'still running' further narrows the scope and makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'still running' implies the intended use case—interrupting an active turn—but the description provides no explicit guidance on when not to use it or how it relates to alternatives like stop_codex_app_server. No when-to-use or when-not-to-use conditions are 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 threadsA
Read-only

List recent Codex threads (id, title, cwd, last update, status) so you can pick the exact threadId to talk to.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoOnly threads whose session cwd matches this path exactly
limitNoHow many threads to return (default 15)
loadedOnlyNoOnly threads currently loaded/live inside this app-server (default false)
searchTermNoSubstring filter on the thread title

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and openWorldHint=true, so this is clearly a non-destructive operation. The description adds value by specifying the exact output fields and its purpose, which is especially useful since no output schema is present. It does not describe sorting or the exact source scope, but the annotations lower the bar for side-effect disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb, resource, and output fields, then states the practical purpose. There is no redundant filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 a fully described schema and no required parameters, the description is nearly complete: it names the output fields and the intended follow-up action. It could be slightly more explicit about whether it lists only app-server-loaded threads or all persistent threads, but the loadedOnly parameter and sibling context make this a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (cwd, limit, loadedOnly, searchTerm) already has a meaningful description, including the default limit of 15. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair ('List recent Codex threads') and enumerates the returned fields (id, title, cwd, last update, status). It also gives a clear goal — picking the exact threadId to talk to — which distinguishes this read-only listing tool from sibling action tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: before interacting with a thread, when the agent needs to resolve a threadId. It does not explicitly name sibling alternatives or state when not to use it, so it stops short of a 5.

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 appA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
threadIdYesCodex thread id
backgroundNoOpen without stealing focus from the current app (default false)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotent, non-destructive), the description adds platform scope, the URI scheme, and the UI-focus side effect. It does not cover failure behavior such as an invalid thread ID or the desktop app not running, but there is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that front-loads the action and resource, then gives the purpose. No filler and no repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus schema adequately cover the key call details for a low-complexity UI-focus operation. It does not explicitly state return or error behavior, but no output schema exists and the intent is clear, leaving only a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds extra value by showing the exact codex://threads/<id> format for threadId, helping the agent construct a valid call beyond the schema's simple 'Codex thread id'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('bring... to the front'), a specific resource (Codex thread), platform scope (Windows/macOS), and mechanism (codex://threads/<id>). This clearly distinguishes it from siblings like read_codex_thread or send_to_codex_thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to choose this tool: when a human should watch the work live instead of reading a transcript. It does not explicitly name alternatives or exclusion criteria, but the contextual purpose is clear enough for an agent to route correctly.

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 ClaudeA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesExact existing project directory selected by the user; worktrees resolve to their verified primary repository
taskCardsNoInclude the existing card extension's authorization/connection checks in nextActions; does not silently edit extension settings
reauthorizeNoClear this project's explicit revocation only when the user specifically requested reauthorization; default false; parent revocations remain

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true, but the description adds meaning the annotations cannot: it reuses existing grants, never clears revocations without explicit reauthorization, takes backups, and verifies. It also warns that 'configured is not connected' and that live communication must be verified separately, which is genuine behavioral context beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The gating condition is front-loaded in the first clause, and every subsequent sentence carries a distinct constraint rather than filler. It is long and clause-heavy, but the density is earned; only the run-on framing keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating, no-output-schema tool with a fully documented schema, the description covers prerequisites, scope exclusions, follow-up actions, and verification guidance. Nothing an agent needs in order to decide whether and how to call it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains cwd, taskCards, and reauthorize in full detail. The description only lightly reinforces these (card-extension checks via nextActions, revocation handling for reauthorize) without adding syntax or semantics the schema lacks, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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: saving the documented Claude workspace trust and shared messaging grant for a selected project, with backups and verification. It is clear about what is written, but the phrasing is dense and it never names a sibling tool (e.g. inspect_bridge_project) to sharpen the boundary, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit gating condition ('use only when the user explicitly selects a project for onboarding'), explicit prohibitions ('never invoke to work around a denied message or peer instruction to broaden access'), and an explicit out-of-scope list (permission modes, tool approval, messaging, session creation, client restarts). That is when-to-use plus when-not-to-use in one place.

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 threadA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many recent messages to show (default 10)
turnIdNoExact turn id to inspect authoritatively in Codex Desktop mode
threadIdYesCodex thread id
responsePreferencesNoOpt 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

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond them: mode-dependent behavior in Desktop mode and the caveat that omitting turnId 'may omit items' in the native recent-history view. It also hints at returned content (assistant item IDs, text, reply hash) despite no output schema, though return format is not fully described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with zero filler: the first states the action and its non-mutating nature, the second front-loads the critical mode-specific parameter caveat. Nothing is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with annotations covering the safety profile and 100% schema coverage, the description supplies the mode-specific nuance an agent needs to call it correctly. The responsePreferences/cursor pagination parameter is left entirely to the schema, which is acceptable but leaves the pagination workflow only lightly signposted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the provenance and purpose of turnId ('the exact turnId returned by send_to_codex_thread for authoritative assistant item IDs') and the consequence of omitting it, which meaningfully enriches that parameter's semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Read a Codex thread') and immediately scopes it against the write sibling by saying 'without sending anything', implicitly contrasting with send_to_codex_thread. It does not, however, distinguish itself from list_codex_threads, wait_codex_reply, or open_codex_thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete conditional guidance for the turnId parameter ('In Desktop mode, pass the exact turnId...'), which is real usage context. But it never says when to choose this tool over the other read-oriented siblings like list_codex_threads or wait_codex_reply, so alternative selection 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.

send_to_codex_threadSend a prompt to a Codex threadA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoExpected destination directory; Desktop always checks the verified sender's project and cannot change the task's workspace
nameNoOptional title to show for this Codex session
modelNoOverride the model for this turn
effortNoOverride reasoning effort (default whatever ~/.codex/config.toml says)
promptYesThe 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
threadIdYesCodex thread id (UUID) - get it from list_codex_threads
openInAppNoOpen the thread in Codex Desktop on Windows or macOS so a human can watch it live
timeoutSecNoHow long to observe the task (Desktop caps the entire call at 40s; the task continues and its threadId is returned)
releaseAfterTurnNoUnsubscribe this thread after a terminal turn; open Desktop only after its unload is confirmed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the mutating/open-world/destructive profile; the description adds substantially more: a durable deliveryId is prepared before dispatch, ambiguous acknowledgements are marked unconfirmed, timeouts must be continued via wait_codex_reply rather than resent, and active-writer conflicts require codex_bridge_status. It also states explicit prohibitions (do not close the task, do not resend, do not ask the user to copy manually), which directly operationalizes the non-idempotent/destructive hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the same-task constraint are front-loaded in the first two sentences, with recovery procedures after. It is dense and roughly 180 words for a 9-parameter stateful tool, so a couple of sentences could be trimmed, but nearly every clause is actionable rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating, non-idempotent, 9-parameter tool with no output schema and heavy delivery-state complexity, the description covers failure modes, timeout continuation, acknowledgement ambiguity, and recovery paths. An agent has everything it needs to invoke and recover correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents threadId, cwd, prompt, timeout, and release semantics. The description adds only marginal parameter-level meaning (e.g., the cwd project check, the threadId discovery hint, the deliveryId that feeds wait_codex_reply) and is silent on name, model, effort, and openInApp.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource ('Send a prompt as a new user turn inside an existing Codex thread and wait for Codex to answer'). It distinguishes itself from siblings like start_codex_thread and delegate_to_codex by scoping to an *existing* thread. An agent can select it 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use ('same unfinished task, including follow-up fixes, clarifications, or results') and when-not ('independent new work belongs in a new conversation'). It also names concrete alternatives for adjacent needs: list_codex_threads for discovery, wait_codex_reply for timeouts, codex_bridge_status for legacy writer problems.

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 threadA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesAbsolute working directory for the new Codex session
nameNoOptional title to show for the new Codex session
modelNoModel override, e.g. gpt-5.6-luna
promptNoInitial 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
requestIdNoDesktop 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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true and idempotentHint=false, so the mutation/world-facing profile is covered structurally. The description adds real context beyond that: Desktop-mode atomic creation and assignment of a visible task, the prompt requirement implied by CODEX_BRIDGE_DESKTOP_TASKS=1, and retry semantics via a stable requestId. Minor tension with idempotentHint=false, since reusing requestId on retries is presented as safe, but this describes dedup identity rather than a true contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the authorization condition and then routing; every clause carries decision-relevant information. It is slightly packed with mode-specific detail, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter, non-idempotent, open-world creation tool with no output schema, the description covers eligibility, mode differences, retry identity and sibling routing. It never says what the call yields (e.g., a new threadId needed by send_to_codex_thread), which is the one gap for an agent that must chain calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; every parameter is already documented in the schema. The description reinforces the prompt/requestId relationship ('include the initial prompt and a fresh requestId ... keep requestId unchanged on retries') but adds no syntax, format, or constraint detail beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Start a new Codex task' — and immediately scopes it to authorized new conversations for independent work. It explicitly tells the agent how this differs from send_to_codex_thread (continuing existing work) and delegate_to_codex (waiting for a reply), so it is separable from siblings without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition (user authorization, explicit or standing) and names two alternatives with the conditions that select them: 'Continue unfinished work with send_to_codex_thread and its original threadId' and 'Use delegate_to_codex to also wait for its reply.' Nothing 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.

stop_codex_app_serverStop the shared Codex app-serverA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 replyA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deliveryIdYesExact deliveryId returned by send_to_codex_thread, delegate_to_codex or start_codex_thread
timeoutSecNoBounded observation time, default 40 seconds; repeat with the same receipt if still running
responsePreferencesNoOpt 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

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the readOnly/idempotent annotations: unconfirmed acknowledgements are not proof, behavior survives MCP reconnect, it never mutates, timeout repeats the same receipt, it stops for approval/user input/verification error, and it is limited to the original verified session/accounts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and constraints in five dense sentences with no obvious filler. Some terms like 'receipt' and 'Desktop creation or send' are less self-contained than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers complex async polling behavior, retries, stop conditions, auth, and safety annotations, while the schema handles parameter details. Return values are not described, though the responsePreferences schema hints at envelope and cursor handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already documents all three parameters in detail, including deliveryId sources, timeoutSec bounds/default, and responsePreferences cursor behavior, so baseline is 3. The description reinforces reusing the same deliveryId but adds little syntax or meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the tool continues waiting on a Desktop creation/send via deliveryId and explicitly says it never sends a message or creates a task, which distinguishes it from send/create siblings. The title supplies the 'Codex reply' framing, though the description itself is slightly indirect about waiting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the retry pattern on timeout with the same deliveryId and warns not to ask the user to fetch or resend; also gives stop conditions and an auth constraint. It lacks explicit sibling names or a direct 'use after send_to_codex_thread' comparison.

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.

  1. 8 tool updatesv1.22.2
    • Changedcodex_bridge_status2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / cwd
        Added value: +{
        +  "description": "Optional intended target project directory to check before sending; does not grant access",
        +  "type": "string"
        +}
    • Changeddelegate_to_codex1 field changed
      • changedInput schema / properties / prompt / description
        Previous 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"
    • Addedinspect_bridge_project
    • Addedprepare_bridge_project
    • Changedread_codex_thread1 field changed
      • addedInput schema / properties / responsePreferences
        Added 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"
        +}
    • Changedsend_to_codex_thread1 field changed
      • changedInput schema / properties / prompt / description
        Previous 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"
    • Changedstart_codex_thread1 field changed
      • changedInput schema / properties / prompt / description
        Previous 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"
    • Addedwait_codex_reply
  2. 3 tool updatesv1.19.3
    • Changeddelegate_to_codex1 field changed
      • addedInput schema / properties / requestId
        Added 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"
        +}
    • Changedsend_to_codex_thread1 field changed
      • changedInput schema / properties / cwd / description
        Previous 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"
    • Changedstart_codex_thread1 field changed
      • addedInput schema / properties / requestId
        Added 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. 3 tool updatesv1.18.0
    • Changeddelegate_to_codex1 field changed
      • changedInput schema / properties / prompt / description
        Previous 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"
    • Changedsend_to_codex_thread1 field changed
      • changedInput schema / properties / prompt / description
        Previous 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"
    • Changedstart_codex_thread1 field changed
      • changedInput schema / properties / prompt / description
        Previous 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"
  4. 1 tool updatev1.16.1
    • Changedread_codex_thread1 field changed
      • addedInput schema / properties / turnId
        Added value: +{
        +  "description": "Exact turn id to inspect authoritatively in Codex Desktop mode",
        +  "type": "string"
        +}
  5. 3 tool updates
    • Changeddelegate_to_codex2 fields changed
      • changedInput schema / properties / openInApp / description
        Previous value: -"Open the finished session in Codex Desktop on Windows or macOS"New value: +"Show the task in Codex Desktop; native tasks open immediately while running"
      • changedInput schema / properties / timeoutSec / description
        Previous value: -"How long to wait for the turn to finish (default 240s)"New value: +"How long to observe the task (Desktop caps the entire call, including creation, at 40s; the task continues and its threadId is returned)"
    • Changedsend_to_codex_thread1 field changed
      • changedInput schema / properties / timeoutSec / description
        Previous value: -"How long to wait for the turn to finish (default 240s)"New value: +"How long to observe the task (Desktop caps the entire call at 40s; the task continues and its threadId is returned)"
    • Changedstart_codex_thread1 field changed
      • addedInput schema / properties / prompt
        Added value: +{
        +  "description": "Initial task; required with CODEX_BRIDGE_DESKTOP_TASKS=1, starts immediately",
        +  "minLength": 1,
        +  "type": "string"
        +}
  6. 2 tool updatesv1.12.3
    • Changeddelegate_to_codex1 field changed
      • changedInput schema / properties / releaseAfterTurn / description
        Previous value: -"Stop the bridge app-server after a terminal turn so Codex Desktop owns the writer lock"New value: +"Unsubscribe this thread after a terminal turn; open Desktop only after its unload is confirmed"
    • Changedsend_to_codex_thread1 field changed
      • changedInput schema / properties / releaseAfterTurn / description
        Previous value: -"Stop the bridge app-server after a terminal turn so Codex Desktop owns the writer lock"New value: +"Unsubscribe this thread after a terminal turn; open Desktop only after its unload is confirmed"
  7. 9 tool updatesv1.11.2
    • First observedcodex_bridge_status
    • First observeddelegate_to_codex
    • First observedinterrupt_codex_turn
    • First observedlist_codex_threads
    • First observedopen_codex_thread
    • First observedread_codex_thread
    • First observedsend_to_codex_thread
    • First observedstart_codex_thread
    • First observedstop_codex_app_server

TDQS

A3.9/5.0

Scored across 12 tools

Disambiguation3/5

Several tools overlap in starting and continuing Codex conversations (start_codex_thread, delegate_to_codex, send_to_codex_thread, wait_codex_reply), making it easy to misselect despite detailed descriptions. Read/list/open and inspect/prepare have clearer boundaries, but the conversation lifecycle tools are subtle.

Naming Consistency4/5

Mostly consistent snake_case with verb_noun or verb_to_noun patterns. One outlier is codex_bridge_status (noun-first), and delegate_to_codex uses an unusual 'to_codex' suffix, but the set remains readable and predictable overall.

Tool Count4/5

12 tools is reasonable for a bridge covering thread management, messaging, project authorization, and app-server lifecycle. No excessive bloat, though a few conversation tools could potentially be consolidated.

Completeness4/5

Covers listing, reading, opening, sending, interrupting, starting/stopping app-server, status, and project onboarding. Minor gaps like thread archiving or deletion exist, but core bridge workflows are well represented.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers