Quorum

io.github.terradev-cloud由 GitHub 帳號 terradev-cloud 發布v0.1.1更新於 Oct 25, 2026

Attested multi-agent consensus: proposals, votes, and outcomes stamped and traced.

已驗證Streamable HTTP可網頁執行效率與工作流知識與記憶

概覽

AI 產生的概覽

一個託管式 MCP 伺服器,用於可存證的 multi-agent 共識:發起提案、共用黑板、附理由投票,並依社會選擇規則結算結果。

可以做什麼
發起提案,指定選項、預期投票者、聚合演算法、截止時間與法定人數門檻,回傳提案 ID 與建立存證。在提案共用黑板上追加與讀取鍵值項目,保留有序且帶存證的歷史。以預期投票者身分提交選票並可附理由,支援多數制、贊成投票、波達計分、孔多塞、意見池與絕對多數規則。達到法定人數或截止後結算結果,真正存在歧義時回傳並列勝出者。取得提案的完整存證紀錄,可依寫入、投票或結果篩選。可選地將自選 api_key 綁定到 Telinea 金鑰,以便推送提案遙測。
適用情境
當多個 agent 或編排者需要就爭議問題共同商議,並希望得到可記錄、可驗證的決策過程而非臨時多數表決時使用。適合需要稽核誰寫了什麼、誰如何投票的決策情境。
執行需求
遠端 streamable HTTP 端點;匿名使用無需登入。向 Telinea 推送提案遙測為選用功能,需要一次性呼叫 register,將自選 api_key 綁定到 Telinea 金鑰。自架需要 Docker 以及 QUORUM_DATA_KEY、Telinea 擷取等設定。
安裝前請注意
register 工具要求提供 Telinea API 金鑰,伺服器會加密儲存;兩把金鑰都應視為機密。提案、黑板寫入與投票皆為僅追加並存證,事後無法修改或刪除。啟用遙測後,提案事件會被推送到 Telinea 的擷取服務。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Quorum,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.terradev-cloud%2Fquorum/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "quorum": {
      "type": "http",
      "url": "https://quorum-mcp.terradev.cloud/mcp"
    }
  }
}

README

Quorum

Attested multi-agent consensus with a shared blackboard — an MCP server.

An orchestrator opens a proposal, participating agents write context to a shared blackboard and vote with reasoning, Quorum applies a principled aggregation algorithm from the social choice literature, and every step — proposal, writes, votes, outcome — is attested via Stamp and traced to Telinea. The record is immutable, tamper-evident, and independently verifiable.

Hosted endpoint (no sign-in, public): https://quorum-mcp.terradev.cloud/mcp


Why

Majority vote among LLM agents fails on disputed questions because agents trained on overlapping data share systematic blind spots — they are not the independent voters the Condorcet Jury Theorem requires. And when agents do decide together, the decision process — who voted, what they said, what context they worked from — is invisible.

Quorum is the complete primitive: algorithm plus state plus provenance.

Tools

  • register — one-time account setup: bind your api_key (a Quorum key you choose) to your telinea_key. The Telinea key is stored encrypted under a key derived from your Quorum key (AES-256-GCM, HKDF) — the Quorum key itself is never stored. Every span for your proposals is then pushed with your Telinea key, standard OTLP bearer auth.

  • propose — open a proposal: name (becomes the proposal id), question, voters (expected identities), deadline_minutes. Optional: api_key (from register — binds the proposal to your Telinea account for span streaming; omit for anonymous use), namespace (tenant prefix — the id becomes ns:name, so different teams can reuse names without colliding), options (default ["yes","no"]), algorithm (default approval), quorum (min % of voters, default 100), threshold (supermajority share, default 66.67), description. Returns the proposal id, creation attestation id, deadline, and blackboard URI.

  • write — append key/value to the proposal's blackboard, with optional author. Writes are appended, never replaced — the full ordered history is preserved and attested.

  • read — read the blackboard: every write in order with timestamp, author, and attestation id. Optional key filter. The deliberation record before voting.

  • vote — submit a ballot from an expected voter identity, with optional reasoning (stored in the attested record, never affects the outcome). Ballot shape depends on the algorithm — see below. Duplicate votes and post-deadline votes are rejected with structured errors.

  • resolve — apply the algorithm and attest the outcome. Callable once quorum is met (or after the deadline); also fires automatically when the deadline passes with quorum. Idempotent. Condorcet cycles and missed supermajority thresholds return co_winners with status unresolved — genuine ambiguity is surfaced, never hidden.

  • history — the complete attested record: creation, every write, every vote with reasoning, the outcome. Optional filter: all | writes | votes | outcome. The compliance artifact.

Algorithms

AlgorithmBallotUse when
pluralityoption stringBinary decisions only
approvaloption or list of optionsDefault. No strategic incentive; weak/multiple preferences
bordaranking of all options3–5 options; surfaces the broadly-acceptable choice
condorcetranking or single optionRational preference aggregation; cycles returned as co_winners
opinion_pool{option: probability} summing to 1Genuine probabilistic beliefs; returns full distribution
supermajorityoption stringHigh-stakes decisions needing >50% (set threshold)

The blackboard

LLM consensus failures are often information failures, not algorithm failures — agents vote in isolation. The blackboard is shared working memory scoped to one proposal: agents write analysis, read each other's findings, then vote informed. Write-first, read-second ordering and immutable pre-deadline votes are the conformity-bias defenses.

