Claw Orchestrator

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

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
npm install -g @enderfga/claw-orchestrator
Claude CodeTerminal
claude mcp add claw-orchestrator -- clawo-mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "claw-orchestrator": {
      "command": "clawo-mcp",
      "args": []
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "claw-orchestrator": {
      "command": "clawo-mcp",
      "args": []
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "claw-orchestrator": {
      "type": "stdio",
      "command": "clawo-mcp",
      "args": []
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.claw-orchestrator]
command = "clawo-mcp"
args = []
Gemini CLITerminal
gemini mcp add --scope user claw-orchestrator clawo-mcp

Settings 7

ANTHROPIC_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. For multi-model proxy.
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. Default 1.
Set together: gateway
GATEWAY_URL Optional: Address of an OpenClaw or Anthropic-style gateway for the proxy route, used with GATEWAY_KEY. For multi-model proxy.
GATEWAY_KEY secret Optional: Key for the gateway in GATEWAY_URL. For multi-model proxy.

What it does

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.

What it needs

RuntimeNode.js 22+
Runs onmacOS, 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
  • At least one engine CLI on PATH: claude, codex, agy, grok, opencode, or an ACP agent such as kimi or dsh

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.

Limits

  • Not covered Each MCP host starts its own clawo-mcp process, so sessions started from one host are not visible from another.
  • Limit If none of the names in CLAWO_MCP_TOOLS match a tool, the server advertises no tools and only prints a warning to stderr.
  • Not covered Autoloop roles cannot use the acp engine, and ultrareview reviewers cannot use acp or custom engines (per src/index.ts).
  • Not covered Fan-out, council and workflow agents take an ACP agent by preset id only. An inline ACP config is accepted from a local caller only.
  • Not covered The goal workflow template and the codex_goal_* tools work on codex-app sessions only.
  • Cost Every engine bills its own vendor account. maxBudgetUsd relies on estimated cost for engines that estimate token counts.
  • Platform A read-only sandboxMode on Grok is refused on systems without Seatbelt or Landlock. The acp engine refuses read-only outright.
  • Limit A custom engine must map permission modes in its config, or its session refuses to start.
  • Not covered The dashboard and the OpenAI-compatible endpoint need clawo serve. The MCP server does not open them.

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.

Who it suits

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.

Tools 60 of 79

21 only read, 36 change things, 3 can delete or overwrite. A ? marks an optional parameter.

session_start changes
Start a long-lived coding-agent session on a chosen engine, model and folder, including ACP agentsname?: stringcwd?: stringengine?: enummodel?: stringpermissionMode?: enumeffort?: enumallowedTools?: arraydisallowedTools?: arrayaddDir?: arraymaxTurns?: numbermaxBudgetUsd?: numbersystemPrompt?: stringappendSystemPrompt?: stringworktree?: anymcpConfig?: stringultracode?: booleansandboxMode?: enumcustomEngine?: anyacpAgent?: anyresumeSessionId?: string
session_send changes
Send a message into a running session and wait for its replyname: stringmessage: stringeffort?: enumplan?: booleantimeout?: numberstream?: boolean
session_handoff changes
Replay a live conversation onto another engine or model in the same foldername: stringengine: enummodel?: stringnewName?: stringmessage?: stringmaxChars?: numbercustomEngine?: anyacpAgent?: any
session_stop changes
Stop a running sessionname: string
session_list
List the sessions this process holds
sessions_overview
Summarise every session at once
coding_session_status
Report the state of one sessionname: string
session_grep
Search a session's history for a patternname: stringpattern: stringlimit?: number
session_compact changes
Compact a session's context, optionally with your own summaryname: stringsummary?: string
session_update_tools changes
Change which tools a session's agent may usename: stringallowedTools?: arraydisallowedTools?: arrayremoveTools?: arraymerge?: boolean
session_switch_model changes
Move a session to another modelname: stringmodel: string
project_purge deletes
Delete Claude Code's stored state for a project; a dry run unless dry_run is falsepath?: stringall?: booleandry_run?: boolean
claude_goal_set changes
Set a goal on a Claude sessionname: stringobjective: stringtimeout?: number
claude_goal_clear changes
Clear the goal on a Claude sessionname: stringtimeout?: number
claude_goal_status
Read the goal status of a Claude sessionname: stringtimeout?: number
claude_agents_list
List the Claude Code subagents defined for a folder or everywhereall?: booleancwd?: string
codex_resume changes
Resume an earlier Codex conversation with a new messagesession_id?: stringlast?: booleanmessage: stringcwd?: stringmodel?: stringtimeout?: number
codex_review
Run a Codex code review of uncommitted changes, a branch or a commitprompt?: stringcwd?: stringuncommitted?: booleanbase?: stringcommit?: stringtitle?: stringmodel?: stringtimeout?: number
codex_goal_set changes
Set a goal on a codex-app session, with an optional token budgetname: stringobjective: stringtokenBudget?: number
codex_goal_get
Read the goal of a codex-app session without sending a turnname: string
codex_goal_pause changes
Pause goal work on a codex-app sessionname: string
codex_goal_resume changes
Resume a paused goal on a codex-app sessionname: string
codex_goal_clear changes
Remove the goal from a codex-app sessionname: string
codex_interrupt changes
Cancel the turn a codex-app session is runningname: string
codex_steer changes
Add input to a codex-app turn that is still runningname: stringmessage: string
codex_fork changes
Branch a codex-app thread into a new threadname: string
codex_rollback deletes
Drop the last turns from a codex-app threadname: stringnumTurns: number
codex_models
List the models a codex-app session can usename: string
codex_thread_list
List Codex threads, with search and folder filtersname: stringsearchTerm?: stringcwd?: stringarchived?: booleancursor?: stringlimit?: number
fanout_start changes
Send one task to up to 16 engine or model agents in paralleltask: stringprojectDir: stringagents: arraysynthesize?: booleansynthesisModel?: stringsynthesisEngine?: enumsynthesisAcpAgent?: stringagentTimeoutMs?: numbermaxTurnsPerAgent?: numbermaxBudgetUsd?: number
fanout_status
Collect a fan-out's answers and progressid: string
fanout_abort changes
Cancel a fan-outid: string
coding_agents_list
List the engine CLIs found on this machinecwd?: string
team_list
List the members of a session's agent teamname: string
team_send changes
Send a message to one teammate in a session's agent teamname: stringteammate: stringmessage: string
council_start changes
Start agents in separate git worktrees that work in rounds until they agreetask: stringprojectDir: stringagents?: arraymaxRounds?: numberagentTimeoutMs?: numbermaxTurnsPerAgent?: numbermaxBudgetUsd?: numberdefaultPermissionMode?: enum
council_status
Read a council's progressid: string
council_abort changes
Stop a running councilid: string
council_inject changes
Add a message into a running councilid: stringmessage: string
council_review
Show a finished council's result for reviewid: string
council_accept deletes
Accept a council's work and remove its worktrees, branches and plan filesid: string
council_reject changes
Reject a council's work and write the feedback into its planid: stringfeedback: string
session_send_to changes
Send a message from one session to anotherfrom: stringto: stringmessage: stringsummary?: string
session_inbox
Read the messages waiting for a sessionname: stringunreadOnly?: boolean
session_deliver_inbox changes
Deliver a session's queued messages into itname: string
ultraplan_start changes
Start a planning run in a foldertask: stringcwd?: stringmodel?: stringtimeout?: number
ultraplan_status
Read a planning run's stateid: string
ultrareview_start changes
Start a code review by several reviewer agentscwd: stringagentCount?: numbermaxDurationMinutes?: numbermodel?: stringfocus?: stringengines?: array
ultrareview_status
Read a review run's stateid: string
autoloop_start changes
Start a planner, coder and reviewer loop on a workspacerun_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?: number
autoloop_chat changes
Talk to an autoloop's plannerrun_id: stringtext: string
autoloop_status
Read an autoloop's staterun_id: string
autoloop_list
List autoloops
autoloop_reset_agent changes
Restart one agent inside an autolooprun_id: stringagent: enumforce?: booleaneager_restart?: boolean
autoloop_stop changes
Stop an autolooprun_id: stringreason?: string
autoloop_resume changes
Resume a paused autoloop run, optionally raising its send timeoutrun_id: stringsend_timeout_ms?: numberpending_dispatch_id?: stringplannerCustomEngineRef?: stringcoderCustomEngineRef?: stringreviewerCustomEngineRef?: string
workflow_start changes
Start a durable workflow from a spec or a template (solve, council, fanout, goal), with an optional acceptance contractspec?: objecttemplate?: enumtask?: stringagents?: arrayreviewers?: arrayimplementer?: objecthumanGate?: booleanmaxRounds?: numbermaxRepairs?: numbermodel?: stringtokenBudget?: numberlauncher?: arraycwd?: stringrunId?: stringcontract?: object
workflow_status
Read a workflow run's state and recent eventsrunId: stringevents?: number
workflow_resume changes
Resume a workflow run from its last checkpointrunId: stringagentCustomEngineRefs?: object
verify_run changes
Run an acceptance contract's checks in a folder and return the evidencecwd: stringbaseSha?: stringlabel?: stringcontract: object

Similar servers