Skip to main content
Glama

A plugin that lets your AI agent ask other coding agents for independent opinions, returned separately.

The consultants are Codex, Claude Code, Antigravity and OpenCode. Your agent (the lead) consults when an investigation stalls or two options look equally good. You can also ask for a consultation yourself: "ask Codex".

Each consultant's answer stays separate. The lead checks the findings and the reasons behind disagreements itself, then carries on from what it found. For an important decision, such as a change that is hard to reverse, it consults before asking you to approve it, and asks you only about what is yours to decide.

For example, a cache review can reveal that member-specific prices would leak to other users. The lead checks the pricing assumptions, chooses what can be cached, and records what remains unverified. The worked example follows the separate recommendations through that decision.

Contents

Related MCP server: Senior Consult MCP

Install

Requirements

  • Node.js 22 or newer. Some OpenCode 2.x authentication recovery needs node:sqlite; status reports whether it is available. Normal login can still work without it. See recovery requirements.

  • At least one of the four CLIs, installed and logged in. One is enough: with only Claude Code, you can still ask a fresh Claude Code session.

Prepare the CLI you want to consult using the installation and login links.

Installing

The command below installs severally and registers it with existing CLIs; it does not install or log in to those CLIs. One line, on macOS, Linux and Windows (PowerShell or Command Prompt):

npx -y severally-mcp@2.9.0 install

The installer registers severally with each CLI it finds on PATH. Add --dry-run at the end to print what it would change without changing anything.

Then restart the clients: a running session does not reload the new registration. To check the setup without starting a consultation, run:

npx -y severally-mcp@2.9.0 status

It shows the config file, the consultants this machine can reach, the installed copies' versions, which clients have severally registered and whether each CLI is logged in. The login check reads the CLI's own status command and sends no prompt; running out of quota is not checked, and the first consultation shows it.

Part of the output on a machine with Codex and Claude Code:

config: ok

consultants:
  codex: codex, gpt-6.1-sol  available
  claude-code: claude-code, claude-opus-5-5  available

clients:
  Claude Code  registered (listed by the client)
  Codex        registered (listed by the client)

login (out of quota is not checked; the first consultation shows it):
  codex        logged in
  claude-code  logged in

No configuration is normally needed. To ask the first question, see Asking.

Marketplace installs, installing from a clone, and the fallback when global npm installation is unavailable are in the installation details; --dry-run, --manual, --force and the other flags are in the installer options.

The installer and the server are tested on Linux, macOS and Windows in CI. The Claude Code and Codex marketplace routes and the real CLIs have been tried on Linux only. On Windows, cancelling a consultation stops its process tree while the consultant's CLI is still running. If the CLI has already exited, processes it started may survive; what remains in that case is observed, not guaranteed.

Updating

This line replaces your install with the latest version, with no version number to look up:

npx -y severally-mcp@latest install

With @latest, npx asks npm for the newest version every time, so an older copy it already has is not used. If Claude Code has severally from its plugin marketplace, the same line updates that copy too (details in docs/install.md). Then restart the clients. What changed in each version is in the releases.

Uninstall

Installed from the marketplace: run /plugin marketplace remove severally in Claude Code, which also removes the plugin. For an installer install, the commands for each OS and install mode are in docs/install.md. Either way, history and backups stay in ~/.severally/; delete it if you no longer need them.

Usage

Asking

In your restarted agent's chat, ask:

Ask Codex: Our read-only public API gets 100 requests per minute.
Updates may appear 60 seconds late. Is a 30-second cache reasonable?

If Codex is not installed, use a consultant marked available by status. A report looks like this; the answering model, checks and unverified points depend on the consultation:

Codex (gpt-6.1-sol) suggested a 30-second cache: it is within the 60-second allowance.
Delays from other cache layers are unverified; check that their combined delay stays
within 60 seconds before adopting it.

Then ask: "Ask the same consultant what changes if updates must appear within five seconds."

Ask in your own words, and include the premises in your question. For code questions, name the files or the change:

> ask Codex whether this migration plan is safe
> get a second opinion on this cache design
> ask everyone before we merge this
  • Name a consultant ("ask Codex", "ask Claude Opus") and only that one is asked. A CLI's name works, and so does a model's.

  • Ask for a second opinion without naming anyone, or ask everyone, and the same brief goes to every consultant, a fresh session of your own CLI included. That is one consultation's quota per consultant.

  • The agent also consults without being asked: when an investigation stalls, when two options look equally good, and before asking you to approve a hard-to-reverse change.

