Connects Claude to OpenAlex's catalog of 270 million academic publications, authors, institutions, and topics. Exposes four tools: entity search with filters and pagination, trend aggregation for distribution analysis, name-to-ID resolution via autocomplete, and citation graph traversal in both directions. Also includes two structured prompts for literature reviews and research landscape analysis. Built on the author's mcp-ts-core framework with typed API clients, automatic ID normalization across DOI/ORCID/ROR/PMID formats, and abstract reconstruction from OpenAlex's inverted indices. Available as a public hosted instance at openalex.caseyjhand.com or self-hosted via npx. Useful for systematic literature searches, citation network analysis, tracking research trends, or resolving ambiguous author and institution names before filtering.
claude mcp add --transport http openalex https://openalex.caseyjhand.com/mcpRun in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
openalex_resolve_nameResolve a name or partial name to an OpenAlex ID. Returns up to 10 matches with disambiguation hints. ALWAYS use this before filtering by entity — names are ambiguous, IDs are not. Also accepts DOIs directly for quick lookup.3 paramsResolve a name or partial name to an OpenAlex ID. Returns up to 10 matches with disambiguation hints. ALWAYS use this before filtering by entity — names are ambiguous, IDs are not. Also accepts DOIs directly for quick lookup.
query*stringfiltersobjectentity_typestringworks · authors · sources · institutions · topics · keywordsopenalex_search_entitiesSearch, filter, sort, or retrieve by ID. Covers all OpenAlex entity types (works, authors, sources, institutions, topics, keywords, publishers, funders). Pass `id` to retrieve a single entity. Otherwise, use `query` and/or `filters` for discovery. Supports keyword search with...11 paramsSearch, filter, sort, or retrieve by ID. Covers all OpenAlex entity types (works, authors, sources, institutions, topics, keywords, publishers, funders). Pass `id` to retrieve a single entity. Otherwise, use `query` and/or `filters` for discovery. Supports keyword search with...
idstringseedstringsortstringquerystringcursorstringsampleintegerselectarrayfiltersobjectper_pageintegerentity_type*stringworks · authors · sources · institutions · topics · keywordssearch_modestringkeyword · exact · semanticdefault: keywordopenalex_analyze_trendsAggregate OpenAlex entities into groups and count them. Use for trend analysis (group works by publication_year), distribution analysis (group by oa_status, type, country), and comparative analysis (group by institution or topic). Combine with filters to scope the analysis. Re...7 paramsAggregate OpenAlex entities into groups and count them. Use for trend analysis (group works by publication_year), distribution analysis (group by oa_status, type, country), and comparative analysis (group by institution or topic). Combine with filters to scope the analysis. Re...
orderstringcount · keycursorstringfiltersobjectgroup_by*stringper_pageintegerentity_type*stringworks · authors · sources · institutions · topics · keywordsinclude_unknownbooleanopenalex_get_citation_graphWalk the citation graph one hop from a seed work. Direction picks the edge: incoming citations (`cites`), the seed's own references (`cited_by`), or OpenAlex's algorithmically-related works (`related_to`). Note: `direction` follows OpenAlex's filter convention, which inverts t...7 paramsWalk the citation graph one hop from a seed work. Direction picks the edge: incoming citations (`cites`), the seed's own references (`cited_by`), or OpenAlex's algorithmically-related works (`related_to`). Note: `direction` follows OpenAlex's filter convention, which inverts t...
sortstringcursorstringselectarrayfiltersobjectseed_id*stringper_pageintegerdirection*stringcites · cited_by · related_toopenalex_describe_fieldsList valid field names for an OpenAlex entity type and context (filter, group_by, or select). Use proactively before constructing a filter or group_by to avoid invalid-field 400 errors. Pass `query` to narrow the results by name similarity — useful when you have a partial or g...3 paramsList valid field names for an OpenAlex entity type and context (filter, group_by, or select). Use proactively before constructing a filter or group_by to avoid invalid-field 400 errors. Pass `query` to narrow the results by name similarity — useful when you have a partial or g...
querystringcontext*stringfilter · group_by · selectentity_type*stringworks · authors · sources · institutions · topics · keywordsAccess the OpenAlex academic research catalog - 270M+ publications through MCP. STDIO & Streamable HTTP.
Public Hosted Server: https://openalex.caseyjhand.com/mcp
Five tools for querying the OpenAlex academic research catalog:
| Tool Name | Description |
|---|---|
openalex_search_entities | Search, filter, sort, or retrieve by ID across all 8 entity types. |
openalex_analyze_trends | Group-by aggregation for trend and distribution analysis. |
openalex_resolve_name | Resolve a name or partial name to an OpenAlex ID via autocomplete. |
openalex_get_citation_graph | Walk the citation graph one hop from a seed work: cites, cited_by, or related_to. |
openalex_describe_fields | List valid filter, group_by, and select field names for an entity type — call before building a query to avoid invalid-field errors. |
openalex_search_entitiesPrimary discovery and lookup tool. Covers all OpenAlex entity types (works, authors, sources, institutions, topics, keywords, publishers, funders).
us|gb), NOT (!us), ranges (2020-2024), comparisons (>100)select to choose fields, or ["*"] for the full recordselect field names produce an error listing the valid fields for that entity typeopenalex_analyze_trendsAggregate entities into groups and count them for trend, distribution, and comparative analysis.
include_unknown to show entities with no value for the grouped fieldopenalex_resolve_nameName-to-ID resolution via autocomplete. Always use this before filtering by entity — names are ambiguous, IDs are not.
openalex_get_citation_graphOne-hop citation graph traversal from a seed work. Wraps the OpenAlex cites/cited_by/related_to filters behind an explicit direction argument so callers do not have to know the filter names.
cites: works that cite the seed (incoming citations)cited_by: works the seed cites (its reference list)related_to: OpenAlex algorithmic "related works" (~8-30 typical, may be empty for less-cited seeds)seed_id; validates the seed via a singleton /works/{id} lookup before walking, so non-existent seeds surface as NotFoundfilters/sort/select to narrow the graph (e.g., publication_year=">2020", is_oa="true")openalex_describe_fieldsDiscover valid field names before constructing a query — avoids invalid-field 400 errors. Backed by a catalog generated from OpenAlex's own field validation.
filter, group_by, or select)group_by resolves to the same valid-field set as filterquery (a partial or guessed name) to rank results by name similarity — surfaces the right field when you only know roughly what you want| Prompt | Description |
|---|---|
openalex_literature_review | Guides a systematic literature search: formulate query, search, filter, analyze citation network, synthesize findings. |
openalex_research_landscape | Analyzes the research landscape for a topic: volume trends, top authors/institutions, open access rates, funding sources. |
Built on @cyanheads/mcp-ts-core:
none, jwt, oauth)OpenAlex-specific:
AbortSignalA public instance is available at https://openalex.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"openalex-mcp-server": {
"type": "streamable-http",
"url": "https://openalex.caseyjhand.com/mcp"
}
}
}
Add to your MCP client config (e.g., claude_desktop_config.json):
{
"mcpServers": {
"openalex-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/openalex-mcp-server"],
"env": {
"OPENALEX_API_KEY": "your-email@example.com"
}
}
}
}
No API key needed — just provide your email to access the polite pool (10x faster rate limits).
git clone https://github.com/cyanheads/openalex-mcp-server.git
cd openalex-mcp-server
bun install
| Variable | Description | Default |
|---|---|---|
OPENALEX_API_KEY | Optional. Email address for the OpenAlex polite pool (10x faster rate limits). Without it, anonymous rate limits apply. | — |
OPENALEX_BASE_URL | OpenAlex API base URL. | https://api.openalex.org |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_ALLOWED_ORIGINS | Comma-separated allow-list of browser Origin headers for HTTP transport. Unset = loopback-only; set to * to disable. | loopback only |
MCP_LOG_LEVEL | Log level (RFC 5424). | debug |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry instrumentation (spans, metrics, completion logs). | false |
Build and run the production version:
bun run build
bun run start:http # or start:stdio
Run checks and tests:
bun run devcheck # Lints, formats, type-checks
bun run test # Runs test suite
docker build -t openalex-mcp-server .
docker run -e OPENALEX_API_KEY=your-key -p 3010:3010 openalex-mcp-server
| Directory | Purpose |
|---|---|
src/mcp-server/tools/definitions/ | Tool definitions (*.tool.ts). |
src/mcp-server/prompts/definitions/ | Prompt definitions (*.prompt.ts). |
src/services/openalex/ | OpenAlex API client service and domain types. |
src/config/ | Environment variable parsing and validation with Zod. |
tests/ | Unit and integration tests, mirroring the src/ structure. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for logging, ctx.state for storageopenalex_resolve_name before using them in filtersIssues and pull requests are welcome. Run checks before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
OPENALEX_API_KEYOpenAlex API key or mailto email — optional. Without: anonymous rate limits. With: polite pool access.
OPENALEX_BASE_URLdefault: https://api.openalex.orgOpenAlex API base URL.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.