Skip to main content
Glama

Run a crew of Claude Code and Codex workers from one lead session: visible tmux panes, exact state from hooks, one local SQLite store.

  • Visible workers: each one is a real tmux pane you can read and type into.

  • Exact state: workers report it through their own CLI's hooks, so nothing polls.

  • One local SQLite store: no daemon. The MCP server, hooks, and scheduler make no outbound requests; the CLI contacts npm only to check for updates, and upgrades can download (details).

hive: a lead plans, spawns workers, and is woken when they finish

Install

Requirements: macOS, Node ^22.14.0 || >=23.6.0, Claude Code, and tmux, which is required: hive runs the lead and every worker in a tmux pane. New here? Start with the quick start. codex is optional, only needed if a project opts a worker into it; see docs/install.md.

npm install -g @cmgmyr/hive
hive setup           # pins the hive command to one interpreter, prints the MCP line
brew install tmux
claude mcp add --scope user hive -- "$(command -v node)" "$(npm root -g)/@cmgmyr/hive/dist/index.js"
ln -s "$(npm root -g)/@cmgmyr/hive/claude-plugin" ~/.claude/skills/hive   # optional: session-start kickoff
hive doctor          # verify: node, ABI, tmux, claude, database, hooks all green

Working from a clone instead? See docs/install.md.

Put ~/.local/bin on your PATH below your version manager's block. See Node version and the interpreter pin for why the order matters.

Related MCP server: claude-mux.mcp

First run

Run cd ~/Code/your-project && hive. It is shorthand for hive lead, and it opens a lead window running Claude in this project's tmux session, with the lead session named after the project so your other Claude Code sessions can address it by that name; ask it to triage, and it reads the standing process and proposes work. Spawn workers with agent_spawn, and watch or take over any of them with tmux -CC attach -t hive-main (or plain tmux attach).

How it works

Each Claude Code session runs its own hive MCP server over stdio, and every instance reads and writes one SQLite database (WAL mode) at ~/.hive/hive.db, so every session sees the same state. There is no daemon. The MCP server, hooks, and scheduler make no outbound requests; the CLI contacts npm only to check for updates, and upgrades can download (details). State is scoped to a project (a directory), resolved from the working directory; a lead spawns workers into tmux panes locked to that project.

Why not subagents?

Subagents

hive workers

Visibility

report at the end

live terminal you read and type into

Persistence

vanish with the conversation

pads and todos outlive every session

Lifetime

die with the parent

keep running when the lead detaches

Scope

one session

several sessions, terminals, humans

Hive workers can still use subagents. See Why not subagents? for the longer answer.

Running several projects

If you keep more than one project registered, hive queen starts a single lead that reads all of them. hive portfolio sorts them into waiting on you, stuck, moving and quiet, and hive next attaches you to the lead that needs you most. The queen writes into another project only through that project's lead, and hive records each write. The queen guide covers setup and limits.

Status

hive is a personal daily-driver tool, released low-key. It is single-user by design and dogfooded daily by its author on macOS. The test suite also runs on Linux in CI, but nobody drives hive there yet. Issues are welcome; for bigger changes, open a discussion first. See CONTRIBUTING.md. MIT licensed.

Docs

Page

What's there

Quick start

Zero to a running lead and first worker: requirements, install, the config keys you will touch, first-run fixes

Architecture

Eight diagrams: process topology, module layering, spawn sequence, wake lifecycle, worker state (with the lead handoff), project scoping, store and server identity

Patterns

Standing trades, refused approaches, evidence standards, and guard shapes distilled from the project's own decisions and dead-ends

Concepts

Vocabulary, why not subagents, identity, the workflow, project scope, the shared store

Daily driver

A day with hive, starting a session, watching workers, wake-ups

The queen

One lead across every project: hive queen, the portfolio, hive next, its reach and audit trail

Commands

Every hive subcommand and what it does

Configuration

The HIVE_* environment variables

Profiles

Standing instructions across projects, the session-start plugin

Projects

hive init, hive.yml, automatic backups, pads and todos from the shell

Crew sidebar

