@cyanheads/datacite-mcp-server
Resolves DOIs and identifies the registration agency via doi.org for DOIs not held by DataCite, enabling the server to return guidance when a DOI isn't found.
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., "@@cyanheads/datacite-mcp-serversearch for datasets about climate change"
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.
Overview
DOI metadata from DataCite for datasets, software, samples, workflows, and other research outputs that repositories deposit worldwide. Search it, open a record in full, trace a DOI's relations (versions, parts, supplements, citations), find the repositories that publish in a field, and format citations. Runs without an API key, as a stdio process or a local Streamable HTTP server.
Tools
Tool | Description |
| Search works by plain text or query syntax plus structured filters, in ranked pages or a full cursor walk, with optional facet counts |
| Fetch the full deposited metadata for one DOI, or learn which registration agency holds a DOI DataCite doesn't |
| Map the relation graph around any DOI — versions, parts, supplements, derivations, citations — with each edge's source |
| Find repository accounts by text, field of science, type, certificate, software, or provider, and get the |
| Render a DOI as a formatted citation in a CSL style and locale, or as BibTeX, RIS, CSL JSON, and other machine formats |
| Look up the vocabularies, identifier forms, and coverage rules the other tools accept, offline |
Related MCP server: musicbrainz-mcp-server
Capability reference
datacite_search_works tool
text(plain words, every reserved character escaped) orquery(OpenSearch query syntax), ANDed with filters:resource_types,creator(ORCID iD or name),affiliation(ROR ID or name),affiliation_country,funder(ROR ID, Crossref Funder ID, or name;include_child_funderswith a ROR funder),subject,fields_of_science,repository_ids,provider_ids,licenses,language,place,published_from/published_to, andmin_citations; list filters take up to 10 values, any of which matchlimit1–100 (default 20); rankedpages reach the first 10,000 matches undersort(relevance,newest,oldest,recently_updated,most_cited,most_viewed,most_downloaded; defaultrelevancewithtextorquery, elsenewest), whilecursor: "*"walks the whole result set in registration order throughnextCursorand takes neitherpagenorsortinclude_facetsadds top counts for resource types, years, repositories, providers, affiliations, fields of science, and licenses (2–8 s slower); every response reportstotalCount,effectiveQuery,sortApplied, andappliedFilters
datacite_get_work tool
One
doi, in any case: bare, with adoi:orinfo:doi/prefix, as a doi.org URL, or%2F-encodedTitles, creators and contributors with ORCID iDs and ROR affiliations, dates, subjects, descriptions, funding, geolocations, rights, related identifiers and items, repository and provider, and
counts(citations, references, versions, parts, views, downloads); long lists are capped and their full sizes reported intruncatedListsandrelatedIdentifierCountsA DOI DataCite holds no public record for returns
found: falsewithmissReason(other_agency,does_not_exist,not_public,unclassified), theregistrationAgencywhen known, andguidance
datacite_trace_relations tool
Any agency's
doi: a DataCite dataset or software DOI, or a journal article's DOI to find the DataCite data and software it cites or that cite, supplement, or derive from itdepth1 (default) or 2 — the second hop expands at most 10 DataCite neighbours and runs only when the first hop leavesmax_nodesroom;max_nodes1–100 (default 50, root included) fills with own-metadata targets, then records pointing at the root, then Event Data endpoints, then the second hop;relation_typeskeeps only the listed relation types, read from the traced DOI's side (omitted: all);include_event_data(defaulttrue) adds Event Data citation linksEdges keep
relationTypeexactly as asserted and list theirsources(metadata,reverse_metadata,event_data);coveragestates how much of each source was read (up to 100 reverse records per hop, only the first 10 when those are large, and up to 100 events per call), androotCountscarries DataCite's own counts for comparison. An absent edge is not evidence that no relationship exists
datacite_search_repositories tool
querytext over names and descriptions, plusfield_of_science,repository_types,certificates,software,client_type, andprovider_id; orrepository_idsalone (up to 25) to look up known accountslimit1–100 (default 20) withpage; name-ordered rows carry therepositoryIdthatdatacite_search_workstakes inrepository_ids, plusproviderId, types, certificates, software, subjects, homepage, and re3data link
datacite_get_citation tool
format:text(default),csl_json,bibtex,ris,datacite_json,datacite_xml,schema_org,codemeta, orjatsFor
textonly:styletakes a CSL style id (defaultapa; verified ids underdatacite_list_referencetopiccitation_styles), and one DataCite would silently render as APA fails asunsupported_style;localetakes one of the 61 CSL locales DataCite renders (en-GB,de-DE,fr-FR, …) or a bare language code that expands to its primary dialect (de→de-DE), defaulten-US(list: topiccitation_locales)textreturns the citation as plain text incitationand the upstream markup incitationHtml; machine formats return the payload verbatim up to 100,000 characters, with itsmediaType; a longer payload is cut to its first 100,000 and the cut is disclosed (truncated: true). A DOI DataCite doesn't hold returnsfound: falseas indatacite_get_work; a format DataCite can't render for that DOI fails asformat_unavailable
datacite_list_reference tool
topic:resource_types,relation_types,identifier_types,date_types,contributor_types,fields_of_science,licenses,repository_types,certificates,software_platforms,client_types,sort_orders,query_syntax,citation_formats,citation_styles,citation_locales,identifier_formats, orcoverageReturns
entries(value,label,group,inverse) and usagenotes; makes no upstream request
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
DataCite-specific:
Keyless and read-only: the DataCite REST API (
/dois,/repositories, Event Data at/events, and DOI content negotiation for citations), plus the doi.org registration-agency lookup for DOIs DataCite doesn't holdShared request budget: one paced request queue, an in-process response cache, and a 45 s deadline per tool call; a spent budget fails as
rate_limitedwith the wait in seconds.DATACITE_CONTACT_EMAILmoves requests to DataCite's identified tier, 1,000 requests per 5 minutes per IP instead of 500Forgiving identifiers: DOIs in any case, bare or prefixed or as doi.org URLs; ORCID iDs with their checksum verified; ROR IDs and Crossref Funder IDs bare or as URLs; vocabulary values in any case, with hyphens, underscores, or spaces
DataCite DOI metadata is waived under CC0 1.0; the waiver covers the deposited metadata only, not the datasets, software, or papers it describes.
datacite_get_workreportsmetadataLicenseseparately from the work's ownrights
Agent-friendly output:
Provenance on every search:
effectiveQuery,appliedFiltersas sent upstream, the sort or order applied, andtotalCount; trace edges name theirsources, andcoveragesays how much of each source was readTyped misses instead of errors: a DOI DataCite doesn't hold comes back
found: falsewith amissReason, the agency that holds it when known, and the next stepDisclosed limits: capped lists report their full counts, and notices explain zero hits, the 10,000-match paging ceiling, an unexpanded second hop, and citations the returned edges don't account for
In the text output, depositor-supplied text (titles, descriptions, names) is blockquoted or flattened and machine payloads are fenced, so deposited content can't pose as structure;
structuredContentkeeps it verbatim
Getting started
Add the following to your MCP client configuration file. No API key is needed; the contact email is optional.
{
"mcpServers": {
"datacite-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/datacite-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"DATACITE_CONTACT_EMAIL": "you@example.org"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"datacite-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/datacite-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"DATACITE_CONTACT_EMAIL": "you@example.org"
}
}
}
}Or with Docker:
{
"mcpServers": {
"datacite-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/datacite-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API key or account. Optional: a contact email in
DATACITE_CONTACT_EMAILdoubles DataCite's per-IP request allowance.
Installation
Clone the repository:
git clone https://github.com/cyanheads/datacite-mcp-server.gitNavigate into the directory:
cd datacite-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set DATACITE_CONTACT_EMAIL if you want the identified tierConfiguration
Variable | Description | Default |
| Contact email sent in the | none |
| Request budget per 5-minute window, an integer from 50 to 1000. Divide it across replicas that share one egress IP. |
|
| Transport: |
|
| HTTP server port. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
Directory | Purpose |
|
|
| Tool definitions ( |
| DataCite REST client ( |
| doi.org registration-agency lookup for DOIs DataCite holds no public record for. |
| Shared upstream pipeline — response cache, request pacer, retry, per-call deadline, rate-limit handling. |
| Static vocabularies behind |
| Server-specific environment variable parsing and validation with Zod. |
| Vitest tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging,ctx.statefor storageRegister new tools in the
createApp()arrays insrc/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query SEC EDGAR filings, XBRL financials, and company data through MCP. STDIO & Streamable HTTP.
Crossref MCP — wraps the Crossref REST API (academic papers, free, no auth)
Search and retrieve bioRxiv and medRxiv preprints — by DOI, date interval, or keyword — via MCP.
OpenCitations MCP — citation index (COCI + general Index API).
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAccess the OpenAlex academic research catalog - 270M+ publications through MCP. Supports STDIO and Streamable HTTP.683 npm14Apache 2.0
- AlicenseNot gradedqualityAmaintenanceSearch artists, releases, recordings, works, and labels; traverse relationships; resolve ISRC/ISWC/barcode; fetch cover art via MCP. STDIO or Streamable HTTP.243 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceResolve DOIs, search ~155M scholarly works, fetch references, and look up publishers via the Crossref REST API. Supports STDIO and Streamable HTTP transports.482 npm3Apache 2.0
- AlicenseNot gradedqualityAmaintenanceAn MCP server that validates DOIs, formats citations, manages bibliography collections, and catches fabricated references, returning citation metadata only. It works with MCP clients over stdio and supports both basic and API-key-based usage.2MIT