MCP server adding an independent second LLM perspective (Judge B) with full project graph context
Project description
Contrarian
MCP server that adds a second LLM perspective (Judge B) directly inside Claude Code.
Claude Code is Judge A — it already has full project context. Contrarian adds Judge B, an independent model from a different lab, via a single tool call. Same rubric, different priors, no context switch.
How it works
- Claude Code invokes
contrarian_review()— no args for auto-detect, or pass specific files. - Contrarian resolves the input: git diff, last commit, or full audit (in that order).
- Judge B (external model) reviews against
JUDGE.mdin the project root. - Findings are returned inline and appended to
REPORT.mdfor the dialogue log.
Auto-detect order:
- diff — any staged/unstaged changes or untracked files
- last-commit — clean tree → reviews the last commit
- audit — forced with
audit=true, or nothing else found
Installation
Requires Python 3.10+. You'll need a free API key from DeepSeek (no credit card required).
pip install contrarian
contrarian setup
contrarian setup prompts for your API key, then writes the MCP server config to ~/.claude/.claude.json automatically. Restart Claude Code after running it.
That's it.
Manual config (alternative)
If you prefer to configure manually, add to ~/.claude/.claude.json:
{
"mcpServers": {
"contrarian": {
"type": "stdio",
"command": "contrarian",
"args": [],
"env": {
"JUDGE_B_API_KEY": "sk-or-...",
"JUDGE_B_BASE_URL": "https://openrouter.ai/api/v1"
}
}
}
}
Default provider is DeepSeek (api.deepseek.com, model deepseek-chat). Change JUDGE_B_BASE_URL and JUDGE_B_MODEL to use any OpenAI-compatible provider (Gemini, Groq, Ollama, OpenRouter, etc.).
Anthropic models are blocked at runtime — Judge B must come from a different lab than Judge A.
Usage
Inside any Claude Code session, the tool is available as contrarian_review.
contrarian_review() # auto-detect mode
contrarian_review({ path: "src/auth.py" }) # single file, diff
contrarian_review({ path: "src/auth.py", full: true }) # full file
contrarian_review({ paths: ["src/a.py", "src/b.py"] }) # multi-file, reviewed as a unit
contrarian_review({ audit: true }) # force full repo walk
contrarian_review({ model: "google/gemini-3.1-pro-preview" }) # one-off model override
Rubric
Place a JUDGE.md at the project root to customize what Judge B looks for. Without it, a built-in fallback rubric applies.
The built-in rubric covers four dimensions:
| Dimension | What to find |
|---|---|
| Exactitude | Logic errors, wrong assumptions, incorrect implementation |
| Missing | Unhandled cases, absent validation, unconsidered implications |
| Premises | Assumptions that could be wrong |
| Alternatives | Fundamentally different approaches |
Output is always JSON:
{
"exactitude": { "verdict": "ok|warn|fail", "findings": [] },
"missing": [],
"premises": [],
"alternatives": []
}
Report log
Findings are appended to REPORT.md at the project root under [Judge B] blocks. Claude Code annotates findings under [Judge A] blocks. Judge B reads previous exchanges before each review — closed findings (addressed, won't fix, disagree) are not re-raised.
Phase roadmap
- Phase 2 (current): MCP server + project graph context. Auto-detect mode. Python rewrite.
- Phase 3: Operational hardening — token budget guard, graph latency, detached HEAD handling.
- Phase 4: Agent watchdog — autonomous background review on commit.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file contrarian-0.2.0.tar.gz.
File metadata
- Download URL: contrarian-0.2.0.tar.gz
- Upload date:
- Size: 15.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df13f33efabcfd03e80bf6117467ed8b21ae6956c64375cf6e78c5b44fda7be3
|
|
| MD5 |
79abc36d58e9f5a4b4c5d25feb6b8c30
|
|
| BLAKE2b-256 |
9394a2882e8a0c5284e7a9dc5102302d84383f40d4e3b3d05ec57305fc50fb60
|
File details
Details for the file contrarian-0.2.0-py3-none-any.whl.
File metadata
- Download URL: contrarian-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7e359133cc7985861b535b6d438f7ccfb289866cde5beaa92051c8599f99337
|
|
| MD5 |
cdda7318dd8a28452c1016958e0c6fee
|
|
| BLAKE2b-256 |
9735fc0e5428b68104b1c43ff7d1c9df32effab2074c008a7ad39085f0187da4
|