Skip to main content
Glama

blessthis-llm-council

Blind multi-model councils, and direct seat chat, as a local MCP server.

Ask one question — get N independent answers from N different LLMs, each running as a real agent CLI on your machine, each answering anonymously so no model can bandwagon another's take. A synthesizer merges the answers, the council scores them blind, and only then are the hats lifted. When you don't need a whole council, open a direct 1:1 chat with any seat over the same MCP connection. You bring your own models, gateways, and credentials — the package is pure orchestration.

How it works

 you (via your agent host)
        │  brief
        ▼
  council_start ──► N anonymous seats (hat_1 … hat_N)
        │            each seat = one LLM family, spawned as a
        │            headless CLI subprocess (claude / pi / codex)
        ▼
  council_poll  ◄── watch seats work (live progress)
        │
        ▼
  council_answer / council_ask ──► collect answers, cross-examine
        │
        ▼
  synthesis ──► council_score (blind: hats still on)
        │
        ▼
  council_reveal ──► hats off: which model wrote what
        │
        ▼
  council_close

The conductor (your agent host: Claude Code, pi, Cursor, …) talks to the MCP server. The server spawns the seat CLIs, tracks per-(seat, model) health and cooldowns, and persists councils, scores, and chat sessions in a local SQLite database. No seat ever sees another seat's answer before scoring.

Related MCP server: conclave

How the council works: blind synthesis

The diagram above compresses the flow; here is what actually happens and why it is built that way. The full step-by-step procedures live in the ready-made council agents under agents/ — start with agents/pi/blessthis-council-architect.md.

Hat blindness. Every seat gets an opaque label — hat1, hat2, … — and the hat→model map stays hidden on the server until you call council_reveal. The orchestrating agent (and the human reading its output) therefore collects, cross-examines, and synthesizes answers blind: model identity cannot bias scoring or synthesis. Scores are attached to models server-side only at reveal time, feeding the historical per-model leaderboard (model_scores).

The loop is agent-driven, not server-driven. The MCP server is deliberately dumb — start / poll / answer / ask / reveal / score / close and nothing else. It makes no hidden LLM calls and applies no judgment. All thinking lives in the council agent (shipped for claude/codex/cursor/copilot/gemini/pi), which runs the loop:

 council_start ─► council_poll ─► council_answer ×N ─► council_ask? ─►
                  (long-poll        (fetch each hat's   (cross-examine
                   until done)       full proposal)      conflicts)

        ─► verify + synthesize ─► council_score ─► council_reveal ─► council_close
           (mechanical checks,     (1–10 per hat,     (hats off,           (records
            ONE coherent answer)    hats still on)     de-anonymized)       kept)
  1. Collect all hat answers, treating every hat as equally credible until assessed.

  2. Cross-examine conflicts with council_ask — probe a specific claim against a specific file or constraint; never nudge seats toward consensus.

  3. Verify each proposal on four axes: requirements coverage, codebase fit, trade-off soundness, and a method-driven failure-path sweep — reading the real code, not trusting the seat's self-assessment.

  4. Synthesize ONE coherent answer: the strongest proposal as the spine, verified compatible ideas grafted from the others, then an omission audit — every point raised by a non-chosen proposal is either included or explicitly excluded, never silently dropped.

  5. Score blind (1–10 per hat) before council_reveal, then close out.

Choosing the best is not a vote. Agreement is not evidence — models share biases, so a popular answer can be systematically wrong. The agent mechanically verifies each option's claims against the real codebase and the stated requirements, and labels every option SOUND, FLAWED (with the specific violation), or UNPROVEN (carried forward as an explicit risk). One seat with a verified trade-off outranks three that merely converge. Where a load-bearing trade-off is genuinely balanced, both options are surfaced with the deciding question — that call stays with the human.

Quick start

Requirements: uv, and at least one seat CLI installed (claude, pi, or codex) with credentials. Linux/macOS first-class; Windows untested (best-effort). Tip: see seats.example.yaml in the repo for a commented full example.

uvx blessthis-llm-council

That's it. The interactive wizard will:

  1. Build your seats.yaml (seat templates for common setups, per-seat env prompts, optional 1-token probe per seat).

  2. Ask about telemetry (on by default; opt out anytime).

  3. Wire up one host of your choice (MCP registration + council agent files). Re-run blessthis-llm-council install to add more hosts.

Then restart/reload your host and either ask the installed council agent ("run a council on …") or call the tools directly (e.g. mcp__llm-council__council_start).

Useful CLI commands (same binary):

blessthis-llm-council seats list|add|edit|remove|probe   # manage seats.yaml
blessthis-llm-council doctor                             # full diagnostics
blessthis-llm-council status                             # fast wiring overview
blessthis-llm-council uninstall                          # clean removal

Two console scripts ship in the package: blessthis-llm-council is the installer/management CLI; blessthis-llm-council-server is the MCP server your host launches (you never run it by hand — the wizard registers it).

seats.yaml

All seat topology and secrets live in one file: ~/.blessthis-llm-council/seats.yaml, mode 0600, never committed anywhere.

