Skip to main content
Glama

codex-mcp-bridge

영어 버전

Claude Desktop용 MCP 서버로, 공유 Codex 앱 서버를 통해 기존 Codex 스레드에 프롬프트를 직접 전송합니다. macOS, Windows, Linux에서 실행됩니다.

codex exec가 아닙니다(매번 새 세션을 만듭니다). Bridge는 실제 Codex 앱 서버와 JSON-RPC로 통신하므로 스레드는 기록, cwd, 모델 및 롤아웃 파일을 유지합니다.

아키텍처

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)
  • 앱 서버는 포트별 싱글턴입니다. Bridge는 http://127.0.0.1:8791/readyz를 프로브하고, 아직 살아있지 않으면 분리된 프로세스로 자동 생성합니다(codex app-server --listen ws://127.0.0.1:8791). 이 앱 서버는 bridge가 종료된 후에도 독립적으로 계속 실행됩니다.

  • 동일한 URL을 가리키는 모든 클라이언트는 하나의 앱 서버를 사용합니다. 따라서 threadId로 thread/resume을 호출하면 새 세션을 여는 대신 실행 중인 스레드에 다시 연결됩니다.

  • Bridge는 정확히 하나의 WebSocket을 유지하고, initialize를 한 번 수행하며, threadId별로 알림을 라우팅하므로 여러 스레드가 병렬로 실행되어도 서로 섞이지 않습니다.

Related MCP server: webgpt MCP

도구

도구

기능

send_to_codex_thread

threadId에 사용자 턴으로 프롬프트를 보내고, turn/completed를 기다린 후 Codex의 응답 + 활동 기록(실행한 명령, 수정한 파일)을 반환합니다.

list_codex_threads

스레드(id, title, cwd, 업데이트 시각, status)를 나열합니다 — 정확한 threadId를 얻는 데 사용합니다. loadedOnly: true는 앱 서버에서 현재 live 상태인 스레드만 표시합니다. macOS에서는 각 줄에 codex://threads/<id> 딥 링크도 함께 제공합니다.

start_codex_thread

지정한 cwd에서 새 Codex 스레드를 열고 threadId를 반환합니다.

read_codex_thread

스레드의 최근 대화를 읽습니다. 아무것도 보내지 않습니다.

interrupt_codex_turn

실행 중인 턴을 중지합니다.

open_codex_thread

macOS: codex://threads/<id>를 통해 Codex 데스크톱 앱에서 스레드를 열어 사용자가 직접 볼 수 있게 합니다. background: true는 포커스를 빼앗지 않고 엽니다.

codex_bridge_status

환경을 보고합니다: 플랫폼, 확인된 codex 바이너리, 앱 서버 엔드포인트가 살아있는지, macOS의 LaunchAgent 및 데스크톱 앱. 브리지에 문제가 있을 때 가장 먼저 사용합니다.

send_to_codex_thread는 timeoutSec(기본 240), cwd, model, effort, openInApp(macOS — 전송 전에 앱에서 스레드를 열어 라이브로 보기)를 추가로 받습니다. 시간 초과는 턴을 취소하지 않습니다 — bridge는 turnId와 함께 지금까지 수집된 내용을 반환하며, read_codex_thread로 계속 읽거나 interrupt_codex_turn으로 중지할 수 있습니다.

Claude Desktop에 설치

npm install
node scripts/install-claude-desktop.mjs

스크립트는 플랫폼을 자동으로 감지하고, config 파일이 없으면 생성하며, 이전 버전을 백업하고(*.bak-<날짜>-codexbridge), 기존 키는 모두 그대로 유지합니다.

OS

설정 경로

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

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"
      }
    }
  }
}

설치한 후 Claude Desktop을 다시 시작하세요.

codex 바이너리 확인: Claude Desktop(및 launchd)은 PATH가 축소된 상태로 MCP 서버를 실행하므로 codex가 PATH에 없는 경우가 많습니다. Bridge는 다음 순서대로 탐색합니다 — CODEX_BIN → 플랫폼의 일반적인 설치 위치 → PATH:

OS

탐색 순서

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 전용)

Windows

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

macOS/Linux에서 codex는 shebang #!/usr/bin/env node가 있는 Node 스크립트이므로, bridge는 하위 프로세스에 PATH(현재 node 디렉터리 + /opt/homebrew/bin + /usr/local/bin + 시스템 디렉터리)를 다시 주입합니다. 이 단계가 없으면 app-server가 shebang에서 바로 죽습니다.

