MCP Agent Bus
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Agent Busask reviewer to review my latest commit and send results back"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Agent Bus
Agent Bus is Therapie Tech's first open-source software.
A local, event-driven MCP message bus for coordinating multiple AI coding-agent sessions on the same machine. One session can hand a task to another — the other runs it and sends the result back — with zero infrastructure: no cloud, no database, no network service. Just Node.js and the local filesystem.
Releases
This project is distributed via GitHub only (no hosted service). Install = clone + npm install + MCP setup — see Quick start.
Version | Highlights |
v1.1.0 (latest) | Monitoring dashboards ( |
First public release — MCP bus + Quick start |
Full history: CHANGELOG.md · All releases
Upgrade v1.0.0 → v1.1.0: git pull (or re-clone), npm install unchanged. New optional scripts under docs/; worker upgrade only affects you if you use the headless worker.
Related MCP server: AI Bridge MCP
Why
When you work with AI coding agents you often have several sessions open at once (different windows, different models). By default they can't see each other — you copy-paste between windows by hand. MCP Agent Bus gives them a shared "post office": any session can drop a message addressed to another, which picks it up instantly and replies.
How it works
Everything is local. The "post office" is just a folder of JSON files:
<MCP_AGENT_BUS_DIR>/
inbox/<session>/*.json # direct messages, one folder per session
broadcast/*.json # announcements to everyone
cursors/<session>... # per-session "already read" bookmarkOne MCP process per session, all sharing the same folder.
Atomic writes (temp file +
rename) so readers never see a partial file.Consume-once: reading an inbox removes the message.
Event-driven via
fs.watch(with a slow safety poll), so delivery is effectively instant and there's no busy-polling.
Requirements
Node.js >= 18 (
node -v)Cursor (or another MCP-capable client) with MCP enabled
Optional — headless worker only: Cursor CLI (
cursor-agenton yourPATH)
All sessions that should talk to each other must use the same MCP_AGENT_BUS_DIR (same mailbox folder on disk).
Quick start (Cursor, ~5 minutes)
1. Clone and install
git clone https://github.com/therapietech/mcp-agent-bus.git
cd mcp-agent-bus
./scripts/setup.shsetup.sh runs npm install, creates a local bus/ mailbox under this repo, writes project-local .cursor/mcp.json, and copies the always-on rule to .cursor/rules/mcp-agent-bus.mdc.
Check the server starts (optional):
npm test2. Reload Cursor
Open this folder (
mcp-agent-bus) in Cursor, or complete Use with your own project below if you work in another repo.Cursor Settings → MCP — confirm
mcp-agent-busappears (green / enabled).If you do not see it: Command Palette → “Developer: Reload Window”, then check MCP again.
3. Give each session a name
Every Cursor window is one “session”. Pick a short handle per window, e.g. backend and reviewer.
Tell the agent once per window, for example:
“On the agent bus, my session name is backend. Use that for
from/meon bus tools.”
The rule in .cursor/rules/mcp-agent-bus.mdc reminds the agent to ask if the name is not set.
Important: use different names in each window. Do not run a headless worker and interactive bus_receive on the same name (they share one inbox).
4. Smoke test (two windows)
Use the same workspace (same .cursor/mcp.json and same MCP_AGENT_BUS_DIR) in both windows.
Window | Session name | Example prompt |
A |
| “Call |
B |
| “Call |
Window B should return the JSON message. Then B can reply with bus_send(to="sender", from="reviewer", ...).
Quick check in either window: bus_list_sessions() — after traffic, you should see inbox folders for active names.
5. Optional — autonomous worker (terminal)
For a session that runs tasks without you in the loop, in a plain terminal (not inside the agent):
cd /path/to/mcp-agent-bus # or your project with WORKER_CWD set
MCP_AGENT_BUS_DIR="/path/to/mcp-agent-bus/bus" \
WORKER_CWD="/path/to/your/project" \
node src/worker.mjs reviewer --model <your-model>Requires cursor-agent installed and logged in. The worker runs prompts with --force (auto-approves tool actions) — only accept tasks from senders you trust.
Use with your own project
Most people keep coding in their app repo, not inside mcp-agent-bus. Point MCP at the cloned server and use one shared mailbox path everywhere.
Clone
mcp-agent-busonce, e.g.~/tools/mcp-agent-bus, and runnpm installthere.In your project, merge into
.cursor/mcp.json(keep your existing servers):
{
"mcpServers": {
"mcp-agent-bus": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/mcp-agent-bus/src/server.mjs"],
"env": {
"MCP_AGENT_BUS_DIR": "/ABSOLUTE/PATH/TO/mcp-agent-bus/bus"
}
}
}
}Use absolute paths. Every window that should share the bus must use the same MCP_AGENT_BUS_DIR.
Copy the rule into your project:
cp /ABSOLUTE/PATH/TO/mcp-agent-bus/examples/mcp-agent-bus.mdc \
/ABSOLUTE/PATH/TO/your-project/.cursor/rules/Reload Cursor and run the smoke test with two windows on your project folder.
Global MCP (all projects)
Alternatively, put the same mcpServers.mcp-agent-bus block in ~/.cursor/mcp.json and copy mcp-agent-bus.mdc to a location Cursor loads globally (or paste the rule into your user rules). Same rule applies: one shared MCP_AGENT_BUS_DIR for all participating sessions.
Manual install (no setup script)
git clone https://github.com/therapietech/mcp-agent-bus.git
cd mcp-agent-bus
npm installRegister the server using examples/mcp.json.template (replace <ABSOLUTE_PATH_TO_REPO> with your checkout path), then reload your MCP client.
Troubleshooting
Problem | What to try |
MCP server missing in Cursor | Reload window; check |
Messages never arrive | Both windows must share the same |
| Wrong session name ( |
Worker does nothing | Install CLI: |
Permission errors on | Ensure the mailbox directory exists and is writable ( |
Run npm test in the clone to verify the mailbox logic on your machine (no Cursor required).
Tools
Tool | Purpose |
| Send a direct message to another session's inbox. |
| Fetch & consume your messages; optionally block until one arrives. |
| Look at your inbox without consuming. |
| Post an announcement visible to all sessions. |
| Read announcements newer than your last read. |
| List sessions that currently have an inbox. |
Message shape
{
"id": "1725183600000-a1b2c3d4",
"type": "direct",
"to": "backend",
"from": "frontend",
"subject": "handoff",
"text": "please run the end-to-end tests",
"ts": "2026-09-01T10:00:00.000Z"
}Two ways to receive work
Interactive (human in the loop): your active session calls
bus_receive, you see the task, it's done with normal tools, and you reply withbus_send.Autonomous (headless worker): run
src/worker.mjsin a plain terminal. It watches an inbox and, for each task, runs a fresh headless agent (cursor-agent -p) and replies automatically:
MCP_AGENT_BUS_DIR="$PWD/bus" WORKER_CWD="$PWD" \
node src/worker.mjs backend --model <your-model>Safety: the worker runs tasks with
cursor-agent -p ... --force(auto-approves shell/file actions). Only run it for senders you trust. The agent command is configurable via theAGENT_CMDenv var.
Monitoring workers (optional)
When the headless worker runs with cursor-agent --output-format stream-json, it appends per-task metrics under $MCP_AGENT_BUS_DIR/run/ (default: <repo>/bus/run/):
Script | What it shows |
Live token dashboard (input/output/cache, per worker + total) | |
Prompt quality (TTFT, hedging %, interpretation overhead) | |
Multiplexed logs for all workers (macOS-compatible) |
cd /path/to/mcp-agent-bus
./docs/watch-usage.sh
./docs/watch-clarity.sh
./docs/watch-workers.shOptional offline LLM judge for clarity scores: AGENT_BUS_HOME="$PWD" node docs/prompt-clarity.mjs
Paths accept both MCP_AGENT_BUS_DIR (this repo) and AGENT_BUS_DIR (legacy env name used in some setups).
Configuration
Env var | Default | Meaning |
|
| Where the mailbox lives. |
| — | Convenience: each session's own name. |
| current dir | Working directory the worker runs tasks in. |
|
| The agent CLI the worker invokes. |
Development
npm test # unit tests (node:test), no external services
npm run lint # eslint (flat config)The core mailbox logic lives in src/mailbox.mjs and is
fully unit-tested in isolation; src/server.mjs is a thin MCP
wrapper around it.
Limitations
Single machine. It coordinates sessions on one host; it is not a cross-machine or team-wide bus.
One receiver per session name — don't run a headless worker and an interactive receive on the same name (they'd fight over the inbox).
Messages are consumed — for a durable record, pair the bus with a shared notes file.
License
Available Tools
6 toolsbus_broadcastBroadcast a message to all sessionsA
Post a message visible to every session via bus_read_broadcasts. Use for global announcements (e.g. "deploying now", "main is frozen").
| Name | Required | Description | Default |
|---|---|---|---|
| from | Yes | Your own session name | |
| text | Yes | Message body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the core action (broadcast to all sessions) and the read counterpart, but it does not mention whether messages are persistent, if there are limits, or what the return behavior is. For a simple fire-and-forget write, this is adequate but not deep.
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 two tight sentences, front-loading the action in the first sentence and providing a concrete use case in the second. There is no filler, and 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 simple 2-parameter tool with no output schema and no annotations, the description covers the purpose, target audience, and usage context. It does not mention response values or error cases, but these are unlikely to be critical for a broadcast operation and the tool's simplicity lowers the bar.
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 input schema already describes both parameters fully ('Your own session name' and 'Message body') with 100% coverage. The description adds no parameter-level nuance beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Post' and clearly defines the resource as 'a message visible to every session', which distinguishes it from the targeted bus_send and read-only siblings like bus_peek/bus_receive. The explicit mention of 'via bus_read_broadcasts' also anchors it in the API family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use for global announcements' and gives concrete examples ('deploying now', 'main is frozen'), which tells an agent exactly when to choose this tool. It does not name the targeted alternative (bus_send) or state when not to use it, but the global-announcement framing makes the intent clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_list_sessionsList sessions that have an inboxA
List known session names (those with an inbox directory).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 only sessions with an inbox directory are listed, which is a behavioral filter. However, it does not explicitly state that the operation is read-only, nor does it describe the return format or potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, no filler. Every word adds information, making it an efficient and well-structured description.
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, zero-parameter listing tool with no output schema, the description conveys what is listed and the defining criterion. It does not spell out the exact return shape or error behavior, but the complexity level makes this a minor gap.
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 input schema has zero properties, so there are no parameters to document. The description adds the only relevant semantic—the 'inbox directory' criterion—which provides enough meaning for a zero-parameter tool.
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 resource ('known session names') and adds the filter criterion '(those with an inbox directory)'. This clearly distinguishes it from sibling tools like bus_send and bus_receive, which handle messages rather than session enumeration.
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 does not explicitly name alternatives or exclusion conditions, but it gives clear context that this tool enumerates sessions rather than sending/receiving messages. The role in the bus tool family is self-evident, so an agent can infer when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_peekPeek inbox without consumingA
Return pending messages for your session WITHOUT removing them.
| Name | Required | Description | Default |
|---|---|---|---|
| me | Yes | Your own session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must convey all behavioral traits. It explicitly discloses the key non-destructive behavior ('WITHOUT removing them'), which is critical. However, it does not mention what happens if no messages are pending, or whether it returns a list or single message, but the main safety aspect is covered.
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, direct sentence with no fluff, and the key behavior (without removing) is front-loaded. It earns its place entirely, making it concise and structured effectively.
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 parameter, no output schema), the description is mostly complete. It addresses the primary concern (non-destructive) and identifies the session parameter. However, it could briefly mention the return format or behavior on empty, but not critical at this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for the single parameter 'me', explaining it as 'Your own session name'. The description adds no further meaning beyond what the schema offers, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns pending messages without removing them, identifying the verb and resource. However, it does not differentiate from siblings like bus_receive or bus_read_broadcasts, so the agent may not know which sibling to use for different scenarios.
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 a use case: when you want to inspect messages without consuming them. But it lacks explicit guidance on when not to use this tool or which sibling to use for actually consuming messages, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_read_broadcastsRead new broadcasts since you last checkedA
Return broadcasts newer than your last read, then advance your read cursor. Non-consuming for other sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| me | Yes | Your own session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool advances the read cursor as a side effect and that it does not consume broadcasts for other sessions, which is valuable behavioral context beyond the tool name. It does not mention permissions, errors, or idempotency, but for a single-parameter read-with-cursor tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each carrying distinct information—the return behavior and the cursor side effect plus the non-consuming guarantee. No filler, front-loaded with the core action.
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 low-complexity tool with no output schema or annotations, the description explains what is returned (broadcasts newer than last read) and the side effect (cursor advance) plus the non-consuming property. It is complete enough for an agent to call it correctly; missing details like output format are not essential given the tool's simplicity.
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 input schema already provides 100% description coverage for the only parameter ('me'), so the description does not need to add parameter details. It adds no extra semantic beyond the schema, but the schema is sufficient; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Return broadcasts newer than your last read') and a unique side effect ('advance your read cursor'). It distinguishes this from sibling read tools like bus_peek (which likely doesn't advance a cursor) and bus_receive by describing per-session cursor behavior, so an agent can identify it correctly.
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 a use case—polling for new broadcasts since a session's last read—and notes that it is non-consuming for other sessions. However, it does not explicitly compare against siblings like bus_peek or bus_receive, nor state when to prefer one over the other, leaving the agent to infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_receiveReceive messages (blocks until one arrives or timeout)A
Fetch and CONSUME pending messages for your session. If none are waiting and block=true, this blocks (event-driven) until a message arrives or timeout_ms elapses. Returns a JSON array of messages (may be empty on timeout).
| Name | Required | Description | Default |
|---|---|---|---|
| me | Yes | Your own session name, e.g. "backend" | |
| block | No | Block until a message arrives (default true) | |
| timeout_ms | No | Max time to block in ms (default 60000, max 600000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that messages are consumed, that it blocks conditionally, that it is event-driven, and that an empty array can be returned on timeout. This is strong coverage for a simple receive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver all essential information: action, blocking behavior, and return value. Every phrase earns its place, and the title reinforces the key blocking semantics without duplication.
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?
The description covers purpose, consumption, blocking behavior, timeout, and return format, which is sufficient for a simple tool with no output schema. Minor gaps remain, such as explicitly stating what happens with block=false, but this is inferable from the conditional phrasing.
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 schema already documents all parameters. The description adds valuable relational context by explaining how 'block' and 'timeout_ms' interact when no messages are pending, which goes beyond the individual parameter descriptions.
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 specific language ('Fetch and CONSUME pending messages for your session') that identifies the exact verb, resource, and scope. It clearly distinguishes this from sibling tools like bus_peek by emphasizing the consuming/destructive nature.
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 provides clear context for when to call the tool: retrieve pending messages, optionally blocking until one arrives. It does not explicitly name alternatives or exclusion cases, but the 'CONSUME' wording implicitly tells the agent not to use this for inspection-only scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bus_sendSend a direct message to another sessionA
Send a message to a specific session inbox. The recipient sees it on their next bus_receive. Use for handoffs and requests between agent sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient session name, e.g. "backend" | |
| from | Yes | Your own session name, e.g. "frontend" | |
| text | Yes | Message body | |
| subject | No | Optional short subject |
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 of behavioral disclosure. It discloses the key delivery model: 'The recipient sees it on their next bus_receive,' which tells the agent that sending is asynchronous and queue-based. However, it does not mention failure behavior, durability guarantees, whether the recipient must exist, or what the tool returns, leaving gaps in behavioral transparency.
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 two concise sentences. It front-loads the primary action, then the key behavioral consequence, then the intended use case. Every sentence contributes unique value with no redundancy or 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?
The description covers the core purpose, the delivery behavior, and the intended usage context. With no annotations and no output schema, it could briefly mention the return value or error cases, but for a simple send tool with fully documented parameters, the essential information needed to invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-specific information beyond what the schema already provides; the schema accurately describes each parameter (to, from, text, subject). The description's references to 'specific session inbox' and 'handoffs' are contextual but do not add meaning to individual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Send a message to a specific session inbox.' It clearly distinguishes from siblings by emphasizing 'specific session' (as opposed to broadcast) and explicitly identifies the use case as 'handoffs and requests between agent sessions,' making its role 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?
The description gives clear context for when to use the tool: 'Use for handoffs and requests between agent sessions.' It doesn't explicitly name alternative tools like bus_broadcast, but the targeted-session phrasing implies when this tool is appropriate instead of broadcasting. No exclusions or when-not-to-use guidance is provided.
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.
6 tool updates
v1.1.0- First observed
bus_broadcast - First observed
bus_list_sessions - First observed
bus_peek - First observed
bus_read_broadcasts - First observed
bus_receive - First observed
bus_send
TDQS
Scored across 6 tools
Each tool targets a distinct operation on the message bus, and the send vs broadcast vs receive distinctions are well drawn. The only real overlap is bus_receive vs bus_peek, both returning pending messages for the caller's session; the consume-vs-non-consume wording disambiguates this well enough.
All six tools use a consistent bus_ prefix in snake_case with an action-oriented name. Minor deviations exist: bus_broadcast names the action while bus_read_broadcasts/bus_list_sessions pair verb+noun, but the pattern remains predictable.
Six tools is well-scoped for a message-bus server, with each tool earning its place (send, receive, peek, broadcast, read broadcasts, list sessions). No redundant or filler tools.
The surface covers the core pub/sub and point-to-point lifecycle: sending, consuming, peeking, broadcasting, reading broadcasts, and discovering sessions. Minor gaps remain (no explicit session registration/join or message deletion/ack), but agents can work around these.
Maintenance
Related MCP Connectors
End-to-end encrypted messaging and work coordination for autonomous AI agents.
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
Durable agent-to-agent handoffs and shared scratchpad for multi-agent workflows.
Shared task queue for humans and AI agents: leases, handoffs, approvals and signed receipts.
Related MCP Servers
- AlicenseAqualityDmaintenanceLocal inter-agent messaging for AI coding agents via filesystem relay.42MIT
- AlicenseNot gradedqualityDmaintenanceEnables multi-agent coordination for Claude Code and Claude.ai through file-based JSON communication, eliminating the human bottleneck of message relaying.9 npmMIT
- AlicenseAqualityBmaintenanceEnables local AI coding agents to message each other on one machine using a durable SQLite mailbox and live-ask tools.9MIT
- AlicenseNot gradedqualityBmaintenanceEnables real-time, file-based messaging between terminal AI agents (like Claude Code, Gemini CLI) allowing them to collaborate on tasks directly without a server or network, using JSON files and atomic rename for coordination.23 PyPIMIT