agentsocks
Connects GitHub Copilot CLI sessions to the agentsocks network, allowing them to send and receive messages and tasks with other supported coding agents.
Wires Hermes sessions into agentsocks for inter-agent messaging and task routing with other supported agents.
Integrates with OpenAI's Codex CLI for session-to-session messaging and task handoff, and provides an optional public listener for ChatGPT clients.
Optional gateway links your own machines and phone over your Tailscale tailnet, enabling agentsocks communication beyond the local machine.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agentsockstell api-worker the migration is done and the new column is tenant_id"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
agentsocks lets the Claude Code and Codex sessions on your machine message each other, ask each other questions and hand over tasks. Each message arrives the way that tool already receives one, so nothing is ever typed into a terminal.
Install
npm install -g agentsocks
agentsocks install
agentsocks doctorNeeds Node.js 22.13 or later, Claude Code 2.1.224 or later and Codex CLI 0.162 or later. agentsocks install backs up every
file it edits, and --dry-run shows the changes first. New sessions pick it up; sessions already running are not touched.
Related MCP server: interclaude
See it work
Open a Claude Code session and a Codex session. In Codex, type: tell api-worker the migration is done and the new column is tenant_id.
Claude Code ( | Codex ( |
| |
| |
Claude answers with its built-in |
|
The same works from any shell: agentsocks list shows who is running, and agentsocks send api-worker "the rebase is safe now"
sends a message. The guide has every tool and command.
Works with
Agent | Status | Hears about a message | Wakes when idle |
Claude Code | Supported, run live | In its own cross-session inbox, between tool calls | Yes, as a new turn |
Codex CLI | Supported, run live | Through its hooks, before the next tool call | Yes, with |
OpenCode | Experimental, not run live against 0.4 | A notice on the next tool result | Yes |
OMP (oh-my-pi) | Experimental; an earlier 0.4 build passed a live run | A note on the next tool result | Yes |
Hermes | Experimental, not run live against 0.4 | A notice at the start of the next turn | Only with Hermes's API server on |
Cursor (CLI and IDE) | Experimental, not run live against 0.4 | A notice after the next tool call | No |
GitHub Copilot CLI | Experimental, not run live against 0.4 | A notice after the next tool call | No |
Gemini CLI | Experimental, not run live against 0.4 | A notice after the next tool call | No |
Aider | Not supported: no MCP client and no hooks |
Tested with Claude Code 2.1.294 to 2.1.302 and Codex CLI 0.162 to 0.163. Two Claude Code sessions keep using Claude's own
SendMessage. How each agent is wired is in the guide.
What you get
Messages, questions and tasks. Message any session, ask up to 16 sessions one question and get the answers back together (experimental), or hand over a tracked task with an owner, a state and a result.
Nothing typed into a terminal. No tmux
send-keys, no pane pastes, no fake user input. A message from another agent is never treated as you, and it can't answer a permission prompt.Attention routing. A busy session isn't interrupted for every message: FYIs come as one digest, and floods wait for the end of its turn (how it decides).
Channels and a live view (experimental). Post to a
#topic, and watch every session and today's routing inagentsocks top.Beyond this machine (experimental, off by default). An optional gateway links your own machines and your phone over your tailnet (details and limits).
Limits
One machine, unless you turn on the gateway or link machines (see Beyond this machine, experimental). Remote Control and cloud sessions are not reached.
Codex sessions do not appear in Claude's own
ListAgentsunless you turn onagentsocks install --claude-listagents(off by default, see More agents); otherwise uselist_peers.Aider is not supported: it has no MCP client and no hooks, so there is nothing for agentsocks to hook into.
Plain text only.
agentsocks builds on Claude Code's cross-session messaging and on Codex CLI's hooks,
codex queueand local state. None of these is a stable public API, so a Claude Code or Codex update can stop delivery until agentsocks is updated;agentsocks doctorchecks what it can: the Node version, Codex'squeuecommand and each agent's wiring. Tested with Claude Code 2.1.294 to 2.1.302 and Codex CLI 0.162 to 0.163.Not affiliated with or endorsed by Anthropic or OpenAI.
Built and tested on Linux. macOS follows Claude Code's own socket-directory rules, and the test suite runs on macOS in CI (the live-agent rehearsals and the tests that need Linux, such as the
/procreaders and the gateway source check, run on Linux only), but agentsocks has not been used with real Claude Code and Codex sessions on a Mac, and the typing guard is off there. Termux is best effort: its directories are covered by tests that simulate it, and it is not in CI. Windows named pipes are not supported yet.
The full design, including what was rejected and why, is in docs/SPEC.md.
Docs
Guide: how install wires each agent, using it from a shell, routing, tasks, channels, asks, ratings,
agentsocks top, delivery states and the gateway.SECURITY.md: what stays on your machine, the threat model and how to report a problem.
docs/SPEC.md: the full design, including what was rejected and why.
Security
Security. Every release, 0.4 included, is reviewed by independent AI reviewers for correctness, security and spec fit, and CI runs the test suite on Linux and macOS (the live-agent rehearsals and the tests that need Linux, such as the /proc readers and the gateway source check, run on Linux only). CI scans the full git history for secrets on every push. See SECURITY.md for what stays on your machine and what does not. Argo, Aelethion's code security scanner, is coming soon.
Roadmap
Coming soon:
A Grok bot. Reach your sessions from Grok as one more peer, without opening a terminal.
MCP outside the terminal. MCP clients that do not run in a terminal, such as desktop and web chat apps, reach agentsocks through a tunnel on your own tailnet carried over the MCP channel, so they no longer need the public listener the ChatGPT and Grok connectors use today.
Related projects
Other people are solving the same problem in different ways. If agentsocks is not the right fit, one of these may be:
claude-uds-bridge: a Codex plugin that registers Codex tasks in Claude Code's own session registry, so Claude's built-in
ListAgentsandSendMessagereach them. Closest to agentsocks in approach. agentsocks adds attention routing, durable tasks and delivery verification.hcom: messaging, watching and spawning across many agent CLIs. It wraps each agent in a terminal and wakes idle ones by typing a trigger into the prompt; agentsocks never types into a terminal.
agent-bridge: a Claude Code and Codex bridge using Claude's MCP channel notifications and a proxy in front of the Codex app-server.
telepath: a small file-based message bus for Claude Code and Codex, delivered at hook boundaries and through
codex queue.codex-claude-bridge: Claude Code and Codex talk through one shared markdown file that each watches.
mcp_agent_mail: a mail-style coordination server for any MCP client, with identities, threads and file reservations; agents poll their inboxes.
Gas Town: a multi-agent workspace manager with a coordinating agent, workers and a work ledger; it nudges agents through tmux and hooks.
License
MIT
Available Tools
14 toolsanswerAnswer an askA
Answer a question another session sent you with ask (its message names an ask id). The asker receives your answer together with the others. Answer once; the asker stops waiting after its timeout, and then you send the answer with send_message instead.
| Name | Required | Description | Default |
|---|---|---|---|
| answer | Yes | Your answer, in plain text, at most 4000 characters; for more, answer with a file path | |
| ask_id | Yes | The ask id from the question, such as A-1a2b3c |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses important behavior: the asker receives the answer along with other answers, you should answer once, and the asker stops waiting after its timeout. It does not cover invalid/expired ask-id behavior or delivery timing, which keeps it below a 5.
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 short and front-loaded: purpose and parameter source first, then delivery behavior, then the timeout alternative. Every sentence adds useful information without repetition.
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 two-parameter tool with no annotations or output schema, the description covers what it does, when to use it, when not to use it, and the key timeout behavior. The schema handles parameter details, so the remaining context is complete.
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 ask_id and answer, including format and length. The description adds only the source of ask_id (the ask message), so the baseline 3 is appropriate.
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: answer a question another session sent via ask, with the ask id provided in that message. It also distinguishes this tool from send_message for the timeout case, so an agent can tell when this tool applies.
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?
It explicitly says to use this when another session sent a question with ask and the message names an ask id. It also gives the when-not case: after the asker's timeout, use send_message instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
askAsk several sessions one questionA
Send one question to several sessions at once, wait for their answers, and get them back together. to lists session names or refs, and "#channel" names to ask a channel's subscribers; at most 16 sessions. Each message names the answer tool and the ask id. The call returns when all have answered or after timeout_seconds, and says who did not answer. With pick "best" the smart-routing model, if your user turned it on, also says which reply answers best and how likely each is; that is its opinion, every reply is still shown, and the question and replies are sent to that model. A Claude session cannot ask Claude sessions this way: they are listed so you can use SendMessage.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Session names or refs from list_peers, and "#channel" names; at most 16 sessions in all | |
| pick | No | Set "best" to also get the smart-routing model's opinion on which reply answers best, with probabilities. It sends the question and the replies to that model. | |
| question | Yes | The question, in plain text. Include everything the others need; they cannot see this conversation. | |
| timeout_seconds | No | How long to wait for the answers, at most 280 seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses blocking/wait semantics, the timeout cap, partial-result behavior ('says who did not answer'), and a privacy-relevant side effect ('the question and replies are sent to that model'). It does not cover permissions, rate limits, or whether the reply is delivered as a message.
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?
Front-loads the action and stays dense with facts per sentence, but the pick='best' explanation is restated from the schema and the Claude-session caveat arrives as a trailing aside, adding length without new routing value.
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?
No output schema exists, so the description must explain returns, and it does: answers returned together, non-responders identified, and the optional best-reply opinion with probabilities plus the caveat that every reply is still shown. An agent has enough to invoke and interpret results 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 coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: that '#channel' targets a channel's subscribers and that refs come from list_peers, plus the consequence of pick='best'. The rest largely restates schema text.
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 with scope: 'Send one question to several sessions at once, wait for their answers, and get them back together.' It also distinguishes itself from siblings by naming the one case it does not cover (Claude-to-Claude) and routing that case to SendMessage.
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?
Gives clear conditions for use (one question fanned out to multiple sessions, max 16, blocking with a timeout) and an explicit when-not with an alternative ('A Claude session cannot ask Claude sessions this way... use SendMessage'). It stops short of contrasting against broadcast, which an agent might otherwise consider for a similar fan-out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
broadcastMessage every live sessionA
Send one plain-text message to every live Claude Code and Codex session except yourself, each routed separately by its own state and budgets. It is for announcements, so it is never urgent: fyi (the default) is batched until each session is idle, normal reaches a session at its next tool call unless it was interrupted a lot lately. To reach one session or a group, use send_message or a channel instead.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The message text. Plain text; include file paths rather than file contents. | |
| urgency | No | fyi: batched until each session is idle. normal: delivered at each session's next tool call unless it was interrupted a lot lately. | fyi |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses per-session routing by state and budget, that fyi is batched until each session is idle, that normal lands at the next tool call, and the 'interrupted a lot lately' exception. It omits any delivery/error behavior, rate limits, or what happens to sessions that never go idle, keeping it short of a 5.
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 tightly packed sentences, front-loaded with the core action and scope, then the delivery model, then the routing alternative. No filler and nothing repeated.
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 two-parameter fan-out tool with no output schema and no annotations, the description covers routing, urgency semantics, and alternatives well. It stops short of describing the result shape or any scale/rate constraints on broadcasting to every live session.
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 both message and urgency, including the fyi/normal batching semantics. The description largely restates the urgency behavior already in the enum description and adds no new format or constraint details, so the 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?
The description names a specific verb and resource ('Send one plain-text message to every live Claude Code and Codex session except yourself') and explicitly distinguishes itself from siblings send_message and channel. The self-exclusion is a precise scope detail that separates it from a generic send.
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?
It states the use case ('It is for announcements, so it is never urgent') and names the alternatives with the condition that selects them: 'To reach one session or a group, use send_message or a channel instead.' When-to-use and when-not-to-use are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_channelsList channelsBRead-only
List the channels that have subscribers, with who is subscribed, which of them are not running, and which one is you.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read, so the description's value-add is the disclosure of what comes back: subscriber identity, non-running channels, and which channel is the caller. It does not explain pagination, ordering, or what a 'channel' or 'not running' means, which matters since there is no output schema.
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 front-loaded sentence with no filler, opening on the verb. The trailing list of return fields makes it slightly run-on and reads more like a result spec than an action statement.
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 zero-param read tool with no output schema, the description covers the main return elements but leaves key ambiguities: whether the list is exhaustive or subscriber-filtered, what 'not running' denotes, and the return structure. Adequate but not fully self-sufficient.
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?
Zero parameters, so there is no parameter semantics to convey; baseline 4 applies. The description's return-field clause is not a substitute for parameter documentation.
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?
Specific verb (List) plus resource (channels) with an explicit scope qualifier ('that have subscribers'), which separates it from siblings like list_peers and list_tasks. It never names an alternative sibling, so it stops short of a 5.
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 statement of when to use this versus list_peers, peer_status, or subscribe/unsubscribe, and no prerequisites or exclusions. The only guidance is the implicit scope 'channels that have subscribers', which the agent must infer from a return-value clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_peersList agent sessionsARead-only
List the Claude Code and Codex sessions running on this machine that you can message, with their names, refs, working directories and status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safe-read profile. Beyond that the description adds a real behavioral filter (only messageable sessions, not every process on the machine) and discloses the returned fields (names, refs, working directories, status), which is valuable given there is no output schema. It omits ordering, staleness, and whether the caller's own session appears.
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, front-loaded with the verb and resource, then scope, then return fields. No filler and nothing buried.
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 zero-parameter read-only list tool with no output schema, the description covers purpose, scope, and returned fields, and annotations cover safety. Minor gaps remain around result ordering and whether the listing can be incomplete or stale, but nothing essential to calling it 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?
The tool takes zero parameters and the schema is empty, so per the baseline a 4 applies. The description correctly says nothing about parameters, avoiding noise.
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 concrete verb (list) and resource (Claude Code / Codex sessions on this machine), plus the scoping condition 'that you can message'. This is far clearer than the bare name 'list_peers', though it never names or contrasts with the nearest sibling (list_channels, list_tasks), so it stops short of full differentiation.
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?
Usage is only implied: 'that you can message' hints these are the peers you may target with send_message/ask, but there is no explicit when-to-use, when-not, or named alternative. An agent can infer the workflow but must do the inferring itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList tasksARead-only
List tasks assigned to you or created by you. Active ones by default.
| Name | Required | Description | Default |
|---|---|---|---|
| show | No | Which tasks: those you were assigned, those you created, or both | all |
| include_finished | No | Also show done, failed, cancelled and expired tasks |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a safe read operation. The description adds useful context that the default is active tasks only and that results are scoped to the user's assignments or creations, but it does not describe pagination, maximum results, or return format.
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 with no wasted words. The scope and default filtering behavior are front-loaded and immediately actionable.
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 simple two-parameter read-only list tool with full schema coverage and a readOnlyHint, the description provides enough context to call it correctly. It could be slightly richer about result ordering or limits, but nothing essential 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 both parameters are fully documented in the schema. The description lightly mirrors the show parameter's ownership scope and the include_finished default behavior, but adds no syntax or edge-case details beyond the structured fields.
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: list tasks, scoped to tasks assigned to or created by the user. This distinguishes it from mutating siblings like update_task and send_task, but it does not explicitly contrast with any sibling list 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?
It clearly indicates the default context (active tasks) and the two ownership scopes. It does not name alternatives or explicitly state when not to use this tool, but the usage context is well implied for a list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_statusCheck what happened to a messageARead-only
Show how a message you sent was routed (now, after the current step, batched or merged) and whether it was sent, shown to the receiver or answered.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes | The message id returned by send_message |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral value by enumerating the routing outcomes (now, after the current step, batched, merged) and the delivery states (sent, shown, answered) that the tool reports — important given there is no output schema. It does not cover what happens for an unknown message_id or any error behavior.
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 front-loaded sentence with the verb first and no wasted preamble. The parenthetical enumerations are dense but earn their space by defining the possible states, though the stacked list makes it slightly harder to scan.
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 one-parameter read-only status tool with no output schema, the description supplies the conceptual return values an agent needs to interpret results. Missing only error/edge-case behavior and explicit usage triggers, which are minor for this complexity level.
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?
Only one parameter and schema coverage is 100%, so the schema already documents message_id fully, including its provenance from send_message. The description adds no format, constraint, or edge-case guidance beyond that, making 3 the correct baseline.
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 ('show') and a specific resource (how a sent message was routed plus its delivery/read state), which clearly separates it from siblings like send_message, list_channels, or peer_status. It stops short of explicitly naming which sibling tool produces the message_id, relying on the schema for that linkage.
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?
Use context is implied by 'a message you sent' and the schema note that message_id comes from send_message, so an agent can infer this is a post-send verification call. However there is no explicit when-to-use statement, no mention of alternatives, and no conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
peer_statusSee what a session is doing and what is asked of itARead-only
Show what another session is working on, what is waiting for it (unread messages, held digests, open tasks), when it last showed or answered a message, and any drift between the two.
| Name | Required | Description | Default |
|---|---|---|---|
| peer | Yes | Session name or ref from list_peers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is already covered. The description adds real value beyond that by disclosing the shape of the read: unread messages, held digests, open tasks, last shown/answered timestamps, and a drift comparison. It does not mention permissions, visibility scope (same workspace vs. cross-workspace), or staleness/refresh behavior, which keeps it out of the top band.
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 front-loaded sentence that opens with the action and then enumerates the payload categories; there is no filler or redundancy. The parenthetical list is dense but each item carries information, so it stays readable rather than sprawling.
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 fully documented parameter, a readOnly annotation, and no output schema, the description must describe what comes back and largely does so via the enumerated categories. What remains thin is operational context: scope/permissions for viewing another session and whether the status is live or cached.
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?
There is a single parameter with 100% schema description coverage, so the schema already defines it as 'Session name or ref from list_peers'. The description adds no additional semantics for the peer argument (e.g., whether an unknown peer errors or returns empty). Baseline 3 applies when the schema does the heavy lifting.
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?
Specific verb (show) plus resource (another session's current state) with a clear enumeration of what is reported: work in progress, pending items, last activity, and drift. It reads as distinct from list_peers, which enumerates sessions rather than reporting one session's state. It stops short of explicitly contrasting with the overlapping sibling message_status, which also concerns message activity.
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?
Usage is only implied: the agent infers 'call this when you need to know about another session'. There is no explicit when-to-use, no when-not-to-use, and no named alternative such as list_peers (for enumeration) or message_status (for message-level detail). The peer parameter's reference to list_peers hints at ordering but is not stated as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rate_messageRate a message you receivedA
Tell agentsocks whether a message another session sent you was worth the interruption: useful-now (right to reach you now), could-wait (fine, but it could have waited until you finished) or noise (not worth reading). Ratings stay on this machine. They tune how that sender's messages are routed (a sender whose interrupting messages are mostly rated could-wait or noise has its ordinary ones paused) and score the router on your own traffic. Without message_id or from it rates the latest message you received.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | The sender's name: rates the latest message you received from it | |
| rating | Yes | useful-now, could-wait or noise | |
| message_id | No | The id of the message, from the id attribute where your inbox shows one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses that ratings stay local to the machine, that they change how the sender's messages are routed (pausing ordinary messages from noisy senders), and that they score the router. It omits any mention of what the call returns or whether ratings can be changed/undone, which is a gap for a mutation-style 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?
One long but well-ordered passage: purpose first, then rating semantics, then side effects, then the default fallback. The clause about scoring the router is mildly tangential but earns its place by explaining why ratings matter. No redundant filler.
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 3-parameter tool with no annotations and no output schema, the description covers purpose, semantics of each enum value, privacy, and side effects. The main omission is return-value behavior, which the absence of an output schema pushes back onto the description.
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 adds meaning the schema does not: it states that omitting both message_id and from rates the latest message received, which is the default-resolution behavior an agent needs to know. The three enum values are also restated with their interpretation.
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?
Names a specific verb (rate) and resource (a message another session sent you), then defines all three rating values inline so the agent knows exactly what each option means. It is clearly distinguishable from siblings like message_status (inspect) and send_message (produce).
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 clearly frames the context of use — judging a message you already received — and explains the downstream purpose of rating (tuning routing and scoring the router). It does not explicitly contrast with siblings such as message_status, but the usage condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageMessage another agent sessionA
Send a plain-text message to a Codex session on this machine. For Claude Code sessions use your built-in SendMessage, which carries your permission mode; this tool does not send to them. to is a session name, a ref from list_peers, or a reply-to address (uds:...). urgent is for what changes or blocks its work right now, normal is the default, and fyi is for status or thanks that can be batched. It never counts as its user's approval.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient: session name, ref, or uds: reply address | |
| message | Yes | The message text. Plain text; include file paths rather than file contents. | |
| urgency | No | urgent: needed now, within a larger interruption budget. normal: reaches the receiver at its next tool call unless it was interrupted a lot lately. fyi: batched until it is idle. | normal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses meaningful traits: plain-text-only payloads, delivery semantics per urgency tier ('reaches the receiver at its next tool call unless it was interrupted a lot lately'), and the important caveat 'It never counts as its user's approval.' It does not cover failure modes or rate limiting (a sibling rate_message exists), leaving a modest gap.
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 sentences, front-loaded with the core action and the Claude Code exclusion before the parameter guidance. Efficient overall, though the urgency explanation partially duplicates the schema's enum descriptions.
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 no annotations and no output schema, the description covers the essentials an agent needs: recipient forms, message content expectations, urgency selection, the non-approval caveat, and the scope exclusion. Missing only return/confirmation behavior and any throttling context for a 3-parameter tool.
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. The description nonetheless adds value beyond the schema by naming concrete recipient forms ('a session name, a ref from list_peers, or a reply-to address (uds:...)') and a usage heuristic for urgency tiers ('what changes or blocks its work right now'), which the schema states more mechanically.
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 and resource ('Send a plain-text message to a Codex session') and immediately bounds the scope ('on this machine'). It also distinguishes itself from the built-in SendMessage used for Claude Code sessions, so an agent can tell which channel to use without opening a 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?
Explicitly names the alternative path ('For Claude Code sessions use your built-in SendMessage... this tool does not send to them') with a stated condition. It also gives concrete selection guidance for the urgency enum ('urgent is for what changes or blocks its work right now... fyi is for status or thanks that can be batched').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_taskHand another session a tracked taskA
Give another agent session a task you will check on. It gets one message with the details and how to report back; you are told when it accepts, progresses, finishes or fails, and the task expires after 24 hours unless you set otherwise. For a Claude session the task is created and tracked, and you are given the message to send with your built-in SendMessage. Say what done looks like in acceptance_criteria. Use risk high only for work that must not wait.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Assignee: session name, ref, or uds: address | |
| risk | No | high is delivered as urgent | low |
| title | Yes | One line saying what to do | |
| details | Yes | Everything the assignee needs: context, file paths, constraints | |
| external_ref | No | Ticket or PR reference | |
| on_behalf_of | No | The person this is for, if any | |
| expires_in_minutes | No | Default 1440 (24 hours) | |
| acceptance_criteria | No | How you will judge it done, for example which test must pass |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does much of it: it discloses the notification lifecycle (accepts/progresses/finishes/fails), the default 24-hour expiry, and the delivery path for a Claude session. It omits permission/auth requirements and what happens if the assignee never responds, but the lifecycle transparency is well beyond a typical 'create task' blurb.
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?
It is front-loaded with the core action and packs substantial information into three sentences with no filler. The middle sentence is long and carries three clauses (lifecycle, expiry, Claude-session delivery), which makes it denser than ideal but not wasteful.
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 mutation-style tool with eight parameters, no annotations and no output schema, the description covers return behavior (what you are notified about), expiry defaults, and per-parameter intent well enough to call it confidently. Remaining gaps are edge cases (unaccepted tasks, permission requirements) rather than anything needed for a correct 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 coverage is already 100%, so the 3 baseline applies, but the description adds real guidance on two parameters: 'Say what done looks like in acceptance_criteria' clarifies the expected content, and 'Use risk high only for work that must not wait' gives a use policy for the enum that the schema's 'delivered as urgent' does not.
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 pairs a specific verb+resource ('Give another agent session a task') with the defining trait that separates it from send_message/ask: the task is 'tracked' and 'you are told when it accepts, progresses, finishes or fails.' An agent can distinguish this from the fire-and-forget messaging siblings without opening any 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?
It explains the delivery mechanics ('For a Claude session the task is created and tracked, and you are given the message to send with your built-in SendMessage') and gives one conditional rule ('Use risk high only for work that must not wait'). However, it never explicitly states when to choose send_task over ask or send_message, leaving the sibling selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subscribeSubscribe to a channelA
Join a channel such as "#deploys" so messages other sessions post to it reach you. A channel exists while it has a subscriber, and your subscription lasts until you unsubscribe. Post to a channel with send_message, setting to to "#deploys"; each subscriber is routed separately, like any other message.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel name such as "#deploys": up to 48 lower-case letters, digits, dots, dashes or underscores |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers meaningful lifecycle semantics: a channel exists only while it has a subscriber, the subscription persists until unsubscribe, and each subscriber is routed separately. It omits behavior for repeat subscribes (idempotency), validation failures, or max channel limits.
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 tight sentences with the core action front-loaded and the send_message routing hint appended for practical use. The final sentence about per-subscriber routing is slightly tangential but earns its place by clarifying delivery semantics.
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 one-parameter tool with no annotations and no output schema, the description covers lifecycle, interaction with send_message, and termination via unsubscribe. It leaves the return value and duplicate-subscribe behavior unspecified, but nothing critical to invocation 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% and the single `channel` param is fully documented with format constraints in the schema itself. The description only repeats the "#deploys" example, adding no syntax or constraint detail beyond the schema, so the 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?
Specific verb-plus-resource ("Join a channel such as "#deploys"") with an inline example, and it clearly frames the tool as the inverse of unsubscribe by stating the subscription "lasts until you unsubscribe." An agent can distinguish this from send_message, broadcast, or unsubscribe without opening a 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?
It explains the mechanism for using the subscription (post with send_message by setting `to` to "#deploys") and when the relationship ends (on unsubscribe), which routes the agent to the right siblings. It stops short of explicit when-not-to-use or failure/duplicate-subscribe conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unsubscribeLeave a channelA
Stop receiving messages posted to a channel. It does nothing if you were not subscribed.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel name such as "#deploys": up to 48 lower-case letters, digits, dots, dashes or underscores |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses idempotency ('does nothing if you were not subscribed'), but says nothing about permissions, whether the action is reversible via `subscribe`, or what the call returns.
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, front-loaded with the action and followed by the one non-obvious behavioral caveat. No padding or redundancy.
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 one-parameter tool with no output schema, the definition covers the operation and its no-op condition. It leaves minor gaps around re-subscription and side effects on channel membership, but nothing essential to calling it correctly 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% and the single `channel` parameter is fully documented in the schema, including format constraints. The description adds no additional meaning about the parameter, so the 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?
The description gives a specific verb+resource pair — stop receiving messages posted to a channel — that an agent can distinguish from the sibling `subscribe` without opening any schema. The title 'Leave a channel' reinforces the same operation.
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?
Usage is implied (call this when you want to stop receiving a channel's messages), but there is no explicit when-to-use framing, no naming of the counterpart `subscribe`, and no guidance on prerequisites such as whether you must have joined first. Adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskUpdate a taskA
Report progress on a task. The assignee sets accepted, in_progress, done or failed and puts the outcome in result and the proof in evidence (test output, commit hashes, file paths). Only the creator can set cancelled. The creator is told about every change.
| Name | Required | Description | Default |
|---|---|---|---|
| result | No | What happened, in a few sentences | |
| status | Yes | The new state. The assignee sets accepted, in_progress, done or failed; only the creator sets cancelled | |
| task_id | Yes | Task id such as T-1a2b3c | |
| evidence | No | Proof: test output, commit hashes, file paths |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the permission model (creator-only cancellation) and a side effect (the creator is notified of every change). It omits transition validation rules and error/idempotency behavior, which is why it is not a 5.
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 dense sentences, front-loaded with the core action, then the enum/role rules, then the notification side effect. No sentence is filler.
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 4-parameter mutation tool with no annotations and no output schema, the description covers purpose, permissions, expected payload content, and side effects. Only failure/transition behavior is left unspecified.
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 four parameters, including the status enum and its role split. The description's guidance on what belongs in result and evidence largely restates the schema, so the baseline of 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 a specific verb and resource ('Report progress on a task'), which is far more concrete than the bare name update_task. It does not, however, explicitly distinguish itself from plausible siblings such as send_task or answer, so an agent must infer the boundary.
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?
Gives clear role-based conditions: the assignee sets accepted/in_progress/done/failed, and only the creator may set cancelled. This tells the agent who can do what, but it names no alternative tool or when-not-to-use condition.
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.
14 tool updates
v0.1.0- First observed
answer - First observed
ask - First observed
broadcast - First observed
list_channels - First observed
list_peers - First observed
list_tasks - First observed
message_status - First observed
peer_status - First observed
rate_message - First observed
send_message - First observed
send_task - First observed
subscribe - First observed
unsubscribe - First observed
update_task
TDQS
Scored across 14 tools
Each tool targets a distinct action-resource pair: peer/channel/task listing, one-to-one messaging, broadcast announcements, multi-recipient questions, task lifecycle management, and routing/status introspection are all clearly separated. The descriptions explicitly distinguish overlapping-sounding operations like send_message vs. broadcast vs. ask and message_status vs. peer_status.
All names use snake_case and are readable, with most following a verb_noun pattern such as list_peers, send_message, and update_task. The few deviations are intransitive verbs (ask, answer, subscribe, broadcast) and noun_status forms (message_status, peer_status), which are consistent within their categories but prevent a perfect verb_noun pattern.
Fourteen tools is well within the appropriate range for a messaging and task-coordination server. Each tool covers a meaningful operation, and there is no obvious filler or redundant surface.
The surface covers the core lifecycle: discovering peers and channels, subscribing, sending, broadcasting, asking/answering, rating messages, assigning tasks, updating them, and checking routing/status. Minor gaps remain, such as no explicit get_task or inbox/history tool, but agents can work around these via list_tasks and peer_status.
Maintenance
Related MCP Connectors
The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.
- ParleyOAuthdev.weldra
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
End-to-end encrypted messaging and work coordination for autonomous AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables local messaging between Claude Code, Codex, Pi, and other coding-agent sessions on the same machine, allowing them to discover each other, send updates, ask questions, and reply.819 npm3AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables peer-to-peer communication between Claude Code sessions, allowing them to send messages, hand off tasks, and coordinate across worktrees without manual intervention.MIT
- AlicenseNot gradedqualityAmaintenanceLets independent Claude Code and Codex sessions running in different tools and projects discover each other and exchange questions, coordination messages, and replies that arrive back in the conversation that asked. Uses direct local Unix sockets between sessions on the same machine, with no extra service to run or account to configure.863 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables one AI coding agent to discover, read, message, and wait on other agent sessions across Codex threads and Claude Code or Claude Desktop sessions, while logging every send as a local receipt that can be audited later.3 npmMIT