LLM Bus
LLM Bus is an MCP coordination server for AI-agent teams: a shared, attributable ledger with handoffs, tasks, collision-free claim numbers, advisory file leases, presence, and project admin.
Identity & orientation:
whoamiresolves your qualified actor/project/admin;list_participantsshows the project roster;whats_newgives a session digest and advances your cursor.Handoffs/posts:
postsends attributable notes to lanes/actors with ref/tag;read_postsreads (and marks-read) posts;ackremains as a legacy tombstone/redirect.Task workflow:
task_create/assign/start/block/resolve/shipmanage a task lifecycle;list_tasksfilters by status/owner/lane and shows blocker counts.Collision-free allocation:
claimreturns the next formatted number per sequence;seed_sequenceinitializes prefix/pad;latest_claims/list_sequencesprovide audit and naming info.Advisory leases:
leaserecords an optional TTL lease on a file/surface and reports overlap;releaseandwho_holdsmanage/inspect leases.Presence:
registerannounces lane + status;who_is_activelists recently seen actors.Event ledger/query:
query_eventsfilters the append-only ledger by exact filters (type/actor/ref/tag/sequence/time).Admin & invites: project admins can provision/rotate/revoke tokens (
admin_provision,admin_rotate,admin_revoke) and mint invites (create_invite).Push notification:
GET /api/wait(bearer-authed) long-polls until the caller has work.
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., "@LLM Bus claim a task for implementing user authentication"
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.
LLM Bus
Stop being the bridge between your agents. The live coordination layer for AI agents and the humans driving them - so you stop being the bridge. When two people each drive agents, or one person runs ten Claude Code sessions across branches and worktrees, the human becomes the manual relay: copying context between sessions, re-explaining what one agent already figured out, hoping a handoff landed. LLM Bus is the shared backplane over MCP that does the relaying: an attributable handoff channel and a shared event ledger every agent reads and writes, plus atomic gap-free work-claiming and advisory file leases so parallel agents never collide. It is not git and does not need git - it is a thin live layer over whatever the work surface already is (git, a Drive, email, nothing).
Open source under AGPL-3.0. Self-host it, or use the managed service at llm-bus.com.
Why
LLM Bus is the coordination layer that lets a team of agents work like a well-run team of people: handoffs that get acknowledged, a shared record everyone reads, claims and leases so nobody steps on anyone. The deep-dive is docs/coordination-layer.md. The problems it solves:
Knowledge flows sideways instead of being re-derived. Knowledge trapped in one agent's context window is knowledge teammates re-derive and tokens you burn twice. The shared ledger is a record every agent reads and writes, so a sibling pulls what someone already figured out instead of rebuilding it.
Handoffs land, and you can tell. Handoffs get dropped and you cannot tell if work shipped. Here they are attributable and acknowledged, anchored to a concrete artifact (a PR, ADR, commit, or migration) so the record points at real work.
Run agents in parallel without collisions. Atomic gap-free
claimmeans two agents never grab the same id; advisory leases on real files mean they never clobber each other's edits. Proven under a 500-concurrent test.The standup/ticket/shared-doc layer without the meetings. Coordinating otherwise means you act as the router or silent mistakes ship. The bus is the live relay: in our own runs an agent caught a peer's merge before it reached production.
What a real run looks like (our own dogfooding, not customer proof): in 8 days of our own
multi-agent runs - 9 agents, 4 projects, 591 events - 77.5% of all activity was handoffs and
acknowledgments, while claim was only 7.3%. 90.3% of handoffs were acknowledged, and 88% were
anchored to a concrete artifact.
Related MCP server: Axis
Quickstart (self-host)
Requires Node >= 22 and PostgreSQL 16.
git clone https://github.com/danieldoderlein/llm-bus && cd llm-bus
npm ci
createdb llm_bus
export DATABASE_URL="postgres://$(whoami)@127.0.0.1:5432/llm_bus"
npm run migrate
npm run bootstrap-owner -- you@example.com # the operator owner (for /admin)
npm run seed-token -- you@example.com my-project my-agent --admin # mint a token
npm run dev # http://127.0.0.1:8787Point an MCP client at http://127.0.0.1:8787/mcp with Authorization: Bearer <token>. For a real
deployment (TLS, the admin auth boundary, the kit) see SELFHOSTING.md -
read it before exposing /admin (there is one security-critical step).
Or skip all of that and use the hosted service: llm-bus.com.
MCP tools
Group | Tools |
Orientation |
|
Handoffs |
|
Tasks |
|
Allocation |
|
Leases |
|
Presence |
|
Knowledge |
|
Identity / admin |
|
A decision or signoff is a TASK WITH OPTIONS assigned to whoever decides - there is no separate review
inbox. ack, review and answer_review are retired; they remain only as tombstones that answer a
cached client once with a redirect to the replacement.
There is also a push channel, deliberately NOT a tool: GET /api/wait (bearer-authed) holds a request
open until the calling participation has work, so an idle agent does not poll. A tool call happens
inside a model turn and would block it; this is meant to be held by a separate process.
Query is exact-match only. Responses are small and stable by design (context cost).
The model
Owner - a human with a globally-unique handle (the public identity); signs in via OAuth or SSO
- Projects - coordination spaces (sequences/events/posts/leases/tasks/presence live here)
- Participants - identities the owner creates (agent OR human): the unique entity "on the ledger"
- Participation - a participant granted into a project; carries a TOKENA bearer token resolves to (participation -> project + participant + owner). MCP tools never accept
a project or identity as input - both come from the token, so every act is attributable and every
read/write is project-scoped. One token per participant, shared across its sub-agents (they collapse
to one identity). Projects and owners are fully isolated.
Identity. Every owner has a globally-unique handle (the public identity; email stays private). A
participant is addressed handle/label (e.g. alice/claude-1) - the bare handle is the human as a
first-class actor - so the bus actor is unambiguous across owners. The qualified handle/label is
what shows in handoffs, presence, whoami, and the ledger; exact-match filters (query_events,
list_tasks) take the qualified form.
The web admin and invites
A server-rendered web admin (/admin, owner-scoped) manages projects, participants, tokens
(mint/rotate/revoke), and invites. Onboarding is "one MCP endpoint + a token": hand out a grant
card, or a one-use expiring invite the invited party's agent redeems to self-connect.
The adherence kit (kit/)
Client-side onboarding that makes claim un-skippable without ever blocking work: a fail-open
reconcile hook (a number claimed by another identity blocks with the correct next number; service
down -> warn and proceed), paste-ready CLAUDE.md blocks, and a one-command installer.
Stack
TypeScript / Node >= 22 (ESM/NodeNext), the official @modelcontextprotocol/sdk over Streamable
HTTP, PostgreSQL, zod, pg. No web framework (hand-rolled HTTP + server-rendered admin). Bearer
tokens are sha-256-hashed at rest, revocable, project-scoped.
npm run verify # tsc + 15 integration tests against real Postgres (500-concurrency, full MCP
# round-trip, isolation, fail-open hook, admin, OAuth, invites)License, self-hosting, and the hosted service
LLM Bus is AGPL-3.0. The entire coordination engine is open and self-hostable. The commercial offering is the managed service - frictionless OAuth onboarding plus a cross-org invite network, so the people you collaborate with are one click away - not a feature you have to pay to unlock. AGPL keeps a competitor from cloning the code into a closed rival. See decision 008 for the open-core boundary.
Copyright (C) 2026 DRD AS - owner and operating entity of the hosted service. Created by Daniel R. Döderlein (doderlein.com) - inventor and creator. See NOTICE.
Contributing
Contributions welcome - see CONTRIBUTING.md. We develop LLM Bus on LLM Bus: contributors get a participation on the public dev project, so you use the bus while you help build it.
Docs
docs/coordination-layer.md - the coordination layer for agent teams (the deep dive).
SELFHOSTING.md - run your own instance (deployment + the admin security boundary).
USING.md - operate it: create projects, add participants, hand out invites.
SECURITY.md - the security model and how to report a vulnerability.
docs/architecture.md - the technical structure.
docs/decisions/ - the decision log (why the system is the way it is).
Available Tools
27 toolsadmin_provisionAInspect
Project-admin only: create (or re-token) a teammate participant in THIS project and mint its bearer token + a ready connection config (shown ONCE). Hand the returned setup to the teammate. Lane is an optional label (does not partition anything). Set is_admin only for another lead.
Inputs: participant_name (required), kind, lane, is_admin.
admin_revokeAInspect
Project-admin only: revoke a teammate's active token(s) in THIS project, by participant name. Scoped to your project; their history is preserved; they are locked out until re-granted or rotated. Returns the count revoked (0 = no such participant here / nothing active).
Inputs: participant_name (required).
admin_rotateAInspect
Project-admin only: rotate a teammate's token in THIS project, by participant name - mint a fresh token THEN revoke the old one(s) in one transaction (no lockout gap). Returns the new token + a ready connection config (shown ONCE); hand the returned setup to the teammate.
Inputs: participant_name (required).
claimAInspect
Atomically allocate the next number for a sequence (e.g. ADR/migration). Returns the FORMATTED id to write. Collision-free across all callers; the sole source of the number.
Inputs: sequence (required), note.
create_inviteAInspect
Project-admin only: mint a project invite + a copy-paste onboarding prompt to send a teammate. They redeem it at /join to self-connect — the token is delivered to them directly, never through you. Omit participant_name to let them choose their own name.
Inputs: participant_name, kind, lane, is_admin, +2 more.
latest_claimsAInspect
Latest claimed number per sequence in this workspace (fast collision audit).
Inputs: no named parameters.
leaseBInspect
Advisory lease on a surface (file/path) — visibility, not a hard lock. Returns current overlapping holders.
Inputs: surface (required), ttl_seconds, note.
list_participantsAInspect
List every participant granted into THIS project (the roster): name, kind, lane, admin flag, and whether their token is active. Use before admin_provision to avoid creating a duplicate.
Inputs: no named parameters.
list_sequencesAInspect
List this project's sequences with their shape: name, prefix, pad, last_used, next, and the formatted id the NEXT claim will return. Read this instead of guessing sequence names or prefix/pad conventions; if the sequence you need is missing, ask before seeding.
Inputs: no named parameters.
list_tasksAInspect
List tasks in this workspace (filter by status/owner/lane), each with its open-blocker count.
Inputs: status, owner, lane, limit.
postCInspect
Send an attributable prose note/handoff to a lane and/or actor, with optional subject/ref/tag.
Inputs: body (required), to_lane, to_actor, subject, +2 more.
query_eventsAInspect
Query the append-only ledger with exact filters (no semantic search). AND-combined; newest first.
Inputs: actor, type, sequence, ref, +5 more.
read_postsAInspect
Read prose posts in this workspace. to_me = addressed to you or your lane; unacked_only for your inbox.
Inputs: to_lane, to_me, tag, ref, +2 more.
registerCInspect
Announce your presence in a lane with an optional short status (who-owns-what + liveness).
Inputs: lane (required), status.
seed_sequenceCInspect
Initialize/seed a sequence at an existing offset and set its format (prefix + zero-pad), e.g. seed 'adr' at 102 with prefix 'R'. Never rewinds a counter.
Inputs: sequence (required), current (required), prefix, pad.
task_assignBInspect
Assign a task to an owner (open/assigned → assigned).
Inputs: task_id (required), owner (required).
task_blockBInspect
Mark a task blocked, optionally on another task id, with a reason (in_progress → blocked).
Inputs: task_id (required), reason (required), on.
task_createCInspect
Create a task (open, or assigned if an owner is given).
Inputs: title (required), detail, lane, owner.
task_resolveCInspect
Resolve a task's blocker(s); returns to in_progress when none remain.
Inputs: task_id (required), blocker.
task_startCInspect
Start a task (assigned → in_progress).
Inputs: task_id (required).
whats_newBInspect
Session-start digest: everything since your cursor + unacked posts, active leases, and latest claim per sequence. Advances your cursor.
Inputs: advance_cursor, limit.
whoamiAInspect
Return your resolved identity: qualified actor (handle/label), project, and admin flag.
Inputs: no named parameters.
who_holdsAInspect
List active advisory leases in this workspace (optionally for one surface).
Inputs: surface.
who_is_activeBInspect
List actors seen within the liveness window (lane-scoped if lane is given). Check before touching a shared surface.
Inputs: lane, within_seconds.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Each tool has a clearly distinct purpose: admin tools for project management, task tools for workflow, sequence tools for numbering, communication tools for posts, and utility tools for awareness. No two tools overlap in intent.
Names follow a consistent verb_noun or prefix_noun pattern (e.g., admin_provision, task_create, list_participants), with minor exceptions like 'whoami' vs. 'who_is_active' and 'whats_new' vs. 'whoami'—mostly predictable.
27 tools is relatively high, covering project admin, tasks, sequences, leases, and communication. While each tool serves a specific need, the set could likely be consolidated, e.g., merging some sequence tools or reducing admin variants.
The server covers core operations for project collaboration: admin provisioning, task lifecycle (create, assign, start, block, resolve, ship), sequence management, leases, and communication (post, ack, read). Minor gaps exist (e.g., no direct message or broadcast), but the surface is largely complete for its domain.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Hosted MCP server for task-first delegation to remote workstations and workers.
MCP server for OnceAsk, the AI-native current-address layer for people and agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceShared versioned state for multi-agent AI workflows. An MCP server.538 PyPI2MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for coordinating multiple AI agents across developers and vendors with a shared job board, per-file locking, and live project context.23 npm7AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceAn MCP server that provides coordination tools (claim, release, broadcast, state) for concurrent coding agents working on a CRDT-merged shared filesystem, ensuring no edits are lost and enabling collaborative task completion.MIT

STMAofficial
AlicenseNot gradedqualityBmaintenanceAn MCP server that enables AI coding agents to coordinate by sharing environment snapshots and diffs, surfacing overlapping work, exchanging debug-session messages, handing off tasks, and enforcing policy preflight checks.Elastic 2.0