What comes back to you is the lead's report, not the consultants' answers as they arrived: what it checked and what that showed, what it recommends, and what is still unverified. The example shows one.

It is worth it for important design decisions, hard-to-reverse choices, and two or more failed attempts at the same bug. One consultation takes minutes and real quota, so it is not for small fixes.

Answers, checks and failures

The agent can work on independent tasks while it waits. Answers usually take one to ten minutes, depending on the CLI, model and load. Each includes a stance, findings with grounds, unknowns and proposed checks. A failure (usage_limit, timeout and so on) means no advice was obtained.

The lead checks the claims that could change the decision and records evidence separately from adoption. It reports each consultant's actual model, the deciding point and its ID, what the check showed, its recommendation and what remains unverified. Different conclusions stay separate. If one consultant fails, the successful answers remain usable; the agent can retry just the failed consultation when needed.

Follow-ups and history

Ask “Continue yesterday's cache consultation” or “Recheck that finding against the updated code.” The agent can find the saved consultation and continue with the same consultant; you do not need to copy IDs. When several candidates fit, it checks which one you mean. By default a chain permits five rounds in total. Files are sent again in their current state, with changes and deletions noted.

Consultations and verification records stay in ~/.severally/history/. They can be updated from a later session or exported as Markdown with verified points, decision effects and unchecked counts before the full answers. A confirmed point means the check supported it; it does not mean the lead adopted the advice. See modes and follow-up details and records.

Configuration

No configuration needed by default. At startup the server looks for the CLIs on PATH, and each one it finds becomes a consultant on its default model. To turn a CLI off or add consultants on other models, put a ~/.severally/config.jsonc or config.json in place (config.jsonc takes precedence). From a clone, npm run init-config writes a template. Every key is in CONFIG.md, and config.example.json is an example to adapt: its paths, models and notes are made up. For separate models for everyday work and consultations, see the optional multi-model example. Restart the client after changing the config.

To consult a model you reach with an API key (OpenRouter, or another OpenAI-compatible API) or a local model, install OpenCode and add the model as a consultant: see the four-step OpenCode setup.

What a consultant can see and do

A consultation sends the brief to that CLI's model, the same way using the CLI yourself does. It does not automatically inherit your parent session's history: anything the lead includes in the brief is sent, and files the consultant is allowed to read also go to its model. The read-only setting does not isolate what it can read. No consultant can:

  • write files

  • use MCP

  • start other agents or consult anyone else

  • use the network, except for web search and browsing

Consultant

Reads files

Credential paths

Shell

Writes

Web search / browsing

Codex

yes

blocked by path (permission profile), not by file name such as .env

yes, in its sandbox (commands run, but cannot write or reach the network)

no

yes, unless network: "off"

Claude Code

yes (Read / Glob / Grep)

blocked (permission rules)

none

no

yes, unless network: "off"

Antigravity

yes (view_file, read_file)

blocked (tool hook)

none

no

yes, unless network: "off"

OpenCode

yes (read)

blocked by lexical path; symlink aliases are not covered

none (its Code Mode execute is refused)

no

yes, unless network: "off"

Every consultant starts in a working directory of its own that holds only copies of the files you handed it, and the server does not tell it where your repository is. It can still read any file your user account can read, except the credential paths the table marks blocked. The one exception is Claude Code in a consultation that exposes files: it can then read only those copies. Codex does not block by file name, so a .env in your repository is readable to it. Its protection also misses files created later under ~/.codex and, on Linux, protected files replaced by rename during a run. Recognized absolute credential-location variables are protected, but arbitrary locations and new aliases are not. A relocated Codex credential directory is denied as a whole only if its executable lives elsewhere.

A consultant that can both read your disk and browse could carry what it read out in a URL, for example if a page it opens tells it to. To prevent that, the agent passes network: "off": every consultant in that round then has no web search or browsing. To make that the rule for every consultation, set "server": { "network": "off" } in the config file; a request cannot turn it back on. The brief, and whatever a consultant reads, still goes to that CLI's model.

How each CLI is held to this is in docs/how-it-works.md.

API

