io.github.faulkj/legion
NPM · LEGION-MCP
MCP-native LLM councils for debates, juries, blind panels, refinement, and custom deliberation.
Available components
Last scanned (1 hour ago)
Scores higher than 90% of npm servers
Category AI and Machine Learning
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security93
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known medium-severity CVE affects @hono/node-server 1.19.18, reached via @modelcontextprotocol/node > @hono/node-server. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 23 of 77 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency84
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to faulkj/legion-mcp). View diagnostics → Pass
- License check failed: the license (Kopimi) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 29 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability49
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 18558 tokens (~1031/item across 18 items; 18 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 18 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 19 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Nov 26 +1
- Stability: 0.97 → pass security
- 1 Nov 26 −1
- Stability: pass → 0.97 functional
- 29 Oct 26 −1
- CVE-2026-118663 affects this package: medium ▼ security
- Known CVEs: pass → fail ▼ security
- 26 Oct 26 0
- Stability: 0.97 → pass security
- 25 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/legion-mcp@0.8.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | faulkj/legion-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/faulkj/legion-mcp/.github/workflows/publish.yml@refs/tags/v0.8.0 |
| Rekor log index | 3118549159 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:1ef20d60af55e96abbba08b7d99463f82b3c1ab31eefac0dddd1c4426f734eb8f73f24fb91fc58a46c17f6da4dbde36b48e8aef65775e658a26f5ec29 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 1 finding
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-rmxm-3fg6-px4f | CVE-2026-118663 | medium | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 77 packages
| Packages resolved | 77 |
|---|---|
| Stale | 23 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
battle_royale ~739
Free-for-all: pit two or more contestants against each other, then crown a winner. Staff `combatant` with as many models as you like (min 2, no cap) — each argues its own answer is best and picks apart the others. A single `overseer` declares the winner and says why. Staff via models[]: combatant (2+), overseer (one). overseer also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
brainstorm ~687
Diverge on ideas independently, then converge. Staff via models[]: ideator (one), pragmatist (one), curator (one). curator also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
bullying ~765
Adversarial stress-test: one model defends a position while the rest gang up on it. Staff `victim` with exactly 1 model — it must hold its ground. Staff `bully` with 2 or more models that attack the victim's reasoning, poke holes, and demand answers. Optionally staff 1-2 `teacher` models to supervise and rule on whether the victim survived or folded. Staff via models[]: victim (one), bully (2+), teacher (up to 2). teacher also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
code_review ~716
Ship-readiness review of a code change. A builder argues for shipping, a critic hunts for flaws, and a judge weighs both and delivers a verdict. Staff via models[]: builder (one), critic (1-5), security (optional), judge (one). judge also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
courtroom ~836
Try a dispute in court: opposing legal teams argue, jurors deliberate and vote by side, and one judge rules. Staff `lawyer` with 2 or more team-tagged models across at least two sides — for example `model:lawyer@prosecution` and `model:lawyer@defense` — and supply each side's case via `objectives`. Staff `juror` with 3-12 neutral models and one neutral `judge`. One lawyer per side handles each round, rotating through the team in selector order. Jurors observe silently, then weigh the complete trial and cast the existing secret side ballot after lead lawyers close. Larger legal teams gain no speaking or ballot advantage. The judge sees the anonymous tally, then delivers the binding ruling. Staff via models[]: lawyer (2+), juror (3-12), judge (one). judge also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
debate ~683
Adversarial pressure-test of a proposal. Staff via models[]: proponent (one), opponent (one), moderator (one). moderator also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
double_blind ~745
Double-blind study: independent participants, then a blind synthesis. Staff `participant` with 2 or more models — each answers with ZERO visibility of the others (even across rounds), so no one anchors on anyone else. A `researcher` consolidates the findings. Because turns are labeled by role, the researcher weighs the answers on merit, not on which model wrote them. Staff via models[]: participant (2+), researcher (one). researcher also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
election ~851
Hold an election: candidates campaign, then the field decides by secret ballot — the vote IS the verdict, not a judge's opinion. Staff `candidate` with 2 or more models — each makes its case and, over rounds, responds to rivals. Optionally add one `incumbent` (a candidate defending their record) and an `electorate` of silent voters who read every round but never campaign. After the final round the candidates AND the electorate cast one anonymous ballot for the strongest position — candidates may back their own, as in a real election — and a neutral `returning_officer` certifies the tally WITHOUT overruling it. Unlike battle_royale or courtroom, no authority picks the winner — the voters do. Use rounds >= 2 so campaigns can react. Staff via models[]: candidate (2+), incumbent (optional), electorate (0+), returning_officer (one). returning_officer also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
final_girl ~891
Final girl: a group is picked off one by one each round until a single survivor remains. Staff `survivor` with 3 or more models — each keeps making its case round after round, reacting to who was just cut. Survivors speak simultaneously within a round (so they answer the last cut, not each other mid-round), then the `slasher` eliminates one until only the final girl is left standing — and she delivers the ending. Cuts are spread evenly across `rounds`, with the last cut on the final round — 3 survivors over 5 rounds die after rounds 3 and 5, so every round happens and survivors get time to build a case. Ask for at least as many rounds as survivors minus one. Feed the question or task via the prompt/context. If the field is still crowded after the last round, bounded cleanup cuts try to reach one survivor. If cleanup stalls, the result explicitly marks the contest incomplete and the first remaining survivor closes. Cost: one turn per surviving speaker each round, plus elimination calls and retries, plus the closing turn. Staff via models[]: survivor (3+), slasher (one). survivor also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
focus_group ~785
Focus group: a moderated panel reacts to something and riffs off each other, then a facilitator reports the themes. Staff `panelist` with 2 or more models — each reacts in their own voice AND builds on what earlier panelists said (real cross-talk, unlike a blind panel). Optionally add one or more `contrarian` to keep the group honest. A `facilitator` distills the discussion into themes, points of consensus, and dissent. Feed the thing under discussion via the prompt/context. Staff via models[]: panelist (2+), contrarian (0+), facilitator (one). facilitator also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
gauntlet ~751
Run several solvers through a gauntlet: each privately refines its own answer over multiple rounds, then a judge crowns the best. Staff `solver` with 2 or more models — each sees only its OWN prior attempts (blind to rivals) and improves across rounds. A single `judge` picks the strongest final answer. Best with rounds >= 2, where the private self-refinement pays off. Staff via models[]: solver (2+), judge (one). judge also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
quick_take ~673
Fast two-voice gut check, no deliberation. Staff via models[]: answerer (one), challenger (one). Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
quorum ~4,227
Fan a prompt out to two or more models; each answer comes back as a separate content item. ``` models — array of selectors: "modelSlug" or "modelSlug:roleSlug" (min 2) roles — optional ad-hoc roles for this call: { "name": "instructions" } rounds — discussion rounds (default 1; max set by MAX_ROUNDS) mode — "sequential" (default) | "parallel" | "private" | "independent" synthesize — selector for a synthesis turn (never speaks in normal rounds) synthesizeEvery — N: every Nth round (1 = every round, 0 = end only); "end"=0 default; needs synthesize frame — selector for a neutral framer that opens/steers (mirror of synthesize) reframeEvery — N: re-frame every Nth round; 0/"end" = opening frame only; needs frame closingStatements — true: one final statement per speaker before synthesis; needs synthesize objectives — optional { team: goal } map for team runs (see Teams) vote — optional anonymous peer-vote ballot instructions (see Anonymous voting) voteEvery — N: vote every Nth round (always the last); 0/"end" = one final vote; needs vote voteVisibility — "aggregate" (default, counts only) | "ballots" (also every cast label, unordered) tokenBudget — optional soft cumulative token budget (overrides TOKEN_BUDGET) ``` **Sizing `tokenBudget` against `maxTokens`**: `maxTokens` caps one turn's visible output (reasoning models add their own thinking allotment on top); `tokenBudget` counts every call's input *and* output across the whole run. Estimate `turns × (context + maxTokens + allotment)` where `turns = speakers × rounds + eliminations + syntheses (+ closings, votes)` and context grows each round as the transcript accumulates — input dominates in long councils. Set the budget above that estimate; one that only covers outputs trips in round two and skips the rest. It is soft: parallel rounds can overshoot before it checks. **Selectors**: `"fable"`, `"opus:skeptic"`, `"gpt:builder"`. Same model + different roles = distinct speakers (`["gpt:judge", "gpt:skeptic"]`).…
| Name | Type | Req | Description |
|---|---|---|---|
| allowSelfVote | boolean | – | Whether a voter's own seat appears on its ballot menu (only matters when vote is set). Default true (a voter may pick itself, as in a real election). Set false for peer-judgment ballots where self-vo… |
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| closingStatements | boolean | – | When true, every round speaker gives one final parallel statement over the whole transcript right before the synthesis. Requires synthesize. |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| frame | string | – | Optional selector for a neutral framer: a chair that opens the discussion (round 1) by setting the stakes and shaping the question. Never takes a side and cannot carry a team tag. Mirror of synthesiz… |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| mode | string | – | How much of the transcript each round speaker sees: sequential (default; sees all prior turns), parallel (sees only completed earlier rounds, blind to same-round peers), private (sees only its own pr… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Availab… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| reframeEvery | – | – | When the framer re-fires (only matters when frame is set): a number N re-frames every Nth round to steer/redirect; 0 or "end" (default) means opening frame only. |
| roles | object | – | Ad-hoc roles for this quorum call: map of role name to instructions. Reference as "model:role" in models. |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| synthesize | string | – | Selector for a synthesis turn. The synthesizer never speaks in normal rounds — only in its synthesis slot(s). |
| synthesizeEvery | – | – | When the synthesizer runs (only matters when synthesize is set): a number N synthesizes after every Nth round (and always the last); 1 = every round; 0 = only at the end. "end" is an alias for 0 (the… |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| vote | string | – | Optional anonymous peer-vote ballot instructions. When set, every live round speaker casts a hidden ballot, choosing a number from a menu of the candidates (its own seat included unless allowSelfVote… |
| voteEvery | – | – | When the anonymous vote fires (only matters when vote is set): a number N votes every Nth round (always including the last); 0 or "end" (default) means one final vote only. |
| voteVisibility | string | – | How much of a vote is shown: "aggregate" (default) shows only counts; "ballots" also shows the anonymized ballot texts (never voter identities). |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
refine ~777
Relay polish of an existing artifact: pass it down a line of improvers, consolidating each round. Supply the idea, code, or text to improve via the prompt/context — this preset improves what exists, it does not create from scratch. Staff `improver` with 2 or more models; each takes the current draft and makes it better. A `polisher` consolidates at the end of every round, so each round builds on the last polished version. Use rounds >= 2 to keep iterating. Staff via models[]: improver (2+), polisher (one). polisher also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
tag_team ~1,067
Tag team match: two or more teams, one wrestler legal per team each round, tagging out between rounds while a neutral ref calls the finish. Staff `wrestler` with team-tagged selectors — `model:wrestler@blue`, `model:wrestler@red` — and give each team a shared objective via `objectives` ({ "blue": "…", "red": "…" }). Keep the sides even: **2 a side** for a standard tag match (4 wrestlers), **3 a side** for a six-man tag (6), or **6 a side** for a twelve-man war (12). Only ONE wrestler per team is legal each round; the rest are on the apron reading the match, and the legal wrestler rotates every round, so a 3-person team cycles through all three across rounds 1-2-3 and a 6-person team takes six rounds to get everyone in. Whoever is in has to pick up their partner's thread, not restart it. Optionally staff an `announcer` (no team) to call the opening bell and the turning points. The `ref` names the winning TEAM and why. Use rounds >= 2x your team size so everyone gets in at least twice. Optionally book interference: staff `run_in` with a team tag (`model:run_in@blue`) and it hits the ring for exactly ONE round — at most two, and if you book two, book **one per side** (`@blue` and `@red`) so the interference cuts both ways. Set `cameoRound` to book the round it happens (default: the middle of the match). A run-in is not a wrestler: it never becomes legal, never takes a tag, and is gone the moment it has done its damage. Staff via models[]: wrestler (4-12), run_in (up to 2), announcer (optional), ref (one). ref also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
tiebreak ~691
Resolve a stalemate with a decisive third voice. Staff via models[]: side_a (one), side_b (one), arbiter (one). arbiter also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
war_games ~910
War Games: two or more teams enter a staggered-entry cage match, one combatant at a time, while a neutral ref calls fouls and, at the bell, names the winning team. Staff `combatant` with team-tagged selectors — `model:combatant@blue`, `model:combatant@red` — and give each team a shared objective via `objectives` ({ "blue": "…", "red": "…" }). Round 1 starts with one combatant per team; every round after, one more enters (alternating teams) until the whole field is in — then it's a full brawl. Optionally staff a `booker` (the show-runner) to set the card on the opening bell and throw swerves every couple of rounds to keep the match live. The `ref` may eliminate a combatant for foul play (optional) and delivers a verdict naming the winning team and why it out-argued the others. Needs >= 2 teams. Raise rounds for bigger teams: rounds >= (total combatants - team count) + 2 leaves two brawl rounds. Staff via models[]: combatant (2+), booker (optional), ref (one). ref also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
workshop ~805
A structured team builds something new from a brief: architect, builders, and a critic collaborate, then an editor ships it. Unlike `refine` (a uniform improver relay on an existing thing), this is a differentiated team creating from scratch. Staff `architect` (shapes the approach), `builder` (produces the work — one or more), `critic` (pressure-tests), optionally `researcher` (facts / prior art), and `editor` (final cut). Sequential, so each voice builds on the last. Use rounds >= 2. Staff via models[]: architect (one), builder (1+), critic (one), researcher (optional), editor (one). editor also synthesizes. Available models: . Set maxTokens to about 1500 — it is plenty per turn, and reasoning models get their own thinking room on top. The maximum is 3000; larger values are rejected.
| Name | Type | Req | Description |
|---|---|---|---|
| cameoRound | integer | – | For presets with a one-round cameo role (e.g. tag_team's run_in): the round that role appears in. Defaults to the middle of the match, and is clamped to a round that exists. Ignored when the preset h… |
| context | string | – | Optional supporting text (code, docs, data) appended to the prompt as a separate block |
| maxTokens | integer | – | Optional VISIBLE output-token limit PER TURN. Reasoning models get their own hidden-thinking allotment added on top (per model config, 500-3000), so size this for the answer you want to read, not for… |
| models | array | yes | Two or more selectors: "model" or "model:role". The same model may appear multiple times with different roles (for example "gpt:judge" and "gpt:skeptic"); each selector is a distinct speaker. Staff v… |
| objectives | object | – | Optional per-team objectives for team runs: a map of team tag to that team's shared goal. Tag speakers with model:role@team; each tagged team must have an objective here. Every teammate sees its own… |
| prompt | string | yes | The question or task to send to the model |
| rounds | integer | – | Discussion rounds (default 1; max set by MAX_ROUNDS) |
| system | string | – | Optional system prompt / instructions |
| temperature | number | – | Optional sampling temperature |
| tokenBudget | integer | – | Optional SOFT cumulative token budget for the whole run (overrides TOKEN_BUDGET), counting INPUT and output of every call. Size it from the per-turn maxTokens: roughly turns × (growing context + maxT… |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | object | – | Token budget accounting, when a budget applied. |
| incomplete | object | – | Required eliminations did not establish a sole survivor; the summary is not a winning verdict. |
| preset | string | – | Preset key, when the run used one. |
| timeline | array | yes | The run as an ordered event log — the shape of the deliberation without parsing the transcript. |
| transcript | string | yes | Full labelled transcript; feed back as `context` to continue a run across calls. |
| turns | array | yes | Every turn taken, in council order. |
No examples provided.
How do I install the io.github.faulkj/legion MCP server?
io.github.faulkj/legion runs locally as an npm package, launched with npx -y legion-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · legion-mcp
claude mcp add faulkj-legion -- npx -y legion-mcp
What is the io.github.faulkj/legion MCP server?
io.github.faulkj/legion is an MCP server listed in the public MCP registry as io.github.faulkj/legion. MCP-native LLM councils for debates, juries, blind panels, refinement, and custom deliberation. This page covers its npm package (legion-mcp).
Is the io.github.faulkj/legion MCP server safe to use?
io.github.faulkj/legion scores 86 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.faulkj/legion MCP server expose?
io.github.faulkj/legion exposes 18 tools: quorum, battle_royale, brainstorm, bullying, code_review, and 13 more. Their descriptions and schemas cost roughly 17,599 tokens of context every time the server is loaded.
Is the io.github.faulkj/legion MCP server still maintained?
io.github.faulkj/legion is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.faulkj/legion MCP server under?
io.github.faulkj/legion declares the Kopimi licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.