macOS

launchd로 앱 서버를 백그라운드로 실행

node scripts/install-launch-agent.mjs

~/Library/LaunchAgents/com.codex-mcp-bridge.app-server.plist를 생성하고(RunAtLoad + 충돌 시 KeepAlive, ThrottleInterval 10초), launchctl bootstrap gui/$UID를 실행합니다. 앱 서버는 로그인 시점부터 이미 실행 중이므로 bridge가 직접 생성할 필요가 없고, 스레드는 항상 live 상태입니다.

launchctl print gui/$UID/com.codex-mcp-bridge.app-server | head -20   # trạng thái
node scripts/install-launch-agent.mjs --uninstall                     # gỡ

로그: ~/Library/Logs/codex-mcp-bridge/app-server.{out,err}.log.

Codex 데스크톱 앱에서 스레드를 직접 보기

macOS에서 Codex 데스크톱 앱은 /Applications/ChatGPT.app이며 codex:// 스킴을 등록합니다. Bridge는 codex://threads/<threadId>를 사용하여 정확한 스레드를 엽니다:

open_codex_thread { threadId: "01a0…", background: true }
send_to_codex_thread { threadId: "01a0…", prompt: "…", openInApp: true }

이렇게 하면 작업을 지시한 사람이 작업이 끝난 후 ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl 롤아웃을 다시 읽는 대신 Codex가 작업하는 모습을 직접 볼 수 있습니다.

macOS 제한 사항

  • Codex 데스크톱 앱은 stdio(ChatGPT.app/Contents/Resources/codex … app-server)를 통해 자체 앱 서버를 실행하며 외부 엔드포인트를 받지 않습니다. 앱에서 연 스레드는 여전히 bridge를 통해 보낼 수 있지만, 라이브 연결이 아니라 .jsonl 롤아웃에서 resume하는 방식입니다. 데스크톱 앱에서 턴이 실행 중인 스레드에는 보내지 마십시오 — 두 앱 서버가 동일한 롤아웃에 동시에 쓰면 기록이 손상될 수 있습니다. 먼저 list_codex_threads로 status를 확인하고 idle/notLoaded일 때만 보내십시오.

  • 이중 부팅 머신의 NTFS 파티션(/Volumes/...)에 있는 리포지토리는 macOS에서 읽기 전용입니다 — macOS는 NTFS를 읽기 전용으로 마운트합니다. 실행 및 수정을 위해 APFS 볼륨(예: ~/code/codex-mcp-bridge)에 별도 체크아웃을 유지하세요.

  • codex app-server daemon start는 컨트롤 소켓 ~/.codex/app-server-control/app-server-control.sock과 함께 unix:// 전송을 사용합니다. Bridge는 이 경로를 사용하지 않습니다(프레임 프로토콜이 WebSocket과 다르고 공개 API가 아직 없음) — 항상 ws://로 통신합니다.

환경 변수

변수

기본값

의미

CODEX_APP_SERVER_URL

ws://127.0.0.1:8791

공유 앱 서버 엔드포인트.

CODEX_BIN

자동 탐색

자동 시작에 사용할 codex 경로.

CODEX_BRIDGE_AUTOSTART

1

0 = 앱 서버를 자동으로 생성하지 않음. 이미 실행 중이어야 함.

CODEX_BRIDGE_APPROVAL

approve

Codex의 승인 요청에 응답하는 방식. 거부하려면 deny로 설정.

CLAUDE_DESKTOP_CONFIG

OS별 자동 탐색

install-claude-desktop.mjs 실행 시 config 경로를 강제 지정.

CODEX_EXE

자동 탐색

두 설치 스크립트에 대해 codex 경로를 강제 지정.

승인에 관하여: approval_policy가 never가 아니면 Codex는 명령/패치 승인을 요청합니다. Claude Desktop 앞에서 아무도 클릭하지 않으므로 bridge가 CODEX_BRIDGE_APPROVAL에 따라 자동으로 응답하고 stderr에 로그를 남깁니다. 기본 approve는 ~/.codex/config.toml의 approval_policy = "never" + sandbox_mode = "danger-full-access" 설정과 일치합니다. 샌드박스를 강화했다면 deny로 변경하는 것을 고려하세요.

대화형 Codex 세션과 앱 서버 공유

TUI에서 동일한 엔드포인트를 가리켜 TUI의 스레드와 bridge의 스레드가 하나로 보이게 하세요:

codex --remote ws://127.0.0.1:8791

