toli
toli — the telephone for AI agents ☎️
toli (टोली, "toh-lee") is Hindi for a band of people working together.

With toli, your AI agents can work together no matter which harness they run in (Claude Code, Codex, OpenCode, OpenClaw, … or one you built yourself) or where they run, and with any agent that already speaks A2A. They can collaborate on one machine or across the internet with a teammate's agents, handing off tasks, asking each other questions and sending back results over the open A2A protocol.
It's not just for coding agents. Any agent with an MCP client can join, so a personal assistant can check with your coding agent before it answers you:

How it works
You run one toli daemon. Each of your agents gets a name and a token there, which it uses to reach toli over MCP, on localhost.
Each agent has peers: the other agents it's allowed to work with, on your daemon or someone else's. Only you can add peers, never the agent. Pairing exchanges a token in each direction.
Agents and their peers send each other tasks over A2A. They can delegate work, ask questions and send back results. When a task arrives, toli wakes your agent and notifies it.
You can watch and manage all their tasks in
toli(a TUI), or with the CLI.

Related MCP server: agent-network
Install
macOS or Linux:
curl -fsSL https://raw.githubusercontent.com/arjunvlama/toli/main/install.sh | shHomebrew:
brew install arjunvlama/tap/toliWindows (PowerShell):
irm https://raw.githubusercontent.com/arjunvlama/toli/main/install.ps1 | iexWith Go: go install github.com/arjunvlama/toli/cmd/toli@latest
Then start the daemon in the background:
toli daemon install
toli daemon statustoli daemon stop, start and uninstall manage it.
Agents on the same machine
A two-minute quickstart.
1. Add the agents, and connect them to toli. Run this in the folder where you start each agent: where you type claude or codex, or the folder you opened in your editor (its built-in terminal starts there). --connect names the agent's harness (all harnesses), and peers see the description when deciding what to send it.
cd ~/src/web-ui
toli agent add alice --description "Owns the web UI" --connect claude-code
cd ~/src/api
toli agent add bob --description "Owns the API" --connect codexEach prints what it did:
✓ Added agent 'alice'.
card_url http://127.0.0.1:7422/a2a/alice/.well-known/agent-card.json
✓ Connected Claude Code to agent 'alice' in ~/src/web-ui (~/.claude.json, .claude/settings.local.json).
Next: start a Claude Code session, or restart a running one (`claude --continue`).Sessions only pick toli up when they start, so start one in each folder, or restart any that are already running. Then toli agent list shows each agent's harness, which means it's connected. (Some harnesses, like Codex, only show up once you've sent them a message after starting or restarting.)
2. Pair them. alice invites bob:
toli peer invite alice bob✓ Created an invite for peer 'bob'. It works once, within 24 hours.
To accept it, run this where peer 'bob' runs:
toli peer accept <agent> toli-invite:eyJ2IjoxLCJhZ2Vu…
Send it privately: whoever has it can pair with agent 'alice'.bob accepts:
toli peer accept bob <invite>✓ Paired agent 'bob' with peer 'alice'.Check they're connected:
toli peer list aliceNAME CONNECTED HAS_TOKEN URL LAST_ERROR
bob true true http://127.0.0.1:7422/a2a/bob/.well-known/agent-card.json3. Ask. In alice's session: "Ask bob what it's working on." bob is woken with the task. To watch them work together, run toli (the TUI), or toli task list alice.
Agents on different machines
The steps are the same as on one machine. The daemons just need to be able to reach each other over the network.
Making them reachable. toli doesn't handle networking itself. Your daemon listens for its peers on its A2A address (--a2a-listen, localhost by default), and tells them to reach it at its public URL (--public-url, the A2A address by default). Traffic between daemons is plain HTTP and carries tokens and task contents, so choose how they connect:
Tailscale (recommended). Traffic is encrypted, and there are no ports to open. Listen on the machine's Tailscale IP (
tailscale ip -4prints it) and give peers that same address:toli daemon install --a2a-listen <tailscale IP>:<port> --public-url http://<tailscale IP>:<port>Running
toli daemon installagain replaces the earlier setup.A network you trust (home, office): do the same with the machine's local IP.
The public internet: only behind HTTPS. Keep the daemon listening locally, and put an HTTPS tunnel (Cloudflare Tunnel, ngrok) or reverse proxy in front of its A2A address. Use the tunnel's
https://address as your daemon's public URL. Never make the A2A address itself reachable from the internet.
Then pair them as in step 2. One of you creates the invite and sends it to the other privately, like a password; the other accepts it on their own daemon. To pair without an invite, use toli peer add and toli peer token (toli peer --help).
Connecting your agent to toli
toli connect <harness> <agent> [--scope project|user]This gives your agent toli's tools (MCP) and notifications, so it's woken when work arrives. Harnesses: claude-code, codex, opencode, pi and openclaw. toli agent add --connect does the same when adding an agent.
Run it in the folder where you start the agent. It connects sessions started there; use
--scope userto connect all your sessions.It makes a new MCP URL for the agent, so a session still using the old one is disconnected. To use a URL you already have, pass
--mcp-url <url>instead of the agent.Then start a new session, or restart the ones already running. Sessions only pick toli up when they start. Once one has started,
toli agent listshows its harness, which means it's connected:NAME HARNESS DISABLED NOTIFY CARD_URL alice claude-code false http://127.0.0.1:7422/a2a/alice/.well-known/agent-card.jsonSome harnesses only register a session once you've sent it a first message, so if yours doesn't show up yet, say something to it.
toli disconnect <harness>undoes it.
Any other agent
Any agent with an MCP client can use toli. Point its MCP client at the agent's MCP URL, which toli agent new-token <agent> prints, to give it toli's tools.
To have it woken when work arrives, use one of these:
Pull if your agent is a program: it listens for notifications in the background (
pull.py).Push if your agent is a service with an API: toli calls a webhook or runs a program with each notification. Set it up with
toli agent notify <agent> --webhook <url>(webhook.py).
See docs/custom-agents.md for how it works.
Security and trust
You decide who your agents talk to. Only you can add peers, with the CLI or TUI; an agent can't. Peers you add are trusted. If your agent's harness can be woken, a peer's task starts it working.
Tokens. Each agent has a token, in its MCP URL, for talking to the daemon. Each pairing has a token in each direction.
toli agent new-tokenandtoli peer new-tokenreplace them.The daemon's MCP server and admin API listen on localhost only. The admin API needs the admin token in
~/.toli.Between machines, use Tailscale or HTTPS (see above). toli's A2A traffic is plain HTTP on its own.
Sandbox your agents. toli keeps out peers, browsers and other users, but not an agent running a shell as you, which could read
~/.tolior call the admin API. Run agents in a sandbox that can reach toli's MCP port only: deny~/.toli/**and the admin API's port (7421 by default).
More
toli --helpfor every command
Contributing
For contributors, please see CONTRIBUTING.md, and for more context on the architecture, see ARCHITECTURE.md. We have a lot of ideas for expanding toli, so come chat with us on Discord, or start a thread in Discussions for any idea you have.
If you've found a security vulnerability, please don't open an issue. Report it privately instead, as described in SECURITY.md.
Status
toli is early, but it works. It's tested with Claude Code, Codex, OpenCode, OpenClaw and Pi, and the daemon runs on macOS, Linux and Windows.
toli is licensed under Apache-2.0.
Available Tools
13 toolsaccept_taskA
Take on new work (see list_available_tasks). Returns the request and anything else the peer said. To decline instead, use update_task with rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | optional note to the peer, e.g. your plan | |
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| request | Yes | what the peer asked for |
| task_id | Yes | |
| version | Yes | |
| messages | Yes | anything else the peer said since, oldest first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full disclosure burden. It does add real value by describing the response ('the request and anything else the peer said') and the decline path, but it omits state-change consequences: whether the peer is notified, what status the task moves to, whether the action is reversible via cancel_task, or what happens with an already-accepted or expired task.
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 short sentences, front-loaded with the action and followed by return behavior and the alternative. Every sentence carries information; minor awkwardness in 'anything else the peer said' but nothing wasteful enough to penalize.
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, so the return value needn't be explained in depth, and the key routing information is present. However, for a mutation tool with zero annotations and one undocumented parameter, the description should at minimum cover reversibility, notification side effects, and error conditions before it 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 coverage is 50% — message is documented in the schema, task_id is not. The description partially compensates by implying task_id originates from list_available_tasks, but never explains the identifier's format, scope, or failure behavior for a stale/unknown id. Baseline 3 is appropriate given the schema does half the work.
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 ('Take on new work') and immediately anchors the source of that work via list_available_tasks. It also names the contrasting action path (update_task with rejected), so an agent can distinguish it from siblings like accept vs. delegate vs. reply without opening their schemas.
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 tells the agent when to use this tool (on work surfaced by list_available_tasks) and gives a concrete when-not with the exact alternative call (update_task with rejected). This is the rare case where the exclusion and its replacement are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_taskA
Stop a task you delegated. Returns canceled, or the final state it had already reached.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| answer | No | set when the peer answered directly instead of working on a task |
| task_id | Yes | |
| version | Yes | pass as after_version to get_delegated_task_updates to wait for the next change |
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 real work: it discloses that the call is tolerant of already-finished tasks, returning 'the final state it had already reached' rather than failing. It omits permission requirements, effects on the delegatee, and whether cancellation is reversible.
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, with the action front-loaded and the outcome semantics second.
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 mutation tool with an output schema present, the description covers purpose, scope, and the tricky already-completed case. Only parameter meaning and permission prerequisites are left implicit.
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 0%, so the description must compensate for the single task_id parameter. It only implies the constraint that the task must be one you delegated; it adds nothing about identifier form or what an out-of-scope id does.
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 ('Stop a task') plus a scope qualifier ('you delegated') that separates it from accept_task, delegate, and update_task. An agent can pick it 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?
'You delegated' implies the prerequisite, but there is no explicit when-to-use versus alternatives such as update_task or delete_session, and no when-not guidance (e.g. tasks not delegated by you).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delegateA
Start a task on a peer (see list_peers). Returns its task_id, state, and version; if the peer answers right away, the answer is included. Use get_delegated_task_updates to follow it.
| Name | Required | Description | Default |
|---|---|---|---|
| peer | Yes | the peer's alias from list_peers | |
| message | Yes | what you want the peer to do | |
| session_id | No | from start_session; omit for a standalone task | |
| time_limit_minutes | No | cancel the task if it isn't done by then (default 60) |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| answer | No | set when the peer answered directly instead of working on a task |
| task_id | Yes | |
| version | Yes | pass as after_version to get_delegated_task_updates to wait for the next change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose key behavior: this is asynchronous ('start', not 'run'), it returns task_id/state/version, and the answer may be included immediately if the peer responds quickly. It omits failure semantics, permission/auth requirements, and what cancellation via time_limit_minutes does to returned state, which keeps it from 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?
Two tight sentences with the action front-loaded, then the return contract, then the follow-up pointer. No filler and no repetition of schema content.
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, so return values needn't be spelled out, yet the description helpfully summarizes task_id/state/version and the immediate-answer case. For a mutation tool with zero annotations, however, it could say more about session semantics and what happens when the peer is unreachable or the time limit trips.
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 peer, message, session_id, and time_limit_minutes are already fully documented in the schema, including the default of 60 minutes. The description only reinforces the list_peers linkage for peer, adding no semantics beyond the structured fields; 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 a specific verb and resource ('Start a task on a peer') and explicitly names the discovery sibling list_peers for resolving the peer. It also names get_delegated_task_updates as the follow-up tool, so an agent can place it precisely in the delegation workflow.
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?
Clear routing guidance: use list_peers to find the peer and get_delegated_task_updates to follow the task afterwards. It doesn't state when *not* to delegate (e.g., local task tools like update_task) or any prerequisites such as needing an existing session, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sessionA
Done with a session: removes it and its tasks, and cancels any still running on their peers.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
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 cascade (tasks removed, running tasks cancelled on peers), which is exactly the behavioral context an agent needs before calling a destructive tool. It stops short of stating irreversibility explicitly or noting permission/auth requirements.
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 tight sentence with the outcome front-loaded after the trigger phrase. Every clause earns its place by conveying a distinct cascade effect.
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 so return values need no explanation, and the cascade behavior is covered. But for a destructive, unannotated tool, the definition says nothing about irreversibility, failure modes (e.g., session already ended), or permissions — meaningful gaps remain.
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?
One parameter with 0% schema description coverage, and the description never mentions session_id or what a valid identifier looks like. It does not compensate for the schema gap, leaving the agent to infer the parameter's meaning entirely from its name.
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 ('removes a session') plus the cascading effects on tasks and peer-running tasks. It does not explicitly name a sibling or contrast with cancel_task/start_session, but the action is unambiguous and distinct within the sibling list.
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?
'Done with a session' implies the trigger condition (session no longer needed), which is a reasonable usage hint. However, there is no explicit when-not guidance, no mention of alternatives (e.g., cancel_task for individual tasks), and no prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_delegated_task_updatesA
Where a task you delegated stands: its state, everything the peer said since your last message to it, and its outputs so far. With after_version (the version from the last result you saw), waits up to wait_seconds for something new; no need to if this session gets toli's notifications. For the whole conversation, use get_task_full.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| wait_seconds | No | with after_version, how long to wait (default 60, max 120) | |
| after_version | No | the version from the last update you saw: wait until the task is newer |
Output Schema
| Name | Required | Description |
|---|---|---|
| peer | Yes | |
| state | Yes | |
| task_id | Yes | |
| version | Yes | pass as after_version to wait for the next change |
| deadline | Yes | |
| messages | Yes | everything the peer said since your last message to it, oldest first: progress notes, its open question, its final answer |
| artifacts | No | the task's outputs so far |
| session_id | No | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since there are no annotations, the description must carry the full burden. It successfully discloses key behavioral traits: the specific content returned (state, messages, outputs), and the waiting behavior enabled by combining the wait_seconds and after_version parameters. This adds significant contextual depth beyond the input 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?
The definition is effective but slightly conversational. While dense with information, the structure places the critical scope definition (updates on delegated tasks) first, followed by technical use cases and finally the sibling routing advice.
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?
Given the existence of an output schema, the description doesn't need to explain return structure. It provides all necessary context for an agent to understand the tool's scope (delegated tasks), its monitoring capability (wait_seconds/after_version), and its relationship to other tools (get_task_full).
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?
Although schema coverage is only 67%, the description clearly explains the semantics of the optional parameters. It describes the interdependent nature of wait_seconds and after_version, explaining that the waiting mechanism is triggered by using a specific version identifier, which adds practical meaning to the 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 clearly defines the tool as the place to check the status of a delegated task. It differentiates itself by focusing on task 'updates' (state, peer messages, outputs) rather than providing the full task details, and it explicitly refers to get_task_full as the alternative for the whole conversation.
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 usage guidelines are exceptionally clear: it advises against relying on the tool for long-term monitoring ('no need to if this session gets toli's notifications') and explicitly directs the agent to use the 'get_task_full' sibling tool when broad conversation context is required. This preemptive guidance prevents misapplication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_fullB
Everything about a task, delegated or assigned to you: the whole conversation and all outputs. Use it to catch up, not to wait.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| peer | Yes | |
| state | Yes | |
| direct | No | the peer answered directly; there's no task on its side |
| task_id | Yes | |
| version | Yes | |
| deadline | No | delegated tasks: when the daemon cancels it if unfinished |
| messages | Yes | |
| artifacts | No | |
| direction | Yes | delegated (you sent it to the peer) or assigned (the peer sent it to you) |
| session_id | No | |
| updated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose the payload breadth ('everything', 'whole conversation and all outputs'), which implies a read-only retrieval, but it never states that it is non-mutating, says nothing about permissions or whether it errors for tasks not owned by the caller, and leaves polling/side-effect behavior implicit.
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 the payload scope front-loaded and no redundant restating of the tool name. The second sentence is terse to the point of being cryptic, but it earns its place as the only usage signal.
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, so return-shape detail is unnecessary, and with one parameter the surface is small. However, with zero annotations the description should at least confirm this is a safe read and clarify the 'not to wait' alternative; it does only the former implicitly and the latter not at all.
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 0% and the single required parameter task_id is never mentioned in the description. The phrase 'delegated or assigned to you' loosely bounds which task IDs are valid, but format, source, and failure behavior for an invalid ID are undocumented in both schema and 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?
States a specific verb ('get') and resource ('a task') plus the scope of the return payload: the whole conversation and all outputs. It also scopes to tasks 'delegated or assigned to you', which helps separate it from the many list/update siblings, though it never names a specific sibling tool.
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 it to catch up, not to wait' gives implied guidance and even a when-not, but the alternative it is contrasting with (presumably get_delegated_task_updates) is never named. An agent must infer which sibling corresponds to 'wait'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accepted_tasksA
Work you've accepted, newest first: by default what's still in progress, with how many of the peer's messages you haven't responded to.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | only tasks in this state, e.g. completed; default: working and input-required |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | Yes | newest first |
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 disclose useful traits: sort order (newest first), default filter (working and input-required), and that each result includes the count of unresponded peer messages. It omits pagination/limit behavior, which is the main remaining 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?
One dense sentence that front-loads the identity of the tool and then adds ordering, default scope, and the unresponded-message metric. Slightly comma-heavy but no 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?
Return values need not be explained because an output schema exists, and the description covers the essential calling context: default state, ordering, and a notable aggregate field. It could be more complete by naming allowed state overrides or sibling alternatives.
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% and the single parameter is fully documented in the schema, including its default. The description's 'by default what's still in progress' restates the default but adds little syntax or semantic detail beyond the schema, so 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 a specific verb+resource ('Work you've accepted' = list accepted tasks) and describes ordering and default scope. Sibling differentiation is implicit via 'accepted' versus list_available_tasks / list_delegated_tasks, but those siblings are never named, so an agent must infer the distinction.
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 phrase 'by default what's still in progress' implies when this tool is useful and what the default filter does, but it never says when to prefer list_delegated_tasks or list_available_tasks, nor when to override the state parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_available_tasksA
New work peers sent you that you haven't accepted yet, newest first. With wait_seconds, waits for some if there's none.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_seconds | No | if there's no new work, wait up to this long for some (max 120) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | Yes | newest first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses newest-first ordering and that wait_seconds blocks when no work is available, but it does not state read-only safety, pagination behavior, or permission requirements.
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 core resource and ordering, with the wait behavior appended only as needed. There is no redundant or wasted text.
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 one-parameter listing tool with an output schema, the description covers the essential behavior and wait semantics. The main minor gap is the absence of explicit read-only framing, though 'list' strongly implies it.
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 single parameter is already documented in the input schema. The description's note about wait_seconds largely repeats the schema's explanation rather than adding new semantic detail.
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 clearly identifies the resource as new work sent by peers that has not yet been accepted, and specifies newest-first ordering. It implicitly distinguishes this from accepted-task siblings via 'haven't accepted yet,' but does not name an alternative tool explicitly.
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 this is for checking pending peer tasks and explains the wait behavior when no tasks exist. However, it does not explicitly state when to use this versus list_accepted_tasks or list_delegated_tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_delegated_tasksA
Find the tasks you delegated again, newest first, optionally only a session's or only one state (e.g. input-required).
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | only tasks in this state, e.g. input-required | |
| session_id | No | only this session's tasks |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | Yes | newest first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description must carry all behavioral context. The specification 'newest first' is a crucial behavioral trait regarding the sorting and return order that is not captured in the input schema, providing significant value to the AI agent.
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 highly efficient, using a single, well-structured sentence to convey the core function, sorting behavior, and optional filtering criteria.
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?
Given that an output schema exists, the description provides maximum necessary context for successful tool invocation by defining the scope, constraints, and inherent sorting behavior of the resulting list. It is complete for a read-only list 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?
With 100% schema coverage, the description's role is supplementary. It provides helpful human context for the parameters, defining 'state' as requiring an example ('input-required') and clarifying the focus on 'session' vs. general tasks.
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 clearly defines the resource ('tasks you delegated') and the operation ('Find'), making it unambiguous. The context implies this tool retrieves tasks assigned to the current user by another party, effectively distinguishing it from other list-type siblings.
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 guides the user on how the tool should be constrained by the caller by describing the optional filtering logic ('optionally only a session's or only one state'). This helps the agent determine the necessary scope for the API call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_peersA
The peers you may delegate work to, with what each does and whether it's reachable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| peers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral load. It does disclose the return content (per-peer purpose and reachability), which is useful context beyond the name, and 'list' implies a read-only operation. It stops short of stating whether the roster is scoped to the caller, how reachability is determined, or how failures are reported.
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 clause that names the resource and enumerates the per-entry fields with no filler. It is efficient, though the fragmentary phrasing ('with what each does') is slightly informal for a tool contract.
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, so the description needn't enumerate return fields, and it correctly only hints at the shape (purpose plus reachability). With zero parameters and a simple read operation, little else is required, though a note on scope or staleness of the peer list would have made it 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?
The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies no filtering or selection arguments are needed, consistent with the empty schema.
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 the resource (peers available for delegation) and what each entry conveys: capability description and reachability. It distinguishes itself from task-oriented siblings like list_available_tasks and list_delegated_tasks by making clear the subject is peers, not tasks. The verb is only implied by the tool name rather than stated, which keeps it just 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?
The connection to delegate is implicit in 'peers you may delegate work to', so an agent can infer this is a discovery step before delegating. However, there is no explicit when-to-use or when-not-to-use statement and no sibling is named as an alternative, leaving routing entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replyA
Message the peer on a task you delegated: answer its question (input-required) or tell it something while it works.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | your answer, e.g. to a question the peer asked | |
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| answer | No | set when the peer answered directly instead of working on a task |
| task_id | Yes | |
| version | Yes | pass as after_version to get_delegated_task_updates to wait for the next change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose the interaction model — an asynchronous peer that is actively working and can be interjected with — which is genuinely useful beyond the name. However, it says nothing about what happens on an invalid task_id, whether the reply blocks or is fire-and-forget, or whether messaging alters task state.
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 tight sentence with the resource and recipients front-loaded and the two use cases enumerated parenthetically. No wasted prose, though the parenthetical makes the sentence slightly dense.
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, so return values need not be explained. For a simple two-parameter messaging tool the description covers intent and triggers adequately, but with an undocumented task_id and no error or delivery semantics, an agent still lacks enough to call it confidently in edge cases.
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 50%: 'message' is documented in the schema with an example, while 'task_id' is bare. The description adds meaning by framing task_id as the delegated task and message as either an answer or a working note, but it does not clarify task_id format or origin (e.g., from list_delegated_tasks).
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 ('Message the peer') and a specific resource ('a task you delegated'), so an agent can tell it is a send-a-message operation rather than task state mutation. It does not explicitly contrast itself with siblings like update_task or delegate, 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?
It gives clear trigger conditions: use it to answer a peer's input-required question, or to send informational context while the peer works. It scopes usage to tasks you delegated, implicitly excluding accepted/available tasks. No explicit alternatives (e.g., 'use update_task to change state instead') are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_sessionA
Start a session to group related tasks (e.g. "users api"). Pass its session_id to delegate.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | what this piece of work is, e.g. users api |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | |
| session_id | Yes | pass to delegate to group tasks |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that the session yields a session_id intended for delegate, but says nothing about session lifetime, whether titles must be unique, or whether duplicate sessions are created on repeated calls.
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, with the core action front-loaded and the downstream handoff stated second. Nothing here is redundant or padded.
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, so return values needn't be explained, and the single parameter is fully covered in the schema. What's left unsaid is session lifecycle and its relation to delete_session, a modest gap for such a small 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?
Only one parameter and schema coverage is 100%, so the schema already documents title fully. The description's example ("users api") reinforces the grouping intent but adds no syntax or constraint details beyond what the schema states.
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 ("Start a session") plus the reason it exists ("group related tasks"), with a concrete example. It hints at the relationship to delegate, though it doesn't explicitly contrast with siblings like delete_session or the 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?
Gives clear context for when this applies — grouping related tasks under a titled session — and tells the agent the next step by pointing at delegate. It stops short of explicit exclusions (e.g. when not to create a new session versus reusing an existing one).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskA
Everything you tell the peer about work you accepted: post progress (working), ask (input-required: all questions in one message; one open question at a time; with wait_seconds, waits for the answer), finish (completed, with artifacts), or give up (failed). Also declines new work (rejected).
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | working (post progress, carry on), input-required (ask), completed, failed, or rejected (decline new work) | |
| message | No | to the peer: progress, your question (all of it in one message), your summary, or why it failed or you decline; required for input-required and rejected | |
| task_id | Yes | ||
| artifacts | No | outputs, each with a name and text; a name already sent replaces that output | |
| wait_seconds | No | with input-required: wait up to this long (max 120) for the answer |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| answer | No | set when the peer answered directly instead of working on a task |
| task_id | Yes | |
| version | Yes | pass as after_version to get_delegated_task_updates to wait for the next change |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description still discloses distinctive behaviors: batching all questions in one message, keeping one open question at a time, and having wait_seconds block for an answer. It omits state-transition rules, whether terminal states are irreversible, permission/auth requirements, and other side effects, so it does not fully carry the behavioral burden.
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 compact and front-loads the task/peer context before enumerating states. The single long sentence with nested parentheticals is dense and slightly harder to scan, so it is good but not maximally clear.
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 five-parameter mutation tool with an output schema and no annotations, it covers purpose and the important interaction modes. It still leaves the agent to infer sibling-tool routing and task lifecycle constraints, so it is strong but not 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 coverage is already high at 80%, so the baseline is 3, but the description adds cross-parameter meaning by linking wait_seconds to input-required and emphasizing that all questions belong in a single message. It also clarifies the purpose of each state, though task_id is left obvious from the schema.
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 the resource (work you accepted) and the concrete state-based actions (post progress, ask, finish, give up, decline), so it is more than a restatement of update_task. It does not explicitly contrast with siblings such as reply or cancel_task, which keeps it from 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?
It gives clear context for each state value, including when to use working, input-required, completed, failed, or rejected, so invocation is reasonably guided. However, it does not say when to use update_task rather than reply, accept_task, cancel_task, or other siblings, and offers no exclusions.
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.
13 tool updates
v0.1.2- First observed
accept_task - First observed
cancel_task - First observed
delegate - First observed
delete_session - First observed
get_delegated_task_updates - First observed
get_task_full - First observed
list_accepted_tasks - First observed
list_available_tasks - First observed
list_delegated_tasks - First observed
list_peers - First observed
reply - First observed
start_session - First observed
update_task
TDQS
Scored across 13 tools
Most tools have distinct purposes, and the accepted-vs-delegated direction is well explained, especially for update_task versus reply. Minor overlap remains among get_delegated_task_updates, get_task_full, and list_delegated_tasks, but descriptions distinguish incremental waiting, full catch-up, and listing.
The set mostly follows a predictable snake_case verb_noun pattern: accept_task, cancel_task, delete_session, get_*, list_*, start_session, update_task. The bare verbs reply and delegate are minor deviations but remain understandable.
With 13 tools, the surface is well scoped for multi-agent task delegation, session management, and peer coordination. Each tool covers a distinct lifecycle or discovery operation, and the count stays within a reasonable range.
The set covers peer discovery, session creation/deletion, task delegation, acceptance, updates, messaging, cancellation, and completion/failure. Minor gaps exist around listing or inspecting sessions and possibly viewing task details before acceptance, but core workflows are covered.
Maintenance
Related MCP Connectors
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
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.
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA local MCP server that connects AI coding agents (Claude Code, Codex, Cursor, etc.) on the same machine via a shared message bus, enabling them to chat, delegate tasks, and collaborate privately without cloud or internet.39 npm25MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables Claude Code to communicate with other Claude Code agents over HTTP, allowing users to ask questions about remote codebases or delegate coding tasks.MIT
- AlicenseAqualityAmaintenanceLocal-first shared memory and task coordination for AI coding agents. One Go binary, MCP server, markdown files you own. Hooks for Claude Code and Codex CLI (and their desktop apps).306MIT
- AlicenseAqualityDmaintenanceEnables multiple coding agents (Claude Code, Codex, Cursor) to discover each other's sessions, search transcripts, ask questions, and handoff tasks through a shared MCP server.52 npmMIT