Tracing

Every proposal is one Telinea trace. The root span (proposal) opens at propose and closes at resolve or deadline expiry — its duration is the deliberation time. Each write, vote, and the resolution is a child span emitted in real time with its Stamp attestation id. Root status: OK decided, UNRESOLVED ambiguous, ERROR expired without quorum.

Span ids are deterministic (uuid5 over proposal id + event seq), so replays and restarts stay idempotent. Push is fire-and-forget and fail-safe — telemetry can never break a vote.

Auth is per-account: spans are pushed with the Telinea key registered via register, so ingest attributes them to the correct account. The key is stored encrypted (AES-256-GCM under HKDF of your Quorum key — never stored); a proposal-scoped re-encryption under the server-held QUORUM_DATA_KEY lets spans authenticate after restarts without re-presenting the Quorum key. A database dump exposes only ciphertext.

Config: TELINEA_INGEST_URL (default https://ingest.terradev.cloud/v1/traces), TELINEA_WORKSPACE_ID, TELINEA_PROJECT_ID, TELINEA_DISABLED=1, QUORUM_DATA_KEY, QUORUM_ACCOUNTS (account store path, default ~/.quorum/accounts.json).

HTTP transport

EndpointMethodDescription
/mcpPOSTJSON-RPC 2.0 — single or batch; notifications → 202
/mcpGETSSE keep-alive channel
/GET/POSTService identity / MCP alias
/healthGET{"status":"ok"}
/v1/infoGETSelf-describing service info (tools, auth, spans, docs)
/.well-known/agent.jsonGETAgent card
/.well-known/oauth-protected-resourceGETRFC 9728 — public, no auth

Concurrency capped at 100 simultaneous POST /mcp via asyncio.Semaphore.

Rate limiting is per-proposal: write and vote are capped at QUORUM_PROPOSAL_RATE events/min per proposal id (default 120), so one hot proposal can't starve the rest. The edge per-IP zone in Caddy is a coarse backstop only.

Attestation is queued and coalesced: concurrent events share one NTP sample per drain batch instead of one query per event — each event still gets its own Stamp record (unique id, own payload hash), so throughput isn't bound by NTP round-trips.

State

Event-sourced: one append-only JSONL file per proposal under ~/.quorum/proposals (override QUORUM_DATA_DIR). Namespaced proposals live in per-namespace subdirectories (proposals/<ns>/<name>.jsonl). The log is the history — history is a filtered read of the same file the tools append to. Nothing is rewritten or deleted.

Self-hosting

bash
git clone https://github.com/theoddden/quorum-mcp.gitcd quorum-mcpdocker compose up -d --build

Caddy handles TLS once DNS points at the host. See deploy/Caddyfile.

License

Copyright 2026 theoddden. Licensed under the Apache License, Version 2.0.

來源:README.md,提交 dc67b56

工具

7

register

OPTIONAL one-time setup -- only needed if you want proposal telemetry (OTLP spans) pushed to your Telinea account. Call once before propose: it binds an api_key you choose to your Telinea API key. Afterwards, pass the same api_key on propose and every span for that proposal is pushed to your Telinea with standard OTLP bearer auth. Storage: the Telinea key is sealed with AES-256-GCM under a key derived from your api_key (HKDF-SHA256, per-account salt); only sha256(api_key) is kept as the lookup id, so neither key is ever stored in the clear. Re-registering with the same api_key rotates the stored Telinea key. Skip this tool entirely for anonymous use -- propose works without an api_key, just with no span streaming.

輸入參數api_key必填telinea_key必填

propose

Open a new proposal: a question, named options, expected voter identities, an aggregation algorithm, a deadline, and a quorum threshold. Returns the proposal id, the creation attestation, and the deadline. All later operations key off the proposal id.

輸入參數name必填quorumvoters必填api_keyoptionsquestion必填algorithmnamespacethresholddescriptiondeadline_minutes必填

write

Append a key-value entry to a proposal's blackboard. Any agent may write; writes are appended, never replaced -- the full ordered history is preserved and attested.

輸入參數key必填value必填authorproposal_id必填

read

Read a proposal's blackboard: every write in order with timestamp, author, and attestation id -- the complete deliberation record, or filtered to one key.

輸入參數keyproposal_id必填

vote

Submit a vote from an expected voter identity, with optional reasoning stored in the attested record. Vote shape depends on the algorithm: plurality/supermajority take an option string; approval takes an option or list of options; borda takes a ranking of all options; condorcet takes a ranking or a single option; opinion_pool takes a probability distribution over options. Duplicates and post-deadline votes are rejected.

輸入參數value必填voter必填reasoningproposal_id必填

resolve

Compute and attest the outcome once quorum is met (or the deadline has passed). Idempotent: resolving twice returns the recorded outcome. Condorcet cycles and missed supermajority thresholds return co_winners with status unresolved rather than an arbitrary tiebreak.

輸入參數proposal_id必填

history

The complete attested record of a proposal in chronological order: creation, every blackboard write, every vote with reasoning, the outcome. Optional filter: all | writes | votes | outcome.

輸入參數filterproposal_id必填

版本歷史

1
  1. v0.1.1最新Sep 27, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。