orcid-mcp-server

v0.3.3 pre-1.0

Search and retrieve researcher profiles, works, affiliations, funding, and peer review records from the ORCID registry via MCP. STDIO or Streamable HTTP.

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

Tools

9

orcid_get_profile

open-world

Fetch a researcher's public profile from ORCID: name, other names, biography, keywords, researcher URLs, and external identifiers such as Scopus Author ID, ResearcherID, and Loop profile. This is the entry point for building a researcher dossier. Pass a bare ORCID iD (0000-0001-2345-6789) or a full URI (https://orcid.org/0000-0001-2345-6789). The profile contains only publicly visible data — researchers control visibility per field.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_profile",
    "arguments": {
      "orcid_id": "<orcid_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    }
  },
  "required": [
    "orcid_id"
  ],
  "additionalProperties": false
}
view source ↗

orcid_search_researchers

open-world

Search the ORCID registry using structured field parameters or raw Solr syntax. Provide at least one non-blank search field; all provided structured params are ANDed together. The `query` field adds raw Solr syntax, ANDed with the structured params as one group. Returns ORCID iDs with inline name and institution data — no follow-up profile fetches needed for basic disambiguation. For ranked disambiguation of an ambiguous author name, use orcid_resolve_researcher instead. The ORCID Public API caps results at 10,000 — use pagination for large result sets. Each response also stops at 64,000 bytes; continue a cut page from nextStart.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_search_researchers",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "given_name": {
      "description": "Researcher's given (first) name. Phrase match; a value of only initials (J. or J. A.) matches given names starting with each letter.",
      "type": "string"
    },
    "family_name": {
      "description": "Researcher's family (last) name.",
      "type": "string"
    },
    "affiliation": {
      "description": "Organization name to filter by. Phrase match.",
      "type": "string"
    },
    "keyword": {
      "description": "Keyword to search in the researcher's keyword fields. Phrase match.",
      "type": "string"
    },
    "ror_id": {
      "description": "ROR organization ID to filter by, bare (00f54p054) or as a ror.org URL (https://ror.org/00f54p054). Returns researchers affiliated with this organization.",
      "type": "string",
      "pattern": "^\\s*(?:(?:(?:https?:\\/\\/)?(?:www\\.)?ror\\.org\\/)?0[0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{6}[0-9]{2}\\/?)?\\s*$"
    },
    "doi": {
      "description": "Complete DOI to anchor the search, bare (10.1126/science.1225829) or as a https://doi.org/, https://dx.doi.org/, or doi: form. Requires 10., digits, a slash, and a non-whitespace suffix; blank means unset. Returns researchers who have linked this DOI to their ORCID record.",
      "type": "string",
      "pattern": "^(?:\\s*|\\s*(?:(?:(?:[hH][tT][tT][pP][sS]?:\\/\\/)?(?:[dD][xX]\\.)?[dD][oO][iI]\\.[oO][rR][gG]\\/|[dD][oO][iI]:)\\s*)?10\\.[0-9]+\\/\\S+\\s*)$"
    },
    "pmid": {
      "description": "Numeric PubMed ID to anchor the search, bare (22745249), as PMID:22745249, or as a pubmed.ncbi.nlm.nih.gov or ncbi.nlm.nih.gov/pubmed URL. Blank means unset; a label or URL without digits is invalid. Returns researchers who have linked this PMID to their ORCID record.",
      "type": "string",
      "pattern": "^(?:\\s*|\\s*(?:(?:(?:[hH][tT][tT][pP][sS]?:\\/\\/)?(?:(?:[wW][wW][wW]\\.)?[nN][cC][bB][iI]\\.[nN][lL][mM]\\.[nN][iI][hH]\\.[gG][oO][vV]\\/[pP][uU][bB][mM][eE][dD]\\/|[pP][uU][bB][mM][eE][dD]\\.[nN][cC][bB][iI]\\.[nN][lL][mM]\\.[nN][iI][hH]\\.[gG][oO][vV]\\/)|[pP][mM][iI][dD]:)\\s*)?[0-9]+\\s*(?:\\/(?:[?#][\\s\\S]*|\\s*)|[?#][\\s\\S]*|$))$"
    },
    "grant_number": {
      "description": "Grant or award number on a funding item in the researcher record (e.g. 5F31MH010500-03). Matched as a case-insensitive phrase over the parts between separators such as hyphens and slashes: 5F31MH010500 also matches 5F31MH010500-03, but a number cut mid-part (5F31MH0105) matches nothing. Not an exact identifier lookup.",
      "type": "string"
    },
    "query": {
      "description": "Raw Solr query string. Sent as written when it is the only field; beside structured params it is ANDed as one parenthesized group, so a top-level OR keeps its alternatives (an exclusion-only query such as -keyword:x is ANDed ungrouped). Supports all ORCID Solr fields and boolean operators.",
      "type": "string"
    },
    "rows": {
      "default": 20,
      "description": "Requested results (1–10,000, effective maximum 1,000, default 20). Each surface also stops at 64,000 bytes; continue from nextStart.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "start": {
      "default": 0,
      "description": "Pagination offset (0-based), 0–10,000. The ORCID Public API rejects start > 10,000 for unauthenticated requests.",
      "type": "integer",
      "minimum": 0,
      "maximum": 10000
    }
  },
  "required": [
    "rows",
    "start"
  ],
  "additionalProperties": false
}
view source ↗

