Skip to main content
Glama

cmuxLayer

Tus agentes de IA no pueden ver las terminales de los demás. Uno se ejecuta en la pestaña 1, otro en la pestaña 2, y tú eres el portapapeles entre ellos. cmuxLayer soluciona esto: 26 herramientas MCP que brindan a los agentes de IA control programático sobre los espacios de trabajo de la terminal.

install License MCP Tools Tests

Inicio rápido

npm install -g cmuxlayer

Requiere que cmux esté en ejecución.

Añádelo a tu configuración de MCP:

Codex CLI / T3 Code

T3 Code hereda los servidores MCP del archivo de configuración de Codex CLI en ~/.codex/config.toml (o $CODEX_HOME/config.toml).

[mcp_servers.cmux]
command = "cmuxlayer"

Claude Code, Cursor, VS Code, Claude Desktop

{
  "mcpServers": {
    "cmux": {
      "command": "cmuxlayer"
    }
  }
}

Ubicaciones de configuración: Codex CLI / T3 Code ~/.codex/config.toml (o $CODEX_HOME/config.toml) | Claude Code .mcp.json o claude mcp add cmuxlayer -s user -- cmuxlayer | Cursor .cursor/mcp.json | VS Code .vscode/mcp.json | Claude Desktop — consulta la documentación de MCP para conocer las rutas específicas de cada plataforma

Related MCP server: hyperpanes-mcp

Qué puedes hacer

Dile a tu agente de IA cosas como:

  • "Divide un panel a la derecha y ejecuta mi suite de pruebas allí"

  • "Genera un agente de Claude Code en un nuevo panel para refactorizar auth.ts"

  • "Lee la pantalla de surface:2 y dime si la compilación fue exitosa"

  • "Espera a que todos los agentes terminen, luego lee su salida"

  • "Establece el estado de la barra lateral para mostrar nuestro progreso de despliegue"

Internamente, cmuxLayer expone 26 herramientas MCP para el control de terminales, lectura de pantalla, gestión de diseño y orquestación de múltiples agentes. read_screen analiza los metadatos del agente (estado, modelo, tokens, % de contexto) para Claude Code, Codex, Gemini y Cursor.

Herramientas MCP (26)

Todas las herramientas incluyen ToolAnnotations para la aplicación automática de políticas de seguridad.

Control de terminal — new_split new_surface move_surface reorder_surface send_input send_key read_screen rename_tab close_surface browser_surface

Ciclo de vida del agente — spawn_agent send_to send_to_agent wait_for wait_for_all interact stop_agent kill

Espacio de trabajo — list_surfaces list_agents my_agents get_agent_state read_agent_output notify set_status set_progress

Solo lectura (6)

Herramienta

Qué hace

list_surfaces

Lista todas las superficies en los espacios de trabajo

read_screen

Lee la salida de la terminal con el estado del agente analizado

get_agent_state

Estado completo de un agente rastreado

list_agents

Todos los agentes, con filtros opcionales

my_agents

Hijos de un agente padre con estado de pantalla en vivo

read_agent_output

Salida estructurada entre marcadores delimitadores

Mutación (17)

Herramienta

Qué hace

new_split

Crea un panel dividido de terminal o navegador

new_surface

Crea una pestaña en un panel existente

move_surface

Mueve una superficie a otro panel o posición

reorder_surface

Reordena las pestañas dentro de un panel

send_input

Envía texto a una superficie

send_key

Envía una pulsación de tecla (return, escape, ctrl-c, etc.)

rename_tab

Cambia el nombre de una pestaña de superficie

notify

Muestra un banner de notificación de cmux

set_status

Establece el par clave-valor de estado de la barra lateral

set_progress

Establece el indicador de progreso (0.0-1.0)

browser_surface

Interactúa con superficies de navegador

spawn_agent

Genera un agente CLI en un nuevo panel

send_to

Envía texto a un agente rastreado sin conocer su superficie

send_to_agent

Envía un prompt a un agente en ejecución

wait_for

Bloquea hasta que el agente alcance un estado objetivo (por defecto done)

wait_for_all

Bloquea hasta que varios agentes terminen

interact

Envía entrada interactiva (confirmar, cancelar, reanudar)

Destructivas (3)

Herramienta

Qué hace

close_surface

Cierra un panel de terminal o navegador

stop_agent