The server has six MCP tools. Of these, only consult_start starts an external consultation, sending the brief and exposed files to each consultant's model. Once started, a consultant can read files or browse within its permissions; those contents can also leave the machine. The other five tools operate on local consultation state and records. Every argument is described in the tool descriptions the agent reads.

Tool

What it does

consult_start

Starts one (target) or several (targets) consultations; retry_of replays only a failed job

consult_get

Waits for a consultation and returns its state or answer; with ids, just those points of the answer

consult_cancel

Stops a consultation or a whole fan-out, and its consultant processes, also one another session started

consult_record

Writes the lead's verdicts on an answer's points, and what the answer added

consult_list

Finds consultations by consultant, question or chain; includes continuation IDs and session usage

consult_export

Returns a consultation, follow-ups and verdicts included, as Markdown

Arguments and file exposure are described in How it works.

Contributing

Questions and bug reports go to Issues. Pull requests are welcome; for a large change, open an issue first so we can talk it over. Everyone taking part is expected to follow the Code of Conduct.

  • npm install, then npm test. The tests run offline against stand-in CLIs and make no real API calls.

  • CI also runs npm run lint, npm run typecheck and npm run format:check. Run them before you open a pull request.

  • After changing the source or the Skill template, run npm run build. The built server in plugins/severally/dist/ and the generated Skills are committed, and CI fails when they are out of date.

  • npm run live-check and npm run doctor run real consultations against the CLIs you have installed, and spend real quota. doctor also prints each CLI's version. Before a release, run both against the CLIs on hand and put the versions, the date and the OS in the release notes.

License

Apache-2.0 © 2026 coz.a

Available Tools

6 tools
consult_cancelCancel a running consultationA
Idempotent

Stop a running consultation (job_id) or fan-out (group_id). Other severally servers receive a stop request. The process tree is signalled where the platform permits; on Windows descendants may survive if the CLI already exited.

NameRequiredDescriptionDefault
job_idNo
group_idNo

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare that this is a mutating but idempotent operation, and the description adds useful behavioral context: other servers receive a stop request, the process tree is signalled where permitted, and Windows descendants may survive if the CLI already exited. It does not describe permissions or partial-failure responses, but the added distributed cancellation caveat is meaningful beyond the annotations.

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 compact sentences with the action and target types front-loaded. The remaining sentences add distributed-stop and platform-caveat details without unnecessary preamble.

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 cancellation tool with annotations covering mutation and idempotency, the description provides the key operational context: what is stopped, that other servers are notified, and the platform limitation on descendants. It leaves some gaps around return behavior and exact identifier requirements, but is largely complete for this complexity level.

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 coverage is 0%, so the description must carry parameter meaning. It usefully maps job_id to a running consultation and group_id to a fan-out, and "or" implies choosing one, but it does not explicitly state that exactly one identifier is required, whether both may be supplied, or what happens if neither is provided.

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 and resource: "Stop a running consultation" or "fan-out". It clearly distinguishes cancellation from sibling operations such as consult_start, consult_get, consult_record, consult_export, and consult_list by describing the terminating action and the two target types.

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 when to use the tool by mapping job_id to stopping a consultation and group_id to stopping a fan-out. However, it does not explicitly state prerequisites, when not to use it, or which sibling tools should be used to find the relevant identifiers.

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

consult_exportExport a consultation as a record to commitA
Read-only

Render one consultation (chain_id) or fan-out (group_id) as Markdown: the brief as sent, each answer as it came back, and verdicts on each point. Starts with verified points/effects/evidence and unverified count; no inferred adoption or scoring. The text is returned, not written: put it beside the code the decision is about. Reads the history, so an earlier session's consultation can be exported.

NameRequiredDescriptionDefault
chain_idNo
group_idNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real value on top: it does not write files, it can read earlier sessions, it omits inferred adoption or scoring, and it specifies the document's opening section. Missing only pagination/size behavior, which is minor for a render operation.

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?

Roughly 60 words, front-loaded with the action and output format, then usage, then the history-reading caveat. Dense but nearly every clause carries information; the 'no inferred adoption or scoring' clause is the only slightly tangential bit.

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?

