claude-codex-mcp-bridge
A local MCP server that gives Claude and Codex agents a shared message mailbox plus a way to launch autonomous Codex coding runs in isolated git worktrees.
Register agents (
bridge_register) to announce a name and optional capability list so others can discover it.Send messages (
bridge_send) between named agents or broadcast to*, with optional thread IDs and idempotency keys to avoid duplicates.Read mailboxes (
bridge_inbox) with unread messages hidden once acknowledged, or include acknowledged history.Block and wait (
bridge_wait) to keep a turn alive up to 290 seconds for a matching message, optionally filtered by sender or thread and auto-acknowledged on return.Acknowledge messages (
bridge_ack) so handled items drop out of the unread inbox while history is preserved.Read threads (
bridge_thread) to get the full oldest-first history of a conversation.List agents (
bridge_agents) to see who is registered and what they can do.Run Codex workers (
bridge_orchestrate_codex) on a repository path with round and worktree controls, returning a structured result without granting commit, push, deploy or deletion permissions.Resume Codex runs (
bridge_continue_codex) with an answer when Codex asks for help, picking up the same saved session and worktree.Inspect run state (
bridge_orchestration_status) to recover durable run state and audit events after a restart.
Enables OpenAI Codex to communicate with Claude Code through the same bridge, allowing Codex to receive tasks, respond, and resume saved sessions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@claude-codex-mcp-bridgeOrchestrate Codex to fix the failing tests in the project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
A local MCP bridge for Claude Code and OpenAI Codex. It gives a team of Claude and Codex conversations a durable SQLite mailbox, background pings between them, and saved Codex workers that run in a pinned sandbox and report back on their own.
Claude Code ──stdio MCP──┐
├── local SQLite WAL store (private to your user)
Codex ──stdio MCP──┘The default mode has no account, cloud relay, HTTP server or listening network port.
Why
Plain MCP tools are request-response. Writing a message to a mailbox does not automatically start a new model turn in another chat. The bridge supports three patterns:
Background pings (experimental, macOS): bind each conversation once with
wake: "auto"; a durable message pings an idle recipient through its app's local interface. If a ping cannot be delivered, the sender is told automatically. See background setup and limits.Active waits: agents without pings use
bridge_waitbefore going idle. The pending call returns when a matching message arrives.Codex workers: Claude calls
ask_codex,review_with_codexorbridge_orchestrate_codex. The bridge starts a saved Codex session in an isolated worktree. If Codex needs longer than one tool call, the result arrives in the coordinator's mailbox when it finishes.
See INSTRUCTIONS.md for copy-paste prompts.
Related MCP server: Codex Bridge MCP
Features
Local SQLite WAL mailbox with versioned, backed-up migrations and daily backups
Direct messages, broadcasts, stable thread IDs and idempotency keys
Recipient-scoped acknowledgements, an outbox of what others have not handled, and agent retirement that closes finished work with a recorded reason
Recipient checks: unknown names are rejected with "did you mean" suggestions, and senders get warnings when a message is unlikely to be picked up
Output paging so large inboxes and threads never overflow an MCP result
Optional background pings with delivery receipts, a 24-hour window for busy recipients and automatic notices to the sender when a ping fails
Codex workers with the sandbox pinned on every turn, read-only reviews, bridge-observed file changes and background completion through the mailbox
Worktrees outside your repository, with an option to carry uncommitted changes in
Recovery of Codex runs whose bridge process exited mid-turn
A versioned runtime with smoke-tested installs and one-command rollback
Tools
Tool | Purpose |
| Register an agent; |
| Save a message, ping a bound recipient, and warn about delivery risks |
| Read unread messages in pages that fit the host's output limit |
| Acknowledge handled messages without deleting history |
| Keep the current turn open until a matching message arrives |
| Read a thread, newest page first, with cursors both ways |
| See which of your messages recipients have not handled, and why |
| List agents with unread counts, last activity and ping health |
| Retire a finished agent and close its unhandled messages |
| Discover live Claude sessions and this conversation's own session |
| Inspect ping outcomes separately from acknowledgements |
| Send one bounded task to a Codex worker in an isolated worktree |
| Run an evidence-led review in a read-only sandbox |
| Start a Codex run with rounds, worktree and wait controls |
| Resume the same Codex session with the coordinator's answer |
| Wait for a running Codex run started by any bridge process |
| Read durable run state and audit events |
Requirements
Node.js 22.5 or newer
Claude Code
OpenAI Codex CLI
Git, for worktree isolation
The mailbox works anywhere Node and both MCP clients run. The Codex launcher uses CODEX_BIN when set, then the Codex binary bundled in the macOS ChatGPT app, then codex from PATH.
Core tests run on macOS, Linux and Windows in GitHub Actions. Background pings and the live Claude Desktop plus Codex Desktop workflow were developed and verified on macOS.
Install
One command
npx --yes --package=github:WebisityStudio/claude-codex-mcp-bridge claude-codex-mcp-bridge setupSetup:
installs the package as a new runtime version under
~/.local/share/claude-codex-bridge/runtime/versions/;starts that runtime against a throwaway mailbox and checks its tools before activating it;
points Claude Code and Codex at
runtime/current, so updates and rollbacks never touch a checkout you are editing;edits only the bridge's own entry in Codex's
config.toml(per-tool approval settings are kept, and a backup is written) and setstool_timeout_sec = 300so waits are not cut at Codex's 60-second default;installs the
ask-codex,review-with-codexand coordinator skills plus acodex-teammateClaude agent.
Setup keeps the Node.js binary your apps already launch the bridge with (pass --node PATH to choose another) and registers through the newest Claude Code bundled with the desktop app when present (CLAUDE_BIN overrides), so an older standalone claude on PATH never rewrites your Claude settings. Once installed, later updates only switch the current link; neither app's configuration changes again.
Open fresh Claude and Codex sessions afterwards. Running sessions keep the bridge they started with.
npx --yes --package=github:WebisityStudio/claude-codex-mcp-bridge claude-codex-mcp-bridge doctorFrom a checkout
git clone https://github.com/WebisityStudio/claude-codex-mcp-bridge.git
cd claude-codex-mcp-bridge
npm ci
npm run check
node dist/cli.js setupsetup refuses to install a dist/ that is older than src/. Run npm run build first.
Everyday use
After opening a fresh Claude session:
/ask-codex investigate why the authentication tests are flaky
/review-with-codex focus on authentication and tenant isolationOr ask Claude directly:
Ask Codex to implement this change and verify it.
Have Codex review this repository for security regressions.The project path defaults to the Claude session's project. A call waits up to four minutes. If Codex is still working, the call returns running_codex and the result arrives later in your mailbox from bridge, which also pings your conversation if it is bound. Do not start a duplicate run.
Background pings
Bind each conversation once:
{"agent": "review-claude", "wake": "auto"}Claude sessions are detected automatically. For Codex, pass {"app": "codex", "sessionId": "<task ID>"} when auto cannot see the task ID. Then send normally, acknowledge after handling, and end the turn when no work remains. See the background wake guide for receipt states and limits.
When a ping cannot be delivered, the sender receives one automated notice from bridge explaining why and what to do. The most common cause is Claude Code holding messages for sessions that run in Bypass permissions (its crossSessionInbound setting). The bridge explains this but never changes that setting.
Fallback: active waits
Pick one canonical thread ID, register unique names, send with bridge_send, and wait with:
{
"agent": "claude-main",
"fromAgent": "codex-main",
"threadId": "invoice-review-001",
"timeoutSeconds": 285,
"acknowledge": true
}Most MCP hosts cut tool calls near five minutes, so waits are capped at 290 seconds. Renew a timed-out wait while the task is active. A filtered wait only wakes for the exact sender and thread.
Codex workers in detail
{
"projectPath": "/absolute/path/to/repository",
"task": "Implement and test the bounded change",
"threadId": "feature-x",
"useWorktree": true,
"includeUncommitted": false,
"maxRounds": 6,
"waitSeconds": 240
}Implementation runs use the
workspace-writesandbox with network access off. Reviews useread-only. The sandbox is pinned on every turn, including resumed ones, so a permissive default in your own Codex config never applies to bridge workers.Worktrees live under
~/.local/share/claude-codex-bridge/worktrees/(orBRIDGE_WORKTREE_ROOT). They stay out of your repository, so Metro,tsc, Jest andgit statusnever see them.Worktrees start from
HEAD. When the main checkout has uncommitted changes, the result warns you; passincludeUncommitted: trueto copy them in.Every result includes
observedChanges, the bridge's owngit statusof the workspace, next to what Codex reports.If the status is
waiting_for_fable, answer the question and callbridge_continue_codexwith the same run ID.Codex turns run as detached processes. If the bridge process that started one exits, another bridge process adopts the run, finishes it from its files and delivers the result.
BRIDGE_CODEX_CONFIGcan tune bridge workers without touching your interactive defaults, for examplemodel_reasoning_effort="medium". Sandbox and approval keys are ignored.
The bridge does not commit, push, merge, deploy or clean worktrees.
Maintenance
claude-codex-mcp-bridge doctor # installation, mailbox health, ping delivery, permissions
claude-codex-mcp-bridge doctor --fix # also tighten mailbox file permissions
claude-codex-mcp-bridge status # size, backlog, runs, latest backup
claude-codex-mcp-bridge prune # list agents idle for 7+ days (dry run)
claude-codex-mcp-bridge prune --apply # retire them and close their unhandled messages
claude-codex-mcp-bridge retire <agent> --note "task merged"
claude-codex-mcp-bridge backup # manual point-in-time copy
claude-codex-mcp-bridge rollback # switch back to the previous runtime
claude-codex-mcp-bridge uninstall # keeps mailbox data unless --purgeRetiring never deletes messages. Closed messages keep their history and a note saying why, recently active senders get one notice listing what was closed, and registering the name again reactivates it.
Storage
~/.local/share/claude-codex-bridge/bridge.sqlite mailbox (owner-only)
~/.local/share/claude-codex-bridge/backups/ pre-migration and daily backups (7 kept)
~/.local/share/claude-codex-bridge/runs/ Codex turn files (event streams pruned after 30 days; results kept)
~/.local/share/claude-codex-bridge/worktrees/ Codex worktrees (never cleaned automatically)
~/.local/share/claude-codex-bridge/runtime/ installed runtime versionsOverride the mailbox in both MCP configurations with BRIDGE_DB_PATH. All MCP processes must point to the same database. Set BRIDGE_BACKUPS=0 to disable daily backups.
Schema changes are additive and versioned. Before migrating an existing mailbox, the bridge writes a backup. Older bridge processes that are still running keep working against the migrated database.
Honest limitations
Background pings use observed local app interfaces, not public APIs. They need the app and its session host running.
Claude Code holds pings for sessions in Bypass permissions, and the desktop app has no prompt to approve them, so they expire. Sessions in other permission modes, or a deliberate
crossSessionInbound: "accept"setting, avoid this. The sender is notified either way.Claude Code channels (
BRIDGE_CLAUDE_CHANNEL=1) are supported as an opt-in push path, but Claude Code only listens when launched with its channel flags, which the desktop app does not expose.Codex does not expose its task ID to MCP servers in every version, so
wake: "auto"may need the ID passed explicitly.Registration proves discovery, not active processing. Acceptance of a ping is not completion of the work.
The transport is local to one machine.
Safety
No credentials are stored by this project. The Claude wake adapter reads only the addressed inbox's published peer token into memory and never logs it. It never uses child tokens or claims a permission mode.
The mailbox, backups and Codex turn files are owner-only. Messages are stored unencrypted, so do not send secrets through the mailbox.
Child processes receive a small allowlist of environment variables, not the full parent environment.
Worker sandboxes are pinned per turn. Worker prompts prohibit commits, pushes, deployments, external sends, credential changes, deletion and production mutations unless separately approved.
Messages from
bridgeare automated notices. Agents are told not to reply to them, and notices never trigger further notices.
Development
npm run typecheck # src, tests and scripts
npm test
npm run build # compiles into dist.next/ and swaps it in
npm run check # all of the above
npm audit --omit=dev --audit-level=high
BRIDGE_CODEX_CONFIG='model_reasoning_effort="low"' npm run smoke:orchestrator # live Codex run, fully isolatedThe suite covers socket framing, identity and permission boundaries, migrations from 0.3 databases and compatibility with running 0.3 processes, ping persistence, crash recovery and failure notices, mailbox routing, addressing checks, retirement, paging, independent MCP processes, detached Codex turns with a fake Codex binary, orphaned run recovery, real git worktrees, Codex config edits and runtime rollback.
Related work
This is not the only Claude/Codex bridge. See docs/ALTERNATIVES.md for a comparison with Claude Channels bridges, ACP delegation tools and general agent mailboxes.
License
MIT
Available Tools
17 toolsask_codexAsk CodexA
Send one bounded implementation, investigation, or verification task to a saved Codex worker in an isolated worktree. This is the simple everyday entry point; no mailbox or thread management is required.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | What Codex should do. | |
| threadId | No | Optional stable task ID. Generated when omitted. | |
| projectPath | No | Absolute path to the repository. Defaults to this session's project directory. | |
| useWorktree | No | Use an isolated Git worktree. Defaults true. | |
| waitSeconds | No | How long this call waits for Codex. Defaults to 240 seconds. If Codex is still working, the result arrives in the coordinator's mailbox. | |
| coordinatorAgent | No | Agent that receives the result. Defaults to this conversation's registered agent, else claude-main. | |
| includeUncommitted | No | Copy the main checkout's uncommitted changes into the worktree. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses worktree isolation and that the task is bounded to one unit of work, but it never says the run writes to the repository, whether changes are committed or left in the worktree, what permissions the worker needs, or what happens to worktree artifacts afterward. Those are meaningful gaps for a code-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, and the core action plus the 'simple entry point' framing are both front-loaded. Nothing is repeated from the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no annotations and no output schema, the description covers purpose and routing but not the return shape or the async/mailbox fallback result, nor the side effects on the repo. The schema's waitSeconds text hints at the mailbox behavior, but the description itself leaves a caller unsure what comes back on a timeout.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 7 parameters is already documented (defaults for threadId, projectPath, useWorktree, waitSeconds, coordinatorAgent, and the mailbox hand-off). The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: sending one bounded implementation/investigation/verification task to a saved Codex worker in an isolated worktree. The second sentence positions it against the mailbox/thread siblings, so an agent can tell it apart from bridge_orchestrate_codex and bridge_continue_codex without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as 'the simple everyday entry point' where 'no mailbox or thread management is required', which is a clear when-to-use signal against the heavier bridge_* alternatives. It stops short of naming those alternatives or stating when NOT to use this tool (e.g. multi-step orchestration), so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_ackAcknowledge messagesB
Mark messages as handled for an agent so they drop out of the unread inbox. History is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Message ids to acknowledge. | |
| agent | Yes | Agent acknowledging the messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that 'History is kept' – i.e. acknowledgment is non-destructive – but is silent on auth requirements, idempotency, and how already-acknowledged or invalid ids behave.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded; the 'History is kept' clause is informative rather than filler. 'for an agent' is slightly redundant against the schema's agent parameter, but overall it is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter mutation tool with no annotations and no output schema, the description conveys the action and its effect. It leaves behavioral edge cases (idempotency, auth, error conditions) uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('mark messages as handled') and pins down the concrete effect ('drop out of the unread inbox'), which distinguishes this from bridge_inbox and bridge_send. It does not explicitly name a sibling alternative, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'so they drop out of the unread inbox' implies when to use it (clearing unread messages), but there is no explicit when-to-use vs when-not guidance, no prerequisites, and no named alternative such as bridge_inbox.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_agentsList agentsA
List registered agents with unread counts, last activity, ping binding and recent ping health. Retired agents are hidden unless requested.
| Name | Required | Description | Default |
|---|---|---|---|
| includeRetired | No | Include retired agents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the default filtering behavior (retired agents hidden unless requested) and the fields returned, but omits permissions, pagination, ordering, or explicit confirmation that this is a read-only list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core listing behavior and then the default filter. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool with no output schema, the description compensates by listing returned fields and explaining the default filter. Minor gaps like pagination or ordering are not critical here, but their absence keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying that retired agents are hidden by default unless the parameter is set, which is not stated in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'List' and resource 'registered agents', and enumerates returned fields (unread counts, last activity, ping binding, recent ping health). It does not differentiate from siblings such as bridge_register or bridge_sessions, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The only conditional detail is the default hiding of retired agents, which is about parameter behavior, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_continue_codexContinue Codex with the coordinator's answerA
Resume the exact saved Codex session and worktree after Codex asked for a decision (status waiting_for_fable). The sandbox from the first turn is kept. Continue until completed, blocked, failed, or the round limit is reached.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | Run ID returned by the orchestration tool. | |
| fableAnswer | Yes | The coordinator's concrete answer to Codex's question. | |
| waitSeconds | No | How long this call waits for Codex. Defaults to 240 seconds. If Codex is still working, the result arrives in the coordinator's mailbox. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the exact session and worktree are resumed, that the first-turn sandbox is kept, and enumerates terminal states plus a round limit. It does not state permission/auth requirements or what execution side effects occur in the worktree while running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, fully front-loaded: resume action first, precondition second, termination behavior last. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async execution tool with no output schema and no annotations, the description covers resumption, sandbox persistence, and terminal outcomes; the mailbox delivery behavior is covered in the schema's waitSeconds description. What is missing is how the resumed result is surfaced and whether the run can be re-continued after blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so runId, fableAnswer, and waitSeconds (including default 240s and the 285s cap behavior) are already documented in the schema. The description adds no parameter-level detail such as format constraints or what a malformed answer does, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (resume the saved Codex session and worktree) and pins it to a unique precondition (status waiting_for_fable) that no sibling tool covers. An agent can distinguish this from ask_codex and bridge_orchestrate_codex 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger condition is explicit: use this after Codex asked for a decision and is in waiting_for_fable state, and it states the run continues until completed/blocked/failed/round limit. It does not name alternatives or explicitly say when not to use it (e.g., versus bridge_wait or bridge_orchestration_wait).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_inboxRead inboxA
List messages addressed to an agent, oldest first, in pages that fit the host's output limit. Acknowledged messages are hidden by default. When hasMore is true, acknowledge handled messages and read again, or pass afterId.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | Agent whose inbox to read. | |
| limit | No | Maximum messages to return. Defaults to 25 (30 for threads). | |
| afterId | No | Only messages with a larger id (paging cursor). | |
| maxChars | No | Character budget for the whole result. Defaults to 48000 so MCP hosts never truncate it. | |
| threadId | No | Only messages on this thread. | |
| fromAgent | No | Only messages from this sender. | |
| maxBodyChars | No | Preview mode: shorten every body to this many characters. | |
| includeAcknowledged | No | Include messages this agent has already acknowledged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It usefully discloses ordering, default hiding of acknowledged messages, and pagination behavior, but omits read-only/side-effect status, auth requirements, and full return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences front-load the core list operation and pagination rule. Every sentence contributes directly, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter read tool with no annotations and no output schema, the description covers pagination and acknowledged-message defaults but does not describe return fields beyond hasMore or address safety/permissions. Gaps remain for an agent needing full context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters in detail. The description adds only minor usage context for afterId and acknowledged-message defaults, not enough to exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('messages addressed to an agent'), plus ordering ('oldest first') and pagination. It clearly identifies an inbox read, but does not explicitly differentiate itself from siblings such as bridge_outbox or bridge_thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives pagination guidance for when hasMore is true, including acknowledging handled messages or passing afterId. However, it does not explain when to choose bridge_inbox over sibling tools like bridge_thread, bridge_wait, or bridge_outbox, nor does it state prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_orchestrate_codexStart an autonomous Codex implementation runA
Start a saved Codex worker in an isolated git worktree (network off) and wait up to waitSeconds for its structured result. If status is waiting_for_fable, answer the question and call bridge_continue_codex. If it is running_codex, the result arrives in the coordinator's mailbox. Independent calls create separate runs. This tool never grants permission to commit, push, deploy, publish, send externally, change credentials, delete data, or mutate production.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Self-contained implementation or verification task. | |
| threadId | Yes | Stable task/thread identifier. | |
| maxRounds | No | Maximum coordinator/Codex turns. Defaults 6. | |
| projectPath | No | Absolute path to the git repository. Defaults to this session's project directory. | |
| useWorktree | No | Create an isolated git worktree. Defaults true. | |
| waitSeconds | No | How long this call waits for Codex. Defaults to 240 seconds. If Codex is still working, the result arrives in the coordinator's mailbox. | |
| coordinatorAgent | No | Agent that receives the result. Defaults to this conversation's registered agent, else claude-main. | |
| includeUncommitted | No | Copy the main checkout's uncommitted changes into the worktree. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: network off, isolated worktree, timestamped wait limit with mailbox fallback on timeout, and independent-call semantics. It also enumerates the actions the tool never authorizes (commit, push, deploy, publish, external send, credential change, data deletion, production mutation), which is exactly the safety context annotations would otherwise provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with the core purpose front-loaded, followed by state routing and the safety list. The permission enumeration is long but earns its place given absent annotations; otherwise there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter orchestration tool with no annotations and no output schema, the description covers the operational states and the authorization boundary an agent most needs. The remaining gap is that 'structured result' is never characterized, and since there is no output schema the caller must infer the return shape from the mailbox/continuation flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 8 parameters are already documented in the schema, making 3 the baseline. The description reinforces waitSeconds timeout semantics and the mailbox fallback, but adds no format, default, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Start a saved Codex worker in an isolated git worktree (network off)' and waits up to waitSeconds for its structured result. It also distinguishes itself from the follow-up sibling by naming bridge_continue_codex, so an agent can separate it from ask_codex/review_with_codex by its 'saved worker + worktree' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional routing: waiting_for_fable -> answer then call bridge_continue_codex; running_codex -> result arrives in the coordinator's mailbox. It also notes independent calls create separate runs. It does not, however, say when to prefer this over ask_codex or review_with_codex, so the alternative-selection guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_orchestration_statusInspect an orchestration runA
Recover durable run state and its audit events after a restart or when checking progress.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | Orchestration run ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It states the tool retrieves state and audit events, implying a read-only action, but it does not explicitly confirm no side effects or describe the exact return structure. This is moderate transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no redundancy. It front-loads the primary action and delivers the key information efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, this description covers the core purpose and key usage scenarios, naming the two deliverables (state and audit events). It lacks explicit detail on response structure or potential errors, but is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a 100% description for the sole parameter runId ('Orchestration run ID'). The tool description adds minimal semantic value beyond this, as the connection between runId and the retrieved state is implicitly obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Recover') and identifies a clear resource ('durable run state and its audit events'). It distinguishes this inspection tool from execution-focused siblings like bridge_orchestrate_codex and bridge_continue_codex.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context ('after a restart or when checking progress'), indicating when to use this tool. However, it does not explicitly mention when not to use it or name alternative tools, stopping short of full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_orchestration_waitWait for a Codex runA
Wait up to timeoutSeconds for a running Codex run to finish its current round, then return its result. Works for runs started by any bridge process.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | Orchestration run ID. | |
| timeoutSeconds | No | Defaults to 240 seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key trait: the call blocks up to a timeout and returns the run's result. However, it never states what happens when the timeout elapses (error vs. partial result), nor that the schema caps the wait at 285 seconds, leaving the most failure-prone behavior unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the blocking scope front-loaded and the eligibility note second. Nothing is wasted and no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must carry return and safety context. It states that a result is returned, but for a wait tool the agent still needs to know the timeout-expiry outcome and what 'result' contains; the essentials are covered, the edges are not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so runId and timeoutSeconds (with its default) are already fully documented in the schema. The description only echoes timeoutSeconds by name and adds no format or semantics beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (wait) plus resource (a running Codex run) and the precise scope ('finish its current round'). It is distinguishable from the similarly-named bridge_wait by tying the wait to a Codex orchestration run, though it never names the sibling it should not be confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Works for runs started by any bridge process' clarifies which runs are eligible, which is real guidance. But there is no when-to-use versus when-not guidance, and no mention of the obvious alternative (bridge_orchestration_status) for checking a run without blocking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_outboxCheck sent messagesA
List direct messages an agent sent that the recipient has not acknowledged yet (newest first), with ping outcome and whether the recipient is active, retired or unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | Sender whose outbox to read. | |
| limit | No | Maximum entries. Defaults to 30. | |
| includeAcknowledged | No | Include messages the recipient already acknowledged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: sort order (newest first), the default filter (unacknowledged only), and the per-entry payload (ping outcome plus recipient liveness state). It omits pagination/truncation behavior and whether results are capped silently at the limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the resource and scope, then appends the return payload. No filler, no repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns, and it does name the ordering and the two per-entry signals. The one remaining gap is behavior at the limit boundary (pagination vs silent truncation), which matters for a 200-cap list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented. The description usefully implies the default state of includeAcknowledged (excluded), but adds no syntax or format detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list direct messages an agent sent), plus the defining scope: unacknowledged by the recipient. The word 'sent' cleanly separates it from bridge_inbox and bridge_thread without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys the situation the tool serves (checking on sent messages the recipient hasn't acknowledged) and the ordering, but never states when to reach for it instead of bridge_inbox, bridge_thread, or bridge_wait, nor any prerequisite for the 'agent' value.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_registerRegister agent presenceA
Register a unique agent name for this conversation. wake: "auto" binds this exact app session for background pings; an explicit {app, sessionId} binds another session; null disables pings; omitted keeps the current binding. Registering again reactivates a retired agent.
| Name | Required | Description | Default |
|---|---|---|---|
| wake | No | "auto" detects this conversation's session. Or pass {app, sessionId} (Claude IDs via bridge_sessions; the Codex task ID). null disables pings. | |
| agent | Yes | Unique readable agent name, e.g. 'review-claude'. Not a session ID. | |
| capabilities | No | Skills this agent offers, e.g. ['review','architecture']. Omitted keeps the existing list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does well: it discloses binding retention on omission, disabling behavior with null, and that registering again reactivates a retired agent. It still omits what happens when the requested name is already held by another conversation and whether an existing live registration is overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a single dense but well-structured sentence covering the wake branches. Every clause carries information; slightly dense formatting keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a registration tool with no output schema or annotations, the definition covers purpose, all three wake states, and re-registration semantics. It lacks only edge-case disclosure (name conflicts, overwrite behavior), which is a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a genuinely new behavior not present in the schema: omitting 'wake' keeps the current binding. It also frames 'auto' as binding the exact app session for background pings, adding intent beyond the schema's mechanics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Register a unique agent name for this conversation') and clarifies scope as conversation-bound. It partially distinguishes itself from siblings by noting that re-registering 'reactivates a retired agent' (vs bridge_retire), but never names an alternative tool for the non-registration path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditional guidance for the wake options ('auto' vs explicit binding vs null vs omitted), which is effectively parameter-level usage guidance. However, it never states when to reach for bridge_register versus siblings like bridge_agents/bridge_sessions, so tool-selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_retireRetire a finished agentA
Retire an agent whose task is over: its pings stop, its unhandled messages are closed with a recorded reason (history is kept), and recently active senders get one notice listing what was closed. Registering the name again reactivates it.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Who is retiring it. Defaults to this conversation's agent. | |
| note | No | Short reason, e.g. 'task merged'. | |
| agent | Yes | Agent to retire. | |
| closeBacklog | No | Close unhandled messages. Defaults true. | |
| notifySenders | No | Tell recently active senders what was closed. Defaults true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: pings stop, unhandled messages are closed with a recorded reason, history is kept, recent senders get one notice, and re-registration reactivates. This tells the agent exactly what changes and that the action is reversible via re-registration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and then the key side effects. Every clause earns its place by conveying lifecycle consequences and reversibility without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is nearly complete: it explains what gets closed, what is kept, who is notified, and how to undo. It lacks edge-case details such as behavior for an already-retired or nonexistent agent, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description contextualizes effects that correspond to note, closeBacklog, and notifySenders, but adds no syntax, defaults, or format details beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retire an agent'. It adds the scope condition 'whose task is over' and distinguishes from bridge_register by noting that registering the name again reactivates it. An agent can identify this as the lifecycle-ending tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear usage condition: 'Retire an agent whose task is over'. It does not explicitly name alternatives or when-not-to-use cases, but the condition is sufficient to route correctly among siblings like bridge_register and bridge_send.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_sendSend a messageA
Save a message, then ping its bound recipient in the background. The recipient must be registered (use allowUnregistered only when it will register later). The result carries warnings when the recipient is unlikely to pick the message up. Broadcasts and wake:false sends do not ping anyone.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient agent name, or '*' to broadcast. | |
| body | Yes | Message content. | |
| from | Yes | Sender agent name. | |
| wake | No | Ping a bound direct recipient. Defaults true. False saves silently. | |
| threadId | No | Optional conversation thread identifier. | |
| idempotencyKey | No | Optional key to prevent duplicate delivery on retry. | |
| allowUnregistered | No | Deliver even if the recipient is unknown or retired. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does meaningful work: it discloses that pinging happens in the background, that unregistered recipients are rejected by default, that result warnings signal low pickup likelihood, and that broadcasts/wake:false suppress the ping. Remaining gaps are failure semantics and full return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, each adding a distinct constraint (registration requirement, warnings, ping suppression). No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 7 parameters, the description needs to do a lot and covers the key behavioral and result-signaling aspects (warnings on low pickup likelihood). It stops short of describing the full return payload or error cases, which is a minor gap for a send tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes slightly beyond by framing allowUnregistered as a deferred-registration escape hatch ('only when it will register later') and clarifying wake:false as a silent save. That adds intent the schema text alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific compound action – 'Save a message, then ping its bound recipient in the background' – which is a distinctive verb+resource pair. An agent can distinguish this from read-side siblings like bridge_inbox or bridge_wait because the save-and-ping semantics are spelled out up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a real precondition ('The recipient must be registered') and a conditional exemption ('use allowUnregistered only when it will register later'), which tells the agent when to reach for that flag. It does not explicitly name alternatives (e.g. bridge_inbox for reading), so it stops short of full sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_sessionsDiscover local wake targetsA
Read live Claude session IDs and this conversation's own session when the host exposes it. Does not wake anything or read conversation content.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does disclose the key behavioral trait: this is a read-only discovery call with no side effects ('does not wake anything'). It does not explain what is returned when the host does not expose a session, which would be the natural remaining question.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the positive behavior followed by the negative scope. Every clause earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description covers what the tool reads and what it does not do. The only gap is the behavior when the host does not expose a session, which the 'when the host exposes it' clause gestures at but does not resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema requires no further semantic detail; the baseline of 4 applies. Nothing in the description conflicts with the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read live Claude session IDs plus this conversation's own session, with a clear conditional qualifier ('when the host exposes it'). It is distinguishable from the wake/inbox siblings, though it does not name them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes out adjacent behaviors ('Does not wake anything or read conversation content'), which routes the agent away from bridge_wake_status and content-reading siblings. It never states a positive when-to-use trigger, but the exclusion gives clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_threadRead a threadA
Read one page of a conversation thread. Without a cursor it returns the most recent messages; pass beforeId (olderBeforeId) to page back or afterId (newerAfterId) to page forward.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum messages to return. Defaults to 25 (30 for threads). | |
| afterId | No | Return messages newer than this id. | |
| beforeId | No | Return messages older than this id. | |
| maxChars | No | Character budget for the whole result. Defaults to 48000 so MCP hosts never truncate it. | |
| threadId | Yes | Thread identifier to fetch. | |
| maxBodyChars | No | Preview mode: shorten every body to this many characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the default behavior (most recent messages) and the paging model, which goes beyond the schema, but says nothing about read-only nature, auth/permission requirements, ordering guarantees, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The core behavior (returns most recent by default) is front-loaded ahead of the paging instructions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter read tool with no annotations and no output schema, the description covers pagination but omits return structure, ordering, and the truncation/budget behavior implied by maxChars and maxBodyChars. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are already documented. The description reinforces the cursor semantics (olderBeforeId/newerAfterId) but adds little beyond what the schema states per parameter, matching the baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one page of a conversation thread'), and the 'one page' qualifier immediately scopes it. It does not explicitly distinguish itself from siblings like bridge_inbox or bridge_outbox, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context for the cursor parameters: no cursor returns the most recent messages, beforeId pages back, afterId pages forward. It does not state when to choose this tool over sibling read tools such as bridge_inbox, so it stops short of naming alternatives/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_waitWait for the next bridge messageA
Keep this agent turn alive until a matching bridge message arrives, for agents without background pings. It cannot wake a chat whose turn has already ended, so call it before going idle. After handling and replying, call bridge_wait again while the coordination thread is active.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | Yes | Agent whose inbox should wake this turn. | |
| limit | No | Maximum messages to return. Defaults to 25 (30 for threads). | |
| maxChars | No | Character budget for the whole result. Defaults to 48000 so MCP hosts never truncate it. | |
| threadId | No | Optional coordination thread filter. | |
| fromAgent | No | Optional sender filter. | |
| acknowledge | No | Mark returned messages handled before returning. Defaults true; history is preserved. | |
| timeoutSeconds | No | How long to keep the MCP call open. Defaults to 285 seconds so common five-minute host limits do not cut it off. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose two real traits: the call blocks/keeps the turn alive, and it cannot revive an already-ended turn. However it is silent on key behaviors such as what happens at timeout, whether returned messages are consumed, and what acknowledge defaults do, leaving meaningful gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no redundancy. The core behavior is front-loaded, followed by the ordering constraint and the re-call instruction, each earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a blocking wait tool with no annotations and no output schema, the description covers the essential calling contract (when to call, when it fails, the loop pattern). It stops short of describing the returned message shape or timeout behavior, which for a no-output-schema tool leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters including defaults, bounds, and the acknowledge semantics. The description adds only the vague notion of a 'matching' message, adding little meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: keep the agent turn alive until a matching bridge message arrives. The phrase 'for agents without background pings' distinguishes it from a passive-ping mechanism, but it never names sibling tools such as bridge_wake_status or bridge_inbox, so an agent must still infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit lifecycle guidance — call it before going idle, and re-call it after handling and replying while the coordination thread is active. It also states a when-not condition: it cannot wake a chat whose turn has already ended. What it lacks is a named alternative for agents that DO have background pings or a comparison to bridge_wake_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_wake_statusInspect background ping deliveryB
Read up to 100 recent wake receipts with a per-state summary. Accepted means the app accepted a ping, not that the work is complete. Held/refused respect app permission checks; unknown outcomes are never replayed automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It says the tool reads recent receipts, caps results at 100, clarifies that 'Accepted' does not mean work completion, notes permission checks for held/refused states, and states unknown outcomes are never replayed automatically. These are meaningful behavioral details beyond the schema, though read-only/no-side-effect guarantees are only implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core read operation and result limit. Each sentence adds useful clarification without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status tool with no output schema, the description covers result-limit and state meanings reasonably well. However, it omits usage context and fails to explain the `agent` parameter, leaving gaps an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter, `agent`, with 0% schema description coverage. The description never mentions `agent` or explains whether it filters wake receipts by agent, so it fails to compensate for the missing schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read up to 100 recent wake receipts with a per-state summary.' It clearly identifies the tool as an inspection/status reader, but it does not differentiate from siblings such as bridge_wait, bridge_ack, or bridge_inbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus alternatives. It explains state semantics but never states when this status check is appropriate or when another bridge tool should be used instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_with_codexReview with CodexA
Ask Codex for a read-only repository review with evidence and actionable findings. Codex runs in a read-only sandbox and the bridge reports whether the workspace changed.
| Name | Required | Description | Default |
|---|---|---|---|
| focus | No | Optional review focus, such as security, a PR, or a subsystem. | |
| threadId | No | Optional stable task ID. Generated when omitted. | |
| projectPath | No | Absolute path to the repository. Defaults to this session's project directory. | |
| waitSeconds | No | How long this call waits for Codex. Defaults to 240 seconds. If Codex is still working, the result arrives in the coordinator's mailbox. | |
| coordinatorAgent | No | Agent that receives the result. Defaults to this conversation's registered agent, else claude-main. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonably well: it discloses that Codex runs in a read-only sandbox and that the bridge reports whether the workspace changed, which is real safety/behavioral context. It stops short of describing non-repo side effects or failure/long-running behavior beyond what the schema's waitSeconds note covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler, front-loading the core action and then the safety/verification detail. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should characterize the return value; it conveys that findings come with evidence and that workspace change is reported. It does not explain the mailbox/async delivery of results (only the schema's waitSeconds note hints at it), leaving a small gap for a potentially long-running tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented in the schema, establishing the baseline of 3. The description adds no parameter-level meaning (focus, threadId, coordinator routing, timing) beyond what the schema supplies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+agent: a read-only repository review performed by Codex, yielding evidence and actionable findings. The 'read-only repository review' framing plausibly distinguishes it from the sibling ask_codex, though that distinction is left implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and description (reach for this when you want Codex to review a repo), but there is no explicit when-to-use guidance, no conditions that select it over ask_codex, and no exclusions or prerequisites.
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.
15 tool updates
v0.4.0- Added
ask_codex - Changed
bridge_agents1 field changed- added
Input schema / properties / includeRetiredAdded value: +{ + "description": "Include retired agents.", + "type": "boolean" +}
- Changed
bridge_continue_codex2 fields changed- changed
Input schema / properties / fableAnswer / descriptionPrevious value: -"Fable's concrete answer to Codex's question."New value: +"The coordinator's concrete answer to Codex's question." - added
Input schema / properties / waitSecondsAdded value: +{ + "description": "How long this call waits for Codex. Defaults to 240 seconds. If Codex is still working, the result arrives in the coordinator's mailbox.", + "maximum": 285, + "minimum": 0, + "type": "integer" +}
- Changed
bridge_inbox6 fields changed- added
Input schema / properties / afterIdAdded value: +{ + "description": "Only messages with a larger id (paging cursor).", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / fromAgentAdded value: +{ + "description": "Only messages from this sender.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum messages to return. Defaults to 25 (30 for threads).", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / maxBodyCharsAdded value: +{ + "description": "Preview mode: shorten every body to this many characters.", + "maximum": 400000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / maxCharsAdded value: +{ + "description": "Character budget for the whole result. Defaults to 48000 so MCP hosts never truncate it.", + "maximum": 400000, + "minimum": 1000, + "type": "integer" +} - added
Input schema / properties / threadIdAdded value: +{ + "description": "Only messages on this thread.", + "minLength": 1, + "type": "string" +}
- Changed
bridge_orchestrate_codex6 fields changed- changed
Input schema / properties / coordinatorAgent / descriptionPrevious value: -"Name of the active Claude coordinator."New value: +"Agent that receives the result. Defaults to this conversation's registered agent, else claude-main." - added
Input schema / properties / includeUncommittedAdded value: +{ + "description": "Copy the main checkout's uncommitted changes into the worktree.", + "type": "boolean" +} - changed
Input schema / properties / maxRounds / descriptionPrevious value: -"Maximum Fable/Codex turns. Defaults 6."New value: +"Maximum coordinator/Codex turns. Defaults 6." - changed
Input schema / properties / projectPath / descriptionPrevious value: -"Absolute path to the git repository."New value: +"Absolute path to the git repository. Defaults to this session's project directory." - added
Input schema / properties / waitSecondsAdded value: +{ + "description": "How long this call waits for Codex. Defaults to 240 seconds. If Codex is still working, the result arrives in the coordinator's mailbox.", + "maximum": 285, + "minimum": 0, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "coordinatorAgent", - "projectPath", - "task", - "threadId" -]New value: +[ + "task", + "threadId" +]
- Added
bridge_orchestration_wait - Added
bridge_outbox - Changed
bridge_register3 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Unique agent name, e.g. 'claude'."New value: +"Unique readable agent name, e.g. 'review-claude'. Not a session ID." - changed
Input schema / properties / capabilities / descriptionPrevious value: -"Skills this agent offers, e.g. ['review','architecture']."New value: +"Skills this agent offers, e.g. ['review','architecture']. Omitted keeps the existing list." - added
Input schema / properties / wakeAdded value: +{ + "anyOf": [ + { + "anyOf": [ + { + "const": "auto", + "type": "string" + }, + { + "properties": { + "app": { + "enum": [ + "codex", + "claude" + ], + "type": "string" + }, + "sessionId": { + "maxLength": 128, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "app", + "sessionId" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ], + "description": "\"auto\" detects this conversation's session. Or pass {app, sessionId} (Claude IDs via bridge_sessions; the Codex task ID). null disables pings." +}
- Added
bridge_retire - Changed
bridge_send2 fields changed- added
Input schema / properties / allowUnregisteredAdded value: +{ + "description": "Deliver even if the recipient is unknown or retired.", + "type": "boolean" +} - added
Input schema / properties / wakeAdded value: +{ + "description": "Ping a bound direct recipient. Defaults true. False saves silently.", + "type": "boolean" +}
- Added
bridge_sessions - Changed
bridge_thread5 fields changed- added
Input schema / properties / afterIdAdded value: +{ + "description": "Return messages newer than this id.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / beforeIdAdded value: +{ + "description": "Return messages older than this id.", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Maximum messages to return. Defaults to 25 (30 for threads).", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / maxBodyCharsAdded value: +{ + "description": "Preview mode: shorten every body to this many characters.", + "maximum": 400000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / maxCharsAdded value: +{ + "description": "Character budget for the whole result. Defaults to 48000 so MCP hosts never truncate it.", + "maximum": 400000, + "minimum": 1000, + "type": "integer" +}
- Changed
bridge_wait2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum messages to return. Defaults to 25 (30 for threads).", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / maxCharsAdded value: +{ + "description": "Character budget for the whole result. Defaults to 48000 so MCP hosts never truncate it.", + "maximum": 400000, + "minimum": 1000, + "type": "integer" +}
- Added
bridge_wake_status - Added
review_with_codex
10 tool updates
v0.1.0- First observed
bridge_ack - First observed
bridge_agents - First observed
bridge_continue_codex - First observed
bridge_inbox - First observed
bridge_orchestrate_codex - First observed
bridge_orchestration_status - First observed
bridge_register - First observed
bridge_send - First observed
bridge_thread - First observed
bridge_wait
TDQS
Scored across 17 tools
Most tools target distinct resources or lifecycle stages: messaging, agent registration, wake receipts, and Codex orchestration are clearly separated. The main ambiguity is between ask_codex and bridge_orchestrate_codex, both of which start a saved Codex worker in a worktree; descriptions try to distinguish simple use from orchestration, but an agent could still misselect.
The set is predominantly snake_case with a bridge_ prefix, which is predictable for the coordination tools. Two Codex-facing tools (ask_codex, review_with_codex) omit the bridge_ prefix, and bridge_orchestrate_codex versus bridge_orchestration_status/wait uses slightly different forms, but the pattern is still largely readable.
At 17 tools, the server is slightly above the typical 3-15 range, but the count is justified by two subdomains: agent messaging/coordination and Codex task orchestration. Each tool appears to cover a distinct operation rather than duplicating another, so it does not feel bloated.
The surface covers the core lifecycle: agent registration/retirement, sending and reading messages, acknowledgement, threading, wake status, session inspection, and Codex task/review/orchestration flow. Minor gaps remain, such as an explicit cancel/stop for a running Codex run or a way to list active runs directly, but agents can work around these.
Maintenance
Related MCP Connectors
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
No-data MCP handoff for local Claude Code to Codex harness moves. $49 lifetime.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceThe self-hosted MCP bridge between Claude Chat and Claude Code.46AGPL 3.0
- FlicenseNot gradedqualityCmaintenanceCodex Bridge MCP is a local MCP orchestration service for a stable Claude Code x Codex CLI development workflow.2-
- AlicenseAqualityAmaintenanceBridges Claude Code and OpenAI Codex through MCP, allowing cross-harness querying, code review, explanation, and implementation delegation.64 npm1MIT
- AlicenseAqualityBmaintenanceLocal MCP bridge that lets Codex operate local Claude Code sessions, including listing, starting, resuming, forking, prompting, and stopping conversations via the Remote Control CLI.14MIT