Skip to main content
Glama
arhancanli

citation-check

Citation Check

CI npm downloads OpenSSF Scorecard License: MIT

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

verified

The work exists and the citation's title, first author and year agree with the record

mismatch

The work was found, but the citation gets a field wrong, or its DOI belongs to a different paper

not_found

No source holds a matching work: possibly fabricated, or a book, thesis or very new work that is not indexed

unverifiable

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

Install in Cursor Install in VS Code Install in Goose

Needs Node.js 20 or newer. No account or key.

Claude Code

claude mcp add citation-check -- npx -y citation-check-mcp

Claude 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-mcp

Hosted (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

check_references

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.

check_retractions

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.

lookup_work

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.json under factory.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_references call. 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.

  • The whole collection

License

MIT, Copyright (c) 2026 Arhan Canli.

Available Tools

3 tools
check_referencesCheck a reference listA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesReference list or BibTeX
bibtexNoInclude corrected BibTeX per reference

Output Schema

ParametersJSON Schema
NameRequiredDescription
countsYes
resultsYes
truncatedNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 retractionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
doisYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
countsYes
resultsYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 workA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDOI, arXiv id, PMID, URL, title or citation

Output Schema

ParametersJSON Schema
NameRequiredDescription
doiNo
flagsNo
titleYes
bibtexYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 3 tool updatesv0.1.0
    • First observedcheck_references
    • First observedcheck_retractions
    • First observedlookup_work

TDQS

A4/5.0

Scored across 3 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers