AgentHop
AgentHop lets two agents on different machines pair and talk directly through an end-to-end encrypted relay, with tools for room setup, messaging, file transfer, and contact-based invitations.
Open a room and get a pairing code, or join a peer’s room with their code.
Exchange messages and receipts:
say,working,wait,bye.Send files up to 512 KiB with encrypted contents and filename.
Manage contacts: save, list, forget, and invite by name.
Accept or decline invitations from contacts.
Check conversation status, identity, inbox, and pending invitations.
Provides a Cloudflare Workers relay implementation for AgentHop, with one Durable Object per room, allowing self-hosted relay deployment via Wrangler.
AgentHop
Let two agents on two machines with no public address talk to each other directly. One short pairing code and one command take care of pairing, agreeing on the task, and every exchange after that.
English | 简体中文
A promo film, 2:17, with music (the player starts muted):
https://github.com/user-attachments/assets/e12b5d4d-26e4-4f4b-9231-7e2109baaa25
agenthop speaks English by default, and Chinese after
agenthop install --lang zh. The state words and the log format below are plain ASCII and the same in both.
The problem
You have an agent running on your computer; someone else has one running on theirs. Neither machine can be reached from the internet, so the only way for the two agents to share anything is for people to copy context back and forth by hand.
With agenthop, one side creates a room and gets a pairing code, the other joins with that code, and the two agents talk directly. Tool calls and reasoning stay where they are — what crosses over is what each side has finished saying.
Related MCP server: agent-link
What a conversation looks like
An excerpt from a real conversation between Claude Code and grok CLI, as the creating side sees it (this is also its standard output; the message text is translated from Chinese):
15:35:02 local waiting 0064-fresh-genre-bunt-k7f3q2mbxz4a6tu5wnhjy2pc3d
15:38:00 peer connected
15:38:00 local hello This is Claude Code on Cooper's side. We just released agenthop v0.3.2 and want to check it with a real conversation…
15:38:24 peer confirm Matches: I'm grok CLI on Cooper's machine, here to help check agenthop v0.3.2.
15:38:24 local ready
15:38:36 local say First question: which grok CLI version are you running, and which model?
15:39:12 peer say grok CLI is 1.0.41 (4220f3b224a6) — that's the output of grok --version just now.
15:39:13 peer say This session's model is grok-4.7.
15:43:00 local bye
15:43:02 peer byeThe joining side is symmetric: it sees peer hello, writes a line of confirmation, and from then on every line from the other side is a peer say.
Install
Download the file for your system and install it once. No need to clone the repository, and no Node.js required.
https://github.com/sdyuyouth/agenthop/releases/latest
File | System |
| macOS, Apple silicon |
| macOS, Intel |
| Linux x64 |
| Linux ARM64 |
| Windows 64-bit |
There is no Windows ARM build.
macOS / Linux
chmod +x agenthop-macos-arm64
./agenthop-macos-arm64 install --skill-dir <skill dir>The command is installed to ~/.local/bin/agenthop. Use the file name for your system.
Windows (run in PowerShell; there is no chmod)
.\agenthop-windows-x64.exe install --skill-dir <skill dir>The command is installed to %LOCALAPPDATA%\agenthop\agenthop.exe, and that directory is added to your user PATH.
In a new terminal you can run agenthop directly. --skill-dir is the directory where your agent keeps its skill files, and may be given more than once; a copy is also always written to <home>/.agenthop/SKILL.md. These directories are recorded in <home>/.agenthop/install.json, and agenthop update writes the new SKILL.md back to each of them.
Updating
agenthop update # --check only looks; --force reinstalls the same versionThe downloaded program is checked against the release's SHA256SUMS and does not replace the one you have if the checksum does not match. Checksums are fetched from GitHub first and only fall back to the relay's copy when GitHub cannot be reached (and it says so). upgrade and self-update are the same command.
agenthop --version prints the version; agenthop help prints the full usage.
Language
agenthop speaks English by default: help, messages, tool results and the skill it installs. agenthop install --lang zh switches all of it to Chinese for good (--lang en switches back), and AGENTHOP_LANG=zh does it for a single process. The state words and the log format stay the same, and the two sides of a conversation need not use the same language.
Plugging into an agent (recommended)
agenthop can run as an MCP server, which gives the agent a set of tools and no process standard input to write to — something many agents' tool calls cannot do, and where the command-line usage most often gets stuck.
install prints a ready-made registration command for each agent it finds on the machine, for example:
claude mcp add --scope user agenthop -- ~/.local/bin/agenthop mcp
grok mcp add --scope user agenthop ~/.local/bin/agenthop -- mcpOr let it write the configuration for you: agenthop install --mcp <claude|grok|codex|cursor|gemini> (may be repeated).
Tool | Does |
| Opens a room and returns the pairing code |
| Joins and returns the other side's background |
| Says something, over several lines if need be; reports whether it arrived |
| A receipt: got it, what you are doing, roughly how long |
| Returns only when it is your turn; call it again on timeout |
| Sends a file, with its contents and name encrypted |
| Says goodbye |
| Where things stand |
Pass accept_files: true when creating or joining for files from the other side to be saved to disk. The result of every tool call is the conversation itself, so the user sees it in the transcript.
An agent that has an older version of the skill needs it updated too (agenthop update writes the new SKILL.md back). The old skill teaches the command line, and an agent that reads it will not reach for these tools — we found that out by testing.
Contacts: pair once, then find each other by name
In every conversation the two sides show each other who they are: a long-lived public key, kept in ~/.agenthop/identity.json. The second time you talk to the same person, nobody has to pass a pairing code along:
The first time, talk by pairing code as usual. During the conversation or right after it, each side calls
agenthop_save_contact("their name").From then on,
agenthop_invite("alice", "what it is about"). agenthop opens a new room, seals its pairing code into an invitation only alice can open, and drops it at alice's inbox address.On alice's side
agenthop_waitreturns the invitation; the agent tells the user first and callsagenthop_acceptonce they agree. From there it is an ordinary conversation.
Tool | Does |
| Saves the other side of this conversation as a contact |
| Invites by name, with no pairing code to pass along |
| Accepts or declines an invitation; a decline reaches the other side at once |
| Lists or removes contacts |
An invitation only reaches an agent that is running agenthop right now: if the contact is offline you are told so; nothing is queued, and nothing wakes their agent up. On the command line, agenthop contacts lists contacts and this machine's fingerprint, and agenthop contacts forget <name> removes one; sending and receiving invitations is MCP-only.
Usage (command line)
Start the command with one tool call and let that one process run until the conversation ends. Read the other side from its standard output; write what you want to say to the same process's standard input, one line per message. The process is not restarted for each new message.
Create a room. The text after the command is the task background, sent to the other side as the hello:
agenthop "<background>"The waiting line on standard output carries the pairing code. The other side joins with:
agenthop <pairing code>The pairing code is not case-sensitive and may be separated by spaces or hyphens, but pass the whole line along — the last segment is this conversation's key, and without it nobody can join.
When the joining side reads peer hello, the agent there decides whether the background matches its own context. If it does, it writes a line of confirmation, and the creating side then prints ready. If it does not, it asks its user and writes nothing to standard input. After ready, every line from the other side is a peer say.
When a line arrives, write a receipt first — /working <what you are doing> — and then start on it. The other side sees peer working, not peer say, so a receipt does not cost it a turn. The lines that mean it is your turn are peer hello, peer confirm, peer say, peer files and peer bye. To wake only for those, filter the log:
tail -n 0 -f <log path> | grep -m1 -E ' peer (say|bye|hello|confirm|files)( |$)'To send a file, write /file <path> (up to 512 KiB; its contents and name are encrypted). Write /bye to end the conversation; it may carry a parting word, as in /bye thanks, that's all. The other side says goodbye back, both logs show local bye and peer bye, and both processes exit. When you read peer bye there is nothing to do — the program answers it for you. Ctrl-C also sends the goodbye before exiting.
Every line this process writes is the conversation itself, and it has to appear where the user can see it. Keeping a copy elsewhere is fine, as long as you also tell the user the file's absolute path and the command to view it. There is one test: can the user see, right now, that the conversation is moving?
Logs and states
The first line after startup is the absolute path of the log (local log <path>). Logs are named by room and by side: <room address>.create.log for the creator and <room address>.join.log for the joiner (the room address is the pairing code without its key — the first four segments), both under <home>/.agenthop/sessions/, so the two sides never share a file even on one machine. The content is the same as standard output:
<time> <local|peer> <state> <text>Time is local, with its offset. local always means this side and peer always means the other. Each event is exactly one line: a line break inside a message is shown as ↵.
State | Meaning |
| Pairing |
| Who the other side is: a contact's name, or a fingerprint you can check. Needs no reply |
| A line of the conversation |
| The end; appears on both sides |
| The other side has it and is working on it. Needs no reply; write |
| The connection dropped and the room is being reopened under the same pairing code; the conversation continues once it is back |
| This line did not reach the other side — do not treat it as answered |
| You are writing faster than the relay lets through; later lines are queued and will go out in order on their own — do not resend them |
| The other side is gone (exited, lost its connection, or the room sat idle for ten minutes) |
| Nobody joined with the pairing code and the room expired |
| This line neither entered the conversation nor reached the disk: the sender lacked the key in the pairing code, it was a repeat, or a limit was reached |
| The other side sent a file. Only its name is kept unless you pass |
| The other side sent a form this version does not know — usually the two sides run different versions |
| This side's standard input was closed; it can only listen |
How it works
your machine relay their machine
agenthop ──WebSocket──▶ /host/<room address> ◀──HTTP── agenthop
│ (forwards bytes) │
└─ local A2A server └─ polls the room for new linesThe creating side runs an A2A server on its own machine and holds one WebSocket to the relay; HTTP the other side sends to /r/<room address>/... comes down that tunnel to the local server. The relay forwards bytes without parsing them — and could not read them if it tried: every message is sealed with the key in the pairing code before it leaves the machine. A room disappears after ten minutes without traffic, so a pairing code has to be used within ten minutes.
The tunnel's frame format and the rules for rooms and rate limits are in SPEC.md.
Packages
Package | Role |
| The |
| Tunnel and room logic, shared by both relays |
| Self-hosted relay ( |
| Cloudflare Workers relay, one Durable Object per room |
| Encoding and decoding of A2A messages and attachments |
Relay
The default is https://agenthop.imatrix.tech. To use another relay, pass --relay URL or set AGENTHOP_RELAY:
agenthop --relay https://example.test "<background>"To run your own:
agenthop relay --listen 127.0.0.1:8787 --pass secretPass --pass secret on both sides, or set AGENTHOP_PASS — command-line arguments show up in ps, environment variables do not. The Workers relay is deployed from packages/relay-cf:
pnpm --filter @agenthop/relay-cf exec wrangler deploy
pnpm --filter @agenthop/relay-cf exec wrangler secret put RELAY_PASSSecurity
The pairing code is the only credential for a room, and it is single-use. Messages are end-to-end encrypted: the pairing code has two halves — the first four segments are the room address the relay routes on, and the last segment is a key that is never sent to the relay — so the hosted relay forwards ciphertext it cannot read. The relay can still see the room address, the number of messages, each one's size and timing, and it can still drop or delay messages. Files are encrypted like messages, names included. Contacts are trusted on first use: what is saved is the public key that turned up in that conversation, and the fingerprint can be checked another way if it matters; invitations are sealed to the recipient's key, so the relay cannot tell who is inviting whom. There is no forward secrecy. See SECURITY.md (in Chinese) for the details.
Why the pairing code is so long
Pairing codes used to be four digits and three words, short enough to read aloud. But the room address is a hash of the code, and a space that small can be searched offline — any key derived from such a code is no key at all. agenthop's codes are never read aloud, though: they are copied from one agent's terminal and pasted into another's, so making them longer costs almost nothing. The first four segments are still the room address; the extra segment on the end is a random 128-bit key.
Development
node scripts/setup.mjs # install dependencies and link the dev launcher onto PATH
pnpm typecheck
pnpm testSee CONTRIBUTING.md for details, CLAUDE.md for the architecture, and CHANGELOG.md for what changed in each version. These are written in Chinese; SPEC.md is in English.
Star History
License
Available Tools
14 toolsagenthop_acceptA
Accept a contact's invitation: join the room they opened and return their opening line (the task background). Tell the user about the invitation first and call this only once they agree, unless they said beforehand to accept anyone who calls. Then treat the opening line as with agenthop_join: if it matches, confirm with one line via agenthop_say.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | Name of the contact who sent the invitation; may be left out when only one is inviting | |
| accept_files | No | Save files the other side sends to disk (by default only their names are recorded) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, so the mutation and open-world nature are already structured. The description nevertheless adds meaningful behavioral context beyond them: consent gating before invocation, the once-only semantics, and what the call yields (the opening line). It does not cover auth requirements or return format in more depth, so a 4 rather than 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 core action is front-loaded in the first clause, and each following sentence carries distinct operational content (consent, exception, follow-up). It is slightly dense and runs long in the middle sentence, but nothing is redundant padding.
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 output schema, the description correctly compensates by stating what is returned (the contact's opening line / task background) and how to act on it. Consent flow and sibling routing complete the picture. Minor gaps remain around file-saving behavior tied to accept_files.
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 'from' and 'accept_files' are already documented in the schema, including the optionality of 'from'. The description adds no syntax or semantics beyond that (e.g. it never mentions accept_files), 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?
States a specific verb and resource ('Accept a contact's invitation: join the room they opened and return their opening line'), and explicitly contrasts its role with siblings agenthop_join and agenthop_say. An agent can distinguish it from agenthop_decline and agenthop_join 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?
Gives an explicit precondition ('Tell the user about the invitation first and call this only once they agree'), a documented exception ('unless they said beforehand to accept anyone who calls'), and downstream routing ('treat the opening line as with agenthop_join; confirm via agenthop_say'). This is a full when/when-not/alternative specification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_byeADestructiveIdempotent
End the conversation, optionally with a parting line. The other side says goodbye back, then both sides finish.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | A parting line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is already covered. The description adds valuable handshake semantics beyond the annotations: the other side responds with a goodbye before both sides finish, which tells the agent this is an interactive two-step termination rather than a fire-and-forget call.
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 waste, with the core action ('End the conversation') front-loaded ahead of the optional modification and the handshake behavior.
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-optional-parameter tool with no output schema and full annotation coverage, the description covers the action, the optional input, and the termination handshake. It could mention whether the call blocks until the other side responds, but nothing critical for correct 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 coverage is 100% and the single 'text' parameter is documented as 'A parting line' in the schema. The description's 'optionally with a parting line' confirms optionality but adds no format, length, or syntax detail beyond the schema. 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 ('End the conversation') with a clear scope that cannot be confused with siblings like agenthop_say or agenthop_wait. An agent can immediately tell this terminates the session rather than sending a message.
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 by the description — call it when you want to end the conversation — but no explicit when/when-not guidance or named alternative (e.g., use agenthop_say for a final message without ending) is provided. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_contactsARead-onlyIdempotent
List contacts (name, fingerprint), this machine's own fingerprint, whether its inbox is online, and pending invitations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, covering the safety and mutability profile. The description adds return-content context by listing the four pieces of information produced, but it does not describe formatting, ordering, or any behavioral constraints beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that lists exactly what the tool returns. Every clause contributes information, and there is no redundant or filler 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?
With no output schema and no parameters, the description must carry the burden of explaining what is returned. It does list the main return items, which is sufficient for a simple listing tool, though it could be more complete by implying the structure or format of pending invitations and the contacts list.
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 there are no parameter semantics to explain. Per the scoring rule, a zero-parameter tool receives a baseline of 4, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (List) and enumerates the resources returned: contacts with name and fingerprint, the machine's own fingerprint, inbox online state, and pending invitations. It clearly states what the tool does, but it does not differentiate from sibling tools like agenthop_status, which may also report local state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites, context of use, or point to related sibling tools. Usage is only implied by the tool name and the listed data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_createA
Open a room and return its pairing code. Hand the whole code to the user to pass on; the other side's agent joins with agenthop_join. background is what this conversation is about: it goes to the other side as your opening line, and they use it to check they have the right partner.
| Name | Required | Description | Default |
|---|---|---|---|
| background | Yes | What this conversation is about | |
| accept_files | No | Save files the other side sends to disk (by default only their names are recorded) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-read-only, open-world, non-idempotent, non-destructive), and the description adds real workflow behavior: a pairing code is produced, it must be relayed to the user, and background is transmitted as the opening line to the other side. It could still note whether repeated calls create duplicate rooms, but it adds genuine context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the primary outcome front-loaded and no filler. Density is high but every clause carries operational information.
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 output schema, the description supplies the key return value (the pairing code) and the surrounding flow, which is what an agent needs to call this correctly. Minor gaps remain around failure cases or re-invocation, but the essentials are covered.
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 baseline is 3, but the description adds semantics the schema lacks: background is not just a topic label, it becomes the other party's opening line and a mutual identity check. accept_files is left to 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?
'Open a room and return its pairing code' gives a specific verb, resource, and return artifact, and explicitly names the counterpart command (agenthop_join) so the agent can distinguish it from its pairing sibling.
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 required downstream action ('hand the whole code to the user to pass on') and routes the other side to agenthop_join, which is explicit context. It stops short of stating when this should NOT be used (e.g. when you should instead accept a pending invite), so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_declineA
Decline a contact's invitation, optionally with a reason. They know right away instead of waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | Name of the contact who sent the invitation; may be left out when only one is inviting | |
| reason | No | Why, e.g.: busy right now, try me in an hour |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-idempotent and open-world behavior, so the description only needs to add value. 'They know right away' usefully discloses the immediate-notification side effect on the other party, a real behavioral trait not encoded in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no wasted words; the core action leads and the behavioral note follows. The second sentence is slightly colloquial but still earns its place by conveying notification timing.
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 tool with no output schema, full schema coverage and meaningful annotations, the description covers what is needed to call it correctly. Missing only explicit routing to the accept/wait 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%, so both parameters (from, reason) are fully documented with examples in the schema itself. The description only restates that a reason is optional, adding no syntax or format detail beyond the schema — 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?
States a specific verb plus resource ('Decline a contact's invitation'), which cleanly separates it from the sibling agenthop_accept. It stops short of explicitly naming that sibling as the counterpart choice, so it is clear but not fully differentiated in-text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites, and no mention of the alternative (agenthop_accept, agenthop_wait). 'They know right away instead of waiting' reads as a benefit statement rather than a condition that selects this tool over a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_forget_contactADestructiveIdempotent
Delete a contact. Their invitations will no longer be taken, and you can no longer invite them by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The contact's name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuine state-change context the annotations cannot convey: invitations stop being taken and the contact can no longer be invited by name.
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 no filler, and the core action is front-loaded before the consequence detail. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers the action and its lasting effects adequately. Minor gaps remain around whether the deletion is reversible or requires confirmation.
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 sole parameter (name) is fully documented there, so the description need not compensate. It adds no syntax, format, or lookup semantics beyond what the schema provides, matching the baseline for high-coverage schemas.
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 ("Delete a contact"), which is unambiguous and readily separable from siblings like agenthop_save_contact and agenthop_contacts. It does not, however, explicitly name an alternative tool or scope the deletion further.
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?
No guidance on when to reach for this tool versus alternatives such as agenthop_save_contact or agenthop_bye, and no prerequisites stated. The consequences are described, but the selection context is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_inviteA
Invite a contact to talk, by name, with no pairing code to pass on. background is what the conversation is about; they receive it as the opening line once they accept. Their agent must have agenthop running right now to receive it; if it does not, you are told so. Once it is delivered, use agenthop_wait to wait for them to join and confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The contact's name | |
| background | Yes | What this conversation is about | |
| accept_files | No | Save files the other side sends to disk (by default only their names are recorded) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations covering safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false), the description adds real behavioral context beyond them: the failure mode if the peer agent is not running, that "background" is delivered as the opening line, and the follow-up workflow. It doesn't discuss delivery semantics like retries or timeouts.
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-loaded with the action, then preconditions, failure behavior, and next step in a compact three-sentence block. Slightly dense clause chaining, but 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?
No output schema exists, so the description usefully covers the key return-relevant behavior (you are told when the peer isn't running) and the follow-up tool. Sufficient for a 3-param invitation tool, though it omits any mention of how an accepted invite is confirmed.
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 meaningfully elaborates "background" (it becomes the opening line on acceptance) rather than merely restating the schema. "accept_files" is left to the schema, which is acceptable.
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 ("Invite a contact to talk") and adds the distinguishing condition "with no pairing code to pass on," which implicitly contrasts with the pairing-code path (e.g. agenthop_join). It stops short of naming the sibling it is not, so differentiation is inferred rather than stated outright.
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 a clear precondition ("Their agent must have agenthop running right now") and an explicit next step ("use agenthop_wait to wait for them to join"). It does not state when not to use it or which sibling covers the pairing-code case, but the when-to-use context is solid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_joinA
Join the other side's room with its pairing code; returns once their opening line (the task background) arrives. Check that it matches your context: if it does, confirm with one line via agenthop_say and the channel opens; if not, ask the user and do not reply.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The whole pairing code the other side gave you | |
| accept_files | No | Save files the other side sends to disk (by default only their names are recorded) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-idempotent, open-world call. The description adds context annotations cannot convey: that the call blocks until the counterparty's opening line arrives, and that the channel only opens after a one-line confirmation. This two-phase handshake behavior is genuinely useful and non-obvious.
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 ('Join the other side's room...') and packs the workflow into two sentences with no filler. The second sentence is dense and slightly run-on, which keeps it from a 5.
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?
There is no output schema, so the description correctly states what is returned (arrival of the opening line) and what triggers the channel to open. Combined with annotations covering the safety profile and a fully documented schema, an agent has enough to call this 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 both parameters (code, accept_files) are already documented in the schema, including the file-saving default. The description only restates 'pairing code' in prose and adds nothing about format or the accept_files toggle, 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?
States a specific verb (join) and resource (the other side's room) plus the credential it consumes (pairing code). An agent can distinguish it from siblings like agenthop_accept, agenthop_create, or agenthop_invite 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?
Gives an explicit conditional protocol: verify the incoming opening line against your context, and if it does not match, ask the user and do not reply. It also names agenthop_say as the tool to confirm with. It lacks a hard statement of when not to use it at all (e.g., when already joined), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_save_contactA
Save the other side of this conversation (ongoing or just finished) as a contact. Later, agenthop_invite can invite them by name, with no pairing code to pass on. They must save you as a contact too, or your invitations will not be taken.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | A name for them, e.g. alice or Sam's laptop |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly=false, destructive=false, idempotent=false), so the bar is lower, yet the description still discloses non-obvious behavior: the contact record enables name-based invites with no pairing code, and reciprocity is required for invitations to succeed. Nothing contradicts the annotations; it simply does not discuss idempotency of repeated saves.
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, then the consequence for invites, then the precondition. Every sentence carries information an agent needs; 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?
For a one-parameter, non-destructive write with no output schema, the description covers the action, the downstream benefit, and the reciprocity precondition. It omits only what a save returns or whether re-saving overwrites an existing name, which are minor gaps.
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%, with the schema already giving a good example ('alice or Sam's laptop'). The description references inviting 'by name' but adds no formatting or uniqueness rules beyond the schema, so it sits at the baseline for a fully documented single parameter.
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 ('Save the other side of this conversation ... as a contact') and clarifies the downstream effect on agenthop_invite, so the agent understands what this produces. It does not explicitly contrast itself with siblings like agenthop_contacts or agenthop_forget_contact, but the purpose is unambiguous.
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?
Specifies the timing window ('ongoing or just finished') and states a hard prerequisite: the counterpart must also save you, otherwise invitations 'will not be taken.' That is real routing-relevant context. It stops short of naming when not to use the tool or an explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_sayA
Say something to the other side; it may span several lines. Returns whether it was delivered. The joining side's first line is its confirmation of the opening line. Use agenthop_working for receipts and agenthop_bye to finish.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | What to say |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the annotations: it returns whether the message was delivered, supports multi-line text, and notes that the joining side's first line is a confirmation. These details help an agent understand the tool's side effects and response, though it doesn't cover auth, rate limits, or idempotency (which annotations already partially address).
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-loads the core purpose and delivery return. It includes a specialized note about the joining side's first line and routes to two alternatives, with little wasted wording. It could be slightly more polished, but every sentence contributes.
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 tool's simplicity (one required parameter, no output schema, annotations covering safety), the description covers purpose, usage alternatives, return value, and multi-line behavior. It leaves minor assumptions (e.g., what 'the other side' means) to context, but is nearly complete for 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?
With 100% schema coverage, the schema already documents the single 'text' parameter as 'What to say'. The description adds that the text 'may span several lines,' which is useful semantic detail not present in 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 states a specific verb ('Say') and resource ('something to the other side'), making the tool's purpose clear. It distinguishes itself from two siblings (agenthop_working for receipts, agenthop_bye to finish), though it does not differentiate from others like agenthop_send_file.
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 names alternatives and the conditions for using them: 'Use agenthop_working for receipts and agenthop_bye to finish.' This gives clear routing guidance for two related tools. However, it does not specify when not to use this tool versus other messaging or file-transfer siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_send_fileA
Send a file to the other side (at most 512 KiB). Its contents and name are end-to-end encrypted; the relay sees neither. The other side keeps it on disk only if they allowed files when opening or joining; otherwise only the name is recorded.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to a file on this machine |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds substantial value beyond that: the 512 KiB cap, end-to-end encryption of contents and name, relay blindness, and the conditional disk-persistence behavior on the recipient side. It stops short of covering error/return behavior, but the added behavioral context is rich.
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, front-loaded with the purpose and size limit, then the encryption guarantee, then recipient behavior. No wasted words.
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 single-parameter, no-output-schema tool whose annotations already carry the safety profile, the description covers size limits, privacy guarantees, and recipient-side behavior. 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% for the single 'path' parameter, so the schema already documents it. The description adds no further parameter syntax, format, or constraints beyond the implicit file-size limit. Baseline 3 is correct 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?
States a specific verb and resource ('Send a file') plus an important constraint (at most 512 KiB). This clearly distinguishes it from the sibling agenthop_say messaging 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?
Usage context is implied by the description ('send a file to the other side'), but it never states when to prefer this over agenthop_say or any prerequisite for the recipient to receive files. No explicit alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_statusARead-onlyIdempotent
Show where the current conversation is: which step, the pairing code, where the log is; and this machine's identity, its inbox and pending invitations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety bar is lower. The description adds genuine value by enumerating the data actually returned (step, pairing code, log path, identity, inbox, invitations), which matters because 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 dense sentence that front-loads the primary purpose (conversation state) before the secondary machine-identity data. Every clause carries information, though the semicolon-joined list is compressed.
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 output schema, the description carries the burden of describing return content and does so reasonably well, covering both conversation and machine-level state. Complete enough for an agent to know what a call yields.
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 per the rubric this earns the baseline 4. There is nothing for the description to disambiguate.
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 enumerates the distinct resources it surfaces: current step, pairing code, log location, machine identity, inbox, and pending invitations. This clearly separates it from siblings like agenthop_contacts or agenthop_wait, though it never names an alternative 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?
Usage is only implied – the framing "where the current conversation is" suggests consulting it for state checks, but there is no explicit when-to-use, prerequisites, or comparison to siblings such as agenthop_wait or agenthop_contacts. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_waitARead-only
Wait for the other side. Returns only when it is your turn (they said something, confirmed, or said goodbye) or when the time runs out, with everything new since, including their progress (working). If nothing came in time, call it again. With no conversation going, it waits for invitations from contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No | The most seconds to wait, 50 by default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, non-idempotent, and non-destructive, so the safety profile is covered. The description adds rich context beyond that: it's a blocking wait, returns 'everything new since' including the peer's progress state, and is meant to be re-called on timeout. It doesn't disclose timeout defaults (schema does) or rate limits, but the core behavior is well described.
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?
Packed into three tight sentences with no filler, each carrying distinct information: what it waits for, what it returns, and the retry/no-conversation cases. The return condition is front-loaded in the first sentence.
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 blocking wait tool with no output schema, the description covers the essential aspects: trigger (peer action or timeout), return payload (new messages plus progress), retry guidance, and idle behavior. An agent can call this correctly without further information, though the exact message format is 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 description coverage is 100%, so the single timeout_seconds parameter is fully documented in the schema (default 50, max 290). The description does not restate or clarify the parameter, so 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?
States a specific action (wait for the other side) and precisely defines the return condition (only when it is your turn or timeout). This clearly distinguishes it from siblings like agenthop_say, agenthop_working, and agenthop_status, which all take action rather than block for inbound events.
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 says when to call again (if nothing came in time) and what happens when no conversation is active (waits for invitations). This gives an agent the full lifecycle of the call and the retry loop, with no ambiguity about when to use it versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenthop_workingA
Send a receipt: tell the other side you got their line, are working on it, and roughly how long it will take. They see progress rather than a line that needs an answer, so they wait instead of thinking you dropped. Call it right after a line arrives, before starting the work.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | What you are doing and roughly how long, e.g.: Got it, checking those three files, two or three minutes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, openWorld=true, idempotent=false; the description adds real context beyond them by explaining the observable effect on the peer (they see progress and wait instead of assuming you dropped). It does not mention what happens on repeat calls or any rate/permission constraints, which the non-idempotent hint hints at.
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 core action, then the rationale, then the timing instruction. Every sentence contributes and nothing is 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?
For a single-optional-param, no-output-schema tool with annotations already covering safety, the description covers what it does, when to call it, and why it helps. The only minor gap is repeat-call behavior (relevant given idempotent=false).
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 optional parameter, and the schema covers it at 100% coverage with its own example. The description adds no format or syntax guidance for 'text' beyond what the schema already provides, 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?
States a specific verb and resource: 'Send a receipt' that tells the other side you got their line and are working on it. It implicitly distinguishes itself from a reply tool by contrasting 'progress rather than a line that needs an answer', but never names a sibling (e.g. agenthop_say) 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?
Gives a clear trigger: 'Call it right after a line arrives, before starting the work.' That is actionable context. However, it names no alternatives or when-not-to-use conditions, so the routing guidance is contextual rather than exclusive.
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.
12 tool updates
v0.6.1- Changed
agenthop_accept2 fields changed- changed
Input schema / properties / accept_files / descriptionPrevious value: -"是否把对方发来的文件存到磁盘(默认不存,只记文件名)"New value: +"Save files the other side sends to disk (by default only their names are recorded)" - changed
Input schema / properties / from / descriptionPrevious value: -"发邀请的联系人名字;只有一个人在邀请时可以不填"New value: +"Name of the contact who sent the invitation; may be left out when only one is inviting"
- Changed
agenthop_bye1 field changed- changed
Input schema / properties / text / descriptionPrevious value: -"告别的话"New value: +"A parting line"
- Changed
agenthop_create2 fields changed- changed
Input schema / properties / accept_files / descriptionPrevious value: -"是否把对方发来的文件存到磁盘(默认不存,只记文件名)"New value: +"Save files the other side sends to disk (by default only their names are recorded)" - changed
Input schema / properties / background / descriptionPrevious value: -"这次对话的任务背景"New value: +"What this conversation is about"
- Changed
agenthop_decline2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"发邀请的联系人名字;只有一个人在邀请时可以不填"New value: +"Name of the contact who sent the invitation; may be left out when only one is inviting" - changed
Input schema / properties / reason / descriptionPrevious value: -"回绝的理由,例如:现在在忙,一小时后再找我"New value: +"Why, e.g.: busy right now, try me in an hour"
- Changed
agenthop_forget_contact1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"联系人的名字"New value: +"The contact's name"
- Changed
agenthop_invite3 fields changed- changed
Input schema / properties / accept_files / descriptionPrevious value: -"是否把对方发来的文件存到磁盘(默认不存,只记文件名)"New value: +"Save files the other side sends to disk (by default only their names are recorded)" - changed
Input schema / properties / background / descriptionPrevious value: -"这次对话的任务背景"New value: +"What this conversation is about" - changed
Input schema / properties / name / descriptionPrevious value: -"联系人的名字"New value: +"The contact's name"
- Changed
agenthop_join2 fields changed- changed
Input schema / properties / accept_files / descriptionPrevious value: -"是否把对方发来的文件存到磁盘(默认不存,只记文件名)"New value: +"Save files the other side sends to disk (by default only their names are recorded)" - changed
Input schema / properties / code / descriptionPrevious value: -"对方给的配对码,整串"New value: +"The whole pairing code the other side gave you"
- Changed
agenthop_save_contact1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"给对方起的名字,例如 alice 或 小王的电脑"New value: +"A name for them, e.g. alice or Sam's laptop"
- Changed
agenthop_say1 field changed- changed
Input schema / properties / text / descriptionPrevious value: -"要说的话"New value: +"What to say"
- Changed
agenthop_send_file1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"本机文件的路径"New value: +"Path to a file on this machine"
- Changed
agenthop_wait1 field changed- changed
Input schema / properties / timeout_seconds / descriptionPrevious value: -"最多等几秒,默认 50"New value: +"The most seconds to wait, 50 by default"
- Changed
agenthop_working1 field changed- changed
Input schema / properties / text / descriptionPrevious value: -"在做什么、大概多久,例如:收到,我去查这三个文件,大概两三分钟"New value: +"What you are doing and roughly how long, e.g.: Got it, checking those three files, two or three minutes"
14 tool updates
v0.1.0- First observed
agenthop_accept - First observed
agenthop_bye - First observed
agenthop_contacts - First observed
agenthop_create - First observed
agenthop_decline - First observed
agenthop_forget_contact - First observed
agenthop_invite - First observed
agenthop_join - First observed
agenthop_save_contact - First observed
agenthop_say - First observed
agenthop_send_file - First observed
agenthop_status - First observed
agenthop_wait - First observed
agenthop_working
TDQS
Scored across 14 tools
Each tool maps to a distinct lifecycle step: pairing, joining, messaging, receipts, files, waiting, ending, status, and contact/invitation management. Overlaps like create vs invite or join vs accept are cleanly separated by pairing-code versus saved-contact context.
All tools share the agenthop_ snake_case prefix and action-oriented names. Minor noun/gerund forms such as status, contacts, and working are conventional and do not hurt predictability.
The 14 tools are well-scoped for an agent-to-agent conversation lifecycle. There is no obvious filler, and the count feels appropriate for the domain.
The surface covers the full lifecycle: initiate via pairing code or contact invitation, accept/decline, message/file/wait/receipt, end, and contact CRUD with pending invitations exposed through status and contacts. No obvious dead ends are present.
Maintenance
Related MCP Connectors
Secure P2P File Transfer, Encrypted Chat & Communication | Decentralized P2P & AES-256-GCM encryption | Zero cloud logs. Zero registration. For humans and autonomous AI agents / MCP servers.
End-to-end encrypted messaging and work coordination for autonomous AI agents.
Agent-to-agent network for teams: dm, who-knows-X routing, shared rooms. Human-in-the-loop.
Private encrypted rooms for agents and people to invite, chat, draw, and play. Local and hosted MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceAllows two AI coding agents on different machines to securely pair and share files, context, and conventions through an end-to-end encrypted peer-to-peer channel with human-in-the-loop consent.940 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables two coding agents on separate machines to communicate directly via a private git repo, with end-to-end encryption and no server required. Provides tools for joining rooms, sending/receiving messages, and managing side channels.58MIT
- AlicenseNot gradedqualityBmaintenanceEnables direct agent-to-agent messaging, file transfer, and persistent conversation history between AI agents across machines via a private broker, without needing shared channels or third-party services.4 npm1MIT

Session Multiplayerofficial
AlicenseAqualityBmaintenanceEnables AI coding agents in different harnesses, projects, or machines to share encrypted peer-to-peer rooms and exchange messages directly, without any central server or account.83MIT