Skip to main content
Glama
chapmanjw

Rutherford MCP Server

by chapmanjw

review

Run a read-only code assessment across multiple ACP agents: provide a diff or file paths, and receive every agent's feedback plus a consensus verdict.

Instructions

Review a diff or a set of files across one or more ACP agents (read-only). Provide diff or paths.

A read-only consensus under the principal-reviewer persona: each agent reviews the code and the panel returns every voice plus a combined verdict. targets is a list of {cli, model} objects (or cli / cli:model strings); or name a saved panel (with optional panel_overrides) instead -- the two are mutually exclusive. Provide diff (a unified diff, inlined into the prompt) or paths (files put in scope for the agents to read). synthesize defaults on (the combined verdict); pass false for the raw per-voice reviews. Always read-only -- a review never mutates the tree.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
diffNo
roleNoprincipal-reviewer
panelNo
pathsNo
targetsNo
timeout_sNo
synthesizeNo
working_dirNo
panel_overridesNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv3.2.0
  2. Removedv3.1.0
  3. Changed2 schema fields changedv3.0.2
    • changedInput schema / properties / role / default
      Previous value: -"codereviewer"New value: +"principal-reviewer"
    • 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": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {},
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed11 schema fields changedv2.0.0
    • 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
      +}
    • removedInput schema / properties / safety_mode
      Removed value: -{
      -  "default": "read_only",
      -  "type": "string"
      -}
    • 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"
    • addedInput schema / properties / targets / anyOf
      Added 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": "null"
      +  }
      +]
    • addedInput schema / properties / targets / default
      Added value: +null
    • removedInput schema / properties / targets / items
      Removed value: -{
      -  "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"
      -}
    • removedInput schema / properties / targets / type
      Removed value: -"array"
    • removedInput schema / required
      Removed value: -[
      -  "targets"
      -]
  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 provided, the description carries the full behavioral burden and does so well. It states the critical invariant upfront ('Always read-only -- a review never mutates the tree') and explains the aggregation behavior: the panel returns every voice plus a combined verdict, with `synthesize` controlling whether the combined verdict is included.

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

Conciseness5/5

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

The description is dense but well organized: the main purpose and read-only nature are front-loaded, followed by input modes, target/panel selection, and synthesis behavior. Every sentence adds operational value without filler or repetition.

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

Completeness5/5

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

For a nine-parameter tool with no annotations and zero schema description coverage, the description covers the core invariant, all major input paths, and output synthesis behavior. An output schema exists to handle return-value documentation, and the remaining undocumented parameters are optional and self-evident from their names.

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 description coverage is 0%, so the description must compensate, and it does for most parameters: `diff` vs `paths`, the shape of `targets`, the `panel`/`panel_overrides` alternative, and the `synthesize` default. It leaves `role`, `timeout_s`, and `working_dir` unexplained, though their names and defaults make them relatively self-explanatory.

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?

The description leads with a specific verb and resource: 'Review a diff or a set of files across one or more ACP agents (read-only).' It clearly identifies the operation and differentiates itself from the sibling `consensus` by describing this tool as a read-only consensus under the `principal-reviewer` persona.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool: provide a diff or paths for agents to review, choose targets or a saved panel, and optionally disable synthesis for raw per-voice output. It does not explicitly compare against sibling tools like `debate`, `analyze`, or `plan`, so exclusion guidance is missing, but the intended use case is clear.

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