lead_sidebar: a crew pane in a Claude lead, and the read-only hive crew --json behind it

Dashboard

The generated dashboard: enabling it, where it lives, what it shows

Install details

The interpreter pin, iTerm settings, the status line, MCP scope, codex workers, updating, uninstalling

Troubleshooting

Common errors and their fixes

Security

What hive runs, writes and fetches on your machine, with the code to check

Tools

The MCP tools: what each does and when to use it

tmux settings

Attach modes, pane options, and what to put in ~/.tmux.conf

Development

Building and testing hive itself

Updating

Run hive upgrade for a global npm install, or hive upgrade --check to preview the commands without changing your install. In a git checkout, the default prints the recipe; hive upgrade --run executes it. Upgrade reports Claude Code and Codex registration repairs without editing their configs. Restart every session with hive loaded after the upgrade. See Updating and recovery.

Available Tools

52 tools
actor_pruneA
DestructiveIdempotent

Delete every actor that owns no rows anywhere in the store and has not been active in the last minute: agents.actor_id, agents.parent_actor_id, todos.locked_by, todo_comments.author, kv.updated_by, leases.owner, pads.updated_by, wakes.owner, wakes.deliver_actor, agent_state_log.actor_id. The scan is global across every project, never scoped to the caller's: actors carry no project_id, so an actor can own rows in a project the caller cannot see, and a project-scoped scan would misread that actor as inert and delete it. Never prunes the caller's own actor. Refuses under HIVE_PROJECT_LOCK=1: this is a whole-store sweep. Run this after project_prune when sweeping the store: project_prune with confirm_name removes a non-empty project together with its agents rows, so run this afterwards to clear that project's actors that own nothing else. Actors with agent_state_log rows stay, because that log is append-only and has no project, which means every actor that ever ran a lead or worker stays. Immediate, permanent: no dry-run mode.

Inputs: no named parameters. Returns: errors, deleted, held_back, hive_notice, +1 more

agent_closeA
DestructiveIdempotent

Kill an agent's tmux window and mark it closed, addressed by name (or agent_id). Capture handoffs (todo comments, pads) BEFORE closing; terminal output is not retained. Closing yourself requires confirm_self=true. Refuses a lead target whose pane is live; retires one whose pane is confirmed dead. A worker may never close a lead, live or dead. row_only=true retires a stale row with no kill, stop or typing: for a human or peer lead only, and refused for any row that provably owns a live pane or when tmux could not be probed.

Inputs: name, agent_id, row_only, project_id, +1 more. Returns: name, note, closed, parked, +4 more

agent_forkA

Fork a same-project Claude Code or Codex worker into a new worker with a new identity and pane. The child starts from a copy of the source conversation, gets a fresh brief, and does not inherit the source todo. Claude Code process-scoped permission grants are not copied and may need approval again.

Inputs: name (required), agent_id (required), cwd, model, +6 more. Returns: name, note, tail, ready, +8 more

agent_listA
Idempotent

List this project's agents with live status. Without include_closed, this is every running agent, in full. With include_closed, it is every agent (running and closed/parked), newest first, bounded by limit (default 20, max 100); when the receipt carries next_before_id, page through the rest by passing it back as before_id.

Inputs: limit, before_id, project_id, include_closed.

agent_message_getA
Idempotent

Read one agent-to-lead message in full, by the id in a "[hive:worker NAME] [message #N ...]" pointer line. hive stores a message here when it shortens one (text over 300 characters sent to a lead by someone who is not that lead) and, with quiet_messaging on, for every submitted worker send to a Claude lead, whose result then also carries its delivery state (delivery_status, delivery_method, socket_attempt_at, confirmed_at, fallback_claimed_at, typed_at, delivery_note and the accepted target). Every other send is typed with its sender tag and stores nothing, so there is no id to read. Messages are pruned after 7 days, and a lookup for a pruned id says so rather than reporting it missing.

Inputs: message_id (required), project_id.

agent_outputA
Idempotent

Read the rendered terminal of an agent (default 50 lines, max 200), addressed by name or agent_id. Read REAL output before declaring a worker done.

Inputs: name, lines, agent_id, project_id.