orcid_get_works

open-world

Retrieve works associated with an ORCID iD — publications, datasets, software, preprints, and more. Returns work summaries with put-codes, titles, types, publication dates, journal names, and all external identifiers (DOIs, PMIDs, arXiv IDs, ISBNs). The first 50 works are returned by default; workCount reports the total available, and prolific records are paged with offset and the returned nextOffset (or raise limit). A page also stops early once the response reaches its 64,000-byte budget, so returnedCount can come in below limit; truncated and nextOffset then carry the continuation. Set include_external_ids to false to omit identifier lists for a lighter payload. Pass the putCode from each work to orcid_get_work_detail to retrieve the full record including abstract and contributors. External IDs are ready for chaining to Crossref, PubMed, or arXiv servers. Works come from the researcher or from member organizations such as Crossref or a university system; each work lists its sources and whether the researcher asserted it (selfAsserted). A researcher may not have linked all their publications.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_works",
    "arguments": {
      "orcid_id": "<orcid_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    },
    "limit": {
      "default": 50,
      "description": "Requested works (default 50, accepted maximum 10,000, effective maximum 1,000). Page locally with offset and nextOffset; the 64,000-byte response budget may return fewer.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "offset": {
      "default": 0,
      "description": "Zero-based index of the first work to return (default 0). Combine with limit to page through the full works list.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "include_external_ids": {
      "default": true,
      "description": "When true (default), each work carries its external identifiers (DOIs, PMIDs, arXiv IDs, ISBNs). Set false to omit them for a lighter payload when only titles, types, and dates are needed.",
      "type": "boolean"
    }
  },
  "required": [
    "orcid_id",
    "limit",
    "offset",
    "include_external_ids"
  ],
  "additionalProperties": false
}
view source ↗

orcid_get_work_detail

open-world

Fetch full work details by put-code from orcid_get_works. Accepts 1–1,000 raw codes, deduplicates in first-occurrence order, and fetches the first 100 distinct codes in one request. Returns abstracts, contributors with CRediT roles, the record's external IDs (DOI, PMID, arXiv, ISBN, etc.), citation metadata, journal title, URL, and source provenance. A record listing more than 100 contributors keeps the first 100 plus the requested researcher's own entries, with contributorCount and contributorsTruncated; a citation over 8,192 bytes is left out and flagged by citationOmitted. Per-record errors are returned alongside successful works. Records are admitted under a 64,000-byte budget on each complete response surface. Every requested distinct code unsettled by an admitted work or identified error is listed in deferredPutCodes in request order, including input-cap, byte-budget, and absent-upstream-result deferrals; pass those codes in another call. Notices distinguish the causes; no automatic chunk fetching occurs.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_work_detail",
    "arguments": {
      "orcid_id": "<orcid_id>",
      "put_codes": "<put_codes>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    },
    "put_codes": {
      "minItems": 1,
      "maxItems": 1000,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991,
        "description": "Work put-code (positive integer)."
      },
      "description": "Array of 1–1,000 raw work put-codes from orcid_get_works. Deduplicated in first-occurrence order; at most 100 distinct codes are fetched once. Every unsettled code is returned in deferredPutCodes for another call, including input-cap and response-budget deferrals."
    }
  },
  "required": [
    "orcid_id",
    "put_codes"
  ],
  "additionalProperties": false
}
view source ↗

orcid_get_affiliations

open-world

Fetch affiliation records for an ORCID researcher. The `types` parameter controls which affiliation sections to return: employment, education, invited-positions, distinctions, memberships, qualifications, services, or all. Default is employment and education. Returns organization names, disambiguated organization identifiers (ROR/GRID/Ringgold), departments, roles, date ranges, and sources. Affiliations come from the researcher or from member organizations such as a university research information system; sources names who added each, and selfAsserted tells the two apart. Absence does not mean no affiliation.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_affiliations",
    "arguments": {
      "orcid_id": "<orcid_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    },
    "types": {
      "default": [
        "employment",
        "education"
      ],
      "description": "Which affiliation types to return. Defaults to employment and education. Use [\"all\"] to get every section.",
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "employment",
          "education",
          "invited-positions",
          "distinctions",
          "memberships",
          "qualifications",
          "services",
          "all"
        ],
        "description": "Affiliation section type. Use \"all\" to include all section types."
      }
    }
  },
  "required": [
    "orcid_id",
    "types"
  ],
  "additionalProperties": false
}
view source ↗

orcid_get_funding

open-world

Fetch funding records for an ORCID researcher: grants, contracts, awards, and salary awards. Returns funder names, funder organization identifiers, grant numbers, funding periods, and sources. Funding items come from the researcher or from member organizations such as funders, institutions, and search-and-link tools; sources names who added each. Most researchers have no funding entries even when they hold grants, so absence of funding records does not imply absence of funding. When records exist they are high-value for grant tracking and funder analysis.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_funding",
    "arguments": {
      "orcid_id": "<orcid_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    }
  },
  "required": [
    "orcid_id"
  ],
  "additionalProperties": false
}
view source ↗

orcid_get_peer_reviews

open-world