With no output schema, the description does the necessary work by describing the Markdown layout and its leading verified/unverified summary. The one remaining gap is the chain_id-vs-group_id selection rule, which an agent would need in order to call it unambiguously.

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 coverage is 0%, so the description must compensate, and it does explain what each id means: chain_id = a single consultation, group_id = a fan-out. However, it never states whether the two are mutually exclusive or that one must be supplied despite required=0, which is the key ambiguity an agent faces here.

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 names a specific verb (render) and resource (one consultation or fan-out) and enumerates the payload: brief, answers, verdicts. It implicitly separates itself from consult_get by promising Markdown text rather than structured data, though it never names a sibling explicitly, which keeps it just shy 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 Guidelines4/5

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

'The text is returned, not written: put it beside the code the decision is about' tells the agent the intended use and that no artifact is created, while 'Reads the history, so an earlier session's consultation can be exported' clarifies it works on past sessions. No named alternatives or explicit when-not conditions are given.

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

consult_getGet consultation status or resultA
Read-only

Wait for job_id or group_id (default 45000 ms; wait_ms: 0 polls). Repeat while running; progress is sent every 15 s. completed has advice; failed has failure.kind and no advice. A group includes statuses and comparison.by_target: actual model, stance, points/grounds and truncation markers. Read grounds already present. For missing/shortened deciding points use job_id + ids: ["f2", "u1"]; job_id alone gets one whole answer. detail: full adds the brief/question. Check deciding claims, batch checked entries in consult_record, then report; unchecked points stay unverified.

NameRequiredDescriptionDefault
idsNowith job_id: return only these points of the finished answer (f1, u1, c1 ...), each whole with its grounds and, under `recorded`, the verdict you wrote
detailNo
job_idNo
wait_msNo
group_idNo

TDQS

A4.2/5.0
Behavior4/5

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

The description adds substantial behavior beyond the read-only/open-world annotations: default wait time, 45s cap, 15s progress updates, completed vs failed payload differences, group comparison fields, truncation markers, and detail mode behavior. It is strong for a polling tool, though it does not cover error behavior or invalid-id handling.

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 compact and front-loads the polling behavior before covering result shapes and follow-up workflow. It is dense and somewhat telegraphic, with several fragmented clauses, but most sentences earn their place and give actionable 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?

For a five-parameter polling/result tool with no output schema and low schema description coverage, the description covers the main states, result fields, waiting behavior, detail mode, and follow-up workflow. It is nearly complete, with minor gaps around error cases, combining job_id and group_id, and fallback behavior for invalid inputs.

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?

Schema description coverage is only 20%, so the description carries most of the burden and does so effectively. It explains wait_ms defaults and polling with 0, the job_id vs group_id distinction, the detail: full option, and the ids behavior including job_id + ids versus job_id alone. This meaningfully compensates for the sparse schema descriptions.

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 clearly states the core operation: waiting/polling on a job_id or group_id until completion, then returning consultation status or results. It distinguishes job and group result shapes and mentions specific states like completed and failed. It does not explicitly contrast itself with sibling tools such as consult_list, which keeps it from 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 Guidelines4/5

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

It gives practical usage guidance: repeat while running, use wait_ms: 0 to poll, check deciding claims, batch checked entries in consult_record, and report afterward. It also explains how to retrieve missing or shortened deciding points with job_id plus ids. The main gap is that it does not say when to choose this tool over consult_list or other alternatives.

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

consult_listList recent consultationsA
Read-only

Recent consultations, earlier sessions' too (this_session is false), newest first, with their ids, status, summary, verdicts, latest_completed_job_id and rounds_remaining. Optional target, question (case-insensitive substring), chain_id filters apply before limit. usage_totals is the tokens/cost reported this session, retries included. A figure a CLI does not report is named under not_reported, not counted as zero.

NameRequiredDescriptionDefault
limitNo
targetNo
chain_idNo
questionNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: newest-first ordering, the exact field set returned, the fact that filters are applied before the limit, and the nuance that usage_totals includes retries while unreported figures appear under not_reported rather than as zero. It stops short of describing default limit behavior or the shape of a paginated/empty result.

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?

Front-loaded with what the tool returns, then filters, then the usage_totals caveat — a sensible ordering. Every sentence carries information, though the dense run-on phrasing around the filters and usage_totals requires a second read.

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?

