severally
Severally is an MCP server that lets your AI agent consult independent coding-agent CLIs (Codex, Claude Code, Antigravity, OpenCode) for separate second opinions, then track what was actually verified.
Start a consultation: ask one named consultant or fan out the same brief to several or all, with a mode (explore / review / debate), context, facts, artifacts, constraints, success criteria, and an optional local prediction.
Expose code for review: hand over read-only file copies or a repo diff (
expose_diff/expose_paths), with secrets masked, symlinks skipped, and caps of 20 entries, 500 files, 5 MB.Control web access: set
network: on/offper request; off disables browsing for every consultant in that round to prevent data leaving via URLs.Wait or poll for answers:
consult_getblocks up to 45 s or polls, returning advice or a failure kind, plus a group comparison with each consultant's actual model, stance and grounds.Fetch specific points: pull just the findings, unknowns and next checks (
f2,u1,c1) with their grounds and any verdicts already recorded.Cancel work: stop a single job or a whole fan-out, including one another session started.
Record verification: save verdicts per point (confirmed / not applicable / unverifiable / unverified), the decision effect and the evidence, batched across a fan-out, plus a reflection on what the answer added versus your prediction.
Follow up and retry: continue a prior consultation (up to five rounds) with files recopied in their current state, or replay only the failed members of a group.
Review history: list recent consultations across sessions with filters by consultant, question or chain, showing status, verdicts, rounds remaining and token/cost usage.
Export records: render a consultation or fan-out as Markdown, leading with verified points, decision effects and unchecked counts, ready to commit beside the code.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@severallyAsk Codex, Claude, and Antigravity for independent opinions on this refactoring plan."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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;statusreports 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 installThe 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 statusIt 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 inNo 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 installWith @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 thisName 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 | yes, in its sandbox (commands run, but cannot write or reach the network) | no | yes, unless |
Claude Code | yes ( | blocked (permission rules) | none | no | yes, unless |
Antigravity | yes ( | blocked (tool hook) | none | no | yes, unless |
OpenCode | yes ( | blocked by lexical path; symlink aliases are not covered | none (its Code Mode | no | yes, unless |
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 |
| Starts one ( |
| Waits for a consultation and returns its state or answer; with |
| Stops a consultation or a whole fan-out, and its consultant processes, also one another session started |
| Writes the lead's verdicts on an answer's points, and what the answer added |
| Finds consultations by consultant, question or chain; includes continuation IDs and session usage |
| 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, thennpm test. The tests run offline against stand-in CLIs and make no real API calls.CI also runs
npm run lint,npm run typecheckandnpm 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 inplugins/severally/dist/and the generated Skills are committed, and CI fails when they are out of date.npm run live-checkandnpm run doctorrun real consultations against the CLIs you have installed, and spend real quota.doctoralso 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 toolsconsult_cancelCancel a running consultationAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | ||
| group_id | No |
TDQS
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.
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.
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.
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.
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.
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 commitARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | ||
| group_id | No |
TDQS
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.
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.
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.
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.
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.
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 resultARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | 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 | |
| detail | No | ||
| job_id | No | ||
| wait_ms | No | ||
| group_id | No |
TDQS
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.
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.
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.
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.
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.
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 consultationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No | ||
| chain_id | No | ||
| question | No |
TDQS
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.
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.
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.
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.
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.
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 showedAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | the job_id consult_get returned | |
| entries | No | ||
| records | No | one per fan-out member, instead of job_id/entries/reflection | |
| reflection | No | written after reading the answer |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
TDQS
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.
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.
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.
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.
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.
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.
2 tool updates
v2.9.0- Changed
consult_list3 fields changed- added
Input schema / properties / chain_idAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / questionAdded value: +{ + "maxLength": 4000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / targetAdded value: +{ + "maxLength": 120, + "minLength": 1, + "type": "string" +}
- Changed
consult_start2 fields changed- added
Input schema / properties / request / properties / retry_ofAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / request / requiredRemoved value: -[ - "question" -]
4 tool updates
v2.6.1- Changed
consult_get2 fields changed- added
Input schema / properties / detailAdded value: +{ + "enum": [ + "full" + ], + "type": "string" +} - added
Input schema / properties / idsAdded 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" +}
- Removed
consult_offer_declined - Changed
consult_record9 fields changed- changed
Input schema / properties / entries / items / properties / effect / descriptionPrevious value: -"what it changed about your decision, or why it is still unverified"New value: +"what it changed, or why it is unverified" - changed
Input schema / properties / entries / items / properties / id / descriptionPrevious value: -"the point this verdict is about: f1, u1, c1 ... as returned in the result"New value: +"f1, u1, c1 ... from the result" - changed
Input schema / properties / entries / items / properties / note / descriptionPrevious value: -"what you checked and what you found"New value: +"what you checked and found" - changed
Input schema / properties / job_id / descriptionPrevious value: -"the consultation to record against -- the job_id consult_get returned for it"New value: +"the job_id consult_get returned" - added
Input schema / properties / recordsAdded 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" +} - changed
Input schema / properties / reflection / descriptionPrevious 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" - changed
Input schema / properties / reflection / properties / delta / descriptionPrevious 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)" - changed
Input schema / properties / reflection / properties / related_item_ids / descriptionPrevious value: -"the points this is about: f1, u1, c1 ..."New value: +"f1, u1, c1 ..." - removed
Input schema / requiredRemoved value: -[ - "job_id" -]
- Changed
consult_start26 fields changed- removed
Input schema / properties / request / properties / constraints / defaultRemoved value: -[] - removed
Input schema / properties / request / properties / context / default / artifactsRemoved value: -[] - removed
Input schema / properties / request / properties / context / default / counterpointsRemoved value: -[] - removed
Input schema / properties / request / properties / context / default / factsRemoved value: -[] - removed
Input schema / properties / request / properties / context / properties / artifacts / defaultRemoved value: -[] - added
Input schema / properties / request / properties / context / properties / constraintsAdded value: +{ + "items": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - removed
Input schema / properties / request / properties / context / properties / counterpoints / defaultRemoved value: -[] - added
Input schema / properties / request / properties / context / properties / expose_diffAdded 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" + } + ] +} - added
Input schema / properties / request / properties / context / properties / expose_from_parentAdded value: +{ + "type": "boolean" +} - removed
Input schema / properties / request / properties / context / properties / facts / defaultRemoved value: -[] - added
Input schema / properties / request / properties / context / properties / success_criteriaAdded value: +{ + "items": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - changed
Input schema / properties / request / properties / initiator / anyOfPrevious value: -[ - { - "enum": [ - "user", - "offer_accepted" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "user" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / request / properties / networkAdded value: +{ + "enum": [ + "on", + "off" + ], + "type": "string" +} - removed
Input schema / properties / request / properties / success_criteria / defaultRemoved value: -[] - removed
Input schema / properties / request / properties / target / anyOfRemoved value: -[ - { - "enum": [ - "codex", - "gpt", - "chatgpt", - "openai", - "claude-code", - "claude", - "anthropic", - "antigravity", - "agy", - "gemini", - "google", - "opencode", - "glm" - ], - "type": "string" - }, - { - "pattern": "^[a-z0-9-]+:.*$", - "type": "string" - } -] - added
Input schema / properties / request / properties / target / maxLengthAdded value: +120 - added
Input schema / properties / request / properties / target / minLengthAdded value: +1 - added
Input schema / properties / request / properties / target / patternAdded value: +"^[^\\p{Cc}\\p{Cf}]+$" - added
Input schema / properties / request / properties / target / typeAdded value: +"string" - removed
Input schema / properties / request / properties / targets / items / anyOfRemoved value: -[ - { - "enum": [ - "codex", - "gpt", - "chatgpt", - "openai", - "claude-code", - "claude", - "anthropic", - "antigravity", - "agy", - "gemini", - "google", - "opencode", - "glm" - ], - "type": "string" - }, - { - "pattern": "^[a-z0-9-]+:.*$", - "type": "string" - } -] - added
Input schema / properties / request / properties / targets / items / maxLengthAdded value: +120 - added
Input schema / properties / request / properties / targets / items / minLengthAdded value: +1 - added
Input schema / properties / request / properties / targets / items / patternAdded value: +"^[^\\p{Cc}\\p{Cf}]+$" - added
Input schema / properties / request / properties / targets / items / typeAdded value: +"string" - changed
Input schema / properties / request / properties / targets / maxItemsPrevious value: -4New value: +9 - changed
Input schema / properties / request / requiredPrevious value: -[ - "mode", - "question" -]New value: +[ + "question" +]
7 tool updates
v1.4.1- Changed
consult_cancel1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
consult_export1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
consult_get1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
consult_list1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Added
consult_offer_declined - Changed
consult_record2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / properties / job_id / descriptionAdded value: +"the consultation to record against -- the job_id consult_get returned for it"
- Changed
consult_start7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / request / properties / caller / anyOfPrevious 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" + } +] - added
Input schema / properties / request / properties / context / properties / expose_pathsAdded value: +{ + "default": [], + "items": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / request / properties / initiatorAdded value: +{ + "anyOf": [ + { + "enum": [ + "user", + "offer_accepted" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Input schema / properties / request / properties / target / anyOfPrevious 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" + } +] - changed
Input schema / properties / request / properties / targets / items / anyOfPrevious 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" + } +] - changed
Input schema / properties / request / properties / targets / maxItemsPrevious value: -3New value: +4
6 tool updates
v1.1.0- First observed
consult_cancel - First observed
consult_export - First observed
consult_get - First observed
consult_list - First observed
consult_record - First observed
consult_start
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Second opinion before an irreversible agent action; signed proofs, free verify, public ledger.
A second opinion for AI agents: one prompt across several live Gonka models + roles, one call.
- ParleyOAuthdev.weldra
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
Multi-LLM council: 25+ frontier models in parallel, consensus scoring, verdict-first code review.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables multiple AI agents to share and read each other's responses to the same prompt, allowing them to reflect on what other LLMs said to the same question.2MIT
- AlicenseBqualityDmaintenanceEnables AI agents to consult expert models (Claude, GPT, Gemini, DeepSeek, Z.ai) for technical guidance, code reviews, and architectural advice without switching context.411 npm4MIT
- AlicenseAqualityAmaintenanceEnables one AI coding agent to delegate tasks to, and build consensus across, multiple other coding CLIs (Claude Code, Codex, etc.) by orchestrating them as headless subprocesses.18104 PyPI7MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI coding agents to consult a multi-model deliberation council before irreversible, high-stakes decisions, returning structured architectural decision records with consensus and dissenting risks.1-