Detiene un agente de forma elegante

kill

Fuerza la finalización de los procesos del agente

Agentes soportados

CLI

Comando

Detección automática

Claude Code

claude

estado, modelo, tokens, % de contexto

Codex

codex

estado, modelo, % de contexto

Gemini CLI

gemini

estado, modelo, tokens, % de contexto

Cursor

cursor agent

estado, modelo, tokens, % de contexto

read_screen detecta automáticamente el tipo de agente y analiza los metadatos de la salida de la terminal.

Arquitectura

AI Agent  ─── MCP ───>  cmuxLayer  ─── Unix socket ───>  cmux
                         ├── Agent engine (spawn → monitor → teardown)
                         ├── Screen parser (5 agent formats)
                         ├── Mode policy (autonomous vs manual)
                         └── State manager + event log

El cliente de socket se conecta a cmux a través de un socket Unix. Se reconecta automáticamente al desconectarse y recurre al subproceso CLI si el socket no está disponible.

Conexión

Latencia

Aceleración

Subproceso CLI

~142ms

línea base

Socket Unix

~0.1ms

1,423x

Solución de problemas

cmux no se está ejecutando cmuxLayer requiere una instancia de cmux en ejecución. Instálalo primero y luego inicia una sesión de cmux antes de usar cmuxLayer.

Las herramientas no aparecen en Codex CLI o T3 Code Reinicia el cliente después de añadir cmuxlayer a ~/.codex/config.toml. Si utilizas un home de Codex personalizado, verifica que $CODEX_HOME/config.toml contenga la misma entrada mcp_servers.cmux.

Las herramientas no aparecen en Claude Code Reinicia Claude Code después de añadir la configuración de MCP. Ejecuta claude mcp list para verificar que cmuxlayer esté conectado.

Error de conexión de socket cmuxLayer descubre automáticamente el socket de cmux (macOS: ~/Library/Application Support/cmux/cmux.sock). Sobrescríbelo con CMUX_SOCKET_PATH si es necesario.

Pruebas

bun run test        # 406 tests via vitest
npm run typecheck   # Type checking

Desarrollo

npm install
npm run dev         # Run with tsx (hot reload)
npm run build       # Compile TypeScript
npm start           # Run compiled output

Contribución

Consulta CONTRIBUTING.md para la configuración de desarrollo y las pautas de PR.

Licencia

Apache 2.0 — consulta LICENSE.


Parte del ecosistema de agentes de IA Golems. cmuxlayer.etanheyman.com | Creado por @EtanHey.

Available Tools

10 tools
close_surfaceA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoClose 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.
scopeNosurface
surfaceNoTarget surface ref
agent_idNoManaged agent ID
workspaceNoTarget workspace ref

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
paneNo
forceNo
scopeNo
stateNo
agentsNo
refusedNo
removedNo
surfaceNo
agent_idNo
surfacesNo
workspaceNo
live_agentsNo
retry_countYes
collapse_paneNo
caller_workspaceNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_healthA
Read-onlyIdempotent

Report terse control-path health by default; pass detail=full for diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoterse

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
healthNo
retry_countYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mineNoReturn direct children of the calling agent
repoNoFilter by repository
modelNoFilter by model
stateNoFilter by state
detailNosummary (default): flat addressable scalar rows. full: provenance, health diagnostics, the full registry record, and up to 20 unresolved or attention delivery receipts.summary
agent_idsNoReturn only these agent IDs
max_age_msNoMaximum acceptable snapshot age in milliseconds (0-5000); topology changes always invalidate the snapshot
parent_agent_idNoReturn direct children of this agent
blocked_on_promptNoReturn only agents whose registry records show a live prompt blocker

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
countNo
agentsNo
derived_atNo
retry_countYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_surfacesA
Read-onlyIdempotent

List workspace, pane, and surface topology. Condensed by default; verbose=true adds raw cmux fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoReturn 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.
workspaceNoFilter by workspace ref
preview_linesNoNumber of preview lines
include_screen_previewNoInclude screen content preview

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
surfacesNo
workspacesNo
retry_countYes
column_countNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_screenA
Read-onlyIdempotent