앱 서버를 수동으로 실행합니다(bridge 자동 시작에 의존하지 않음):

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

테스트

npm run check

빠른 확인: bridge 시작, 필요한 경우 앱 서버 자동 시작, 스레드 나열.

npm run smoke

새 스레드를 만들고 연속으로 2턴을 보낸 다음 Codex가 이전 턴의 코드워드를 기억하는지 확인하는 스모크 테스트 — 즉 스레드가 실제로 연속적이며 매번 새 세션이 아니라는 뜻입니다.

Claude 내에서 환경 확인: codex_bridge_status 도구를 호출하세요.

Available Tools

9 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

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the readOnlyHint annotation by listing exactly what the tool inspects and reports, including liveness checks and desktop/macOS integration details. It does not contradict the annotations, and for a read-only status tool the disclosure of its reported fields is sufficient.

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 immediately states the tool's purpose and then lists the specific items reported, with no redundant phrases or filler. Every clause adds information, and the structure is easy to parse for an agent.

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 simple zero-parameter status tool with readOnlyHint and openWorldHint annotations, the description is complete: it explains what the tool does, what information it exposes, and how it is bounded to the current machine. There is no output schema, so the enumerated report contents compensate appropriately and give the agent a clear model of the return value.

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 the schema coverage is 100% by definition, so there is no parameter semantics to clarify. Per the baseline for zero-parameter tools, this is a solid score; the description accurately describes the tool's fixed scope without pretending there are configurable 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 states a specific verb ('Report') and a specific resource ('how this bridge is wired on the current machine'), then enumerates the concrete facts returned: platform, resolved codex binary, app-server endpoint and liveness, deep-link support, and macOS integrations. This clearly distinguishes it from the sibling tools, all of which are imperative actions rather than status checks.

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 'Report how this bridge is wired' implies this is a diagnostic/status tool to be used when the agent needs environment or connectivity information. However, there is no explicit guidance about when to prefer this over the sibling tools, such as 'check this before delegating' or 'use this when an operation fails.' The usage context is clear but only implied, not stated.

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. 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, 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
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.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, openWorldHint=true, and non-idempotency, so the safety profile is covered. The description adds real context beyond that: a bridge writer lock it must not leave behind, an authorization precondition, Desktop-mode requestId identity rules, and the 40s cap on the overall call even though timeoutSec allows up to 3600. It does not describe auth/credential requirements beyond the user-authorization note.

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 core action is front-loaded in the first sentence, followed by usage, mode rules, and the sibling pointer. Dense but slightly long-winded; the requestId rules repeat what the schema already says, which weakens justification for the length.

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 mutating tool with no output schema, the description covers workflow, mode differences, alternative tools, and lock cleanup. It stops short of stating what is returned (the threadId appears only inside a parameter description) and the failure/error behavior of the call.

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-parameter semantics the schema states per-parameter: a fresh requestId per independent task kept exactly on retries, omission in legacy mode, and the Desktop 40s cap conflicting with the timeoutSec ceiling. That interaction guidance is genuinely additive.

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 precise multi-step verb sequence — create a named session at a project directory, send the prompt, return Codex's reply, hand off to Desktop without leaving the bridge lock behind. It is clearly distinguishable from siblings start_codex_thread and 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 Guidelines5/5

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

It names the triggering condition ('independent new work when the user explicitly or through standing instructions authorizes new conversations') and routes unfinished work to the explicit alternative send_to_codex_thread. Mode-specific guidance (Desktop vs legacy app-server) is also given.

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.

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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds valuable behavioral context: the mode-dependent behavior with turnId and the risk of omitting items without it. This goes beyond the annotation's bare safety profile.

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 sentences with no fluff; the core purpose is front-loaded, and the caveat about turnId is placed second. Every word 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 read-only tool with simple parameters and existing annotations, the description covers the purpose, mode-specific behavior, and parameter context. It lacks explicit output format but that's not required without an output schema, and the schema covers parameter defaults.

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 parameters are already documented. The description adds extra meaning for turnId, explaining it should be the exact turnId from send_to_codex_thread for authoritative data, which enriches the schema's description.

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?

Clearly states the action 'read' and the resource 'Codex thread', with the qualifier 'without sending anything' that distinguishes it from send_to_codex_thread. The mention of Desktop mode and turnId further differentiates it from siblings like 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 Guidelines4/5

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

