mcp-tournament
Click on "Install 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., "@mcp-tournamentRun the business-strategy benchmark on my model"
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.
mcp-tournament
Build a custom LLM benchmark in a form, run it from a local GUI, MCP client, or CLI, and turn independent judge opinions into ranked, auditable results.

▶ Live demo: watch a real business-strategy run assemble itself, no key needed.
Why this is interesting:
Disagreement is data: multiple specialist judges score independently; the arbiter preserves outliers and explains where they diverged.
Benches are declarative: anyone can define scenarios and criteria as JSON or build them in a form, no pipeline code required.
BYOK and local-first: bring one OpenRouter key, keep the GUI on your machine, and run budget-tier tournaments for cents.
How it works
flowchart LR
A["Scenario + criteria<br/>plugin / bench JSON"] --> B["EXECUTE<br/>candidate + tool calls"]
B --> C["JUDGE<br/>N specialists in parallel"]
C --> D["SYNTHESIZE<br/>merge + flag outliers<br/>never scores independently"]
D --> E["AGGREGATE<br/>leaderboard + JSON audit trail"]Three entry points feed the same pipeline:
GUI: build benches, launch runs, and inspect results locally.
MCP client: evaluate models from Claude Desktop, Cursor, or Windsurf.
CLI: script runs, serve MCP over stdio, or print the leaderboard.
Domain logic is pluggable; the pipeline is not. Benches are declarative plugins: a JSON file (or the Build Bench form) defines scenarios, rounds, an optional simulated participant persona, and judging criteria. Code plugins can go further with custom tools; see docs/PLUGINS.md.
Plugin | Domain | Kind |
| SMB pricing decision with real numbers to reason about | 📄 bench (JSON) |
| Opening chapter + 3 rounds with a developmental-editor persona | 📄 bench (JSON) |
| Billing dispute with an escalating customer persona | 📄 bench (JSON) |
| Showcase: D&D 5e Dungeon Master with dice/damage tools and an LLM player | ⚙️ code plugin |
| Code generation & review | ⚙️ code plugin |
Yours | Build in the GUI ( | 🛠 you |
Related MCP server: Patronus MCP Server
Why multi-judge?
Single evaluators miss things. A Rules judge catches mechanical errors; a Creative judge catches boring output; a Holistic judge catches "would I keep using this?" The synthesizer never scores independently: it arbitrates, flags outlier judges, and records why they disagreed. Judge disagreements are first-class data, rendered in the viewer:

When to use this (and when not to)
You want | Reach for |
CI-style assertions and regression gates over prompts at scale | |
Standardized academic benchmarks (MMLU, HellaSwag, …) | |
Rubric-scored comparisons on your own scenarios (multi-round conversations, personas, tool use) with judge disagreement preserved instead of averaged away | mcp-tournament |
Those tools are better at what they do; this one is for judgment-heavy, domain-specific evals where a single aggregate score hides the story.
Quick start
git clone https://github.com/samalbanese/mcp-tournament.git
cd mcp-tournament
npm run setup # installs + builds server and GUI
export OPENROUTER_API_KEY=sk-or-... # one key, every roleOr skip local setup entirely:
As a local app (BYOK GUI)
node dist/cli.js gui # http://localhost:4600Paste your OpenRouter key in Settings (stored in your browser, sent only to this local server, never written to disk), then set your model routing right below it (default candidates from the live catalog with prices, plus the model behind each judge and the synthesizer) and start a run from NEW RUN. BUILD BENCH creates a new benchmark from a form (question, rounds, persona, judging criteria, with an AI-suggest button) and saves it as a JSON plugin, live immediately.
As a desktop app (Windows, unsigned preview)
The same server + GUI wrapped in an Electron window, with the API key stored
via OS-level encryption (safeStorage) instead of the browser:
npm --prefix electron install
npm --prefix electron run dist # unsigned NSIS installer + portable exe → electron/dist-app/Builds are unsigned for now, so Windows SmartScreen will warn on first run; see electron/README.md.
As an MCP server (Claude Desktop, Cursor, Windsurf)
{
"mcpServers": {
"tournament": {
"command": "node",
"args": ["<path-to-repo>/dist/index.js"],
"env": { "OPENROUTER_API_KEY": "sk-or-..." }
}
}
}Tool | Description |
| 1–4 models × scenarios × judge panel → ranked results |
| One scenario, one judge: fast smoke score |
| Best cached score per model across runs |
As a CLI
# The demo: 3 cheap models, 1 bench scenario, 3 judges (~a few cents)
node dist/cli.js run --plugin business-strategy \
--models "deepseek/deepseek-v3.2,google/gemini-2.5-flash-lite,meta-llama/llama-4-scout" \
--scenario pricing-pivot --judges 3
# Or the tool-calling showcase: D&D DM with dice/damage tools and an LLM player
node dist/cli.js run --plugin dnd --models "deepseek/deepseek-v3.2" \
--scenario dnd-combat --judges 3
node dist/cli.js leaderboard
node dist/cli.js serve # MCP stdio serverResults viewer
gui/ is a self-contained Vite + React static site with no backend; it deploys
to any static host (Cloudflare Pages works as-is). It reads committed run JSON and
renders rankings, per-judge breakdowns, disagreement callouts, and full
transcripts with tool-call inspection.

cd gui && npm install
npm run import-run -- ../results/<runId> # copy a run into the viewer
npm run build && npm run preview
Model routing
Every role (the candidates, each judge, the synthesizer, the participant agent) is independently model-selectable and routes through OpenRouter by default. One key, any model, no paid first-party API in the demo path. Defaults are all budget-tier (DeepSeek, Qwen Flash, Gemini Flash Lite; a full run costs cents); override per role:
TOURNAMENT_MODEL_JUDGE_RULES=openai/gpt-5.4-mini
TOURNAMENT_MODEL_SYNTHESIZER=moonshotai/kimi-k2.5
TOURNAMENT_MODEL_PARTICIPANT=deepseek/deepseek-v3.2The routing layer resolves a pluggable ModelClient per role
(src/clients/types.ts). That registry is the documented extension point for a
Claude Agent SDK route, which
authenticates against a local claude /login session so Claude-judged runs draw
on a Max/Pro subscription instead of the metered API: the original
oracle-tournament design. Two regression tests guard the default: the demo path
never resolves to the paid Anthropic API, and the MCP server's logger stays on
stderr (stdout is reserved for JSON-RPC).
Environment variables
Variable | Required | Purpose |
| Yes | All roles by default |
| No | Per-role model overrides (see above) |
| No | Results output root (default |
How it's tested
npm test runs 32 unit tests with no API key required. Two of them are
regression guards with a story:
The MCP logger writes to stderr only. stdout is reserved for JSON-RPC: one stray
console.logcorrupts the protocol stream and silently breaks every connected MCP client. The guard makes that a failing test instead of a mystery bug report.The default route can never resolve to a paid first-party API. The demo path stays BYOK-through-OpenRouter at budget-tier prices; a config regression that would quietly bill someone's Anthropic key fails CI.
An e2e suite (npm run test:e2e) exercises real model calls when a key is
present. CI runs build + unit tests + the GUI build on every push and PR.
Roadmap
Deferred deliberately: tournament.compare / report / plugins / scenarios /
judges tools, plugin auto-discovery, npm publish, and MCP registry submission.
Provenance
Generalized from oracle-tournament, a D&D-specific model evaluator whose pipeline proved out the multi-judge + arbiter design; this repo makes the domain pluggable.
Contributing
Issues and PRs welcome; the easiest contribution is a new bench JSON. See CONTRIBUTING.md.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides tools for evaluating and benchmarking AI explanation methods through a standard interface that can be used with AI assistants and MCP-compatible applications.11MIT

Patronus MCP Serverofficial
Alicense-qualityDmaintenanceEnables running LLM evaluations, experiments, and custom evaluators through a standardized MCP interface.16Apache 2.0- Flicense-qualityCmaintenanceMCP-based code evaluation harness — sandboxed execution + LLM quality scoring.
- AlicenseBqualityBmaintenanceAn MCP-style stdio server for evaluating AI agent outputs, enabling CI-friendly quality gates, regression comparisons, and canary promotion decisions.3MIT
Related MCP Connectors
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
No-key MCP: audit/certify MCPs, signed trust history; join Gold Rush Town & build with your LLM.
A paid remote MCP for AI SDK benchmark dashboard, built to return verdicts, receipts, usage logs, an
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/samalbanese/mcp-tournament'
If you have feedback or need assistance with the MCP directory API, please join our Discord server