Read a terminal screen and parsed harness status. Use raw=true for full text or parsed_only=true for monitoring.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoIf true, include the full untrimmed terminal content (separators, status-bar art, all lines). Default false returns a compact de-chromed screen_preview instead.
linesNoNumber of lines to read
surfaceNoTarget surface ref
workspaceNoTarget workspace ref
scrollbackNoInclude scrollback buffer
surface_idNoAlias for `surface`, as emitted by list_agents/spawn_agent.
parsed_onlyNoIf true, return only parsed fields (omit screen content). Best for agent monitoring.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
parsedNo
surfaceNo
retry_countYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
blockerYesShort blocker pointer, capped at 500 characters; put detailed evidence in a report file

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
routeNo
durableNo
deliveryNo
error_codeNo
delivery_idNo
retry_countYes
child_agent_idNo
parent_agent_idNo
notified_agent_idNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoagent
textNoMax 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.
targetNo
surfaceNo
verboseNoReturn the full legacy success receipt, including transport and timing diagnostics. Failures always keep full detail.
agent_idNo
targetingNo
workspaceNo
allow_busyNoDeprecated no-op. Safety gates still refuse text at a picker/menu or permission prompt; use mode=key to drive those deliberately.
backgroundNo
chunk_sizeNo
press_enterNoPress enter after sending text
rename_to_taskNo
boot_prompt_pathNo
allow_long_inlineNoBypass 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_msNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
keyNo
modelNo
titleNo
typedNo
healthNo
screenNo
statusNo
commandNo
surfaceNo
acceptedNo
agent_idNo
deliveryNo
receiptsNo
terminalNo
deliveredNo
agent_typeNo
delivery_idNo
done_markerNo
report_pathNo
retry_countYes
rpc_methodsNo
duplicate_ofNo
contract_pathNo
delivery_stateNo
registry_stateNo
state_conflictNo
needs_attentionNo
submit_evidenceNo
submit_verifiedNo
attention_reasonNo
submit_attemptedNo
boot_prompt_bytesNo
submit_dispatchedNo
boot_prompt_receiptNo
boot_prompt_warningNo
boot_prompt_deliveredNo
coordination_footer_noteNo
coordination_footer_bytesNo
boot_prompt_submit_verifiedNo
coordination_footer_deliveredNo

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cliNoCLI tool to launch
cwdNoInitial working directory for type=terminal
repoNoRepository name (e.g. 'brainlayer', 'golems')
roleNoAgent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly.
typeNoSpawn an AI agent or a plain terminalagent
focusNoLeave focus on the created agent tab instead of restoring the exact origin after initialization.
forceNoWith 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.
modelNoOPTIONAL — 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.
titleNoThe 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).
effortNoRequired 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).
promptNoMax 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.
verboseNoReturn the full legacy spawn response instead of the lean default.
versionNoSpawnSpec schema version
worktreeNoWhen 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.
authorityNoAuthority axis, independent from job function and placement
force_newNoWhen true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane.
placementNoPhysical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted.
workspaceNoTarget workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace.
collab_pathNoLead coordination file; workers inherit their parent lead collab_path unless explicitly supplied.
mcp_profileNoMCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals.
report_pathNoOptional 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_escalationNoNotify 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_idNoID 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_idNoTHE 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_pathNoOptional 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_inlineNoBypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts.
max_cost_per_agentNoMaximum cost cap in USD for this agent
auto_archive_on_doneNoDeprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes.
boot_prompt_timeout_msNoOptional 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