With no output schema, the description correctly takes on the job of enumerating return fields and their ordering, which it does well. Filter-vs-limit ordering and the not_reported convention round it out. The main residual gap is the unexplained 'target' filter, which matters for a tool with four optional parameters.

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 carries the full burden. It meaningfully explains 'question' as a case-insensitive substring filter, states that filters (target, question, chain_id) apply before limit, but leaves 'target' and 'chain_id' semantically opaque — an agent cannot tell what a target is or what a chain groups. Three of four parameters get some treatment, but the coverage gap is not fully compensated.

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 names a specific resource (recent consultations) and enumerates the returned fields (ids, status, summary, verdicts, latest_completed_job_id, rounds_remaining) plus ordering (newest first). The parenthetical '(this_session is false)' clarifies it spans earlier sessions, which implicitly distinguishes it from a single-session view. It never names a sibling tool like consult_get to draw the boundary explicitly, so it falls 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?

Usage is implied by the listing nature and by 'filters apply before limit', but there is no explicit statement of when to choose this over consult_get (single record) or consult_export. No when-not guidance and no prerequisites are given. An agent can infer the selection rule, but must infer it.

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

consult_recordRecord what checking a point showedA
Idempotent

Save checks against point IDs from consult_get: f1 (finding), u1 (unknown), c1 (next check). verdict = confirmed/not_applicable/unverifiable/unverified; effect = decision impact; note = checked evidence. Confirmed is not adoption. Record only checked points; same ID replaces its entry. Use records: [{ job_id, entries, reflection? }, ...] for one fan-out batch. Invalid jobs/IDs prevent every write; write failures appear per job in results. Saved history survives restart; only verdict/effect go to follow-ups. Optional reflection describes what the answer added over your prediction.

NameRequiredDescriptionDefault
job_idNothe job_id consult_get returned
entriesNo
recordsNoone per fan-out member, instead of job_id/entries/reflection
reflectionNowritten after reading the answer

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing failure semantics ('invalid jobs/IDs prevent every write; write failures appear per job in results'), persistence ('saved history survives restart'), and downstream propagation ('only verdict/effect go to follow-ups'). It also disambiguates the verdict semantics ('Confirmed is not adoption'), which the annotations cannot convey.

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?

Front-loaded with the primary action and token vocabulary, then layered with semantics, batching, and failure behavior in a tight ~110 words. The telegraphic clauses ('Confirmed is not adoption', 'Invalid jobs/IDs prevent every write') are dense but each carries distinct information rather than 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?

For a 4-parameter tool with nested objects, no output schema, and a write annotation set, the description supplies the missing behavioral and failure context an agent needs. Return-value shape is only loosely gestured at ('write failures appear per job in results'), which keeps it from a 5.

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?

At 75% schema coverage the schema already documents job_id, id, note, effect, and reflection fields; the description still adds real meaning by defining effect as 'decision impact' and note as 'checked evidence', and by explaining verdict values inline. It does not cover limits like maxItems 100 entries or 9 records, so it falls short of full compensation.

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?

States a specific verb and resource ('Save checks against point IDs') and immediately grounds it in the sibling that produces those IDs (consult_get), with concrete token formats f1/u1/c1. An agent can distinguish this from consult_get, consult_list, or consult_export without opening any schema.

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?

Gives clear operating rules: 'Record only checked points' and 'same ID replaces its entry', plus a routing rule that fan-out batches go through 'records' rather than job_id/entries. It names consult_get as the upstream source but does not explicitly state when NOT to record or how this relates to consult_cancel/consult_list, so no true exclusions.

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

consult_startStart a peer consultationA

Start one consultant (target) or several (targets); returns job_id or group_id immediately. Available (name: CLI, model): (none -- no consultant CLI is installed) Pass the user's name/CLI/vendor/model wording; target_ambiguous lists candidates, target_unavailable lists available ones. targets: ["all"] asks every available consultant, including your CLI (marked same lineage). Each gets an identical brief; one concurrency seat each. Model and limits are operator-owned. followup_to: completed job_id or group_id; only question is also needed. Inherits the prior inputs; explicit fields, even empty, replace them. Files are recopied in their current state; add expose_paths or set expose_from_parent: false. retry_of: failed job_id alone replays saved inputs in a new chain, with current files and a link to the failure. Use successful group answers first; retry only failed members after fixing auth/quota causes. No other request fields. mode defaults from context: facts = explore, proposal = review, proposal + counterpoints = debate. For code: expose_diff: { repo, base? } for changes, expose_paths: [absolute paths] for relevant callers, tests and config. Files are copied read-only, secrets masked; symlinks/protected paths skipped. Caps: 20 entries, 500 files, 5 MB. Inspect files_exposed and the manifest; missing premises stay unknown. Other context: facts, artifacts (logs/test output). network: on/off controls web access, not model submission or local reads; boundary states CLI-specific enforcement. caller/caller_model identify you; initiator: user only when asked. Optional prediction: { expected, worry } stays local.