telemetry:
  enabled: true          # explicit; ON by default (Decision #22)

seats:
  fable:
    models: [claude-fable-5, claude-opus-4-8]   # preferred first
    agent:
      bin: claude
      args: ["-p", "{prompt}", "--output-format", "json",
             "--dangerously-skip-permissions",
             "--model", "{model}", "--add-dir", "{workdir}"]
      env:
        ANTHROPIC_API_KEY: __REPLACE_ME__

  glm:                       # pi reads its own models.json — no env needed
    models: [glm-5.2]
    agent:
      bin: pi
      args: ["--mode", "json", "--no-extensions", "--no-skills",
             "--no-prompt-templates", "--no-context-files",
             "-p", "{prompt}", "--model", "{model}"]
      env: {}
      # add --tools <allowlist> to sandbox this seat (cuts off MCP
      # servers + extensions)

  gpt:                       # codex runner via an OpenAI-wire gateway
    models: [gpt-5]
    agent:
      bin: codex
      args: ["exec", "--json", "--skip-git-repo-check", "-s", "read-only",
             "--color", "never", "-m", "{model}", "-C", "{workdir}", "{prompt}"]
      env:
        OPENAI_BASE_URL: https://your-gateway.example/v1
        OPENAI_API_KEY: __REPLACE_ME__

A seat is an LLM family, not a runner — the same binary can back several seats with different credentials (e.g. native API + gateway fallback as two seats, preferred-first). args is a pure exec-array (one argv token per element, {prompt} / {model} placeholders required). The wizard writes this file for you; edit later with blessthis-llm-council seats edit <name>.

Codex seats are OpenAI-wire. Non-OpenAI models behind a codex seat need an OpenAI-compatible gateway — set OPENAI_BASE_URL (plus the key) in that seat's agent.env — because the codex CLI only speaks the OpenAI protocol. Codex authentication itself (codex login or OPENAI_API_KEY) is your own concern and is never managed by the council: a missing/failed login simply surfaces as a seat error (nonzero exit with stderr, e.g. codex auth failed), where you can inspect it via seat_health or the error response.

Tools reference (17)

Council (10)

Tool

What it does

council_start

Start a blind council: brief + seat roster → hat assignments, spawns seats.

council_poll

Check progress of running seats (turns, tokens, done/error).

council_answer

Fetch a finished seat's answer (still anonymized by hat).

council_ask