agent_parkA
Destructive

Park a claude or codex worker for the night: kill its pane, mark the row PARKED rather than plain closed, record the branch, and hand back a board line plus the one call that brings it back. Use this instead of agent_close when the lane is paused, not finished - closed alone cannot tell a next-morning lead which is which. Resume it with agent_resume.

Inputs: name, agent_id, project_id, confirm_self. Returns: cwd, name, note, parked, +7 more

agent_renameA
Destructive

Change a worker's display name. Its actor_id (agent:N) does not change, so every pad write, todo comment and lease it has already made stays attributable. A live claude worker is also told to retitle its own session, which shows up in its pane; that arrives as a user turn, so rename between assignments rather than mid-task. Refuses a lead target outright.

Inputs: new_name (required), name, agent_id, project_id. Returns: name, note, tail, actor_id, +4 more

agent_resumeA

Resume a CLOSED claude or codex worker from its recorded session id (claude --resume / codex resume): a fresh pane, the same actor_id, and the worker's full prior context. A same-project worker or lead on that harness's active usage limit makes this resume retryable until its reset or bounded deadline; hive does not queue resumes. Addressed by name or agent_id among closed agents (agent_list(include_closed: true)). Send it its next instruction with agent_send once resumed - this tool does not.

Inputs: name, agent_id, project_id. Returns: name, actor_id, agent_id, hive_notice, +5 more

agent_sendA
Destructive

