central-mcp
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., "@central-mcpdispatch a code review to project alpha"
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.
central-mcp
The portfolio PM for running many agent-driven projects at once.
All lines run through central. Dispatch across every project, and never lose the thread of any of them.
One MCP server turns any MCP-capable client (Claude Code, Codex CLI, Gemini CLI, opencode, Hermes Agent, OpenClaw, gajae-code) into a control plane for your portfolio of coding-agent projects. Ask in natural language, and the orchestrator routes the request to the right project's agent — non-blocking, with results reported back asynchronously — then briefs you on that project's real state whenever you come back to it.
Why
Agents made it cheap to run four, eight, fifteen projects at once. They did nothing about keeping track of them. Every context switch charges a re-orientation tax — what happened here while I was away? What state is it in? What was I about to do next? — and nobody is playing PM.
central-mcp is that PM:
Dispatch — send work to any project's agent, in parallel, and keep talking while it runs
Pulse — return to a project and get "what happened / where it stands / what's next", computed from the repository itself, so work that never went through the hub (direct commits, interactive agent sessions, manual edits) counts too
Digest — a fixed-format daily/weekly portfolio report, deliverable to chat by a resident agent or a plain crontab
Observe — live panes on the dispatches you're actively following
Orchestrate from anywhere — any MCP-capable client can be the front end; never locked to one vendor
Every dispatch is a fresh subprocess in the project's cwd (e.g. claude -p "..." --continue). No long-lived processes, no screen scraping, no tmux dependency on the critical path.
Related MCP server: agent-bridge
How you meet it — three tiers
central-mcp is a layer, not a place. A dedicated orchestrator you have to remember to visit gets forgotten, so the surfaces are ranked by how they reach you:
Ambient (the main way in).
cmcp install claudeonce, and every session of the CLI you already use carriesdispatch,project_pulse, and the rest alongside its normal tools. Open a project, ask "where does this stand?", and the briefing happens in place.Reach. A resident agentOS bridge — Hermes or OpenClaw — sends the daily digest and failure alerts to Telegram/Discord, the one channel that finds you when no terminal is open.
Focus.
cmcp tui(experimental), for sessions whose main job is orchestration — fan out, watch it land, supervise.
Design principles
Coding agent-agnostic. MCP tools are the canonical surface. Any MCP-capable client can be the orchestrator; any supported coding agent CLI can be the dispatch target.
Non-blocking dispatch.
dispatchreturns adispatch_idin <100ms. Results arrive asynchronously. The conversation never freezes.Dispatch-router preamble. The orchestrator is instructed to be a pure router — parse the project name, call
dispatch, move on. This minimizes LLM reasoning latency to ~1-2 seconds per turn.File-based state.
registry.yamlis the single source of truth.
Status
One-line curl installer ships at https://central-mcp.org — bootstraps uv when missing, installs central-mcp, and runs central-mcp init.
Supported platforms
Run central-mcp on the platform it's been exercised on, and expect a bit of roughness elsewhere:
macOS — primary development and test target.
Linux — expected to work (pure Python, tmux/zellij are cross-platform), but not regularly tested; please file issues if you hit edges.
Windows — not officially tested. The core (Python + MCP tools + the tmux / zellij backends where those run on Windows) should work in principle; the cmux backend is macOS-only, so the observation-layer options on Windows collapse to whichever of tmux / zellij you can install. Please file issues if you hit edges.
Quickstart
# One line — bootstraps uv, installs central-mcp, runs `central-mcp init`.
curl -fsSL https://central-mcp.org/install.sh | sh(tmux only if you want the optional observation layer.)
# Launch — one command does everything
central-mcpManual install if you'd rather not pipe a script:
# 1. Install uv (https://docs.astral.sh/uv/) if you don't have it yet curl -LsSf https://astral.sh/uv/install.sh | sh # 2. Install central-mcp + scaffold ~/.central-mcp/ uv tool install central-mcp central-mcp initOr with pip:
pip install central-mcp
The first central-mcp run auto-creates ~/.central-mcp/registry.yaml and registers central-mcp with every MCP client binary it finds on PATH (claude, codex, gemini, opencode, hermes, openclaw, gjc). After that it launches the orchestrator in your preferred agent.
Manual install if you want fine-grained control:
central-mcp install all— re-detect + register everywhere
central-mcp install claude— register with a single client
central-mcp init— create the registry without launching
Inside the orchestrator session, speak naturally — full example catalog in First session below.
The orchestrator calls dispatch for each request and continues the conversation immediately — you don't wait. Results arrive through three channels:
Piggyback (automatic): every MCP tool response includes a
completed_dispatchesarray with any results that finished since the last call.Background poll (best-effort): a subagent polls
check_dispatchevery 3 seconds and reports automatically when done.User-driven check (100% reliable): ask "any updates?" anytime.
Multiple dispatches run in parallel.
First session — natural-language examples
Everything below is spoken to the orchestrator in plain language. The orchestrator picks the right MCP tool and moves on. You do NOT need to memorize dispatch(...) / add_project(...) / check_dispatch(...) — those are the MCP-layer verbs shown elsewhere in the README for reference, not commands you type.
Set up (once):
"Add ~/Projects/my-app to the hub. Use claude as its agent."
"Register ~/Projects/api-server — default agent is fine."
"What projects do I have?"
Send work:
"Ask my-app to add a dark mode toggle in settings."
"Send my-app and api-server the same prompt: tighten up the README."
"Dispatch to my-app with codex instead of claude this time."
Check progress:
"What's running right now?"
"Any updates?" / "status?"
"How did that last dispatch to my-app go?"
"Show the last 3 dispatches for my-app."
"Overall status across all projects?" (triggers a portfolio-wide summary)
Recover / switch threads:
"Cancel the my-app dispatch — the prompt was wrong."
"What conversation sessions do I have for api-server?"
"Switch api-server to session abc123 for the next dispatch."
"Back to the default / latest session for api-server."
Language preferences:
"For my-app, answer me in Korean from now on."
"Use French for api-server unless I say otherwise."
"Just this one dispatch in Japanese for my-app."
"Clear the saved language for my-app and go back to English."
Shape the fleet:
"Put my-app and api-server at the top of the list."
"Remove the old legacy-tool project."
Observation tip for first-time users. Starting out, it's worth running central-mcp tmux (or zellij — or cmcp inside cmux.app on macOS) in a second terminal so you can see the per-project dispatch streams live while you chat with the orchestrator. It builds intuition for how fast dispatches really are and what kinds of prompts produce useful output. Once the orchestrator's summaries match what you'd have checked in the panes anyway, drop observation and work from the orchestrator alone — see Optional observation layer below for the full story.
MCP tools
central-mcp exposes 18 tools under the server name central:
Tool | Blocking? | Purpose |
| sync | Enumerate the registry. |
| sync | Metadata for one project — cheap, no subprocesses. |
| sync | What actually happened in a project, where it stands, what's live. Reads the repository (branch, upstream ahead/behind, uncommitted work, recent commits) plus dispatches, sessions, and open PRs — so work that never went through central-mcp shows up. Call it when the user returns to a project or asks "what's the state of X?". |
| sync | Pre-rendered daily/weekly portfolio report. Active projects, warnings (failed and never-finalized dispatches, quiet projects with uncommitted work), quiet list, quota line. Forward |
| <100ms | Send a prompt to a project's agent. Supports per-dispatch agent override and fallback chain. Returns |
| sync | Poll a dispatch — |
| sync | All active + recently completed dispatches. |
| sync | Abort a running dispatch. |
| sync | Last N dispatches for one project (reads its jsonl log). |
| sync | Portfolio-wide snapshot: in-flight + recent cross-project milestones + per-project counts. Call this for "how is everything going?" |
| sync | Enumerate the agent's resumable conversation sessions for one project, including a short best-effort |
| sync | Register a new project. Validates agent name. Auto-trusts codex dirs. |
| sync | Change an existing project's agent, description, tags, permission_mode, fallback, |
| sync | Reorder the registry. Lenient: names listed move to the front, others keep their relative order. Strict mode requires listing every project. |
| sync | Unregister a project. |
How dispatch works
dispatch("my-app", "add error handling to auth")
→ subprocess.Popen(["claude", "-p", "...", "--continue"], cwd="~/Projects/my-app")
→ returns {dispatch_id: "a1b2c3d4"} in <100ms
→ background thread captures stdout when process exits
→ check_dispatch("a1b2c3d4") → {status: "complete", output: "...", duration_sec: 45}Supported agents
Agent | Non-interactive invocation |
|
|
|
|
|
|
|
|
| — |
|
|
| — |
|
|
| — |
|
|
| — |
|
|
| — |
|
| — (print mode runs tools unattended) | — |
Agent names are validated at registration time — typos like cursor-agent are caught immediately, not at dispatch time.
Switching agents mid-project
You can change a project's registered agent any time — useful when a given codebase turns out to pair better with a different CLI:
update_project(name="my-app", agent="codex")update_project also accepts description, tags, permission_mode, and fallback — omitted fields stay untouched. Switching to codex auto-adds the project dir to ~/.codex/config.toml trust list.
One-shot agent override
Sometimes you want to route one task to a different agent without mutating the registry — e.g. a design-heavy task goes to a design-strong agent while the project stays on its usual one:
dispatch(name="my-app", prompt="...", agent="codex")The registry entry is untouched. Next dispatch without agent= goes back to the project's saved agent.
Fallback chain on failure
If the primary agent exits non-zero (rate limit, token cap, crash), central-mcp can transparently retry with a backup:
# per-dispatch (not persisted):
dispatch(name="my-app", prompt="...", fallback=["codex", "gemini"])
# save a default for this project:
update_project(name="my-app", fallback=["codex", "gemini"])The result reports which agent actually produced output (agent_used), whether a fallback was triggered (fallback_used), and the full list of attempts. Timeouts are not retried — the user should see them directly rather than burn the whole chain on a stuck agent.
Pass fallback=[] to explicitly disable the saved chain for a one-shot dispatch.
Permission modes
Most coding agents ask "is this OK?" before editing files, running commands, or installing packages. That's fine when a human is at the terminal — but anywhere central-mcp runs, there's no TTY to answer approval prompts, so the work can hang forever waiting for a reply that never comes. Every agent instance central-mcp spawns (orchestrator pane or project-level dispatch) runs in one of three permission modes:
Mode | What auto-approves | When to use |
| Everything. central-mcp emits each agent's own permission-skip flag (see mapping below). | Default. Fastest. No prompt-injection defense. Available on every supported agent. |
| Cwd-local file work, declared deps, read-only HTTP, pushes to branches Claude created. Everything else goes through a background classifier that blocks | Sensitive repos where prompt-injection resistance matters. Only supported by |
| Nothing. Any tool call that would normally prompt a human refuses and the agent surfaces the error. | Hardening for read-only tasks — Q&A, explain-code, reporting. Writes/builds/shell will fail. Available on every agent. |
Each vendor brands their permission-skip differently — central-mcp's bypass/auto are unified names that map to the right vendor flag per agent:
central-mcp mode | claude | codex | gemini | droid | opencode |
| Skip permissions | Bypass approvals + sandbox | YOLO | Skip permissions (unsafe) | Skip permissions |
| Auto mode | — | — | — | — |
| (no flag) | (no flag) | (no flag) | (no flag) | (no flag) |
If a vendor adds an equivalent to claude's auto mode later (codex sandbox-warn, gemini review-mode, etc), central-mcp will wire it into this same auto alias — existing config keeps working.
Modes apply at two separate layers:
1. Orchestrator layer — central-mcp run / central-mcp tmux / central-mcp up / central-mcp zellij
This is the agent you talk to — the orchestrator pane that calls MCP tools. Default: bypass. Change it with --permission-mode:
central-mcp tmux --permission-mode auto # claude-only, classifier-reviewed
central-mcp run --permission-mode restricted # no auto-approval, prompts will halt
central-mcp zellij --permission-mode bypass # explicit defaultWith orchestrator bypass, the orchestrator can freely read/write files inside ~/.central-mcp without asking — so CLAUDE.md, scratch notes, and hub-level edits happen without friction. With auto (claude + Sonnet/Opus 4.6 only), a background classifier vets each action instead of a blanket skip. auto is ignored (no flags emitted) for non-claude orchestrators. The orchestrator mode does not propagate to dispatched project agents; those carry their own per-project value.
2. Per-project dispatch layer — dispatch(..., permission_mode=...) / registry.yaml
This controls the agent spawned inside a specific project's cwd for one dispatch. The value is saved to registry.yaml on first dispatch (default: "bypass") and reused for every subsequent dispatch to that project. Flip it anytime:
dispatch(name="my-app", prompt="…", permission_mode="bypass") # auto-approve, save
dispatch(name="my-app", prompt="…", permission_mode="auto") # claude-only, classifier
dispatch(name="my-app", prompt="…", permission_mode="restricted") # no skip, no classifier
update_project(name="my-app", permission_mode="auto") # flip without dispatching"auto" is rejected with an explicit error if the project's agent chain includes anything other than claude — central-mcp never silently downgrades auto to bypass for a fallback. With "restricted", read-only dispatches still work (answering questions, reading files, explaining code); anything that would prompt (editing, shell, deps) times out — retry with bypass/auto, or open a regular terminal in the project's cwd for interactive approval.
⚠️
bypassis powerful — and at your own riskIn
bypassmode (at either layer), the agent may edit files, run shell commands, install packages, call network services, and push code without confirming with you first. That is what makes non-stop orchestration possible, but it also means a misguided prompt, prompt injection from a malicious source, or an agent hallucination can cause real damage — dropped tables, force-pushed branches, deleted files, leaked credentials, unintended API spend, etc.
automode is a middle ground — still headless, but a classifier blocks a standard set of destructive patterns (see the Claude Code permission-modes docs for the default policy). It reduces prompt-injection risk but does not eliminate it.restrictedis safest but only useful for agents that don't need to write.Typical reasoning:
Orchestrator mode controls what the hub-level agent can do in
~/.central-mcpand when calling MCP tools. Lower risk in practice because the hub dir has no production code, but still read/write.Per-project mode controls what each project-level agent can do inside that project's cwd. This is the higher-risk layer — it can rewrite your source, run your build, push branches.
Switch away from
bypass(toautofor claude, orrestricted) if any of these apply:
The project (or
~/.central-mcp) holds sensitive code, secrets, or production data you can't lose.No safety-net commit/push is in place.
You didn't read the prompt carefully or you're delegating work from untrusted sources.
You want to review every command the agent is about to run.
Disclaimer: central-mcp is a routing layer and does not supervise what the agents do. You are responsible for the scope, targets, and consequences of every dispatch you run in
bypass(orauto) mode at either layer. The authors and contributors of central-mcp are not liable for any damage, data loss, security breach, cost, or other harm that results from the selected mode. Use snapshots (git commits, backups, branch protection), least-privilege credentials, and offline/sandboxed environments where possible.
If a project deals with sensitive code and you're not comfortable granting blanket bypass, switch to auto (claude + Sonnet/Opus 4.6) or keep restricted and stick to read-only dispatches.
Session handling (conversation continuity)
By default, every dispatch resumes the agent's most-recently-modified conversation in the project's cwd — claude --continue, codex exec resume --last, gemini --resume latest, opencode --continue. Droid is the exception: its headless exec has no "resume latest", so a droid dispatch without an explicit session id always starts a fresh thread.
When the user wants to switch to a specific session (or recover from ambient drift — e.g., an interactive session in the same cwd made the "latest" move), dispatch(session_id=...) is a one-shot override:
list_project_sessions("my-app")
→ [{id: "a1b2...", title: "auth refactor", preview: "Investigate login timeout after refresh", modified: "..."}, ...]
dispatch("my-app", "continue from there", session_id="a1b2...")
# → claude -p "..." -r a1b2...After that dispatch, the resumed session is now the most-recently-modified — so the next default dispatch("my-app", "...") picks it up via --continue automatically. You only restate the id when you want to switch threads.
preview is intentionally bounded and best-effort, not a transcript dump. For filesystem-backed agents it usually comes from an early recognizable message in the session file; for CLI-only backends it may fall back to the backend's own title-like output.
For drift-proof behavior (or for droid, which needs a persistent pin to keep continuity), pin the session:
update_project("my-app", session_id="a1b2...")
# All future dispatches carry -r/-s <id> regardless of ambient state.
update_project("my-app", session_id="")
# Empty string clears the pin.Resolution precedence when dispatching: explicit session_id arg > project's saved session_id > agent's resume-latest flag.
Agent | Specific-session flag | Source of session list |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Preferred response language (per project)
Dispatch defaults stay unchanged: if no language is pinned or overridden, agents receive the original prompt and answer in their own default language (English for the agents central-mcp targets today).
When a project needs a different language consistently, save it in the registry:
update_project("my-app", language="Korean")Every future default dispatch to my-app now gets a preface like:
Respond to the user in Korean.
<original prompt>You can also set it at registration time:
add_project("my-app", "~/Projects/my-app", language="Korean")Per-dispatch behavior:
dispatch("my-app", "summarize the current status") # uses saved project language
dispatch("my-app", "summarize the current status", language="Japanese") # one-shot override
dispatch("my-app", "summarize the current status", language="") # suppress saved language once
update_project("my-app", language="") # clear saved language pinThe saved preference lives in registry.yaml as project metadata, so it is practical, explicit, and backward-compatible with older registries that simply omit the field.
Dispatch history (per project)
Every dispatch streams its start / output / complete events into ~/.central-mcp/logs/<project>/dispatch.jsonl (append-only). dispatch_history reads the terminal events back, merged with their matching start:
dispatch_history(name="my-app") # last 10 dispatches for my-app
dispatch_history(name="my-app", n=50) # last 50For a cross-project view, use orchestration_history (below).
Orchestration history (portfolio view)
Asks "how is everything going?" in one shot. Reads the global timeline at ~/.central-mcp/timeline.jsonl (also append-only) plus the server's in-memory in-flight table:
orchestration_history() # in-flight + last 20 milestones across all projects
orchestration_history(n=100) # wider slice of history
orchestration_history(window_minutes=60) # only count activity in the last hourThe response bundles: in_flight (running now), recent (newest milestones), per_project (dispatched/succeeded/failed/cancelled counts, last timestamp), and a registry snapshot. The orchestrator uses this to write a multi-project summary in one pass.
Performance / cost tip: lighter model for the orchestrator
The orchestrator's job is routing — it doesn't need top-tier reasoning. With Claude Opus 4.7 turns already land in ~2-3 seconds for routing, so latency is not a strong reason to switch. The stronger reason is tokens: every turn the orchestrator takes is billed against its model, and a routing turn with a lighter model is meaningfully cheaper. Optional tunings:
Orchestrator client | Tip |
Claude Code |
|
Codex CLI | Use a lighter model (e.g. |
Gemini CLI | Use Flash instead of Pro if your account offers it. |
opencode | Select a faster model via |
The sub-agent model is independent — each dispatch spawns its own process with whatever model the project's agent defaults to, so lightening the orchestrator does not lighten the sub-agents.
CLI reference
central-mcp # no-arg → launch orchestrator (same as `run`)
central-mcp run [--agent X] [--pick] [--permission-mode {bypass,auto,restricted}]
# launch orchestrator (default: bypass; auto is claude-only)
central-mcp serve # run MCP server on stdio (used by MCP clients)
central-mcp install CLIENT # register with claude | codex | gemini | opencode
# | hermes | openclaw | gjc | all
# hermes/openclaw also get the orchestration skill
central-mcp alias [NAME] # short-name symlink (default: cmcp)
central-mcp unalias [NAME]
central-mcp init [PATH] # scaffold registry.yaml (default: ~/.central-mcp)
central-mcp add NAME PATH [--agent claude|codex|gemini|droid|opencode|hermes|openclaw|gjc]
central-mcp remove NAME
central-mcp reorder NAME [NAME ...] # reorder projects — unlisted ones keep relative order
central-mcp list # one-line registry dump
central-mcp brief # orchestrator-ready markdown snapshot (registry only, ~50ms)
central-mcp pulse [NAME] [--commits N] [--history N] [--pr|--no-pr] [--json]
# what actually happened in a project — git + dispatches
# + sessions + open PRs. No NAME → sweep the workspace.
central-mcp digest [--workspace NAME] [--hours N] [--quiet-days N] [--no-quota] [--json]
# the portfolio report; `cmcp digest | <notifier>` from a
# crontab is a complete push-reporting setup
central-mcp workspace list # list workspaces with project counts
central-mcp workspace current # print the active workspace
central-mcp workspace new NAME # create a new workspace
central-mcp workspace use NAME # switch the active workspace
central-mcp workspace add PROJECT --workspace NAME
central-mcp workspace remove PROJECT --workspace NAME
central-mcp up [--no-orchestrator] [--permission-mode {bypass,auto,restricted}] [--max-panes N]
[--projects A,B,C] [--all-projects]
# optional tmux observation layer (active workspace).
# Panes go to the most recently active projects that fit
# one window; --projects picks, --all-projects tiles all.
central-mcp tmux [same flags as up] [--workspace NAME | --all]
# create session if missing, then attach via tmux
central-mcp zellij [same flags as up] [--workspace NAME | --all]
# same, but via zellij (generates a KDL layout)
central-mcp tmux switch NAME # attach to cmcp-<NAME> session (create if missing)
central-mcp zellij switch NAME # same, via zellij
central-mcp down # kill all cmcp-* observation sessions
central-mcp watch NAME [--from-start]
# stream one project's dispatch events
central-mcp upgrade [--check] # self-update from PyPI (uv → pip fallback)Optional observation layer
Why it's optional
A pane is a microscope, not a map. It earns its screen by showing one project's raw output closely. The portfolio question — where does everything stand? — belongs to
cmcp pulse,cmcp digest, and the orchestrator's briefing, which read git as well as the dispatch log.Orchestrator is the primary surface.
dispatch/check_dispatch/project_pulsereturn structured summaries; the orchestrator turns those into natural-language status — no scrolling stdout required.Work should be possible from anywhere. central-mcp is designed so a phone/tablet over SSH is enough to keep moving. The hub can't require a multi-pane desktop to function.
Turn observation on only when the live view actually helps — debugging a stuck agent, tailing a long migration, or screen-sharing the fleet. For normal operation it adds noise, not signal.
Suggested onboarding — start observed, graduate to orchestrator-only
On your first few sessions you almost certainly want the live view. Watching each project's dispatch events stream past builds a felt sense of how the orchestrator picks projects, how long dispatches actually take, which prompts produce useful output, and where things tend to stall. Treat observation as a trust-building phase: central-mcp tmux (or zellij, or cmux — see below) gives you panes side-by-side with the orchestrator, so you can eyeball its decisions against the raw agent output in real time.
Once the orchestrator's summaries start matching what you would have checked in the panes anyway, drop the observation layer. At that point you've internalized the pipeline, and working from the orchestrator alone — from any terminal, on any device, including a phone over SSH — is the mode central-mcp was designed for. The observation layer stays one command away (central-mcp tmux / central-mcp zellij / ask the orchestrator in cmux) for the specific moments that still benefit from it.
Backends
Two multiplexer backends are supported as CLI commands:
tmux —
central-mcp tmux(creates the session if missing, then attaches)zellij —
central-mcp zellij(generates a KDL layout, launches a zellij session or attaches to an existing one)
Both produce the same logical layout (hub tab + overflow tabs, project panes running central-mcp watch <project>). Pick the one you already have installed; you can use both from different terminals as long as they don't share a session name at the same time.
Sessions are named cmcp-<workspace> (e.g. cmcp-default, cmcp-work). Pass --workspace NAME to target a specific workspace, or --all to create sessions for every workspace in one shot. central-mcp tmux switch NAME / central-mcp zellij switch NAME attaches to cmcp-<NAME>, creating it if missing.
A third option — cmux on macOS — doesn't have its own CLI command: you run cmcp inside cmux.app yourself and ask the orchestrator to build the observation panes. See Running inside cmux below.
central-mcp up creates a tmux session central with:
Pane 0 — orchestrator (Claude Code / Codex / Gemini / opencode), launched in
~/.central-mcpso it picks up the hub'sCLAUDE.md/AGENTS.md.Panes 1…N — one per registered project, each streaming that project's dispatch activity live via
central-mcp watch <project>. Every dispatch's prompt, output, exit code, and duration scrolls past in real time.
Windows are named cmcp-<N> with the first window picking up a -hub suffix (cmcp-1-hub) when it holds the orchestrator — so you can tell at a glance which window to jump to. Cycle panes with Ctrl+b n / Ctrl+b <digit>. When the registry has more projects than fit in one window, extra windows (cmcp-2, cmcp-3, …) are added automatically. --max-panes N sets a per-window cap; without it, central-mcp reads the current terminal's size and picks how many panes fit above the readability floor (~70 cols × 15 rows per pane — tuned so a 13–15" laptop full-screen lands on 2 column slices).
Orchestrator layout: the first window puts the orchestrator pane in a full-height left column sized to match one project column. So orch + 1 project reproduces a 50/50 split, orch + 3 projects yields four equal columns (orch + 3 projects in a single row), and orch + 9 projects gives orch a 1/6 column with 2 × 5 project grid on the right.
central-mcp tmux # active workspace → create if missing, then attach
central-mcp tmux --workspace work # target the "work" workspace session
central-mcp tmux --all # create/attach sessions for every workspace
central-mcp tmux switch work # jump to cmcp-work (create if missing)
central-mcp tmux --permission-mode auto # claude-only; classifier-reviewed orchestrator
central-mcp tmux --permission-mode restricted # orchestrator surfaces approval prompts
central-mcp tmux --no-orchestrator # watch panes only (no orchestrator)
central-mcp tmux --max-panes 6
central-mcp up # create the session but don't attach (scripted flows)
central-mcp down # tear down all cmcp-* sessionsThe hub window (cmcp-1-hub) uses tmux's main-vertical layout: the orchestrator pane sits on the left taking two cells' worth of space, and project panes stack on the right. So the hub holds panes_per_window − 1 panes (default 3 — orchestrator + 2 projects), and overflow windows get the full panes_per_window projects each. Every pane carries its role name on its top border, and the orchestrator border is highlighted in bold yellow so you can spot it at a glance.
Kill with central-mcp down — the MCP dispatch path never depends on this layer, so tearing it down doesn't affect in-flight dispatches. The watch command is a read-only tail of ~/.central-mcp/logs/<project>/dispatch.jsonl; you can also run it standalone in any terminal.
" to run, to exit" in a watch pane
If a zellij watch pane shows <ENTER> to run, <Ctrl-c> to exit instead of streaming dispatch events, the underlying central-mcp watch <project> child has died or never started. This is zellij's built-in safety net — it holds the pane open (preserving scrollback) and waits for explicit user action instead of respawning or dropping to a shell. Don't press ENTER: the pane is disconnected from its original command at this point, so a manual re-run here won't pipe back into central-mcp. Instead, rebuild the session: cmcp zellij (automatic teardown + rebuild — one command). Every pane respawns with a fresh watch child.
Upgrading while an observation session is attached
Only matters if you use the observation layer. Every cmcp tmux / cmcp zellij invocation unconditionally tears down the prior observation session (if any) and rebuilds at the current terminal's size before attaching, so you always end up with fresh panes carrying the newly-installed binary. central-mcp upgrade additionally tears down the observation session before replacing the binary, so upgrading while already attached is covered too.
Trade-off: if two terminals are simultaneously attached to the same session and one runs cmcp tmux, the other disconnects. In exchange, "stale session vs new binary" isn't something you ever have to think about.
Running inside cmux
macOS only. cmux.app is a native GUI terminal designed so that agents manage their own panes. The workflow:
Launch cmux.app.
In a cmux pane, run
cmcp— the orchestrator (claude / codex / gemini) starts inside cmux and inheritsCMUX_WORKSPACE_ID.Ask the orchestrator to turn on observation mode, e.g. "turn on observation mode".
The orchestrator reads ~/.central-mcp/AGENTS.md on launch — which includes a terminal-size-aware recipe for this workflow — and uses its Bash tool to chain cmux new-split, cmux send, and cmux send-key per project. That recipe deliberately snaps each workspace to halving-safe balanced grids (2×2, 2×4, 4×4, etc.) rather than asking cmux to fake clean thirds from repeated 50/50 splits. Workspace naming mirrors tmux / zellij's window convention: the orchestrator's own workspace is renamed to cmcp-hub, and observation panes go into dedicated workspaces named cmcp-watch-1, cmcp-watch-2, … (one per terminal-size-derived grid chunk). cmux lets you tab between them from its sidebar.
No central-mcp cmux subcommand exists: central-mcp itself stays out of the cmux socket, the agent does the work. If pane setup fails partway, the orchestrator reports which projects succeeded and you can ask it to retry the missing ones.
Workspaces
Workspaces let you group projects into named sets and switch between them without editing the registry manually.
# Create and populate a workspace
central-mcp workspace new work
central-mcp workspace add api-server --workspace work
central-mcp workspace add frontend --workspace work
# Switch the active workspace
central-mcp workspace use work
# Inspect
central-mcp workspace list # shows all workspaces with project counts and active marker
central-mcp workspace current # prints "work"Projects not assigned to any named workspace fall back to the built-in default workspace. central-mcp workspace list shows that count too.
Session naming: each workspace gets its own multiplexer session — cmcp-default, cmcp-work, etc. The old central session name is kept as a backward-compat alias and is cleaned up by central-mcp down.
Observation with workspaces:
central-mcp tmux # active workspace only
central-mcp tmux --workspace work # specific workspace
central-mcp tmux --all # one session per workspace simultaneously
central-mcp tmux switch work # jump straight to cmcp-workWorkspace state is stored inside ~/.central-mcp/registry.yaml (current_workspace field) — no separate config file needed.
Registry resolution
Three-level cascade:
$CENTRAL_MCP_REGISTRY(explicit override)./registry.yamlin cwd (per-project override)$HOME/.central-mcp/registry.yaml(global default)
The registry is per-user state — never commit it.
Changing the orchestrator
central-mcp run --pick # re-run picker, save new choice
central-mcp run --agent codex # one-off override
$EDITOR ~/.central-mcp/config.tomlEnvironment variables
CENTRAL_MCP_HOME— user-state dir (default:~/.central-mcp)CENTRAL_MCP_REGISTRY— registry path override
Development
uv tool install --editable .
uv run --group dev pytest # 141 unit tests (fast, no real CLIs)
uv run --group dev pytest -m live # 20 live tests — shell out to real agent binaries
# (claude/codex/gemini/droid); each case skips
# cleanly if that binary isn't on PATHLicense
MIT.
Available Tools
19 toolsadd_projectA
Append a project to registry.yaml.
Registration is immediate. The agent is not spawned until the next
dispatch call. If the agent is codex, also adds a trusted-
directory entry to ~/.codex/config.toml so codex exec doesn't
refuse to run in that path.
language (optional): preferred response language for dispatches (e.g. "Korean", "ko", "Français", "fr"). When set, every future dispatch prepends "Respond to the user in ." to the prompt. Omit or leave empty for the agent's own default (English).
workspace (optional): if given, also add the project to this workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| path | Yes | ||
| tags | No | ||
| agent | No | claude | |
| language | No | ||
| workspace | No | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: immediate registration, deferred agent spawn, the codex trusted-directory addition, and the language prepend behavior. It also details workspace behavior, covering mutation side effects and prerequisites without contradiction.
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 well-organized, front-loading the core action and then using bullet-style paragraphs for optional parameters. It is slightly long but every sentence adds relevant context; no filler or repetition.
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 zero schema coverage, the description covers the most behaviorally significant parameters but leaves 'tags' and 'agent' completely unexplained. The presence of an output schema mitigates the need to describe return values, but parameter coverage is incomplete for an agent to use all options 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 coverage is 0%, so the description must compensate. It explains the 'language' and 'workspace' parameters in detail, including default behavior and formatting. However, it does not explain 'name', 'path', 'tags', 'agent', or 'description', leaving their semantics to inference or schema defaults.
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 opens with a specific verb ('Append') and resource ('registry.yaml'), making the core action unambiguous. It also clarifies that this is an addition operation (not update/removal) by describing the registry append and the deferred agent spawn, which separates it from siblings like update_project.
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 clearly states the operation's effect ('Registration is immediate... not spawned until next dispatch'), which tells an agent when it is appropriate to use this tool. It does not explicitly name alternatives or exclusion conditions, but the side-effect explanation implies the timing and scope of use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_dispatchA
Abort a running background dispatch. No-op if already finished.
Sets a cancel flag so _run_bg stops before the next fallback
attempt, then terminates the current subprocess. The background
thread finalizes the status to "cancelled".
| Name | Required | Description | Default |
|---|---|---|---|
| dispatch_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses the internal mechanism (sets cancel flag, stops before next fallback attempt, terminates the subprocess) and the resulting status ('cancelled'). This goes beyond a bare 'cancels a dispatch' and gives the agent real expectations, though it does not describe the return payload or failure modes.
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 front-loaded sentences with zero filler: the purpose and edge case come first, followed by mechanism details. Every sentence earns its place and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter cancel operation with an output schema present (so return values need not be explained), the description covers purpose, the idempotent edge case, the cancellation mechanism, and the resulting status. The only gap is explicit parameter documentation, which is minor for such a self-evident parameter.
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 0%, so the description must compensate. It does not explicitly define dispatch_id, but the name is self-evident given the tool purpose and it is referenced implicitly throughout. The description does not add format, source, or validation hints beyond what the schema shows, which is an acceptable but not strong level of compensation for a single obvious parameter.
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 ('Abort a running background dispatch') and adds the edge-case behavior 'No-op if already finished'. This clearly distinguishes it from siblings like dispatch (which starts), check_dispatch (which checks status), and dispatch_history (which lists history) without needing to open schemas.
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 purpose statement implies when to use it (when you need to stop a running dispatch), and the 'no-op if already finished' gives some boundary context. However, it never explicitly names alternatives or states when NOT to use it (e.g., 'use check_dispatch first to see if it is still running'), leaving routing partially to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_dispatchA
Poll a background dispatch started by dispatch_background.
Returns {status: "running", elapsed_sec} while the subprocess is
alive, or the full result (same shape as dispatch_query's return
value) once it has exited.
| Name | Required | Description | Default |
|---|---|---|---|
| dispatch_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 both possible states of the poll (running result with elapsed_sec vs. full result once exited) and references the shape of the final output. It does not address edge cases like unknown dispatch_id, but the core runtime behavior is clearly explained.
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 two short blocks with no fluff: the action is front-loaded, and the return behavior is stated precisely. Every sentence adds information needed to call the tool correctly.
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 single-parameter polling tool with an output schema available, this description is complete. It tells the agent when to use it, what input it needs, what a running response looks like, and what the final response references. No critical decision or invocation information is missing.
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 0%, so the description must add meaning to dispatch_id. The context that this is a background dispatch started by dispatch_background gives the parameter implied meaning, but the description does not explicitly say where to obtain the ID or what format to expect. The semantics are inferable, not fully stated.
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 ('Poll') and resource ('a background dispatch started by dispatch_background'), immediately distinguishing this from plain dispatch or dispatch_history tools. It also contrasts its output with dispatch_query's return shape, further clarifying what unique role this tool plays.
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 clearly indicates when to use the tool: after a background dispatch has been started by dispatch_background. It does not explicitly list exclusions or contrast with direct alternatives, but the context is unambiguous enough that an agent can select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dispatchA
Dispatch a prompt to a project or workspace. NON-BLOCKING.
name: project name, or @workspace to fan-out to all projects in that workspace. When a workspace is targeted, each member project is dispatched independently and a list of dispatch_ids is returned.
Spawns a one-shot subprocess (e.g. claude -p "..." --continue) in the
project's cwd and returns immediately with a dispatch_id (<100ms).
agent (optional): override the project's registered agent for this one dispatch only. Useful for e.g. sending a design-heavy task to a different agent without mutating the registry. Registry is unchanged.
fallback (optional): list of agent names to try in order if the
primary agent exits non-zero (e.g. token/rate limit, crash). If omitted,
the project's saved fallback from the registry is used. Pass an empty
list [] to explicitly disable fallback for this dispatch.
permission_mode controls how the agent handles permission prompts:
"bypass" — skip all prompts (default for new projects)
"auto" — claude-only; classifier-reviewed actions (Sonnet/Opus 4.6 only)
"restricted" — no skip flag; agent may fail on operations needing approval
None (default): use the project's saved mode, or "bypass" for new projects. The resolved value is saved to the registry for future dispatches.
session_id (optional): one-shot override for conversation resumption.
Given → resume that specific session (agent-specific flag: claude
-r <uuid>, codexresume <id>, droid-s <uuid>, opencode-s <uuid>, gemini--resume <index>). After this dispatch the agent's own "resume latest" mechanism picks up the just-used session, so subsequent default dispatches continue from it without restating the id.None (default): use the project's saved
session_idif any (persistent pin), otherwise fall back to the agent's "resume latest" flag. Droid has no headless "resume latest", so absence of a session_id means a fresh session on every droid dispatch.
language (optional): one-shot override for the response language.
A non-empty string (e.g. "Korean", "ko", "Français", "fr") → prepend a "Respond to the user in ." directive to the prompt.
"" (empty string) → suppress the project's saved language for this call (fall back to agent default, usually English) without mutating the registry.
None (default) → use the project's saved
language, set viaupdate_project(language=...). If unset, no directive is added.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| agent | No | ||
| prompt | Yes | ||
| resume | No | ||
| timeout | No | ||
| fallback | No | ||
| language | No | ||
| session_id | No | ||
| permission_mode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 excels: it reveals side effects (permission_mode resolved value saved to registry), non-blocking return behavior with <100ms latency, subprocess spawning, session continuation side effects, and workspace fan-out behavior. This is far beyond the minimum.
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 front-loaded with the core purpose and non-blocking caveat, then uses clear bolded parameter labels and structured lists. Though long, every sentence adds meaningful detail for a complex async dispatch tool, with no filler or redundancy.
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 9-parameter tool with no annotations settlement, the description covers the most complex aspects and return behavior thoroughly, including workspace fan-out and registry side effects. The lack of any explanation for `resume` and `timeout` leaves a meaningful gap given the absence of schema descriptions.
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?
Despite 0% schema description coverage, the description adds deep semantics for six parameters (name, agent, fallback, permission_mode, session_id, language) with precise behavior and examples. However, it fails to explain `resume` and `timeout`, leaving two parameters undocumented, so it does not fully compensate for the schema gap.
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 opens with a specific verb and resource: 'Dispatch a prompt to a project or workspace.' It clearly distinguishes this from siblings by emphasizing NON-BLOCKING execution and immediate return of a dispatch_id, which is unique among the listed project tools.
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 clearly conveys when to use the tool: for non-blocking prompt dispatch, with rich context about behavior such as workspace fan-out and one-shot subprocess spawning. It does not explicitly name sibling alternatives or state when not to use it, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dispatch_historyA
Return the last N completed/failed/cancelled dispatches for one project.
Reads ~/.central-mcp/logs/<project>/dispatch.jsonl and extracts
terminal events (merged with their matching start so each record
carries both the prompt and the outcome). For a cross-project
portfolio summary, use orchestration_history instead.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | ||
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden. It discloses that the tool reads `~/.central-mcp/logs/<project>/dispatch.jsonl`, filters to terminal states, and merges terminal events with their matching `start` so each record includes both prompt and outcome. It stops short of describing error/edge-case behavior, but the core operational behavior is transparent.
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, front-loaded with the core action, followed by a useful mechanic and an alternative. No filler or repetition of schema fields.
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 two-parameter read tool with an output schema, the description covers the purpose, the file source, the merging behavior, and the main alternative. The only omissions are edge cases like a missing log file or an invalid `n`, which are minor given the tool's simplicity and output schema.
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 property descriptions are absent (0% coverage), so the description is the only semantic source. It maps `n` to 'last N' and `name` to 'one project', and the log path `~/.central-mcp/logs/<project>/...` clarifies what `name` refers to. It doesn't spell out parameter limits or formatting, but it gives enough meaning beyond the bare 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?
Opens with a specific verb and resource: 'Return the last N completed/failed/cancelled dispatches for one project.' It also signals the read-only log source and explicitly distinguishes itself from the cross-project sibling orchestration_history, so an agent can tell it apart from similar dispatch tools in the sibling list.
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 first sentence establishes the intended use case (per-project dispatch history), and the final sentence gives an explicit alternative: 'For a cross-project portfolio summary, use orchestration_history instead.' This is clear when-to-use and when-not-to-use guidance, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_preferencesA
Return the current content of ~/.central-mcp/user.md and the available preference sections.
The file holds only user-authored rules — there is no scaffolded
template, so an empty content means "no preferences set yet". The
response also carries available_sections (valid section values
for update_user_preferences) and examples (a hint of what the
user might want to set, surfaced when the user asks what's
configurable). Call this before update_user_preferences so you
can merge new rules with anything already saved.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the file holds user-authored rules, that empty content means no preferences, and that the response includes available_sections and examples. This is good but doesn't explicitly state the operation is read-only (though 'Return' implies it) or mention any error conditions. Still, it provides solid behavioral context.
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 well-structured: first sentence states the core action, second paragraph explains the file semantics and response fields, third sentence gives the usage context. Every sentence adds value without fluff, and the key info is front-loaded.
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?
Given the tool has no parameters and an output schema exists (though not shown), the description covers the essential semantics: file location, content interpretation, response fields, and the relationship to update_user_preferences. It's complete for a simple getter, though it doesn't elaborate on all output schema details, which is acceptable.
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 has zero parameters, so the schema is trivially covered. The baseline for 0 params is 4, and the description doesn't need to add parameter details. It does implicitly describe the output fields, but that's separate.
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 clearly states the tool returns the content of a specific file (~/.central-mcp/user.md) and lists the available preference sections. It also names the sibling it complements (update_user_preferences), making its purpose unambiguous and distinguishing it from other tools.
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 explicitly instructs to call this tool before update_user_preferences to merge new rules with existing ones, and mentions when it's useful (when the user asks what's configurable). This gives clear when-to-use guidance and implies a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dispatchesA
List active and recently completed background dispatches,
including those started by other central-mcp processes (shared
state via ~/.central-mcp/dispatches.db).
status (optional): filter to one of running / complete /
error / timeout / cancelled, or the alias failed —
anything that ended badly (error, timeout, or complete with
ok=false; cancelled is deliberate and excluded).
since (optional): ISO 8601 timestamp; only dispatches whose
finished_at is strictly later are returned (still-running rows
are unaffected by this filter).
Together these back the resident-agent failure watch without
central-mcp holding subscriber state: call
list_dispatches(status="failed", since=<watermark>), alert on
whatever comes back, and advance your watermark to the max
finished_at you saw. The strict-greater-than filter means an
unchanged watermark never re-alerts the same failure.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 substantial work: it discloses shared-state storage location, strict-greater-than semantics for since, the behavior for still-running rows, the meaning of the failed alias, and the exclusion of cancelled dispatches. It omits potential operational details like pagination or rate limits, but for a listing tool this is adequate.
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 compact, front-loaded with the core purpose, and uses bolded parameter names and a purposeful example. Every sentence contributes either parameter semantics or an operational workflow, 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 a two-parameter tool with no annotations and an output schema present, the description covers purpose, state sharing, filter semantics, and a complete polling recipe. Nothing needed to invoke the tool correctly appears to be missing.
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 provides zero description coverage and only bare string/null fields, but the description fully compensates. It enumerates the allowed status values, defines the failed alias semantically, and specifies the ISO 8601 format plus strict-greater-than behavior for since.
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 active and recently completed background dispatches,' and adds a distinguishing scoping fact about shared state across central-mcp processes. However, it does not explicitly differentiate itself from sibling tools like dispatch_history or check_dispatch.
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, concrete usage pattern for the resident-agent failure watch: call list_dispatches(status='failed', since=<watermark>) and advance the watermark based on finished_at. It does not state when not to use the tool or point to alternatives, so it stops short of a full when/when-not guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
List registered projects. Defaults to the current workspace.
workspace:
None (default) → projects in the current workspace (
CMCP_WORKSPACEenv >config.toml [user].last_workspace>"default"). This matches the orchestrator's "what am I working on right now" expectation."__all__"(or"*") → every registered project across all workspacesany other name → that workspace's members
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It goes beyond a simple 'list' by thoroughly explaining the workspace selection logic, including fallback precedence and special values. This is significant behavioral nuance. It does not explicitly state that the operation is read-only, but the nature of 'listing' and the absence of any side-effect language imply safety. The description is transparent about the parameter behavior, which is the main variable in this 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?
The description is efficiently structured: a one-line purpose statement followed by a bulleted list for the parameter. Each bullet is necessary and adds value, particularly the default resolution order. It avoids redundancy and front-loads the core action. The length is justified by the complexity of the parameter semantics. No unnecessary words are present.
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?
Given that an output schema exists, return values are already covered. The description fully addresses the only parameter and its behaviors, leaving no ambiguity for an agent. It also accounts for the orchestrator's expectation by explaining the default workspace resolution, which is critical context for this tool. There are no missing pieces for an agent to correctly invoke it.
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 input schema provides minimal information: a nullable string parameter named 'workspace' with a default of null and no descriptions. The description compensates fully by explaining three distinct cases: null (current workspace with detailed fallback order), '__all__'/'*' (all workspaces), and any other string (specific workspace). This transforms a generic parameter into a well-documented, actionable one. Schema description coverage is 0%, so this high-quality compensation is essential and well-executed.
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 opens with a clear, specific statement: 'List registered projects.' This identifies the verb (list) and resource (registered projects), which unambiguously distinguishes it from sibling tools like list_project_sessions. The additional explanation of workspace behavior reinforces the tool's scope without muddling its core purpose.
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 detailed guidance on the workspace parameter, including default resolution order and special values like '__all__'. However, it does not explicitly address when to use this tool versus alternatives such as list_project_sessions or portfolio_digest. The context implies usage through the purpose, but there is no explicit 'use this when...' or 'instead of...' guidance, leaving selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_sessionsA
List resumable agent conversation sessions for one project.
Queries the project's agent for sessions saved in its own store
scoped to the project's cwd (filesystem scan for claude/codex/droid,
subprocess call for gemini/opencode). Returns at most limit
sessions sorted by most-recently-modified.
Each session dict carries id, optional title, optional bounded
preview, optional created / modified (ISO 8601), and optional
turns. preview is a short best-effort snippet from the session
contents (often the first recognizable user message, or a backend's
own title-like summary) so callers can distinguish threads without
resuming them. Use the returned id with dispatch(session_id=...)
to resume a specific thread as a one-shot — the agent's own
resume-latest mechanism picks the just-used session up for
subsequent default dispatches, so the id rarely needs to be
restated.
pinned echoes the project's currently saved session_id (if any)
so the orchestrator can mark it in UI.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility and delivers richly. It discloses the storage retrieval mechanism (filesystem scan vs subprocess), sorting order, limit behavior, the shape of returned session dicts (including preview as a best-effort snippet), and the pinned field behavior. This goes well beyond what an input schema could convey.
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 appropriately sized, with the core purpose stated first, then mechanism, then return fields and usage guidance. Each sentence adds value, though some detail (e.g., the exact backend names) could be trimmed without losing essential meaning. It is well-structured and front-loaded.
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 listing tool with an output schema, the description covers everything needed to call it correctly: purpose, scoping, limit, return field semantics, and how to use the result with dispatch. It does not mention error cases or permissions, but these are not critical for a read-only list operation and are absent from annotations as well. The description is complete for an agent 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 coverage is 0%, so the description must explain parameters. It explicitly explains limit's effect ('at most limit sessions') but does not directly define the required 'name' parameter beyond the implicit 'for one project'. Since name is required and not self-explanatory (could be a project ID or path), the description could be clearer. It partially compensates but leaves a gap.
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 clearly states the tool lists resumable agent conversation sessions for a project, with a specific verb (list) and resource (sessions). It differentiates from siblings by focusing on resumable sessions scoped to a project's cwd, distinguishing it from dispatch (which resumes sessions) and list_projects. The purpose is unmistakable and non-tautological.
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 explains when to use the returned id with dispatch, and mentions the resume-latest mechanism, giving context on how this tool fits into the workflow. However, it does not explicitly name alternatives or state conditions for when to use this tool instead of others like dispatch_history or project_status. It provides usage context but not explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
orchestration_historyA
Portfolio-wide snapshot: in-flight dispatches + recent milestones + per-project stats.
Answers "how is everything going?" without per-project polling. Pulls:
in_flight: currently running dispatches (from memory)recent: last N timeline milestones (dispatched/complete/ error/cancelled) across all projects, newest firstper_project: counts of succeeded/failed/in-flight per project withinwindow_minutes(or all-time if not given)registered_projects: registry snapshot for context
workspace (optional): when given, filters recent milestones, per-project stats, and in-flight dispatches to only projects in that workspace.
include_archives (optional): when True, attach archived_summaries
— one compact aggregate per rotated timeline file — so callers get
a window onto long-past activity without raw records bloating context.
Live timeline.jsonl is always included.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | ||
| workspace | No | ||
| window_minutes | No | ||
| include_archives | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses data sources (memory, timeline, rotated files), that live timeline.jsonl is always included, and that include_archives delivers compact aggregates, making the read-only scope and behavior clear.
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?
Starts with a one-sentence summary, then uses compact bullets for output fields and explicit optional-parameter explanations. It is detailed but 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?
Given no annotations and a schema with no descriptions, the tool description covers all major output sections, the nuanced optional parameters, archive behavior, and default contexts. An output schema exists, so return-value details don't need to be repeated here.
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 has 0% parameter descriptions, so the description compensates well: it explains workspace filtering, window_minutes semantics and the all-time default, and include_archives behavior. It only implies rather than explicitly defines n as the milestone count, which is a small gap.
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 it is a portfolio-wide snapshot containing in-flight dispatches, recent milestones, and per-project stats, and explicitly frames it as answering 'how is everything going?' without per-project polling. This is clear, but it doesn't distinguish itself from similarly named siblings like portfolio_digest.
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 a clear when-to-use signal: the tool answers broad status questions without per-project polling. It doesn't name alternatives or say when not to use it, so the guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
portfolio_digestA
Pre-rendered portfolio summary for push delivery — paste
digest_markdown VERBATIM; do not re-summarize it.
Built for the resident-agent digest loop (a cron that forwards the
portfolio state to chat every morning), and equally usable by a
terminal orchestrator when the user asks for a daily/weekly recap.
The rendering is fixed server-side for the same reason
token_usage.summary_markdown is: an LLM re-composing the report
daily makes every day look different, and omissions are invisible.
Data spine is the pulse, so — unlike orchestration_history —
work that never went through central-mcp (direct commits,
interactive sessions) is counted. Sections:
active: projects with activity inside the window (commits, dispatch outcomes, in-flight count, uncommitted files)warnings: failed dispatches in the window, dispatches stuck inrunningfor hours (report as unfinished, never as live), and quiet projects with uncommitted work sitting in themquiet: everything else, longest-idle firstquota: compact per-agent subscription windows (wheninclude_quota)
workspace: same semantics as list_projects — None for the
current workspace, a name, or "__all__" for everything.
since_hours: activity window (24 daily; 168 weekly).
quiet_days: idle threshold for the uncommitted-work warning.
Nothing is stored; every call recomputes from source. Scheduling
and alert watermarks belong to the caller (list_dispatches with
status="failed" + since covers the alert half).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | ||
| quiet_days | No | ||
| since_hours | No | ||
| include_quota | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and delivers: 'Nothing is stored; every call recomputes from source', rendering is fixed server-side, and warnings must report stuck dispatches 'as unfinished, never as live'. It even warns against the likely agent mistake of re-summarizing the output. This is rich behavioral disclosure well beyond the bare schema.
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 well-structured and front-loaded: the critical paste-verbatim instruction leads, followed by usage context, section breakdown, parameter semantics, and behavioral notes. It is on the longer side and contains some explanatory flourish (the token_usage comparison clause), but for a tool with four parameters and four output sections, nearly 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?
Given the tool's complexity — 4 params, structured multi-section output, cron integration, no annotations — the description is complete. It covers purpose, output handling, data source, section semantics, parameter meanings, and delegation boundaries, and even anticipates the likely misuse of re-summarizing. The presence of an output schema means it needn't enumerate return fields, and it still sketches the sections.
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 0%, so the description must compensate — and it does for all four parameters. `workspace` is given full semantics (None/name/"__all__" with a pointer to `list_projects`), `since_hours` maps to concrete values (24 daily, 168 weekly), `quiet_days` is defined as the idle threshold for the uncommitted-work warning, and `include_quota` is linked to the quota section. Every parameter gains meaning beyond its type/default.
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 first line states a specific verb+resource: 'Pre-rendered portfolio summary for push delivery' with the critical instruction to paste `digest_markdown` verbatim. It differentiates from siblings explicitly ('unlike `orchestration_history` — work that never went through central-mcp ... is counted') and names the analogous `token_usage.summary_markdown`. An agent can immediately tell what this is and how it differs from the dispatch/project-management siblings.
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 explicit when-to-use context: the resident-agent digest loop (cron forwarding portfolio state each morning) or a terminal orchestrator handling daily/weekly recap requests. It also states what belongs elsewhere: 'Scheduling and alert watermarks belong to the caller (`list_dispatches` with `status="failed"` + `since` covers the alert half)'. This is clear routing with a named alternative and a condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_noteA
Record what was done / what was left / what comes next for a project.
This is the durable memory a return briefing is built from. project_pulse
reads the repository and can tell anyone what is true; only you can
record what was meant — why an approach was abandoned, what is half
finished, what should happen next. None of that is recoverable from git
later, so it is lost unless it is written down now.
When to call it — this matters more than the arguments. Call it at the end of any stretch of real work in a registered project, whether or not that work came through central-mcp. A session someone opened directly in the repo is the most common case and the one most likely to be forgotten. Also call it when you learn something that changes the plan, and especially when you abandon an approach: "tried X, it fails because Y" leaves no commit, no diff, no trace at all, and is the single most valuable thing this file can hold.
Do not call it for trivia (a typo fix, a question answered) — an over-full ledger gets skimmed, which is the same as empty.
Arguments:
note — free text: what happened, what was left, what was learned.
name — registered project name. Omit if passing cwd.
cwd — a path inside the project; resolved to whichever project
owns it. Use this when you know where you are but not
what it is registered as.
next_step — one line: what should happen next. A briefing offers this
back for confirmation, so write it as an instruction to a
future reader, not a note to yourself.
source — "agent" when you are recording your own work (default),
"user" when you are writing down what the human just told
you. Keep these honest: the ledger's whole value is that a
reader can tell a first-hand record from a relayed one.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | ||
| name | No | ||
| note | Yes | ||
| source | No | agent | |
| next_step | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does the job well: it reveals the side effect (appends to a durable ledger that gets skimmed if over-filled), explains the persistence value (why abandoning an approach matters because it leaves no git trace), and clarifies how next_step is consumed by a briefing. It doesn't claim to be read-only or destructive explicitly, but its behavioral character is clearly communicated. Minor gap: it doesn't disclose whether the note can be edited or deleted later, but that's not critical given no annotations to contradict.
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 well-structured with clear sections, bolded lead-ins, and front-loaded purpose. It is longer than the average tool description, but every section earns its place given the tool's unusual depth of meaning (the is-true vs. was-meant distinction, the abandonment case). The 'Arguments' section is compact. One slight deduction: the 'When to call it' paragraph could be tightened, and the parenthetical examples in the abandonment guidance add a small amount of redundancy.
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 tool with 5 parameters, 0% schema coverage, and an output schema present, the description is nearly complete. It explains every parameter's semantics, the when/when-not usage, and the return-value expectation (next_step is offered back for confirmation). It doesn't describe the exact return format beyond that, but an output schema exists to capture that. The only minor gap is the absence of explicit mention of the result of calling this tool (e.g., does it return the saved note?), which the output schema presumably handles.
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 0%, so the description must carry the full weight of parameter documentation — and it does. Every parameter gets meaningful explanation beyond its type: note is what it contains, name vs. cwd are contrasted with a decision rule ('Use this when you know where you are but not what it is registered as'), next_step is specified as an instruction to a future reader (not a note to yourself), and source explains the honesty requirement of the agent/user distinction. The 0% coverage makes a 5 fully justified — the description compensates completely.
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-resource pair ('Record what was done / what was left / what comes next for a project') and immediately establishes its role as the durable memory for return briefings. It distinguishes itself sharply from sibling project_pulse by drawing the is-true vs. was-meant distinction, which is precisely what separates it from every other project-related tool in the list.
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 'When to call it' section is exemplary: it specifies when to call (end of real work, when the plan changes, especially on abandoning an approach), covers the most-common-but-easily-forgotten case (a session opened directly in the repo), and gives explicit negative guidance (do not call for trivia, because an over-full ledger gets skimmed). This is the strongest usage guidance possible — it names the conditions, not just the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_pulseA
What actually happened in a project, where it stands, what's live.
Use this when the user returns to a project after time away, asks
"what's the state of X?", or before dispatching into a project you
haven't touched this session. Unlike dispatch_history /
orchestration_history — which only know about work that went
through central-mcp — a pulse reads the repository itself, so
direct commits, interactive agent sessions, and manual edits show up
too.
Sections (each degrades independently, with a reason when
unavailable — never assume a missing section means "nothing
happened"):
git: branch, upstream ahead/behind, working-tree dirt with a bounded file sample, and the lastcommitscommits.dispatches: in-flight work, the lasthistoryoutcomes with prompts and previews, and all-time success/failure counts.staleholds rows still marked running after hours — a crashed or restarted server never wrote their terminal state, so report them as unfinished, not as live work.sessions: resumable agent conversations, when the project's agent has a session reader.pull_requests: open PRs viagh. The only network call here — passinclude_pr=Falsewhen sweeping many projects.
Nothing is stored: every call recomputes from source. Synthesize the result into a short narrative ("since your last visit … currently … next …") rather than reciting the fields back to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| commits | No | ||
| history | No | ||
| include_pr | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 so thoroughly. It discloses that the tool performs no storage ('Nothing is stored: every call recomputes from source'), identifies the only network call (PRs via gh), and explains the `stale` field for crashed servers. It also instructs on handling missing sections with `reason`, preventing misinterpretation. This is comprehensive behavioral disclosure.
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 well-structured with a clear opening, usage guidance, and a section-by-section breakdown. It uses bullet points for readability and includes practical tips (e.g., include_pr=False for sweeps). While lengthy, it is information-dense and front-loaded with the core purpose, so every sentence contributes.
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?
Given the tool's complexity (multiple data sections, network call, degradation behavior), the description covers all critical aspects: what data each section provides, how to interpret stale entries, and the note about synthesizing output. Since an output schema exists, the return structure is likely covered there, so the description needn't repeat it. The description is complete for an agent to use 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 0%, so the description must explain parameters, and it does. It clarifies `commits` and `history` as counts for the last N items, explains `include_pr` with a performance tip, and the `name` parameter is self-evident. This adds value beyond the schema's bare types.
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 opening line 'What actually happened in a project, where it stands, what's live' clearly defines the tool's function. It distinguishes itself from sibling tools like dispatch_history and orchestration_history by explicitly stating it reads the repository directly, covering direct commits and manual edits. This specificity ensures an agent understands its unique value.
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 explicit triggers: 'when the user returns to a project after time away, asks "what's the state of X?", or before dispatching into a project you haven't touched this session.' It also contrasts with alternative tools, clarifying when this tool is preferable because it captures work outside central-mcp. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_statusA
Return the registry entry for one project.
This is metadata only — the working directory, adapter, description, and tags. Dispatch work via dispatch_query to actually hit the agent.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It explicitly says 'metadata only,' enumerates the returned fields (working directory, adapter, description, tags), and states that it does not execute the agent. It does not mention not-found behavior or side effects, but as a read-only registry lookup this is a minor gap.
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 only two sentences, with the primary action front-loaded and the clarifying metadata-only warning placed immediately after. Every sentence adds useful information and there is 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 a simple one-parameter tool with an output schema, the description covers the essential call semantics and the critical caveat that no agent dispatch occurs. The only notable gap is referencing 'dispatch_query' while the sibling list contains 'dispatch,' a minor naming inconsistency that could briefly confuse an agent.
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 0%, and the description only implicitly defines the name parameter as the project identifier by saying 'one project.' It does not state whether name must be an exact registered key or describe valid formats. Still, with a single required string parameter and clear context, an agent can infer the basic meaning.
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: 'Return the registry entry for one project.' It further clarifies that this is metadata only, distinguishing it from dispatch tools and removing ambiguity about what the tool does.
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 clear context that project_status is for metadata lookup, not execution, and explicitly directs work to dispatch_query for actually hitting the agent. It does not enumerate all sibling alternatives like list_projects, but the single-project lookup scope is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_projectC
Remove a project from registry.yaml.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It indicates the operation is destructive by using 'Remove', but it doesn't state whether the removal is permanent, what happens to associated projects/sessions, or whether confirmation is needed. This is minimal disclosure for a mutation 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?
The description is a single, front-loaded sentence with no filler or repetition. It earns its place by stating exactly what the tool does, though it could have added a bit more useful context without becoming bloated.
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 operation, the description is minimally viable: an agent can infer to call remove_project(name='some-project') and an output schema is present to describe return values. However, it lacks critical context about side effects, irreversibility, and validation behavior, which an agent would benefit from when deciding to invoke a destructive 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 0%, and the description does not explain the meaning or format of the required 'name' parameter beyond the obvious implication that it identifies the project. Since there is only one parameter and the schema provides no description, the description should have compensated by stating how 'name' maps to registry.yaml entries.
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 ('Remove') and a specific resource ('a project from registry.yaml'), which clearly distinguishes this from siblings like add_project, update_project, and reorder_projects. It stops short of a 5 because it doesn't explicitly contrast with closely related sibling operations, but the action is unambiguous.
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?
There is no guidance about when to use remove_project versus alternatives, no mention of prerequisites, and no note about effects on related data such as sessions or dispatch history. For a destructive operation, an agent is left to infer when this tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_projectsA
Reorder the registry's projects list.
order is a sequence of project names; those names move to the
front of the registry in the given order. By default any project
not named in order keeps its original relative position after
the reordered prefix, so a partial reorder is always safe (no need
to enumerate every project). Pass strict=True to require
order to list every registered project exactly once.
Raises an error for unknown names, duplicates, or (in strict mode)
missing ones. The reorder persists to registry.yaml immediately,
but panes in an already-running cmcp tmux / cmcp zellij session
don't rearrange live — rerun the multiplexer command to see the
new layout (auto-teardown since 0.6.8 makes this a one-step flow).
| Name | Required | Description | Default |
|---|---|---|---|
| order | Yes | ||
| strict | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility and delivers richly: it discloses error conditions (unknown names, duplicates, missing in strict mode), persistence to `registry.yaml`, and the limitation that running tmux/zellij panes do not live-reorder. This goes well beyond a generic mutation warning.
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 front-loaded with the core purpose and every subsequent sentence adds crucial operational detail: partial reorder safety, strict mode, error conditions, persistence, and session behavior. No redundant or filler content is present.
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?
The tool is simple in parameters but behaviorally nuanced; the description covers ordering semantics, validation failures, persistence, and live-session caveats. An output schema exists, so return-value documentation is unnecessary, and nothing needed for correct invocation or expectation-setting is missing.
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 0%, so the description must compensate for both parameters. It does: `order` is explained as a sequence of project names that move to the front, and `strict` is described as requiring every project exactly once. This adds meaning far beyond the raw schema types.
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 opens with a specific verb plus resource: 'Reorder the registry's `projects` list.' It uniquely identifies this tool among siblings, none of which offer reorder functionality. The scope is immediately clear and not a restatement of the name.
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 clearly explains the default partial-reorder behavior and when to use `strict=True`, which gives an agent actionable decision criteria. It does not explicitly name alternatives or say when not to use the tool, but no sibling is a direct alternative, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
token_usageA
Portfolio-wide token-usage aggregation (SQL over tokens.db) plus
a normalized per-agent subscription quota snapshot.
Separated from orchestration_history so token monitoring can evolve
independently of event/dispatch history (and eventually power a live
token pane). Reads are windowed by the user's configured timezone.
period: today | week | month | all
project: restrict to one project name (mutually exclusive with
workspace; if both are given, project wins)
workspace: restrict to projects in a workspace (via registry)
group_by: project | agent | source — how breakdown is keyed
include_quota: include per-agent subscription window utilization
(default True). Cached 60s in-process; opt out for fast bulk polling.
include_summary: include a pre-rendered markdown HUD
(summary_markdown) the orchestrator can surface verbatim
(default True). Uses Unicode block bars, emoji color markers
(🟢 < 50%, 🟡 50–89%, 🔴 ≥ 90%), and fixed-width alignment
inside a fenced code block. Disable to save tokens when you
only need the raw structured data.
Returns: { "ok": True, "period": "today", "window": {"start": ISO, "end": ISO} | {"start": null, "end": null}, "group_by": "project", "breakdown": { key: {dispatch, orchestrator, total, input, output} }, # When group_by="project", # tokens that aren't tied to # any registered project # (orchestrator-session usage) # are bucketed under the # special key "ORCHESTRATOR", # always emitted first in the # breakdown. "total": {dispatch, orchestrator, total, input, output}, "quota": { # only when include_quota=True "claude": {"mode": "pro", "five_hour": {"used_pct", "resets_in"}, "seven_day": {"used_pct", "resets_in"}}, "codex": {"mode": "chatgpt", "primary": {...}, "secondary": {...}}, "gemini": {"mode": "auth_only", "auth_type": ..., "note": ...}, "fetched_at": ISO, "cached": bool, }, "summary_markdown": "Token Usage — ...\n```text\n..." # only when include_summary=True # — pre-rendered HUD; surface # verbatim, do not re-format. }
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | today | |
| project | No | ||
| group_by | No | project | |
| workspace | No | ||
| include_quota | No | ||
| include_summary | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden — and it delivers. It discloses the 60s in-process caching, the timezone-windowed reads, the ORCHESTRATOR special bucketing key for untied tokens, the mutual-exclusion precedence (project wins over workspace), and the quota cache behavior. For a read/aggregation tool this is exceptionally transparent.
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?
Front-loaded with purpose and sibling differentiation, then a clean param-by-param section, then the return shape. It is long, but the length is earned — 6 parameters and a rich nested return format warrant it. The only cost is the verbose inline-commented return dict, which could arguably be trimmed without losing meaning.
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?
The output schema in the description documents every return field including the conditional quota variants per provider (claude/codex/gemini), the ORCHESTRATOR key behavior, and the summary_markdown format. All parameters, defaults, cache semantics, and the windowing behavior are covered. Only error cases are unmentioned, which is minor for a read 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 0%, and the description fully compensates. It supplies the valid values for period (today|week|month|all) that the schema omits, defines group_by keys (project|agent|source), states the project/workspace mutual-exclusion rule, and explains defaults and behavioral effects of include_quota and include_summary. Every one of the 6 params gains meaning beyond the bare 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?
Opens with a specific verb+resource: 'Portfolio-wide token-usage aggregation (SQL over tokens.db) plus a normalized per-agent subscription quota snapshot.' It also explicitly separates itself from the sibling orchestration_history, explaining this tool covers token monitoring while that covers event/dispatch history. An agent can immediately distinguish it from all 18 siblings.
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?
Clearly justifies separation from orchestration_history ('so token monitoring can evolve independently of event/dispatch history') and gives usage direction per parameter: disable include_summary 'to save tokens when you only need the raw structured data' and opt out of include_quota 'for fast bulk polling'. It stops short of a formal when-to-use/when-not-to-use contrast with siblings, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectA
Update an existing project's fields. Omitted args stay unchanged.
Use this to permanently change a project's primary agent, edit its
description/tags, flip its permission_mode preference, set a
fallback chain of agents to try when the primary fails (e.g. token
limits hit), pin a specific session_id, or set a preferred
response language for dispatches.
language behavior:
A non-empty string (e.g. "Korean", "ko", "Français", "fr") → every future dispatch prepends "Respond to the user in ." to the prompt. One-shot
dispatch(language="...")still overrides.""(empty string) → clear the saved language; dispatches fall back to the agent's own default (English).None(omitted) → leave the saved language untouched.
session_id behavior:
A non-empty string → all future dispatches without an explicit
session_idwill resume that session (useful for droid, which has no headless "resume latest", and for guarding other agents against ambient-drift when interactive sessions share the cwd).""(empty string) → clear the pin, returning to the agent's default resume-latest behavior.None(omitted) → leave the pin untouched.
Agent names in agent and fallback are validated. permission_mode
must be one of "bypass", "auto", "restricted". If any value is
invalid the registry is not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | ||
| agent | No | ||
| fallback | No | ||
| language | No | ||
| session_id | No | ||
| description | No | ||
| permission_mode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses key side effects: permanent modification, omitted-args-stays-unchanged, atomic validation (registry untouched on invalid input), and detailed future-dispatch behavior for language and session_id. It also states permission_mode allowed values and agent name validation.
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 long but well organized: purpose first, then parameter-specific behaviors in structured sections. Every sentence adds information; 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?
Given no annotations, 8 parameters, and 0% schema coverage, this description is remarkably complete. It covers complex semantics, validation, atomicity, and side effects, and an output schema exists for return values.
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?
With 0% schema coverage, the description compensates admirably: it explains the semantics of language and session_id including empty-string vs null, defines permission_mode values, and clarifies that agent/fallback are validated. Some parameters like tags and description are only implied by 'edit its description/tags', but their schema types cover the basics.
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?
Description opens with 'Update an existing project's fields' – a specific verb and resource – and enumerates the mutable fields. This clearly distinguishes it from add_project, remove_project, and update_user_preferences.
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 lists specific use cases (changing primary agent, editing description/tags, setting fallback chain, etc.). However, it never explicitly says when not to use it or which sibling to prefer for new projects vs. reads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_user_preferencesA
Persist a user preference to ~/.central-mcp/user.md.
Call this when the user expresses a PERSISTENT preference — reporting style, language, routing hints, or process rules. Applied every future session. NOT for one-off turn instructions; those need no persistence.
section — one of: "Reporting style" how to format and present responses "Routing hints" which agents/projects to prefer for task types "Process management rules" concurrency or approval constraints "Other preferences" anything else
content — new full text for that section (replaces its existing content; other sections are untouched). Plain language, bullet points recommended: "- Switch to Korean for all responses." "- Prefer claude for architecture.\n- Use codex for shell scripting."
Tip: call get_user_preferences() first so you can merge old and new content.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| section | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It does well by stating the target file, that changes persist across sessions, and crucially that content 'replaces its existing content; other sections are untouched.' It does not mention permissions, failure behavior, or response format, but the output schema covers return values and the destructive semantics are clearly disclosed.
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 long but organized into purpose, usage, parameter blocks, and a merge tip. Every sentence carries information, examples are compact, and the key persistence/replacement semantics are front-loaded.
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 two-parameter mutation tool with an output schema and no annotations, this is complete: it covers when to call, what each parameter means, the replacement behavior, and the merge workflow. The only minor omission is authorization/error handling, which is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully document both parameters. It does: section is enumerated with exact allowed headings and meaning, and content is explained as full replacement text with formatting recommendations and two concrete examples. This adds far more meaning than the bare string 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?
The description opens with a specific verb and resource: 'Persist a user preference to ~/.central-mcp/user.md.' It goes on to list concrete categories (reporting style, language, routing hints, process rules) and explicitly contrasts itself with one-off instructions, distinguishing it from sibling tools like get_user_preferences.
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 states exact trigger conditions ('Call this when the user expresses a PERSISTENT preference') and an explicit exclusion ('NOT for one-off turn instructions; those need no persistence'). It also tells the agent to call get_user_preferences() first for merging, which is precise operational guidance.
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.
19 tool updates
v0.20.0- First observed
add_project - First observed
cancel_dispatch - First observed
check_dispatch - First observed
dispatch - First observed
dispatch_history - First observed
get_user_preferences - First observed
list_dispatches - First observed
list_project_sessions - First observed
list_projects - First observed
orchestration_history - First observed
portfolio_digest - First observed
project_note - First observed
project_pulse - First observed
project_status - First observed
remove_project - First observed
reorder_projects - First observed
token_usage - First observed
update_project - First observed
update_user_preferences
TDQS
Scored across 19 tools
The tools fall into clear clusters—project registry, dispatch lifecycle, history/portfolio reporting, preferences—and each tool has a distinct primary purpose. Some pairs could still be confused at first glance (dispatch_history vs list_dispatches, portfolio_digest vs orchestration_history), but the descriptions make the differences recoverable.
Most tools follow a snake_case verb_noun pattern like add_project, remove_project, list_projects, and cancel_dispatch. A few break the pattern with noun-first names like project_status, project_pulse, and portfolio_digest, but the overall convention is predictable and readable.
At 19 tools, the set is on the heavier side, but the breadth is justified for a central orchestration server covering project registry management, dispatch lifecycle, monitoring, history, preferences, and token usage. It feels slightly dense rather than bloated, and few tools are obvious candidates for removal.
The core domain is well covered: project CRUD plus reorder, dispatch start/check/list/cancel, per-project and portfolio history, project state/note, preferences, and token usage. Minor gaps exist—no dedicated workspace lifecycle tools, and check_dispatch references a dispatch_background tool that is not present in the set—but agents can work around these.
Maintenance
Related MCP Connectors
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP orchestration server that coordinates multiple AI coding agents using Copilot CLI for parallel task execution with dependency management, file locking, and observability.1-
- AlicenseNot gradedqualityBmaintenanceA vendor-neutral MCP server that enables coding agents to delegate tasks, share context, and work as a team through a shared blackboard and task queue.339 npmMIT
- AlicenseAqualityDmaintenanceAn MCP server that enables Claude to orchestrate multiple autonomous Claude Code agents working in parallel across different projects, with tools to dispatch, monitor, and manage their progress.627 npm1MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for coordinating multiple AI agents across developers and vendors with a shared job board, per-file locking, and live project context.5AGPL 3.0