Bus MCP
MCP server fronting a self-hosted coordination-bus HTTP API: post/read/claim/release/heartbeat.
Connector by jaimenbell · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/jaimenbell-bus-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 9 read · 6 write · 0 delete · 9 not yet classified
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Python package
Tools by what they do 24
Read from the source code; the running server may list different tools.
Read 9 · Look things up without changing anything.
get_bus_statusget_threadget_validationget_worker_statelist_tasks_boardlist_threadslist_validationsread_eventsread_messages
Write 6 · Create, change, send or run things.
mint_dispatchpost_messagerelease_lanereply_in_threadreport_dispatchresolve_thread
Not yet classified 9 · We could not tell from the name and description.
claim_laneclaim_taskfinish_taskheartbeat_laneheartbeat_tasklist_dispatchesopen_threadrequest_validationvote
Tools (24)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
claim_laneClaim a coordination lane before starting work in it: claim-if-free, steal-if-lease-expired, renew-if-you-already-own-it. A 409 (lane held live by another owner) comes back as a clean ok=False conflict, not a crash. The bus may grant a shorter lease than requested (server-side ceiling, coordination-bus v1.3+): on ok=True the response's top-level `lease_s` is the EFFECTIVE (post-clamp) duration actually granted -- always check it rather than assuming the requested value was honored. See get_bus_status's `_meta.max_lease_seconds` for the currently configured ceiling. Older bus servers (pre-v1.3)…
claim_taskClaim a pending board task. DARK BY DEFAULT: refuses unless BUS_MCP_ENABLE_TASK_CLAIM is armed, because the work-queue class table names one claimant class and MCP sessions are not it yet. `claim_token` is minted by the CALLER and returned in the result -- keep it, the board projection will not give it back. `lease_s` is refused, not ignored: the bus sets the lease server-side.
finish_taskTerminal write on a task you hold: status is done/failed/needs_operator. DARK BY DEFAULT (BUS_MCP_ENABLE_TASK_CLAIM). `verify_passed` is a SEPARATE fact from status and exit_code -- a run can exit 0 with its verification unrun. Leave it unset when nothing verified rather than passing true.
get_bus_statusRoll-up for the command-center panel: active lanes, orphaned/stale claims, recent messages, pending display-only action flags. Also exposes `_meta.max_lease_seconds` (coordination-bus v1.3+): the currently configured lease ceiling that claim_lane/heartbeat_lane requests get silently clamped to. Check this before claiming a lane for longer than the default if you need to know whether the request will actually be honored in full. Older bus servers (pre-v1.3) omit `max_lease_seconds` from `_meta` entirely; its absence just means the bus predates the ceiling feature, not an error.
get_threadOne thread plus its messages, oldest-first. PRIMARY: one direct call to the bus's own GET /threads/{id} route (result carries `composed: false` plus `message_count`/`truncated`). FALLBACK: if that route is absent (older backend) or flagged dark (BUS_THREADS_ENABLED off), retries the old client-side composition -- GET /threads + a topic-filtered GET /messages -- and the result carries `composed: true` plus `scanned`/`scan_truncated`. Check `scan_truncated` in a composed result -- when it is true, older replies in the thread exist that this call could not see.
get_validationOne validation by id (ungated read). Prefer this over scanning list_validations: the list is bounded, and a validation older than the page is exactly the case where 'no such row' would be a lie about an outstanding refutation.
get_worker_stateThe overnight task worker's last status heartbeat (ungated read). MISSING IS NEVER ZERO: the backend does not own the worker, so absence means 'cannot see', never 'nothing happened' -- unmeasured fields are null and the envelope carries status/age_s/as_of so data age is data. An 'unavailable' answer is honest, not an error.
heartbeat_laneRenew the lease on a coordination lane you hold live. A 409 (not held live by you) tells you to (re)claim instead of crashing. Like claim_lane, renewal is subject to the same server-side lease ceiling (coordination-bus v1.3+): on ok=True the response's top-level `lease_s` is the EFFECTIVE (post-clamp) duration actually granted, which may be shorter than requested -- check it rather than assuming the request was honored in full. See get_bus_status's `_meta.max_lease_seconds` for the currently configured ceiling. Older bus servers (pre-v1.3) omit `lease_s` from the response entirely; its absence…
heartbeat_taskRenew the lease on a task you hold. DARK BY DEFAULT (BUS_MCP_ENABLE_TASK_CLAIM). Renews only for the live (owner, claim_token) holder. `want_running=True` performs the one legal forward transition, claimed -> running; it is omitted from the request entirely when False.
list_dispatchesRegistered dispatches, newest first (ungated read). `status` is open/reported/expired. Use it to recover a dispatch id minted in an earlier session before voting under it.
list_tasks_boardDescription is built at runtime.
list_threadsList conversation threads, newest first (ungated read). `status` is one of open/resolved/archived. IMPORTANT DEFAULT: omitting `status` returns the LIVE board and EXCLUDES archived threads -- there is no single call that returns everything, ask for status='archived' separately.
list_validationsValidations, newest first (ungated read). Optional filters: subject_ref, verdict (pending/confirmed/refuted/indeterminate), thread_id. A misspelled verdict is a 422, never a silently empty list.
mint_dispatchRegister a dispatch so a vote cast under it can be counted; the server mints the 12-hex id. The honest limit: the write secret is the only identity, so this proves a dispatch was DECLARED, not that it ran. `minted_by` defaults to this server's agent id.
open_threadOpen a conversation thread and its root message in one call. `opened_by` defaults to this server's agent id AND IS THE RESOLVE AUTHORITY afterwards -- only that same identity (or the operator) can resolve the thread. `kind` is free text with one special value: DECIDE marks a thread only the OPERATOR may resolve. `action_flag=True` pages the operator's phone and is reserved for genuinely blocking work.
Show 9 more tools
post_messageAppend one message to the coordination-bus blackboard (append-only). v1 stores action_flag but performs no action -- it is display-only, seen by a human watching the command-center panel. Optional addressing: `thread_id` makes this a reply in that thread, `reply_to` names the message it answers, `recipient` addresses a ROLE (omitted = broadcast). All three are omitted from the wire when unset.
read_eventsCursor poll over the append-only event log (ungated read). Rows come back ASCENDING by id -- the opposite order to read_messages, because this is a cursor feed. Pass the result's `cursor` as `since` next time. An empty list means caught up, not an error.
read_messagesRecent bus messages, newest first, optionally filtered by topic. LIMITATION: `thread_id`, `recipient` and `since_id` are sent as query params but TODAY'S BACKEND IGNORES ALL THREE -- it filters on topic and limit only, and drops query params it does not declare. Passing them changes nothing about what comes back; filter client-side, or use get_thread. They are wired so that they start working the moment the server-side filters land, with no change here.
release_laneRelease a coordination lane you hold. A 409 (held live by another owner) comes back as a clean ok=False conflict, not a crash.
reply_in_threadReply inside a thread -- an ordinary bus message carrying thread_id. `topic` is required by the bus but not by this tool: omit it and the thread is looked up and its own topic used (one extra read). `reply_to` is the message id you are answering; omitted, it is left unset rather than guessed at the thread root.
report_dispatchClose the loop on a dispatch: report against its id, naming the evidence. `report_ref` is a POINTER (report path, commit, message ref), not the report text.
request_validationOpen a validation on a subject. `subject_ref` is prefixed -- 'message:<id>', 'task:<id>' or 'proposal:<repo>:<path>' -- and the subject_kind is DERIVED from that prefix rather than defaulted, because guessing the kind would guess the tier, and the tier decides who signs off. `tier` is not a parameter: the bus derives it. `evidence_refs` is free text (a pointer), not a list.
resolve_threadResolve a thread you opened. REFUSED CLIENT-SIDE when resolved_by is 'operator' in any casing: proving the operator role needs a second secret this server deliberately does not hold, so operator resolution stays a CLI/paste action. A `note` is posted as a REPLY in the thread first (the resolve body has no note field and would drop it), then the thread is resolved -- see `note_posted` in the result.
voteCast one vote on a validation. `dispatch_id` must be a REGISTERED, still-open dispatch (mint one with mint_dispatch) -- that is what makes a quorum count something declared in advance. `verdict` is confirmed/refuted/indeterminate; `evidence` is a POINTER to the evidence (a path, a commit, a message ref), not the argument itself. A voter cannot confirm its own request -- the bus answers 403.
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Weekly downloads
- 50
- Last commit
- Sep 15, 2026 (1 month ago)
- Last release
- Jul 24, 2026 (3 months ago)
- Last package publish
- Sep 11, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.jaimenbell/bus-mcp- Version
- 0.1.1
- Auth
- No auth
- Packages
- pypi bus-mcp
- License
- MIT
- Repository
- github.com/jaimenbell/bus-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from jaimenbell
- 0.596score
RAG MCP
jaimenbell
Minimal RAG-over-a-corpus MCP retrieval: search_knowledge returns cited chunks.
ConnectorAFreshness: ALocalRead-only★ 1↓ 39/wkClaude Code +5 - 0.549score
Desktop MCP
jaimenbell
Windows desktop-control MCP server: screenshot, window mgmt, mouse/keyboard input, recording.
ConnectorBFreshness: BLocal↓ 53/wkClaude Code +5 - 0.549score
Vllm Ops MCP
jaimenbell
Read-only ops/health MCP server for a local vLLM instance: health tiers, GPU/VRAM, service status.
ConnectorBFreshness: BLocal↓ 51/wkClaude Code +5 - 0.548score
Discord MCP
jaimenbell
MCP server for the Discord REST API: 5 read tools always on, 7 write tools env-gated, default off.
ConnectorBFreshness: BLocal★ 1↓ 42/wkClaude Code +5 - 0.548score
MCP Factory
jaimenbell
Manifest-driven MCP server scaffolder and runtime hub for tool integrations.
ConnectorBFreshness: BLocalRead-only↓ 49/wkClaude Code +5 - 0.534score
GitHub MCP
jaimenbell
MCP server for the GitHub REST API: issues, PRs, repos; read always on, write env-gated.
ConnectorBFreshness: BLocal↓ 43/wkClaude Code +5
Cite this page
Bus MCP. Agent Mart. https://agentmart.dev/connectors/jaimenbell-bus-mcp (last updated 2026-10-24)