Type into an agent's terminal, addressed by name (or agent_id). text of any shape is prefixed with the sender tag, delivered as one bracketed paste and submitted with Enter unless submit=false. A submitted text send to a target on its current usage limit is stored and held in its message row until release; its receipt says pending, so do not resend it. keys and submit=false remain manual recovery paths. ONE EXCEPTION: text over 300 characters sent to a LEAD by anyone who is not that lead is stored and delivered as a one-line pointer instead, because a lead's pane is a human's own window; the receipt says so and names agent_message_get for the full text. Worker-bound text is never shortened at any length. With quiet_messaging on, a worker's submitted text to a Claude lead is stored with a message id and posted over the lead's messaging socket instead of typed (the same pointer when over 300 characters): the receipt says pending until the lead's prompt confirms it, hive types it into the pane once if no confirmation comes, and the socket post skips the pane checks below; do not resend a pending send. Alternatively pass keys (tmux key names like Escape, C-c, Enter). wait_ms (250-10000) returns the terminal tail after sending. A claude worker is already briefed by agent_spawn. A worker whose screen hive cannot classify is REFUSED on the text path entirely (its brief is at the spawn receipt's brief_path); keys still reaches it. A pane in tmux copy mode is REFUSED too, and retriably: tmux clears its bracketed-paste flag there, so the paste would lose its markers and the Enter would be eaten - leave copy mode (or agent_send(keys: ["-X", "cancel"]) to cancel it deliberately) and send again.

Inputs: keys, name, text, submit, +3 more.

agent_spawnA

Spawn a worker agent (default: claude, or the project's hive.yml agents: default). A claude worker is briefed automatically: the full brief is appended to its system prompt, so send it its assignment directly. A command or harness that resolves to a known harness (claude, codex) not listed in the project's hive.yml agents: is refused; absent agents: means claude only. A command hive cannot classify the screen of (claude and codex both do; a harness with no entry does not) can be spawned but NOT typed into: the receipt carries brief_path and says so, and agent_send's text path and wakes both refuse that pane. A same-project worker or lead on that harness's active usage limit makes this spawn retryable until its reset or bounded deadline; hive does not queue spawns. Set read_only: true to block local file writes and mutating shell while keeping Hive MCP available; agent_resume preserves this mode and agent_status reports it. Only bare claude/codex executables are supported in this mode, with only effort-setting extra_args. The worker is locked to this project. Humans can watch with: tmux attach -t hive-main.

Inputs: cwd, name, model, layout, +7 more. Returns: name, note, tail, ready, +14 more

agent_statusA
Idempotent

Detailed status for one agent, addressed by name (or agent_id), including a short tail of its terminal. include_brief=true returns the exact brief this worker was given; hive keeps that copy because an appended system prompt appears in no transcript.

Inputs: name, agent_id, project_id, include_brief.

helpA
Read-onlyIdempotent

Hive usage guidance. Omit topic for an overview, or pass one of: crew-restore, layout, workflow, profiles, agents, wakes, projects, identity, actors, pads, todos, kv, questions, leases.

Inputs: topic.

kv_deleteB
DestructiveIdempotent

Delete a shared value by key.

Inputs: key (required), project_id. Returns: key, deleted, project_id, hive_notice

kv_getC
DestructiveIdempotent

Get a shared JSON value by key.

Inputs: key (required), project_id.

kv_listC
DestructiveIdempotent

List shared values, optionally filtered by key prefix.

Inputs: prefix, project_id.

kv_setB
Destructive

Set a small shared JSON value other sessions can discover. Optional TTL in seconds.

Inputs: key (required), value (required), project_id, ttl_seconds. Returns: key, project_id, hive_notice

lease_acquireA

Try to take a named lease on state another session could also change, such as a shared checkout, a dev database or a port (non-blocking). Re-taking your own lease extends it. Leases expire on their own.

Inputs: key (required), ttl_seconds (required), project_id. Returns: key, held_by, acquired, extended, +3 more

lease_releaseC
DestructiveIdempotent

Release a lease you own.

Inputs: key (required), project_id. Returns: key, released, project_id, hive_notice

pad_appendB

Append content to the end of a pad. Optional expected_revision guards against concurrent writes.

Inputs: pad_id (required), content (required), project_id, expected_revision. Returns: pad_id, revision, hive_notice

pad_archiveA
Destructive

Archive a pad (or unarchive with archived=false). Archiving frees the name for a new active pad; the old content stays readable by pad_id.

Inputs: pad_id (required), archived, project_id. Returns: pad_id, archived, revision, hive_notice

pad_deleteA
DestructiveIdempotent

Permanently delete a pad. Irreversible; prefer pad_archive. Optional expected_revision guards against deleting a pad someone just updated.

Inputs: pad_id (required), project_id, expected_revision. Returns: pad_id, deleted, hive_notice

pad_editB
Destructive

Replace one literal occurrence of old_text with new_text in a pad. old_text must match exactly once; include surrounding context to disambiguate.

Inputs: pad_id (required), new_text (required), old_text (required), project_id, +1 more. Returns: pad_id, revision, hive_notice

pad_listB
Idempotent

List pads without full content. query matches names and content (returns a snippet); tags matches any listed tag.

Inputs: tags, limit, query, offset, +2 more.

pad_readA
Idempotent

Read a pad's content, revision, and metadata by pad_id or name. Optional offset and limit use UTF-16 code units and are nonnegative safe integers. There is no default cap; a cut inside a surrogate pair moves back one code unit, or forward if moving back would return nothing, and the result reports the effective offset.

Inputs: name, limit, offset, pad_id, +1 more.

pad_writeA
Destructive

Create a pad, or fully overwrite one by passing pad_id plus expected_revision. Pad names are unique per project. Prefer pad_append/pad_edit for targeted changes.

Inputs: name (required), content (required), tags, pad_id, +2 more. Returns: pad_id, revision, hive_notice

project_addA
Idempotent

Register a directory as a project. Defaults to the current working directory. Returns the existing project if the path is already registered.

Inputs: name, path. Returns: id, name, path, created_at, +1 more

project_listA
Idempotent

List registered projects and the currently selected one.

Inputs: no named parameters.

project_pruneA
DestructiveIdempotent

Delete every registered project that owns no rows anywhere in the store (pads, todos, kv, leases, agents, wakes, command_trust, questions), verified individually before each delete. Never prunes the caller's own project. With project_id, removes exactly that one project instead of sweeping, and only if it owns no rows; otherwise refuses and names what it owns. With project_id AND confirm_name (the project's exact name), removes that one project even when it owns rows: it takes a snapshot first, refuses while a running row owns a live pane or its pane ownership cannot be verified (agent_close row_only retires the latter), then deletes the project with everything it owns (todos, comments, pads, kv, leases, agents, wakes, trust, questions, agent messages) in one transaction and reports per-table counts and the snapshot path. queen_audit rows naming it are kept, and so are other projects' lead-idle subscriptions that target it, so a watch on its lead ends with a named reason. confirm_name without project_id is refused, and there is no forced sweep. Refuses under HIVE_PROJECT_LOCK=1: this is a whole-store sweep, and a project-locked session may only touch its own project. Immediate, permanent: no dry-run mode.

Inputs: project_id, confirm_name. Returns: counts, errors, deleted, snapshot, +2 more

project_selectA
Idempotent

Set which project later tools act on in this session.

Inputs: project_id (required).

queen_audit_listA
Read-onlyIdempotent

List confirmed queen writes and refused cross-project guard calls, newest first. Refusal rows include outcome=refused and the problem. The queen may read all targets; other callers see only their own project. Default 20, maximum 100 entries. History is retained for 30 days with a 20,000 id-range backstop. A crash between a completed terminal send and its audit insert can leave that send unrecorded.

Inputs: limit, project_id.

question_answerA

Record the human's answer to a pending or defaulted question in this project, plus optional notes. The answer may be a picked option label or free text, including text outside the offered labels. The answer update comes first; the answer and any wake commit together, and the answer stays readable with question_get. An answered or withdrawn question refuses with QUESTION_STATE_CONFLICT. A queued wake carries the question, answer and notes verbatim. When you are the asker, skip with wake_id: null and wake_skipped; otherwise, queue a wake to the running asker or, if the asker has no running row, to the project's running lead with wake_rerouted_to. Skip that fallback with wake_id: null and wake_skipped if no lead runs or the lead is the answerer. wake_id means queued, not delivered.

Inputs: answer (required), question_id (required), notes. Returns: wake_id, hive_notice, question_id, wake_skipped, +1 more

question_askA

Record an open question for the human, keyed to this project and to you as the asker. kind=choice takes 2-4 options (each label, description, recommended; exactly one recommended) and a header of 12 characters or fewer; kind=free_text takes just the question and header. Every question carries default_answer: for a choice it is the recommended option's label. Pass ref (a todo id or PR number) to dedupe: asking again with a ref that already has a PENDING question in this project updates that row instead of adding one. The receipt lists other pending questions in this project that look similar (same normalized text, or at least half their longer words shared), so you can question_update one instead. The record is only stored: put the question to the human yourself, in your own turn. You must be a session an answer can be woken back to. When the question is answered, an ordinary wake carrying the answer is queued to you; read the record with question_get.

Inputs: kind (required), header (required), question (required), default_answer (required), +2 more. Returns: created, hive_notice, question_id, similar_question_ids

question_getA
Read-onlyIdempotent

Read one question in this project by id, in any state, with its answer and notes once answered.

Inputs: question_id (required).

question_listA
Read-onlyIdempotent

List this project's pending questions, then its defaulted ones (acted on by default, still open to reversal), oldest first within each group. Answered and withdrawn questions are not listed; read one by id with question_get.

Inputs: no named parameters.

question_updateA

Edit a pending question's text (question, header, options, default_answer; the whole result is revalidated) or move it out of pending with state=defaulted (you acted on your default) or state=withdrawn (moot). A defaulted question can still be withdrawn. Moving state needs the asking session or the human; an answered or withdrawn question cannot be changed. The ref, asker and wake target never change.

Inputs: question_id (required), state, header, options, +2 more. Returns: state, hive_notice, question_id

todo_archiveA
Destructive

Archive a todo (or unarchive with archived=false), mirroring pad_archive. Archived todos are excluded from todo_list by default; todo_get always reaches them by id. Refuses when this todo still blocks another todo that is not completed.

Inputs: todo_id (required), archived, project_id. Returns: todo_id, archived, project_id, hive_notice

todo_blockA

Add a blocker: todo_id cannot start until blocker_id completes. Cycles are rejected.

Inputs: todo_id (required), blocker_id (required), project_id. Returns: todo_id, blocker_id, project_id, hive_notice

todo_commentA

Add a comment to a todo. Use for handoffs: changed files, tests run, decisions, remaining risk.

Inputs: body (required), todo_id (required), project_id. Returns: todo_id, comment_id, project_id, hive_notice

todo_completeA
Destructive

Mark a todo complete (or reopen with completed=false). Returns todo ids that this completion newly unblocked.

Inputs: todo_id (required), completed, project_id. Returns: todo_id, completed, project_id, hive_notice, +1 more

todo_createB

Create a project-scoped todo. Pass a short slug to have it render beside the id wherever this todo is listed; left unset, those surfaces fall back to the title instead (truncated in the dashboard). Optionally pass blocked_by todo ids to encode ordering. Returns a slim receipt.

Inputs: title (required), body, slug, tags, +3 more. Returns: todo_id, project_id, hive_notice

todo_getC
Idempotent

Read one todo in full: body, blockers, what it blocks, and optionally comments.

Inputs: todo_id (required), project_id, include_comments.

todo_listA
Idempotent

List todo summaries. is_blocked=false finds dispatchable work. query matches title, body, and slug. Archived todos are excluded by default; include_archived=true retrieves them too.

Inputs: tags, limit, query, offset, +5 more.

todo_unblockB
Destructive

Remove one blocker relationship from a todo.

Inputs: todo_id (required), blocker_id (required), project_id. Returns: removed, todo_id, blocker_id, project_id, +1 more

todo_updateB
Destructive

Update todo fields. Omitted fields are preserved. Returns a slim receipt.

Inputs: todo_id (required), body, slug, tags, +4 more. Returns: todo_id, project_id, hive_notice

wake_cancelA
DestructiveIdempotent

Cancel a pending wake-up you own, or - if you are a running lead - any pending wake-up in this project. Cancelling any wake also cancels the hold notices already filed about IT (modal-hold, unsubmitted-input, and one-shot block), since a notice about a wake that no longer exists has nothing left to say; unlike a finish notice these never expire on their own, since the thing they report may well still be true an hour later. Cancelling a standing watch also cancels the FINISH notices it has already filed but not yet delivered. It does NOT cancel a standing watch's own per-worker block notice (a crew member stopped on a dialog): that carries no parent link, so one already filed still delivers, and it may still be true - the worker is probably still on that dialog - but it no longer claims anything about the watch's own liveness, deliberately.

Inputs: wake_id (required), project_id. Returns: wake_id, cancelled, hive_notice, cancelled_notices

wake_getA
Idempotent

Read one wake-up by id, in this project, with its UNTRUNCATED body. wake_list truncates body at 120 chars; use this to see exactly what a wake will say, or to confirm what wake_update just changed. Its delivery state includes delivery_method (socket, socket-repeating, pty or pty-after-socket-timeout), delivered_by (the pid and build of the server that last set the delivery method, plus the firing number for repeating wakes), and socket_attempt_at, set when a wake was posted to a Claude lead's socket; for a repeating wake both describe its current firing (fire_count). An older repeat claim is identified in delivered_by_note as a claim; the older build types the firing into the pane without recording delivered_by.

Inputs: wake_id (required), project_id.

wake_listB
Idempotent

List pending wake-ups in this project, plus recently_delivered: the last 10 one-shot wakes that have already fired, with their delivery state (typed_at, held_at/held_reason, confirmation, delivery_method, delivered_by, socket_attempt_at). A one-shot wake leaves the pending list the moment it fires; recently_delivered is where to check whether it was actually typed and, if its target has a confirmation channel, acknowledged.

Inputs: project_id.

wake_setA

Schedule a wake-up: after delay_seconds the body is typed into the target session's terminal as a fresh user turn (prefixed [hive wake #N]). Defaults to delivering to THIS session. Use instead of polling. Write the body self-contained: ids, context, next action - it may arrive in a session that has none of this conversation. Delivering to your OWN lead pane, where the context is already there, prefer the action, the ids, and a pointer to where the detail lives.

Inputs: body (required), delay_seconds (required), deliver_to, project_id, +1 more. Returns: due_at, wake_id, repeating, deliver_to, +1 more

wake_updateA
Destructive

Edit a pending wake-up you own, in place, without minting a new id. Provide any subset of delay_seconds, body, repeat_every_seconds. delay_seconds is RELATIVE TO NOW, exactly as in wake_set: it moves the next fire time to now + delay_seconds. repeat_every_seconds only changes the interval used for firings AFTER this one; on its own it does not move the next fire time. Only a still-pending wake can be edited; use wake_get to read the result back. delay_seconds and repeat_every_seconds only apply to a delay wake (from wake_set) - an idle wake (from wake_when_idle) fires on watched-agent state and max_wait_seconds instead, so only body can be edited on one.

Inputs: wake_id (required), body, project_id, delay_seconds, +1 more. Returns: due_at, updated, wake_id, hive_notice

wake_when_idleA

Wake up when watched agents go idle (exact state from Claude Code hooks) or max_wait_seconds passes - except delivery HOLDS past that bound instead, for as long as the target pane is on a dialog or has unsubmitted human text in it, rather than pasting the wake body into either (.claude/rules/tmux-and-panes.md). Two shapes for workers, plus one for the queen, and you pass EXACTLY ONE of them. agents=[...] is a ONE-SHOT over a named list: mode=any fires on the first fresh idle transition, mode=all fires when every watched agent is idle (returns already_satisfied without scheduling anything if they all are now), and either way it stops watching once it fires. Arming a one-shot of the same mode for the same deliver target and an identical watched set cancels your own older pending one and names it in the receipt's superseded. scope="project" is a STANDING WATCH over the crew you spawn in this project, including workers spawned later: it never stops watching, and on each finish it delivers a roster naming who finished and who is still going, until max_wait_seconds runs out or you wake_cancel it. You may hold ONE standing watch per project: a second call is refused and names the one already running, since two would report every finish twice. Use the standing watch when you are running more than one worker - a one-shot leaves every other worker unwatched from the moment it fires. Use either instead of polling. agents=[...] refuses a lead: it watches worker state, which a lead does not write. lead_project_id is the QUEEN's alone: a one-shot that fires when another registered project's running lead ENDS A TURN (never 'finished its work'), stored in and delivered to the queen's own project, and ended with a named reason if that lead's pane dies, is reissued, or restarts.

Inputs: body (required), mode, scope, agents, +4 more. Returns: mode, note, scope, status, +10 more

whoamiA

Show this session's actor identity and effective project scope. Call this first in a new session.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 52 tools

    Disambiguation4/5

    Tools are grouped by clear resources (project, pad, agent, todo, kv, lease, wake, question) and most actions are distinct. Adjacent lifecycle operations such as agent_spawn/fork/resume, agent_park/close, and wake_set/wake_when_idle are distinguishable, though the large agent and wake surfaces create some risk of misselection.

    Naming Consistency4/5

    Nearly all tools follow a predictable snake_case resource_action pattern across domains. Exceptions like whoami, help, agent_message_get, and queen_audit_list are minor deviations but remain readable and consistent with their purpose.

    Tool Count2/5

    52 tools is far beyond the ideal 3-15 range and creates an unwieldy surface for an agent. The broad domain justifies many operations, but the server still exposes too many granular lifecycle tools for easy navigation.

    Completeness4/5

    Coverage is extensive across projects, pads, agents, todos, KV, leases, wakes, and questions, with full lifecycle support in most areas. Minor gaps such as no project update/rename and no lease listing are workaroundable but keep it from perfect coverage.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables inter-session communication and coordination for multiple Claude Code instances through a shared SQLite database. Supports real-time messaging, shared state management, and resource locking to facilitate parallel development workflows between AI agents.
      36 npm
      8
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Collects session JSONL from Codex and Claude Code into local SQLite memory, exposed through MCP with tools for memory context, search, get, put, forget, sleep, and status.
      -
    • A
      license
      A
      quality
      A
      maintenance
      Enables Claude Code to launch and supervise multiple concurrent Claude Code sessions in tmux, sending them briefs, reading their progress, answering their prompts, and managing isolated git worktrees.
      20
      2
      MIT