citation-check
An MCP server that verifies citations and reference lists field-by-field against scholarly databases and flags retractions.
check_references— check up to 30 citations (pasted reference list in any style, or BibTeX) against Crossref, DataCite, PubMed and OpenAlex; gives each a verdict (verified,mismatch,not_found,unverifiable) plus flags likeretracted,expression_of_concern,identifier_points_to_different_work;bibtex=truereturns corrected BibTeX preserving keys.check_retractions— fast batch check of up to 200 DOIs, returning a status per DOI:retracted,partially_retracted,expression_of_concern,corrected,noneornot_in_crossref.lookup_work— resolve a single work from a DOI, arXiv id, PMID, URL, title or full citation, returning authors, year, venue, pages, DOI, retraction/correction notices, a newer published version if one exists, and BibTeX.Behavior — read-only, no account or API key required, works over stdio or hosted Streamable HTTP.
Validates and resolves arXiv identifiers and matches citations against arXiv metadata to verify references.
Resolves and checks DOIs through doi.org to determine whether a DOI is registered and to verify cited works.
Validates PMIDs and matches citations against PubMed records to verify publication metadata.
Click on "Deploy 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., "@citation-check Check this reference list for fabricated or mismatched citations and retractions"
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.
Citation Check
Checks every reference in a paper, brief or bibliography before anyone relies on it: does the cited work exist, does the citation describe it correctly, and has it been retracted?
Language models fabricate references, and fabricated references now reach court filings and journal submissions (Damien Charlotin's database of AI-hallucination cases in courts lists more than two thousand decisions). The existing checkers either stop at "is this DOI valid" or miss retractions. Citation Check gives each reference a verdict an agent can act on:
Verdict | Meaning |
| The work exists and the citation's title, first author and year agree with the record |
| The work was found, but the citation gets a field wrong, or its DOI belongs to a different paper |
| No source holds a matching work: possibly fabricated, or a book, thesis or very new work that is not indexed |
| The DOI is registered, but no source returns metadata to compare against |
Every result also carries flags such as retracted, partially_retracted, expression_of_concern,
corrected, doi_added, identifier_points_to_different_work, doi_not_registered,
published_version_exists and doi_may_be_later_copy, with the notice DOIs and dates. The last
one catches a quiet index error: OpenAlex sometimes files a classic paper under the DOI of a later
repost or book chapter, which shows because the work is cited years before that DOI's date.
It reads pasted reference lists in any common style (Vancouver, APA, numbered, one per line) and BibTeX, and returns corrected BibTeX that keeps your citation keys. No account or key needed.
Built and maintained by Arhan Canli.
Install
Needs Node.js 20 or newer. No account or key.
Claude Code
claude mcp add citation-check -- npx -y citation-check-mcpClaude Desktop: download citation-check-mcp-<version>.mcpb from the latest release and open it. The bundle is signed; verify it with gh attestation verify <file> --repo arhancanli/citation-check-mcp.
Any other client (Windsurf, Zed, Cline, Continue and others), in its MCP config file:
{
"mcpServers": {
"citation-check": {
"command": "npx",
"args": [
"-y",
"citation-check-mcp"
]
}
}
}Docker
docker build -t citation-check-mcp https://github.com/arhancanli/citation-check-mcp.git && docker run -i --rm citation-check-mcpHosted (Streamable HTTP): node src/server.mjs --http serves stateless MCP at POST /mcp (port from PORT, default 3000).
Optional settings
CROSSREF_MAILTO: your own email address. Crossref then serves requests from its faster "polite" pool (3 searches per second instead of 1). Nothing else is done with it.OPENALEX_API_KEY: a free OpenAlex key raises its daily search allowance. Without one, OpenAlex is used only as the last fallback and the check still completes when its allowance is spent.
Related MCP server: io.github.Hylouis233/bibverify
Example
An agent calls check_references with:
{
"text": "1. Wakefield AJ, Murch SH, Anthony A, et al. Ileal-lymphoid-nodular hyperplasia, non-specific colitis, and pervasive developmental disorder in children. Lancet. 1998;351(9103):637-641.\n2. Kucsko G, Maurer PC, Yao NY, et al. Nanometre-scale thermometry in a living cell. Nature. 2013;500:54-58. doi:10.1038/nature12373\n3. Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need. In: Advances in Neural Information Processing Systems. 2017.\n4. Smith J, Doe R. Quantum entanglement improves photosynthesis yields in wheat. Nature Plants. 2021;7:112-119. doi:10.1038/nature12373\n5. Kucsko G, Maurer PC. Nanometre-scale thermometry in a living cell. Nature. 2011;500:54-58.\n6. Chen L, Okafor B. Neural cartography of hallucinated citations in legal briefs. Journal of Imaginary Studies. 2022;14(2):33-47."
}and gets back (recorded from the live server on 2026-09-27):
{
"counts": {
"verified": 3,
"mismatch": 2,
"not_found": 1,
"unverifiable": 0,
"retracted": 1
},
"results": [
{
"n": 1,
"cited": "Wakefield AJ, Murch SH, Anthony A, et al. Ileal-lymphoid-nodular hyperplasia, non-specific colitis, and pervasive developmental disorder in children. Lancet....",
"verdict": "verified",
"flags": [
"doi_added",
"corrected",
"retracted"
],
"matched": {
"doi": "10.1016/s0140-6736(97)11096-0",
"title": "RETRACTED: Ileal-lymphoid-nodular hyperplasia, non-specific colitis, and pervasive developmental disorder in children",
"authors": "Wakefield, Murch, Anthony et al.",
"year": 1998,
"venue": "The Lancet",
"url": "https://doi.org/10.1016/s0140-6736(97)11096-0",
"source": "crossref"
},
"notices": [
{
"type": "correction",
"notice_doi": "10.1016/s0140-6736(04)15715-2",
"date": "2004-03-06"
},
{
"type": "retraction",
"notice_doi": "10.1016/s0140-6736(10)60175-4",
"date": "2010-02-06"
}
]
},
{
"n": 2,
"cited": "Kucsko G, Maurer PC, Yao NY, et al. Nanometre-scale thermometry in a living cell. Nature. 2013;500:54-58. doi:10.1038/nature12373",
"verdict": "verified",
"matched": {
"doi": "10.1038/nature12373",
"title": "Nanometre-scale thermometry in a living cell",
"authors": "Kucsko, Maurer, Yao et al.",
"year": 2013,
"venue": "Nature",
"url": "https://doi.org/10.1038/nature12373",
"source": "crossref"
}
},
{
"n": 3,
"cited": "Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need. In: Advances in Neural Information Processing Systems. 2017.",
"verdict": "verified",
"flags": [
"doi_added"
... (60 more lines)Tools
Tool | What it does |
| Checks up to 30 citations (a pasted reference list, one per line or numbered, or BibTeX) against Crossref, DataCite, PubMed and OpenAlex. Verdict each: verified, mismatch (wrong field, or DOI of another work), not_found (possibly fabricated) or unverifiable; flags retractions and corrections. bibtex=true adds corrected BibTeX. |
| Fast batch check of up to 200 DOIs for retractions, partial retractions, expressions of concern and corrections (Crossref, including Retraction Watch data). Status each: retracted, partially_retracted, expression_of_concern, corrected, none or not_in_crossref. |
| Returns the record for a DOI, arXiv id, PMID, link, title or full citation: authors, year, venue, pages, DOI, retraction and correction notices, a newer published version if one exists, and BibTeX. |
How it works
Identifiers first, in batches: DOIs through Crossref (40 per request), arXiv ids through DataCite, PMIDs through PubMed, and any DOI that neither Crossref nor DataCite knows through doi.org, which says whether any registration agency has it at all.
Citations without an identifier, or whose DOI points at a different work, are searched in Crossref, then by title (and first author) in DataCite, which holds arXiv, then in OpenAlex.
The best candidate is chosen by comparing title, first author and year, never by a source's own ranking alone: Crossref ranks a same-titled letter above the original paper for some queries, and both Crossref and OpenAlex rank reposts of famous papers above the original.
Retractions, corrections and expressions of concern come from Crossref, which includes the Retraction Watch database.
How it behaves
Read-only: no tool changes anything outside this process.
Network: HTTPS only, to the hosts listed in
package.jsonunderfactory.allowHosts, with a deadline, a size cap and bounded retries. Nothing else is contacted, and nothing is logged except unexpected failures (to stderr, without your inputs).Keeps to each source's published limits (Crossref: 5 lookups and 1 search per second, one at a time, or its polite-pool limits with
CROSSREF_MAILTO; NCBI: 3 per second), and caches answers for 30 minutes.Up to 30 references per
check_referencescall. A reference with a DOI costs a fraction of one without, so free-text lists take about a second per reference on Crossref's public pool.Results are compact JSON with a matching output schema.
Benchmark
Measured 2026-09-26 with gpt-5.4-mini, 10 fixed tasks graded by fixed checks (bench/tasks.json, raw results in bench/results/).
Server | Correct | Input tokens | Output tokens | Tool calls | Median time |
This server | 9/10 | 13618 | 498 | 11 | 4.2 s |
doi-mcp, the most starred citation verifier | 9/10 | 15314 | 567 | 11 | 3.8 s |
Performance
Measured 2026-09-27 from Dubai, home connection against the live upstream, Node 24.19.0 (bench/perf.json, scripts/perf.mjs in the factory).
Call | First call | Repeat | Result size |
check_references: 6 citations (retracted, invented, wrong year, borrowed DOI, arXiv-only) | 7075 ms | 4.3 ms | 2,894 chars |
check_references: 2 BibTeX entries with corrected BibTeX | 5143 ms | 0.8 ms | 1,059 chars |
lookup_work: arXiv id | 770 ms | 0.6 ms | 717 chars |
lookup_work: PMID of a retracted paper | 2114 ms | 0.4 ms | 1,281 chars |
lookup_work: DOI link | 745 ms | 0.4 ms | 1,356 chars |
check_retractions: 5 inputs | 839 ms | 0.3 ms | 987 chars |
lookup_work: a 2017 paper the indexes also file under a later repost's DOI | 5692 ms | 2 ms | 717 chars |
lookup_work: a famous paper's title plus search words | 3739 ms | 6.6 ms | 1,356 chars |
First call: a fresh server process, including the TLS connection and the upstream's own time. Repeat: the same call again, answered from the in-process cache, so it shows this server's own overhead.
Tool definitions the model reads on every turn (name, description, input schema): 1,523 characters, against 2,550 for doi-mcp, the most starred citation verifier. The full tool list, with the output schemas and annotations clients use to validate results, is 2,979 characters (2,913 for the alternative).
Data sources
Crossref REST API: bibliographic metadata and update notices, including the Retraction Watch database that Crossref makes openly available.
DataCite REST API: arXiv and other DataCite DOIs.
PubMed through NCBI E-utilities.
OpenAlex: search fallback (CC0 data).
doi.org handle API: whether a DOI is registered at all.
More MCP servers by Arhan Canli
Actions Check: Checks GitHub Actions workflows: outdated actions, old Node runtimes, retired runners, injection.
Config Check: Validates config files against their official schemas: tsconfig, compose, workflows, 1,400+ more.
Contact Check: Validates and formats phone numbers, email addresses and postal addresses for any country.
Cron Check: Explains cron expressions, lists next run times in any time zone, converts between cron dialects.
Dockerfile Check: Checks Dockerfiles: build-breaking mistakes, base image tags that exist, digests, platforms, EOL.
Domain Health: Email and domain checks: SPF lookup limits, DKIM keys, DMARC, DNS records, registration expiry.
Drug Label: FDA drug label answers with section citations, RxNorm name resolution, recalls and shortages.
End of Life: Is this version still supported? EOL dates, latest patch and upgrade target for 470+ products.
The whole collection, 12 more
License
MIT, Copyright (c) 2026 Arhan Canli.
Available Tools
3 toolscheck_referencesCheck a reference listARead-onlyIdempotent
Checks up to 30 citations (a pasted reference list, one per line or numbered, or BibTeX) against Crossref, DataCite, PubMed and OpenAlex. Verdict each: verified, mismatch (wrong field, or DOI of another work), not_found (possibly fabricated) or unverifiable; flags retractions and corrections. bibtex=true adds corrected BibTeX.
Inputs: text (required), bibtex. Returns: counts, results, truncated
check_retractionsCheck DOIs for retractionsARead-onlyIdempotent
Fast batch check of up to 200 DOIs for retractions, partial retractions, expressions of concern and corrections (Crossref, including Retraction Watch data). Status each: retracted, partially_retracted, expression_of_concern, corrected, none or not_in_crossref.
Inputs: dois (required). Returns: counts, results
lookup_workLook up one workARead-onlyIdempotent
Returns the record for a DOI, arXiv id, PMID, link, title or full citation: authors, year, venue, pages, DOI, retraction and correction notices, a newer published version if one exists, and BibTeX.
Inputs: id (required). Returns: doi, flags, title, bibtex
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 3 tools
The tools have distinct primary purposes: batch-checking references, checking retractions, and looking up individual works. However, there is minor overlap because check_references also flags retractions and lookup_work also returns retraction notices, so an agent might hesitate between tools for retraction-related queries.
All tool names follow the same lower_snake_case verb_noun pattern: check_references, check_retractions, lookup_work. The verbs differ ('check' vs 'lookup') but that reflects semantic intent, and there is no mixing of conventions.
With just 3 tools, the server is tightly scoped for citation verification. Each tool covers a distinct, necessary function and there is no bloat, making the count perfectly appropriate for the narrow domain.
The tool set covers the full workflow: verifying reference lists, batch-checking retraction status, and retrieving detailed publication records. No obvious gaps exist for the stated citation-checking purpose.
Maintenance
Related MCP Connectors
Catch AI-fabricated citations (real DOI + fake title). Retraction, open-access, 10,000+ CSL styles.
Checks AI-written references against Crossref, PubMed and OpenAlex. Formats citations, PRISMA.
Check AI references against Crossref and DataCite. DOI/arXiv metadata checks, plus tool discovery.
Check if references exist or were retracted, look up journal AI policies, and preview manuscripts.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants and researchers to verify bibliographic existence and metadata consistency across multiple sources, perform identifier-first lookups, and produce explainable, non-destructive BibTeX checks.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants and researchers to verify BibTeX entries against Crossref, OpenAlex, PubMed, arXiv and other sources using identifier-first, explainable multi-signal matching. It reports metadata consistency, conflicts, and ambiguous or missing records, and can apply high-confidence field updates non-destructively with backups.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to check BibTeX records for bibliographic existence and metadata consistency by querying identifier-first providers like Crossref, OpenAlex, PubMed, DBLP, and arXiv and scoring title, author, year, venue, and page evidence. It returns explainable outcomes such as matches, ambiguous or not-found entries, and identifier conflicts, while keeping edits non-destructive unless explicitly applied.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to verify bibliographic records and BibTeX metadata consistency by resolving DOI, PMID, PMCID, and arXiv identifiers and scoring candidates across multiple scholarly sources with explainable, multi-signal matching. It reports structured provider outcomes and metadata conflicts without destructively editing the source bibliography.-