ParametersJSON Schema
NameRequiredDescription
okYes
cwdNo
roleNo
typeNo
titleNo
versionNo
agent_idNo
surface_idNo
cwd_receiptNo
done_markerNo
next_actionNo
report_pathNo
retry_countYes
spawn_stateNo
workspace_idNo
contract_pathNo
delivered_charsNo
parent_agent_idNo
boot_prompt_bytesNo
boot_prompt_receiptNo
update_menu_skippedNo
boot_prompt_deliveredNo
update_menu_text_hashNo
coordination_footer_noteNo
coordination_footer_bytesNo
boot_prompt_submit_verifiedNo
coordination_footer_deliveredNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
paneNo
afterNo
focusNo
indexNo
titleNo
actionYes
beforeNo
surfaceYes
workspaceNo
preserve_prefixNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
paneNo
titleNo
actionNo
surfaceNo
workspaceNo
retry_countYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoAgent IDs to wait for together
mineNoWait for every direct child of the calling agent
watchNoDeclared WatchSpec alternative to agent_id/ids
agent_idNoSingle agent ID from spawn_agent
conditionNoAlias for target_state
timeout_msNoTimeout in milliseconds (default: 5 minutes)
delivery_idNoWait for a send_to delivery_id to reach a terminal outcome
done_markerNoFinal-line marker for report_path
report_pathNoWith 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_stateNoState to wait for

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
typedNo
watchNo
resultsNo
agent_idNo
deliveryNo
terminalNo
deliveredNo
timed_outNo
delivery_idNo
retry_countYes
rpc_methodsNo
duplicate_ofNo
delivery_stateNo
needs_attentionNo
submit_evidenceNo
submit_verifiedNo
attention_reasonNo
submit_attemptedNo
submit_dispatchedNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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. 1 tool updatev0.4.92
    • Changedspawn_agent4 fields changed
      • changedInput schema / properties / effort / description
        Previous 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)."
      • changedInput schema / properties / effort / enum
        Previous value: -[
        -  "low",
        -  "medium",
        -  "high",
        -  "xhigh",
        -  "max",
        -  "ultra"
        -]New value: +[
        +  "low",
        +  "medium",
        +  "high",
        +  "xhigh",
        +  "max",
        +  "ultra",
        +  ""
        +]
      • changedInput schema / properties / force / description
        Previous 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."
      • changedInput schema / properties / report_path / description
        Previous 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."
  2. 1 tool updatev0.4.89
    • Changedwait_for1 field changed
      • changedInput schema / properties / report_path / description
        Previous 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."
  3. 24 tool updatesv0.4.88
    • Removedbrowser_surface
    • Changedclose_surface5 fields changed
      • addedInput schema / properties / agent_id
        Added value: +{
        +  "description": "Managed agent ID",
        +  "type": "string"
        +}
      • addedInput schema / properties / force
        Added 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"
        +}
      • addedInput schema / properties / scope
        Added value: +{
        +  "default": "surface",
        +  "enum": [
        +    "surface",
        +    "agent",
        +    "workspace"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "surface"
        -]
      • changedOutput 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"
        +}
    • Addedcontrol_health
    • Removedget_agent_state
    • Removedinteract
    • Removedkill
    • Changedlist_agents7 fields changed
      • addedInput schema / properties / agent_ids
        Added value: +{
        +  "description": "Return only these agent IDs",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / blocked_on_prompt
        Added value: +{
        +  "description": "Return only agents whose registry records show a live prompt blocker",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / detail
        Added 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"
        +}
      • addedInput schema / properties / max_age_ms
        Added value: +{
        +  "description": "Maximum acceptable snapshot age in milliseconds (0-5000); topology changes always invalidate the snapshot",
        +  "maximum": 5000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / mine
        Added value: +{
        +  "default": false,
        +  "description": "Return direct children of the calling agent",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / parent_agent_id
        Added value: +{
        +  "description": "Return direct children of this agent",
        +  "type": "string"
        +}
      • changedOutput 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"
        +}
    • Changedlist_surfaces2 fields changed
      • addedInput schema / properties / verbose
        Added 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"
        +}
      • changedOutput 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"
        +}
    • Removednew_split
    • Removedread_agent_output
    • Changedread_screen5 fields changed
      • addedInput schema / properties / parsed_only
        Added value: +{
        +  "default": false,
        +  "description": "If true, return only parsed fields (omit screen content). Best for agent monitoring.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / raw
        Added 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"
        +}
      • addedInput schema / properties / surface_id
        Added value: +{
        +  "description": "Alias for `surface`, as emitted by list_agents/spawn_agent.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "surface"
        -]
      • changedOutput 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"
        +}
    • Removedrename_tab
    • Addedreport_to_parent
    • Removedsend_input
    • Removedsend_key
    • Addedsend_to
    • Removedsend_to_agent
    • Removedset_progress
    • Removedset_status
    • Changedspawn_agent29 fields changed
      • addedInput schema / properties / allow_long_inline
        Added 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"
        +}
      • addedInput schema / properties / authority
        Added value: +{
        +  "description": "Authority axis, independent from job function and placement",
        +  "enum": [
        +    "lead",
        +    "worker"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / auto_archive_on_done
        Added value: +{
        +  "default": false,
        +  "description": "Deprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / boot_prompt_path
        Added 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"
        +  ]
        +}
      • addedInput schema / properties / boot_prompt_timeout_ms
        Added 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"
        +}
      • addedInput schema / properties / collab_path
        Added value: +{
        +  "description": "Lead coordination file; workers inherit their parent lead collab_path unless explicitly supplied.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / cwd
        Added value: +{
        +  "description": "Initial working directory for type=terminal",
        +  "type": "string"
        +}
      • addedInput schema / properties / effort
        Added 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"
        +}
      • addedInput schema / properties / focus
        Added value: +{
        +  "default": false,
        +  "description": "Leave focus on the created agent tab instead of restoring the exact origin after initialization.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / force
        Added 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"
        +}
      • addedInput schema / properties / force_new
        Added 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"
        +}
      • addedInput schema / properties / halt_escalation
        Added 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"
        +}
      • addedInput schema / properties / max_cost_per_agent
        Added value: +{
        +  "description": "Maximum cost cap in USD for this agent",
        +  "type": "number"
        +}
      • addedInput schema / properties / mcp_profile
        Added 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."
        +}
      • changedInput schema / properties / model / description
        Previous 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."
      • addedInput schema / properties / parent_agent_id
        Added 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"
        +}
      • addedInput schema / properties / placement
        Added 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"
        +}
      • changedInput schema / properties / prompt / description
        Previous 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."
      • addedInput schema / properties / report_path
        Added 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"
        +}
      • addedInput schema / properties / resume_agent_id
        Added 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"
        +}
      • addedInput schema / properties / role
        Added 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"
        +}
      • addedInput schema / properties / title
        Added 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"
        +}
      • addedInput schema / properties / type
        Added value: +{
        +  "default": "agent",
        +  "description": "Spawn an AI agent or a plain terminal",
        +  "enum": [
        +    "agent",
        +    "terminal"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / verbose
        Added value: +{
        +  "default": false,
        +  "description": "Return the full legacy spawn response instead of the lean default.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / version
        Added value: +{
        +  "const": 1,
        +  "default": 1,
        +  "description": "SpawnSpec schema version",
        +  "type": "number"
        +}
      • changedInput schema / properties / workspace / description
        Previous 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."
      • addedInput schema / properties / worktree
        Added 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."
        +}
      • removedInput schema / required
        Removed value: -[
        -  "repo",
        -  "model",
        -  "cli",
        -  "prompt"
        -]
      • changedOutput 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"
        +}
    • Removedstop_agent
    • Addedupdate_surface
    • Changedwait_for10 fields changed
      • changedInput schema / properties / agent_id / description
        Previous value: -"Agent ID from spawn_agent"New value: +"Single agent ID from spawn_agent"
      • addedInput schema / properties / condition
        Added value: +{
        +  "description": "Alias for target_state",
        +  "enum": [
        +    "ready",
        +    "working",
        +    "idle",
        +    "done",
        +    "error"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / delivery_id
        Added value: +{
        +  "description": "Wait for a send_to delivery_id to reach a terminal outcome",
        +  "type": "string"
        +}
      • addedInput schema / properties / done_marker
        Added value: +{
        +  "description": "Final-line marker for report_path",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / ids
        Added value: +{
        +  "description": "Agent IDs to wait for together",
        +  "items": {
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / mine
        Added value: +{
        +  "default": false,
        +  "description": "Wait for every direct child of the calling agent",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / report_path
        Added 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"
        +}
      • addedInput schema / properties / watch
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "agent_id",
        -  "target_state"
        -]
      • changedOutput 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"
        +}
    • Removedwait_for_all
  4. 20 tool updatesv0.1.0
    • First observedbrowser_surface
    • First observedclose_surface
    • First observedget_agent_state
    • First observedinteract
    • First observedkill
    • First observedlist_agents
    • First observedlist_surfaces
    • First observednew_split
    • First observedread_agent_output
    • First observedread_screen
    • First observedrename_tab
    • First observedsend_input
    • First observedsend_key
    • First observedsend_to_agent
    • First observedset_progress
    • First observedset_status
    • First observedspawn_agent
    • First observedstop_agent
    • First observedwait_for
    • First observedwait_for_all

TDQS

A3.8/5.0

Scored across 10 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Terminal 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 npm
    25
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP 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.
    47
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    A 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.
    71
    13 PyPI
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP 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.
    39
    13 npm
    MIT