The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Datacite MCP Server listing page.
Search DataCite datasets and software, fetch DOI metadata, trace relations, format citations via MCP. STDIO or Streamable HTTP.
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.
| Tool | Description |
|---|---|
datacite_search_works | Search works by plain text or query syntax plus structured filters, in ranked pages or a full cursor walk, with optional facet counts |
datacite_get_work | Fetch the full deposited metadata for one DOI, or learn which registration agency holds a DOI DataCite doesn't |
datacite_trace_relations | Map the relation graph around any DOI — versions, parts, supplements, derivations, citations — with each edge's source |
datacite_search_repositories | Find repository accounts by text, field of science, type, certificate, software, or provider, and get the repositoryId work search filters on |
datacite_get_citation | Render a DOI as a formatted citation in a CSL style and locale, or as BibTeX, RIS, CSL JSON, and other machine formats |
datacite_list_reference | Look up the vocabularies, identifier forms, and coverage rules the other tools accept, offline |
datacite_search_works tooltext (plain words, every reserved character escaped) or query (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_funders with a ROR funder), subject, fields_of_science, repository_ids, provider_ids, licenses, language, place, published_from / published_to, and min_citations; list filters take up to 10 values, any of which matchlimit 1–100 (default 20); ranked pages reach the first 10,000 matches under sort (relevance, newest, oldest, recently_updated, most_cited, most_viewed, most_downloaded; default relevance with text or query, else newest), while cursor: "*" walks the whole result set in registration order through nextCursor and takes neither page nor sortinclude_facets adds top counts for resource types, years, repositories, providers, affiliations, fields of science, and licenses (2–8 s slower); every response reports totalCount, effectiveQuery, sortApplied, and appliedFiltersdatacite_get_work tooldoi, in any case: bare, with a doi: or info:doi/ prefix, as a doi.org URL, or %2F-encodedcounts (citations, references, versions, parts, views, downloads); long lists are capped and their full sizes reported in truncatedLists and relatedIdentifierCountsfound: false with missReason (other_agency, does_not_exist, not_public, unclassified), the registrationAgency when known, and guidancedatacite_trace_relations tooldoi: 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 itdepth 1 (default) or 2 — the second hop expands at most 10 DataCite neighbours and runs only when the first hop leaves max_nodes room; max_nodes 1–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_types keeps only the listed relation types, read from the traced DOI's side (omitted: all); include_event_data (default true) adds Event Data citation linksrelationType exactly as asserted and list their sources (metadata, reverse_metadata, event_data); coverage states 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), and rootCounts carries DataCite's own counts for comparison. An absent edge is not evidence that no relationship existsdatacite_search_repositories toolquery text over names and descriptions, plus field_of_science, repository_types, certificates, software, client_type, and provider_id; or repository_ids alone (up to 25) to look up known accountslimit 1–100 (default 20) with page; name-ordered rows carry the repositoryId that datacite_search_works takes in repository_ids, plus providerId, types, certificates, software, subjects, homepage, and re3data linkdatacite_get_citation toolformat: text (default), csl_json, bibtex, ris, datacite_json, datacite_xml, schema_org, codemeta, or jatstext only: style takes a CSL style id (default apa; verified ids under datacite_list_reference topic citation_styles), and one DataCite would silently render as APA fails as unsupported_style; locale takes 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), default en-US (list: topic citation_locales)text returns the citation as plain text in citation and the upstream markup in citationHtml; machine formats return the payload verbatim up to 100,000 characters, with its mediaType; a longer payload is cut to its first 100,000 and the cut is disclosed (truncated: true). A DOI DataCite doesn't hold returns found: false as in datacite_get_work; a format DataCite can't render for that DOI fails as format_unavailabledatacite_list_reference tooltopic: 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, or coverageentries (value, label, group, inverse) and usage notes; makes no upstream requestBuilt 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:
/dois, /repositories, Event Data at /events, and DOI content negotiation for citations), plus the doi.org registration-agency lookup for DOIs DataCite doesn't holdrate_limited with the wait in seconds. DATACITE_CONTACT_EMAIL moves requests to DataCite's identified tier, 1,000 requests per 5 minutes per IP instead of 500datacite_get_work reports metadataLicense separately from the work's own rightsAgent-friendly output:
effectiveQuery, appliedFilters as sent upstream, the sort or order applied, and totalCount; trace edges name their sources, and coverage says how much of each source was readfound: false with a missReason, the agency that holds it when known, and the next stepstructuredContent keeps it verbatimAdd the following to your MCP client configuration file. No API key is needed; the contact email is optional.
Or with npx (no Bun required):
Or with Docker:
For Streamable HTTP, set the transport and start the server:
DATACITE_CONTACT_EMAIL doubles DataCite's per-IP request allowance.| Variable | Description | Default |
|---|---|---|
DATACITE_CONTACT_EMAIL | Contact email sent in the User-Agent as mailto:, never in a URL. Moves requests to DataCite's identified tier: 1,000 requests per 5 minutes per IP instead of 500. Validated as an email at startup. | none |
DATACITE_MAX_REQUESTS_PER_5MIN | Request budget per 5-minute window, an integer from 50 to 1000. Divide it across replicas that share one egress IP. | 800 with a contact email, 400 without |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry. | false |
See .env.example for the full list of optional overrides.
Build and run the production version:
Run checks and tests:
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers the six tools and sets the server instructions. |
src/mcp-server/tools | Tool definitions (*.tool.ts) and the input-schema, miss-guidance, and text-rendering helpers they share. |
src/services/datacite | DataCite REST client (/dois, /repositories, /events, content negotiation), query builder, identifier normalizers, record mappers, relation-graph builder, and citation style check. |
src/services/doi-ra | doi.org registration-agency lookup for DOIs DataCite holds no public record for. |
src/services/http | Shared upstream pipeline — response cache, request pacer, retry, per-call deadline, rate-limit handling. |
src/services/reference | Static vocabularies behind datacite_list_reference and the input validators. |
src/config | Server-specific environment variable parsing and validation with Zod. |
tests/ | Vitest tests mirroring src/, with recorded DataCite and doi.org fixtures. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for logging, ctx.state for storagecreateApp() arrays in src/index.tsIssues are welcome. Run checks and tests before submitting:
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.