citation-check
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-checkCheck 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 and
published_version_exists, with the notice DOIs and dates.
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: sourceright
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-26):
{
"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 | 16205 | 679 | 16 | 5.7 s |
doi-mcp, the most starred citation verifier | 9/10 | 17165 | 630 | 12 | 3.9 s |
Performance
Measured 2026-09-26 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) | 9594 ms | 3.1 ms | 2,894 chars |
check_references: 2 BibTeX entries with corrected BibTeX | 7491 ms | 1.8 ms | 1,059 chars |
lookup_work: arXiv id | 795 ms | 0.3 ms | 717 chars |
lookup_work: PMID of a retracted paper | 3394 ms | 0.4 ms | 1,281 chars |
lookup_work: DOI link | 763 ms | 0.3 ms | 1,356 chars |
check_retractions: 5 inputs | 1485 ms | 0.6 ms | 987 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
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.
Internet Standards: RFC sections, status, obsoleted-by chains, errata and IANA registries for coding agents.
Package Truth: Checks packages exist before install: version, deprecation, vulnerabilities, licence. 7 ecosystems.
Recall Check: One recall check across CPSC, FDA and NHTSA: match by name, model number, UPC or VIN.
Satellite Imagery: Find the clearest Sentinel-2, Landsat, Sentinel-1 or NAIP scene for any place, with band links.
Vuln Priority: Which vulnerabilities to fix first: CISA KEV, EPSS, CVSS and CISA's SSVC decisions in one ranking.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Reference list or BibTeX | |
| bibtex | No | Include corrected BibTeX per reference |
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | |
| results | Yes | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds meaningful behavioral context: it checks against four databases, issues verdicts (verified, mismatch, not_found, unverifiable), flags retractions and corrections, and can output corrected BibTeX. This goes beyond the annotations and explains the tool's behavior in detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('Checks up to 30 citations') and then packs in the key details (sources, verdicts, flags, and the optional BibTeX output). Every phrase earns its place with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers input formats, limits, sources, verdict types, and the optional corrected BibTeX. Since an output schema exists, return values are presumably documented elsewhere. The only minor gap is that it doesn't explicitly mention what happens if the input exceeds 30 citations, but 'up to 30' implies a limit. Overall, it is well-rounded and sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes both parameters, but the description adds value by specifying that 'text' can be a pasted reference list, one per line, numbered, or BibTeX. It also clarifies that 'bibtex=true' adds corrected BibTeX per reference, which is consistent with the schema. This enriches the parameter semantics beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Checks') and a specific resource ('up to 30 citations'), and details the sources and verdict types. It distinguishes itself from siblings by the scope (list vs. single work, and covering multiple sources vs. retractions) even though it doesn't name them explicitly. A minor deduction for not directly naming the alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (verifying a reference list) and provides a clear limit (up to 30) and input formats, but it does not explicitly state when to choose this over check_retractions or lookup_work, nor does it mention exclusions or prerequisites. The context is clear but no explicit guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dois | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about being fast and using specific data sources, and mentions 'not_in_crossref' as a possible status, which hints at behavior for unknown DOIs. This adds some value but does not deeply describe side effects or limitations beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The first sentence states the purpose, limits, and data sources; the second lists possible statuses. Every word earns its place, and critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (one parameter, batch operation), the existence of an output schema (which presumably details return structure), and annotations covering safety, the description is complete. It provides all necessary context: what is checked, limits, data sources, and possible statuses. No critical information for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clearly explains the single parameter (dois) is an array of DOIs to be batch-checked, up to 200. This adds meaning beyond the schema's structural constraints, even though it doesn't detail DOI format beyond length.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('check') and resource ('DOIs'), and clearly enumerates the statuses returned. It distinguishes itself from siblings by focusing on retractions, partial retractions, expressions of concern, and corrections, while check_references and lookup_work serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit context: batch operation, up to 200 DOIs, and data sources (Crossref and Retraction Watch). However, it does not explicitly mention when to use this tool over check_references or lookup_work, nor does it state when not to use it. The guidance is clear enough for a straightforward batch check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | DOI, arXiv id, PMID, URL, title or citation |
Output Schema
| Name | Required | Description |
|---|---|---|
| doi | No | |
| flags | No | |
| title | Yes | |
| bibtex | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful context by listing specific record components such as retraction and correction notices and a newer published version, which is valuable beyond the annotation metadata. No contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core action and then enumerates inputs and outputs economically. The list of returned fields makes the sentence longer but each item adds useful detail. No redundant filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with rich annotations and an output schema, the description provides enough operational context to invoke the tool correctly. It covers accepted input formats and the nature of the returned record advances. It does not discuss error cases or ambiguity handling, but these are less critical given the simple parameter surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'id' has 100% schema description coverage, listing DOI, arXiv id, PMID, URL, title, or citation. The tool description essentially repeats the same accepted input forms, adding little meaning beyond the schema. With full schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns the record') and a concrete resource ('one work'), and enumerates both accepted inputs and returned fields. It clearly identifies the tool's scope as a single-record lookup, setting it apart from the sibling check tools that validate references or retractions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a record for a DOI, arXiv id, PMID, or citation is needed, but it provides no explicit guidance on when to use this tool instead of check_references or check_retractions. It does not state any exclusions, prerequisites, or alternative routing conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
check_references - First observed
check_retractions - First observed
lookup_work
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.
Search papers, format citations in 60 styles, and verify bibliographies against scholarly sources.
Verify legal citations, case treatment, quotes and whole briefs against 10.7M U.S. opinions
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Related MCP Servers
- AlicenseBqualityDmaintenanceAutomatically enriches BibTeX citations with missing metadata (DOI, venue, etc.) from arXiv, DBLP, and CrossRef via an MCP server for AI assistants.2MIT
- AlicenseNot gradedqualityCmaintenancereference and citation validation, verification, enrichment, replacement and improvement1MIT
- AlicenseNot gradedqualityCmaintenanceVerifies citations in reference lists by checking DOIs against public registries to catch AI-hallucinated or mismatched citations.MIT

CiteStamp MCP serverofficial
AlicenseNot gradedqualityBmaintenanceGround citations before your agent emits them by checking references against public scholarly registries and flagging hallucinated or retracted ones.MIT