corroborate-mcp
Allows searching Google News RSS for news articles to corroborate claims.
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., "@corroborate-mcpIs 'Fed cuts rates by 0.5%' corroborated?"
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.
corroborate-mcp
The honest corroboration layer for AI agents. Hand it a claim; it tells you how independently that claim is actually being reported — and shows its work.
An AP story echoed by 40 outlets is one origin, not 40. Counting that correctly — syndication-aware — is the judgment layer raw web search doesn't give you.
corroborate_claim("NASA delayed the Artemis III landing") → CONFIRMED 4 independent origins · conf 0.9
corroborate_claim("Zorblatt Corp acquired Portugal") → UNCORROBORATED 0 origins · conf 0.05When an agent should call this
Before relying on a current-event / news claim — is it independently reported, or one source echoed everywhere?
To rank or filter sources by genuine independence, with a confidence score.
When you need a verdict you can defend — every answer ships its evidence, its confidence, and its own caveats.
Not a web search engine (use Exa/Tavily/Brave for that) and not a human fact-checking network. It's the narrow, honest primitive in between: how independently is this reported?
Related MCP server: Fact-Checker MCP Server
Why it's trustworthy — by design
🔑 Zero API keys, zero accounts | Keyless engines (Google News RSS · GDELT · Hacker News). Nothing to sign up for. |
👁 Read-only | It reads public news. It cannot act, write, spend, or touch your data. |
🎯 Deterministic | No LLM in the loop — same evidence in, same verdict out. p50 ~0.4s. |
📖 Open source (MIT) | Read every line of the judgment. |
📊 Published error rates | We measure our own false-CONFIRMED / false-UNCORROBORATED rates on a public benchmark and print them below. Most "fact-check" tools don't. |
🚫 Never lies by omission | If sources are unreachable it returns an error, never a fake "UNCORROBORATED." |
What it measures — and what it doesn't
Reporting corroboration, not truth. A claim every outlet syndicated from one wire story comes back SINGLE_SOURCE. A claim nobody covers comes back UNCORROBORATED even if true. The verdict states exactly what was measured, flags its weaknesses in notes, and sets coverage:"degraded" when an engine was down — so absence of evidence is never quietly sold as evidence of absence.
Quickstart
Requires Node ≥ 18. No keys, no config.
Claude Code
claude mcp add corroborate -- npx -y corroborate-mcpClaude Desktop / Cursor / any MCP client (claude_desktop_config.json, .cursor/mcp.json, …)
{ "mcpServers": { "corroborate": { "command": "npx", "args": ["-y", "corroborate-mcp"] } } }Try it with no MCP client
npx corroborate-mcp # starts the stdio server (silent = healthy)
# or from a checkout: node cli.js "The Federal Reserve held interest rates steady"Tools
corroborate_claim — the verdict
{ claim, window_days?=7, max_sources?=8 } →
{
"claim": "Acme Corp acquires Widget Industries for $2 billion",
"corroboration": "CONFIRMED",
"n_independent_sources": 3,
"confidence": 0.9,
"coverage": "full",
"sources": [
{ "headline": "Acme Corp to acquire Widget Industries in $2 billion deal",
"outlet": "Financial Times", "domain": "ft.com", "url": "https://…",
"published_at": "2026-07-09T14:02:00Z", "age_days": 0.9,
"wire": false, "echoed_by_n_domains": 1 }
],
"notes": ["syndication detected: near-identical headlines across multiple domains collapsed into one origin"],
"method": "reporting-corroboration: counts INDEPENDENT story origins (syndication-aware), not raw article count; does not adjudicate truth"
}Field | Meaning |
|
|
| Distinct story origins after syndication clustering — not article count |
| 0–1. Rises with origins + cross-engine agreement; penalized for wide single-origin echo |
|
|
| Origin is a wire service (AP/Reuters/AFP/UPI) |
| How many domains carried this same story |
| Honest caveats: syndication collapse, breaking-news cascade (<24h), relevance-gate discards, engine outages |
find_sources — the raw evidence
{ query, window_days?=7, max_sources?=10 } → deduped multi-engine list (outlet, domain, url, date), no verdict. The cheaper primitive when you want the coverage and your own judgment.
Measured accuracy — because you should demand it from any fact-check tool
Against a public 40-claim labeled benchmark (benchmark/ — claims, labels, category definitions, and harness are all public; run it yourself with npm run benchmark). Latest run 2026-07-12:
Metric | Result |
Fabricated claims falsely CONFIRMED | 0/10 |
Widely-reported true claims missed | 0/12 (12/12 CONFIRMED) |
Niche true claims detected | 7/8 |
Stale claims correctly windowed | 3/5 |
Distorted claims falsely CONFIRMED | 4/6 — read the warning ↓ |
Latency | p50 0.4s · p95 ≤8s (engine-outage worst case) |
⚠️ Respect the distorted-claim number. This tool checks whether independent reporting exists around a claim's topic and entities — it does not do stance detection. A distorted version of a real event ("OpenAI released GPT-6" when it's GPT-5.6; "the EPA strengthened rules" when it weakened them) can come back CONFIRMED because real coverage token-matches it. For adversarial or detail-critical input, read CONFIRMED as "this topic has independent coverage — now check the specifics against the returned sources." Stance detection is on the v1.1 roadmap. (Recurring events like championships/elections can likewise match the current cycle's coverage.)
How the judgment works
Search Google News RSS, GDELT, Hacker News in parallel (keywords extracted from the claim; quoted phrases preserved).
Relevance gate — an article counts only if its headline genuinely addresses the claim (≥2 core-token hits AND ≥35% of core tokens). Loose topical echoes are discarded; the discard count is reported.
Syndication clustering — near-identical headlines across domains (Jaccard ≥ 0.55) collapse into one origin; wire domains flagged.
Verdict — independent origins = distinct clusters; confidence rises with origins + cross-engine agreement, falls for wide single-origin echoes; every known weakness goes in
notes.
Honest limitations
No stance detection (the 4/6 above). CONFIRMED = independently covered, not verified in every detail.
English-language, headline-level. Paywalled body text isn't fetched.
Recency-windowed (default 7 days, max 90). Old claims read
UNCORROBORATED— a window statement, not a falsity verdict.Independent rewrites of one wire story can occasionally slip clustering; distinct phrasings of one origin can occasionally count as two.
All engines down → error, never a fake
UNCORROBORATED.
Development
npm test # golden-claim suite — deterministic, no network
npm run test:mcp # MCP stdio handshake + tools/list
npm run test:live # live invariants against real engines
npm run benchmark # 40-claim labeled accuracy benchmark (live, ~2 min)
npm run test:release # all of the above — required green before every releaseMaintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- 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/chefcohen/corroborate-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server