@cyanheads/orcid-mcp-server
Search and retrieve researcher profiles, works, affiliations, funding, and peer review records from the ORCID registry.
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/orcid-mcp-serversearch for researchers named Ada Lovelace"
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.
Public Hosted Server: https://orcid.caseyjhand.com/mcp
Overview
Researcher identity data from the ORCID registry. Search and disambiguate authors, build a researcher dossier from profile, works, affiliations, funding, and peer review records, and chain external identifiers to Crossref, PubMed, or arXiv from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Search the ORCID registry using structured field params (name, affiliation, keyword, ROR ID, DOI, PMID) |
| Fetch a researcher's public profile — name, biography, keywords, researcher URLs, external identifiers |
| Retrieve works (publications, datasets, software, preprints) for a researcher, paginated |
| Fetch full detail records — abstracts, contributors, citations — for 1–100 works by put-code |
| Fetch affiliation records: employment, education, memberships, and more |
| Fetch funding records: grants, contracts, awards, and salary awards |
| Fetch peer review activity: convening organizations, reviewer role, review type |
| List research resources — compute allocations, equipment access, lab facilities |
| Disambiguate an ambiguous author name to a ranked list of verified ORCID iD candidates |
Resources
Resource | Description |
| Researcher profile (person section) — name, bio, keywords, external IDs |
| Works list for a researcher — the first 25 plus the total count |
All resource data is also reachable via tools. Use resources when injecting stable researcher context into a prompt; use tools when filtering or processing results is needed.
Related MCP server: GBIF Biodiversity MCP Server
Capability reference
orcid_search_researchers tool
Structured params —
given_name,family_name,affiliation,keyword,ror_id,doi,pmid— AND together automatically;queryappends raw Solr syntax to the generated clausedoiandpmidmap todoi-self/pmid-selffield queries — finds researchers who linked that specific work to their ORCID recordrows: 1–1000 (default 20);start: 0–10,000 offset pagination (the ORCID Public API's ceiling for unauthenticated requests)Returns expanded-search results with inline name and institution data — no follow-up profile fetch needed for basic discovery
Use for precise field-anchored lookups; use
orcid_resolve_researcherfor ambiguous names needing ranked disambiguation
orcid_get_profile tool
Accepts a bare ORCID iD (
0000-0001-2345-6789) or a full URIReturns name, biography, keywords, researcher URLs, external identifiers (Scopus Author ID, ResearcherID, Loop, etc.), emails, and country codes — all in one response
Only publicly visible fields are returned; researchers control per-field visibility
Entry point for building a researcher dossier before fetching works or affiliations
orcid_get_works tool
Returns the first 50 works by default (
limitmax 1000); page withoffsetand the returnednextOffset—workCountreports the total availableSet
include_external_idstofalseto drop DOI/PMID/arXiv/ISBN identifier lists for a lighter payloadExternal identifiers are pre-formatted for chaining to Crossref, PubMed, or arXiv
Summaries only — pass a work's
putCodetoorcid_get_work_detailfor abstracts and full contributor listsWorks are self-reported; an empty list does not mean no publications
orcid_get_work_detail tool
put_codes: 1–100 per call (fromorcid_get_works), resolved in a single round-tripReturns abstract, full contributor list with CRediT roles, complete external ID list, citation metadata (BibTeX or other deposited formats), journal title, and URL
Per-put-code failures (not found or inaccessible) arrive as
errorsentries — the rest of the batch still resolves
orcid_get_affiliations tool
typesfilters which sections to return:employment,education,invited-positions,distinctions,memberships,qualifications,services, orall— default is employment + educationOne upstream call regardless of how many types are requested
Returns organization name, disambiguated ID (ROR/GRID/Ringgold), department, role, and date range per record
Self-reported; an empty result does not mean no affiliation
orcid_get_funding tool
No filtering params — returns the complete funding list for the ORCID iD in one call
Returns funding type (grant, contract, award, salary-award), funder name and disambiguated ID (Crossref Funder ID/ROR), grant numbers, and funding period
Entirely self-reported — most researchers with real grants have no entries here; absence does not imply no funding
orcid_get_peer_reviews tool
No filtering params — returns the complete peer review history for the ORCID iD in one call
Returns convening organization (journal/publisher), reviewer role (
reviewer,editor,chair, etc.), review type, completion date, and an ISSN-keyed group identifier per recordSelf-reported or imported by participating publishers — coverage varies widely by researcher
orcid_get_research_resources tool
Covers compute allocations, equipment access, lab facilities, data resources, and clinical study registrations
A newer, sparsely populated ORCID section — most researchers have zero entries, and absence does not imply none exist
Entries are typically deposited by resource-allocation systems (e.g. ACCESS, XSEDE) rather than self-reported
Returns resource title, hosting organization (with disambiguated ID), external identifiers (often a portal URI), and access period
orcid_resolve_researcher tool
Returns ranked candidates (5 default, up to 20 via
rows) with transparent disambiguation signals: name match type (exact/partial/other-name/none), institution overlap flag, and anchor type (doi/pmid/none)When
doiorpmidis provided, usesdoi-selforpmid-selfas an anchor — researchers who have linked that work to their ORCID record are near-deterministic matchesFalls back to a relaxed query (dropping affiliation) if the initial candidate set is empty, then to anchor-only retries when a supplied anchor is present
No synthetic scores — raw signal fields only, so callers can apply their own ranking logic
orcid://researcher/{orcid_id}/profile resource
Returns name, biography, keywords, researcher URLs, and external identifiers as
application/jsonRejects a checksum-invalid ORCID iD locally before any upstream call
Prefer the
orcid_get_profiletool when the response needs to flow into conditional logic
orcid://researcher/{orcid_id}/works resource
Returns the first 25 works plus
workCount(the total available) asapplication/jsonNo cursor pagination on this resource — use the
orcid_get_workstool to page the full list or filter resultsDOIs and PMIDs in the response are ready for Crossref or PubMed chaining
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.
ORCID-specific:
ORCID Public API v3.0 (
https://pub.orcid.org/v3.0) — no API key required for public read endpointsexpanded-searchas the primary search backend — returns ORCID iD, name, and institution data inline, eliminating N+1 profile fetchesSingle
/activitiescall for affiliation queries, filtered client-side — eliminates up to 7 parallel upstream calls vs. per-section fetchingExternal identifiers (DOIs, PMIDs, arXiv IDs) surfaced in works responses in formats ready for cross-server chaining to Crossref, PubMed, or arXiv
Agent-friendly output:
Provenance —
orcid_resolve_researcherreturns raw disambiguation signals (name match type, institution overlap, anchor type) instead of a synthetic confidence scoreTruncation awareness —
orcid_search_researchersreportsnumFoundand atruncatedflag against the ORCID Public API's 10,000-offset ceiling;orcid_get_worksreportsworkCountandtruncatedagainst its own page sizePartial failure isolation —
orcid_get_work_detailreturns per-put-code errors alongside successfully resolved works instead of failing the whole batchEmpty-result guidance —
orcid_get_works,orcid_get_affiliations,orcid_get_funding,orcid_get_peer_reviews, andorcid_get_research_resourcesreturn a notice when a result is empty, explaining that this may reflect self-reporting gaps or visibility settings rather than confirmed absence
Getting started
Public Hosted Instance
A public instance is available at https://orcid.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"orcid-mcp-server": {
"type": "streamable-http",
"url": "https://orcid.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file. No API key is required — the ORCID Public API is open for public read access.
{
"mcpServers": {
"orcid-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/orcid-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"orcid-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/orcid-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"orcid-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/orcid-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 required. The ORCID Public API is open for public read access. Non-commercial use only under ORCID Public API ToS §2.
Installation
Clone the repository:
git clone https://github.com/cyanheads/orcid-mcp-server.gitNavigate into the directory:
cd orcid-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env if needed — no required varsConfiguration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
Variable | Description | Default |
| Override the ORCID API base URL. Useful for pointing at the sandbox ( |
|
| Transport: |
|
| HTTP server port |
|
| HTTP endpoint path |
|
| HTTP session mode: |
|
| Public origin for TLS-terminating reverse-proxy deployments | none |
| Authentication: |
|
| Log level ( |
|
| Opt-in Bun-only forced-GC pressure loop (ms). Try |
|
| 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:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t orcid-mcp-server .
docker run --rm -p 3010:3010 orcid-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/orcid-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Resource definitions ( |
| ORCID Public API v3.0 service layer — search, record section fetchers, retry/backoff. |
| Unit and integration 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 request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources in the
createApp()arraysWrap ORCID API calls: validate raw response → 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
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
ORCID public researcher records (works, employment, education)
Search NPPES providers and resolve NUCC specialty codes via MCP over STDIO or Streamable HTTP.
Search and compare attributed recipe records through a public read-only remote MCP endpoint.
Search MCP servers, MCP clients and AI agents, and retrieve listing details. Free, read-only access.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables searching Figshare research articles, datasets, papers, and posters through the MCP protocol.3 npmMIT
- AlicenseNot gradedqualityAmaintenanceSearch GBIF species taxonomy, occurrence records, datasets, and publishers via MCP.105 npm1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to conduct search-first web research through source discovery, page retrieval by ID, and direct URL reading.46 PyPI2MIT
- FlicenseNot gradedqualityBmaintenanceEnables searching and retrieving full transcripts and metadata from YouTube and podcast content, including mentions, momentum, sponsors, and coverage, through a remote MCP endpoint with OAuth or trial key access.-