cmuxlayer
cmuxLayer
AIエージェント同士は、お互いのターミナルを見ることができません。 1つはタブ1で、もう1つはタブ2で実行され、あなたはそれらの間のクリップボード役を担うことになります。cmuxLayerはこれを解決します。AIエージェントにターミナルワークスペースのプログラム制御権を与える26個のMCPツールを提供します。
クイックスタート
npm install -g cmuxlayercmuxが実行されている必要があります。
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 docs を参照してください
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)
ツール | 説明 |
| ワークスペース全体のすべてのサーフェスを一覧表示 |
| 解析されたエージェントステータスを含むターミナル出力を読み取る |
| 追跡対象エージェントの完全な状態 |
| オプションのフィルター付きですべてのエージェントを一覧表示 |
| ライブ画面ステータスを持つ親エージェントの子エージェント |
| 区切りマーカー間の構造化された出力 |
ミューテーション (17)
ツール | 説明 |
| ターミナルまたはブラウザの分割ペインを作成 |
| 既存のペインにタブを作成 |
| サーフェスを別のペインや位置に移動 |
| ペイン内のタブを並べ替える |
| サーフェスにテキストを送信 |
| キー入力を送信 (return, escape, ctrl-cなど) |
| サーフェスタブの名前を変更 |
| cmux通知バナーを表示 |
| サイドバーのステータスキーと値を設定 |
| 進捗インジケーターを設定 (0.0-1.0) |
| ブラウザサーフェスと対話 |
| 新しいペインでCLIエージェントを起動 |
| サーフェスを知らなくても追跡対象エージェントにテキストを送信 |
| 実行中のエージェントにプロンプトを送信 |
| エージェントがターゲット状態(デフォルトは |
| 複数のエージェントが終了するまで待機 |
| 対話型入力を送信 (確認、キャンセル、再開) |
破壊的 (3)
ツール | 説明 |
| ターミナルまたはブラウザのペインを閉じる |
| エージェントを正常に停止 |
| エージェントプロセスを強制終了 |
サポートされているエージェント
CLI | コマンド | 自動検出 |
Claude Code |
| ステータス, モデル, トークン, コンテキスト % |
Codex |
| ステータス, モデル, コンテキスト % |
Gemini CLI |
| ステータス, モデル, トークン, コンテキスト % |
Cursor |
| ステータス, モデル, トークン, コンテキスト % |
|
アーキテクチャ
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にツールが表示されません
~/.codex/config.tomlにcmuxlayerを追加した後、クライアントを再起動してください。カスタムの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貢献
開発環境のセットアップとPRガイドラインについてはCONTRIBUTING.mdを参照してください。
ライセンス
Apache 2.0 — LICENSEを参照してください。
Golems AIエージェントエコシステムの一部です。cmuxlayer.etanheyman.com | @EtanHeyによって構築されました。
Available Tools
10 toolsclose_surfaceADestructive
Close one surface, managed agent, or workspace with live-agent guards. scope="agent" stops the agent AND closes its pane, and reports the two halves separately (agent_stopped, surface_closed) so a pane that survives is never reported as closed. The pane close obeys the same live-agent guard as scope="surface": without force:true a still-live agent keeps its pane, and the receipt says so.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Close even when the backing agent is still live (not done/error). This never bypasses stable surface identity checks. Without force, a live agent's surface is protected and the response returns the current pane contents instead of closing. | |
| scope | No | surface | |
| surface | No | Target surface ref | |
| agent_id | No | Managed agent ID | |
| workspace | No | Target workspace ref |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| pane | No | |
| force | No | |
| scope | No | |
| state | No | |
| agents | No | |
| refused | No | |
| removed | No | |
| surface | No | |
| agent_id | No | |
| surfaces | No | |
| workspace | No | |
| live_agents | No | |
| retry_count | Yes | |
| collapse_pane | No | |
| caller_workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey destructiveness, and the description adds meaningful context: scope='agent' stops the agent, closes its pane, reports the two results separately, and the pane close is guarded exactly like scope='surface'. It does not, however, disclose what closing a workspace does to contained surfaces or agents, which is a notable gap for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core purpose is front-loaded, and each subsequent sentence adds a distinct behavioral edge case or guard rule that an agent needs to invoke the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Surface and agent scopes are well covered, including guard behavior and partial-failure reporting, and the output schema covers return shape. The workspace scope is only named without explaining whether closing cascades to contained surfaces/agents or how the live-agent guard applies, which is important for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so most parameters are already documented. The description adds real value by explaining the otherwise-undocumented scope enum, the force/guard interaction, and the split agent_stopped/surface_closed reporting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb ('Close') and explicit object types ('surface, managed agent, or workspace') plus the operative guard. This is unambiguous and easily distinguished from sibling tools like list_surfaces, update_surface, and spawn_agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear conditional usage for scope='agent' versus scope='surface' and explains when force:true is or isn't needed. It does not explicitly name alternatives or say 'use this instead of X', but no sibling performs closing, so the intended use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_healthARead-onlyIdempotent
Report terse control-path health by default; pass detail=full for diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | terse |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| health | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds the mode distinction (terse vs full) but doesn't elaborate on exact behavior or response shape; output schema accounts for that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with zero wasted words; default behavior is front-loaded, alternative follows.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional param, output schema present, and annotations covering safety, the description is adequately complete. No missing prerequisites or side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so the description must compensate. It explains that detail=full is for diagnostics, which gives semantic meaning to the enum value, but doesn't explain what 'terse' vs 'full' includes. Still, for a single parameter, it partially fills the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and resource ('control-path health'), with explicit default and alternative modes. Distinct from siblings that handle waiting, surfaces, agents, and messaging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for using the default terse mode and when to request full diagnostics. Doesn't name alternative tools, but the context is specific enough that an agent can infer when a health check is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agentsA
List live-derived agents, including registry-persisted prompt blockage and pause state; filter to blocked agents or children with mine/parent_agent_id. Default summary returns flat addressable scalars and hides close tombstones and failed spawns whose surfaces are absent; request a terminal state or detail=full to include them. Full detail also includes provenance, health diagnostics, the registry record, and up to 20 unresolved or attention delivery receipts.
| Name | Required | Description | Default |
|---|---|---|---|
| mine | No | Return direct children of the calling agent | |
| repo | No | Filter by repository | |
| model | No | Filter by model | |
| state | No | Filter by state | |
| detail | No | summary (default): flat addressable scalar rows. full: provenance, health diagnostics, the full registry record, and up to 20 unresolved or attention delivery receipts. | summary |
| agent_ids | No | Return only these agent IDs | |
| max_age_ms | No | Maximum acceptable snapshot age in milliseconds (0-5000); topology changes always invalidate the snapshot | |
| parent_agent_id | No | Return direct children of this agent | |
| blocked_on_prompt | No | Return only agents whose registry records show a live prompt blocker |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| count | No | |
| agents | No | |
| derived_at | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important non-obvious behavior beyond the annotations: default summary hides close tombstones and failed spawns, and full detail adds provenance, health diagnostics, the registry record, and up to 20 receipts. Annotations are all false and provide no safety profile, so this carries most of the burden; side effects and auth are not mentioned, but nothing indicates they are needed for this list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three dense, front-loaded sentences, each earning its place: what is listed, how filtering works, and what full detail includes. There is no filler or redundant restatement of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 optional parameters and an output schema, the description covers the non-obvious semantics—live-derived state, hidden tombstones/failed spawns, detail levels, and receipt counts—while the schema covers parameter mechanics. The definition is complete enough for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter; the description adds value by connecting mine/parent_agent_id to child filtering, blocked_on_prompt to live prompt blockers, and by explaining how state/detail interact with hidden items. This goes beyond simple schema repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb and resource: 'List live-derived agents' and immediately adds distinguishing scope such as registry-persisted prompt blockage, pause state, and child/blocked filtering. This makes it clearly distinct from sibling tools like list_surfaces or spawn_agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear retrieval guidance: default summary hides tombstones and failed spawns, while requesting a terminal state or detail=full includes them. It does not explicitly name alternative tools or state when not to use this tool, but the context for correct invocation is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_surfacesARead-onlyIdempotent
List workspace, pane, and surface topology. Condensed by default; verbose=true adds raw cmux fields.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Return all raw cmux fields instead of the condensed default. This materially increases token usage and is rarely needed; use it only when a specific raw field is required. | |
| workspace | No | Filter by workspace ref | |
| preview_lines | No | Number of preview lines | |
| include_screen_preview | No | Include screen content preview |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| surfaces | No | |
| workspaces | No | |
| retry_count | Yes | |
| column_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral context by noting the condensed default and that verbose=true adds raw cmux fields, which is meaningful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and no filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only topology listing tool with a complete input schema, rich annotations, and an output schema, the description is nearly sufficient. It could be improved by explicitly routing the agent to this tool versus its siblings, but nothing critical is missing for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the verbose behavior but does not add substantial meaning beyond what the schema already provides for the other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('workspace, pane, and surface topology'). This distinguishes it from siblings like list_agents, read_screen, and the surface mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for inspecting surface topology but does not explicitly state when to choose it over alternatives like read_screen or list_agents. It does give useful guidance on the verbose flag, but not on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_screenARead-onlyIdempotent
Read a terminal screen and parsed harness status. Use raw=true for full text or parsed_only=true for monitoring.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | If true, include the full untrimmed terminal content (separators, status-bar art, all lines). Default false returns a compact de-chromed screen_preview instead. | |
| lines | No | Number of lines to read | |
| surface | No | Target surface ref | |
| workspace | No | Target workspace ref | |
| scrollback | No | Include scrollback buffer | |
| surface_id | No | Alias for `surface`, as emitted by list_agents/spawn_agent. | |
| parsed_only | No | If true, return only parsed fields (omit screen content). Best for agent monitoring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| parsed | No | |
| surface | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the tool returns two kinds of content (terminal text and parsed harness status), and the mode selects which one the caller gets, which matters for how an agent consumes the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler. The purpose is front-loaded first, followed immediately by the only mode-selection guidance an agent needs. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with full schema coverage on all 7 parameters, an output schema, and safety annotations covering the behavioral risk, the description is nearly complete. The only minor gap is that it does not describe the shape of the 'parsed harness status' fields, but the output schema presumably covers that, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all 7 parameters. The description's mention of raw=true and parsed_only=true merely restates the schema's own detailed explanations ('full untrimmed terminal content' vs 'return only parsed fields') without adding new semantic value, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Read a terminal screen and parsed harness status'), and the dual-output mention (raw text vs parsed status) distinguishes it from sibling reads like list_surfaces or list_agents. It is clear, though it does not explicitly name any sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Use raw=true for full text or parsed_only=true for monitoring' gives explicit context for choosing between the two output modes. However, it provides no when-not-to-use guidance or comparison against sibling tools such as wait_for or list_agents, leaving tool-selection mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_to_parentA
Raise a short blocker to this managed agent's registry parent. cmuxlayer chooses the parent; callers cannot address arbitrary agents. The blocker is durably appended to the parent's inbox and its pointer is actively delivered. If that wake fails, cmuxlayer alerts the nearest reachable ancestor and returns fallback provenance. A root agent has no parent and receives an error. Workers with collab_path must append there to reach their own parent lead; this tool refuses that upward route.
| Name | Required | Description | Default |
|---|---|---|---|
| blocker | Yes | Short blocker pointer, capped at 500 characters; put detailed evidence in a report file |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| route | No | |
| durable | No | |
| delivery | No | |
| error_code | No | |
| delivery_id | No | |
| retry_count | Yes | |
| child_agent_id | No | |
| parent_agent_id | No | |
| notified_agent_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish non-read-only and non-destructive behavior, and the description adds durable append to the parent's inbox, active delivery of the pointer, fallback alert to the nearest reachable ancestor with fallback provenance, and refusal for collab_path workers. These behavioral details go well beyond the schema and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense paragraph, but every sentence carries distinct information—purpose, parent selection, persistence, fallback, root edge case, and collab_path exclusion. It is front-loaded with the action and then details constraints in a logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter fully documented in the schema, an output schema present, and annotations covering safety, the description supplies the behavioral details needed to call the tool correctly, including fallback behavior and error cases. No critical operational information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description reinforces that the blocker is a short pointer and adds delivery semantics ('durably appended', 'actively delivered'). This adds meaningful context beyond the schema's own description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Raise a short blocker to this managed agent's registry parent.' It also clarifies scope by saying cmuxlayer chooses the parent and callers cannot address arbitrary agents, which distinguishes it from arbitrary messaging siblings like send_to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context: root agents receive an error, and workers with collab_path must append there to reach their parent lead because 'this tool refuses that upward route.' It clearly implies this is for parent-directed blockers, but it does not explicitly name alternatives such as send_to, so some routing inference remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_toA
Send text or a key through the shared delivery engine. Never send a Return yourself for a message; send_to submits messages. Key-Return is for pickers, menus, and permission prompts. Every receipt includes caller_agent_id (null when unknown). Workers with collab_path cannot address their own parent or ancestor leads in any mode; append to that collab file instead. Unknown callers remain allowed. Lead-originated and engine-internal pushes remain allowed. Targets may be one agent, structured agent targeting, or a raw surface in surface/command/key mode. A clean verified success returns up to six mode-specific core fields by default: text/command mode returns ok, retry_count, target identity, delivery_state, submitted, and delivery_id when available; key mode returns ok, retry_count, surface, key, submit_verified, and submit_verification_reason. A degraded transport, queued-behind-turn landing, or deduplicated send adds its warning or status field. Pass verbose=true for the full legacy receipt; non-success keeps full diagnostics automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | agent | |
| text | No | Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Text to send. Capped at 500 inline UTF-8 bytes by default. | |
| target | No | ||
| surface | No | ||
| verbose | No | Return the full legacy success receipt, including transport and timing diagnostics. Failures always keep full detail. | |
| agent_id | No | ||
| targeting | No | ||
| workspace | No | ||
| allow_busy | No | Deprecated no-op. Safety gates still refuse text at a picker/menu or permission prompt; use mode=key to drive those deliberately. | |
| background | No | ||
| chunk_size | No | ||
| press_enter | No | Press enter after sending text | |
| rename_to_task | No | ||
| boot_prompt_path | No | ||
| allow_long_inline | No | Bypass the inline length and multi-paragraph safety guards for a deliberate raw send. Large allowed sends keep the existing chunked delivery behavior. | |
| boot_prompt_timeout_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| key | No | |
| model | No | |
| title | No | |
| typed | No | |
| health | No | |
| screen | No | |
| status | No | |
| command | No | |
| surface | No | |
| accepted | No | |
| agent_id | No | |
| delivery | No | |
| receipts | No | |
| terminal | No | |
| delivered | No | |
| agent_type | No | |
| delivery_id | No | |
| done_marker | No | |
| report_path | No | |
| retry_count | Yes | |
| rpc_methods | No | |
| duplicate_of | No | |
| contract_path | No | |
| delivery_state | No | |
| registry_state | No | |
| state_conflict | No | |
| needs_attention | No | |
| submit_evidence | No | |
| submit_verified | No | |
| attention_reason | No | |
| submit_attempted | No | |
| boot_prompt_bytes | No | |
| submit_dispatched | No | |
| boot_prompt_receipt | No | |
| boot_prompt_warning | No | |
| boot_prompt_delivered | No | |
| coordination_footer_note | No | |
| coordination_footer_bytes | No | |
| boot_prompt_submit_verified | No | |
| coordination_footer_delivered | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses detailed behavior beyond annotations: it explains what a 'clean verified success' returns, how degraded transport or deduplication adds fields, and that verbose=true yields the full legacy receipt. It also notes that non-success automatically keeps full diagnostics. The annotations (readOnlyHint=false, destructiveHint=false) are not contradicted; the description adds rich behavioral context about receipts and edge cases without conflicting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the description is long, it is dense with necessary information and front-loads the primary purpose and key usage rules. Each sentence contributes value: safety constraints, mode behavior, receipt structure, and edge-case exclusions. There is no fluff or tautology; the length is justified by the tool's complexity and 16 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 16 parameters, nested objects, and multiple modes, this description is remarkably complete. It covers target types, mode-specific return fields, failure behavior, the verbose flag, and the collab_path restriction. It also mentions unknown callers and allowed push sources. Nothing critical an agent needs to call this correctly appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at only 31%, the description compensates significantly. It clarifies the 'target' parameter by stating targets may be 'one agent, structured agent targeting, or a raw surface in surface/command/key mode,' and explains mode-specific receipts (text/command vs key). It also interprets the 'verbose' parameter by describing the full legacy receipt. This adds substantial meaning to otherwise undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource: 'Send text or a key through the shared delivery engine.' It immediately establishes the tool's core function and distinguishes it from alternatives by explicitly stating that send_to submits messages rather than the agent sending Return itself, which clarifies its unique role among siblings like wait_for or read_screen.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: 'Never send a Return yourself for a message; send_to submits messages. Key-Return is for pickers, menus, and permission prompts.' It also gives a concrete alternative for workers with collab_path: 'append to that collab file instead.' These are direct, actionable routing instructions that leave no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_agentA
Spawn a managed agent or terminal, or resume a captured agent on a fresh surface while preserving its ID. Placement is deterministic; boot_prompt_timeout_ms also bounds pane placement. Boot prompts return evidence-backed receipts. Successful receipts are lean by default; verbose=true restores full transport and diagnostic detail. Failures always keep full detail.
| Name | Required | Description | Default |
|---|---|---|---|
| cli | No | CLI tool to launch | |
| cwd | No | Initial working directory for type=terminal | |
| repo | No | Repository name (e.g. 'brainlayer', 'golems') | |
| role | No | Agent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly. | |
| type | No | Spawn an AI agent or a plain terminal | agent |
| focus | No | Leave focus on the created agent tab instead of restoring the exact origin after initialization. | |
| force | No | With resume_agent_id only: override missing or inconclusive proof that the old session is not running (no recorded pid, an unproven pid, an unreadable topology or process table) after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements. | |
| model | No | OPTIONAL — leave UNSET so the launcher pins the top-tier model. For cli:'codex', an explicit model is checked against Codex's runtime model list before any worktree or surface is created, then passed through to the launcher. Never pass 'opus' for claude — the top Claude model is already the default. | |
| title | No | The caller-supplied agent pane title is applied verbatim (for example `cmuxlayer-WORKER · run1 name-the-tabs`); when omitted or blank, the existing agent-id/surface fallback is retained. Managed identity comes from the agent registry, not this display title (#479/#492). | |
| effort | No | Required for codex new agent spawns: low, medium, high, xhigh, max, ultra. Choose deliberately: medium for well-specified lanes, high for security/open-ended; xhigh and above cost more. Omit on resume (the session keeps its effort) and for other CLIs (effort is invalid). | |
| prompt | No | Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Inline task prompt to send after the agent is ready. Capped at 500 inline UTF-8 bytes by default; use boot_prompt_path for larger prompts. Mutually exclusive with boot_prompt_path. | |
| verbose | No | Return the full legacy spawn response instead of the lean default. | |
| version | No | SpawnSpec schema version | |
| worktree | No | When set, create or reuse a git worktree before launch. Pass a string such as "tool-usage" as the worktree name, true for a generated name, or an object with name, path, branch, base, create, and reuse. When repoGolem registers the repo with an absolute path, that path is the repo root; otherwise the root is resolved from CMUXLAYER_REPO_HOME, the running checkout, or ~/Gits. true uses <registered-root>/.worktrees/<generated-name> (legacy ~/Gits/<repo>.wt read-fallback until ~2026-09). If a later spawn step fails before a recoverable surface exists, a newly created worktree and branch are rolled back. | |
| authority | No | Authority axis, independent from job function and placement | |
| force_new | No | When true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane. | |
| placement | No | Physical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted. | |
| workspace | No | Target workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace. | |
| collab_path | No | Lead coordination file; workers inherit their parent lead collab_path unless explicitly supplied. | |
| mcp_profile | No | MCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals. | |
| report_path | No | Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified. Inspect the pane, then relay with send_to({agent_id, text:"Read and follow <contract_path>", press_enter:true}); do not use raw cmux send/send-key. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker. | |
| halt_escalation | No | Notify the nearest live ancestor when this agent remains awaiting input, idle without done evidence, or wedged past its dwell threshold. Set false for deliberate debugging lanes. | |
| parent_agent_id | No | ID of the parent agent for hierarchical spawning. Normally inferred from the managed caller surface; pass explicitly only when no managed caller supplies the hierarchy. Parent must exist. | |
| resume_agent_id | No | THE way to revive an agent: resume this captured session on a fresh surface, keeping its public agent ID and re-issuing its coordination contract. cmuxlayer never revives a pane by itself (#492) -- a pane you close stays closed -- so a lead that wants an agent back asks here, by id. Refused with a reason when the session transcript is not on disk, rather than opening an empty pane. Mutually exclusive with new-spawn fields. | |
| boot_prompt_path | No | Optional readable prompt-file path. Checked before spawning; multiline or over-cap files are submitted as one `Read and follow <path>` pointer and one final return after readiness. Mutually exclusive with prompt. | |
| allow_long_inline | No | Bypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts. | |
| max_cost_per_agent | No | Maximum cost cap in USD for this agent | |
| auto_archive_on_done | No | Deprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes. | |
| boot_prompt_timeout_ms | No | Optional timeout override in milliseconds for pane placement, initial shell readiness, agent launch readiness, and the boot prompt. When omitted, each phase keeps its established default (45s placement, 10s shell, 15s launch, 60s boot prompt). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| cwd | No | |
| role | No | |
| type | No | |
| title | No | |
| version | No | |
| agent_id | No | |
| surface_id | No | |
| cwd_receipt | No | |
| done_marker | No | |
| next_action | No | |
| report_path | No | |
| retry_count | Yes | |
| spawn_state | No | |
| workspace_id | No | |
| contract_path | No | |
| delivered_chars | No | |
| parent_agent_id | No | |
| boot_prompt_bytes | No | |
| boot_prompt_receipt | No | |
| update_menu_skipped | No | |
| boot_prompt_delivered | No | |
| update_menu_text_hash | No | |
| coordination_footer_note | No | |
| coordination_footer_bytes | No | |
| boot_prompt_submit_verified | No | |
| coordination_footer_delivered | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-read-only, non-destructive mutation. The description adds real value beyond them: deterministic placement, the timeout bounding placement, 'evidence-backed receipts', lean-by-default successful output with verbose=true restoring detail, and failures always retaining full detail. This is genuine return/behavior disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the core capability and then behavioral/return traits. Every sentence contributes, though the receipt/verbose sentences are terse and pack multiple ideas.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 29-param spawn tool with an output schema and fully documented parameters, the description supplies the behavioral layer (placement determinism, receipt lean/verbose behavior) the annotations and schema don't. It is largely sufficient, with only minor usage-routing gaps left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 29 parameters richly. The description only gestures at boot_prompt_timeout_ms and verbose, adding little beyond what the schema already states; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resources: 'Spawn a managed agent or terminal, or resume a captured agent on a fresh surface while preserving its ID.' This clearly distinguishes it from siblings like list_agents, send_to, and close_surface, which are about inspecting/messaging/terminating rather than creating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies two modes (new spawn vs resume) but gives no explicit when-to-use/when-not guidance or naming of alternatives beyond the resume clause. The heavier routing guidance (resume_agent_id as 'THE way to revive', mutual exclusions) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_surfaceC
Move or rename one terminal surface.
| Name | Required | Description | Default |
|---|---|---|---|
| pane | No | ||
| after | No | ||
| focus | No | ||
| index | No | ||
| title | No | ||
| action | Yes | ||
| before | No | ||
| surface | Yes | ||
| workspace | No | ||
| preserve_prefix | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| pane | No | |
| title | No | |
| action | No | |
| surface | No | |
| workspace | No | |
| retry_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only names the operations without disclosing side effects, reversibility, focus behavior, or interaction with other surfaces. Annotations are all false and provide no positive info, so the description carries the burden but fails to add behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, direct sentence with no fluff, front-loaded and easy to parse. However, brevity comes at the cost of essential information, which is captured in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, 0% schema description coverage, and only a vague operation summary, the description is drastically under-sized. The output schema does not compensate for missing input semantics, leaving the agent with insufficient context to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not mention any of the 10 parameters. The agent receives no explanation of 'surface', 'action', 'before', 'after', 'index', 'preserve_prefix', etc., making correct parameter construction impossible.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: move or rename one terminal surface. Clearly distinguishes from siblings like close_surface (close) and list_surfaces (list), so an agent can tell them apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use move versus rename, or when this tool should be preferred over close_surface, send_to, or possibly wait_for. No exclusions or alternative routing is mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forA
Block until one agent_id or every agent in ids reaches a target registry state and return health. Defaults to waiting for completion (done).
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Agent IDs to wait for together | |
| mine | No | Wait for every direct child of the calling agent | |
| watch | No | Declared WatchSpec alternative to agent_id/ids | |
| agent_id | No | Single agent ID from spawn_agent | |
| condition | No | Alias for target_state | |
| timeout_ms | No | Timeout in milliseconds (default: 5 minutes) | |
| delivery_id | No | Wait for a send_to delivery_id to reach a terminal outcome | |
| done_marker | No | Final-line marker for report_path | |
| report_path | No | With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must be a regular file (max 1 MiB) under ~/.cmux/agents/<agent_id>/ or ~/.cmux/live-harness/, else refused. An agent in error never matches. | |
| target_state | No | State to wait for |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| typed | No | |
| watch | No | |
| results | No | |
| agent_id | No | |
| delivery | No | |
| terminal | No | |
| delivered | No | |
| timed_out | No | |
| delivery_id | No | |
| retry_count | Yes | |
| rpc_methods | No | |
| duplicate_of | No | |
| delivery_state | No | |
| needs_attention | No | |
| submit_evidence | No | |
| submit_verified | No | |
| attention_reason | No | |
| submit_attempted | No | |
| submit_dispatched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, closed-world, which is an unusual profile for a wait tool and the description doesn't reconcile it. The description does add real behavioral value by disclosing that the call blocks and defaults to waiting for `done`, plus that it returns health. However, the timeout default, the refusal conditions for `report_path`, and the exclusive watch alternatives are only in the schema, so the description adds modest context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core blocking semantics and the default condition front-loaded. Nothing is repeated and nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description correctly says it returns health, so return values need no further explanation. The description covers the primary single-agent and multi-agent wait paths that constitute the tool's main use, and it does so without re-documenting parameters that the schema already fully specifies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the `agent_id`/`ids` targeting and the `done` default for the target state, which is redundant with the schema. It adds no meaning for the other eight parameters, including the nested `watch` object and the `condition`/`target_state` alias relationship.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it blocks until an agent (single `agent_id` or a set in `ids`) reaches a target registry state, then returns health. That clearly separates it from read-only siblings like `list_agents` or `read_screen`, which observe without blocking. It stops short of 5 because the tool's other major wait modes (watch specs, `delivery_id`, file-backed done) are invisible at this level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance or named alternative; the agent must infer that this is the blocking counterpart to polling `read_screen`/`control_health`. The only steer is the default-state note (`done`), which is a parameter default rather than usage routing. No prerequisites, no mention of when not to block.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.4.92- Changed
spawn_agent4 fields changed- changed
Input schema / properties / effort / descriptionPrevious value: -"Codex reasoning effort, passed to the repoGolem launcher. CHOOSE THIS DELIBERATELY PER MISSION — it is a cost decision, not a default to inherit. The installed launcher currently accepts: low, medium, high, xhigh, max, ultra. spawn_agent rejects other values before creating a worktree or surface. The live launcher defaults to HIGH when omitted (~/.config/ralphtools/golem-dispatch.zsh). Per /agent-routing, MEDIUM is the settled floor for well-specified implementation lanes — use it unless the task genuinely needs more; xhigh and above burn budget fast and are rarely warranted for a lane with a clear brief."New value: +"Required for codex new agent spawns: low, medium, high, xhigh, max, ultra. Choose deliberately: medium for well-specified lanes, high for security/open-ended; xhigh and above cost more. Omit on resume (the session keeps its effort) and for other CLIs (effort is invalid)." - changed
Input schema / properties / effort / enumPrevious value: -[ - "low", - "medium", - "high", - "xhigh", - "max", - "ultra" -]New value: +[ + "low", + "medium", + "high", + "xhigh", + "max", + "ultra", + "" +] - changed
Input schema / properties / force / descriptionPrevious value: -"With resume_agent_id only: override inconclusive recorded-process liveness after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements."New value: +"With resume_agent_id only: override missing or inconclusive proof that the old session is not running (no recorded pid, an unproven pid, an unreadable topology or process table) after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements." - changed
Input schema / properties / report_path / descriptionPrevious value: -"Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified, so YOU must relay contract_path, report_path, and done_marker. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker."New value: +"Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified. Inspect the pane, then relay with send_to({agent_id, text:\"Read and follow <contract_path>\", press_enter:true}); do not use raw cmux send/send-key. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker."
1 tool update
v0.4.89- Changed
wait_for1 field changed- changed
Input schema / properties / report_path / descriptionPrevious value: -"With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must sit under ~/.cmux/ or ~/.cmux/agents/<agent_id>/, else refused."New value: +"With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must be a regular file (max 1 MiB) under ~/.cmux/agents/<agent_id>/ or ~/.cmux/live-harness/, else refused. An agent in error never matches."
24 tool updates
v0.4.88- Removed
browser_surface - Changed
close_surface5 fields changed- added
Input schema / properties / agent_idAdded value: +{ + "description": "Managed agent ID", + "type": "string" +} - added
Input schema / properties / forceAdded value: +{ + "default": false, + "description": "Close even when the backing agent is still live (not done/error). This never bypasses stable surface identity checks. Without force, a live agent's surface is protected and the response returns the current pane contents instead of closing.", + "type": "boolean" +} - added
Input schema / properties / scopeAdded value: +{ + "default": "surface", + "enum": [ + "surface", + "agent", + "workspace" + ], + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "surface" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agent_id": { + "type": "string" + }, + "agents": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "caller_workspace": { + "type": "boolean" + }, + "collapse_pane": { + "type": "boolean" + }, + "force": { + "type": "boolean" + }, + "live_agents": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "ok": { + "type": "boolean" + }, + "pane": { + "type": "string" + }, + "refused": { + "type": "boolean" + }, + "removed": { + "additionalProperties": {}, + "type": "object" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "scope": { + "enum": [ + "surface", + "agent", + "workspace" + ], + "type": "string" + }, + "state": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "surfaces": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "workspace": { + "type": "string" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Added
control_health - Removed
get_agent_state - Removed
interact - Removed
kill - Changed
list_agents7 fields changed- added
Input schema / properties / agent_idsAdded value: +{ + "description": "Return only these agent IDs", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / blocked_on_promptAdded value: +{ + "description": "Return only agents whose registry records show a live prompt blocker", + "type": "boolean" +} - added
Input schema / properties / detailAdded value: +{ + "default": "summary", + "description": "summary (default): flat addressable scalar rows. full: provenance, health diagnostics, the full registry record, and up to 20 unresolved or attention delivery receipts.", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - added
Input schema / properties / max_age_msAdded value: +{ + "description": "Maximum acceptable snapshot age in milliseconds (0-5000); topology changes always invalidate the snapshot", + "maximum": 5000, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / mineAdded value: +{ + "default": false, + "description": "Return direct children of the calling agent", + "type": "boolean" +} - added
Input schema / properties / parent_agent_idAdded value: +{ + "description": "Return direct children of this agent", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agents": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "count": { + "minimum": 0, + "type": "integer" + }, + "derived_at": { + "type": "number" + }, + "ok": { + "type": "boolean" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Changed
list_surfaces2 fields changed- added
Input schema / properties / verboseAdded value: +{ + "default": false, + "description": "Return all raw cmux fields instead of the condensed default. This materially increases token usage and is rarely needed; use it only when a specific raw field is required.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "column_count": { + "minimum": 0, + "type": "integer" + }, + "ok": { + "type": "boolean" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "surfaces": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "workspaces": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
new_split - Removed
read_agent_output - Changed
read_screen5 fields changed- added
Input schema / properties / parsed_onlyAdded value: +{ + "default": false, + "description": "If true, return only parsed fields (omit screen content). Best for agent monitoring.", + "type": "boolean" +} - added
Input schema / properties / rawAdded value: +{ + "default": false, + "description": "If true, include the full untrimmed terminal content (separators, status-bar art, all lines). Default false returns a compact de-chromed screen_preview instead.", + "type": "boolean" +} - added
Input schema / properties / surface_idAdded value: +{ + "description": "Alias for `surface`, as emitted by list_agents/spawn_agent.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "surface" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ok": { + "type": "boolean" + }, + "parsed": { + "additionalProperties": {}, + "type": "object" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "surface": { + "type": "string" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
rename_tab - Added
report_to_parent - Removed
send_input - Removed
send_key - Added
send_to - Removed
send_to_agent - Removed
set_progress - Removed
set_status - Changed
spawn_agent29 fields changed- added
Input schema / properties / allow_long_inlineAdded value: +{ + "default": false, + "description": "Bypass the inline prompt length cap for a deliberate raw boot-prompt send. Prefer boot_prompt_path for large prompts.", + "type": "boolean" +} - added
Input schema / properties / authorityAdded value: +{ + "description": "Authority axis, independent from job function and placement", + "enum": [ + "lead", + "worker" + ], + "type": "string" +} - added
Input schema / properties / auto_archive_on_doneAdded value: +{ + "default": false, + "description": "Deprecated compatibility flag. TASK_DONE updates agent state only; cmuxlayer does not auto-close panes.", + "type": "boolean" +} - added
Input schema / properties / boot_prompt_pathAdded value: +{ + "description": "Optional readable prompt-file path. Checked before spawning; multiline or over-cap files are submitted as one `Read and follow <path>` pointer and one final return after readiness. Mutually exclusive with prompt.", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / boot_prompt_timeout_msAdded value: +{ + "description": "Optional timeout override in milliseconds for pane placement, initial shell readiness, agent launch readiness, and the boot prompt. When omitted, each phase keeps its established default (45s placement, 10s shell, 15s launch, 60s boot prompt).", + "exclusiveMinimum": 0, + "type": "integer" +} - added
Input schema / properties / collab_pathAdded value: +{ + "description": "Lead coordination file; workers inherit their parent lead collab_path unless explicitly supplied.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / cwdAdded value: +{ + "description": "Initial working directory for type=terminal", + "type": "string" +} - added
Input schema / properties / effortAdded value: +{ + "description": "Codex reasoning effort, passed to the repoGolem launcher. CHOOSE THIS DELIBERATELY PER MISSION — it is a cost decision, not a default to inherit. The installed launcher currently accepts: low, medium, high, xhigh, max, ultra. spawn_agent rejects other values before creating a worktree or surface. The live launcher defaults to HIGH when omitted (~/.config/ralphtools/golem-dispatch.zsh). Per /agent-routing, MEDIUM is the settled floor for well-specified implementation lanes — use it unless the task genuinely needs more; xhigh and above burn budget fast and are rarely warranted for a lane with a clear brief.", + "enum": [ + "low", + "medium", + "high", + "xhigh", + "max", + "ultra" + ], + "type": "string" +} - added
Input schema / properties / focusAdded value: +{ + "default": false, + "description": "Leave focus on the created agent tab instead of restoring the exact origin after initialization.", + "type": "boolean" +} - added
Input schema / properties / forceAdded value: +{ + "default": false, + "description": "With resume_agent_id only: override inconclusive recorded-process liveness after the caller deliberately verifies the old agent is gone. Does not bypass session or terminal-state requirements.", + "type": "boolean" +} - added
Input schema / properties / force_newAdded value: +{ + "default": false, + "description": "When true, suppress same repo/workspace/role duplicate-lane warnings. Default false so collab leads see reusable existing agents before spawning another lane.", + "type": "boolean" +} - added
Input schema / properties / halt_escalationAdded value: +{ + "default": true, + "description": "Notify the nearest live ancestor when this agent remains awaiting input, idle without done evidence, or wedged past its dwell threshold. Set false for deliberate debugging lanes.", + "type": "boolean" +} - added
Input schema / properties / max_cost_per_agentAdded value: +{ + "description": "Maximum cost cap in USD for this agent", + "type": "number" +} - added
Input schema / properties / mcp_profileAdded value: +{ + "anyOf": [ + { + "enum": [ + "inherit", + "sterile", + "skill_eval" + ], + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "exclude": { + "items": { + "type": "string" + }, + "type": "array" + }, + "include": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + ], + "description": "MCP profile hint for worktree launches. Defaults to inherit. Use sterile/skill_eval or include/exclude lists for narrower evals." +} - changed
Input schema / properties / model / descriptionPrevious value: -"Model name (e.g. 'sonnet', 'codex', 'opus')"New value: +"OPTIONAL — leave UNSET so the launcher pins the top-tier model. For cli:'codex', an explicit model is checked against Codex's runtime model list before any worktree or surface is created, then passed through to the launcher. Never pass 'opus' for claude — the top Claude model is already the default." - added
Input schema / properties / parent_agent_idAdded value: +{ + "description": "ID of the parent agent for hierarchical spawning. Normally inferred from the managed caller surface; pass explicitly only when no managed caller supplies the hierarchy. Parent must exist.", + "type": "string" +} - added
Input schema / properties / placementAdded value: +{ + "description": "Physical placement axis: left or right. It must agree with authority (lead=left, worker=right). Legacy orchestrator/worker aliases remain accepted.", + "enum": [ + "left", + "right", + "orchestrator", + "worker" + ], + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious value: -"Task prompt to send after agent is ready"New value: +"Max 2-3 short lines. Longer payloads BREAK the receiving pane — write the payload to a file and send one line: `Read and follow <path>`. Inline task prompt to send after the agent is ready. Capped at 500 inline UTF-8 bytes by default; use boot_prompt_path for larger prompts. Mutually exclusive with boot_prompt_path." - added
Input schema / properties / report_pathAdded value: +{ + "description": "Optional ABSOLUTE override for the engine-issued report path. Omit in almost all cases: the engine issues ~/.cmux/agents/<agent_id>/report.md, returns it here, and verifies closure against it. Pass a distinct FILE path per child (never a directory) to place a report somewhere you already watch. Check coordination_footer_delivered. For resume_agent_id calls, false means the pointer was deliberately not re-delivered: follow coordination_footer_note and relay only if the restored session lost its original context. For new spawns, if false and contract_path is present, folded pointer submission was queued or unverified, so YOU must relay contract_path, report_path, and done_marker. If false and contract_path is absent, inline mode is active or the contract file could not be written, so YOU must relay report_path and done_marker.", + "type": "string" +} - added
Input schema / properties / resume_agent_idAdded value: +{ + "description": "THE way to revive an agent: resume this captured session on a fresh surface, keeping its public agent ID and re-issuing its coordination contract. cmuxlayer never revives a pane by itself (#492) -- a pane you close stays closed -- so a lead that wants an agent back asks here, by id. Refused with a reason when the session transcript is not on disk, rather than opening an empty pane. Mutually exclusive with new-spawn fields.", + "type": "string" +} - added
Input schema / properties / roleAdded value: +{ + "description": "Agent job function: implementor, reviewer, or gatherer. Legacy orchestrator/worker aliases remain accepted for compatibility. Claude requires this field explicitly.", + "enum": [ + "orchestrator", + "worker", + "implementor", + "reviewer", + "gatherer" + ], + "type": "string" +} - added
Input schema / properties / titleAdded value: +{ + "description": "The caller-supplied agent pane title is applied verbatim (for example `cmuxlayer-WORKER · run1 name-the-tabs`); when omitted or blank, the existing agent-id/surface fallback is retained. Managed identity comes from the agent registry, not this display title (#479/#492).", + "type": "string" +} - added
Input schema / properties / typeAdded value: +{ + "default": "agent", + "description": "Spawn an AI agent or a plain terminal", + "enum": [ + "agent", + "terminal" + ], + "type": "string" +} - added
Input schema / properties / verboseAdded value: +{ + "default": false, + "description": "Return the full legacy spawn response instead of the lean default.", + "type": "boolean" +} - added
Input schema / properties / versionAdded value: +{ + "const": 1, + "default": 1, + "description": "SpawnSpec schema version", + "type": "number" +} - changed
Input schema / properties / workspace / descriptionPrevious value: -"Target workspace ref"New value: +"Target workspace ref. Omit to use the caller/current workspace; pass only when intentionally spawning in a different workspace." - added
Input schema / properties / worktreeAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "base": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "create": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "reuse": { + "type": "boolean" + } + }, + "type": "object" + } + ], + "description": "When set, create or reuse a git worktree before launch. Pass a string such as \"tool-usage\" as the worktree name, true for a generated name, or an object with name, path, branch, base, create, and reuse. When repoGolem registers the repo with an absolute path, that path is the repo root; otherwise the root is resolved from CMUXLAYER_REPO_HOME, the running checkout, or ~/Gits. true uses <registered-root>/.worktrees/<generated-name> (legacy ~/Gits/<repo>.wt read-fallback until ~2026-09). If a later spawn step fails before a recoverable surface exists, a newly created worktree and branch are rolled back." +} - removed
Input schema / requiredRemoved value: -[ - "repo", - "model", - "cli", - "prompt" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agent_id": { + "type": "string" + }, + "boot_prompt_bytes": { + "minimum": 0, + "type": "integer" + }, + "boot_prompt_delivered": { + "type": "boolean" + }, + "boot_prompt_receipt": { + "$ref": "#/properties/cwd_receipt" + }, + "boot_prompt_submit_verified": { + "type": [ + "boolean", + "null" + ] + }, + "contract_path": { + "type": "string" + }, + "coordination_footer_bytes": { + "minimum": 0, + "type": "integer" + }, + "coordination_footer_delivered": { + "type": "boolean" + }, + "coordination_footer_note": { + "type": "string" + }, + "cwd": { + "type": [ + "string", + "null" + ] + }, + "cwd_receipt": { + "additionalProperties": true, + "properties": { + "attention_reason": { + "type": "string" + }, + "bytes": { + "minimum": 0, + "type": "integer" + }, + "delivered": { + "type": "boolean" + }, + "delivery": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "delivery_id": { + "type": "string" + }, + "delivery_state": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "duplicate_of": { + "type": "string" + }, + "needs_attention": { + "type": "boolean" + }, + "prompt_bytes": { + "minimum": 0, + "type": "integer" + }, + "prompt_sha256": { + "type": "string" + }, + "prompt_warning": { + "type": [ + "string", + "null" + ] + }, + "rpc_methods": { + "items": { + "enum": [ + "surface.send_text", + "surface.send_key" + ], + "type": "string" + }, + "type": "array" + }, + "submit_attempted": { + "type": "boolean" + }, + "submit_dispatched": { + "type": "boolean" + }, + "submit_evidence": { + "anyOf": [ + { + "enum": [ + "token_delta", + "transcript_echo", + "cleared_composer", + "status_only" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "submit_verified": { + "type": [ + "boolean", + "null" + ] + }, + "terminal": { + "type": "boolean" + }, + "typed": { + "type": "boolean" + } + }, + "type": "object" + }, + "delivered_chars": { + "minimum": 0, + "type": "integer" + }, + "done_marker": { + "type": "string" + }, + "next_action": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "parent_agent_id": { + "type": [ + "string", + "null" + ] + }, + "report_path": { + "type": "string" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "role": { + "type": "string" + }, + "spawn_state": { + "enum": [ + "started", + "boot_unsubmitted" + ], + "type": "string" + }, + "surface_id": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "enum": [ + "agent", + "terminal" + ], + "type": "string" + }, + "update_menu_skipped": { + "type": "boolean" + }, + "update_menu_text_hash": { + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + }, + "workspace_id": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
stop_agent - Added
update_surface - Changed
wait_for10 fields changed- changed
Input schema / properties / agent_id / descriptionPrevious value: -"Agent ID from spawn_agent"New value: +"Single agent ID from spawn_agent" - added
Input schema / properties / conditionAdded value: +{ + "description": "Alias for target_state", + "enum": [ + "ready", + "working", + "idle", + "done", + "error" + ], + "type": "string" +} - added
Input schema / properties / delivery_idAdded value: +{ + "description": "Wait for a send_to delivery_id to reach a terminal outcome", + "type": "string" +} - added
Input schema / properties / done_markerAdded value: +{ + "description": "Final-line marker for report_path", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / idsAdded value: +{ + "description": "Agent IDs to wait for together", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / mineAdded value: +{ + "default": false, + "description": "Wait for every direct child of the calling agent", + "type": "boolean" +} - added
Input schema / properties / report_pathAdded value: +{ + "description": "With done_marker and agent_id: file-backed done. Matches when this ABSOLUTE file's final non-empty line equals done_marker, the same report contract spawn_agent issues. After symlinks resolve it must sit under ~/.cmux/ or ~/.cmux/agents/<agent_id>/, else refused.", + "type": "string" +} - added
Input schema / properties / watchAdded value: +{ + "additionalProperties": false, + "description": "Declared WatchSpec alternative to agent_id/ids", + "properties": { + "change": { + "const": "content", + "description": "Persistent file-content change watch; mutually exclusive with predicate and marker", + "type": "string" + }, + "deadline": { + "description": "Absolute Unix deadline in milliseconds", + "exclusiveMinimum": 0, + "type": "integer" + }, + "marker": { + "description": "Literal file marker; mutually exclusive with predicate and change", + "minLength": 1, + "type": "string" + }, + "notify": { + "description": "Opt in to the configured external notification transport", + "type": "boolean" + }, + "owner": { + "description": "Agent/seat notified by the watch", + "minLength": 1, + "type": "string" + }, + "predicate": { + "description": "Agent screen-state predicate: thinking, working, idle, done, error; mutually exclusive with marker and change", + "enum": [ + "thinking", + "working", + "idle", + "done", + "error" + ], + "type": "string" + }, + "target": { + "description": "Absolute file path or public agent_id", + "minLength": 1, + "type": "string" + }, + "watermark": { + "description": "Prior marker count; defaults to count observed at arm time", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "owner", + "target", + "deadline" + ], + "type": "object" +} - removed
Input schema / requiredRemoved value: -[ - "agent_id", - "target_state" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agent_id": { + "type": "string" + }, + "attention_reason": { + "type": "string" + }, + "delivered": { + "type": "boolean" + }, + "delivery": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "delivery_id": { + "type": "string" + }, + "delivery_state": { + "enum": [ + "submitted", + "typed", + "queued", + "queued_followup", + "rescued", + "failed", + "pending_verify", + "failed_confirmed", + "stalled_queue" + ], + "type": "string" + }, + "duplicate_of": { + "type": "string" + }, + "needs_attention": { + "type": "boolean" + }, + "ok": { + "type": "boolean" + }, + "results": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "retry_count": { + "minimum": 0, + "type": "integer" + }, + "rpc_methods": { + "items": { + "enum": [ + "surface.send_text", + "surface.send_key" + ], + "type": "string" + }, + "type": "array" + }, + "submit_attempted": { + "type": "boolean" + }, + "submit_dispatched": { + "type": "boolean" + }, + "submit_evidence": { + "anyOf": [ + { + "enum": [ + "token_delta", + "transcript_echo", + "cleared_composer", + "status_only" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "submit_verified": { + "type": [ + "boolean", + "null" + ] + }, + "terminal": { + "type": "boolean" + }, + "timed_out": { + "type": "boolean" + }, + "typed": { + "type": "boolean" + }, + "watch": { + "additionalProperties": {}, + "type": "object" + } + }, + "required": [ + "ok", + "retry_count" + ], + "type": "object" +}
- Removed
wait_for_all
20 tool updates
v0.1.0- First observed
browser_surface - First observed
close_surface - First observed
get_agent_state - First observed
interact - First observed
kill - First observed
list_agents - First observed
list_surfaces - First observed
new_split - First observed
read_agent_output - First observed
read_screen - First observed
rename_tab - First observed
send_input - First observed
send_key - First observed
send_to_agent - First observed
set_progress - First observed
set_status - First observed
spawn_agent - First observed
stop_agent - First observed
wait_for - First observed
wait_for_all
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action: health check, spawn, wait, list agents, send, list surfaces, read screen, update surface, close surface, report to parent. No two tools appear to do the same thing; overlaps are minimal and descriptions clarify boundaries.
Most names follow verb_noun snake_case (spawn_agent, list_agents, etc.), but wait_for and send_to use verb_preposition without an explicit noun, and report_to_parent adds a prepositional phrase. This is a minor deviation and still readable.
10 tools is well-scoped for a multiplexer/agent-management server; each tool has a clear role and there are no redundant or thin entries.
Core lifecycle is covered: spawn, list, send, wait, read, update, close, health, report. Minor gaps exist, e.g., no dedicated pause/resume agent tool (though spawn_agent can resume and list_agents surfaces pause state), so agents can mostly work around them.
Maintenance
Related MCP Connectors
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Remote MCP server to run your Atako AI agents: chat, projects, files, integrations and channels.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceTerminal MCP server for AI coding agents with persistent PTY sessions, ring-buffer incremental reads, headless xterm screen capture, multi-agent orchestration, and a real-time web dashboard.17 npm25MIT
- AlicenseAqualityAmaintenanceMCP server for hyperpanes terminal workspace app, enabling AI agents to compose and launch workspace layouts, inspect and drive terminal panes, stream output, and orchestrate agent hierarchies.471MIT
- AlicenseBqualityCmaintenanceA comprehensive MCP server for driving tmux sessions, windows, panes, sending keystrokes, and reading pane output locally or over SSH, enabling real-time collaborative pairing with AI.7113 PyPI3MIT
- AlicenseAqualityDmaintenanceMCP server to control Onda terminal from AI agents, providing tools for splitting panes, running commands, managing tabs and workspaces, and orchestrating multi-agent workflows across multiple windows.3913 npmMIT