cmuxlayer
cmuxLayer exposes a 10-tool MCP surface for controlling cmux terminal workspaces and managing CLI agents.
Spawn managed CLI agents or plain terminals, optionally with git worktrees, prompts, resume by agent ID, and parent/role/placement settings.
Send text, commands, or keys to agents or raw surfaces using agent, surface, command, or key modes.
Read terminal screens and parsed agent status/metadata for Claude Code, Codex, Gemini, and Cursor.
List live agents and surfaces, filter by repo/model/state/parent, and inspect prompt blockage or topology.
Wait for one or more agents to reach a target state such as ready, working, idle, done, or error.
Report health/diagnostics for the cmux control path, socket, binary, processes, and job control.
Move or rename terminal surfaces.
Close surfaces, managed agents, or workspaces with live-agent guards.
Raise short blockers to a managed agent’s registry parent.
Use tool annotations to inform client safety policy.
cmuxLayer
cmuxLayer exposes a 10-tool public MCP surface for controlling cmux terminal workspaces and managing CLI agents.
Quick start
brew install etanhey/layers/cmuxlayer # stable, pinned release
brew install --HEAD etanhey/layers/cmuxlayer # or: dogfood the latest mainThis installs the cmuxlayer command plus cmuxlayer-app-server and
cmuxlayer-proxy. cmux must be running.
For fleet wiring, versions, dogfooding, and the CMUX_SOCKET_PATH pin, see
docs/guides/releases-and-brew.md.
Then set up this machine:
cmuxlayer initThe wizard selects spawnable repositories, per-repo launchers or direct CLI
launches, and approval behavior. It writes ~/.config/cmuxlayer/env.sh and, in
launcher mode, a launcher registry. cmuxlayer reads both at startup, including
when an MCP client starts it from a GUI. The wizard asks before replacing a file
and creates a backup first.
For scripted installs, pass --yes with --repo <name>=<path>. cmuxlayer does
not assume a fixed repository layout. See
docs/guides/fresh-install.md for the walkthrough and
docs/guides/registry-optional-spawn.md for how each
lane behaves.
Related MCP server: hyperpanes-mcp
Raise the open-files limit for agent CLIs
Agent CLIs open many files, while macOS login shells can start with a low soft
open-files limit. If you use repoGolem launchers, put this POSIX shell snippet
in a global.prelaunch entry so it runs before each agent CLI. You can also
put it in your shell rc file. It raises a low soft limit up to the hard limit,
capped at 65536, and never lowers an existing soft limit.
cmux_nf_s=$(ulimit -Sn); cmux_nf_h=$(ulimit -Hn); [ "$cmux_nf_s" = unlimited ] || [ "$cmux_nf_s" -ge 65536 ] || { [ "$cmux_nf_h" = unlimited ] && cmux_nf_h=65536; [ "$cmux_nf_h" -gt 65536 ] && cmux_nf_h=65536; ulimit -Sn "$cmux_nf_h"; }Add to your MCP config:
Codex CLI / T3 Code
T3 Code inherits MCP servers from the Codex CLI config file at ~/.codex/config.toml (or $CODEX_HOME/config.toml).
[mcp_servers.cmuxlayer]
command = "cmuxlayer"
env_vars = ["CMUX_SURFACE_ID", "CMUX_WORKSPACE_ID", "CMUX_TAB_ID", "CMUX_SOCKET_CAPABILITY", "CMUX_SOCKET_PATH"]env_vars forwards the pane's existing values into Codex's MCP process. Do not paste a capability value into this file.
Claude Code, Cursor, VS Code, Claude Desktop
{
"mcpServers": {
"cmuxlayer": {
"command": "cmuxlayer"
}
}
}To keep only a per-session resident subset of tools, set
CMUXLAYER_DEFAULT_PALETTE to comma-separated bare tool names, for example
list_surfaces,spawn_agent,send_to. The server also exposes expand_palette,
which registers the rest of the 10 public tools for the rest of that MCP
session.
When unset or blank, the signed 10-tool thin-core default applies. When set, the
environment value overrides that default for the session. Unknown names are
warned and ignored while valid names still load.
cmuxlayer never answers a prompt chooser on an agent's behalf. It detects the
chooser, marks the agent blocked_on_prompt, and escalates without sending a
key.
CMUXLAYER_FILE_DELIVERY_TICKETS=1 opts into public delivery-failure auto-filing with allowlisted bodies; full evidence stays in local tickets by default.
Config locations: Codex CLI / T3 Code
~/.codex/config.toml(or$CODEX_HOME/config.toml) | Claude Code.mcp.jsonorclaude mcp add cmuxlayer -s user -- cmuxlayer| Cursor.cursor/mcp.json| VS Code.vscode/mcp.json| Claude Desktop — see MCP docs for platform-specific paths
Drive panes through the MCP, not the raw cmux CLI
Use cmuxlayer's MCP tools for pane operations. Calling the raw cmux CLI yourself bypasses stable-UUID guards, draft ownership, delivery receipts, tailer reaping, and placement. After a cmux restart, reconnect cmuxlayer before any pane operation: run /mcp reconnect cmuxlayer in Claude Code, restart Codex CLI or T3 Code, or use MCP: List Servers → Restart Server in VS Code. Use the equivalent MCP reconnect control in other clients.
What you can do
Tell your AI agent things like:
"Run my test suite in the pane to the right"
"Spawn a Claude Code agent in a new pane to refactor auth.ts"
"Read the screen of surface:2 and tell me if the build passed"
"Wait for all agents to finish, then read their output"
By default cmuxLayer registers exactly 10 tools, and all 10 are callable through MCP; there are no hidden internal tool definitions. read_screen parses agent metadata (status, model, tokens, context %) for Claude Code, Codex, Gemini, and Cursor.
Agent routing workflow
For managed agents, use the agent-first path: list_agents to find the target, send_to to deliver work by agent_id, then wait_for when you need completion. send_to also preserves the registry-independent escape hatch: use mode:"surface", mode:"command", or mode:"key" with a raw surface ref for shells, launch/resume commands, and stuck-pane recovery.
See Agent Routing and Handling Workflow for the full operator playbook, including stuck surface recovery and safe /mcp menu reconnects.
MCP tools (10 registered and callable)
All public tools include ToolAnnotations that clients can use in safety policy.
Public MCP surface — spawn_agent report_to_parent send_to read_screen list_agents wait_for control_health close_surface update_surface list_surfaces
Tool | What it does |
| Spawn a CLI agent and return an |
| Raise a short blocker to the managed agent's registry parent |
| Send by agent ID or raw surface using |
| Read terminal output with parsed agent status |
| All agents, with optional filters |
| Wait for one |
| Report socket, binary, process, and job-control diagnostics |
| Close one surface, managed agent, or workspace, with live-agent guards |
| Move or rename one terminal surface |
| List all surfaces across workspaces |
control_health reports cmux_fds for detected cmux.app processes and warns when open descriptors reach 4096; set CMUXLAYER_CMUX_FD_WARN to a positive integer to change that threshold.
These 10 are the whole surface: setting CMUXLAYER_DEFAULT_PALETTE adds expand_palette and no other tool is registered.
Supported agents
CLI | Command | Auto-detected |
Claude Code |
| status, model, tokens, context % |
Codex |
| status, model, context % |
Gemini CLI |
| status, model, tokens, context % |
Cursor |
| status, model, tokens, context % |
Kiro CLI |
| spawn and lifecycle only; no Kiro-specific screen parser |
read_screen auto-detects agent type and parses metadata from terminal output.
For launch and resume forms, input limits, and the ready/working/done markers per
CLI, see the CLI reference.
Architecture
AI Agent ─── MCP ───> cmuxLayer ─── Unix socket ───> cmux
├── Agent engine (spawn → monitor → teardown)
├── Screen parser (Claude Code, Codex, Gemini, Cursor)
├── Mode policy (autonomous vs manual)
├── State manager + event log
├── Metacomm READ — harness JSONL (real tokens/context/model)
└── Metacomm WRITE — per-agent inbox file + Monitor dispatchThe socket client connects to cmux through a persistent Unix socket instead of starting a cmux CLI subprocess per call. It reconnects after a disconnect and falls back to the CLI subprocess when the socket is unavailable.
Troubleshooting
cmux is not running cmuxLayer requires a running cmux instance. Install it first, then start a cmux session before using cmuxLayer.
Tools not appearing in Codex CLI or T3 Code
Restart the client after adding cmuxlayer to ~/.codex/config.toml. If you use a custom Codex home, verify $CODEX_HOME/config.toml contains the same mcp_servers.cmuxlayer entry.
Tools not appearing in Claude Code
Restart Claude Code after adding the MCP config. Run claude mcp list to verify cmuxlayer is connected.
Socket connection failed
cmuxLayer auto-discovers the cmux socket (macOS: ~/Library/Application Support/cmux/cmux.sock). Override with CMUX_SOCKET_PATH if needed.
"Cannot resolve a working directory for repo ..."
cmuxLayer could not find that checkout. Run cmuxlayer init to register it, or
set CMUXLAYER_REPO_HOME to the colon-separated directories holding your
repositories. The error lists every path it searched.
Testing
bun run test # vitest; 4452 tests collected by `vitest list`
bun run typecheck # Type checkingGit hooks
Enable project hooks to run the regression gate automatically on git push:
git config core.hooksPath .githooksThis enables .githooks/pre-push, which runs scripts/run_tests.sh and blocks pushes on regression failures.
Development
bun install
bun run dev # Run with tsx (hot reload)
bun run build # Compile TypeScript
bun run start # Run compiled outputContributing
See CONTRIBUTING.md for development setup and PR guidelines.
License
Apache 2.0 — see LICENSE.
Part of the Golems AI agent ecosystem. cmuxlayer.etanheyman.com | Built by @EtanHey.
Available Tools
10 toolsclose_surfaceADestructive
Close one surface, managed agent, or workspace with live-agent guards. scope="agent" stops the agent AND closes its pane, and reports the two halves separately (agent_stopped, surface_closed) so a pane that survives is never reported as closed. The pane close obeys the same live-agent guard as scope="surface": without force:true a still-live agent keeps its pane, and the receipt says so.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Close even when the backing agent is still live (not done/error). This never bypasses stable surface identity checks. Without force, a live agent's surface is protected and the response returns the current pane contents instead of closing. | |
| scope | No | surface | |
| surface | No | Target surface ref | |
| agent_id | No | Managed agent ID | |
| workspace | No | Target workspace ref |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| pane | No | |
| force | No | |
| scope | No | |
| state | No | |
| agents | No | |
| refused | No | |
| removed | No | |
| surface | No | |
| agent_id | No | |
| surfaces | No | |
| workspace | No | |
| live_agents | No | |
| retry_count | Yes | |
| collapse_pane | No | |
| caller_workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey destructiveness, and the description adds meaningful context: scope='agent' stops the agent, closes its pane, reports the two results separately, and the pane close is guarded exactly like scope='surface'. It does not, however, disclose what closing a workspace does to contained surfaces or agents, which is a notable gap for a destructive 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?
Three sentences with no filler. The core purpose is front-loaded, and each subsequent sentence adds a distinct behavioral edge case or guard rule that an agent needs to invoke 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?
Surface and agent scopes are well covered, including guard behavior and partial-failure reporting, and the output schema covers return shape. The workspace scope is only named without explaining whether closing cascades to contained surfaces/agents or how the live-agent guard applies, which is important for a destructive operation.
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 80%, so most parameters are already documented. The description adds real value by explaining the otherwise-undocumented scope enum, the force/guard interaction, and the split agent_stopped/surface_closed reporting.
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 sentence states a specific verb ('Close') and explicit object types ('surface, managed agent, or workspace') plus the operative guard. This is unambiguous and easily distinguished from sibling tools like list_surfaces, update_surface, and spawn_agent.
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 conditional usage for scope='agent' versus scope='surface' and explains when force:true is or isn't needed. It does not explicitly name alternatives or say 'use this instead of X', but no sibling performs closing, so the intended use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_healthARead-onlyIdempotent
Report terse control-path health by default; pass detail=full for diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | terse |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| health | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds the mode distinction (terse vs full) but doesn't elaborate on exact behavior or response shape; output schema accounts for that.
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?
One sentence with zero wasted words; default behavior is front-loaded, alternative follows.
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?
With only one optional param, output schema present, and annotations covering safety, the description is adequately complete. No missing prerequisites or side effects.
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 has 0% description coverage, so the description must compensate. It explains that detail=full is for diagnostics, which gives semantic meaning to the enum value, but doesn't explain what 'terse' vs 'full' includes. Still, for a single parameter, it partially fills the 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 a specific verb ('Report') and resource ('control-path health'), with explicit default and alternative modes. Distinct from siblings that handle waiting, surfaces, agents, and messaging.
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 clear context for using the default terse mode and when to request full diagnostics. Doesn't name alternative tools, but the context is specific enough that an agent can infer when a health check is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agentsA
List live-derived agents, including registry-persisted prompt blockage and pause state; filter to blocked agents or children with mine/parent_agent_id. Default summary returns flat addressable scalars and hides close tombstones and failed spawns whose surfaces are absent; request a terminal state or detail=full to include them. Full detail also includes provenance, health diagnostics, the registry record, and up to 20 unresolved or attention delivery receipts.
| Name | Required | Description | Default |
|---|---|---|---|
| mine | No | Return direct children of the calling agent | |
| repo | No | Filter by repository | |
| model | No | Filter by model | |
| state | No | Filter by state | |
| detail | No | summary (default): flat addressable scalar rows. full: provenance, health diagnostics, the full registry record, and up to 20 unresolved or attention delivery receipts. | summary |
| agent_ids | No | Return only these agent IDs | |
| max_age_ms | No | Maximum acceptable snapshot age in milliseconds (0-5000); topology changes always invalidate the snapshot | |
| parent_agent_id | No | Return direct children of this agent | |
| blocked_on_prompt | No | Return only agents whose registry records show a live prompt blocker |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| count | No | |
| agents | No | |
| derived_at | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important non-obvious behavior beyond the annotations: default summary hides close tombstones and failed spawns, and full detail adds provenance, health diagnostics, the registry record, and up to 20 receipts. Annotations are all false and provide no safety profile, so this carries most of the burden; side effects and auth are not mentioned, but nothing indicates they are needed for this list operation.
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 three dense, front-loaded sentences, each earning its place: what is listed, how filtering works, and what full detail includes. There is no filler or redundant restatement 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 tool with 9 optional parameters and an output schema, the description covers the non-obvious semantics—live-derived state, hidden tombstones/failed spawns, detail levels, and receipt counts—while the schema covers parameter mechanics. The definition is complete enough for an agent to select and invoke this tool 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 100%, so the schema already documents every parameter; the description adds value by connecting mine/parent_agent_id to child filtering, blocked_on_prompt to live prompt blockers, and by explaining how state/detail interact with hidden items. This goes beyond simple schema repetition.
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 a specific verb and resource: 'List live-derived agents' and immediately adds distinguishing scope such as registry-persisted prompt blockage, pause state, and child/blocked filtering. This makes it clearly distinct from sibling tools like list_surfaces or spawn_agent.
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 retrieval guidance: default summary hides tombstones and failed spawns, while requesting a terminal state or detail=full includes them. It does not explicitly name alternative tools or state when not to use this tool, but the context for correct invocation is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_surfacesARead-onlyIdempotent
List workspace, pane, and surface topology. Condensed by default; verbose=true adds raw cmux fields.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Return all raw cmux fields instead of the condensed default. This materially increases token usage and is rarely needed; use it only when a specific raw field is required. | |
| workspace | No | Filter by workspace ref | |
| preview_lines | No | Number of preview lines | |
| include_screen_preview | No | Include screen content preview |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| surfaces | No | |
| workspaces | No | |
| retry_count | Yes | |
| column_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral context by noting the condensed default and that verbose=true adds raw cmux fields, which is meaningful beyond the annotations.
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 tight sentences with the core purpose front-loaded and no filler. Every word 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?
For a read-only topology listing tool with a complete input schema, rich annotations, and an output schema, the description is nearly sufficient. It could be improved by explicitly routing the agent to this tool versus its siblings, but nothing critical is missing for 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 description coverage is 100%, so the baseline is 3. The description reinforces the verbose behavior but does not add substantial meaning beyond what the schema already provides for the other parameters.
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 uses a specific verb ('List') with a clear resource ('workspace, pane, and surface topology'). This distinguishes it from siblings like list_agents, read_screen, and the surface mutation 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 implies the tool is for inspecting surface topology but does not explicitly state when to choose it over alternatives like read_screen or list_agents. It does give useful guidance on the verbose flag, but not on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_screenARead-onlyIdempotent
Read a terminal screen and parsed harness status. Use raw=true for full text or parsed_only=true for monitoring.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, include the full untrimmed terminal content (separators, status-bar art, all lines). Default false returns a compact de-chromed screen_preview instead. | |
| lines | No | Number of lines to read | |
| surface | No | Target surface ref | |
| workspace | No | Target workspace ref | |
| scrollback | No | Include scrollback buffer | |
| surface_id | No | Alias for `surface`, as emitted by list_agents/spawn_agent. | |
| parsed_only | No | If true, return only parsed fields (omit screen content). Best for agent monitoring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| parsed | No | |
| surface | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the tool returns two kinds of content (terminal text and parsed harness status), and the mode selects which one the caller gets, which matters for how an agent consumes the result.
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 short sentences, zero filler. The purpose is front-loaded first, followed immediately by the only mode-selection guidance an agent needs. Every word 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?
For a read-only tool with full schema coverage on all 7 parameters, an output schema, and safety annotations covering the behavioral risk, the description is nearly complete. The only minor gap is that it does not describe the shape of the 'parsed harness status' fields, but the output schema presumably covers that, so nothing critical 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 100%, so the schema already fully documents all 7 parameters. The description's mention of raw=true and parsed_only=true merely restates the schema's own detailed explanations ('full untrimmed terminal content' vs 'return only parsed fields') without adding new semantic value, matching the baseline of 3.
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 and resource ('Read a terminal screen and parsed harness status'), and the dual-output mention (raw text vs parsed status) distinguishes it from sibling reads like list_surfaces or list_agents. It is clear, though it does not explicitly name any sibling it is not.
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 line 'Use raw=true for full text or parsed_only=true for monitoring' gives explicit context for choosing between the two output modes. However, it provides no when-not-to-use guidance or comparison against sibling tools such as wait_for or list_agents, leaving tool-selection mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_to_parentA
Raise a short blocker to this managed agent's registry parent. cmuxlayer chooses the parent; callers cannot address arbitrary agents. The blocker is durably appended to the parent's inbox and its pointer is actively delivered. If that wake fails, cmuxlayer alerts the nearest reachable ancestor and returns fallback provenance. A root agent has no parent and receives an error. Workers with collab_path must append there to reach their own parent lead; this tool refuses that upward route.
| Name | Required | Description | Default |
|---|---|---|---|
| blocker | Yes | Short blocker pointer, capped at 500 characters; put detailed evidence in a report file |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| route | No | |
| durable | No | |
| delivery | No | |
| error_code | No | |
| delivery_id | No | |
| retry_count | Yes | |
| child_agent_id | No | |
| parent_agent_id | No | |
| notified_agent_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish non-read-only and non-destructive behavior, and the description adds durable append to the parent's inbox, active delivery of the pointer, fallback alert to the nearest reachable ancestor with fallback provenance, and refusal for collab_path workers. These behavioral details go well beyond the schema and annotations.
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 dense paragraph, but every sentence carries distinct information—purpose, parent selection, persistence, fallback, root edge case, and collab_path exclusion. It is front-loaded with the action and then details constraints in a logical order.
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?
With one parameter fully documented in the schema, an output schema present, and annotations covering safety, the description supplies the behavioral details needed to call the tool correctly, including fallback behavior and error cases. No critical operational 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 100%, so the baseline is 3, but the description reinforces that the blocker is a short pointer and adds delivery semantics ('durably appended', 'actively delivered'). This adds meaningful context beyond the schema's own description.
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: 'Raise a short blocker to this managed agent's registry parent.' It also clarifies scope by saying cmuxlayer chooses the parent and callers cannot address arbitrary agents, which distinguishes it from arbitrary messaging siblings like send_to.
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 context: root agents receive an error, and workers with collab_path must append there to reach their parent lead because 'this tool refuses that upward route.' It clearly implies this is for parent-directed blockers, but it does not explicitly name alternatives such as send_to, so some routing inference remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_toA
Send text or a key through the shared delivery engine. Never send a Return yourself for a message; send_to submits messages. Key-Return is for pickers, menus, and permission prompts. Every receipt includes caller_agent_id (null when unknown). Workers with collab_path cannot address their own parent or ancestor leads in any mode; append to that collab file instead. Unknown callers remain allowed. Lead-originated and engine-internal pushes remain allowed. Targets may be one agent, structured agent targeting, or a raw surface in surface/command/key mode. A clean verified success returns up to six mode-specific core fields by default: text/command mode returns ok, retry_count, target identity, delivery_state, submitted, and delivery_id when available; key mode returns ok, retry_count, surface, key, submit_verified, and submit_verification_reason. A degraded transport, queued-behind-turn landing, or deduplicated send adds its warning or status field. Pass verbose=true for the full legacy receipt; non-success keeps full diagnostics automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | agent | |
| text | No | Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Text to send. Capped at 500 inline UTF-8 bytes by default. | |
| target | No | ||
| surface | No | ||
| verbose | No | Return the full legacy success receipt, including transport and timing diagnostics. Failures always keep full detail. | |
| agent_id | No | ||
| targeting | No | ||
| workspace | No | ||
| allow_busy | No | Deprecated no-op. Safety gates still refuse text at a picker/menu or permission prompt; use mode=key to drive those deliberately. | |
| background | No | ||
| chunk_size | No | ||
| press_enter | No | Press enter after sending text | |
| rename_to_task | No | ||
| boot_prompt_path | No | ||
| allow_long_inline | No | Bypass the inline length and multi-paragraph safety guards for a deliberate raw send. Large allowed sends keep the existing chunked delivery behavior. | |
| boot_prompt_timeout_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| key | No | |
| model | No | |
| title | No | |
| typed | No | |
| health | No | |
| screen | No | |
| status | No | |
| command | No | |
| surface | No | |
| accepted | No | |
| agent_id | No | |
| delivery | No | |
| receipts | No | |
| terminal | No | |
| delivered | No | |
| agent_type | No | |
| delivery_id | No | |
| done_marker | No | |
| report_path | No | |
| retry_count | Yes | |
| rpc_methods | No | |
| duplicate_of | No | |
| contract_path | No | |
| delivery_state | No | |
| registry_state | No | |
| state_conflict | No | |
| needs_attention | No | |
| submit_evidence | No | |
| submit_verified | No | |
| attention_reason | No | |
| submit_attempted | No | |
| boot_prompt_bytes | No | |
| submit_dispatched | No | |
| boot_prompt_receipt | No | |
| boot_prompt_warning | No | |
| boot_prompt_delivered | No | |
| coordination_footer_note | No | |
| coordination_footer_bytes | No | |
| boot_prompt_submit_verified | No | |
| coordination_footer_delivered | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses detailed behavior beyond annotations: it explains what a 'clean verified success' returns, how degraded transport or deduplication adds fields, and that verbose=true yields the full legacy receipt. It also notes that non-success automatically keeps full diagnostics. The annotations (readOnlyHint=false, destructiveHint=false) are not contradicted; the description adds rich behavioral context about receipts and edge cases without conflicting.
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?
While the description is long, it is dense with necessary information and front-loads the primary purpose and key usage rules. Each sentence contributes value: safety constraints, mode behavior, receipt structure, and edge-case exclusions. There is no fluff or tautology; the length is justified by the tool's complexity and 16 parameters.
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 16 parameters, nested objects, and multiple modes, this description is remarkably complete. It covers target types, mode-specific return fields, failure behavior, the verbose flag, and the collab_path restriction. It also mentions unknown callers and allowed push sources. Nothing critical an agent needs to call this correctly appears 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?
With schema description coverage at only 31%, the description compensates significantly. It clarifies the 'target' parameter by stating targets may be 'one agent, structured agent targeting, or a raw surface in surface/command/key mode,' and explains mode-specific receipts (text/command vs key). It also interprets the 'verbose' parameter by describing the full legacy receipt. This adds substantial meaning to otherwise undocumented parameters.
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 verb+resource: 'Send text or a key through the shared delivery engine.' It immediately establishes the tool's core function and distinguishes it from alternatives by explicitly stating that send_to submits messages rather than the agent sending Return itself, which clarifies its unique role among siblings like wait_for or read_screen.
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 explicit when-to-use and when-not-to-use guidance: 'Never send a Return yourself for a message; send_to submits messages. Key-Return is for pickers, menus, and permission prompts.' It also gives a concrete alternative for workers with collab_path: 'append to that collab file instead.' These are direct, actionable routing instructions that leave no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_agentA
Spawn a managed agent or terminal, or resume a captured agent on a fresh surface while preserving its ID. Placement is deterministic; boot_prompt_timeout_ms also bounds pane placement. Boot prompts return evidence-backed receipts. Successful receipts are lean by default; verbose=true restores full transport and diagnostic detail. Failures always keep full detail.
| Name | Required | Description | Default |
|---|---|---|---|
| cli | No | CLI tool to launch | |
| cwd | No | Initial working directory for type=terminal | |
| repo | No | Repository name (e.g. 'brainlayer', 'golems') | |
| role | No | Agent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly. | |
| type | No | Spawn an AI agent or a plain terminal | agent |
| focus | No | Leave focus on the created agent tab instead of restoring the exact origin after initialization. | |
| force | No | With resume_agent_id only: override missing or inconclusive proof that the old session is not running (no recorded pid, an unproven pid, an unreadable topology or process table) after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements. | |
| model | No | OPTIONAL — leave UNSET so the launcher pins the top-tier model. For cli:'codex', an explicit model is checked against Codex's runtime model list before any worktree or surface is created, then passed through to the launcher. Never pass 'opus' for claude — the top Claude model is already the default. | |
| title | No | The caller-supplied agent pane title is applied verbatim (for example `cmuxlayer-WORKER · run1 name-the-tabs`); when omitted or blank, the existing agent-id/surface fallback is retained. Managed identity comes from the agent registry, not this display title (#479/#492). | |
| effort | No | Required for codex new agent spawns: low, medium, high, xhigh, max, ultra. Choose deliberately: medium for well-specified lanes, high for security/open-ended; xhigh and above cost more. Omit on resume (the session keeps its effort) and for other CLIs (effort is invalid). | |
| prompt | No | Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Inline task prompt to send after the agent is ready. Capped at 500 inline UTF-8 bytes by default; use boot_prompt_path for larger prompts. Mutually exclusive with boot_prompt_path. | |
| verbose | No | Return the full legacy spawn response instead of the lean default. | |
| version | No | SpawnSpec schema version | |
| worktree | No | When set, create or reuse a git worktree before launch. Pass a string such as "tool-usage" as the worktree name, true for a generated name, or an object with name, path, branch, base, create, and reuse. When repoGolem registers the repo with an absolute path, that path is the repo root; otherwise the root is resolved from CMUXLAYER_REPO_HOME, the running checkout, or ~/Gits. true uses <registered-root>/.worktrees/<generated-name> (legacy ~/Gits/<repo>.wt read-fallback until ~2026-09). If a later spawn step fails before a recoverable surface exists, a newly created worktree and branch are rolled back. | |
| authority | No | Authority axis, independent from job function and placement | |
| force_new | No | When true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane. | |
| placement | No | Physical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted. | |
| workspace | No | Target workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace. | |
| collab_path | No | Lead coordination file; workers inherit their parent lead collab_path unless explicitly supplied. | |
| mcp_profile | No | MCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals. | |
| report_path | No | Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified. Inspect the pane, then relay with send_to({agent_id, text:"Read and follow <contract_path>", press_enter:true}); do not use raw cmux send/send-key. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker. | |
| halt_escalation | No | Notify the nearest live ancestor when this agent remains awaiting input, idle without done evidence, or wedged past its dwell threshold. Set false for deliberate debugging lanes. | |
| parent_agent_id | No | ID of the parent agent for hierarchical spawning. Normally inferred from the managed caller surface; pass explicitly only when no managed caller supplies the hierarchy. Parent must exist. | |
| resume_agent_id | No | THE way to revive an agent: resume this captured session on a fresh surface, keeping its public agent ID and re-issuing its coordination contract. cmuxlayer never revives a pane by itself (#492) -- a pane you close stays closed -- so a lead that wants an agent back asks here, by id. Refused with a reason when the session transcript is not on disk, rather than opening an empty pane. Mutually exclusive with new-spawn fields. | |
| boot_prompt_path | No | Optional readable prompt-file path. Checked before spawning; multiline or over-cap files are submitted as one `Read and follow <path>` pointer and one final return after readiness. Mutually exclusive with prompt. | |
| allow_long_inline | No | Bypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts. | |
| max_cost_per_agent | No | Maximum cost cap in USD for this agent | |
| auto_archive_on_done | No | Deprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes. | |
| boot_prompt_timeout_ms | No | Optional timeout override in milliseconds for pane placement, initial shell readiness, agent launch readiness, and the boot prompt. When omitted, each phase keeps its established default (45s placement, 10s shell, 15s launch, 60s boot prompt). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| cwd | No | |
| role | No | |
| type | No | |
| title | No | |
| version | No | |
| agent_id | No | |
| surface_id | No | |
| cwd_receipt | No | |
| done_marker | No | |
| next_action | No | |
| report_path | No | |
| retry_count | Yes | |
| spawn_state | No | |
| workspace_id | No | |
| contract_path | No | |
| delivered_chars | No | |
| parent_agent_id | No | |
| boot_prompt_bytes | No | |
| boot_prompt_receipt | No | |
| update_menu_skipped | No | |
| boot_prompt_delivered | No | |
| update_menu_text_hash | No | |
| coordination_footer_note | No | |
| coordination_footer_bytes | No | |
| boot_prompt_submit_verified | No | |
| coordination_footer_delivered | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-read-only, non-destructive mutation. The description adds real value beyond them: deterministic placement, the timeout bounding placement, 'evidence-backed receipts', lean-by-default successful output with verbose=true restoring detail, and failures always retaining full detail. This is genuine return/behavior 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?
Four dense sentences, front-loaded with the core capability and then behavioral/return traits. Every sentence contributes, though the receipt/verbose sentences are terse and pack multiple ideas.
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 29-param spawn tool with an output schema and fully documented parameters, the description supplies the behavioral layer (placement determinism, receipt lean/verbose behavior) the annotations and schema don't. It is largely sufficient, with only minor usage-routing gaps left to the 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 description coverage is 100%, so the schema already documents all 29 parameters richly. The description only gestures at boot_prompt_timeout_ms and verbose, adding little beyond what the schema already states; baseline 3 applies.
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 specific verbs and resources: 'Spawn a managed agent or terminal, or resume a captured agent on a fresh surface while preserving its ID.' This clearly distinguishes it from siblings like list_agents, send_to, and close_surface, which are about inspecting/messaging/terminating rather than creating.
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?
Implies two modes (new spawn vs resume) but gives no explicit when-to-use/when-not guidance or naming of alternatives beyond the resume clause. The heavier routing guidance (resume_agent_id as 'THE way to revive', mutual exclusions) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_surfaceC
Move or rename one terminal surface.
| Name | Required | Description | Default |
|---|---|---|---|
| pane | No | ||
| after | No | ||
| focus | No | ||
| index | No | ||
| title | No | ||
| action | Yes | ||
| before | No | ||
| surface | Yes | ||
| workspace | No | ||
| preserve_prefix | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| pane | No | |
| title | No | |
| action | No | |
| surface | No | |
| workspace | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only names the operations without disclosing side effects, reversibility, focus behavior, or interaction with other surfaces. Annotations are all false and provide no positive info, so the description carries the burden but fails to add behavioral detail.
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?
A single, direct sentence with no fluff, front-loaded and easy to parse. However, brevity comes at the cost of essential information, which is captured in other dimensions.
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?
With 10 parameters, 0% schema description coverage, and only a vague operation summary, the description is drastically under-sized. The output schema does not compensate for missing input semantics, leaving the agent with insufficient context to invoke the tool 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% and the description does not mention any of the 10 parameters. The agent receives no explanation of 'surface', 'action', 'before', 'after', 'index', 'preserve_prefix', etc., making correct parameter construction impossible.
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: move or rename one terminal surface. Clearly distinguishes from siblings like close_surface (close) and list_surfaces (list), so an agent can tell them apart without opening the schema.
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 no guidance on when to use move versus rename, or when this tool should be preferred over close_surface, send_to, or possibly wait_for. No exclusions or alternative routing is mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forA
Block until one agent_id or every agent in ids reaches a target registry state and return health. Defaults to waiting for completion (done).
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Agent IDs to wait for together | |
| mine | No | Wait for every direct child of the calling agent | |
| watch | No | Declared WatchSpec alternative to agent_id/ids | |
| agent_id | No | Single agent ID from spawn_agent | |
| condition | No | Alias for target_state | |
| timeout_ms | No | Timeout in milliseconds (default: 5 minutes) | |
| delivery_id | No | Wait for a send_to delivery_id to reach a terminal outcome | |
| done_marker | No | Final-line marker for report_path | |
| report_path | No | With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must be a regular file (max 1 MiB) under ~/.cmux/agents/<agent_id>/ or ~/.cmux/live-harness/, else refused. An agent in error never matches. | |
| target_state | No | State to wait for |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| typed | No | |
| watch | No | |
| results | No | |
| agent_id | No | |
| delivery | No | |
| terminal | No | |
| delivered | No | |
| timed_out | No | |
| delivery_id | No | |
| retry_count | Yes | |
| rpc_methods | No | |
| duplicate_of | No | |
| delivery_state | No | |
| needs_attention | No | |
| submit_evidence | No | |
| submit_verified | No | |
| attention_reason | No | |
| submit_attempted | No | |
| submit_dispatched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, closed-world, which is an unusual profile for a wait tool and the description doesn't reconcile it. The description does add real behavioral value by disclosing that the call blocks and defaults to waiting for `done`, plus that it returns health. However, the timeout default, the refusal conditions for `report_path`, and the exclusive watch alternatives are only in the schema, so the description adds modest context beyond structured fields.
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 sentences, zero filler, with the core blocking semantics and the default condition front-loaded. Nothing is repeated and nothing needs trimming.
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?
An output schema exists and the description correctly says it returns health, so return values need no further explanation. The description covers the primary single-agent and multi-agent wait paths that constitute the tool's main use, and it does so without re-documenting parameters that the schema already fully specifies.
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 100%, so the baseline is 3. The description restates the `agent_id`/`ids` targeting and the `done` default for the target state, which is redundant with the schema. It adds no meaning for the other eight parameters, including the nested `watch` object and the `condition`/`target_state` alias relationship.
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: it blocks until an agent (single `agent_id` or a set in `ids`) reaches a target registry state, then returns health. That clearly separates it from read-only siblings like `list_agents` or `read_screen`, which observe without blocking. It stops short of 5 because the tool's other major wait modes (watch specs, `delivery_id`, file-backed done) are invisible at this level.
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 explicit when-to-use guidance or named alternative; the agent must infer that this is the blocking counterpart to polling `read_screen`/`control_health`. The only steer is the default-state note (`done`), which is a parameter default rather than usage routing. No prerequisites, no mention of when not to block.
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.
1 tool update
v0.4.92- Changed
spawn_agent4 fields changed- changed
Input schema / properties / effort / descriptionPrevious value: -"Codex reasoning effort, passed to the repoGolem launcher. CHOOSE THIS DELIBERATELY PER MISSION — it is a cost decision, not a default to inherit. The installed launcher currently accepts: low, medium, high, xhigh, max, ultra. spawn_agent rejects other values before creating a worktree or surface. The live launcher defaults to HIGH when omitted (~/.config/ralphtools/golem-dispatch.zsh). Per /agent-routing, MEDIUM is the settled floor for well-specified implementation lanes — use it unless the task genuinely needs more; xhigh and above burn budget fast and are rarely warranted for a lane with a clear brief."New value: +"Required for codex new agent spawns: low, medium, high, xhigh, max, ultra. Choose deliberately: medium for well-specified lanes, high for security/open-ended; xhigh and above cost more. Omit on resume (the session keeps its effort) and for other CLIs (effort is invalid)." - changed
Input schema / properties / effort / enumPrevious value: -[ - "low", - "medium", - "high", - "xhigh", - "max", - "ultra" -]New value: +[ + "low", + "medium", + "high", + "xhigh", + "max", + "ultra", + "" +] - changed
Input schema / properties / force / descriptionPrevious value: -"With resume_agent_id only: override inconclusive recorded-process liveness after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements."New value: +"With resume_agent_id only: override missing or inconclusive proof that the old session is not running (no recorded pid, an unproven pid, an unreadable topology or process table) after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements." - changed
Input schema / properties / report_path / descriptionPrevious value: -"Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified, so YOU must relay contract_path, report_path, and done_marker. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker."New value: +"Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified. Inspect the pane, then relay with send_to({agent_id, text:\"Read and follow <contract_path>\", press_enter:true}); do not use raw cmux send/send-key. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker."
1 tool update
v0.4.89- Changed
wait_for1 field changed- changed
Input schema / properties / report_path / descriptionPrevious value: -"With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must sit under ~/.cmux/ or ~/.cmux/agents/<agent_id>/, else refused."New value: +"With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must be a regular file (max 1 MiB) under ~/.cmux/agents/<agent_id>/ or ~/.cmux/live-harness/, else refused. An agent in error never matches."
24 tool updates
v0.4.88- Removed
browser_surface - Changed
close_surface5 fields changed- added
Input schema / properties / agent_idAdded value: +{ + "description": "Managed agent ID", + "type": "string" +} - added
Input schema / properties / forceAdded value: +{ + "default": false, + "description": "Close even when the backing agent is still live (not done/error). This never bypasses stable surface identity checks. Without force, a live agent's surface is protected and the response returns the current pane contents instead of closing.", + "type": "boolean" +} - added
Input schema / properties / scopeAdded value: +{ + "default": "surface", + "enum": [ + "surface", + "agent", + "workspace" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "surface" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agent_id": { + "type": "string" + }, + "agents": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "caller_workspace": { + "type": "boolean" + }, + "collapse_pane": { + "type": "boolean" + }, + "force": { + "type": "boolean" + }, + "live_agents": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "ok": { + "type": "boolean" + }, + "pane": { + "type": "string" + }, + "refused": { + "type": "boolean" + }, + "removed": { + "additionalProperties": {}, + "type": "object" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "scope": { + "enum": [ + "surface", + "agent", + "workspace" + ], + "type": "string" + }, + "state": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "surfaces": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "workspace": { + "type": "string" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Added
control_health - Removed
get_agent_state - Removed
interact - Removed
kill - Changed
list_agents7 fields changed- added
Input schema / properties / agent_idsAdded value: +{ + "description": "Return only these agent IDs", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / blocked_on_promptAdded value: +{ + "description": "Return only agents whose registry records show a live prompt blocker", + "type": "boolean" +} - added
Input schema / properties / detailAdded value: +{ + "default": "summary", + "description": "summary (default): flat addressable scalar rows. full: provenance, health diagnostics, the full registry record, and up to 20 unresolved or attention delivery receipts.", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - added
Input schema / properties / max_age_msAdded value: +{ + "description": "Maximum acceptable snapshot age in milliseconds (0-5000); topology changes always invalidate the snapshot", + "maximum": 5000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / mineAdded value: +{ + "default": false, + "description": "Return direct children of the calling agent", + "type": "boolean" +} - added
Input schema / properties / parent_agent_idAdded value: +{ + "description": "Return direct children of this agent", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agents": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "derived_at": { + "type": "number" + }, + "ok": { + "type": "boolean" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Changed
list_surfaces2 fields changed- added
Input schema / properties / verboseAdded value: +{ + "default": false, + "description": "Return all raw cmux fields instead of the condensed default. This materially increases token usage and is rarely needed; use it only when a specific raw field is required.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "column_count": { + "minimum": 0, + "type": "integer" + }, + "ok": { + "type": "boolean" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "surfaces": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "workspaces": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
new_split - Removed
read_agent_output - Changed
read_screen5 fields changed- added
Input schema / properties / parsed_onlyAdded value: +{ + "default": false, + "description": "If true, return only parsed fields (omit screen content). Best for agent monitoring.", + "type": "boolean" +} - added
Input schema / properties / rawAdded value: +{ + "default": false, + "description": "If true, include the full untrimmed terminal content (separators, status-bar art, all lines). Default false returns a compact de-chromed screen_preview instead.", + "type": "boolean" +} - added
Input schema / properties / surface_idAdded value: +{ + "description": "Alias for `surface`, as emitted by list_agents/spawn_agent.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "surface" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ok": { + "type": "boolean" + }, + "parsed": { + "additionalProperties": {}, + "type": "object" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "surface": { + "type": "string" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
rename_tab - Added
report_to_parent - Removed
send_input - Removed
send_key - Added
send_to - Removed
send_to_agent - Removed
set_progress - Removed
set_status - Changed
spawn_agent29 fields changed- added
Input schema / properties / allow_long_inlineAdded value: +{ + "default": false, + "description": "Bypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts.", + "type": "boolean" +} - added
Input schema / properties / authorityAdded value: +{ + "description": "Authority axis, independent from job function and placement", + "enum": [ + "lead", + "worker" + ], + "type": "string" +} - added
Input schema / properties / auto_archive_on_doneAdded value: +{ + "default": false, + "description": "Deprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes.", + "type": "boolean" +} - added
Input schema / properties / boot_prompt_pathAdded value: +{ + "description": "Optional readable prompt-file path. Checked before spawning; multiline or over-cap files are submitted as one `Read and follow <path>` pointer and one final return after readiness. Mutually exclusive with prompt.", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / boot_prompt_timeout_msAdded value: +{ + "description": "Optional timeout override in milliseconds for pane placement, initial shell readiness, agent launch readiness, and the boot prompt. When omitted, each phase keeps its established default (45s placement, 10s shell, 15s launch, 60s boot prompt).", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / properties / collab_pathAdded value: +{ + "description": "Lead coordination file; workers inherit their parent lead collab_path unless explicitly supplied.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / cwdAdded value: +{ + "description": "Initial working directory for type=terminal", + "type": "string" +} - added
Input schema / properties / effortAdded value: +{ + "description": "Codex reasoning effort, passed to the repoGolem launcher. CHOOSE THIS DELIBERATELY PER MISSION — it is a cost decision, not a default to inherit. The installed launcher currently accepts: low, medium, high, xhigh, max, ultra. spawn_agent rejects other values before creating a worktree or surface. The live launcher defaults to HIGH when omitted (~/.config/ralphtools/golem-dispatch.zsh). Per /agent-routing, MEDIUM is the settled floor for well-specified implementation lanes — use it unless the task genuinely needs more; xhigh and above burn budget fast and are rarely warranted for a lane with a clear brief.", + "enum": [ + "low", + "medium", + "high", + "xhigh", + "max", + "ultra" + ], + "type": "string" +} - added
Input schema / properties / focusAdded value: +{ + "default": false, + "description": "Leave focus on the created agent tab instead of restoring the exact origin after initialization.", + "type": "boolean" +} - added
Input schema / properties / forceAdded value: +{ + "default": false, + "description": "With resume_agent_id only: override inconclusive recorded-process liveness after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements.", + "type": "boolean" +} - added
Input schema / properties / force_newAdded value: +{ + "default": false, + "description": "When true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane.", + "type": "boolean" +} - added
Input schema / properties / halt_escalationAdded value: +{ + "default": true, + "description": "Notify the nearest live ancestor when this agent remains awaiting input, idle without done evidence, or wedged past its dwell threshold. Set false for deliberate debugging lanes.", + "type": "boolean" +} - added
Input schema / properties / max_cost_per_agentAdded value: +{ + "description": "Maximum cost cap in USD for this agent", + "type": "number" +} - added
Input schema / properties / mcp_profileAdded value: +{ + "anyOf": [ + { + "enum": [ + "inherit", + "sterile", + "skill_eval" + ], + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "exclude": { + "items": { + "type": "string" + }, + "type": "array" + }, + "include": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "MCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals." +} - changed
Input schema / properties / model / descriptionPrevious value: -"Model name (e.g. 'sonnet', 'codex', 'opus')"New value: +"OPTIONAL — leave UNSET so the launcher pins the top-tier model. For cli:'codex', an explicit model is checked against Codex's runtime model list before any worktree or surface is created, then passed through to the launcher. Never pass 'opus' for claude — the top Claude model is already the default." - added
Input schema / properties / parent_agent_idAdded value: +{ + "description": "ID of the parent agent for hierarchical spawning. Normally inferred from the managed caller surface; pass explicitly only when no managed caller supplies the hierarchy. Parent must exist.", + "type": "string" +} - added
Input schema / properties / placementAdded value: +{ + "description": "Physical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted.", + "enum": [ + "left", + "right", + "orchestrator", + "worker" + ], + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious value: -"Task prompt to send after agent is ready"New value: +"Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Inline task prompt to send after the agent is ready. Capped at 500 inline UTF-8 bytes by default; use boot_prompt_path for larger prompts. Mutually exclusive with boot_prompt_path." - added
Input schema / properties / report_pathAdded value: +{ + "description": "Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified, so YOU must relay contract_path, report_path, and done_marker. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker.", + "type": "string" +} - added
Input schema / properties / resume_agent_idAdded value: +{ + "description": "THE way to revive an agent: resume this captured session on a fresh surface, keeping its public agent ID and re-issuing its coordination contract. cmuxlayer never revives a pane by itself (#492) -- a pane you close stays closed -- so a lead that wants an agent back asks here, by id. Refused with a reason when the session transcript is not on disk, rather than opening an empty pane. Mutually exclusive with new-spawn fields.", + "type": "string" +} - added
Input schema / properties / roleAdded value: +{ + "description": "Agent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly.", + "enum": [ + "orchestrator", + "worker", + "implementor", + "reviewer", + "gatherer" + ], + "type": "string" +} - added
Input schema / properties / titleAdded value: +{ + "description": "The caller-supplied agent pane title is applied verbatim (for example `cmuxlayer-WORKER · run1 name-the-tabs`); when omitted or blank, the existing agent-id/surface fallback is retained. Managed identity comes from the agent registry, not this display title (#479/#492).", + "type": "string" +} - added
Input schema / properties / typeAdded value: +{ + "default": "agent", + "description": "Spawn an AI agent or a plain terminal", + "enum": [ + "agent", + "terminal" + ], + "type": "string" +} - added
Input schema / properties / verboseAdded value: +{ + "default": false, + "description": "Return the full legacy spawn response instead of the lean default.", + "type": "boolean" +} - added
Input schema / properties / versionAdded value: +{ + "const": 1, + "default": 1, + "description": "SpawnSpec schema version", + "type": "number" +} - changed
Input schema / properties / workspace / descriptionPrevious value: -"Target workspace ref"New value: +"Target workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace." - added
Input schema / properties / worktreeAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "create": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "reuse": { + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "When set, create or reuse a git worktree before launch. Pass a string such as \"tool-usage\" as the worktree name, true for a generated name, or an object with name, path, branch, base, create, and reuse. When repoGolem registers the repo with an absolute path, that path is the repo root; otherwise the root is resolved from CMUXLAYER_REPO_HOME, the running checkout, or ~/Gits. true uses <registered-root>/.worktrees/<generated-name> (legacy ~/Gits/<repo>.wt read-fallback until ~2026-09). If a later spawn step fails before a recoverable surface exists, a newly created worktree and branch are rolled back." +} - removed
Input schema / requiredRemoved value: -[ - "repo", - "model", - "cli", - "prompt" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agent_id": { + "type": "string" + }, + "boot_prompt_bytes": { + "minimum": 0, + "type": "integer" + }, + "boot_prompt_delivered": { + "type": "boolean" + }, + "boot_prompt_receipt": { + "$ref": "#/properties/cwd_receipt" + }, + "boot_prompt_submit_verified": { + "type": [ + "boolean", + "null" + ] + }, + "contract_path": { + "type": "string" + }, + "coordination_footer_bytes": { + "minimum": 0, + "type": "integer" + }, + "coordination_footer_delivered": { + "type": "boolean" + }, + "coordination_footer_note": { + "type": "string" + }, + "cwd": { + "type": [ + "string", + "null" + ] + }, + "cwd_receipt": { + "additionalProperties": true, + "properties": { + "attention_reason": { + "type": "string" + }, + "bytes": { + "minimum": 0, + "type": "integer" + }, + "delivered": { + "type": "boolean" + }, + "delivery": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "delivery_id": { + "type": "string" + }, + "delivery_state": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "duplicate_of": { + "type": "string" + }, + "needs_attention": { + "type": "boolean" + }, + "prompt_bytes": { + "minimum": 0, + "type": "integer" + }, + "prompt_sha256": { + "type": "string" + }, + "prompt_warning": { + "type": [ + "string", + "null" + ] + }, + "rpc_methods": { + "items": { + "enum": [ + "surface.send_text", + "surface.send_key" + ], + "type": "string" + }, + "type": "array" + }, + "submit_attempted": { + "type": "boolean" + }, + "submit_dispatched": { + "type": "boolean" + }, + "submit_evidence": { + "anyOf": [ + { + "enum": [ + "token_delta", + "transcript_echo", + "cleared_composer", + "status_only" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "submit_verified": { + "type": [ + "boolean", + "null" + ] + }, + "terminal": { + "type": "boolean" + }, + "typed": { + "type": "boolean" + } + }, + "type": "object" + }, + "delivered_chars": { + "minimum": 0, + "type": "integer" + }, + "done_marker": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "parent_agent_id": { + "type": [ + "string", + "null" + ] + }, + "report_path": { + "type": "string" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "role": { + "type": "string" + }, + "spawn_state": { + "enum": [ + "started", + "boot_unsubmitted" + ], + "type": "string" + }, + "surface_id": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "agent", + "terminal" + ], + "type": "string" + }, + "update_menu_skipped": { + "type": "boolean" + }, + "update_menu_text_hash": { + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + }, + "workspace_id": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
stop_agent - Added
update_surface - Changed
wait_for10 fields changed- changed
Input schema / properties / agent_id / descriptionPrevious value: -"Agent ID from spawn_agent"New value: +"Single agent ID from spawn_agent" - added
Input schema / properties / conditionAdded value: +{ + "description": "Alias for target_state", + "enum": [ + "ready", + "working", + "idle", + "done", + "error" + ], + "type": "string" +} - added
Input schema / properties / delivery_idAdded value: +{ + "description": "Wait for a send_to delivery_id to reach a terminal outcome", + "type": "string" +} - added
Input schema / properties / done_markerAdded value: +{ + "description": "Final-line marker for report_path", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / idsAdded value: +{ + "description": "Agent IDs to wait for together", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / mineAdded value: +{ + "default": false, + "description": "Wait for every direct child of the calling agent", + "type": "boolean" +} - added
Input schema / properties / report_pathAdded value: +{ + "description": "With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must sit under ~/.cmux/ or ~/.cmux/agents/<agent_id>/, else refused.", + "type": "string" +} - added
Input schema / properties / watchAdded value: +{ + "additionalProperties": false, + "description": "Declared WatchSpec alternative to agent_id/ids", + "properties": { + "change": { + "const": "content", + "description": "Persistent file-content change watch; mutually exclusive with predicate and marker", + "type": "string" + }, + "deadline": { + "description": "Absolute Unix deadline in milliseconds", + "exclusiveMinimum": 0, + "type": "integer" + }, + "marker": { + "description": "Literal file marker; mutually exclusive with predicate and change", + "minLength": 1, + "type": "string" + }, + "notify": { + "description": "Opt in to the configured external notification transport", + "type": "boolean" + }, + "owner": { + "description": "Agent/seat notified by the watch", + "minLength": 1, + "type": "string" + }, + "predicate": { + "description": "Agent screen-state predicate: thinking, working, idle, done, error; mutually exclusive with marker and change", + "enum": [ + "thinking", + "working", + "idle", + "done", + "error" + ], + "type": "string" + }, + "target": { + "description": "Absolute file path or public agent_id", + "minLength": 1, + "type": "string" + }, + "watermark": { + "description": "Prior marker count; defaults to count observed at arm time", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "owner", + "target", + "deadline" + ], + "type": "object" +} - removed
Input schema / requiredRemoved value: -[ - "agent_id", - "target_state" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agent_id": { + "type": "string" + }, + "attention_reason": { + "type": "string" + }, + "delivered": { + "type": "boolean" + }, + "delivery": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "delivery_id": { + "type": "string" + }, + "delivery_state": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "duplicate_of": { + "type": "string" + }, + "needs_attention": { + "type": "boolean" + }, + "ok": { + "type": "boolean" + }, + "results": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "rpc_methods": { + "items": { + "enum": [ + "surface.send_text", + "surface.send_key" + ], + "type": "string" + }, + "type": "array" + }, + "submit_attempted": { + "type": "boolean" + }, + "submit_dispatched": { + "type": "boolean" + }, + "submit_evidence": { + "anyOf": [ + { + "enum": [ + "token_delta", + "transcript_echo", + "cleared_composer", + "status_only" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "submit_verified": { + "type": [ + "boolean", + "null" + ] + }, + "terminal": { + "type": "boolean" + }, + "timed_out": { + "type": "boolean" + }, + "typed": { + "type": "boolean" + }, + "watch": { + "additionalProperties": {}, + "type": "object" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
wait_for_all
20 tool updates
v0.1.0- First observed
browser_surface - First observed
close_surface - First observed
get_agent_state - First observed
interact - First observed
kill - First observed
list_agents - First observed
list_surfaces - First observed
new_split - First observed
read_agent_output - First observed
read_screen - First observed
rename_tab - First observed
send_input - First observed
send_key - First observed
send_to_agent - First observed
set_progress - First observed
set_status - First observed
spawn_agent - First observed
stop_agent - First observed
wait_for - First observed
wait_for_all
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action: health check, spawn, wait, list agents, send, list surfaces, read screen, update surface, close surface, report to parent. No two tools appear to do the same thing; overlaps are minimal and descriptions clarify boundaries.
Most names follow verb_noun snake_case (spawn_agent, list_agents, etc.), but wait_for and send_to use verb_preposition without an explicit noun, and report_to_parent adds a prepositional phrase. This is a minor deviation and still readable.
10 tools is well-scoped for a multiplexer/agent-management server; each tool has a clear role and there are no redundant or thin entries.
Core lifecycle is covered: spawn, list, send, wait, read, update, close, health, report. Minor gaps exist, e.g., no dedicated pause/resume agent tool (though spawn_agent can resume and list_agents surfaces pause state), so agents can mostly work around them.
Maintenance
Related MCP Connectors
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Remote MCP server to run your Atako AI agents: chat, projects, files, integrations and channels.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceTerminal MCP server for AI coding agents with persistent PTY sessions, ring-buffer incremental reads, headless xterm screen capture, multi-agent orchestration, and a real-time web dashboard.17 npm25MIT
- AlicenseAqualityAmaintenanceMCP server for hyperpanes terminal workspace app, enabling AI agents to compose and launch workspace layouts, inspect and drive terminal panes, stream output, and orchestrate agent hierarchies.471MIT
- AlicenseBqualityCmaintenanceA comprehensive MCP server for driving tmux sessions, windows, panes, sending keystrokes, and reading pane output locally or over SSH, enabling real-time collaborative pairing with AI.7113 PyPI3MIT
- AlicenseAqualityDmaintenanceMCP server to control Onda terminal from AI agents, providing tools for splitting panes, running commands, managing tabs and workspaces, and orchestrating multi-agent workflows across multiple windows.3913 npmMIT