Skip to main content
Glama
chapmanjw

Rutherford MCP Server

by chapmanjw

consensus

Solve divergent AI outputs by querying multiple agents in parallel and aggregating their answers into a single, unified result via voting or synthesis.

Instructions

Ask the same prompt of several ACP agents in parallel and reduce the voices.

targets is a list of {cli, model} objects or cli / cli:model strings; each runs as its own ACP session concurrently. Omit targets, pass an empty list, pass the sentinel "all", or set expand_all=true to fan out to every registered agent (each at its default model, capped at max_targets); the result's skipped field explains any agent left out. Or name a saved panel (with optional panel_overrides) to reuse a stored roster + strategy instead of targets; they are mutually exclusive (see reload_panels). A {cli, model} target may also carry per-seat role / label / weight / parity / stance. With a strategy other than all-voices (unanimous | majority | plurality | weighted | parity-pair | rank, optionally with a verdict_schema), each voice is asked for a verdict and the panel collapses to one outcome (StrategyResult) instead of every voice. rank is a two-round protocol (F4b): every voice answers, then ranks the OTHER answers anonymized and self-excluded, aggregated by Borda mean-rank into a rank leaderboard with a pairwise agreement matrix and concordance; require_dissent surfaces each non-winning position on its dissent. discount_correlated=true (F3 vote-math, opt-in) down-weights correlated votes by model-family lineage (vendor fallback) so a panel of "one model in N CLI costumes" counts as one effective vote under majority / plurality / weighted (each voice's lineage_weight shows it). Optional stances (parallel to targets) steer each voice and cannot combine with the auto-expanded panel. synthesize (defaults to synthesize_default, off out of the box) adds a server-side combined answer (all-voices only); judge names the seat that writes it. timeout_s applies to every voice; one failing voice is a failed result, never an aborted panel. Consensus is read-only deliberation: a safety_mode beyond read_only (propose / write / yolo) is refused -- there is no coherent merge of edits from several agents into one tree -- so route write / propose work through delegate (a single agent isolated in a worktree sandbox). role names a persona (see list_roles) prepended to the prompt every voice receives. effort (low | medium | high | xhigh | max) asks every voice to spend more reasoning where it has a knob; max is accepted and clamped to each agent's ceiling. time_budget_s is a wall-clock deadline for the WHOLE panel (distinct from each voice's timeout_s): at the deadline answered voices are kept, in-flight ones cut, and the panel aggregates over the harvest if min_quorum usable remain (stop_reason="budget", with a rollup); below min_quorum is BUDGET_EXHAUSTED. on_budget is harvest | continue | resume (default default_on_budget). persist keeps the panel as a durable job (F2): a parent state.json linking a child record per voice, plus voices/voice-N.md artifacts; None follows default_persistence, true / false force it. mode="async" runs the panel as a background job and returns a job_id (poll with job_status / job_result); mode="sync" awaits it.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNosync
roleNo
filesNo
judgeNo
panelNo
effortNo
promptYes
persistNo
stancesNo
targetsNo
strategyNo
on_budgetNo
timeout_sNo
expand_allNo
synthesizeNo
safety_modeNo
working_dirNo
time_budget_sNo
verdict_schemaNo
panel_overridesNo
require_dissentNo
external_trackingNo
discount_correlatedNo
require_independent_judgeNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv3.2.0
  2. Removedv3.1.0
  3. Changed8 schema fields changedv3.0.2
    • addedInput schema / properties / discount_correlated
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedInput schema / properties / expand_all
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • removedInput schema / properties / harvest_partial
      Removed value: -{
      -  "default": false,
      -  "type": "boolean"
      -}
    • removedInput schema / properties / include_raw
      Removed value: -{
      -  "default": false,
      -  "type": "boolean"
      -}
    • changedInput schema / properties / judge / anyOf
      Previous value: -[
      -  {
      -    "description": "A delegation target: a ``(cli, model)`` pair plus optional per-seat metadata.\n\nThe CLI alone is never the unit. Bring-your-own-model CLIs (OpenCode, Goose) expose many\nmodels through one adapter, and the same adapter may appear several times in a consensus\npanel with different models. ``model`` is ``None`` to mean the adapter's default model.\n\nThe metadata fields are all optional and default to ``None`` so a bare ``(cli, model)`` target\nis unchanged on the wire: ``role`` overrides the tool-level role for this seat, ``label`` is the\nkey the seat appears under in a result, ``weight`` and ``parity`` feed the consensus strategies,\nand ``stance`` steers the seat (taking precedence over a parallel stances list).",
      -    "properties": {
      -      "cli": {
      -        "type": "string"
      -      },
      -      "label": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "model": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "parity": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "role": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "stance": {
      -        "anyOf": [
      -          {
      -            "description": "Optional per-target steering for a consensus panel.",
      -            "enum": [
      -              "for",
      -              "against",
      -              "neutral"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "weight": {
      -        "anyOf": [
      -          {
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      }
      -    },
      -    "required": [
      -      "cli"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {},
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / require_dissent
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedInput schema / properties / require_independent_judge
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • changedInput schema / properties / targets / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "anyOf": [
      -        {
      -          "description": "A delegation target: a ``(cli, model)`` pair plus optional per-seat metadata.\n\nThe CLI alone is never the unit. Bring-your-own-model CLIs (OpenCode, Goose) expose many\nmodels through one adapter, and the same adapter may appear several times in a consensus\npanel with different models. ``model`` is ``None`` to mean the adapter's default model.\n\nThe metadata fields are all optional and default to ``None`` so a bare ``(cli, model)`` target\nis unchanged on the wire: ``role`` overrides the tool-level role for this seat, ``label`` is the\nkey the seat appears under in a result, ``weight`` and ``parity`` feed the consensus strategies,\nand ``stance`` steers the seat (taking precedence over a parallel stances list).",
      -          "properties": {
      -            "cli": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            },
      -            "model": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            },
      -            "parity": {
      -              "anyOf": [
      -                {
      -                  "type": "boolean"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            },
      -            "role": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            },
      -            "stance": {
      -              "anyOf": [
      -                {
      -                  "description": "Optional per-target steering for a consensus panel.",
      -                  "enum": [
      -                    "for",
      -                    "against",
      -                    "neutral"
      -                  ],
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            },
      -            "weight": {
      -              "anyOf": [
      -                {
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            }
      -          },
      -          "required": [
      -            "cli"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "type": "string"
      -        }
      -      ]
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {},
      +    "type": "array"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed18 schema fields changedv2.0.0
    • addedInput schema / properties / effort
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / external_tracking
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedInput schema / properties / harvest_partial
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedInput schema / properties / judge
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "A delegation target: a ``(cli, model)`` pair plus optional per-seat metadata.\n\nThe CLI alone is never the unit. Bring-your-own-model CLIs (OpenCode, Goose) expose many\nmodels through one adapter, and the same adapter may appear several times in a consensus\npanel with different models. ``model`` is ``None`` to mean the adapter's default model.\n\nThe metadata fields are all optional and default to ``None`` so a bare ``(cli, model)`` target\nis unchanged on the wire: ``role`` overrides the tool-level role for this seat, ``label`` is the\nkey the seat appears under in a result, ``weight`` and ``parity`` feed the consensus strategies,\nand ``stance`` steers the seat (taking precedence over a parallel stances list).",
      +      "properties": {
      +        "cli": {
      +          "type": "string"
      +        },
      +        "label": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "model": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "parity": {
      +          "anyOf": [
      +            {
      +              "type": "boolean"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "role": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "stance": {
      +          "anyOf": [
      +            {
      +              "description": "Optional per-target steering for a consensus panel.",
      +              "enum": [
      +                "for",
      +                "against",
      +                "neutral"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "weight": {
      +          "anyOf": [
      +            {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        }
      +      },
      +      "required": [
      +        "cli"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / on_budget
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / panel
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / panel_overrides
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / persist
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / safety_mode / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / safety_mode / default
      Previous value: -"read_only"New value: +null
    • removedInput schema / properties / safety_mode / type
      Removed value: -"string"
    • addedInput schema / properties / strategy
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / synthesize / anyOf
      Added value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / synthesize / default
      Previous value: -falseNew value: +null
    • removedInput schema / properties / synthesize / type
      Removed value: -"boolean"
    • changedInput schema / properties / targets / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "anyOf": [
      -        {
      -          "description": "A ``(cli, model)`` pair: the unit of delegation.\n\nThe CLI alone is never the unit. Bring-your-own-model CLIs (OpenCode, Goose) expose many\nmodels through one adapter, and the same adapter may appear several times in a consensus\npanel with different models. ``model`` is ``None`` to mean the adapter's default model.",
      -          "properties": {
      -            "cli": {
      -              "type": "string"
      -            },
      -            "model": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            }
      -          },
      -          "required": [
      -            "cli"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "type": "string"
      -        }
      -      ]
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "anyOf": [
      +        {
      +          "description": "A delegation target: a ``(cli, model)`` pair plus optional per-seat metadata.\n\nThe CLI alone is never the unit. Bring-your-own-model CLIs (OpenCode, Goose) expose many\nmodels through one adapter, and the same adapter may appear several times in a consensus\npanel with different models. ``model`` is ``None`` to mean the adapter's default model.\n\nThe metadata fields are all optional and default to ``None`` so a bare ``(cli, model)`` target\nis unchanged on the wire: ``role`` overrides the tool-level role for this seat, ``label`` is the\nkey the seat appears under in a result, ``weight`` and ``parity`` feed the consensus strategies,\nand ``stance`` steers the seat (taking precedence over a parallel stances list).",
      +          "properties": {
      +            "cli": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "model": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "parity": {
      +              "anyOf": [
      +                {
      +                  "type": "boolean"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "role": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "stance": {
      +              "anyOf": [
      +                {
      +                  "description": "Optional per-target steering for a consensus panel.",
      +                  "enum": [
      +                    "for",
      +                    "against",
      +                    "neutral"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "weight": {
      +              "anyOf": [
      +                {
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            }
      +          },
      +          "required": [
      +            "cli"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / time_budget_s
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedInput schema / properties / verdict_schema
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  5. First observedv0.1.1

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: the tool is read-only, rejects non-read-only safety modes, treats one failing voice as failure, has distinct per-voice timeout vs whole-panel time_budget_s, supports persistence and async job_id returns, and explains the rank protocol and discounting. This is substantial beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the one-sentence purpose and then packs every paragraph with unique behavior. It is long, but each sentence carries a distinct rule or edge case; some density and parenthetical protocol labels (F4b, F3) make it harder to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter tool with no schema descriptions, this covers nearly all decision points: target selection, saved panels, strategies, two-round rank, budget overflow, async mode, persistence, and read-only guarantees. An output schema exists, so return values don't need detailing; only a few minor parameters remain unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters, and it does for the vast majority: targets/expand_all/panel/panel_overrides, strategy/verdict_schema/require_dissent, stances, synthesize/judge, timeout_s/time_budget_s/on_budget, mode, persist, safety_mode, role, effort, discount_correlated. A few params (files, working_dir, external_tracking, require_independent_judge) are left undescribed, and min_quorum is referenced without being a schema parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a crisp action statement — 'Ask the same prompt of several ACP agents in parallel and reduce the voices' — naming the verb, resource, and outcome. It also contrasts itself with delegate for write work, so it is distinguishable from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when consensus applies (parallel read-only deliberation) and when-not: safety modes above read_only are refused and write/propose work should route to delegate. Also distinguishes the target/panel selection modes and tells the agent to poll via job_status/job_result for async mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.