Skip to main content
Glama

cmuxLayer

你的 AI 代理无法看到彼此的终端。 一个在标签页 1 运行,另一个在标签页 2 运行——而你就是它们之间的剪贴板。cmuxLayer 解决了这个问题:它提供了 26 个 MCP 工具,让 AI 代理能够以编程方式控制终端工作区。

install License MCP Tools Tests

快速入门

npm install -g cmuxlayer

需要运行 cmux。

添加到你的 MCP 配置中:

Codex CLI / T3 Code

T3 Code 从 ~/.codex/config.toml(或 $CODEX_HOME/config.toml)处的 Codex CLI 配置文件继承 MCP 服务器。

[mcp_servers.cmux]
command = "cmuxlayer"

Claude Code, Cursor, VS Code, Claude Desktop

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

配置位置: Codex CLI / T3 Code ~/.codex/config.toml(或 $CODEX_HOME/config.toml) | Claude Code .mcp.json 或 claude mcp add cmuxlayer -s user -- cmuxlayer | Cursor .cursor/mcp.json | VS Code .vscode/mcp.json | Claude Desktop — 请参阅 MCP 文档 获取特定平台的路径

Related MCP server: hyperpanes-mcp

你可以做什么

告诉你的 AI 代理执行如下操作:

  • “向右拆分一个窗格并在那里运行我的测试套件”

  • “在新的窗格中生成一个 Claude Code 代理来重构 auth.ts”

  • “读取 surface:2 的屏幕并告诉我构建是否通过”

  • “等待所有代理完成,然后读取它们的输出”

  • “设置侧边栏状态以显示我们的部署进度”

在底层,cmuxLayer 提供了 26 个用于终端控制、屏幕读取、布局管理和多代理编排的 MCP 工具。read_screen 可以解析 Claude Code、Codex、Gemini 和 Cursor 的代理元数据(状态、模型、令牌、上下文百分比)。

MCP 工具 (26)

所有工具都附带 ToolAnnotations,用于自动执行安全策略。

终端控制 — new_split new_surface move_surface reorder_surface send_input send_key read_screen rename_tab close_surface browser_surface

代理生命周期 — spawn_agent send_to send_to_agent wait_for wait_for_all interact stop_agent kill

工作区 — list_surfaces list_agents my_agents get_agent_state read_agent_output notify set_status set_progress

只读 (6)

工具

功能

list_surfaces

列出所有工作区中的所有界面

read_screen

读取带有已解析代理状态的终端输出

get_agent_state

获取被跟踪代理的完整状态

list_agents

列出所有代理(可选过滤器)

my_agents

父代理的子代理,带有实时屏幕状态

read_agent_output

分隔符标记之间的结构化输出

可变 (17)

工具

功能

new_split

创建终端或浏览器拆分窗格

new_surface

在现有窗格中创建标签页

move_surface

将界面移动到另一个窗格或位置

reorder_surface

重新排列窗格内的标签页

send_input

向界面发送文本

send_key

发送按键(回车、转义、ctrl-c 等)

rename_tab

重命名界面标签页

notify

显示 cmux 通知横幅

set_status

设置侧边栏状态键值对

set_progress

设置进度指示器 (0.0-1.0)

browser_surface

与浏览器界面交互

spawn_agent

在新窗格中生成 CLI 代理

send_to

向被跟踪的代理发送文本,无需知道其界面

send_to_agent

向正在运行的代理发送提示

wait_for

阻塞直到代理达到目标状态(默认为 done)

wait_for_all

阻塞直到多个代理完成

interact

发送交互式输入(确认、取消、恢复)

破坏性 (3)

工具

功能

close_surface

关闭终端或浏览器窗格

stop_agent

优雅地停止代理

kill

强制终止代理进程

支持的代理

CLI

命令

自动检测

Claude Code

claude

状态、模型、令牌、上下文 %

Codex

codex

状态、模型、上下文 %

Gemini CLI

gemini

状态、模型、令牌、上下文 %

Cursor

cursor agent

状态、模型、令牌、上下文 %

read_screen 会自动检测代理类型并从终端输出中解析元数据。

架构

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

套接字客户端通过 Unix 套接字连接到 cmux。断开连接时自动重连,如果套接字不可用,则回退到 CLI 子进程。

连接

延迟

加速

CLI 子进程

~142ms

基准

Unix 套接字

~0.1ms

1,423倍

故障排除

cmux 未运行 cmuxLayer 需要一个正在运行的 cmux 实例。请先安装它,然后在运行 cmuxLayer 之前启动一个 cmux 会话。

工具未出现在 Codex CLI 或 T3 Code 中 将 cmuxlayer 添加到 ~/.codex/config.toml 后重启客户端。如果你使用自定义的 Codex 主目录,请验证 $CODEX_HOME/config.toml 是否包含相同的 mcp_servers.cmux 条目。

工具未出现在 Claude Code 中 添加 MCP 配置后重启 Claude Code。运行 claude mcp list 以验证 cmuxlayer 是否已连接。

套接字连接失败 cmuxLayer 会自动发现 cmux 套接字(macOS: ~/Library/Application Support/cmux/cmux.sock)。如果需要,可以使用 CMUX_SOCKET_PATH 进行覆盖。

测试

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

开发

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

贡献

请参阅 CONTRIBUTING.md 获取开发设置和 PR 指南。

许可证

Apache 2.0 — 请参阅 LICENSE。


Golems AI 代理生态系统的一部分。cmuxlayer.etanheyman.com | 由 @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