MCP server that gives Claude a review council - other LLMs fact-check responses before you see them
Council MCP
An MCP server that gives Claude a review council — other LLMs that fact-check Claude's responses before you see them.
Every review is saved as a Markdown file so you can read, share, or audit the verification trail.
How it works
- You ask Claude a question
- Claude drafts its answer
- Claude calls the
council_reviewtool, sending its draft to Gemini - Gemini extracts every factual claim and verifies each one
- Gemini flags disputed claims, unverifiable info, and things needing manual check
- Gemini identifies resources Claude missed
- The full verification report is shown to you alongside Claude's corrected answer
- A
.mdfile with the complete review is saved toreviews/for your records
Setup
1. Get a free Gemini API key
Go to Google AI Studio and create a key. The free tier is sufficient to get started.
2. Clone and install
git clone https://github.com/alterego-987/council-mcp.git
cd council-mcp
uv sync
Don't have
uv? Install it:curl -LsSf https://astral.sh/uv/install.sh | sh
3. Add to Claude Code
Add the following to your ~/.claude.json under mcpServers:
{
"council": {
"command": "uv",
"args": ["run", "--directory", "/path/to/council-mcp", "python", "-m", "council_mcp.server"],
"env": {
"GEMINI_API_KEY": "your-key-here"
},
"type": "stdio"
}
}
Replace /path/to/council-mcp with the actual path where you cloned the repo.
4. Restart Claude Code
Start a new session. Claude will now have access to council_review and council_status tools. For complex or technical responses, Claude will automatically send its draft through Gemini for verification.
Note: The council currently works in the Code tab of the Claude desktop app. Chat and Cowork tabs only support cloud-based MCP integrations and do not load local stdio servers.
Available tools
| Tool | Description |
|------|-------------|
| council_review | Send Claude's response for fact-checking. Saves a .md review file. |
| council_status | Check which reviewers are online |
Review files
Every call to council_review saves a timestamped Markdown file to the reviews/ directory (gitignored by default). Each file contains:
- The original user query
- Claude's draft response
- Gemini's full verification report (claim-by-claim)
- Missed resources and overall assessment
Files are named like 2026-04-04_15-20-03_your-question-slug.md.
You can customize the output directory with the COUNCIL_REVIEWS_DIR environment variable.
Choosing a Gemini model
Set the GEMINI_MODEL environment variable in your MCP config to use a different model:
"env": {
"GEMINI_API_KEY": "your-key-here",
"GEMINI_MODEL": "gemini-3-flash-preview"
}
Free tier models (no billing required)
| Model | Best for |
|-------|----------|
| gemini-3-flash-preview | Best free option — latest generation |
| gemini-2.5-flash | Stable, reliable fallback |
| gemini-2.5-flash-lite | Fastest, lightest |
Paid models (require billing in Google AI Studio)
| Model | Best for |
|-------|----------|
| gemini-3.1-pro-preview | Highest quality reviews |
| gemini-2.5-pro | Strong pro-tier alternative |
Web search grounding is NOT available on the free tier. Gemini reviews based on its training knowledge and will flag claims it can't verify as
UNVERIFIABLEorNEEDS_MANUAL_CHECK.
Architecture
council-mcp/
src/council_mcp/
server.py # MCP server — tool definitions, review file saving
prompts.py # System/user prompts for fact-checking
reviewers/
base.py # BaseReviewer ABC, ReviewResult, ClaimVerification
gemini.py # Gemini reviewer implementation
reviews/ # Saved review reports (gitignored)
Adding more reviewers
The system is modular. To add a new reviewer (ChatGPT, Perplexity, Grok, etc.):
- Create a new file in
src/council_mcp/reviewers/(e.g.,chatgpt.py) - Subclass
BaseReviewerand implement:nameproperty — human-readable namereview()method — sends the query/response and returns aReviewResultis_available()method — checks if the API is reachable
- Add the reviewer to
_build_reviewers()inserver.py - Add the API key to your MCP config's
envblock
Example skeleton:
class ChatGPTReviewer(BaseReviewer):
@property
def name(self) -> str:
return "ChatGPT (gpt-4o)"
async def review(self, user_query: str, claude_response: str) -> ReviewResult:
# Call OpenAI API, parse response, return ReviewResult
...
async def is_available(self) -> bool:
# Ping the API
...
Contributing
PRs are welcome! Some ideas:
- New reviewers — Add ChatGPT, Perplexity, Grok, or other LLMs as reviewers
- Improved parsing — Make the Gemini response parser more robust
- Web search integration — Add Perplexity or Tavily for real-time fact-checking with live sources
- Review dashboard — Build a simple UI to browse saved review files
- Configurable prompts — Allow users to customize the fact-checking prompt
- Confidence scoring — Aggregate reviewer scores into a single confidence metric
How to contribute
- Fork the repo
- Create a feature branch (
git checkout -b feature/my-feature) - Make your changes
- Submit a PR with a clear description of what you added
License
MIT