Skip to content
Agentmart
Submit a tool

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

IndexedMITLocal (stdio)
Write a review

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.

We use your email only for this newsletter. Privacy

About

MCP server fronting a self-hosted coordination-bus HTTP API: post/read/claim/release/heartbeat.

No 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_status
  • get_thread
  • get_validation
  • get_worker_state
  • list_tasks_board
  • list_threads
  • list_validations
  • read_events
  • read_messages

Write 6 · Create, change, send or run things.

  • mint_dispatch
  • post_message
  • release_lane
  • reply_in_thread
  • report_dispatch
  • resolve_thread

Not yet classified 9 · We could not tell from the name and description.

  • claim_lane
  • claim_task
  • finish_task
  • heartbeat_lane
  • heartbeat_task
  • list_dispatches
  • open_thread
  • request_validation
  • vote

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_lane

    Claim 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_task

    Claim 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_task

    Terminal 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_status

    Roll-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_thread

    One 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_validation

    One 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_state

    The 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_lane

    Renew 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_task

    Renew 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_dispatches

    Registered 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_board

    Description is built at runtime.

  • list_threads

    List 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_validations

    Validations, 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_dispatch

    Register 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_thread

    Open 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_message

    Append 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_events

    Cursor 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_messages

    Recent 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_lane

    Release 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_thread

    Reply 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_dispatch

    Close 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_validation

    Open 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_thread

    Resolve 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.

  • vote

    Cast 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
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from jaimenbell

Cite this page

Bus MCP. Agent Mart. https://agentmart.dev/connectors/jaimenbell-bus-mcp (last updated 2026-10-24)