unmerged-approaches-mcp
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., "@unmerged-approaches-mcpConsult 5 models: 'Should we switch to Kubernetes?'"
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.
unmerged-approaches-mcp
An MCP server that puts one identical brief to several LLMs in parallel and hands back every answer verbatim — unmerged, unranked, unsynthesized.
Most multi-model MCP servers end in a judge, a synthesizer, or a consensus loop. This one deliberately does not. The moment N answers are averaged into one confident paragraph, the single most useful piece of information is destroyed: whether the models actually agreed.
Four models independently reaching the same conclusion is corroboration.
Two against two is a real open question your one-model answer would have hidden from you.
A synthesizer renders both of those as the same smooth prose. This server refuses to, by design.
What it does
Fans one brief out to up to 12 OpenRouter models concurrently — 400+ models, one API key.
Returns per-model: the verbatim answer,
finish_reason, latency, token usage, cost, and a structured error when a model fails.A slow or failing model becomes one failed entry; it never sinks the panel.
Persists bounded, redacted, correlation-ID-addressable debug events.
Never merges, ranks, scores, votes on, or picks a winner among the answers.
Related MCP server: Legion MCP Server
Install
stdio (Claude Desktop, Claude Code, Cursor, Cline, Zed)
{
"mcpServers": {
"unmerged-approaches": {
"command": "npx",
"args": ["-y", "unmerged-approaches-mcp@latest"],
"env": { "OPENROUTER_API_KEY": "sk-or-v1-..." }
}
}
}claude mcp add unmerged-approaches npx -y unmerged-approaches-mcpRemote Streamable HTTP
OPENROUTER_API_KEY=sk-or-v1-... UNMERGED_AUTH_TOKEN=your-token npx unmerged-approaches-mcp-http
# or: node src/http.jsMounts MCP at /mcp and a separate liveness probe at /health.
{
"mcpServers": {
"unmerged-approaches": {
"type": "http",
"url": "https://your-host.example/mcp"
}
}
}Send the token as Authorization: Bearer <token> or x-api-key. Keep secrets in your client's secret storage, never in a committed config file.
Tools
Tool | Category | What it does |
| PANEL | One brief → N models in parallel → N verbatim answers, unmerged |
| SYSTEM | Live OpenRouter catalog: substring search, free-only filter, cursor pagination |
| SYSTEM | Server version, credential validity, remaining credit, default panel, limits |
| DEBUG | Newest-first structured events, filterable by correlationId / level / event / operation / time |
All four are read-only and non-destructive. The server exposes no arbitrary HTTP, shell, or SQL primitive.
consult
Argument | Type | Notes |
| string, required | Sent byte-for-byte identically to every model. Max 200,000 chars. |
| string[] | Exact OpenRouter ids, max 12, deduplicated. Omit for the default panel. |
| string | Optional system prompt, identical for every model. |
| int | Default 8000, ceiling 32000. |
| number | 0–2, default 0.7. |
| int | Default 180000, max 600000. Per model, not for the batch. |
Returns correlationId, requestedModels, answeredCount, completeCount, failedCount, totalCostUsd, wallClockMs, and answers[] with { model, actualModel, ok, complete, finishReason, content, error, latencyMs, usage }.
If every model fails, the call returns isError: true with code ALL_MODELS_FAILED. A partial panel is a success.
Writing a brief that is worth the money
The output is only as good as the isolation of the input. A brief that leaks your preferred answer gets it echoed back by every model, and you will mistake that echo for agreement.
Include the goal, hard constraints, what is already decided, what was rejected and why, and what is genuinely unknown.
Mark unverified claims as unverified. Distinguish what you observed from what you assumed.
Do not name your preferred option, and do not tell the panel what an earlier model said.
Ask for independent judgment, not novelty.
Environment variables
Name | Required | Purpose |
| yes | OpenRouter credential. Server-side only; never accepted as a tool argument. |
| no | Comma-separated default panel. |
| no | Panel size cap. Default 12. |
| no | Default output ceiling per model. Default 8000. |
| no | Default per-model timeout. Default 180000. |
| no | Retained debug events. Default 500. |
| http only | Bearer / |
| http only | Comma-separated browser origin allowlist. Browsers are refused unless listed. |
| http only | Defaults |
No value is ever written to logs, tool results, or client configuration.
Cost
You pay per model, per call. A 5-model panel is roughly 5× a single call. list_models with free_only: true finds zero-price models; free endpoints time out and rate-limit far more often, which shows up honestly in failedCount.
Security
Credentials are read only from the server environment and are never accepted as tool arguments.
Anything credential-shaped is stripped from errors and debug events before persistence.
The HTTP transport validates
Origin, requires a bearer token when one is configured, and compares it in constant time.Returned answers are untrusted third-party model output. If an agent calls this on attacker-influenced input, treat the answers as data to weigh, never as instructions to execute. This is a prompt-injection surface like any MCP tool that returns external content.
Development
npm install
npm run build # syntax check every entrypoint
npm test # 9 contract tests incl. a live stdio initialize/list/call handshakeLicense
MIT
Available Tools
4 toolsconsultConsult an unmerged panel of modelsARead-only
Send ONE identical brief to several LLMs in parallel and get every answer back verbatim, attributed, unranked and unsynthesized. Use when a decision is consequential or hard to reverse, when you want your own reasoning stress-tested by models that did not see it, or when the user asks for other opinions or approaches. The value is the spread: independent agreement is corroboration, a split is a real open question that a single answer would have hidden from you. This server never merges, ranks or picks a winner.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | The complete, self-contained brief. Every model receives this byte-for-byte identically. Include the goal, hard constraints, current situation, decisions already taken, what was rejected and why, and what is still unknown. Do not name your preferred answer: that primes the panel and destroys the signal. | |
| models | No | Exact OpenRouter model ids. Omit to use the server default panel. Duplicates are removed. | |
| system | No | Optional system prompt, sent identically to every model. | |
| max_tokens | No | ||
| timeout_ms | No | ||
| temperature | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: the server never merges/ranks/picks a winner, every model receives the brief byte-for-byte identically, and the output is verbatim and attributed. It also warns that naming a preferred answer primes the panel and destroys the signal. This goes beyond the annotations and helps the agent understand the tool's non-obvious behavior.
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-loaded: the first sentence states the core behavior, the second gives usage guidance, the third explains the value, and the final sentence clarifies what the tool does NOT do. Every sentence earns its place, and the structure is easy 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 tool with 6 parameters, no output schema, and no nested objects, the description covers the essential behavioral contract: what it sends, what it returns, when to use it, and what it never does. The only minor gap is that it doesn't describe the exact response format (e.g., JSON structure), but since there is no output schema, an agent might benefit from knowing the response shape. However, the description's explicit 'verbatim, attributed, unranked and unsynthesized' gives enough for most use cases.
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 50%, so the schema documents brief, models, and system but not max_tokens, timeout_ms, or temperature. The description compensates by explaining the brief's purpose in detail ('Include the goal, hard constraints, current situation, decisions already taken, what was rejected and why, and what is still unknown') and warning against naming a preferred answer. The remaining parameters (max_tokens, timeout_ms, temperature) are standard LLM parameters with clear names and schema constraints, so the gap is minor.
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 ('Send'), a specific resource ('ONE identical brief to several LLMs in parallel'), and the exact output behavior ('every answer back verbatim, attributed, unranked and unsynthesized'). It also explicitly distinguishes itself from any merging/ranking tool by saying 'This server never merges, ranks or picks a winner.' This is a clear, specific definition that an agent can act on.
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 gives explicit when-to-use guidance: 'when a decision is consequential or hard to reverse, when you want your own reasoning stress-tested by models that did not see it, or when the user asks for other opinions or approaches.' It also explains the value of the spread and what a split means. It doesn't name sibling alternatives, but the siblings (get_status, list_models, get_debug_logs) are clearly different operations, so no exclusion is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_debug_logsRead persisted structured debug eventsARead-onlyIdempotent
Newest-first structured events for dispatches, per-model failures and validation errors, filterable by correlationId, level, event, operation and time, with cursor pagination. Every consult result carries a correlationId: pass it here to see exactly what happened per model. Credentials are redacted before persistence.
| Name | Required | Description | Default |
|---|---|---|---|
| event | No | ||
| level | No | ||
| limit | No | ||
| since | No | ISO 8601 lower bound on the event timestamp. | |
| cursor | No | ||
| operation | No | ||
| correlationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: newest-first ordering, cursor pagination, filterability by correlationId/level/event/operation/time, and the fact that credentials are redacted before persistence. This is meaningful additional context that helps the agent understand what to expect.
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?
Three sentences, each earning its place. The first sentence front-loads the core behavior (newest-first, filterable, paginated). The second sentence gives the primary use case (correlationId from consult). The third sentence adds a security-relevant detail (credential redaction). No wasted words.
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 read-only, idempotent, non-destructive tool with no output schema, the description covers the essential context: what events are, how to filter, how pagination works, and the key use case. The only minor gap is that it doesn't explicitly state the return format (e.g., JSON array of event objects), but with no output schema and a clear description of the event types, this is a small omission. The description is complete enough for an agent to call it correctly.
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 14%, so the description must compensate. It does: it names the filterable fields (correlationId, level, event, operation, time) and explains the correlationId's purpose ('pass it here to see exactly what happened per model'). It also mentions cursor pagination, which maps to the cursor parameter. However, it doesn't explain the 'since' parameter's format beyond what the schema says, and it doesn't detail the 'limit' parameter's behavior. Still, the description adds significant meaning beyond the sparse schema.
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 ('Read'), a resource ('persisted structured debug events'), and the exact content ('dispatches, per-model failures and validation errors'). It also names the sibling it is not (consult) by explaining that consult results carry a correlationId that can be passed here. This clearly distinguishes it from the sibling tools.
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 explicitly tells the agent when to use this tool: after a consult result, pass the correlationId to see exactly what happened per model. It also implies the alternative (consult) by saying 'Every consult result carries a correlationId: pass it here...' This is clear context with an explicit routing condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusServer, credential and limit statusARead-onlyIdempotent
Report server version, whether OPENROUTER_API_KEY is configured and accepted, remaining credit, the default panel and the configured limits. Call this first when consult fails with an authentication error. Never returns the key itself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, openWorld, idempotent, and non-destructive behavior. The description adds a valuable behavioral guarantee, 'Never returns the key itself,' which goes beyond structured hints and addresses a security-relevant concern.
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?
Two sentences with no filler. The main reporting scope is front-loaded, followed by a direct usage instruction and a security note. Every sentence earns its place.
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 no-parameter read-only status tool, the description enumerates all reported fields, gives a clear usage condition, and clarifies the key-handling behavior. There is no output schema, so enumerating the contents is sufficient for correct invocation and interpretation.
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?
The tool has zero parameters, so the description fully covers parameter semantics trivially. The description adds no param details, but none are needed; baseline 4 for zero parameters is appropriate.
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 uses a specific verb ('Report') with a clear resource (server/configuration/status) and enumerates exactly what is reported: server version, API key configuration status, remaining credit, default panel, and limits. This distinguishes it from siblings like list_models and get_debug_logs.
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 an explicit trigger: 'Call this first when consult fails with an authentication error.' This clearly tells the agent when to prefer this tool and implicitly frames the alternative (consult). No ambiguity remains about usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsList available OpenRouter modelsARead-onlyIdempotent
Browse the live OpenRouter model catalog to pick an exact panel for consult. Supports substring search, a free-only filter and cursor pagination. Model ids change over time, so resolve them here rather than guessing.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| limit | No | ||
| query | No | Case-insensitive substring matched against model id and name. | |
| cursor | No | ||
| free_only | No | Only models whose prompt, completion and request prices are all zero. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and non-destructive behavior. The description adds genuinely useful behavioral context beyond the annotations: the catalog is 'live', results may change over time, and the tool supports substring search, a free-only filter, and cursor pagination. No contradiction.
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?
Three sentences with no filler: the first gives the primary purpose, the second summarizes key capabilities compactly, and the third explains why the tool should be used now before consulting. The most decision-relevant detail is front-loaded.
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?
The description is sufficient for a read-only listing tool with no required parameters. It explains the dynamic nature of the resource, mentions the main filtering and pagination controls, and orients the agent toward its downstream use with consult. No output schema exists, but the tool's return shape is inferable from the catalog-listing purpose.
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 40%, so the description carries extra weight. It compensates by describing the behaviors that map to query (substring search), free_only, and cursor, and the sort enum is self-documenting via its option names. Only limit gets no added semantic context, but its schema min/max constraints partially cover that.
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 ('Browse the live OpenRouter model catalog') with a clear purpose ('pick an exact panel for consult'). It differentiates itself from the sibling tools by being catalog-specific: consult performs a consultation, get_status and get_debug_logs concern system state, not model listing.
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 gives clear context: this is the tool to use for resolving model ids before a consult, and the warning that 'Model ids change over time' implies using it instead of hardcoding. It does not explicitly name an alternative or provide when-not-to-use guidance, but the context is unambiguous given the sibling set.
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.
4 tool updates
v0.1.1- First observed
consult - First observed
get_debug_logs - First observed
get_status - First observed
list_models
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: consult is the core action, list_models handles model selection, get_status handles configuration/health checks, and get_debug_logs is for diagnostics. There is no meaningful overlap or possible confusion between the tool boundaries.
get_status, list_models, and get_debug_logs all follow a clean lower_snake verb_noun pattern. consult is a bare verb without an explicit object, which is a minor deviation, but it still reads naturally and fits the overall imperative style.
Four tools is well-scoped for a narrow server: one primary operation plus three supporting utilities for configuration, model discovery, and debugging. Every tool earns its place and there is no redundancy.
The domain is parallel unmerged consultation, and consult fully covers the core workflow while list_models, get_status, and get_debug_logs cover the supporting needs around model selection, auth/config validation, and failure investigation. There are no obvious dead ends or missing operations agents would need.
Related MCP Connectors
Fan out deep research across multiple AI providers, synthesize into one unified report.
A second opinion for AI agents: one prompt across several live Gonka models + roles, one call.
Multi-LLM council: 25+ frontier models in parallel, consensus scoring, verdict-first code review.
Commission a multi-model AI spec committee from your agent; get rubric-scored, build-ready specs.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables querying multiple AI models in parallel (Claude, Gemini, O3) and synthesizing their responses using anonymous analysis to reduce bias, providing a comprehensive answer.145 npm193MIT
- FlicenseNot gradedqualityBmaintenanceExposes multiple LLMs as individual tools via the OpenAI Responses API wire format, enabling the calling AI to get second opinions and orchestrate multi-model discussions with a quorum tool.50 npm1-
- AlicenseNot gradedqualityBmaintenanceFans out queries to multiple independent free LLMs from different providers and returns their answers side by side, enabling sanity-checking of decisions or getting multiple perspectives during coding sessions.GPL 3.0

polydev-aiofficial
AlicenseNot gradedqualityDmaintenanceQueries multiple AI models simultaneously (GPT 5.2, Claude Opus 4.5, Gemini 3, Grok 4.1) via a single API call to provide diverse expert perspectives and consensus recommendations.MIT