Attested multi-agent consensus: proposals, votes, and outcomes stamped and traced.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Default all.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
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.
| Argument | Type | Description |
|---|---|---|
| filter | string | Default all. |
| proposal_id* | string |
{
"type": "object",
"required": [
"proposal_id"
],
"properties": {
"filter": {
"enum": [
"all",
"writes",
"votes",
"outcome"
],
"type": "string",
"description": "Default all."
},
"proposal_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| name* | string | Human-readable proposal id, e.g. pr-review-2026-09-18. Letters, digits, . _ - only; becomes the key for all subsequent calls. |
| quorum | number | Min percent of expected voters that must vote before resolution. Default 100. |
| voters* | array | Expected voter identities. Only these may vote; missing voters at resolution are recorded abstained. |
| api_key | string | Optional. Your Quorum API key (from register). Binds the proposal to your account so its spans push to your Telinea. Omit for anonymous use -- everything works, no spans. |
| options | array | Named options. Default ["yes","no"]. |
| question* | string | The thing being decided. |
| algorithm | string | Aggregation algorithm. Default approval -- robust general-purpose choice with no strategic incentive. |
| namespace | string | Optional tenant namespace. The proposal id becomes '<namespace>:<name>' -- different teams can reuse names without colliding. Same charset as name. |
| threshold | number | Supermajority only: required share of votes cast, percent. Default 66.67. |
| description | string | Optional context for the audit trail. |
{
"type": "object",
"required": [
"name",
"question",
"voters",
"deadline_minutes"
],
"properties": {
"name": {
"type": "string",
"description": "Human-readable proposal id, e.g. pr-review-2026-09-18. Letters, digits, . _ - only; becomes the key for all subsequent calls."
},
"quorum": {
"type": "number",
"description": "Min percent of expected voters that must vote before resolution. Default 100."
},
"voters": {
"type": "array",
"items": {
"type": "string"
},
"description": "Expected voter identities. Only these may vote; missing voters at resolution are recorded abstained."
},
"api_key": {
"type": "string",
"description": "Optional. Your Quorum API key (from register). Binds the proposal to your account so its spans push to your Telinea. Omit for anonymous use -- everything works, no spans."
},
"options": {
"type": "array",
"items": {
"type": "string"
},
"description": "Named options. Default [\"yes\",\"no\"]."
},
"question": {
"type": "string",
"description": "The thing being decided."
},
"algorithm": {
"enum": [
"plurality",
"borda",
"condorcet",
"approval",
"opinion_pool",
"supermajority"
],
"type": "string",
"description": "Aggregation algorithm. Default approval -- robust general-purpose choice with no strategic incentive."
},
"namespace": {
"type": "string",
"description": "Optional tenant namespace. The proposal id becomes '<namespace>:<name>' -- different teams can reuse names without colliding. Same charset as name."
},
"threshold": {
"type": "number",
"description": "Supermajority only: required share of votes cast, percent. Default 66.67."
},
"description": {
"type": "string",
"description": "Optional context for the audit trail."
},
"deadline_minutes": {
"type": "number",
"description": "Minutes until voting closes."
}
}
}Read a proposal's blackboard: every write in order with timestamp, author, and attestation id -- the complete deliberation record, or filtered to one key.
| Argument | Type | Description |
|---|---|---|
| key | string | Optional: only entries with this key. |
| proposal_id* | string |
{
"type": "object",
"required": [
"proposal_id"
],
"properties": {
"key": {
"type": "string",
"description": "Optional: only entries with this key."
},
"proposal_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Your Quorum API key -- chosen by you, presented on propose, never stored. |
| telinea_key* | string | Your Telinea API key -- stored encrypted, used to authenticate span pushes. |
{
"type": "object",
"required": [
"api_key",
"telinea_key"
],
"properties": {
"api_key": {
"type": "string",
"description": "Your Quorum API key -- chosen by you, presented on propose, never stored."
},
"telinea_key": {
"type": "string",
"description": "Your Telinea API key -- stored encrypted, used to authenticate span pushes."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| proposal_id* | string |
{
"type": "object",
"required": [
"proposal_id"
],
"properties": {
"proposal_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| value* | any | Ballot in the algorithm's format. |
| voter* | string | |
| reasoning | string | Free-text rationale, kept in the audit trail. |
| proposal_id* | string |
{
"type": "object",
"required": [
"proposal_id",
"voter",
"value"
],
"properties": {
"value": {
"description": "Ballot in the algorithm's format."
},
"voter": {
"type": "string"
},
"reasoning": {
"type": "string",
"description": "Free-text rationale, kept in the audit trail."
},
"proposal_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | Key other agents use to filter this entry on read. |
| value* | any | Any JSON value. |
| author | string | Optional author identity, recorded and attested. |
| proposal_id* | string |
{
"type": "object",
"required": [
"proposal_id",
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "Key other agents use to filter this entry on read."
},
"value": {
"description": "Any JSON value."
},
"author": {
"type": "string",
"description": "Optional author identity, recorded and attested."
},
"proposal_id": {
"type": "string"
}
}
}| deadline_minutes* |
| number |
| Minutes until voting closes. |