Cross-examine a hat (resumes that seat's CLI session with a follow-up).

council_is_model_replied

Blind boolean: has a given model answered yet?

council_reveal

Lift the hats: map each hat → seat/model. Use after scoring.

council_score

Record blind scores (1-10 per hat) + notes — the mandatory end step.

council_close

Close the council; records are kept for history.

model_scores

Leaderboard: aggregated historical scores per model.

seat_health

Per-(seat, model) health/cooldown status.

Direct seat chat (6)

Tool

What it does

chat_start

Open a 1:1 chat session with a named seat.

chat_send

Send a message (async; returns a task_id immediately).

chat_poll

Long-poll for the turn's reply (+ usage; first turn yields the resume id).

chat_history

Read back a chat session's messages.

chat_list

List chat sessions (optional working_dir filter).

chat_close

Close a chat session (history preserved).

Discovery (1)

Tool

What it does

list_seats

List configured seats (name, models, runner kind) from seats.yaml.

Host support

Host

Agent files

MCP registration

Claude Code

~/.claude/agents/blessthis-council-*.md

claude mcp add --scope user (CLI)

Gemini CLI

~/.gemini/agents/

gemini mcp add -s user (CLI)

pi

~/.pi/agent/agents/blessthis-council-*.md

file-merge into ~/.pi/agent/mcp.json

Codex

~/.codex/agents/ (TOML)

file-merge into ~/.codex/config.toml

Cursor

.cursor/agents/blessthis-council-*.md

file-merge into ~/.cursor/mcp.json

GitHub Copilot / VS Code

.github/agents/blessthis-council-*.agent.md (+ conductor orchestrator) — per-project

file-merge into .vscode/mcp.json (top-level key servers)

Everywhere the server is registered under the canonical name llm-council as { "command": "uvx", "args": ["blessthis-llm-council-server"] } — a non-destructive merge that never touches your other servers or agents (we only ever write/remove entries matching our fingerprint and blessthis-council-* files).

Philosophy

  • Why blind? Models bandwagon. Show an LLM another model's answer and you get agreement theater, not independent judgment. Hats stay on until scoring is done, so scores reflect the answer, not the author.

  • Why real CLIs instead of API calls? Your seat CLIs already have working auth, tooling, session resume, and model routing. The council spawns the same claude / pi / codex binaries you use interactively — headless, with your config — so there's no second credential store to break and no reimplemented client to drift. This package never makes a direct LLM HTTP call.

  • BYO everything. Models, gateways, API keys, base URLs — all yours, all in seats.yaml. No hosted component, no account, no lock-in.

Telemetry

When enabled, we send only anonymized scoring events: {model, kind, score, usage, tool_version, ts, council_uuid, agent}. agent is which agent CLI hosted the council (claude/pi/codex/cursor/copilot/gemini), "unknown" if undetectable.

We never send: your code, file paths, briefs, answer content, notes, seat names, credentials, or seat-health data.

Uninstall & privacy

blessthis-llm-council uninstall            # removes MCP entries + agent files
blessthis-llm-council uninstall --purge    # also deletes seats.yaml + state.db

Everything lives under ~/.blessthis-llm-council/ (seats, SQLite state) plus the llm-council entry and blessthis-council-* files in your host configs. Nothing else on your system is touched. seats.yaml contains your API keys — keep it 0600 and never commit it.

License

AGPL-3.0-or-later. Fork it, improve it — but improvements to this package must be shared back under the same license.

Available Tools

17 tools
chat_closeB

Mark a chat closed. History is KEPT; a running turn is cancelled.

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_session_idYes

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses two side effects: history is preserved and a running turn is cancelled. However, it doesn't disclose whether closing is reversible, whether subsequent messages will fail, or any permission requirements.

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?

Two short sentences deliver the core action and the two most important side effects. There is no filler, and the content is front-loaded and easy to scan.

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

Completeness3/5

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

For a one-parameter mutation with no output schema, the description covers the main behavioral outcome but leaves gaps: no statement about reopening, error conditions, or the effect on subsequent chat calls. Given the absence of annotations, a bit more context would improve completeness, but the tool is simple enough that these omissions are moderate.

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

Parameters2/5

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

The schema has 0% description coverage and the description does not discuss chat_session_id at all. While the parameter name is self-descriptive, the description provides no guidance on how to obtain or validate the session id, leaving the agent to infer it from context.

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

Purpose4/5

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

States a clear imperative verb and resource: mark a chat closed. The detail that history is kept and a running turn is cancelled helps distinguish it from other chat lifecycle tools like chat_start and chat_send, though it does not explicitly name a sibling.

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

Usage Guidelines2/5

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

No explicit when-to-use or when-not-to-use guidance is provided. The description implies closing is for ending a chat, but it doesn't contrast with alternatives like chat_poll or chat_list or state conditions under which closing should be avoided.

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

chat_historyC

Message-level history of a chat: [{role, content, ts, usage}, ...].

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only provides the return format, omitting any mention of read-only semantics, authentication requirements, pagination, or potential error conditions. It does not contradict annotations (none exist), but leaves key behavioral aspects unspecified.

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 a single, compact sentence that immediately conveys the return structure. There is no fluff or redundant wording; every token serves a purpose, making it highly efficient.

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

Completeness3/5

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

The description gives the return format explicitly, which covers what the tool outputs. However, with many sibling tools and no usage guidance, plus a single parameter whose meaning is only implicit, the definition lacks sufficient context for an agent to confidently invoke it in the right scenario.

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

Parameters2/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 explain the parameter, but it does not mention chat_session_id at all. The schema only gives type 'integer' and a title, leaving the agent to infer the parameter's role from the tool name and context.

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

Purpose4/5

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

The phrase 'Message-level history of a chat' clearly indicates the tool returns the message-level history, and the appended array shape clarifies the return format. This distinguishes it from chat_list (session-level list) and chat_poll (new messages), though it lacks an explicit verb like 'retrieve'.

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

Usage Guidelines2/5

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

The description offers no guidance on when to use this tool versus siblings like chat_poll or chat_list. It does not state whether it returns all history or only new messages, nor does it mention alternatives for filtering or incremental updates.

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

chat_listA

List chat sessions (closed included, marked), optionally filtered to a single working directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
working_dirNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It does disclose an important nuance: closed sessions are included and marked. It does not mention ordering, default behavior when working_dir is empty, or other response characteristics, though 'List' implies a read-only operation.

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 a single, efficient sentence that fronts the primary action and bundles the important behavioral note about closed sessions. Every part of the sentence earns its place, and there is no filler.

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 simple one-parameter listing tool with an output schema, the description covers the core behavior and the optional filter. It does not cover pagination, sorting, or what an empty working_dir means, but the presence of an output schema and the tool's simplicity make this acceptable.

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?

The input schema provides only the parameter name and default value, with no description, so schema coverage is 0%. The description compensates by explaining that the working directory is an optional filter, giving meaning to the sole parameter beyond what the schema offers.

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

Purpose4/5

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

The description states a clear verb and resource: it lists chat sessions, not individual messages, which distinguishes it from chat_history. Mentioning that closed sessions are included and marked adds useful scope. It does not explicitly differentiate from sibling tools beyond that, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description clearly conveys that this tool is for listing chat sessions and that working_dir is an optional filter, which implies the typical use case. However, it does not provide any explicit guidance on when to prefer this over alternatives like chat_history or chat_start, nor does it state exclusions.

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

chat_pollB

Long-poll a queued chat turn; returns early when the turn completes: {status, reply?, usage?, progress?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNo
task_idYes
timeoutNo

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries full responsibility for behavioral disclosure. It mentions the long-poll nature and early return, but omits key behaviors such as timeout handling, immediate return when already complete, potential errors, and side effects. This is insufficient for an agent to anticipate the tool's runtime behavior.

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 a single, concise sentence with no filler, efficiently communicating the core purpose and return format. It could benefit from more details, but the structure is clean and front-loaded.

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

Completeness2/5

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

Given the absence of annotations and output schema, the description is the only source of context beyond parameter names. It fails to explain parameter semantics, timeout behavior, or error conditions, making it incomplete for a 3-parameter polling tool with siblings like chat_history and council_poll.

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

Parameters1/5

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

Schema description coverage is 0% and the description does not mention any parameter names or explain the semantics of task_id, wait, or timeout. It provides no value beyond the raw schema, leaving an agent without guidance on how to set these parameters correctly.

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 states a specific verb ('Long-poll') and a specific resource ('queued chat turn'), clearly differentiating it from siblings like chat_send and chat_history. It also specifies the returned shape, leaving no ambiguity about the tool's core function.

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 implies usage after a chat turn is queued, providing clear context. However, it does not explicitly mention alternatives or scenarios where polling should be avoided, though the nature of the tool makes its use case fairly evident.

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

chat_sendA

Send a message to the chat's seat — ASYNC; returns immediately with {task_id}. Poll the turn with chat_poll.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
chat_session_idYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the key behavioral traits: async operation, immediate return with a task_id, and the need to poll. This adequately informs the agent of the tool's core behavior, though it omits details like error handling or rate limits.

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 a single, front-loaded sentence that conveys the core purpose and async nature immediately, then provides the return type and follow-up action. Every word earns its place with no redundancy.

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?

Given the tool's simplicity and lack of output schema, the description covers the essential aspects: what it does, the async return, and the next step (polling). It does not describe edge cases or detailed response structure, but the mention of {task_id} provides sufficient context for an agent to proceed.

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

Parameters2/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 for parameter meaning. It does not explain 'chat_session_id' or 'message' beyond their obvious names, and no additional context is provided for how they should be used or formatted. The parameter names are somewhat self-explanatory, but the description adds no semantic value.

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 clearly states the action ('Send a message') and the target ('chat's seat'), and explicitly notes the ASYNC behavior, which distinguishes it from synchronous tools like chat_poll. The reference to returning a task_id and polling via chat_poll further clarifies its role.

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 provides clear context that this is an async send and that results are obtained by polling with chat_poll. While it doesn't explicitly state when not to use it, the directive to poll with chat_poll effectively indicates the expected workflow and distinguishes it from the chat_poll tool.

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

chat_startA

Open a direct 1:1 chat with one seat (seats.yaml key). Returns {chat_session_id, seat, model}. model defaults to the seat's first healthy model.

ParametersJSON Schema
NameRequiredDescriptionDefault
seatYes
modelNo
working_dirNo
system_promptNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full transparency burden. It discloses the return shape and the default model behavior, which is useful, but it does not mention side effects, persistence, health requirements, or resource cleanup. It adds some context but leaves significant behavioral aspects unspecified.

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 two sentences, front-loaded with the action and return value. Every word earns its place, and the return value is presented clearly in a compact way.

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

Completeness2/5

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

Given the tool has 4 parameters, no annotations, and no output schema, the description is incomplete. It covers the purpose and return shape but leaves working_dir and system_prompt unexplained, and lacks usage guidance. An agent would need additional information to correctly invoke the tool with the optional parameters.

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

Parameters2/5

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

Schema description coverage is 0%, and the description only explains 'seat' (seats.yaml key) and 'model' (defaults to first healthy model). The parameters 'working_dir' and 'system_prompt' are completely unexplained. Since the description must compensate for the lack of schema descriptions, partial coverage of only half the parameters is insufficient.

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 uses a specific verb phrase 'Open a direct 1:1 chat with one seat' and clearly identifies the resource (a seats.yaml key). It distinguishes itself from sibling council_start (council vs direct 1:1) and chat_send/chat_poll (starting vs continuing a chat).

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

Usage Guidelines3/5

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

The description implies usage as the entry point for a direct 1:1 chat, contrasting with council tools, but it does not explicitly state when to use this tool versus alternatives like council_start or chat_send. No when-not-to-use or alternative guidance is provided.

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

council_answerA

Fetch ONE seat's FULL answer text by blind hat label (e.g. 'hat2') — the content council_poll deliberately omits to keep your context lean. Call once a hat shows status=done in council_poll. Never reveals the model.

ParametersJSON Schema
NameRequiredDescriptionDefault
hatYes
council_idYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses a key trait—this tool never reveals the model—and explains why council_poll omits content. However, it does not describe error cases or behavior if called before a hat is done, though the simple fetch nature makes this less critical.

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?

Two sentences, front-loaded with the core purpose and immediate usage condition. Every phrase earns its place—no filler, no repetition of schema field names beyond necessary context.

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?

The tool is simple (2 params, no output schema, no nested objects), and the description covers purpose, trigger condition, and a key non-behavior (model secrecy). It could mention where to obtain council_id, but the workflow context with council_poll makes the description sufficiently complete.

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

Parameters3/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. It explains 'hat' as a blind label with an example ('hat2') and ties it to 'status=done in council_poll'. It does not explain 'council_id', but the name and context make its role inferable. Partial compensation, not full.

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 uses a specific verb ('Fetch') and resource ('ONE seat's FULL answer text') with a clear identifier ('blind hat label'). It explicitly distinguishes itself from council_poll by stating it retrieves content council_poll omits, and from model-revealing tools by noting 'Never reveals the model.'

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?

Provides explicit when-to-use guidance: 'Call once a hat shows status=done in council_poll.' It also implies when not to use (before done) and references council_poll as the alternative that omits content, plus a clear exclusion ('Never reveals the model').

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

council_askA

Cross-examine ONE seat by its blind hat label (e.g. 'hat2') within a council. Runs a follow-up turn on that seat's session (it may re-read files) and returns its reply synchronously. Never reveals the model. Use to probe disagreements before you synthesize.

ParametersJSON Schema
NameRequiredDescriptionDefault
hatYes
messageYes
council_idYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It states that the tool 'Runs a follow-up turn on that seat's session (it may re-read files)' and 'returns its reply synchronously,' which are meaningful behavioral details. It also discloses the critical constraint that it 'Never reveals the model.' While it doesn't mention potential side effects or error conditions, it covers the most important behavioral aspects for a probe tool.

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 compact and every sentence contributes: purpose, behavioral detail, a critical constraint, and a usage recommendation. It is front-loaded with the primary verb and resource, making it easy 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?

Despite having no output schema and no annotations, the description is quite complete. It explains what the tool does, how it behaves, and when to use it, and it notes that the reply is returned synchronously. It lacks explicit return structure details, but the description's overall clarity compensates for the absence of an output schema.

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

Parameters3/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 for parameter meaning. It gives a concrete example for 'hat' ('hat2') and implies that council_id identifies the council and message is the follow-up prompt. However, it does not explicitly define the expected format or constraints for council_id and message, leaving some ambiguity.

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 clearly states the action ('Cross-examine'), the target resource ('ONE seat by its blind hat label'), and the context ('within a council'). It also distinguishes this tool from siblings by emphasizing it targets a single seat, and the phrase 'Never reveals the model' adds a unique distinguishing constraint.

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 provides an explicit use case: 'Use to probe disagreements before you synthesize.' This gives clear when-to-use guidance. However, it does not explicitly name alternative tools or when not to use it, but the emphasis on 'ONE seat' implies a contrast with broader polling tools.

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

council_closeA

Mark a council closed. Records are KEPT (council, hats with answers/errors, and seat sessions) for history/debugging — nothing is deleted. Score the seats with council_score FIRST if you haven't.

ParametersJSON Schema
NameRequiredDescriptionDefault
council_idYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses a key side effect: 'Records are KEPT ... nothing is deleted,' clarifying the tool is non-destructive to data. It also mentions the ordering requirement with council_score. Missing are details like reversibility or required permissions, but the provided context is valuable.

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 three short sentences, each with a distinct purpose: state the action, note data retention, and give a prerequisite. It is front-loaded and contains no filler, making it highly efficient.

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 simple one-parameter close operation, the description covers the purpose, side effects (nothing deleted), and a critical prerequisite. It does not explain the return value or post-close state, but these are less essential given the straightforward nature of the tool and the presence of sibling tools for other operations.

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

Parameters3/5

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

The schema has a single required parameter, council_id, with no description. The tool description does not explicitly describe the parameter, but 'Mark a council closed' makes its role obvious (the council to close). Since the parameter is simple and self-explanatory, this meets the minimum but adds little extra semantic meaning beyond the schema.

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 clearly states the tool's function with a specific verb and resource: 'Mark a council closed.' This distinguishes it from sibling tools like council_start (begin a council) and council_score (score seats). The purpose is unambiguous.

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?

It provides an explicit precondition: 'Score the seats with council_score FIRST if you haven't.' This tells the agent when not to use this tool yet and names the specific sibling tool to use first, giving clear sequencing and context.

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

council_is_model_repliedA

Blind check: has model finished answering (status=done) in this council? Returns True/False only — never the hat label or answer — so you can confirm a model participated without breaking hat blindness for scoring/synthesis.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
council_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries full behavioral burden. It explicitly discloses that the tool returns only True/False and never the hat label or answer, which is a critical behavioral guarantee. It also implies it is a safe check (no side effects) and is used specifically to preserve blindness, adding context beyond a bare function name.

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 exceptionally concise—two sentences with no filler. It front-loads the core purpose, then adds a critical behavioral caveat and usage context. Every word earns its place.

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 simple boolean-check tool with an output schema, the description covers purpose, behavior, parameter roles, and usage intent. It doesn't discuss error conditions or edge cases (e.g., invalid council_id), but those are not necessary for a tool of this simplicity. The description is complete enough for the agent to use it correctly in normal scenarios.

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

Parameters3/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. It does explain the role of 'model' as the participant whose answer status is checked, and 'council_id' as the context. However, it does not specify any conventions for model values (e.g., name format or source) beyond the schema's type, leaving the agent to infer from sibling tools. This is adequate but has a clear gap.

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 clearly states a specific verb ('has model finished answering') and resource (council), and immediately distinguishes this tool from siblings by emphasizing the 'blind check' nature that returns only True/False without exposing hat label or answer. This makes it unambiguous and separates it from council_poll or council_reveal.

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 provides clear context: use this when you need to confirm a model participated without breaking hat blindness for scoring/synthesis. It does not explicitly mention alternatives or exclusions, but the context is strong enough to guide the agent's selection among sibling tools.

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

council_pollA

Poll a council for seat STATUS ONLY (blind — no model names, no answer bodies, so it never bloats your context). Each hat returns its status; a DONE hat returns answer_chars (size hint); a RUNNING hat returns live progress {turns, output_tokens} read natively from its transcript so you can tell it's advancing vs wedged. With wait=True this long-polls up to timeout seconds, returning early as soon as a new seat finishes or all are done.

FIRST poll: use timeout >= 360 — seats take minutes, and a short first poll just burns turns on no-op status checks (the long-poll returns EARLY the moment any seat finishes, so a big timeout costs nothing). Subsequent polls can be shorter. Call repeatedly until done=true, THEN fetch each answer with council_answer(council_id, hat).

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNo
timeoutNo
council_idYes

TDQS

A5/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 burden of behavioral disclosure. It delivers: the blind/no-bloat design, the meaning of DONE vs RUNNING statuses, the progress object details, long-poll early-return behavior, and the 'returning early' optimization. This is far more transparent than most API descriptions.

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 front-loaded with the core purpose, then explains return behavior and long-poll mechanics, followed by a usage paragraph. Every sentence adds new information—no repetition or filler. Despite being detailed, it remains tight and well-organized, earning a 5.

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?

Despite having no output schema and no annotations, the description covers the essential operational aspects: return types, status semantics, polling behavior, and the follow-up flow to council_answer. It even addresses the edge case of a short first poll burning turns. This makes the tool fully usable without external documentation.

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

Parameters5/5

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

The schema has 0% description coverage, so the description must compensate. It directly explains wait and timeout: 'With wait=True this long-polls up to timeout seconds' and 'timeout >= 360' for the first poll. It even explains the benefit of a large timeout. council_id is self-explanatory from the schema and context. This adds substantial semantic value beyond the bare schema.

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 opens with a clear, specific verb and resource: 'Poll a council for seat STATUS ONLY'. It immediately distinguishes itself from siblings like council_answer by noting that it strips model names and answer bodies, focusing purely on status. This is not a vague or tautological statement; it precisely defines the tool's scope.

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?

Usage guidance is explicit and actionable. It tells the agent to call repeatedly until done=true, then fetch answers with council_answer. It also provides concrete timeout recommendations: 'FIRST poll: use timeout >= 360' and explains why, and notes subsequent polls can be shorter. This goes well beyond vague usage hints.

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

council_revealA

De-anonymize a council: return the hat->model mapping and per-seat status. For human/debug insight AFTER synthesis — do NOT use this to weight the diagnosis.

ParametersJSON Schema
NameRequiredDescriptionDefault
council_idYes

TDQS

A4.3/5.0
Behavior4/5

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

Since there are no annotations, the description carries the full burden of disclosing behavior. It states the output (hat->model mapping and per-seat status) and adds a key warning about not using it for diagnostic weighting, which is a behavioral trait beyond the raw action. However, it does not explicitly state side effects or access requirements, but as a 'reveal' operation focused on returning data, the main behaviors are adequately covered.

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 two sentences, front-loaded with the main action, and each sentence adds value. The first explains what it does; the second provides crucial usage guidance. No waste, perfectly concise.

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 simple tool with one parameter and no output schema, the description covers the essential context: what it returns (mapping and status) and the intended usage scenario. It lacks detailed return value structure (e.g., what 'per-seat status' contains), but for a debug tool, this is acceptable. The warning about non-diagnostic use adds important context, making it fairly complete.

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

Parameters2/5

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

The schema has 0% description coverage—the only parameter, council_id, is just a type and title. The description does not mention council_id at all, so it fails to compensate for the low schema coverage. While council_id is a simple integer, the description adds no meaning beyond the schema, leaving the agent to infer its purpose from the tool name.

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 clearly states the tool's function: 'De-anonymize a council: return the hat->model mapping and per-seat status.' It uses a specific verb ('de-anonymize'/'return') and identifies the resource ('council'). The mention of 'after synthesis' and 'do NOT use this to weight the diagnosis' distinguishes it from sibling tools like council_score and model_scores, which likely serve diagnostic purposes.

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?

The description explicitly states when to use it ('For human/debug insight AFTER synthesis') and when not to use it ('do NOT use this to weight the diagnosis'). This gives clear context and an exclusion, satisfying the 'explicit when/when-not' criterion even without naming an alternative tool.

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

council_scoreA

Score each seat's reply — the MANDATORY end step of every council, AFTER your synthesis and BEFORE council_reveal (so scores can't be biased by model identity). scores: [{"hat": "hat1", "score": 7, "notes": "verified root cause, thin on fix"}, ...] score is 1-10; judge correctness against the verified code, depth, and actionability. The server resolves hat->model itself, feeding the per-model quality leaderboard (see model_scores).

ParametersJSON Schema
NameRequiredDescriptionDefault
scoresYes
council_idYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It reveals that the server resolves hat->model itself, that scores feed a per-model leaderboard, and that scores are judged on correctness, depth, and actionability. It does not mention the response format or what happens on duplicate calls, but the core side effects are clearly disclosed.

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 dense and front-loaded with the purpose, followed by an example and scoring rubric. No filler words, but the embedded JSON example makes it longer than strictly necessary. Overall, each sentence contributes useful information.

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?

Given the lack of annotation and output schema, the description covers the essential workflow context: when to call, how to score, what fields to provide, and where results go (model_scores). Minor gaps exist: council_id is not explained and the return/acknowledgment behavior is unspecified. Still, the tool is well contextualized within its sibling workflow.

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?

The schema is minimal (0% coverage; scores items are free-form with additionalProperties), so the description must add meaning. It provides an example object shape with hat, score, and notes, defines the score range (1-10), and explains the scoring criteria. Council_id remains undocumented and notes optionality is unclear, but the description compensates substantially for the schema gap.

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 uses a specific verb-object pair ('Score each seat's reply') and immediately identifies the tool as the MANDATORY end step of every council. It distinguishes itself from siblings like council_reveal and model_scores by naming the exact temporal position in the workflow, so the agent knows exactly what this tool does and how it differs.

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?

Usage is explicitly stated: it must run AFTER synthesis and BEFORE council_reveal, and it is labeled MANDATORY for every council. The rationale (avoiding bias by model identity) provides context for why ordering matters. This is strong, actionable guidance for when to invoke the tool.

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

council_startA

Convene a blind multi-model council on a hard problem. Fans brief out to one seat session per model — each an independent file-reading agent bound to working_dir — runs them CONCURRENTLY in the background, and returns IMMEDIATELY with a council_id and blind hat labels (hat1, hat2, ...). The hat->model mapping is hidden (revealed only via council_reveal), so you can synthesize across seats without knowing which model produced which answer. Poll for answers with council_poll.

models: OPTIONAL — omit it (or pass []) to get the default one-seat-per-family roster. working_dir defaults to the server's current working directory.

kind: what this council is FOR, e.g. "bug", "review", "architecture" (default "adhoc"). Purely descriptive record-keeping — never affects routing — but persisted so the council history shows why a council was convened.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoadhoc
briefYes
modelsNo
working_dirNo
seat_system_promptNo

TDQS

A4.6/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 burden of behavioral disclosure. It reveals that seats run concurrently in the background, that the tool returns immediately, that the hat->model mapping is hidden, and that the 'kind' parameter never affects routing—all beyond what the schema or annotations provide.

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 well-structured with three focused paragraphs: core behavior, optional parameters, and the 'kind' parameter. Every sentence provides value, front-loaded with the primary purpose, and uses formatting (bold, backticks) to enhance readability without waste.

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?

Given the lack of an output schema, the description adequately explains the immediate return value (council_id and blind hat labels) and points to council_poll for retrieving answers. It covers most parameters and important behavioral details, but omits the seat_system_prompt parameter and does not describe potential error conditions or lifecycle management (e.g., council_close).

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?

The description adds meaningful semantics for four of the five parameters: brief (fanned out to seats), models (optional, default roster), working_dir (defaults to server CWD), and kind (purely descriptive, never affects routing). However, it does not explain 'seat_system_prompt,' leaving that parameter underspecified despite schema description coverage being 0%.

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 opens with 'Convene a blind multi-model council on a hard problem,' clearly stating the verb and resource. It then details the exact behavior (fans brief out to one seat per model, runs concurrently, returns immediately) and differentiates itself from siblings by mentioning council_poll and council_reveal, making it distinct from chat and other council tools.

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 ('on a hard problem') and explicitly references council_poll for polling answers and council_reveal for unmasking hat-to-model mappings. It does not explicitly state when not to use it versus chat_start, but the context and sibling references provide sufficiently clear usage guidance.

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

list_seatsA

List the seats defined in seats.yaml: {seats: [{name, models, runner_kind}, ...], warnings: [...]} (loader warnings surfaced, e.g. a seat skipped for validation errors). A seat is an LLM family served by a local agent CLI (claude/pi/codex).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses the data source (seats.yaml) and the return format (seats and warnings), and hints that warnings may indicate skipped seats. However, it does not explicitly state that the operation is read-only, nor does it mention potential errors or side effects beyond loader warnings.

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 a single sentence with no fluff, front-loading the action. It packs the return format and a brief explanation of warnings and seat concept efficiently. Slightly dense but not verbose.

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 no-parameter listing tool, the description provides the return format, warns about possible loader warnings, and explains the domain concept of a seat. It lacks only explicit usage context, but that is covered under usage guidelines. Given the absence of an output schema, this is sufficiently complete.

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?

The tool has zero parameters and the schema documents none. The baseline for 0 parameters is 4, and the description adds no parameter-specific meaning since there are none to define.

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

Purpose4/5

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

The description states a specific verb ('List') and resource ('seats defined in seats.yaml'), and clarifies what a seat is (LLM family served by CLI). It does not explicitly contrast with sibling tools, but the name and description make its purpose unambiguous.

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

Usage Guidelines3/5

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

Usage is implied by the name and description; there is no explicit guidance on when to use it versus alternatives, nor exclusions. The description does not mention any alternative tools or conditions, leaving it to the agent to infer that it is the tool for listing seats.

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

model_scoresA

Per-model quality leaderboard from all council scores: avg_score, eval count, and the 5 most recent scores per model.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses the data composition (all council scores, avg, count, recent scores) but does not mention whether the data is live, cached, or whether there are any conditions (e.g., requires an active council). No side effects are implied, but for a read-only leaderboard this is adequate though not thorough.

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?

A single, readable sentence that packs essential information: the metric (leaderboard), source (council scores), and specific fields returned. No wasted words.

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 zero-parameter, simple aggregate query with an output schema, the description covers the behavior and contents. No additional context is necessary.

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?

The tool has zero parameters, so the description needs no parameter details. The schema coverage is 100% (vacuously). Per baseline guidance, 0 params earns a 4, and the description adds no unnecessary param info.

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 states a specific verb+resource: 'Per-model quality leaderboard' aggregated from council scores. It clearly identifies the output contents (avg_score, eval count, 5 most recent scores), distinguishing it from sibling council tools like council_reveal or council_score which likely operate per seat or per score.

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?

Implicitly clear that this is for viewing a leaderboard of model quality across all council scores. It gives no explicit exclusions or alternative tool references, but the context is sufficient for a simple query tool with no parameters.

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

seat_healthA

Dump the seat/model availability cache: per-model status (ok/cooldown), the classified reason (balance/quota), the last error, and cooldown expiry. Seats record capacity failures here; council_start skips models in cooldown. (Renamed from model_health, Decision #20; backing table renamed in P2.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It clearly indicates a read-only 'dump' operation and enumerates the output fields, but it does not explicitly state that there are no side effects. The phrase 'Seats record capacity failures here' could be misread as a write operation, though the verb 'dump' clarifies the tool's read-only nature.

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 concise and front-loaded, with the core purpose in the first sentence. The second sentence adds relevant behavioral context, and the final parenthetical historical note is brief and does not obfuscate. Every sentence earns its place without unnecessary verbosity.

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 simple, parameterless dump tool with an output schema, the description is complete. It explains what the tool returns, what the statuses and reasons mean, and how the data relates to council_start behavior. It also notes the rename for continuity. No additional context seems necessary.

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?

The tool has zero parameters and the schema coverage is 100% (empty). The description adds value by describing what the returned dump contains, providing semantic context that the schema cannot. This meets the baseline of 4 for a parameterless tool.

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 clearly states the tool's function with a specific verb ('Dump') and a well-defined resource: the seat/model availability cache. It enumerates the exact data returned (per-model status, classified reason, last error, cooldown expiry), making its purpose unambiguous and distinguishing it from sibling tools that perform actions or list seats.

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 provides clear context for when this tool is relevant by explaining that seats record capacity failures here and that council_start skips models in cooldown. This implies usage for debugging availability before council operations, though it does not explicitly state exclusions or directly contrast with alternatives like list_seats.

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

TDQS

A4/5.0
Disambiguation5/5

The tools are clearly separated into council and chat workflows, plus supporting utilities. Within each group, actions like poll, answer, ask, and score are unambiguous. The only near-overlap (council_poll vs. council_is_model_replied) is resolved by distinct purposes—status reporting vs. model-presence check.

Naming Consistency5/5

All tools follow a consistent snake_case convention with clear prefixes: council_* for council operations, chat_* for chat operations, and descriptive nouns like model_scores, seat_health, list_seats. The pattern is predictable and uniform across the surface.

Tool Count4/5

With 17 tools, the count is slightly above the typical well-scoped range, but the domain spans two distinct workflows (councils and chats) plus seat/quality management, so each tool serves a clear purpose without redundancy. The bulk is justified by the multi-step nature of both workflows.

Completeness5/5

The council lifecycle is fully covered from start to poll, answer, cross-examine, score, reveal, and close, including blind checks and persistence. The chat workflow also has full CRUD and history. Seat management and model quality feedback round out the surface with no obvious gaps.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/blessthis/llm-council'

If you have feedback or need assistance with the MCP directory API, please join our Discord server