Pursers

io.github.swisspra由 GitHub 账号 swisspra 发布v5.2.1更新于 Nov 2, 2026

Coordinate AI-agent work on a local-first, owner-controlled MCP board

概览

AI 生成的概览

本地优先、自托管的 MCP 看板,让助手通过工单、租约、证据与独立评审来协调多个 AI 代理席位的工作。

可以做什么
  • 在看板上创建、修改和跟踪工单,包含派发、独占租约认领与续租
  • 提交提交记录、文件与测试输出作为证据,并由独立评审席位批准或驳回
  • 通过看板提出和回答协调者问题与人工输入请求,等待中的席位被唤醒而非轮询
  • 把项目记忆、检查点和交接保存在看板上,新会话可从上次中断处继续
  • 读取看板状态、事件与各角色 token 用量,并在本机仪表盘查看工单漏斗
适用场景
适合希望多个 AI 代理(协调者、工作者、评审者)共享一份跨会话持久的工作记录,并且愿意自行运行和维护 Central 看板服务的场景。
运行要求
需要本地 Python 环境运行自托管的 Central 看板服务(SQLite 存储)以及一个 MCP 客户端;stdio 中继需要 uv/uvx 和席位凭据文件路径。Central 需要 CENTRAL_JWKS_PATH 与 CENTRAL_JWT_ISSUER,可选配置包括 CENTRAL_AUTH_MODE、CENTRAL_ADMISSION、ONBOARD_CENTRAL_HOST/PORT/DATA_DIR 及 TLS 证书与私钥路径。不提供托管云端端点。
安装前请注意
看板需自行运行与加固:Central 默认仅在回环地址上使用明文 HTTP,远程使用需自备 TLS 与允许的主机名。席位凭据为 JWT 文件(admin.jwt、worker.jwt),CENTRAL_REQUEST_STATE_KEY_FILE 与 ONBOARD_CENTRAL_TLS_KEYFILE 等密钥路径须保密,不要写入配置或源码管理。工具会写入看板数据(工单、评审、记忆、策略),部分组件可对工单执行操作,Board Butler 主动模式需单独授权。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Pursers,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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

[Pursers MCP server]