Provides explicit guidance on when to pass turnId and why, indicating the context of use (read-only). However, it does not explicitly name alternatives or when-not-to-use, though the sibling list implies them.

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. 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, 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
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.3/5.0
Behavior4/5

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

Annotations already declare destructive=true, non-idempotent and open-world, so the mutation/safety profile is partially covered. The description adds real context beyond that: the thread retains full history, cwd and model; Desktop-owned tasks must use Desktop delivery; and a legacy 'active writer' failure has a recovery path via codex_bridge_status. It stops short of describing what a wait/timeout actually returns.

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 core purpose and applicability rule lead the paragraph, and the negative instruction ('Do not close the task, create a replacement, or ask the user to copy the message manually') is a useful closer. It is dense with operational detail by necessity, but a couple of sentences about legacy relay repair sit awkwardly mid-paragraph.

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, no-output-schema orchestration tool in a multi-agent setup, the description covers selection, persistence semantics, Desktop constraints, and failure recovery. Return handling is only implied (the schema notes a 40s cap that still returns a threadId), and the 'wait' behavior on non-Desktop paths is not spelled out, but the essentials are present.

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 all 9 params (including the effort enum range and the 40s Desktop cap) are documented in the schema itself. The description only marginally re-frames cwd/model/name via 'the thread keeps its full history, cwd and model,' so it does not add meaning beyond the structured fields. 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 description 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 start_codex_thread by insisting on 'inside an existing Codex thread' and from delegate_to_codex by tying it to 'the same unfinished task.' An agent can select it without opening the 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?

Explicit when-to-use ('the same unfinished task, including follow-up fixes, clarifications, or results') and when-not-to-use ('independent new work belongs in a new conversation when authorized'), plus a prerequisite ('Use list_codex_threads first if you do not know the threadId'). It also routes Desktop-owned tasks to native delivery, naming the alternative path.

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, 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
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.2/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, idempotentHint=false. The description adds operational details beyond annotations: Desktop mode atomic creation, requestId handling on retries, and that the tool creates a visible task. However, it does not elaborate on why it's destructive or what side effects occur beyond task creation.

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 sentences, front-loaded with the core action and condition, then routing guidance. Every sentence earns its place and there is no redundancy.

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?

Given the tool's complexity (creates a new thread, multiple parameters, mutation), the description covers usage conditions, alternatives, and key behavioral traits. It lacks details on error handling or what happens on failure, but with full schema coverage and annotations, it is largely complete.

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 coverage is 100%, so the schema already documents all parameters thoroughly. The description mentions 'initial prompt' and 'fresh requestId' behavior, which aligns with schema but adds minimal semantics beyond it (e.g., retry consistency). Baseline 3 is appropriate when schema does the heavy lifting.

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: 'Start a new Codex task' and clearly indicates it creates a new thread. It distinguishes itself from siblings by explicitly naming send_to_codex_thread and delegate_to_codex and describing when to use each alternative.

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 provides explicit guidance: use when the user explicitly or through standing instructions authorizes a new conversation; use send_to_codex_thread to continue unfinished work with an original threadId; use delegate_to_codex to also wait for a reply. This covers when to use this tool vs alternatives.

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 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"
        +}
  2. 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"
  3. 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"
        +}
  4. 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"
        +}
  5. 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"
  6. 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

A4/5.0

Scored across 9 tools

Disambiguation3/5

delegate_to_codex, start_codex_thread, and send_to_codex_thread heavily overlap—delegate_to_codex is essentially a superset (create + send + wait), and the new-conversation vs unfinished-work distinction is explained only via lengthy prose that an agent can easily miss. list_codex_threads, read_codex_thread, open_codex_thread, and interrupt_codex_turn are more clearly distinct, but the core conversation-starting trio remains fuzzy.

Naming Consistency4/5

Most tools follow a consistent verb_codex_noun pattern (list_codex_threads, send_to_codex_thread, read_codex_thread, stop_codex_app_server). The main deviation is codex_bridge_status, which flips to a noun-first form, though it is still readable and clearly its own concept.

Tool Count4/5

Nine tools is well-scoped for a bridge that manages Codex sessions, covering session lifecycle, delivery, monitoring, and status. Slightly heavy given the operational overlap among the send/delegate/start trio, but each tool maps to a real capability.

Completeness4/5

The surface covers create (start/delegate), list, read, send, interrupt, open, and status—effectively the full session lifecycle an agent needs. The only notable gap is an explicit thread close/delete operation, but the descriptions imply tasks are intentionally never closed, so this is minor.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers