Skip to main content
Glama
mcp-crossref

mcp-crossref

by algonacci

mcp-crossref

MCP server to give client the ability to search scholarly metadata, citations and references through Crossref

Features

  • Search ~170 million works from every Crossref publisher with field queries and filters

  • Resolve any DOI into a normalized record with a metadata-completeness check

  • Format citations in APA, IEEE, Vancouver, Chicago, MLA, Harvard, any CSL style, BibTeX, RIS or CSL-JSON

  • Extract and verify every DOI in pasted text (reference lists, PDF text)

  • Reference lists, similar works, and citation snowballing (references + citing works via OpenAlex)

  • Topic trends with exact-phrase matching, author, journal and funder profiles

Tools

Tool

Use it for

search_crossref

Literature search across publishers; find a paper from a citation string (bibliographic)

get_crossref_work

Full metadata for one DOI, plus which fields the publisher did not deposit

cite_dois

Bibliography in any style, or BibTeX/RIS export (also works for arXiv/DataCite DOIs)

resolve_dois

Turn messy text containing DOIs into verified metadata

get_crossref_references

Backward snowballing: what a paper cites

find_related_works

"More like this" by title and subjects

analyze_crossref_topic

Publications per year, top venues/publishers/funders for an exact phrase

get_crossref_author

Output, co-authors, venues, ORCID iDs for a researcher

get_crossref_journal

Journal profile by ISSN, or find a journal's ISSN by name

get_crossref_funder

What a funder (e.g. LPDP) has funded

snowball_doi

References + works citing the paper + related works + open-access status (OpenAlex)

Each tool's docstring explains when to use it, its arguments with examples, and Crossref's pitfalls, so the MCP client can pick the right tool on its own.

Things to know

  • Crossref has no exact-phrase search: a plain query matches any of its words. Use the top results, add filters, or analyze_crossref_topic for phrase-accurate counts.

  • Crossref exposes citation counts but not the list of citing works; snowball_doi gets that from OpenAlex.

  • Many publishers do not deposit abstracts to Crossref; snowball_doi returns OpenAlex's abstract when available.

  • arXiv DOIs (10.48550/arXiv.*) are registered with DataCite, so get_crossref_work cannot find them, but cite_dois can format them.

  • Counts and coverage describe metadata only, never the scientific quality of a paper, journal or author.

Configuration

Copy .env.example to .env (both optional, no account needed for Crossref):

  • CROSSREF_MAILTO: your contact email. Joins Crossref's "polite" pool with a higher rate limit.

  • OPENALEX_API_KEY: free key from openalex.org settings for 10x the keyless daily budget used by snowball_doi. Without it, OpenAlex runs keyless; a rejected key falls back to keyless automatically.

Usage

For this MCP server to work, add the following configuration to your MCP config file:

{
  "mcpServers": {
    "crossref": {
      "command": "uv",
      "args": [
        "--directory",
        "%USERPROFILE%/Documents/GitHub/mcp-crossref",
        "run",
        "python",
        "main.py"
      ]
    }
  }
}

Example prompts:

  • "Find journal articles on retrieval augmented generation since 2024 and cite the top 5 in APA."

  • "Here is my reference list, check every DOI and give me BibTeX."

  • "Snowball from 10.1016/j.eswa.2016.04.008: which newer papers cite it?"

  • "Is research on federated learning in healthcare growing, and where is it published?"

Available Tools

11 tools
analyze_crossref_topicA
Describe a research topic: publications per year, top venues, publishers and funders, and the
most cited works, counting only titles that contain the exact phrase.

When to use:
    - Trend questions: "is X growing?", "when did X take off?", thesis/proposal background.
    - "Where is X published?", "who funds X?" (venue and funder landscape).

How it works:
    Crossref has no phrase search, so a plain query for "retrieval augmented generation" matches
    about a million works. This tool scans the top `scan` relevance-ranked hits and keeps only
    works whose title contains the exact phrase, then aggregates them. It is a sample of the most
    relevant works, not a complete count; older years may be under-represented.

Args:
    phrase: The topic phrase, e.g. "retrieval augmented generation" (hyphens/case ignored).
    scan: Relevance hits to scan, 100-2000 (default 500). Larger = slower but more complete.
    from_year: Optional earliest publication year.
    until_year: Optional latest publication year.
    work_type: Optional Crossref type, e.g. "journal-article".

Returns:
    {"phrase", "fuzzy_total" (all keyword matches, for context), "scanned", "matched",
     "per_year": {year: count}, "top_venues", "top_publishers", "top_funders": [[name, count]],
     "most_cited": [compact work]}

Counts describe metadata only; they do not rank venue or funder quality.

Inputs: phrase (required), scan, from_year, work_type, +1 more. Returns: object

cite_doisA
Format citations for one or more DOIs in any citation style or export format.

Uses DOI content negotiation, so it works for Crossref AND DataCite DOIs (arXiv, Zenodo, ...).

When to use:
    - Building a bibliography / reference list for a thesis or paper.
    - Exporting references to Zotero, Mendeley or EndNote (bibtex / ris).

Args:
    dois: List of DOIs (max 50), e.g. ["10.1038/nature14539", "10.1145/3065386"].
    style: Citation style or export format:
        - "apa" (default), "ieee", "vancouver", "chicago", "mla", "harvard", "nature"
        - any other CSL style id from https://github.com/citation-style-language/styles,
          e.g. "american-medical-association"
        - "bibtex", "ris" or "csl-json" for reference-manager exports

Returns:
    {"style": str, "citations": [{"doi": str, "citation": str}], "failed": [{"doi", "error"}]}

Example:
    cite_dois(["10.1038/nature14539"], style="ieee")
    -> "Y. LeCun, Y. Bengio, and G. Hinton, “Deep learning,” Nature, vol. 521, no. 7553, ..."

Inputs: dois (required), style. Returns: object

get_crossref_authorA
Build an author profile: publications, years active, frequent co-authors, venues, affiliations
and ORCID iDs seen in Crossref metadata.

When to use:
    - "Who is this researcher / what do they work on / who do they collaborate with?"
    - Finding collaborators or research groups around a person.

Args:
    name: Author name, e.g. "Geoffrey Hinton". Matching is fuzzy, so namesakes can be mixed in.
    orcid: ORCID iD (e.g. "0000-0002-1825-0097"). When given, only works carrying this iD are used,
        which removes namesakes. If the result lists several ORCID iDs, rerun with one of them.
    max_works: Works to scan, 20-500 (default 100).

Returns:
    {"name", "orcid_filter", "scanned", "matched", "total_citations", "years": {year: count},
     "orcids_seen", "affiliations", "coauthors", "venues": [[name, count]],
     "most_cited": [compact work]}

Counts describe Crossref metadata, not research impact; centrality is not quality.

Inputs: name (required), orcid, max_works. Returns: object

get_crossref_funderA
Look up a research funder and the works it funded (as declared by publishers in Crossref).

When to use:
    - "What has LPDP / NSF / Horizon Europe funded?", grant output tracking, funder landscape.

Args:
    name_or_id: Funder name ("LPDP", "National Science Foundation") or Crossref Funder ID
        ("501100014538").
    latest: Number of most recent funded works to include (0-20, default 5).

Returns:
    {"funder": {"id", "name", "location", "alt_names"}, "other_matches", "funded_works_total",
     "per_year": {year: count}, "top_venues": [[name, count]], "latest": [compact work]}

Inputs: name_or_id (required), latest. Returns: object

get_crossref_journalA
Look up a journal: publisher, ISSNs, subjects, DOI counts, metadata coverage and latest works.

When to use:
    - "Tell me about journal X", "what does X publish lately?", "does X deposit abstracts/ORCIDs?"
    - Finding a journal's ISSN from its name (then filter search_crossref by issn).

Args:
    issn_or_name: An ISSN like "0957-4174" for the full profile, or a name like
        "expert systems with applications" to list matching journals with their ISSNs.
    latest: Number of most recent works to include for an ISSN lookup (0-20, default 5).

Returns:
    For an ISSN: {"title", "publisher", "issn", "subjects", "total_dois", "coverage" (share of
    current works with abstracts, ORCIDs, references, licenses, ...), "dois_by_year", "latest"}.
    For a name: {"matches": [{"title", "publisher", "issn", "total_dois"}]}.

Coverage is metadata completeness, not a journal quality ranking.

Inputs: issn_or_name (required), latest. Returns: object

get_crossref_referencesA
List the references (bibliography) of a paper, i.e. the older works it cites.

When to use:
    - Backward snowballing in a literature review: find the foundational papers a key paper builds on.
    - Checking which sources a paper relies on.

Args:
    doi: DOI of the citing paper.
    resolve: Also fetch full metadata for the first N references that have a DOI (max 20),
        sorted by citation count, to spot the most influential ones. Default 0 (no extra calls).

Returns:
    {"doi", "title", "reference_count", "references": [{doi, title, author, year, journal,
    unstructured}], "resolved": [compact work]}

Notes:
    - Only references the publisher deposited are available; some publishers deposit none.
    - Crossref does not expose the reverse direction (papers that cite this one); use snowball_doi.

Inputs: doi (required), resolve. Returns: object

get_crossref_workA
Get the complete, normalized metadata record for one DOI.

When to use:
    - You have a DOI (from any search tool, a PDF, a reference list) and need authors with ORCID
      and affiliations, journal, volume/issue/pages, abstract, license, funders, citation counts.
    - Checking whether a DOI is real before citing it (a 404 means Crossref does not know it).

Args:
    doi: Any DOI spelling: "10.1145/3065386", "https://doi.org/10.1145/3065386",
        "doi:10.1145/3065386". Case does not matter.

Returns:
    The work record plus "metadata_quality": {"metadata_completeness": 0-1, "missing": [...]},
    which tells you which fields the publisher did not deposit (e.g. abstract). It describes the
    metadata only, never the scientific quality of the paper.

Tips:
    - abstract is often null because many publishers do not deposit abstracts to Crossref;
      snowball_doi returns OpenAlex's abstract when it has one.
    - arXiv DOIs (10.48550/arXiv.*) are registered with DataCite, not Crossref, so this returns
      "not found"; cite_dois still works for them.
    - Use get_crossref_references for the reference list.

Inputs: doi (required). Returns: object

resolve_doisA
Find every DOI mentioned in free text and resolve each one to clean metadata.

When to use:
    - The user pastes a messy reference list, a PDF's text, notes or a URL list and wants to know
      what the papers are, check that the DOIs exist, or turn them into a clean table.
    - Verifying DOIs produced by another tool or model before citing them.

Args:
    text: Any text containing DOIs in any form ("doi:10.x/y", "https://doi.org/10.x/y", bare).
    max_dois: Resolve at most this many unique DOIs (default 25, max 100).

Returns:
    {"found": int, "works": [compact work], "failed": [{"doi", "error"}]}. A DOI in "failed"
    with "Not found" is unknown to Crossref (typo, fabricated, or registered with DataCite).

Follow-up: pass the resolved DOIs to cite_dois to format a bibliography.

Inputs: text (required), max_dois. Returns: object

search_crossrefA
Search ~170 million scholarly works registered in Crossref (all publishers: Elsevier, IEEE,
Springer, ACM, MDPI, Indonesian journals, ...). Every result carries a DOI you can pass to the
other crossref tools.

When to use:
    - Broad literature discovery across publishers ("papers on X since 2022").
    - Finding a specific paper from a messy citation string (use `bibliographic`).
    - Listing an author's or a journal's works (use `author` / `orcid` / `issn`).

How matching works (important):
    Crossref has NO exact-phrase search. `query="retrieval augmented generation"` matches any work
    containing ANY of those words, so total_results is inflated and the tail is noise. Rely on the
    top relevance-sorted results, add filters, or use analyze_crossref_topic for phrase-accurate trends.

Args:
    query: Free-text keywords over all metadata, e.g. "graph neural network traffic forecasting".
    author: Author name, e.g. "Geoffrey Hinton". Fuzzy; combine with `orcid` for precision.
    title: Words that should appear in the title.
    bibliographic: A full or partial citation string, e.g.
        "LeCun Bengio Hinton 2015 Deep learning Nature". Best tool for "find this exact paper".
    journal: Journal / proceedings name, e.g. "Expert Systems with Applications".
    publisher: Publisher name, e.g. "IEEE".
    affiliation: Author affiliation text, e.g. "Universitas Indonesia" (only works where deposited).
    funder: Funder name, e.g. "LPDP" or "National Science Foundation".
    from_date: Earliest publication date, "YYYY", "YYYY-MM" or "YYYY-MM-DD".
    until_date: Latest publication date, same formats.
    work_type: Crossref type id, e.g. "journal-article", "proceedings-article", "book-chapter",
        "posted-content" (preprints), "dissertation", "dataset".
    issn: Restrict to one journal by ISSN, e.g. "0957-4174".
    orcid: Restrict to works carrying this ORCID iD, e.g. "0000-0002-1825-0097".
    has_abstract: Only works with a deposited abstract (many publishers do not deposit them).
    has_full_text: Only works with full-text links deposited (does NOT mean open access).
    sort: "relevance" (default), "published", "is-referenced-by-count" (most cited),
        "references-count", "updated", "created".
    order: "desc" (default) or "asc".
    rows: Results to return, 1-100 (default 10).
    offset: Skip this many results for paging (Crossref caps offset at 10,000).
    include_abstract: Add abstracts to results (longer output). Default False to save tokens;
        fetch a single paper's abstract with get_crossref_work instead.

Returns:
    {"total_results": int, "returned_results": int, "items": [work, ...]} where each work has
    doi, title, authors, year, journal, publisher, type, cited_by_count, reference_count, url, ...

Examples:
    search_crossref(query="large language model education", from_date="2023", work_type="journal-article")
    search_crossref(author="Yoshua Bengio", sort="is-referenced-by-count", rows=5)
    search_crossref(bibliographic="Vaswani 2017 Attention is all you need")
    search_crossref(query="deep learning", issn="2169-3536", sort="published")

Note: cited_by_count counts only citations registered in Crossref; it is not a quality measure.

Inputs: issn, rows, sort, orcid, +16 more. Returns: object

snowball_doiA
Citation snowballing around one paper: its references (backward), the works that cite it
(forward), and related works, plus open-access status and an abstract when available.

Forward citations are not available from Crossref, so this tool uses OpenAlex (free; set
OPENALEX_API_KEY for a 10x daily budget, otherwise it runs keyless).

When to use:
    - Systematic literature review snowballing from one or two seed papers.
    - "Who built on this paper?", "what newer work cites it?", "is there a free PDF?"

Args:
    doi: DOI of the seed paper.
    rows: Works per direction, sorted by citation count (1-50, default 10).

Returns:
    {"seed": work with open_access + abstract, "backward_total", "backward": [...],
     "forward_total", "forward": [...], "related": [...],
     "strong_candidates": works found by more than one direction}

Notes:
    - OpenAlex matching is automatic and occasionally wrong; sanity-check odd entries.
    - open_access.url is a legal free copy when OpenAlex knows one; DOI != free PDF.
    - Costs about 4 OpenAlex list calls; single lookups are free.

Inputs: doi (required), rows. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.5/5.0

    Scored across 11 tools

    Disambiguation4/5

    Tools are largely distinct by resource and action: search, get, cite, resolve, references, author/journal/funder lookup, snowballing, and related works. Some overlap exists between find_related_works and snowball_doi's related component, and between get_crossref_references and snowball_doi's backward citations, but descriptions clearly distinguish Crossref text similarity from OpenAlex citation graph.

    Naming Consistency4/5

    All names use snake_case and follow a mostly verb_noun pattern. However, the use of 'crossref' is inconsistent: get_crossref_* is prefixed, search_crossref is suffixed, and cite_dois/resolve_dois/snowball_doi/find_related_works omit it entirely. Still readable and predictable overall.

    Tool Count5/5

    11 tools is well-scoped for a Crossref metadata server. Each tool earns its place by covering a distinct part of literature discovery, metadata retrieval, citation formatting, or entity profiling.

    Completeness5/5

    The surface covers search, topic analysis, work metadata, citation formatting, DOI resolution, reference lists, citation snowballing, and author/journal/funder profiles. There are no obvious gaps for the stated domain of scholarly metadata discovery and analysis.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Searches and retrieves scholarly metadata from the CrossRef REST API, covering over 150 million records across all disciplines, without requiring an API key.
      26 PyPI
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables searching academic papers, journals, and citations via the Crossref API, and resolving DOIs to canonical metadata with authors, references, and citation graphs.
      332 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Papers by Ouroboros Apps (https://ouroborosapps.com). Research paper search with real citations from OpenAlex, Semantic Scholar, PubMed, Crossref, and arXiv: find papers, fetch abstracts, follow citations, and format references. Connect by pasting https://papers-mcp.vercel.app/mcp into Claude, Cursor, Grok, or ChatGPT developer mode (OAuth). Docs: https://ouroborosapps.com/docs/papers
      14 npm
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables keyless, read-only literature research by searching OpenAlex, Crossref, Europe PMC, PubMed and arXiv at once, merging and ranking results, following citations, retrieving open-access full text, looking up clinical trials, verifying citations, and exporting BibTeX, RIS or CSL-JSON without any accounts or API keys.
      10
      MIT