NameRequiredDescriptionDefault
requestYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only flag non-readOnly, openWorld and non-idempotent; the description adds substantial behavior the agent could not otherwise know: read-only file copies with secrets masked, skipped symlinks/protected paths, hard caps (20 entries, 500 files, 5 MB), one concurrency seat per consultant, operator-owned models/limits, and the local-only nature of the prediction field. It also clarifies that network:on/off controls web access rather than model submission.

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

Conciseness3/5

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

The purpose is front-loaded in the first sentence, but the remainder is a dense telegraphic wall of semicolon-chained fragments with parenthetical asides. Almost every line carries information, yet the lack of structure (no grouping of targeting vs context vs retry fields) makes it hard 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 single-object-param tool with a deep nested schema, no output schema and no param descriptions, the description supplies most of what an agent needs to call it correctly, including the immediate return identifiers. It still omits several request fields (objective, question, constraints, success_criteria, artifacts) and does not say how to inspect the resulting job beyond navigational advice.

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?

With 0% schema description coverage the description must carry all parameter meaning, and it does for the high-risk ones: target vs targets, followup_to inheritance and replacement semantics, retry_of replay behavior, mode defaults, expose_diff/expose_paths/expose_from_parent, caller/caller_model/initiator, and prediction. It leaves objective, question, constraints, success_criteria and artifacts undescribed, so coverage is good but incomplete.

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 opening sentence states a specific verb and resource ('Start one consultant (target) or several (targets)') and even gives the return value ('returns job_id or group_id immediately'). It does not explicitly name the sibling tools, so an agent must infer that consult_get/consult_list are for polling rather than starting.

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?

