codex-dobby-mcp
This local stdio MCP server lets Claude delegate scoped planning, research, implementation, validation, review, brainstorming, and reverse-engineering work to Codex with structured results, artifacts, and filesystem guardrails.
Break down tasks read-only with
plan.Investigate code, docs, and optionally web/Reddit via fetchaller with
research.Evaluate ideas and scope MVPs with
brainstorm.Implement changes and run focused verification with
build, including optional full-accessdangermode.Run existing build/test/lint validation commands with
validatewithout source edits.Review code directly or fan out across specialist lenses: generalist, security, performance, architecture, correctness, UX, and regression.
Investigate binaries with
reverse_engineer, using Ghidra MCP when configured.Run long jobs in the background with
start_run, then check or block withget_run,wait_run, and recover recent runs withlist_runs.Pass scoped context via prompt, files, important context, extra roots, model, reasoning effort, and timeout settings.
Rely on guardrails: explicit absolute repo roots, read-only vs workspace-write sandboxes, forbidden commits, isolated Codex home, MCP restrictions, and inspectable
.codex-dobby/runsartifacts.
Enables Reddit browsing for research and brainstorming via the fetchaller-mcp integration.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@codex-dobby-mcp review the latest pull request in the repo"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Codex Dobby MCP
A local stdio MCP server that lets Claude delegate scoped work to Codex with structured results, persistent artifacts, and guardrails around filesystem access, review fan-out, and reverse-engineering workflows.
It gives Claude a sharper tool surface than a raw shell handoff: planning stays read-only, builds stay scoped, reviews can require specialist subagents, and every run leaves behind inspectable logs and outputs. It's especially useful for long-running analysis, Ghidra sessions, and deeper code review passes.
Tools
Tool | Description |
| Break down a task and propose a scoped plan without editing files. |
| Investigate code, docs, and context in read-only mode and report findings. |
| Evaluate an idea, scope an MVP, and recommend whether it is worth building. |
| Implement a change, run focused verification, and report results. |
| Run existing repo validation commands (build, test, lint) and report the results. |
| Review code or changes directly for one selected agent, or fan out to one Codex subagent per selected review agent when multiple agents are selected. |
| Use reverse-engineering tooling and broader roots to investigate binaries. |
| Start any Dobby tool in the background and return immediately with a task id. |
| Fetch the status or final result for a background run by task id. |
| Block until one or more background runs finish (or a timeout elapses), then return the first result. |
| List recent runs for a repo so you can recover task ids and results after timeouts. |
Related MCP server: Codex Capability Bridge
Requirements
Python 3.12+
uvMCP Python SDK 2.x (
mcp[cli]>=2.0.0,<3), installed automatically as a dependencyCodex CLI installed and authenticated. Multi-agent review requires a CLI that lists
multi_agent_v2incodex features list; Dobby verifies this before fan-out. The rollout parser retains a0.147.0compatibility fixture, and the authenticated live baseline iscodex-cli 0.164.0.A git worktree for the target repo
Optional MCP dependencies
Some tools work best (or only work) when specific MCP servers are available in the parent environment:
researchandbrainstorm: fetchaller-mcp MCP server for web search, URL fetching, and Reddit browsing. Without it, these tools fall back to codebase-only analysis.reverse_engineer: ghidra-mcp bridge for binary analysis via Ghidra. Without it, reverse engineering is limited to whatever other tools are available in the sandbox.
Dobby auto-detects these integrations from the active Codex MCP config. If an integration is not installed or not configured for the run, Dobby does not try to use it: the worker prompt explicitly tells Codex not to call it and to continue with the best non-integration path available.
Install
Recommended local tool install:
uv tool install .
codex-dobby-mcpOne-off local execution without installing:
uvx --from . codex-dobby-mcpWhen this package is published to PyPI, replace . with codex-dobby-mcp.
Development checkout:
uv syncRun From Source Checkout
uv run codex-dobby-mcpEvery tool requires an explicit absolute repo_root. Dobby does not use MCP metadata or the server process's cwd as an implicit target: stdio clients do not reliably transmit their active workspace, and source-checkout launchers often run from Dobby's own repo. Requiring the root prevents a request from silently running against the Dobby checkout or another unrelated worktree.
Example launch with an installed tool:
{
"mcpServers": {
"codex-dobby": {
"command": "codex-dobby-mcp"
}
}
}Example launch from a source checkout:
{
"mcpServers": {
"codex-dobby": {
"command": "uv",
"args": ["--project", "/ABSOLUTE/PATH/TO/codex-dobby-mcp", "run", "codex-dobby-mcp"]
}
}
}Recommended Claude Code setup
If you use Dobby from Claude Code, add this to your CLAUDE.md so Claude delegates correctly:
## Delegating Work to Dobby (codex-dobby MCP)
Offload grunt work — build/test, code review, research, planning, implementation, brainstorming, reverse engineering — to the `codex-dobby` MCP tools instead of doing it inline. Saves tokens and context.
- Give focused prompts with a concrete outcome. One task per call — if you have multiple things to ask, make multiple Dobby calls (in parallel when independent) instead of bundling them into one vague prompt.
- Call `mcp__codex-dobby__*` directly. Never wrap them in a general-purpose Agent/Task subagent.
- Always pass the absolute path of the current repository as `repo_root` on every Dobby call, including `get_run`, `wait_run`, and `list_runs`.
- Don't lower `timeout_seconds` below the default. Err too long — a short timeout kills the run; a long one costs nothing because Dobby returns as soon as it's ready.
- For `review`, omit `agents` or pass one lens for a direct single-agent review. Pass two or more of `generalist`, `security`, `performance`, `architecture`, `correctness`, `ux`, and `regression` for v2 fan-out; use `timeout_seconds=1200` for multi-agent review.
- For long work, start it with `mcp__codex-dobby__start_run` and then either block on `mcp__codex-dobby__wait_run` (parent sleeps in the tool call) or poll `mcp__codex-dobby__get_run` (parent keeps working). On Claude Code, `/loop` or `ScheduleWakeup` can schedule the polls for you so the parent is free between checks.
- Always wait for `start_run` to return its `task_id` before calling `wait_run` or `get_run`; do not race the start and lookup calls in parallel.
- To resume, continue, or check on a background run, call `wait_run`/`get_run` with its `task_id` — a Dobby run takes no further input once started, so to change course let it finish (or cancel) and `start_run` again.Requests
Every tool requires repo_root, the absolute path to the target git worktree. Worker tools also take prompt; their other common params are files, important_context, timeout_seconds, extra_roots, model, and reasoning_effort. Tool-specific: danger (build, reverse_engineer), agents (review).
review agents: generalist (default), security, performance, architecture, correctness, ux, regression. Zero or one effective agent runs directly. Pass two or more for explicit multi-agent v2 fan-out, normally with timeout_seconds=1200. Multi-agent review costs more tokens and latency than a direct review because it runs a parent plus every selected child, so select only lenses that materially help the task.
start_run takes the same params as the target tool, plus required tool. If timeout_seconds is omitted, it defaults to that target tool's normal timeout, except multi-agent review automatically uses 1200 seconds. Non-empty agents are only accepted when tool is review; other tools reject them with a validation error. Independent start_run calls may execute in parallel, but wait for each call's own response before looking up its returned task_id.
get_run params: task_id, repo_root.
wait_run params: repo_root, optional task_id (single run), optional task_ids (list — first-to-finish wins), timeout_seconds (default 540s / 9 min, clamped to [1, 100_000] / ~27.8 hours — matching Claude Code's MCP_TOOL_TIMEOUT default of 100000000 ms). Omit both task_id and task_ids to wait on every currently-live run for the repo. Passing both is rejected; an empty task_ids list is rejected. On timeout returns a running lookup whose pending_task_ids lists the ids still outstanding, and whose summary instructs the caller to re-call wait_run with that list until one finishes. Pick timeout_seconds below your MCP client's own tools/call ceiling — Claude Code defaults to ~28 hours (so the full clamp is usable); Codex CLI defaults to 60s per [mcp_servers.<id>].tool_timeout_sec (so raise that in ~/.codex/config.toml before using long waits from Codex); Claude Desktop / Cursor / Cline / Continue vary and may cap low.
list_runs params: repo_root, optional limit.
For clients with a short tools/call ceiling (Claude Desktop ~60s, unconfigured Codex CLI 60s), prefer start_run + get_run/list_runs for long review, research, build, validate, or reverse_engineer work. Where the ceiling is raised (Claude Code defaults to ~28h, Codex CLI with tool_timeout_sec overridden), start_run + wait_run is usually fewer round-trips than polling.
Defaults
Default model is gpt-6.1-sol for all tools and review subagents. Any explicit timeout_seconds must be at least 300s.
Pass model to pick a different one. The tool schema advertises these known IDs, but the field is a free string, so any other ID Codex accepts is passed through unchanged:
| Notes |
| Default. Latest workhorse model for coding and everyday work. |
| Frontier intelligence for the most demanding work. |
| GPT-6.1 Terra Codex model. |
| Previous-generation workhorse model. |
| Fast and affordable model for easier tasks. Does not support |
reasoning_effort accepts minimal, low, medium, high, xhigh, max, and ultra.
Tool | Timeout | Reasoning | Sandbox |
| 600s | medium | read-only |
| 1200s | medium | read-only |
| 600s | medium | read-only |
| 600s default, 1200s recommended for multi-agent | medium | read-only |
| 600s | medium |
|
| 1200s | high |
|
| 1800s | high |
|
These defaults start GPT-6.1 Sol at medium for most technical work, following OpenAI's model selection guidance. Build and reverse engineering use high for code-writing and deeper analysis. Pass reasoning_effort to override a default for a specific task: lower it (low) for easy, well-scoped work such as a quick lookup or a simple research question, and raise it for hard or high-stakes ones.
build and reverse_engineer switch to danger-full-access when danger=true.
start_run, get_run, and list_runs are control-plane tools and return immediately. start_run uses the selected target tool's timeout budget. wait_run is also a control-plane tool, but it intentionally blocks up to its own timeout_seconds (capped at 100_000s / ~27.8h, matching Claude Code's MCP_TOOL_TIMEOUT default) waiting for a background run to finish.
Behavior
Child Codex runs inherit the parent's environment, but Dobby seeds a private per-run
CODEX_HOMEunder the system temp directory (.../codex-dobby/<task-id>/codex-home) instead of pointing children at the user's global Codex home directly.researchprefers codebase evidence and uses fetchaller MCP tools when available. If fetchaller is not installed or not configured for the run, the worker is told not to call it and to continue without web MCP support.validateruns in theworkspace-writesandbox withapproval_policy="never"because validation often needs temp or cache writes; the worker prompt still forbids source edits and commits.reviewuses a direct single-lens path for one agent, or explicitly enables Codex multi-agent v2 for multiple. The v2 parent spawns one deterministic task per selected custom reviewer with the exact custom role, a canonical assignment bound to the requested repo/task/files/context, andfork_turns="none", then collects parent-observed completion results. Codex 0.147 intentionally persists themessagetool argument as opaque provider ciphertext, so Dobby requires every other spawn field to remain exact, accepts only a single high-entropy opaque message value provisionally, and binds it to a SHA-256 assignment identity attested by the independently correlated child terminal result. Before accepting the execution manifest, Dobby also cross-checks root v2 mode, canonical child task/thread/role, verified child identity and no child collaboration calls, one strict read-only terminal JSON result, and an identical completed payload observed by the parent through v2 agent state. Global evidence failures quarantine all findings. The wrapper strips the internal attestation and reconstructs returned findings, next steps, warnings, and per-agent summaries from verified child results instead of trusting parent-authored synthesis. Review runs disable every inherited MCP server, and Dobby caps v2 session slots and rejects any reviewer collaboration call. Codex 0.164 keeps children in v2 mode and may omit started events, so Dobby correlates each spawn output with the child session path. Single-agent review defaults togpt-6.1-solatmediumreasoning. Multi-agent review uses the resolved model with alow-reasoning orchestration parent andmediumreviewer children by default; an explicit reasoning override applies to reviewers while the parent stayslow.reverse_engineerincludes a Ghidra MCP workflow only when Ghidra is installed and configured for the run. When Dobby can discover Ghidra from the active Codex configs (CODEX_HOME/config.tomland repo-local.codex/config.toml), it adds the configured Ghidra MCP helper repo as a writable helper root. When a live Ghidra UDS socket runtime directory is discoverable, Dobby also mounts that runtime path so child reverse-engineering workers can reach the already-running Ghidra instance. In that live-UDS case, Dobby enables workspace-write network access and passes the discovered socket roots throughnetwork.allow_unix_socketsfor the child Codex run. If Ghidra is not installed or not configured, the worker is told not to callmcp__ghidra__*.reverse_engineerresponses includereverse_engineer_details.ghidra, which reports whether Ghidra was configured, whether the run used direct MCP calls or the mounted helper fallback, and which Ghidra calls were observed.start_runlaunches the selected Dobby tool in the server process and returns atask_idimmediately.get_runfirst checks any still-live in-memory run, then falls back to the run artifacts on disk.wait_runawaits the same live in-memory task viaasyncio.wait_forwithasyncio.shield, so if the caller is cancelled (client disconnect, outer MCP timeout) the underlying background run keeps going and can still be recovered withget_run/wait_run. If the task isn't in the live registry — e.g. the server restarted —wait_runfalls through to the on-disk artifact lookup without polling.Multi-task
wait_run(task_ids=[...]or no ids → all-live) usesasyncio.wait(..., return_when=FIRST_COMPLETED)over shielded futures and returns the first run to finish. The response'spending_task_idslists the still-outstanding ids; callers should re-callwait_run(task_ids=pending_task_ids)until it's empty. On timeout the primary entry is the first id in the input list;pending_task_idsholds every id still waiting.Result artifacts are replaced atomically, so
get_runsees either the startup placeholder or the final persisted response instead of a partially writtenresult.json.Synchronous worker tool calls (
review,research, etc.) can still hit the caller's outertools/callceiling. Preferstart_run+wait_run/get_runwhen that's a concern.If an orchestrated review parent times out after one or more children delivered valid results, Dobby reconstructs a partial manifest and salvages those findings from the private Codex session rollouts. Undelivered, malformed, or blocked child output is not counted as usable coverage.
Filesystem and Safety
Read-only tools run in Codex
read-only. Dobby still mounts the per-run artifact directory plus any in-repoextra_roots;extra_rootsoutside the repo are exposed as additional read-only roots, not writable roots.Mutating tools run in workspace-write and mount
extra_rootswritable via--add-dir.Mutating tools also ensure
.codex-dobby/is present in.gitignore. Unsafe.gitignoretargets, such as symlinks or multiply-linked files, fail closed.External worktree mutations during a read-only run (you editing files in another terminal, another process touching the repo) are surfaced as a warning, not an error. Codex's OS-level read-only sandbox blocks codex itself from writing, so detected changes are by definition external. The run still escalates to
stop_reason: sandbox_violationonly when the worker self-reports having modified files that the wrapper also observed.Child Codex runs no longer need write access to the parent
~/.codex/sessions. Dobby seeds the child home fromCODEX_HOME/auth.jsonandCODEX_HOME/config.tomlwhen those files exist, mirrors referenced helper files fromCODEX_HOMEandCLAUDE_CONFIG_DIRinto a current-user-owned0700private runtime, then points the child at that temp home. Existing task directories are rejected. Orchestrated review forceshistory.persistence="save-all"only in this isolated runtime because rollout evidence is required. Dobby deletes the runtime in finalization; if deletion fails, the persisted response is changed tostatus: "error", names the retained sensitive path, and usescompleteness: "blocked". The server process therefore needs read access to the parent Codex and Claude config files plus read/write access to the temp runtime directory.CODEX_DOBBY_ACTIVE=1is set on child runs and Dobby refuses to run if already set. Every inherited MCP server is disabled for review, preventing recursive calls through renamed or wrapped Dobby entries. Other tool roles retain useful MCPs but disable recognizable Dobby entries.Commits are forbidden. A mutating worker that creates or moves a commit returns
status: "error".Artifact access fails closed on invalid
task_idvalues and symlinked artifact roots or paths. Wrapper writes also fail closed on unsafe.gitignoretargets.
Artifacts
Each run writes to <target-root>/.codex-dobby/runs/<task-id>/: request.json, prompt.txt, stdout.log, stderr.log, last_message.txt, result.json, output-schema.json, events.jsonl. Multi-agent review logs are also JSONL inside stdout.log. events.jsonl is the durable record of streaming progress events for the run (one ACP-shaped event per line; see Streaming progress below). Treat .codex-dobby/ as unredacted local logs.
Worker-facing tools (plan, research, brainstorm, build, validate, review, reverse_engineer) return task_id, tool, status, summary, completeness, important_facts, next_steps, files_changed (this run only), file_diffs (mutating tools only — see File diffs), artifact_paths, sandbox_violations, repo_root, exit_code, duration_ms, warnings, raw_output_available, model, reasoning_effort, result_state, and stop_reason (see Stop reasons). review responses also include review_details: the raw requested and normalized effective reviewers, the orchestration protocol, evidence source, per-task manifest, integrity flag, coverage flag, and completed/partial/blocked/failed counts. For multi-agent review, manifest_validated: true proves that the manifest matches independently correlated Codex rollouts; it does not mean every reviewer finished. coverage_complete: true is the separate all-lenses-completed signal. Scope is not delivered through the orchestrating parent. Dobby writes a per-run copy of each reviewer's agent definition into the child's private runtime with that lens's canonical assignment inlined, and names it in the child's own configuration, so the parent chooses which reviewer starts but not what it reviews. A child that receives a task payload carrying a different canonical assignment is required to review the assignment Dobby gave it and report the discrepancy in warnings. The digest each child attests is a consistency check on top of that, not the only binding — on its own it would prove a child saw the assignment identity rather than received the assignment, since the parent knows the digest too. Together with the rollout correlation this rules out substituted reviewer roles, inherited parent context, nested delegation, undeclared sessions, and fabricated child results. Scope substitution is bound rather than made impossible: the child holds the authoritative assignment, but enforcement is an instruction the reviewer model follows, so a child persuaded by a crafted task payload while still echoing the expected digest would pass every mechanical check. Direct reviews use coverage_complete: null. Any lens that delivers no usable result (failed or blocked) also adds a next_steps entry naming it and how to re-run it alone with review and agents=["<lens>"], which takes the direct path with no child orchestration. When one lens fails an integrity check the run reports status: error and completeness: blocked, but important_facts may still carry findings from the lenses that passed — that content was independently verified from their own delivered payloads, and the failing lens contributes nothing, not even its summary. A successful verified fan-out reports execution_evidence: "codex_session_rollouts". The public JSONL CLI stream still omits those v2 events, so Dobby reads the private rollout files before deleting the temporary runtime. reverse_engineer responses also include reverse_engineer_details.ghidra, with mode, summary, and the observed mcp_calls and helper_calls.
Streaming progress
Every run writes ACP-shaped events to <run-dir>/events.jsonl, regardless of whether anyone is listening. When the MCP caller passes a progressToken in the tools/call _meta, Dobby also forwards each event live as an MCP notifications/progress. The numeric progress field is an event counter, message is a short human-readable label (the tool title or event type), and the structured event lives in _meta.acpEvent for clients that want it. Clients that don't pass a token receive nothing — runs continue normally.
Event vocabulary borrows ACP's session/update payload shapes: agent_message_chunk for streamed model text, tool_call / tool_call_update for tool invocations (with kind ∈ read|edit|delete|move|search|execute|think|fetch|other), and plan for worker outlines. The codex --json event types we map (and ignore) are documented in src/codex_dobby_mcp/events.py.
For background runs (start_run + wait_run), live events are forwarded only to whichever wait_run caller is currently subscribed. The full history stays available in events.jsonl regardless.
Stop reasons
Each ToolResponse carries a stop_reason that classifies why the run ended. The first five values mirror ACP's StopReason enum verbatim:
end_turn— model finished naturally (the typical success case)max_tokens— reserved; defined for a future ACP bridge but not currently emitted (codex surfaces no token-budget signal the runner maps)max_turn_requests— reserved; defined but not currently emittedrefusal— worker explicitly refused the task (worker output setrefused: true)cancelled— Dobby was cancelled or killed before completion
Plus four Dobby-specific extensions for failure modes ACP doesn't model:
timeout— run hittimeout_secondsstall— codex went idle for too long and Dobby killed itsandbox_violation— read-only tool tried to write, mutating tool tried to commiterror— codex exited non-zero or returned malformed output
Legacy run artifacts written before this field existed are still readable; stop_reason is optional on RunLookupResponse.
File diffs
Mutating tools (build, validate, reverse_engineer) populate a file_diffs: list[FileDiff] field with one entry per changed file:
{
"path": "/abs/repo/src/foo.py",
"oldText": "...", // null for new files
"newText": "...", // null for deleted files
"truncated": false // true for files Dobby couldn't represent as text
}Field names use ACP's camelCase shape (oldText/newText) on the wire, in result.json, and in events.jsonl. The Pydantic model uses Pythonic snake_case fields internally with camelCase aliases, and every serialization path passes by_alias=True so on-disk and on-the-wire shapes match. Worker JSON also uses camelCase (the oldText/newText schema is enforced).
Files larger than 2 MB or that look binary are reported with truncated: true and both texts left as null. Files outside the repo root are not diffed. The wrapper detects diffs from snapshot deltas; workers may also attach file_diffs in their structured output, which Dobby uses to fill in gaps the wrapper couldn't capture (e.g. a stashed snippet of a very large file).
Read-only tools always have file_diffs: [].
Async control tool return shapes
start_runreturns anAsyncRunHandlewithtask_id,tool,state,summary,repo_root,artifact_paths,model, andreasoning_effortget_runreturns aRunLookupResponsewithtask_id,state,summary,repo_root, optionaltool, optionalstatus, optionalresult_state, optionalstop_reason, optional finalresult, artifact metadata, and warningswait_runreturns the sameRunLookupResponseshape asget_runplus an optionalpending_task_idslist (populated whenever the caller passedtask_idsor used the all-live mode). On timeoutstateisrunningandresultis unset, on completionstateisfinishedwith the finalresultpopulatedlist_runsreturns the resolvedrepo_rootplus recent run summaries for that repo
Async Runs
If your MCP client gives up on long blocking tool calls before Dobby finishes, use the async path:
{
"tool": "start_run",
"arguments": {
"tool": "review",
"prompt": "Review the current uncommitted state",
"repo_root": "/ABSOLUTE/PATH/TO/TARGET-REPO",
"files": ["src/foo.ts", "ui/main.ts"]
}
}This returns quickly with a task_id. Then poll or recover the result:
{
"tool": "get_run",
"arguments": {
"task_id": "<task-id>",
"repo_root": "/ABSOLUTE/PATH/TO/TARGET-REPO"
}
}If you lost the id because a previous blocking call timed out, list_runs reads .codex-dobby/runs/ and shows recent task ids and summaries.
If you'd rather block than poll, call wait_run:
{
"tool": "wait_run",
"arguments": {
"task_id": "<task-id>",
"repo_root": "/ABSOLUTE/PATH/TO/TARGET-REPO"
}
}To be woken by whichever of several runs finishes first, pass task_ids instead:
{
"tool": "wait_run",
"arguments": {
"task_ids": ["<task-id-1>", "<task-id-2>", "<task-id-3>"],
"repo_root": "/ABSOLUTE/PATH/TO/TARGET-REPO"
}
}Omit both task_id and task_ids to wait on every currently-live run for the repo. On completion / timeout semantics, see the wait_run params in Requests — the short version: the response's pending_task_ids tells you what to re-call wait_run with.
States reported by get_run and wait_run:
running: the server still has the run alive in memoryfinished: a finalToolResponseis available andresult_stateisfinalunknown: the run directory exists but no readable final result is available; ifresult_stateisplaceholder, only the startup placeholder artifact was writtennot_found: there is no matching run directory, or the suppliedtask_idis invalid
Important limitation: live background tracking is in-process. If the server restarts, running background work is lost. Completed results remain recoverable from .codex-dobby/runs/.
Development
uv run pytest
uv build --offline --no-build-isolation
uv run mcp dev src/codex_dobby_mcp/server.py:app
uv run python -m codex_dobby_mcpThe default suite includes a sanitized production-shape rollout corpus captured from a successful codex-cli 0.147.0 multi-agent v2 run and synthetic coverage for the 0.164.0 child-session shape. Before deploying against a new Codex CLI release, also run the authenticated opt-in smoke test:
CODEX_DOBBY_RUN_LIVE_V2=1 uv run pytest -m live tests/test_live_codex_v2.pyTests marked live validate the flags Dobby emits against the real codex exec --help. On a machine without codex they skip cleanly. CI runs them in a dedicated lane against the latest published @openai/codex with DOBBY_REQUIRE_LIVE=1, which turns any skip of a no-auth live test — including a missing codex — into a hard failure, so upstream flag drift is caught and the lane can never silently degrade into a skip. Tests additionally marked live_auth need an authenticated Codex CLI and remain local-only.
Release tags must exactly match project.version; for version 0.1.4, publish tag v0.1.4. The publish workflow checks this before both testing and building. A release candidate is ready only after the normal test suite, the live v2 smoke test, uv build, and an installed-wheel MCP initialize check all pass. AGENTS.md, CHANGELOG.md, release checks, tests, and the sanitized v2 corpus are included in the source distribution so downstream maintainers and coding agents receive the same operating guidance.
Available Tools
11 toolsbrainstormC
Evaluate an idea, scope an MVP, and recommend whether it is worth building. Recommended timeout: 10 minutes (600s).
Inputs: prompt (required), repo_root (required), files, model, +4 more. Returns: tool, model, status, summary, +18 more
buildC
Implement a change, run focused verification, and report results. Recommended timeout: 20 minutes (1200s).
Inputs: prompt (required), repo_root (required), files, model, +5 more. Returns: tool, model, status, summary, +18 more
get_runA
Get the status or final ToolResponse for a Dobby run by task id. This can recover results from .codex-dobby/runs even after a blocking tools/call timed out.
Inputs: task_id (required), repo_root (required). Returns: tool, state, result, status, +8 more
list_runsB
List recent Dobby runs for a repo. Useful for recovering task ids and results after a caller-side timeout.
Inputs: repo_root (required), limit. Returns: runs, repo_root
planB
Break down a task and propose a scoped plan without editing files. Recommended timeout: 10 minutes (600s).
Inputs: prompt (required), repo_root (required), files, model, +4 more. Returns: tool, model, status, summary, +18 more
researchC
Investigate code, docs, and context in read-only mode and report findings. Recommended timeout: 20 minutes (1200s).
Inputs: prompt (required), repo_root (required), files, model, +4 more. Returns: tool, model, status, summary, +18 more
reverse_engineerC
Use reverse-engineering tooling and broader roots to investigate binaries. Recommended timeout: 30 minutes (1800s).
Inputs: prompt (required), repo_root (required), files, model, +5 more. Returns: tool, model, status, summary, +18 more
reviewB
Review code with one agent (default) or fan out to multiple specialist agents. Recommended timeout: 10 minutes single-agent, 20 minutes multi-agent (pass timeout_seconds=1200 when using multiple agents).
Inputs: prompt (required), repo_root (required), files, model, +5 more. Returns: tool, model, status, summary, +18 more
start_runA
Start a Dobby tool in the background and return immediately with a task id. Follow up with wait_run(task_id=...) to block on one run, or call start_run several times and then wait_run(task_ids=[...]) to be woken by whichever finishes first. get_run/list_runs remain available for a non-blocking peek. Recommended when your MCP client enforces short tools/call timeouts.
Inputs: tool (required), prompt (required), repo_root (required), files, +7 more. Returns: tool, model, state, summary, +4 more
validateA
Run existing repo validation commands (build, test, lint) and report the results. Recommended timeout: 10 minutes (600s).
Inputs: prompt (required), repo_root (required), files, model, +4 more. Returns: tool, model, status, summary, +18 more
wait_runA
Call after start_run to block until a background run finishes. Pass task_id for one run, task_ids=[...] to wait for whichever of several finishes FIRST, or omit both to wait on every currently-live run for the repo. On completion returns the winning run's final ToolResponse (pending_task_ids lists any still-running siblings); on timeout returns a RUNNING lookup whose summary says to keep calling wait_run with pending_task_ids until one finishes. Background tasks are shielded from waiter cancellation, so re-calling never loses work. Default 540s (9 min); clamped to [1, 100_000s / ~27.8h], matching Claude Code's MCP_TOOL_TIMEOUT default. Pick timeout_seconds below your own MCP client's tools/call ceiling — Claude Code defaults to ~28h (the full clamp is usable); Codex CLI defaults to 60s per [mcp_servers.].tool_timeout_sec (raise that first); Claude Desktop / Cursor / Cline / Continue vary.
Inputs: repo_root (required), task_id, task_ids, timeout_seconds. Returns: tool, state, result, status, +8 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Each tool has a uniquely defined purpose with no overlap. brainstorming, building, planning, researching, reviewing, validating, and reverse-engineering are clearly distinct activities, and run-management tools are separate.
Most tools use a single verb (brainstorm, build, plan, etc.) while run-management tools use verb_noun pattern (start_run, get_run). This is mostly consistent with minor deviation.
11 tools is well-scoped for a code development assistant. Each tool serves a distinct phase or function without unnecessary duplication.
The tools cover the full lifecycle from idea evaluation (brainstorm), planning, implementation (build), review, validation, reverse engineering, and run management. No obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
An MCP server that gives your AI access to the source code and docs of all public github repos
MCP server for generating rough-draft project plans from natural-language prompts.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server enabling Claude to consult Codex (GPT-5.x) mid-task for second opinions, plan/diff review, brainstorming, and codebase exploration via structured debates and permission-controlled interactions.2MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables Claude to discover and delegate tasks to local Codex Skills and plugins, bridging Claude's natural language understanding with Codex's execution capabilities.Apache 2.0
- AlicenseAqualityCmaintenanceAn MCP server for running Claude Code and the Codex CLI as a pair: Claude drives, and hands self-contained tasks to Codex as background jobs.8MIT
- AlicenseAqualityDmaintenanceA local MCP server that lets Claude Code orchestrate Codex CLI and OpenCode CLI as sub-agents with strict security, concurrency, and output limits.41MIT