Multi-model deliberation over MCP: full responses plus typed cross-model reactions from other labs.
chat.mumo/mcp Model Context Protocol (MCP) Server
The chat.mumo/mcp MCP server performs multi-model deliberation over MCP. It sends a user question to models from different labs and returns each modelβs full response along with typed cross-model reactions, where participating models react to each other directly and explain.
π οΈ Key Features
Multi-model deliberation across models from different labs
Returns full responses from participating models
Provides typed cross-model reactions between models
Code review workflows leveraging multiple model perspectives
Comparing and reconciling different model outputs via cross-model reactions
β‘ Developer Benefits
Structured comparison via typed reactions alongside full responses
Supports integration with MCP-based agent tooling through the mcp connector
β οΈ Limitations
Cross-model interaction is limited to the participating model set listed in the description (e.g., Claude, GPT, Gemini, Grok, DeepSeek, Kimi, and more).
Start a multi-model AI deliberation on a question or decision.
Runs the prompt through multiple frontier AI models in parallel and extracts typed reactions (KEEP/EXPLORE/CHALLENGE/CORE/SHIFT) into a claim map of where they agree and diverge.
**Returns immediately (async).** The response is a compact ack β `{ session_id, round_id, round_index, status: 'processing', progress_url, ... }` β NOT the finished deliberation. Model execution runs in the background. Call `wait_for_round` to block on cheap progress polling and read the actual responses and claim_map once the round completes (typically 15β120s depending on model choice). `wait_for_round` returns protocol-native `structuredContent` so you can branch on `round_status` / `recommended_client_action` without parsing prose.
MCP deliberations are agent-moderated: one round runs, then you decide whether to stop or call `append_round` with follow-up steering. There is no fixed round cap and no autonomous moderator on this surface.
Use when you need structured disagreement from independent models, not a single synthesized answer. Ideal for spec review, architectural decisions, or any question where model diversity is a signal.
Idempotency is automatic β the adapter derives a stable key from tool arguments, so repeat tool calls with identical args resolve to the same session for 24 hours (no second session, no second charge). A catastrophically-failed round (all providers errored) auto-refunds your budget within 60s; the round won't count against your daily cap.
Parameters11
prompt
string
required
The question or topic to deliberate on
reference
string
optional
Optional reference material (spec, doc, design) injected as context for all models
models
array
optional
Model IDs to use (2-3). Defaults to platform selection if omitted. Call `list_models` to see available options.
moderator_name
string
optional
Set this to your model id if you know it (e.g., 'Claude Sonnet 4.6', 'GPT-5.4', 'Codex', 'Gemini 3 Pro'). mumo uses it to pick complementary panel members from different model families. Leave blank if uncertain β don't guess. Also shown in the session info panel and transcript where 'You' would otherwise appear.
application
string
optional
Display name of the client driving this MCP session (e.g., 'Claude Code', 'Cursor'). Shown in the session info panel.
improvement_consent
boolean
optional
Optional per-session Platform Improvement request. Any account may send true or false; omitted uses the account default. A session-level false excludes the session; true cannot widen beyond the account choice.
dataset_consent
boolean
optional
Optional per-session Dataset Contribution request β the second consent election, same rules as improvement_consent: omitted uses the account's choice; false excludes the session; true cannot widen beyond the account's own choice, and an account that has not yet made the choice stays excluded.
takeaway
boolean
optional
If true, generates a structured per-round Takeaway (surfaced as `round_takeaway`) when round 0 completes. Default false. At-cost passthrough; ~$0.01 per call.
recap_round
boolean
optional
Legacy alias of `takeaway`.
register
string
optional
Deprecated β ignored. The platform runs a single prompt register; this field is retained only so existing callers' idempotency keys stay stable. Omit it.
web_search
boolean
optional
Set false to skip web search entirely (no search gate, no source pack on round 0). Default true β the platform decides per-prompt whether to search. Disable for prompts grounded purely in supplied reference material.
Raw schema
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "The question or topic to deliberate on"
},
"reference": {
"type": "string",
"description": "Optional reference material (spec, doc, design) injected as context for all models"
},
"models": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 3,
"description": "Model IDs to use (2-3). Defaults to platform selection if omitted. Call `list_models` to see available options."
},
"moderator_name": {
"type": "string",
"maxLength": 100,
"description": "Set this to your model id if you know it (e.g., 'Claude Sonnet 4.6', 'GPT-5.4', 'Codex', 'Gemini 3 Pro'). mumo uses it to pick complementary panel members from different model families. Leave blank if uncertain β don't guess. Also shown in the session info panel and transcript where 'You' would otherwise appear."
},
"application": {
"type": "string",
"maxLength": 100,
"description": "Display name of the client driving this MCP session (e.g., 'Claude Code', 'Cursor'). Shown in the session info panel."
},
"improvement_consent": {
"type": "boolean",
"description": "Optional per-session Platform Improvement request. Any account may send true or false; omitted uses the account default. A session-level false excludes the session; true cannot widen beyond the account choice."
},
"dataset_consent": {
"type": "boolean",
"description": "Optional per-session Dataset Contribution request β the second consent election, same rules as improvement_consent: omitted uses the account's choice; false excludes the session; true cannot widen beyond the account's own choice, and an account that has not yet made the choice stays excluded."
},
"takeaway": {
"type": "boolean",
"description": "If true, generates a structured per-round Takeaway (surfaced as `round_takeaway`) when round 0 completes. Default false. At-cost passthrough; ~$0.01 per call."
},
"recap_round": {
"type": "boolean",
"description": "Legacy alias of `takeaway`."
},
"register": {
"type": "string",
"enum": [
"conversational",
"agent"
],
"description": "Deprecated β ignored. The platform runs a single prompt register; this field is retained only so existing callers' idempotency keys stay stable. Omit it."
},
"web_search": {
"type": "boolean",
"description": "Set false to skip web search entirely (no search gate, no source pack on round 0). Default true β the platform decides per-prompt whether to search. Disable for prompts grounded purely in supplied reference material."
}
},
"required": [
"prompt"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
append_round
Add a follow-up round to an existing deliberation session.
Use after reading the previous round's claim_map and responses to steer the conversation. The `snippets` array lets you forward specific quotes from the prior round's responses with a typed reaction:
- KEEP: this point is strong, preserve it
- EXPLORE: dig deeper on this thread
- CHALLENGE: push back on this claim
- CORE: this is load-bearing, build on it
- SHIFT: this reframes the question
Models see the snippets as curated forwards and respond with full context. Use this to resolve disagreements, test claims, or direct attention to specific passages.
Forwarding is the moderator's privileged promotion of ledger content into the record β you have seen notes the panel has not. Elevate what the discussion needs now rather than waiting to see whether its author carries it.
**Returns immediately (async).** Response is a compact ack β model execution runs in background. Call `wait_for_round` with this `session_id` and `round_id` from the ack to read the finished round; its `structuredContent` carries `round_status` (4-way), `is_usable`, and `recommended_client_action` so you can decide whether to read the result, retry, or abandon without parsing prose.
Only works on sessions that don't have an in-flight round. If `get_session` shows the latest round is `pending`, wait. If a prior round failed catastrophically and was refunded, you can append a new round β the refund restored your budget.
Idempotency is automatic per-tool-args, so retrying after a transport failure is safe β a second call with identical args within 24 hours replays the first round's ack without creating a duplicate (no second round, no second charge).
Parameters7
session_id
string
required
Session ID from a prior create_deliberation call
prompt
string
required
Steering prompt for this round β tells models what to focus on
moderator_name
string
optional
Updated steering identity for this round β use when the entity driving the session changes (e.g., a human takes over from an agent). If omitted, the session's existing moderator_name is preserved.
snippets
array
optional
Curated quotes from prior rounds to direct models' attention. Optional but high-signal.
takeaway
boolean
optional
If true, generates a structured per-round Takeaway (surfaced as `round_takeaway`) when this round completes. Default false. At-cost passthrough; ~$0.01 per call.
recap_round
boolean
optional
Legacy alias of `takeaway`.
recap_session
boolean
optional
Deprecated; ignored.
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "Session ID from a prior create_deliberation call"
},
"prompt": {
"type": "string",
"description": "Steering prompt for this round β tells models what to focus on"
},
"moderator_name": {
"type": "string",
"maxLength": 100,
"description": "Updated steering identity for this round β use when the entity driving the session changes (e.g., a human takes over from an agent). If omitted, the session's existing moderator_name is preserved."
},
"snippets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"KEEP",
"EXPLORE",
"CHALLENGE",
"CORE",
"SHIFT"
]
},
"quote": {
"type": "string",
"description": "Verbatim quote from a prior round's response"
},
"quoted_model": {
"type": "string",
"description": "Model ID that originally said the quote"
},
"comment": {
"type": "string",
"description": "Your commentary on this quote β why you're forwarding it"
}
},
"required": [
"type",
"quote",
"quoted_model"
],
"additionalProperties": false
},
"description": "Curated quotes from prior rounds to direct models' attention. Optional but high-signal."
},
"takeaway": {
"type": "boolean",
"description": "If true, generates a structured per-round Takeaway (surfaced as `round_takeaway`) when this round completes. Default false. At-cost passthrough; ~$0.01 per call."
},
"recap_round": {
"type": "boolean",
"description": "Legacy alias of `takeaway`."
},
"recap_session": {
"type": "boolean",
"description": "Deprecated; ignored."
}
},
"required": [
"session_id",
"prompt"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
wait_for_round
Wait for a deliberation round to finish, then return the full session.
This is the agent-friendly follow-up to `create_deliberation` and `append_round`: those tools return a fast ack; this tool polls the lightweight progress endpoint internally and fetches the full transcript only once terminal state is reached.
Use this instead of repeatedly calling `get_session` while models are running.
The returned claim_map is your advance look at the panel's private notes β nothing in it has reached the other participants yet. Steer with it.
**Web-created rounds** (started from the mumo web UI rather than this API) resolve when all model responses have settled β round artifacts (claim map, takeaway) may still be generating at that moment. `claim_map_url` is always present and does not imply the map is ready; if it matters, re-check via `get_session` shortly after.
**Structured output.** The response carries both `content[0].text` (human-readable β full session markdown on terminal, short prose summary on timeout) and `structuredContent` matching the tool's `outputSchema`. Branch on `structuredContent.round_status` (`complete` | `partial_failure` | `in_progress` | `failed`) and `recommended_client_action` (`proceed_with_complete_result` | `proceed_with_partial_result` | `poll_again` | `retry` | `abandon`) rather than parsing prose. The schema also exposes per-model `completed_models[]` (with `tokens_in` / `tokens_out` / `finish_reason` / `is_partial`), `in_progress_models[]` (with `partial_text_length` / `last_chunk_at` / `since_last_chunk_ms` / `expired_at_read`), and `failed_models[]` (with canonical `error_code` and any preserved `partial_text`). Always HTTP 200 with explicit semantic state β failed rounds don't crash the tool call.
Parameters5
session_id
string
required
Session ID returned by create_deliberation or append_round
round_id
string
optional
Round ID from the create_deliberation or append_round ack. Optional: omitted, the call resolves to the latest round (the one in flight β a session has at most one) and PINS to it on the first poll, so a round appended mid-wait by another moderator never switches the target. Pass it to wait on or read an earlier round.
round_index
integer
optional
0-based round index to wait for. An alternative to round_id; ignored when round_id is given.
timeout_seconds
integer
optional
Server-side wait timeout in seconds before returning. Default: 40. On timeout, re-call with the `round_id` the timeout response returned (structuredContent.round_id) so the retry keeps waiting on the same round even if another round was appended in between.
poll_after_ms
integer
optional
Initial polling interval. Backs off up to 5s. Default: 1000.
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "Session ID returned by create_deliberation or append_round"
},
"round_id": {
"type": "string",
"description": "Round ID from the create_deliberation or append_round ack. Optional: omitted, the call resolves to the latest round (the one in flight β a session has at most one) and PINS to it on the first poll, so a round appended mid-wait by another moderator never switches the target. Pass it to wait on or read an earlier round."
},
"round_index": {
"type": "integer",
"minimum": 0,
"description": "0-based round index to wait for. An alternative to round_id; ignored when round_id is given."
},
"timeout_seconds": {
"type": "integer",
"minimum": 1,
"maximum": 120,
"description": "Server-side wait timeout in seconds before returning. Default: 40. On timeout, re-call with the `round_id` the timeout response returned (structuredContent.round_id) so the retry keeps waiting on the same round even if another round was appended in between."
},
"poll_after_ms": {
"type": "integer",
"minimum": 250,
"maximum": 10000,
"description": "Initial polling interval. Backs off up to 5s. Default: 1000."
}
},
"required": [
"session_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_session
Fetch the full state of a deliberation session including all rounds, responses, snippets, and claim maps.
Use to re-read completed session state. While a round is running, prefer `wait_for_round` so you do not repeatedly fetch the full transcript.
The claim_map on each round is the highest-signal representation: shows which claims multiple models reacted to, who originated them, and what each reacting model said (KEEP/CHALLENGE/etc + their comment). Use claim_map to identify unresolved disagreements before sending a follow-up.
Reactions are the panel's private ledger β participants never see each other's reactions, and as moderator you read them FIRST: the claim map is an advance view of what each model is privately weighing before any of it reaches prose. Use that privileged preview to steer the next round β forward a reaction as a snippet when it deserves the record immediately, or shape your prompt around a collision you can see coming. Authors weave their own strongest notes into their next responses; in later rounds you can compare a prior round's ledger against the prose that followed to spot what was dropped.
List the caller's deliberation sessions, optionally filtered by status.
Most useful for agents managing multiple concurrent sessions β use `status: 'ready'` to find sessions awaiting your next round. Returns a lightweight list (no response bodies); call `get_session` for full content.
Parameters3
status
string
optional
Filter by status. 'ready' = accepting more rounds, 'streaming' = models actively responding.
List the full model catalog. Returns id, provider, display name, context window, max output tokens, pricing, and a per-model `available` verdict for your account (with `unavailable_reason` when false). Nothing is filtered out β `available` is what varies by caller.
Call before `create_deliberation` if the user wants specific models. Model IDs from this endpoint are what `create_deliberation`'s `models` parameter expects.
Share a deliberation session at a public URL β anyone with the link can view it in the read-only reader deck.
Returns the public `share_url` plus two machine-readable twins: `markdown_url` (the full transcript with per-round claim maps β the review/audit surface) and `brief_url` (synthesis-only triage tier, ~1-2k tokens). Hand the markdown twin to a reviewer model, or the share_url to a human β no web UI required.
Semantics: idempotent β re-calling returns the same URL. The link is a point-in-time snapshot that auto-refreshes when you've appended rounds since the last share, so after extending a session, call this again to bring the public page current. Sharing never changes the session itself and never lists the page in search engines or the public library (that elevation is a separate platform-curated step).
Call when the user wants a shareable link or asks to publish/share results. Requires a registered (non-anonymous) mumo account; sharing generates any missing round takeaways first, so the first share of a long session can take ~15-30s.
Parameters1
session_id
string
required
Session ID to share (must be owned by the caller's API key)
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "Session ID to share (must be owned by the caller's API key)"
}
},
"required": [
"session_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_credit
Fetch the caller's current credit wallet balance.
Returns `effective_balance_usd` (markup-included, what's left to spend). Rounds are admitted while that balance is above zero, so this is the preflight check outside the write-op flow: above zero means the next round will run; at or below zero means it is refused until top-up or the monthly free-credit reset.
`per_model_minimum_usd_default` is also returned, and `pricing.minimum_usd` on `list_models` carries per-model values. Both are reported for reference β they no longer gate admission.
Your agent sends a question to models from different labs β Claude, GPT, Gemini, Grok, DeepSeek, Kimi, and more β and gets back their full responses plus typed cross-model reactions. The participating models react to each other directly and explain, in their own words, what they agree with, challenge, or want to explore further. Built for architecture, plan/spec review, strategy, and pre-launch pressure tests. Free monthly credit; API key required.
The server is remote. There is nothing to run locally.
code
https://mumo.chat/api/mcp
Install
One-click, per host β each page walks through the key and the client's own install flow:
Get a key at mumo.chat/settings/api-keys (sign-in required; keys start with mmo_live_). initialize and tools/list work without a key, so your client can inspect the tools before you create one; tool calls need the header.
Tools
Tool
What it does
create_deliberation
Start a deliberation. Returns an ack immediately (session_id + round_id); the models run in the background.
wait_for_round
Block on cheap progress polling until the round is done, then return every model's response and the claim map.
append_round
Add a follow-up round, optionally steered with typed snippets (KEEP / EXPLORE / CHALLENGE / CORE / SHIFT).
get_session
Read full session state: rounds, responses, snippets, claim maps.
share_session
Share a session at its public URL; returns the page plus .md and .brief.md machine twins.
list_sessions
List your prior sessions.
list_models
List the models available to your account, with pricing.
create_deliberation with the question, written in the operator's first person ("I'm deciding whether toβ¦").
wait_for_round β panels take 15β120 s; a long wait is normal.
Read the claim map before the prose. Steer with append_round and snippets, or stop.
The panel is advisory. Read the disagreement; don't defer to whichever side has more votes.
This repo: the client baseline
Beyond the server, mumo ships a skill for each host that teaches the agent when to convene a panel and how to read one. This repo is the source of truth for that skill: one tokenized SKILL.template.md plus a per-client overlay, rendered into each sibling client repo by the build script in scripts/. Never edit a client's SKILL.md directly β edit here and re-render.
Client repo
Renders to
mumo-chat/mumo-claude
Claude Code plugin
mumo-chat/mumo-cursor
Cursor plugin
mumo-chat/mumo-codex
Codex plugin
mumo-chat/mumo-vscode
VS Code extension
mumo-chat/mumo-hermes
Hermes Agent skill
mumo-chat/mumo-openclaw
OpenClaw skill
Contents
code
skills/mumo/
βββ SKILL.template.md # tokenized baseline (the source of truth)
βββ playbooks/ # shared cognitive-shape playbooks
βββ references/ # shared reference docs (claim maps, snippets, takeaway, etc.)
scripts/
βββ build-skill.js # renderer: template + per-client overlay -> client SKILL.md
βββ README.md # how the build system works
βββ clients/ # per-client configs + Setup/Frontmatter partials
server.json # Official MCP Registry descriptor (chat.mumo/mcp)
The template uses {{TOKEN}} markers for per-client substitution points (application name, moderator example, install URL, tool-naming registry note, etc.). Each scripts/clients/<client>.json fills them in.
Building
bash
node scripts/build-skill.js # render to all six sibling client repos
node scripts/build-skill.js --target <client> # render one
node scripts/build-skill.js --verify-all # check for drift across all six (use in CI)
See scripts/README.md for details (token reference, adding a new client, etc.).
Editing
Shared kernel changes β edit skills/mumo/SKILL.template.md. Re-render to propagate.
Per-client overlay changes (## Setup body, frontmatter, application name, moderator example, install URL, tool-naming note) β edit scripts/clients/<client>/ partials or scripts/clients/<client>.json tokens. Re-render.
Shared playbooks / references β edit skills/mumo/playbooks/ or skills/mumo/references/. Currently propagated manually; build-system handling is a follow-up.