Claudexor
Routes coding tasks to Claude Code, Codex, Cursor, OpenCode, Antigravity or Grok Build and tracks quota
Runs Claude Code, Codex, Grok Build and ACP agents as sessions, with checks the agents cannot edit
By Guian Fang (individual) TypeScript Local · stdio AI and MLDeveloper tools
66 popularity score ★ 602 ↓ 2.1k/wk
Opens the app, which asks before it adds the server.
npm install -g @enderfga/claw-orchestratorclaude mcp add claw-orchestrator -- clawo-mcp{
"mcpServers": {
"claw-orchestrator": {
"command": "clawo-mcp",
"args": []
}
}
}{
"mcpServers": {
"claw-orchestrator": {
"command": "clawo-mcp",
"args": []
}
}
}{
"servers": {
"claw-orchestrator": {
"type": "stdio",
"command": "clawo-mcp",
"args": []
}
}
}[mcp_servers.claw-orchestrator]
command = "clawo-mcp"
args = []gemini mcp add --scope user claw-orchestrator clawo-mcpANTHROPIC_API_KEY secret |
Optional: Key for the Claude Code engine when its CLI is not signed in. |
|---|---|
OPENAI_API_KEY secret |
Optional: Key for the Codex engine when its CLI is not signed in. |
GEMINI_API_KEY secret |
Optional: Gemini key for the multi-model proxy route, which clawo-mcp does not serve. |
CLAWO_MCP_TOOLS |
Optional: Comma-separated tool names to advertise. Unset exposes all 79. |
CLAWO_NO_EMBEDDED_SERVER |
Optional: Keeps the HTTP control plane on port 18796 closed. clawo-mcp sets it to 1 when unset. |
| Set together: gateway | |
GATEWAY_URL |
Optional: Address of an OpenClaw or Anthropic-style gateway for the proxy route, used with GATEWAY_KEY. |
GATEWAY_KEY secret |
Optional: Key for the gateway in GATEWAY_URL. |
Claw Orchestrator is a local runtime that keeps coding-agent command-line tools running as long-lived sessions and puts them behind one tool surface. Out of the box it drives Claude Code, Codex, Antigravity (agy), Grok Build and OpenCode. It can also run any agent that speaks the Agent Client Protocol over stdio as `engine: 'acp'`, with bundled presets for Kimi Code and dsh, and any other coding CLI can be wired up as a custom engine. The MCP server, `clawo-mcp`, ships in the npm package next to the `clawo` CLI and the `clawo-acp` agent, and it registers 79 tools.
From a host you can start a session on one engine, keep sending it work, and hand the conversation to another engine halfway through. You can also put one question to several engines at once, or set a council of agents loose in separate git worktrees until they agree. Workflows are checkpointed, so a run picks up again after a restart. If you attach an acceptance contract (test commands, HTTP probes, screenshots, diff rules, file checks), the runtime runs those checks itself and marks the run verified, refuted or unverified from the results instead of from what the agent claims. The `goal` workflow template (also `clawo goal`) puts a Codex /goal on one codex-app thread and then verifies and repairs on that same thread. Each turn lands in a ledger with tokens and cost, and `maxBudgetUsd` stops further sends once a session has spent its cap.
A paused autoloop run can be picked up again with `autoloop_resume`.
Some defaults show up only in the tool schemas in src/index.ts. Council agents get `bypassPermissions` unless you pass `defaultPermissionMode`, and a council runs up to 15 rounds with 50 tool turns per agent per round by default. A fan-out takes at most 16 agents. `project_purge` only reports what it would delete until you pass `dry_run=false`. On launch `clawo-mcp` sets `CLAWO_NO_EMBEDDED_SERVER=1` if it is not already set, so the HTTP dashboard on port 18796 that `clawo serve` opens stays closed.
| Runtime | Node.js 22+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| A coding engine vendor (Anthropic, OpenAI, xAI or other) | Paid planAt least one engine CLI installed and signed in. Each engine bills on its own vendor account. |
| Also |
|
Install the package globally (`npm install -g @enderfga/claw-orchestrator`) so `clawo-mcp` is on PATH. The engine CLIs are not included and must be installed and signed in separately. MCP hosts do not pass on your shell environment, so put any API key or PATH an engine needs in the host's env block. Per the MCP guide, `CLAUDE_BIN`, `CODEX_BIN` and similar point at an engine binary that is not on PATH.
With 79 tools, a host with a small context gets crowded. `CLAWO_MCP_TOOLS` limits the list, but if none of its names match, the server advertises no tools at all and prints a warning to stderr. Each MCP host starts its own `clawo-mcp` process, so sessions started from one host (or one Codex session) are not visible from another. `maxBudgetUsd` relies on cost estimates for engines that estimate token counts. A read-only `sandboxMode` on Grok is refused on platforms without Seatbelt or Landlock, and a custom engine must map permission modes or its session will not start. The dashboard and the OpenAI-compatible endpoint need `clawo serve`, not the MCP server.
It suits developers who already use two or more coding CLIs and want one assistant to spread work across them, compare answers, or accept a change only after real checks pass. The agents it starts edit code and run commands on your machine, and councils skip permission prompts by default, so point it at a project folder or worktree you can afford to have changed. If you only use one vendor's agent and do not need cross-checks, that agent's own subagents are simpler and spare your host a 79-tool list. If you already run OpenClaw, the project's docs suggest installing it as an OpenClaw plugin instead of through MCP.
21 only read, 36 change things, 3 can delete or overwrite. A ? marks an optional parameter.
session_start changesname?: stringcwd?: stringengine?: enummodel?: stringpermissionMode?: enumeffort?: enumallowedTools?: arraydisallowedTools?: arrayaddDir?: arraymaxTurns?: numbermaxBudgetUsd?: numbersystemPrompt?: stringappendSystemPrompt?: stringworktree?: anymcpConfig?: stringultracode?: booleansandboxMode?: enumcustomEngine?: anyacpAgent?: anyresumeSessionId?: stringsession_send changesname: stringmessage: stringeffort?: enumplan?: booleantimeout?: numberstream?: booleansession_handoff changesname: stringengine: enummodel?: stringnewName?: stringmessage?: stringmaxChars?: numbercustomEngine?: anyacpAgent?: anysession_stop changesname: stringsession_listsessions_overviewcoding_session_statusname: stringsession_grepname: stringpattern: stringlimit?: numbersession_compact changesname: stringsummary?: stringsession_update_tools changesname: stringallowedTools?: arraydisallowedTools?: arrayremoveTools?: arraymerge?: booleansession_switch_model changesname: stringmodel: stringproject_purge deletespath?: stringall?: booleandry_run?: booleanclaude_goal_set changesname: stringobjective: stringtimeout?: numberclaude_goal_clear changesname: stringtimeout?: numberclaude_goal_statusname: stringtimeout?: numberclaude_agents_listall?: booleancwd?: stringcodex_resume changessession_id?: stringlast?: booleanmessage: stringcwd?: stringmodel?: stringtimeout?: numbercodex_reviewprompt?: stringcwd?: stringuncommitted?: booleanbase?: stringcommit?: stringtitle?: stringmodel?: stringtimeout?: numbercodex_goal_set changesname: stringobjective: stringtokenBudget?: numbercodex_goal_getname: stringcodex_goal_pause changesname: stringcodex_goal_resume changesname: stringcodex_goal_clear changesname: stringcodex_interrupt changesname: stringcodex_steer changesname: stringmessage: stringcodex_fork changesname: stringcodex_rollback deletesname: stringnumTurns: numbercodex_modelsname: stringcodex_thread_listname: stringsearchTerm?: stringcwd?: stringarchived?: booleancursor?: stringlimit?: numberfanout_start changestask: stringprojectDir: stringagents: arraysynthesize?: booleansynthesisModel?: stringsynthesisEngine?: enumsynthesisAcpAgent?: stringagentTimeoutMs?: numbermaxTurnsPerAgent?: numbermaxBudgetUsd?: numberfanout_statusid: stringfanout_abort changesid: stringcoding_agents_listcwd?: stringteam_listname: stringteam_send changesname: stringteammate: stringmessage: stringcouncil_start changestask: stringprojectDir: stringagents?: arraymaxRounds?: numberagentTimeoutMs?: numbermaxTurnsPerAgent?: numbermaxBudgetUsd?: numberdefaultPermissionMode?: enumcouncil_statusid: stringcouncil_abort changesid: stringcouncil_inject changesid: stringmessage: stringcouncil_reviewid: stringcouncil_accept deletesid: stringcouncil_reject changesid: stringfeedback: stringsession_send_to changesfrom: stringto: stringmessage: stringsummary?: stringsession_inboxname: stringunreadOnly?: booleansession_deliver_inbox changesname: stringultraplan_start changestask: stringcwd?: stringmodel?: stringtimeout?: numberultraplan_statusid: stringultrareview_start changescwd: stringagentCount?: numbermaxDurationMinutes?: numbermodel?: stringfocus?: stringengines?: arrayultrareview_statusid: stringautoloop_start changesrun_id: stringworkspace: stringplanner_engine?: enumplanner_model?: stringplanner_effort?: enumplanner_custom_engine?: anycoder_engine?: enumcoder_model?: stringcoder_effort?: enumcoder_custom_engine?: anyreviewer_engine?: enumreviewer_model?: stringreviewer_effort?: enumreviewer_custom_engine?: anysend_timeout_ms?: numberactivity_lease_ms?: numberautoloop_hard_timeout_ms?: numberautoloop_chat changesrun_id: stringtext: stringautoloop_statusrun_id: stringautoloop_listautoloop_reset_agent changesrun_id: stringagent: enumforce?: booleaneager_restart?: booleanautoloop_stop changesrun_id: stringreason?: stringautoloop_resume changesrun_id: stringsend_timeout_ms?: numberpending_dispatch_id?: stringplannerCustomEngineRef?: stringcoderCustomEngineRef?: stringreviewerCustomEngineRef?: stringworkflow_start changesspec?: objecttemplate?: enumtask?: stringagents?: arrayreviewers?: arrayimplementer?: objecthumanGate?: booleanmaxRounds?: numbermaxRepairs?: numbermodel?: stringtokenBudget?: numberlauncher?: arraycwd?: stringrunId?: stringcontract?: objectworkflow_statusrunId: stringevents?: numberworkflow_resume changesrunId: stringagentCustomEngineRefs?: objectverify_run changescwd: stringbaseSha?: stringlabel?: stringcontract: object