Gives clear routing rules: use followup_to for a completed job/group, use retry_of only for a failed job, and 'retry only failed members after fixing auth/quota causes'. It also explains targets:["all"] and the mode defaults (facts=explore, proposal=review, proposal+counterpoints=debate). What is missing is any explicit statement of when NOT to start a consultation or which sibling to use instead.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv2.9.0
    • Changedconsult_list3 fields changed
      • addedInput schema / properties / chain_id
        Added value: +{
        +  "maxLength": 80,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / question
        Added value: +{
        +  "maxLength": 4000,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / target
        Added value: +{
        +  "maxLength": 120,
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedconsult_start2 fields changed
      • addedInput schema / properties / request / properties / retry_of
        Added value: +{
        +  "maxLength": 80,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / request / required
        Removed value: -[
        -  "question"
        -]
  2. 4 tool updatesv2.6.1
    • Changedconsult_get2 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "enum": [
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / ids
        Added value: +{
        +  "description": "with job_id: return only these points of the finished answer (f1, u1, c1 ...), each whole with its grounds and, under `recorded`, the verdict you wrote",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
    • Removedconsult_offer_declined
    • Changedconsult_record9 fields changed
      • changedInput schema / properties / entries / items / properties / effect / description
        Previous value: -"what it changed about your decision, or why it is still unverified"New value: +"what it changed, or why it is unverified"
      • changedInput schema / properties / entries / items / properties / id / description
        Previous value: -"the point this verdict is about: f1, u1, c1 ... as returned in the result"New value: +"f1, u1, c1 ... from the result"
      • changedInput schema / properties / entries / items / properties / note / description
        Previous value: -"what you checked and what you found"New value: +"what you checked and found"
      • changedInput schema / properties / job_id / description
        Previous value: -"the consultation to record against -- the job_id consult_get returned for it"New value: +"the job_id consult_get returned"
      • addedInput schema / properties / records
        Added value: +{
        +  "description": "one per fan-out member, instead of job_id/entries/reflection",
        +  "items": {
        +    "properties": {
        +      "entries": {
        +        "items": {
        +          "properties": {
        +            "effect": {
        +              "description": "what it changed, or why it is unverified",
        +              "maxLength": 4000,
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "f1, u1, c1 ... from the result",
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "note": {
        +              "description": "what you checked and found",
        +              "maxLength": 4000,
        +              "type": "string"
        +            },
        +            "verdict": {
        +              "enum": [
        +                "unverified",
        +                "confirmed",
        +                "not_applicable",
        +                "unverifiable"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "verdict"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "job_id": {
        +        "description": "the job_id consult_get returned",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "reflection": {
        +        "description": "written after reading the answer",
        +        "properties": {
        +          "delta": {
        +            "description": "what the answer added over what you expected (\"nothing new\" counts)",
        +            "maxLength": 4000,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "related_item_ids": {
        +            "description": "f1, u1, c1 ...",
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 50,
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "delta"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "job_id"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 9,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / reflection / description
        Previous value: -"written after you have read the answer. There is deliberately no hit/miss label: a point you predicted can still arrive with the evidence that settles it, and a surprise can still be wrong."New value: +"written after reading the answer"
      • changedInput schema / properties / reflection / properties / delta / description
        Previous value: -"what the answer added over what you already expected -- including \"nothing new\", which is a real outcome"New value: +"what the answer added over what you expected (\"nothing new\" counts)"
      • changedInput schema / properties / reflection / properties / related_item_ids / description
        Previous value: -"the points this is about: f1, u1, c1 ..."New value: +"f1, u1, c1 ..."
      • removedInput schema / required
        Removed value: -[
        -  "job_id"
        -]
    • Changedconsult_start26 fields changed
      • removedInput schema / properties / request / properties / constraints / default
        Removed value: -[]
      • removedInput schema / properties / request / properties / context / default / artifacts
        Removed value: -[]
      • removedInput schema / properties / request / properties / context / default / counterpoints
        Removed value: -[]
      • removedInput schema / properties / request / properties / context / default / facts
        Removed value: -[]
      • removedInput schema / properties / request / properties / context / properties / artifacts / default
        Removed value: -[]
      • addedInput schema / properties / request / properties / context / properties / constraints
        Added value: +{
        +  "items": {
        +    "maxLength": 1000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "type": "array"
        +}
      • removedInput schema / properties / request / properties / context / properties / counterpoints / default
        Removed value: -[]
      • addedInput schema / properties / request / properties / context / properties / expose_diff
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "base": {
        +          "maxLength": 200,
        +          "minLength": 1,
        +          "pattern": "^[A-Za-z0-9._/~^@{}-]+$",
        +          "type": "string"
        +        },
        +        "repo": {
        +          "maxLength": 1000,
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "repo"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedInput schema / properties / request / properties / context / properties / expose_from_parent
        Added value: +{
        +  "type": "boolean"
        +}
      • removedInput schema / properties / request / properties / context / properties / facts / default
        Removed value: -[]
      • addedInput schema / properties / request / properties / context / properties / success_criteria
        Added value: +{
        +  "items": {
        +    "maxLength": 1000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "type": "array"
        +}
      • changedInput schema / properties / request / properties / initiator / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "user",
        -      "offer_accepted"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "user"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / request / properties / network
        Added value: +{
        +  "enum": [
        +    "on",
        +    "off"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / request / properties / success_criteria / default
        Removed value: -[]
      • removedInput schema / properties / request / properties / target / anyOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "codex",
        -      "gpt",
        -      "chatgpt",
        -      "openai",
        -      "claude-code",
        -      "claude",
        -      "anthropic",
        -      "antigravity",
        -      "agy",
        -      "gemini",
        -      "google",
        -      "opencode",
        -      "glm"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "pattern": "^[a-z0-9-]+:.*$",
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / request / properties / target / maxLength
        Added value: +120
      • addedInput schema / properties / request / properties / target / minLength
        Added value: +1
      • addedInput schema / properties / request / properties / target / pattern
        Added value: +"^[^\\p{Cc}\\p{Cf}]+$"
      • addedInput schema / properties / request / properties / target / type
        Added value: +"string"
      • removedInput schema / properties / request / properties / targets / items / anyOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "codex",
        -      "gpt",
        -      "chatgpt",
        -      "openai",
        -      "claude-code",
        -      "claude",
        -      "anthropic",
        -      "antigravity",
        -      "agy",
        -      "gemini",
        -      "google",
        -      "opencode",
        -      "glm"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "pattern": "^[a-z0-9-]+:.*$",
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / request / properties / targets / items / maxLength
        Added value: +120
      • addedInput schema / properties / request / properties / targets / items / minLength
        Added value: +1
      • addedInput schema / properties / request / properties / targets / items / pattern
        Added value: +"^[^\\p{Cc}\\p{Cf}]+$"
      • addedInput schema / properties / request / properties / targets / items / type
        Added value: +"string"
      • changedInput schema / properties / request / properties / targets / maxItems
        Previous value: -4New value: +9
      • changedInput schema / properties / request / required
        Previous value: -[
        -  "mode",
        -  "question"
        -]New value: +[
        +  "question"
        +]
  3. 7 tool updatesv1.4.1
    • Changedconsult_cancel1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedconsult_export1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedconsult_get1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedconsult_list1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedconsult_offer_declined
    • Changedconsult_record2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / job_id / description
        Added value: +"the consultation to record against -- the job_id consult_get returned for it"
    • Changedconsult_start7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / request / properties / caller / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "codex",
        -      "gpt",
        -      "chatgpt",
        -      "openai",
        -      "claude-code",
        -      "claude",
        -      "anthropic",
        -      "antigravity",
        -      "agy",
        -      "gemini",
        -      "google"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "codex",
        +      "gpt",
        +      "chatgpt",
        +      "openai",
        +      "claude-code",
        +      "claude",
        +      "anthropic",
        +      "antigravity",
        +      "agy",
        +      "gemini",
        +      "google",
        +      "opencode",
        +      "glm"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / request / properties / context / properties / expose_paths
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "maxLength": 1000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "type": "array"
        +}
      • addedInput schema / properties / request / properties / initiator
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "user",
        +        "offer_accepted"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedInput schema / properties / request / properties / target / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "codex",
        -      "gpt",
        -      "chatgpt",
        -      "openai",
        -      "claude-code",
        -      "claude",
        -      "anthropic",
        -      "antigravity",
        -      "agy",
        -      "gemini",
        -      "google"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "pattern": "^[a-z0-9-]+:.*$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "codex",
        +      "gpt",
        +      "chatgpt",
        +      "openai",
        +      "claude-code",
        +      "claude",
        +      "anthropic",
        +      "antigravity",
        +      "agy",
        +      "gemini",
        +      "google",
        +      "opencode",
        +      "glm"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "pattern": "^[a-z0-9-]+:.*$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / request / properties / targets / items / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "codex",
        -      "gpt",
        -      "chatgpt",
        -      "openai",
        -      "claude-code",
        -      "claude",
        -      "anthropic",
        -      "antigravity",
        -      "agy",
        -      "gemini",
        -      "google"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "pattern": "^[a-z0-9-]+:.*$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "codex",
        +      "gpt",
        +      "chatgpt",
        +      "openai",
        +      "claude-code",
        +      "claude",
        +      "anthropic",
        +      "antigravity",
        +      "agy",
        +      "gemini",
        +      "google",
        +      "opencode",
        +      "glm"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "pattern": "^[a-z0-9-]+:.*$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / request / properties / targets / maxItems
        Previous value: -3New value: +4
  4. 6 tool updatesv1.1.0
    • First observedconsult_cancel
    • First observedconsult_export
    • First observedconsult_get
    • First observedconsult_list
    • First observedconsult_record
    • First observedconsult_start

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation4/5

Each tool maps to a distinct phase of the consultation lifecycle (start, poll, cancel, annotate, export, list), and descriptions make the boundaries largely clear. The only mild overlap is between consult_get (retrieve answers/points) and consult_export (render the full consultation as Markdown), which both return consultation content and could be momentarily confused.

Naming Consistency5/5

All six tools follow the identical consult_<verb> pattern (start, get, cancel, record, export, list) with no deviation in case or style. The verbs also accurately reflect each tool's action.

Tool Count5/5

Six tools is well-scoped for a consultation-orchestration server: initiation, polling, cancellation, annotation, export, and listing. Each earns its place with no redundant or filler tools.

Completeness4/5

The surface covers the full lifecycle: create jobs, wait/poll, cancel, record verdicts, export, and list history, with retry/follow-up folded into consult_start. Minor gaps remain—there is no dedicated tool to discover available consultant CLIs (only reported through consult_start error fields) and no way to delete or prune saved consultation history.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers