openalex-mcp-server

SSE

by cyanheads

6.5k downloads Not rated yet

About

270M+ academic publications Browse Openalex MCP Server for Claude, Cursor, VS Code, and other AI agents.

Details

Transport
SSE

Explore

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name openalex-mcp-server
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

openalex_resolve_name

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.

openalex_search_entities

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 ov…

openalex_analyze_trends

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.

openalex_get_citation_graph

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.

openalex_describe_fields

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.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "openalex-mcp-server": {
            "server": {
                "command": "node",
                "args": [
                    "run",
                    "start:stdio",
                    "@cyanheads/openalex-mcp-server"
                ],
                "env": {
                    "OPENALEX_API_KEY": "",
                    "OPENALEX_MAILTO": "",
                    "OPENALEX_BASE_URL": "",
                    "MCP_LOG_LEVEL": ""
                }
            }
        }
    }
}

McpServers

{
    "server": {
        "command": "node",
        "args": [
            "run",
            "start:stdio",
            "@cyanheads/openalex-mcp-server"
        ],
        "env": {
            "OPENALEX_API_KEY": "",
            "OPENALEX_MAILTO": "",
            "OPENALEX_BASE_URL": "",
            "MCP_LOG_LEVEL": ""
        }
    }
}

Transport

"stdio"

Package

"@cyanheads/openalex-mcp-server"

Registry

"npm"

Public Hosted Server:https://openalex.caseyjhand.com/mcp

Five tools for querying theOpenAlexacademic research catalog:

Primary discovery and lookup tool. Covers all OpenAlex entity types (works, authors, sources, institutions, topics, keywords, publishers, funders).

- Retrieve a single entity by ID (OpenAlex ID, DOI, ORCID, ROR, PMID, PMCID, ISSN).idtakes precedence: search criteria passed alongside it are not applied, and the response says which ones were dropped rather than echoing them back as though they ran. The search-only validations (semantic page cap,samplewithcursor,seedwithoutsample) are skipped too — a lookup is never rejected over parameters it ignores
- Keyword search with boolean operators, quoted phrases, wildcards, and fuzzy matching
- Exact and AI semantic search modes
- Rich filter syntax: AND across fields, OR within fields (us|gb), NOT (!us), ranges (2020-2024), comparisons (>100)
- Sensible default field selection per entity type, applied to both searches and ID lookups — prevents oversized responses; passselectto choose fields, or
[""]for the full record
- Invalidselectfield names produce an error listing the valid fields for that entity type
- Formatted MCP output is a generic markdown renderer — every returned field is surfaced without per-entity-type hard-coding
- Cursor pagination and up to 100 results per page;sorttakes a single key or a comma-separated list, with the-descending prefix applied per key
- display_nameis nullable — OpenAlex holds no title for paratext and other untitled records, which pass through instead of failing the whole page

Aggregate entities into groups and count them for trend, distribution, and comparative analysis.

- Group by any supported field (publication year, OA status, institution, country, topic, etc.)
- Combine with filters to scope the population before aggregation
- Up to 200 groups per page with cursor pagination
- Supportsinclude_unknownto show entities with no value for the grouped field

The front door for turning anything you have into an OpenAlex ID.Always use this before filtering by entity— names are ambiguous, IDs are not.

- A name or partial name runs an autocomplete search: up to 10 matches with disambiguation hints, ~200ms
- An identifier resolves deterministically to the single record it addresses — OpenAlex ID, DOI, ORCID, ROR, PMID, PMCID, or ISSN, bare or in URL form. Noentity_typeneeded: the identifier determines its own
- An identifier that matches nothing returns an empty result naming the scheme, not name-search advice
- Optional entity type filter and field-level filters, applied to name queries

