Hosted MCP server · #78 most used on Smithery
openalex-mcp-server
cyanheads/openalex-mcp-server
Access the OpenAlex academic research catalog — 270M+ publications.
- Uses
- 6.5k
- Tools
- 5
- Runs
- Hosted
- Prompts
- 2
- Listed
- 7mo ago
Get started
Add it to your agent
npx -y @smithery/cli@latest install cyanheads/openalex-mcp-server --client claudeSwap --client claude for cursor, vscode, windsurf or another client. The CLI asks for any required settings.
claude mcp add --transport http openalex https://server.smithery.ai/cyanheads/openalex-mcp-server/mcpA hosted server: nothing to install. Run /mcp in Claude Code to sign in if it asks.
[mcp_servers.openalex]
url = "https://server.smithery.ai/cyanheads/openalex-mcp-server/mcp"Add to ~/.codex/config.toml.
{
"mcpServers": {
"openalex": {
"url": "https://server.smithery.ai/cyanheads/openalex-mcp-server/mcp"
}
}
}Add to ~/.cursor/mcp.json.
{
"servers": {
"openalex": {
"type": "http",
"url": "https://server.smithery.ai/cyanheads/openalex-mcp-server/mcp"
}
}
}Add to .vscode/mcp.json.
gemini mcp add --transport http openalex https://server.smithery.ai/cyanheads/openalex-mcp-server/mcpSaved to .gemini/settings.json.
What it can do
5 tools
openalex_resolve_name3 paramsResolve a name or partial name to an OpenAlex ID. Returns up to 10 matches with disambiguation hints. ALWAYS use this before filtering by…
Resolve 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.
| Parameter | Type | Description |
|---|---|---|
query | string | Name or partial name to resolve. Also accepts DOIs for quick lookup. |
filters | object | Narrow autocomplete results with filters. Example: restrict to a specific country or publication year range. |
entity_type | string | Entity type to search. Omit for cross-entity search (useful when entity type is unknown). |
openalex_search_entities11 paramsSearch, filter, sort, or retrieve by ID. Covers all OpenAlex entity types (works, authors, sources, institutions, topics, keywords, publi…
Search, 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 boolean operators, exact phrase matching, and AI semantic search. Use openalex_resolve_name to resolve names to IDs before filtering. Searches and ID lookups return a curated set of fields by default; pass `select` to overr
| Parameter | Type | Description |
|---|---|---|
id | string | Retrieve a single entity by ID. Supports: OpenAlex ID ("W2741809807"), DOI ("10.1038/nature12373"), ORCID ("0000-0002-1825-0097"), ROR ("https://ror.org/00hx57361"), PMID ("12345678"), PMCID ("PMC1234 |
seed | string | Deterministic seed for `sample`. Same seed + same filters = same results — pass when reproducibility matters. Has no effect (and is rejected) without `sample`. |
sort | string | Sort field. Prefix with "-" for descending. Common: "cited_by_count", "-publication_date", "-relevance_score" (default when query present). Note: when combined with a keyword query, an explicit sort o |
query | string | Text search query. Supports boolean operators (AND, OR, NOT), quoted phrases ("exact match"), wildcards (machin*), fuzzy matching (machin~1), and proximity ("climate change"~5). Omit for filter-only q |
cursor | string | Pagination cursor from a previous response. Pass to get the next page. |
sample | integer | Return a random sample of this many entities matching the filters (1-100). Single page only — pagination via `cursor` is not supported with sampling. Overrides `per_page`. Useful for unbiased explorat |
select | array | OpenAlex top-level field names to return. Always returned: `id`, `display_name` — additional fields you list are appended. A curated default per entity type applies to both searches and single-entity |
filters | object | Filter criteria as field:value pairs. AND across fields (multiple keys). OR within field: pipe-separate ("us|gb"). NOT: prefix "!" ("!us"). Range: "2020-2024". Comparison: ">100", "<50". AND within sa |
per_page | integer | Results per page (1-100). Default 25. Semantic search caps at 50 — when search_mode="semantic", set per_page ≤ 50 (also subject to a 1 req/sec rate limit upstream). |
entity_type | string | Type of scholarly entity to search. |
search_mode | string | Search strategy. "keyword": stemmed full-text (default). "exact": no stemming, matches individual words (use quoted phrases for multi-word exact match). "semantic": AI embedding similarity (max 50 res |
openalex_analyze_trends7 paramsAggregate OpenAlex entities into groups and count them. Use for trend analysis (group works by publication_year), distribution analysis (…
Aggregate 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. Returns up to 200 groups per page — use cursor pagination for fields with many distinct values.
| Parameter | Type | Description |
|---|---|---|
order | string | Sort order for groups. Omit or pass "count" (default) to return the top-N groups by count descending — no further pages. Pass "key" to enumerate all distinct values in key-ascending order with cursor |
cursor | string | Pagination cursor from a previous response. Only relevant when order is "key" — count-descending results have no next page. Pass the next_cursor from the previous response to advance. |
filters | object | Filter criteria (same syntax as openalex_search_entities filters). Narrows the population before aggregation. For full-text within filters, use abstract.search, title.search, or default.search — there |
group_by | string | Field to group by. Works examples: "publication_year", "type", "oa_status", "primary_topic.field.id", "authorships.institutions.country_code", "is_retracted". Authors: "last_known_institutions.country |
per_page | integer | Maximum groups per page (1-200). Default 200 (the upstream cap). A real top-N knob when order is count (the default) — reduce to return only the highest-count groups. |
entity_type | string | Entity type to aggregate. |
include_unknown | boolean | Include a group for entities with no value for the grouped field. Hidden by default. |
openalex_get_citation_graph7 paramsWalk the citation graph one hop from a seed work. Direction picks the edge: incoming citations (`cites`), the seed's own references (`cit…
Walk 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 the common English reading — `cites` returns works that cite the seed; `cited_by` returns works the seed cites. Results use the works schema; combine with filters/sort to narrow further.
| Parameter | Type | Description |
|---|---|---|
sort | string | Sort field. Prefix with "-" for descending. Common: "cited_by_count", "-publication_date". Default is OpenAlex relevance. |
cursor | string | Pagination cursor from a previous response. Pass to get the next page. |
select | array | OpenAlex work field names to return. Always returned: id, display_name. Defaults to the curated works select if omitted. |
filters | object | Additional filters to narrow the graph, same syntax as openalex_search_entities. Example: publication_year=">2020", is_oa="true". Do not include cites/cited_by/related_to — those are set by the `direc |
seed_id | string | Seed work identifier. Accepts OpenAlex ID ("W2741809807"), DOI ("10.1038/nature12373" or full URL), PMID, or PMCID. Use openalex_resolve_name first if you only have a title. |
per_page | integer | Results per page (1-100). Default 25. |
direction | string | "cites": works that cite seed_id (incoming citations). "cited_by": works that seed_id cites (its reference list). "related_to": OpenAlex algorithmically-related works (~8-30 typical, may be empty for |
openalex_describe_fields3 paramsList valid field names for an OpenAlex entity type and context (filter, group_by, or select). Use proactively before constructing a filte…
List 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 guessed field name.
| Parameter | Type | Description |
|---|---|---|
query | string | Optional partial or guessed field name to rank results by similarity. Pass the field you tried (e.g. "funder") to get the closest matches first. Omit to return all fields for the entity_type + context |
context | string | Field usage context. "filter": fields accepted in the filter param. "group_by": fields accepted in group_by — a subset of the filter set (raw date and *.search fields are excluded; they cannot be grou |
entity_type | string | OpenAlex entity type to list fields for. |
Ready-made
Prompts
openalex_literature_reviewGuides a systematic literature search: formulate query, search, filter, analyze citation network, synthesize findings.openalex_research_landscapeAnalyzes the research landscape for a topic: volume trends, top authors/institutions, open access rates, funding sources.