
Pursers
io.github.swisspraPublished by GitHub account swissprav5.2.1Updated Nov 2, 2026
Coordinate AI-agent work on a local-first, owner-controlled MCP board
Overview
Local-first, self-hosted MCP board where an assistant coordinates a fleet of agent seats through tickets, leases, evidence and independent review.
- What you can do
- Create, amend and track tickets on a durable board, with offers, exclusive leased claims and lease renewal
- Submit work with commit, files and test output, then approve or reject it from a separate reviewer seat
- Ask and answer questions and human-input requests through the board, with waiting seats woken instead of polling
- Keep project memory, checkpoints and handoffs on the board so a new session resumes where the last stopped
- Read board state, events and per-role token usage, and watch the ticket funnel in a loopback dashboard
- When to use it
- Worth adding when you want several AI agents (coordinator, workers, reviewer) to share one persistent work record that survives chat sessions, and you are willing to run and operate the Central board service yourself.
- Requirements
- A local Python environment running the self-hosted Central board service (SQLite storage) plus an MCP client; the stdio relay needs uv/uvx and a path to a seat credential file. Central requires CENTRAL_JWKS_PATH and CENTRAL_JWT_ISSUER, and optional settings such as CENTRAL_AUTH_MODE, CENTRAL_ADMISSION, ONBOARD_CENTRAL_HOST/PORT/DATA_DIR and TLS cert/key paths. No managed cloud endpoint is provided.
Installation
In SourceWeft
- Open Pursers in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Chat dies. The board doesn't.
Not another MCP. The OS for AI agent work.
[Pursers, the OS for your agent fleet, shown as a central operations hub connecting specialized agents]One local board runs a whole agent fleet — any model, any MCP client. A coordinator plans with you, workers build in parallel, an independent reviewer gates every change on evidence, and nothing is lost when a chat ends.
Quickstart · How a ticket moves · What's in the box · Upgrade to 5.2.1 · Docs · pursers.app
[CI] [Latest release] [PyPI] [License: Apache 2.0] [MCP 2026-07-28]
main: 5.2.1
[!IMPORTANT] Pursers was built by its own fleet. From first commit to 5.0.0 on PyPI and the MCP Registry took 27 days. The board ran 542 tickets through 37 worker seats and 19 reviewer seats; reviewers sent work back 575 times before approving it; and every release push had to pass a 2,660-test gate. One human set the direction and made the calls.
How a ticket moves
Step by step, as MCP tool calls
Recorded from the real product — the Fleet dashboard following one ticket on a disposable board, from offer to independent approval:
Why it sticks
- Worker ↛ Reviewer — building and gating are separate principals. Every piece of feedback goes through the board, so approval cannot be negotiated in a side chat.
- Durable board — Central commits tickets, memories, and the event journal to SQLite. The record outlives every chat, crash, and context compaction.
- Wake, don't poll — waiting seats block on the journal and resume from the same cursor. An idle seat spends no model turns until there is work for it.
[A worker blocked in a2a_wait on the journal subscription is woken by a pushed ticket_offered event]
From zero to production with a fleet
Put your most capable model in the coordinator seat and right-sized models in the worker seats. Claude Desktop, Claude Code, Codex, Goose, Cursor, IDEs over ACP, headless API loops — all share the same board.
Quickstart
Pursers is local-first, self-hosted software. Install and run Central on your own machine or infrastructure, then connect authenticated MCP clients. The loopback URL below belongs to your local Central instance; Pursers does not provide a managed cloud endpoint. Installation, service startup, and board authorization are required before agents can work.
Connect any Streamable HTTP MCP client to http://127.0.0.1:8766/mcp — use
admin.jwt first to create the board, then worker.jwt for a worker seat.
init prints credential paths, never values. The packaged Central
quickstart explains every generated file.
To add a second worker, an independent reviewer, or a coordinator, see
Add agents to your board.
[!TIP] More than one machine? Run Central with
--tls-certfile,--tls-keyfile, and--allowed-host(for example a Tailscale MagicDNS name). Claude Desktop on macOS?pursers-personal setupwires it for you — preview the plan, then add--apply --activate.
[!NOTE] Keep Pursers in its own virtual environment. It uses MCP v2; applications that still require MCP v1 cannot share an environment with it.
Connect LobeHub and local MCP hosts
For LobeHub Desktop and IDEs that support local MCP commands, use the
local stdio relay after Central is running and the board is onboarded.
Install uv so the host can run uvx, then adapt
this MCP configuration to that host's settings:
Replace the token-file placeholder with the absolute path printed by init
and select the board and credential appropriate for your agent's role. Keep
token contents out of configuration, prompts, and source control. uvx
starts the relay; it does not initialize or start Central.
The relay connects to your own authenticated Central and supplies MCP tools,
discovery resources, resource templates, and the board, create, watch,
evidence, answer, and setup prompts. Available tools depend on the
credential and configured tool profile. Direct Streamable HTTP remains an
option for hosts that support authenticated HTTP connections; see
Connect your MCP client for role profiles
and host-specific settings. Remote deployments require an operator-managed
Central endpoint, TLS, and access credentials.
Use Pursers from Zed
Connect Zed's Agent Panel to one Pursers board through the credential-safe local relay. Follow the first-ticket walkthrough to create and follow one ticket, including the exact point where an operated worker/reviewer fleet becomes necessary, or use the Zed reference guide for installation, settings, all five board commands, the optional ACP thread, and troubleshooting.
What's in the box
Everything below is on main and covered by the test gate. Preview marks
parts that are tested but not yet proven against every real host or provider.
What Board Butler does
Board Butler is a coordinator-side observer with two narrow safety actions; it is not an autonomous fleet operator.
- Watches: on each bounded refresh it runs the real coordinator derivation
for every active board in
project_registryand refreshes that board's findings. Inactive registry projects are ignored (CentralBackend.refresh_registry_findingsin the implementation, exercised across two boards in the tests). - Drafts and escalates: it listens for coordinator questions through the
journal push stream, checks current product or repository evidence, and
stores a rate-limited draft, durable hold, and evaluation record. Approval or
decision questions, scope changes, gate waivers, release actions, membership
or registry changes, and incomplete evidence stay with a human. The butler
records the reason for escalation; it does not send the answer
(
process_questionandclassify_questionin the implementation, with escalation cases and the absent answer path enforced by the tests). - Shadow versus active: shadow is the default and performs no ticket
action. Active mode additionally requires a separate owned mode-
0600authorization, at least one--act-on-board, an active registry board, an enabled action class, and a durable hold that expires without a veto. Only then may it park an open ticket after repeatedno_live_candidatescycles when no livecan_work=trueseat exists, or annotate refusal of a proposed escalation target that is missing or cannot work. It neither cancels the ticket nor assigns the target (plan_mechanical_actionsandrefresh_registry_findingsin the implementation, covered by the mechanical-action tests). - Never does: it does not merge or push
main, tag or publish a release, change membership or the project registry, claim/assign/submit work, or answer a blocked seat's question. Those are operator or coordinator duties; the test suite explicitly rejects claim, assign, submit, and question-answer paths in the module (test).
Stale-log finding: the reported stale
butler.out.logis a legacy-file mismatch, not a liveness defect. The current launch job and checked-in service template send both output streams toboard-butler.log; on 2026-09-22 that configured log andruntime.jsonadvanced together whilebutler.out.logdid not. Check the installed job'sStandardOutPathbefore treating an old filename as service status.runtime.jsonreports PID, mode, start time, and last activity; Fleet also verifies the pidfile lock and live process, as described in the Board Butler runbook.
Board Butler behaviour checklist
- Stale question reconciliation: in shadow and active modes, an open coordinator question explicitly named by a later decision is reported for coordinator reconciliation. A chronological but unlinked decision reports its missing correlation instead of being guessed as the answer. The butler does not answer or close the question.
- Held-decision travel: in both modes, a binding decision followed by a later work offer or broadcast is surfaced before another seat re-derives the gate. The butler does not claim, assign, or release the work.
- Standing-rule recurrence: in both modes, questions from multiple seats that reuse the same exact board-visible identifier are linked to the standing decision. The butler does not infer a match from free-text similarity or enforce the decision on a seat.
- Decision-scope drift: in both modes, a decision that directs a file change outside the ticket's declared related-file boundary is reported for preflight reconciliation. The butler does not edit the ticket scope or the repository.
- Bounded and fail-closed: critical coordinator alerts rank first; current observations then displace only older non-critical rows inside the 50-row, 4,800-character limit. Incomplete question or ticket projections produce a coverage warning, never a clean finding.
- No added authority: all observers are read-only in shadow and active
modes. Active mode still adds only the two separately authorized safety
actions documented above. The butler never deletes files or board data,
dispatches cleanup, merges or pushes
main, tags or publishes, changes membership or the registry, or acts for the operator.
Packages
The source tree's coordinated release surfaces currently bind
pursers==5.2.1, pursers-personal==5.2.1,
pursers-personal-import==5.0.0, pursers-central==0.1.8,
pursers-client==0.1.9, pursers-wait-bridge==0.1.7, and
pursers-acp==0.1.9.
Architecture
Central is the source of truth. Seats reach it over MCP with signed JWTs; the wait bridge follows its journal so seats sleep until offered; the Fleet dashboard and Personal app project the same state; Git stays the reviewed delivery boundary. Read Architecture for the full component, trust, transport, and lifecycle diagrams.
Screenshots
Fleet overview on a disposable Central: board health, agent availability, ticket totals, and attention findings.
Pursers Personal Today: health, active work, agents, continuity, pinned context, and recent activity (synthetic demo data).
Live offers from a disposable Central and an exact-identity claim.
Documentation
- Getting Started
- Add agents to your board — a second worker, an independent reviewer, a coordinator
- Connect your MCP client — Claude Code, Codex, Cursor, Goose, Claude Desktop, Zed, API loops
- Finish your first ticket in Zed — a narrative walkthrough and recording shot list
- Use Pursers from Zed — install, configure, board commands, ACP thread, troubleshooting
- Run a multi-agent fleet — coordinator, workers, reviewer, end to end
- Operate Central — run as a service, backup and restore, upgrade, logs, retention
- Fleet dashboard and Board Butler — install, every page, seat wizard, doors
- Troubleshooting and FAQ — real error messages mapped to fixes
- Reference: retention settings · generated MCP tools, CLI, and environment variables
- Architecture
- Security guide — trust model, credentials, remote access, leak response
- Rotating the issuer key without downtime
- Comparison with other agent frameworks
- Contributing · Security policy · Changelog
Current limitations
Central binds plain HTTP on loopback by default. TLS is operator-supplied for
remote use, together with an allowed host. Storage is SQLite, and boards admit
agents by invite. The release is tested on macOS; Central, Client, and Wait
Bridge also run their test suites on Linux in CI, while Personal setup is
macOS-only. Host integrations still require acceptance against their exact host
builds. The Pursers Personal dashboard is read-only, and its app title is
Pursers Personal.
Pursers is the successor to On Board v4 (onboard-memory-mcp 4.0.4). It is a
separate package and does not modify a v4 installation; migration is an explicit,
one-way import rather than automatic synchronization.
License
Source: README.md at commit 6bb4e6e
Tools
0Version history
7- v5.2.1LatestOct 5, 2026
- v5.1.0Oct 3, 2026
- v5.0.9Oct 1, 2026
- v5.0.3Sep 21, 2026
- v5.0.2Sep 20, 2026
- v5.0.1Sep 19, 2026
- v5.0.0Sep 18, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts