crossref-mcp-server

v0.1.14 pre-1.0

Resolve DOIs, search ~155M scholarly works, and fetch references via the Crossref REST API. STDIO or Streamable HTTP.

crossref.caseyjhand.com/mcp
claude mcp add --transport http crossref-mcp-server https://crossref.caseyjhand.com/mcp
codex mcp add crossref-mcp-server --url https://crossref.caseyjhand.com/mcp
{
  "mcpServers": {
    "crossref-mcp-server": {
      "url": "https://crossref.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http crossref-mcp-server https://crossref.caseyjhand.com/mcp
{
  "mcpServers": {
    "crossref-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://crossref.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "crossref-mcp-server": {
      "type": "http",
      "url": "https://crossref.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://crossref.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

5

crossref_get_work

Resolves a DOI to its full Crossref metadata record: title, authors, affiliations, abstract (when deposited), journal or container, publication date, type, license, full-text links, funder acknowledgements, and outgoing reference list. The is_referenced_by_count field reports the total incoming citation count from Crossref; the citing works themselves are not available through Crossref — use OpenAlex for citation graphs.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "crossref_get_work",
    "arguments": {
      "doi": "<doi>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "doi": {
      "type": "string",
      "pattern": "^10\\.\\d{4,9}\\/\\S+$",
      "description": "DOI in the format \"10.NNNN/suffix\", e.g. \"10.1038/nature12373\". Must start with \"10.\" followed by 4–9 digits and a slash."
    }
  },
  "required": [
    "doi"
  ],
  "additionalProperties": false
}
view source ↗

crossref_get_references

Returns the outgoing reference list for a DOI — the works cited by this paper. Each reference includes the raw citation string and, where Crossref has resolved it, a DOI you can look up with crossref_get_work. Reference list coverage varies by publisher; many older works and non-participating publishers have no indexed references. Incoming citations — the works that cite this paper — are not available through Crossref; use OpenAlex for that.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "crossref_get_references",
    "arguments": {
      "doi": "<doi>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "doi": {
      "type": "string",
      "pattern": "^10\\.\\d{4,9}\\/\\S+$",
      "description": "DOI in the format \"10.NNNN/suffix\", e.g. \"10.1038/nature12373\". Must start with \"10.\" followed by 4–9 digits and a slash."
    }
  },
  "required": [
    "doi"
  ],
  "additionalProperties": false
}
view source ↗

crossref_search_works

open-world

Searches the Crossref works index (~155M records) by free text and/or structured filters. Use the filter parameter for structured filtering (object with hyphen-separated Crossref keys). Sort options: relevance, score, is-referenced-by-count, published, deposited, indexed. Offset-based paging is capped at ~10K results; use cursor="*" to start cursor-based deep paging, then pass the nextCursor value from each response to continue. Cursor and offset cannot be combined.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "crossref_search_works",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "Free-text search query, e.g. \"CRISPR gene editing\" or \"climate change adaptation\"",
      "type": "string"
    },
    "filter": {
      "description": "Structured filter object using Crossref hyphen-separated keys. All values must be strings. Boolean flag keys (has-abstract, has-references, has-full-text) require string values \"true\" or \"false\". Example: {\"type\":\"journal-article\",\"has-abstract\":\"true\",\"from-pub-date\":\"2023-01-01\",\"directory\":\"DOAJ\"}",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "fields": {
      "description": "Fields to return (reduces payload). Useful set: DOI, title, author, published, type, is-referenced-by-count, abstract, container-title, publisher, score.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "rows": {
      "default": 20,
      "description": "Number of results to return per page (1–100, default 20)",
      "type": "number",
      "minimum": 1,
      "maximum": 100
    },
    "offset": {
      "description": "Zero-based result offset for offset-based paging. Cannot be used with cursor. Capped at ~10K; use cursor for deeper paging.",
      "type": "number",
      "minimum": 0
    },
    "cursor": {
      "description": "Cursor token for deep paging. Pass \"*\" to start cursor-based paging (required past ~10K results), then pass the nextCursor value from each response. Cannot be combined with offset.",
      "type": "string"
    },
    "sort": {
      "description": "Sort field",
      "type": "string",
      "enum": [
        "relevance",
        "score",
        "is-referenced-by-count",
        "published",
        "published-print",
        "published-online",
        "deposited",
        "indexed",
        "created",
        "updated",
        "references-count"
      ]
    },
    "order": {
      "description": "Sort direction (asc or desc)",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    }
  },
  "required": [
    "rows"
  ],
  "additionalProperties": false
}
view source ↗

crossref_search_journals

open-world

Finds Crossref journal records by ISSN or title query. Provide issn for an exact single-journal lookup, or query for title-based search returning up to rows results. Set include_works to true to fetch the journal's most recent registered works in a second call (sequential — requires a resolved ISSN from step 1). Returns journal metadata: title, publisher, ISSN-L, subject areas, and total DOI count.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "crossref_search_journals",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "Journal title search query, e.g. \"Nature\" or \"Journal of Machine Learning Research\"",
      "type": "string"
    },
    "issn": {
      "description": "ISSN for exact single-journal lookup (print or electronic, with or without hyphen). Example: \"1234-5678\".",
      "type": "string",
      "pattern": "^\\d{4}-?\\d{3}[\\dX]$"
    },
    "include_works": {
      "default": false,
      "description": "When true, fetch the journal's most recent registered works (adds a second upstream call)",
      "type": "boolean"
    },
    "rows": {
      "default": 10,
      "description": "Maximum number of journals to return for title queries, or works when include_works is true (1–100, default 10)",
      "type": "number",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "include_works",
    "rows"
  ],
  "additionalProperties": false
}
view source ↗

crossref_search_funders

open-world

Finds funders registered in the Crossref Funder Registry by name or funder DOI. Provide funder_doi for an exact single-funder lookup (accepts the full DOI like "10.13039/100000001" or just the registry ID), or query for name-based search. Set include_works to true to fetch a paginated list of works funded by the first matched funder (adds a second upstream call). Returns funder name, DOI, country, and alternate names.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "crossref_search_funders",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "Funder name search query, e.g. \"National Science Foundation\" or \"Wellcome Trust\"",
      "type": "string"
    },
    "funder_doi": {
      "description": "Funder DOI for exact lookup, e.g. \"10.13039/100000001\" (NSF). Supersedes query when provided.",
      "type": "string",
      "pattern": "^(?:https?:\\/\\/(?:dx\\.)?doi\\.org\\/|doi:)?10\\.13039\\/\\d+$"
    },
    "include_works": {
      "default": false,
      "description": "When true, fetch funded works for the first matched funder (adds a second upstream call)",
      "type": "boolean"
    },
    "rows": {
      "default": 10,
      "description": "Maximum funders to return for name queries, or works when include_works is true (1–100, default 10)",
      "type": "number",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "include_works",
    "rows"
  ],
  "additionalProperties": false
}
view source ↗