One-hop citation graph traversal from a seed work. Wraps the OpenAlexcites/cited_by/related_tofilters behind an explicitdirectionargument 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)
- Accepts OpenAlex IDs, DOIs, PMIDs, PMCIDs asseed_id; validates the seed via a singleton/works/{id}lookup before walking, so non-existent seeds surface asNotFound
- Stacks withfilters/sort/selectto narrow the graph (e.g.,publication_year=">2020",is_oa="true")

Discover valid field names before constructing a query — avoids invalid-field 400 errors. Backed by a catalog generated from OpenAlex's own field validation.

- List valid fields for any entity type and context (filter,group_by, orselect)
- group_byreturns the subset of thefilterset OpenAlex can aggregate — raw date fields,
.searchoperators, andfrom_/to_range modifiers are excluded
- Passquery(a partial or guessed name) to rank results by name similarity — surfaces the right field when you only know roughly what you want
- Complements the ranked "did you mean" suggestions now appended to invalid-field errors on the search, trends, and citation-graph tools

- Declarative tool definitions — single file per tool, framework handles registration and validation
- Unified error handling across all tools
- Pluggable auth (none,jwt,oauth)
- Swappable storage backends via the framework (not currently used by this server)
- Structured logging with optional OpenTelemetry tracing
- Runs locally (stdio/HTTP) or in Docker from the same codebase

- Typed API client with automatic ID normalization (DOI, ORCID, ROR, PMID, PMCID, ISSN, OpenAlex URLs)
- Abstract reconstruction from inverted indices — plaintext instead of OpenAlex's position-keyed encoding
- HTTP status codes mapped to specific MCP error classes (400 → InvalidParams, 422 → ValidationError, 429 → RateLimited, etc.) with upstream messages surfaced
- Every API-calling tool reports what the call spent against the OpenAlex daily budget and what is left of it, so a paginated sweep can be priced before it runs instead of ending in a 429. An account holding prepaid balance sees that too, since it keeps serving once the day's allowance is gone
- Timeout-aware request retries and cancellation support viaAbortSignal

A public instance is available athttps://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-openalex-api-key" } } } }

OPENALEX_API_KEYis optional — set it to a freeOpenAlex account keyfor keyed rate limits and budget under OpenAlex's usage-based pricing, or omit it for anonymous access. SetOPENALEX_MAILTOto an email if you want to identify yourself to OpenAlex (thepolite pool).

git clone https://github.com/cyanheads/openalex-mcp-server.git
bun run build bun run start:http # or start:stdio
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

SeeCLAUDE.mdfor development guidelines and architectural rules. The short version:

- Handlers throw, framework catches — notry/catchin tool logic
- Usectx.logfor logging,ctx.statefor storage
- Always resolve names to IDs viaopenalex_resolve_namebefore using them in filters

Issues and pull requests are welcome. Run checks before submitting:

Access Wolfram Alpha's computational knowledge engine for expert-level answers and data analysis.

Multimodal RAG for source-backed AI answers

An intelligent tutoring server that uses GitHub documentation repositories to provide structured educational prompts and tools.

Validate DOIs against a real citation database, format references in 2900+ CSL styles (APA, IEEE, Chicago, Nature, etc.), and catch hallucinated academic references before they reach your paper or documentation or pitch deck. Manage citation collections, import/export BibTeX, and batch-process references. 29 tools.

A server to manage studies, recruit participants, and collect data on the Prolific platform.

UK property data: crime stats, schools, demographics, valuations, comparables, Ofsted ratings

Real-time salary data, job market trends, resume review, interview prep, and career advice for the Russian IT market. Powered by hh.ru API.

Real-time Amazon data API built for AI agents. 200M+ products, 1B+ reviews, live BSR, pricing, and competitor data as clean JSON. 10 agent skills for market research, competitor monitoring, pricing, listing audits, and more. 1,000 free credits.

Get access to Kaggle's datasets, models, competitions, notebook and benchmarks.

An MCP (Model Context Protocol) server for searching and analyzing academic papers across multiple databases (Semantic Scholar, Crossref, OpenAlex, PubMed), with regex-powered filtering and statistical analysis.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.