Fetch peer review activity for an ORCID researcher: reviewer role (reviewer, editor, chair, etc.), review type, completion dates, ISSN-keyed group identifiers, and the convening organization as ORCID records it — often the service that imported the review (e.g. Publons, Clarivate). ORCID returns no journal name; groupIssn is the key to the journal, and a review that has one is headed by it. Use to assess editorial activity, journal affiliations, and the scope of a researcher's peer review contributions. Reviews come from the researcher or from member organizations that import them; sources names who added each, and coverage varies by researcher.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_peer_reviews",
    "arguments": {
      "orcid_id": "<orcid_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    },
    "offset": {
      "default": 0,
      "description": "Zero-based review offset; continue with nextOffset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 50,
      "description": "Requested page size (default 50, accepted maximum 10,000, effective maximum 1,000). Each surface is bounded to 64,000 bytes, except an indivisible oversized review returned alone with a notice.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    }
  },
  "required": [
    "orcid_id",
    "offset",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

orcid_get_research_resources

open-world

List allocation proposals for an ORCID researcher, or supply put_code from a summary record to retrieve its actual resource items. Summary is the default view and includes every proposal host, identifiers, access period, and source provenance; hostOrganization remains the first proposal host. Detail adds item names, types, all operators, identifiers, and URLs. Page items with item_offset (default 0) and item_limit (default 50, effective maximum 100, hard maximum 10,000), both requiring put_code; continue at nextItemOffset with the same selector. Both detail surfaces fit 64,000 bytes including metadata and continuation, with an explicit budgetOverflow exception for an indivisible oversized item returned alone or oversized proposal metadata. Most researchers have no entries; allocation systems such as ACCESS deposit these records.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_get_research_resources",
    "arguments": {
      "orcid_id": "<orcid_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "orcid_id": {
      "type": "string",
      "pattern": "^(?:(?:https?:\\/\\/)?(?:www\\.)?orcid\\.org\\/)?\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dXx]\\/?$",
      "description": "ORCID iD — bare (0000-0001-2345-6789) or as an orcid.org URI (https://orcid.org/0000-0001-2345-6789). The check digit may be X or x."
    },
    "put_code": {
      "description": "Proposal put-code from summary mode; selects the full allocation detail.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "item_offset": {
      "description": "Detail item offset, default 0; requires put_code.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "item_limit": {
      "description": "Detail page size, default 50, effective maximum 100; requires put_code.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    }
  },
  "required": [
    "orcid_id"
  ],
  "additionalProperties": false
}
view source ↗

orcid_resolve_researcher

open-world

Disambiguate an author name to a verified ORCID iD. Returns ranked candidates (5 by default, up to 20 via the rows parameter) with transparent disambiguation signals: name match type (exact/partial/other-name/none), institution overlap flag, and whether a DOI or PMID anchor was used in the query. The name is searched as an exact phrase first; when that finds nothing, byline initials (J. Doudna, Jennifer A. Doudna) and then the other names listed on ORCID records are tried. A DOI or PMID anchor is near-deterministic — it filters to researchers who have linked that specific work to their ORCID record. Use this tool (not orcid_search_researchers) when the input is an ambiguous name that needs ranked disambiguation. No synthetic scores are used — raw signals only.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "orcid_resolve_researcher",
    "arguments": {
      "name": "<name>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "description": "Author name to disambiguate: a full name (\"Jennifer Doudna\"), a byline with initials (\"J. Doudna\", \"Jennifer A. Doudna\"), or \"Family, Given\" (\"Doudna, Jennifer\", read as Jennifer Doudna). The exact phrase is tried first; initials and other names listed on a record are fallbacks, so a full name gives the most precise candidates."
    },
    "affiliation": {
      "description": "Researcher's institution or organization name. Used for institution overlap scoring and optionally as a search constraint.",
      "type": "string"
    },
    "doi": {
      "description": "Complete DOI of a work authored by this researcher, bare (10.1126/science.1225829) or as a https://doi.org/, https://dx.doi.org/, or doi: form. Requires 10., digits, a slash, and a non-whitespace suffix; blank means unset. Acts as a near-deterministic anchor — filters to researchers who linked this DOI to their ORCID record.",
      "type": "string",
      "pattern": "^(?:\\s*|\\s*(?:(?:(?:[hH][tT][tT][pP][sS]?:\\/\\/)?(?:[dD][xX]\\.)?[dD][oO][iI]\\.[oO][rR][gG]\\/|[dD][oO][iI]:)\\s*)?10\\.[0-9]+\\/\\S+\\s*)$"
    },
    "pmid": {
      "description": "Numeric PubMed ID of a work authored by this researcher, bare (22745249), as PMID:22745249, or as a pubmed.ncbi.nlm.nih.gov or ncbi.nlm.nih.gov/pubmed URL. Blank means unset; a label or URL without digits is invalid. Acts as a near-deterministic anchor — filters to researchers who linked this PMID to their ORCID record.",
      "type": "string",
      "pattern": "^(?:\\s*|\\s*(?:(?:(?:[hH][tT][tT][pP][sS]?:\\/\\/)?(?:(?:[wW][wW][wW]\\.)?[nN][cC][bB][iI]\\.[nN][lL][mM]\\.[nN][iI][hH]\\.[gG][oO][vV]\\/[pP][uU][bB][mM][eE][dD]\\/|[pP][uU][bB][mM][eE][dD]\\.[nN][cC][bB][iI]\\.[nN][lL][mM]\\.[nN][iI][hH]\\.[gG][oO][vV]\\/)|[pP][mM][iI][dD]:)\\s*)?[0-9]+\\s*(?:\\/(?:[?#][\\s\\S]*|\\s*)|[?#][\\s\\S]*|$))$"
    },
    "rows": {
      "default": 5,
      "description": "Maximum candidate count to return (1–20). Defaults to 5.",
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    }
  },
  "required": [
    "name",
    "rows"
  ],
  "additionalProperties": false
}
view source ↗

Resources

2

Researcher profile (person section) from ORCID: name, other names, biography, keywords, researcher URLs, and external identifiers. Use when injecting researcher identity context into a prompt or checking for a specific external ID (e.g., Scopus ID for cross-server chaining). Prefer the orcid_get_profile tool when the response needs to flow into conditional logic.

uri orcid://researcher/{orcid_id}/profile mime application/json

Works list for an ORCID researcher: titles, types, publication dates, journal names, and external identifiers (DOIs, PMIDs, arXiv IDs). Use when providing a researcher's publication list as background context for summarizing or reviewing a body of work. Returns the first 25 works plus workCount (the total available) — call the orcid_get_works tool to page through the full list or filter results. DOIs and PMIDs in the response are ready for Crossref or PubMed chaining. Prefer the orcid_get_works tool when filtering or processing results is needed.

uri orcid://researcher/{orcid_id}/works mime application/json