[!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.

BeforeAfter
Chat ends → work vanishes. Who owns what? Where's the proof?The board keeps the ticket — claim, lease, evidence, review. Chat dies. The board doesn't.

[A ticket moves from coordinator to board to worker, is rejected once by an independent reviewer, fixed, approved, and handed to you to merge]

How a ticket moves

Step by step, as MCP tool calls
mermaid
sequenceDiagram    autonumber    actor You    participant C as Coordinator    participant B as Board (Central)    participant W as Worker    participant R as Reviewer    You->>C: intent    C->>B: ticket_create    B-->>W: offer — wakes the waiting seat    W->>B: ticket_claim — lease starts    Note over W: builds in its own checkout,<br/>renews the lease    W->>B: ticket_submit — commit, files, test output    B-->>R: review offer    alt evidence holds        R->>B: approve    else evidence falls short        R->>B: reject with fix instructions        B-->>W: back to the same worker    end    B-->>You: approved work, ready to merge

Recorded from the real product — the Fleet dashboard following one ticket on a disposable board, from offer to independent approval:

[Fleet dashboard: a ticket moves Created, Offered, Claimed under a lease, Submitted, Reviewed, and closes approved]

RoleDoes
CoordinatorTalks to you, turns intent into tickets, amends them, answers the questions seats raise, keeps context on the board
WorkerClaims an offered ticket, builds under a renewable lease, submits exact evidence
ReviewerA separate principal that approves or rejects on that evidence — never the seat that built it
YouSet intent, answer questions, merge approved work. The final call is yours

Why it sticks

  1. 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.
  2. Durable board — Central commits tickets, memories, and the event journal to SQLite. The record outlives every chat, crash, and context compaction.
  3. 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

StageWhat the board does
PlanThe coordinator splits a goal into bounded tickets with required evidence, forbidden actions, tier, and skills.
Build in parallelEach ticket is offered to one eligible seat. Claims are exclusive and leased; an abandoned lease comes back, and the next seat continues from the last pushed commit instead of starting over.
ProveA worker cannot close its own work. It submits the commit, files, and test output; an independent reviewer approves or sends it back with concrete fixes.
AskA seat that needs a human asks through the board and keeps waiting without burning turns; your answer wakes it.
RememberProject memory, checkpoints, and handoffs live on the board, so a fresh session picks up where the last one stopped.
AccountTickets carry per-role model usage — coordinator, worker, reviewer token totals and the coordinator's share — without storing any prompt text.
Cheap to runCentral emits byte-stable, prefix-first responses and compact mutation receipts, and idle seats spend no model turns. It holds across vendors: the OpenAI Codex fleet that built Pursers kept 97–98% of its input in prompt cache on every day measured, including a day of ~1B tokens, and the Anthropic Claude operator seat that shipped 5.0.0 ran at 99%. Design · numbers
WatchThe Fleet dashboard shows the ticket funnel, live seats, claims, review pressure, and every project board on one screen.

[Prompt-cache hit rate while the fleet built Pursers: OpenAI Codex fleet 97.6%, 97.5% and 97.2% on three days, Anthropic Claude operator seat 98.8%; only 1 to 3% of input was paid at full price]

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.

bash
python3 -m venv .venv && . .venv/bin/activatepython -m pip install pursers==5.2.1pursers-central init ./pursers-localpursers-central run ./pursers-local

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 setup wires 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:

json
{  "mcpServers": {    "pursers": {      "command": "uvx",      "args": [        "--from", "pursers-client==0.1.9",        "pursers-mcp",        "--central-url", "http://127.0.0.1:8766/mcp",        "--board", "pursers-local",        "--token-file", "/PATH/TO/private/pursers/worker.jwt"      ]    }  }}

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.

ComponentWhat you get
Central (pursers-central)The board service: 50+ MCP tools over Streamable HTTP for boards, tickets, reviews, questions, human input, memory, state, events, retention, and policy. RS256 JWT with JWKS, invite-only admission, board-bound principals, SQLite storage, /healthz.
Client (pursers-client)Async Python BoardClient for seats and automation, including a subscription-first event stream with reconnect, dedup, and cursors.
Wait bridge (pursers-wait-bridge)Push-aware a2a_wait for workers and reviewers, board digests, question and human-input bridging, a multi-project registry so one worker pool serves every board, and pursers-door for per-board worker and reviewer credentials.
Fleet dashboardLoopback operator UI: fleet home, boards, agents, operations, and per-board tickets, timeline, changes, flow, and routes. Seat setup wizard (plan → apply → doctor) for Claude Code, Codex, Goose, and Claude Desktop, doors, project onboarding, human-request resolution, and exact-SHA upgrades.
Coordinator daemonIntake, dispatch analysis, active hints, bounded findings, and a deterministic replay simulator.
Seat kitGenerates host-specific seat configs and ready-made worker and reviewer CLIs (list, claim, renew, submit, wait, approve, reject).
Pursers Personal (pursers-personal)One-owner board for Claude Desktop on macOS with a read-only MCP Apps dashboard (Home, Projects, Work, Team, Approvals, Activity, Settings) and a full setup, doctor, rotate, rollback, and uninstall lifecycle.
Personal import (pursers-personal-import)One-way, reviewable import from On Board v4 with retry and rollback.
ACP agent (pursers-acp)Board assistant for ACP IDE hosts such as Zed: your tickets and offers, board status, permission-gated create and annotate, and live watch. Preview.
Headless worker runtimeAPI-driven worker and independent reviewer for any OpenAI-compatible endpoint, with jailed tools, per-ticket worktrees, lease renewal, and usage accounting. Preview.
Board ButlerRefreshes coordinator findings and drafts evidence-backed responses to coordinator questions. A separately authorized active mode can perform two narrow safety actions. Preview.
ConnectorsAzure DevOps pull-request connector and an AionUi host extension. Preview.
Board moveExport and import a board between Central instances.

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_registry and refreshes that board's findings. Inactive registry projects are ignored (CentralBackend.refresh_registry_findings in 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_question and classify_question in 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-0600 authorization, 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 repeated no_live_candidates cycles when no live can_work=true seat 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_actions and refresh_registry_findings in 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.log is a legacy-file mismatch, not a liveness defect. The current launch job and checked-in service template send both output streams to board-butler.log; on 2026-09-22 that configured log and runtime.json advanced together while butler.out.log did not. Check the installed job's StandardOutPath before treating an old filename as service status. runtime.json reports 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
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

PackageWhat it is
pursers==5.2.1Installs Central, the client, Personal, and the importer
pursers-central==0.1.8The board service
pursers-client==0.1.9Async Python client
pursers-personal==5.2.1One-owner board and MCP App dashboard
pursers-personal-import==5.0.0Importer from On Board v4
pursers-wait-bridge==0.1.7Wait bridge and door tooling for seats
pursers-acp==0.1.9ACP board assistant for IDEs

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

mermaid
flowchart LR    subgraph Seats      C[Coordinator]      W1[Worker]      W2[Worker]      R[Reviewer]    end    C & W1 & W2 & R -- "MCP + JWT" --> Central[("Central<br/>SQLite board + journal")]    Bridge[Wait bridge] -- "subscriptions/listen" --> Central    W1 & W2 & R -. "block until offered" .-> Bridge    Central --> Dash[Fleet dashboard]    Central --> Personal[Personal MCP App]    W1 & W2 -- "commits" --> Git[(Git)]    R -- "verifies" --> Git

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]

Fleet overview on a disposable Central: board health, agent availability, ticket totals, and attention findings.

[Personal Today view]

Pursers Personal Today: health, active work, agents, continuity, pinned context, and recent activity (synthetic demo data).

[Offer and claim]

Live offers from a disposable Central and an exact-identity claim.

See the full verified showcase.

Documentation

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

Apache License 2.0

来源:README.md,提交 6bb4e6e

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

7
  1. v5.2.1最新Oct 5, 2026
  2. v5.1.0Oct 3, 2026
  3. v5.0.9Oct 1, 2026
  4. v5.0.3Sep 21, 2026
  5. v5.0.2Sep 20, 2026
  6. v5.0.1Sep 19, 2026
  7. v5.0.0Sep 18, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分