In 2023, a New York lawyer submitted a brief citing six cases that didn't exist. ChatGPT had hallucinated them — complete with plausible docket numbers, judges, and holdings. The lawyer was fined $5,000.
In 2024, a Nature study found that roughly 1 in 6 AI-generated citations in scientific writing referred to nonexistent or misrepresented papers.
In June 2026, the Ninth Circuit sanctioned an attorney for citing fabricated AI-generated precedents, calling it "an affront to the judicial system."
These aren't edge cases. They're the normal behavior of a language model doing its job — generating plausible text — applied to a domain where plausibility isn't enough.
The core problem
Language models are trained to produce fluent, contextually appropriate text. A citation is just a specific format: author names, title, journal, year, DOI. The model has seen millions of them. It can generate one that looks exactly right.
The model doesn't know whether the paper exists. It has no mechanism to check. It's pattern-matching, not remembering.
When you ask an AI assistant to "find me papers on X" or "what does the literature say about Y," you're asking a pattern-matcher to retrieve facts. It will produce citations. Some will be real. Some will be fabricated. From the output alone, you can't tell which.
What verification actually requires
To know a citation is real, you need to check it against an external, authoritative source:
- DOI resolution: Does this DOI exist? Does it resolve to the paper being cited?
- Retraction status: Has this paper been retracted, corrected, or flagged?
- Content match: Does the paper actually say what the citation claims it says?
- Link liveness: Is the URL still live, or has it 404'd?
None of this can happen inside the model. It has to happen at runtime, against live external systems.
This is the architecture that makes verification possible: an AI assistant calling external tools at inference time — not relying on training data.
How web-researcher-mcp catches citation hallucinations
web-researcher-mcp is an open-source MCP server (MIT, single Go binary) that gives AI assistants like Claude and Cursor a verification layer at the tool-call layer.
Here's what happens when an AI assistant calls verify_citation:
{
"tool": "verify_citation",
"input": {
"doi": "10.1038/s41586-021-03819-2",
"claimed_title": "Highly accurate protein structure prediction with AlphaFold",
"claimed_authors": ["Jumper", "Evans"],
"claimed_year": 2021
}
}
The tool:
- Resolves the DOI against Crossref — the authoritative DOI registry
- Checks if the resolved record matches the claimed title, authors, and year
- Queries Crossref Retraction Watch for retraction/correction status
- Returns a structured result:
verified,title_mismatch,not_found,retracted, orunchecked
A not_found means the DOI doesn't exist in Crossref — strong evidence of fabrication. A title_mismatch means the DOI resolves to a real paper, but not the one being cited — the model hallucinated the DOI for a real title, or swapped metadata.
Auditing a full bibliography
Individual citation checking is useful. Full bibliography auditing is where it gets powerful.
audit_bibliography takes a complete reference list (BibTeX, RIS, CSL-JSON, or a plain list) and runs every entry through the verification pipeline:
Results for 12 references:
✓ verified 8 (DOI resolves, metadata matches, not retracted)
✗ not_found 2 (DOI absent from Crossref — possible fabrication)
⚠ title_mismatch 1 (DOI resolves to different paper)
~ unchecked 1 (book chapter, no DOI — can't verify)
The two not_found entries are the hallucinations. The title_mismatch is a DOI that got swapped — the paper exists, but it's not the one being cited.
This is what distinguishes citation verification from citation search. Search finds you papers. Verification tells you whether the papers the AI found actually exist and say what they're claimed to say.
Dead links and retraction detection
Two more signals the tool surfaces:
Retraction status via Crossref Retraction Watch. When you call scrape_page on a PDF or academic URL, the tool automatically checks the detected DOI against the retraction database. A retracted paper that the AI cited as evidence is worse than a fabricated one — it's a real paper that the scientific community has repudiated.
Dead link archiving via Wayback Machine. When a cited URL 404s, archive_source can retrieve the archived version and return the Wayback URL. This is especially common in legal and policy citations where government pages move or are taken down.
The MCP architecture that makes this possible
MCP (Model Context Protocol) is an Anthropic-backed open standard that lets AI clients call external tools at inference time. It's roughly: the model decides to call a tool, the MCP server executes it, the result comes back as context.
This architecture is exactly what citation verification requires. The model can't verify a citation from memory — but it can call verify_citation, get a structured result, and incorporate that into its response.
Any MCP-compatible client works: Claude Desktop, Cursor, Windsurf, VS Code with Continue, and others. Install is one command:
# macOS/Linux
curl -fsSL https://raw.githubusercontent.com/zoharbabin/web-researcher-mcp/main/install.sh | bash
# Python users
uvx web-researcher-mcp
Zero config — DuckDuckGo works out of the box. Add API keys for Google, Brave, or other providers to extend coverage.
When this matters most
Research and academia: Before citing a paper, verify_citation checks that it exists, isn't retracted, and matches the claimed metadata. audit_bibliography sweeps a full reference list before submission.
Legal work: AI-assisted legal research is now common. Citation hallucination in legal briefs has led to sanctions in multiple jurisdictions. Verify every case cite before it goes in a brief.
Journalism and fact-checking: Dead links, retracted studies, and papers that don't say what they're claimed to say. The tool catches all three.
Any workflow where AI summarizes research: The model will find real papers and fabricated ones with equal confidence. The only way to tell them apart is to check.
What this doesn't do
The tool verifies whether citations are real and whether they match claimed metadata. It doesn't:
- Read and summarize the full paper for you (though
scrape_pagecan fetch and extract content from open-access PDFs) - Judge whether a paper's methodology is sound
- Replace domain expertise
The goal is narrow: catch the most common and most dangerous failure mode — a citation that doesn't correspond to a real, non-retracted paper saying what it's claimed to say.
Try it
The project is open source on GitHub, MIT licensed, and launching today on Product Hunt.
35+ tools covering web search (Google/Brave/DuckDuckGo/Tavily/Exa), academic search (PubMed, academic indexes), patent search, citation verification, retraction detection, dead-link archiving, bibliography audit, and more.
If you work with AI-generated research, the citation layer is the one place where "good enough" isn't good enough. A hallucinated citation in a legal brief, a grant proposal, or a published paper can do real damage. The tool exists to close that gap.
Previously: From Node.js to Go: Rebuilding an MCP Server for Production — the engineering story behind the rewrite.
Top comments (0)