openalex-mcp
This server provides eight MCP tools for querying the OpenAlex scholarly graph — searching works, authors, sources, and institutions, plus citation and author-output lookups.
Search scholarly works by query, filtered by year range, author, institution, source/journal, and open-access status, with pagination and sorting.
Fetch a single work by OpenAlex ID, DOI, or PMID, returning metadata, abstract, citation count, open-access links, and topics.
Search authors by name, optionally within an institution, to find disambiguated profiles.
Fetch an author profile by OpenAlex ID or ORCID, with affiliations, work counts, citation counts, and h-index.
Search sources such as journals, repositories, and conferences, with optional type filtering.
Search institutions by name and optional country code to obtain IDs for filtering works.
Find citing works for a given work, enabling forward citation-chaining from a paper to its downstream impact.
List an author's works with year filters and sorting by citation count or publication date.
Click on "Install 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., "@openalex-mcpFind recent works about open access publishing"
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.
openalex-mcp
MCP stdio server for the OpenAlex API (global scholarly graph).
Data via OpenAlex, OurResearch.
What this is for
OpenAlex maps roughly 240 million works and the relations between them, and this is the instrument for questions about circulation rather than content.
Ask who cites a given work and from which countries and institutions; assemble an author's full output across the name variants that defeat a title search; find which institutions cluster around a problem; identify the journals and repositories where a field actually publishes. Open-access status and PDF links come back with each record.
For a historian, the useful move is tracing whether an argument travelled — out of its language, out of its discipline, out of the decade that produced it — which is a question a bibliographic catalogue cannot answer and a citation graph can.
Related MCP server: Crossref Academic MCP Server
Install
Three routes. All three give you the same server; pick by how much you want to see of it.
One click: the Claude Desktop bundle
Download the .mcpb for your platform (Windows x64, Apple Silicon, Linux x64; Intel Macs use the pip route below) from the latest release and open it; Claude Desktop installs it. Claude Desktop asks for OpenAlex API key and Contact email (legacy mailto) and a receipts folder at install time; the key is stored in the OS keychain. The bundle carries every library it needs, but not Python itself: a Python 3.10+ interpreter must be on the machine (python on Windows, python3 on macOS and Linux).
From GitHub, pinned to a release
pip install "git+https://github.com/ckgerteis/openalex-mcp@v2.0.1"
# or, without an environment of your own:
uvx --from "git+https://github.com/ckgerteis/openalex-mcp@v2.0.1" openalex-mcpinstalls the openalex-mcp console script and openalex-mcp-ledger. The tag is the thing to cite; @main gets whatever is current. Then register it in Claude Desktop (below), or let install.py do that.
The whole family
pip install "git+https://github.com/ckgerteis/bibliograph-mcp@v1.0.0" && bibliograph installinstalls all six servers and registers them together — one receipts folder, credentials asked for once. See bibliograph-mcp. From a checkout of this repository, python install.py does the same for this server alone, python install.py --all for the six, on Windows, macOS and Linux; install.ps1 remains for Windows.
From source
python3 -m venv .venv
.venv/bin/pip install .On Windows:
py -3.11 -m venv .venv
.venv\Scripts\pip.exe install .Or straight from the repository, without cloning:
uvx --from "git+https://github.com/ckgerteis/openalex-mcp" openalex-mcpVerify the install:
.venv/bin/python -c "import openalex_mcp; print(openalex_mcp.__version__)"That fails loudly if the package or one of its vendored modules is missing. Do
not use openalex-mcp --help as the check: unknown arguments are ignored, the
server starts, reads end-of-input and exits 0, so it reports success whatever
the state of the code.
Installing more than this one
Six independent packages. None imports another, none depends on another, and
each installs and answers on its own — pip install . in this directory is a
complete install of this server and nothing else.
They do share three things: a response envelope, a query ledger, and — if you
run more than one — a receipts folder. install.ps1 is vendored byte-identical
into all six and handles that on Windows; install.py is its cross-platform port. Both install this server by default, because
cloning one repository is not a request for five more.
.\install.ps1 # this server
.\install.ps1 -All # all six
.\install.ps1 -Servers openalex,cinii # a chosen subsetWhatever subset you name is registered against one receipts folder, asked for
once. The script prefers a sibling checkout to the network, carries across
credentials already registered rather than asking again, leaves servers it was
not asked about alone, and stops rather than guessing where the servers already
registered disagree about the folder or the session slug. It also asserts that
ledger.py and mediation.py are byte-identical across everything it
installed, so two envelope versions cannot end up in one environment unnoticed.
Tools
Tool | Purpose |
| Works (articles, books, datasets, theses) by term, with year, author, institution, source and open-access filters |
| One work by OpenAlex ID, DOI or PMID |
| Authors by name, optionally within an institution |
| One author by OpenAlex ID or ORCID |
| Journals, repositories and conferences by name |
| Institutions by name, optionally by country |
| Works citing a given work, most-cited first |
| An author's works, with year filter and sort |
All eight return one typed JSON response envelope — see Response format. (Releases before 2.0.0 returned formatted markdown text; that is a breaking change, not a formatting preference.)
Response format
Every tool returns one JSON response envelope, built by mediation.py and defined in response-schema.json. Schema version 2.3.0. The same module and schema are vendored byte-identically across the server family, so an envelope from one server can be read by a consumer written for another.
The envelope reports how the search was made, not only what it found:
searched_for— on search operations, the term actually sent, its detected script, and the matching mode, hoisted to the top of the envelope so a relaying client cannot drop it. Lookups (oa_get_work,oa_get_author) and identifier filters (oa_cited_by,oa_author_works) omit it: they were handed an identifier and chose no term.query—input_termsas supplied,normalizedas sent, and the detectedscript. The credential never entersparams.matching_mode—full_text_stemmedfor term searches: OpenAlex matches title, abstract and indexed full text with stemming, soresult.totalis a loose count and a high breadth is expected.filter_exactfor identifier filters;identifier_lookupfor single-record fetches.result.breadth—none,narrow(1–50),broad(51–1000),very_broad(>1000).items[]— the family's item shape. OpenAlex's ownlanguagefield decides which typed title slot a work's title lands in (ja,ko; Latin-script titles in any other language go toen). A CJK title OpenAlex marks neitherjanorko, or a han-only title with no language, is left untyped rather than guessed;extra.titlealways carries the text andextra.languagethe code. OpenAlex identifiers, citation counts, open-access flags, topics and the reconstructed abstract sit inextra; the DOI (bare, without thehttps://doi.org/prefix) inids.doi; the landing page inids.url_en; an open-access copy inids.fulltext_url. Author, source and institution records userecord_typeauthor,sourceandinstitutionwith their metrics inextra.receipt— an ISO 8601 timestamp, a SHA-256 over the normalised query and its parameters, and the DOIs returned. Works without a DOI are identified only inextra.openalex_id, which the receipt'sresult_idsdoes not yet read.attribution— the required credit line, in every response.
Diagnostic codes
Typed and closed. A diagnostic is never prose the client has to parse.
Code | Level | Meaning |
| info | Records returned; nothing to flag. |
| warning | No records for this term and filter set. Non-English titles are indexed as the publisher supplied them, so an English rendering of a Japanese or Korean title may not match. |
| warning | A lookup by identifier answered 404. |
| error | OpenAlex answered 429. Since 2026 OpenAlex meters keyless access by a per-IP daily budget as well as per-second rate; a key raises both. |
| error | The API answered, and answered with an error (or with a 200 that was not JSON). |
| error | The request did not complete. Kept distinct from |
| info | The response was not written to the query ledger, because no receipts destination is configured. |
| warning | A receipts destination is set, the write was attempted, and it did not land. |
Configuration
OPENALEX_API_KEY=your_openalex_api_key
OPENALEX_EMAIL=your_email # legacy; see belowOpenAlex retired the polite pool on 13 February 2026 and replaced it with an API
key regime; the mailto parameter it depended on is now ignored. OPENALEX_API_KEY
is the access route. OPENALEX_EMAIL is kept only as a fallback for anyone running
against a mirror that still honours mailto, and sends nothing OpenAlex reads.
Claude Desktop
Add an entry to %APPDATA%\Claude\claude_desktop_config.json under
mcpServers, pointing at the console script in the environment you installed
into. On macOS or Linux use the absolute path to .venv/bin/openalex-mcp.
{
"mcpServers": {
"openalex": {
"command": "C:\\path\\to\\.venv\\Scripts\\openalex-mcp.exe",
"env": {
"OPENALEX_API_KEY": "your_openalex_api_key"
}
}
}
}Changed in 2.0.0. Tools return the JSON envelope rather than markdown; any consumer that parsed the 1.x text must be rewritten.
Changed in 1.1.0. Earlier versions were registered by path —
"command": "…\\python.exe", "args": ["…\\server.py"]. That entry will not
start this version, because server.py is now a module inside a package rather
than a script beside its imports. Replace it with the console script above.
Restart Claude Desktop. The eight tools should appear under "openalex" in the tool list.
Query receipts
Every envelope can be deposited to an append-only, hash-chained JSONL log by
openalex_mcp.ledger. Since 2.0.0 the envelope says whether that happened: RECEIPT_NOT_DEPOSITED when no destination is set, RECEIPT_WRITE_FAILED when one is set and the write did not land. It is off unless MCP_RECEIPT_DIR (or the legacy MCP_RECEIPT_LOG) is set, and a
logging failure is swallowed rather than raised — a search matters more than
the record of it. Secrets are redacted before a line is composed.
MCP_RECEIPT_DIR=C:\path\to\receipts # a folder, not a file
MCP_RECEIPT_SESSION=project-or-article-slug
MCP_RECEIPT_STRICT=1 # optional: make logging failure raise
MCP_RECEIPT_LOG=C:\path\to\receipts.jsonl # legacy single file; ignored when _DIR is setA folder, and one file per server. MCP_RECEIPT_DIR points at a directory
and each server writes its own <server>.jsonl inside it. That is not tidiness.
Appending is read-the-last-hash-then-write, and the lock around it is a threading
lock, which holds within one process and not between several — six servers are
six processes, and two answering at the same moment will both read the same
predecessor and both claim it. Measured, not theorised: six processes writing 150
lines to one file produced fourteen forks. MCP_RECEIPT_LOG still works and is
still correct for a single server; it is the wrong shape for a family.
install.ps1 sets this up for all six and writes a README into the folder.
Verify one chain, or the whole folder:
openalex-mcp-ledger verify receipts/openalex.jsonl
openalex-mcp-ledger verify-dir receipts
openalex-mcp-ledger manifest receipts # writes receipts/manifest.jsonverify exits non-zero on failure and says which kind it found: a fork
(concurrent writers — a configuration fault, and every line is still there), a
missing line, a reordering, or tamper (a line that does not hash to
its own content). Only the last is a claim about honesty, and reporting them
alike would invite a reader to mistake one for the other. The manifest is the
object to cite: one description of the whole deposit — per-file line counts,
first and last timestamps, terminal hashes, and combined totals by server,
script and session.
Tests
.venv/bin/pip install pytest jsonschema
.venv/bin/python -m pytest -q testsThe suite runs against recorded OpenAlex responses under tests/fixtures/ (captured 2026-09-04) and validates every envelope against response-schema.json; it needs no network and no key. RUN_LIVE=1 adds one request to the live API.
MCP SDK compatibility
Runs on both mcp 1.x and 2.x. Version 2.0.0 of the SDK removed
mcp.server.fastmcp; this server imports FastMCP where it exists and falls
back to MCPServer where it does not.
License
MIT © 2026 Christopher Gerteis. Covers the server code only; it grants no rights over OpenAlex, OurResearch data, which remains governed by that provider's terms.
Author
Dr Christopher Gerteis, SOAS University of London.
Available Tools
8 toolsoa_author_worksBRead-onlyIdempotent
Get all works by a specific author. Supports year filtering and sorting by citation count or publication date.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior, lowering the bar. The description adds that year filtering and sorting by citation count or publication date are supported. However, it says 'all works' but does not disclose that results are paginated via page/per_page, which is a notable behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, under 20 words, with the core action front-loaded. Every clause adds useful information, and there is no wasted text or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema, the description is not fully burdened. It covers the main intent and filtering/sorting capabilities, but misses pagination behavior and required parameter emphasis. An agent could call it correctly after inspecting the schema, but the description alone is only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It partially explains year filtering and sorting, but omits the required author_id format and the pagination parameters (page, per_page). For a tool with six underlying parameters, this is insufficient compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action with a clear resource: 'Get all works by a specific author.' This distinguishes it from siblings like oa_get_work (single work) and oa_get_author (author profile), though it does not explicitly name alternatives or contrast with oa_search_works.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied: use when you need works by a specific author. However, there is no explicit guidance about when to prefer this tool over oa_search_works or oa_get_work, and no exclusions or alternative routing are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_cited_byARead-onlyIdempotent
Get works that cite a specific work. Forward citation traversal for exploring a paper's impact and downstream research.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive behavior. The description adds useful context about traversing forward citations and impact exploration, but does not disclose additional behavioral details such as pagination behavior or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with zero filler. The core action is front-loaded, and the use-case sentence adds meaningful context without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple citation-lookup tool, the description, schema constraints, and output schema provide sufficient context. Annotations cover safety and idempotence, so the tool is readily invocable by an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not explain accepted identifier formats or pagination inputs; it only refers to 'a specific work.' Schema coverage is reported at 0%, so the description needed to compensate but did not, despite the schema having a brief work_id note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb-resource relationship: 'Get works that cite a specific work.' 'Forward citation traversal' further distinguishes it from related work-focused tools like oa_get_work and oa_search_works.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames when to use the tool: 'for exploring a paper's impact and downstream research.' It does not enumerate alternatives or when-not-to-use conditions, but the intended use case is clear and distinguishable from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_get_authorARead-onlyIdempotent
Look up a specific author by OpenAlex ID or ORCID. Returns full profile with affiliations, work count, citation count, and h-index.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds useful context about what the response contains (affiliations, work count, citation count, h-index), but it does not disclose potential edge cases like ORCID format ambiguity or network/rate-limit behavior. This is acceptable given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the operation, the identifier forms, and the key return fields without any redundant filler. Every phrase contributes to correct selection and invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple by-ID lookup with a nested output schema and safety annotations, the description is largely complete. It tells the agent what to pass and what to expect. A minor gap is that the ORCID format is not specified (e.g., bare ID vs. URL), but this is unlikely to prevent correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter author_id is documented in the input schema as an OpenAlex author ID or ORCID, and the description restates this identifier requirement. The description adds no significant new semantic detail beyond the schema, but the schema itself is sufficient for this simple parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Look up'), a specific resource ('a specific author'), and the two accepted identifier forms (OpenAlex ID or ORCID). It also names the returned profile contents, which clearly distinguishes this from the sibling search tools like oa_search_authors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool should be used when the agent already has a concrete OpenAlex ID or ORCID, as opposed to using oa_search_authors for query-based discovery. However, it does not explicitly state when not to use it or name alternative tools, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_get_workARead-onlyIdempotent
Look up a specific work by its OpenAlex ID, DOI, or PMID. Returns full metadata including abstract, citation counts, open access links, and topics.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds return-content information but not additional behavioral traits such as auth needs or rate limits; with annotations present, this is acceptable but not especially rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the lookup action and immediately lists accepted identifiers and key metadata returns. Every clause earns its place, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single required parameter, rich annotations, the presence of an output schema, and a clear statement of what the tool returns, nothing needed for correct invocation is missing. The description is complete for this simple lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the tool description must carry the parameter meaning. It does by specifying that work_id can be an OpenAlex ID, DOI URL, or PMID. Although the schema repeats this, the description ensures the agent knows the accepted identifier formats without opening the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Look up a specific work') and names the exact resource and accepted identifiers (OpenAlex ID, DOI, or PMID). It clearly implies a targeted retrieval operation rather than a search, distinguishing it from sibling tools like oa_search_works.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys that this tool is for looking up one known work by identifier, which is the right context for using it over siblings that search works or look up authors. It does not explicitly state 'use this when you have an ID, not a text query,' but the identifier-focused wording provides clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_search_authorsARead-onlyIdempotent
Search OpenAlex for authors by name. Returns disambiguated author profiles with affiliations, work counts, citation counts, and h-index.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, and non-destructive nature of the tool. The description adds useful behavioral context beyond annotations by explaining that results are disambiguated author profiles and enumerating the key data fields returned, such as work counts and h-index.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler: the action is front-loaded, and the second sentence adds relevant return-value detail. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with annotations and an output schema present, this description covers the essential purpose and result semantics. It could be slightly more complete by noting pagination and the optional institution filter, but those details are already represented in the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description only reinforces the query parameter by saying 'by name' and does not explain page, per_page, or institution_id. With schema description coverage reported at 0%, the description fails to compensate for the lack of parameter documentation, even though the parameter names themselves are somewhat self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Search OpenAlex for authors by name.' It also states what the search returns — disambiguated author profiles with affiliations, work counts, citation counts, and h-index — which clearly distinguishes it from sibling tools like oa_search_works or oa_get_author.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes when to use the tool: when searching for authors by name. It does not explicitly name alternatives or exclusion conditions (e.g., use oa_get_author when a known author ID exists), so it stops short of full routing guidance, but the intended usage is not merely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_search_institutionsARead-onlyIdempotent
Search OpenAlex for institutions (universities, research organizations). Useful for finding institution IDs to use as filters in work searches.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, open-world, idempotent, and non-destructive behavior, so the description does not need to repeat that. It adds context about the OpenAlex data source and intended role, but does not disclose additional behaviors like result shaping or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no filler. The primary action is front-loaded and the second sentence adds a concrete use case, making every word earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is straightforward, has an output schema, and the annotations cover the safety profile, so the description does not need to document return values. It covers source, scope, and purpose; the only minor gap is the absence of explicit sibling tool routing for edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description was expected to compensate for parameter-level guidance, but it only broadly frames the query as institution names. It does not explain country_code, page, or per_page semantics, leaving the agent to rely on the schema alone for parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search OpenAlex for institutions') with concrete examples ('universities, research organizations') and clarifies the downstream purpose (finding institution IDs for work-search filters). This clearly distinguishes it from sibling search tools for works, authors, and sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly identifies when to use the tool—when institution IDs are needed as filters in work searches—without naming sibling alternatives or stating when not to use it. This gives clear context but stops short of explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_search_sourcesARead-onlyIdempotent
Search OpenAlex for sources: journals, repositories, and conferences. Returns work counts, citation data, and open access status.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, open-world, idempotent, non-destructive behavior. The description adds value beyond them by revealing that results include work counts, citation data, and open access status. It does not mention fuzzy matching or pagination quirks, but the output schema and annotations cover much of the operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the action and scope, the second states the return value. The most useful information is front-loaded, and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with rich annotations and an output schema, the description plus structured fields provide enough to invoke it correctly: resource scope, query requirement, optional type filter, pagination bounds, and expected output categories. It could add explicit alternative routing, but is not incomplete enough to mislead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description itself provides no direct parameter guidance for query, type, page, or per_page. However, the schema documents the required query and the type filter values, and the description's list of source types maps naturally onto valid type options. Given the reported 0% schema coverage, the description only partially compensates, though the nested schema keeps this usable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names an explicit action ('Search OpenAlex'), a concrete resource type ('sources'), and enumerates the resource's members ('journals, repositories, and conferences'). It also states the key returned metrics, making it clear this is about source-level scholarly metadata rather than works, authors, or institutions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Search OpenAlex for sources' and the enumeration of source types imply when the tool is appropriate. However, the description does not explicitly say when not to use it or name alternatives like oa_search_works for individual articles, leaving routing to inference rather than explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oa_search_worksARead-onlyIdempotent
Search OpenAlex for scholarly works (articles, books, datasets, theses) across 240M+ records. Supports filtering by year, author, institution, source/journal, and open access status. Returns titles, authors, abstracts, citation counts, DOIs, and topics.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish safety: readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false. The description adds context by indicating scale (240M+ records), supported filter dimensions, and the kinds of fields returned. It does not mention pagination or sorting behavior, but those are documented in the schema and this is a read-only search, so no additional risk disclosure is needed. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff: purpose/scope, filter capabilities, and return fields. The most identifying information is front-loaded, and every sentence adds information not already obvious from the tool name alone.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with a rich input schema and an output schema, the description covers purpose, scope, filters, and expected result fields. It does not explain pagination, sort defaults, or when to prefer sibling tools, but those are either in the schema or penalized in the usage dimension. Overall it gives an agent enough orientation to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema's nested WorkSearchInput provides descriptions for every parameter, including query scope, sort_by options, per_page range, and ID examples for author_id. The description adds only a high-level summary of filter dimensions (year, author, institution, source/journal, open access). Since the schema carries the semantic weight, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search OpenAlex') and a specific resource ('scholarly works'), then narrows scope with content types (articles, books, datasets, theses) and a record count. The resource name 'works' differentiates it from sibling tools that search authors, sources, or institutions, though it does not name those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the general tool for finding scholarly works, but it gives no explicit guidance about when to choose it over siblings like oa_get_work, oa_author_works, or oa_cited_by. There are no conditions, exclusions, or alternative routing hints, so an agent must infer usage from the tool name and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
8 tool updates
v1.1.0- First observed
oa_author_works - First observed
oa_cited_by - First observed
oa_get_author - First observed
oa_get_work - First observed
oa_search_authors - First observed
oa_search_institutions - First observed
oa_search_sources - First observed
oa_search_works
TDQS
Each tool targets a distinct resource and action: search vs. get for works/authors, search for sources/institutions, plus two relationship queries (cited_by and author_works). No two tools overlap in purpose, and the descriptions make the boundaries clear.
Most tools follow a consistent oa_<verb>_<entity> pattern (oa_search_works, oa_get_work, oa_search_authors, oa_get_author, oa_search_sources, oa_search_institutions). However, oa_cited_by and oa_author_works deviate from this pattern, using a noun-preposition and noun-noun structure respectively, though they remain interpretable.
Eight tools is well-scoped for a read-only academic search API. The set covers the primary entity types (works, authors, sources, institutions) and two citation/author relationship queries without unnecessary bloat or excessive minimalism.
The surface is nearly complete for read-only exploration: search and get for works/authors, search for sources/institutions, plus citation and author-works traversal. Minor gaps include lack of get-by-ID tools for sources and institutions, and no concept/related-entities endpoints, but these are not core to the apparent purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
OpenAlex MCP — wraps the OpenAlex API (scholarly works, free, no auth)
MCP server for Altmetric APIs - track research attention across news, policy, social media, and more
Scholarly search: OpenAlex, Crossref, arXiv, OpenCitations and PubMed in one endpoint.
Auditable MCP server for PubMed, Europe PMC, ClinicalTrials.gov, and bioRxiv/medRxiv queries
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for verifying academic citations via Semantic Scholar, OpenAlex, and CrossRef.1MIT
- AlicenseAqualityDmaintenanceMCP server enabling AI agents to search and retrieve scientific papers, citations, and author profiles from Crossref, OpenAlex, and Semantic Scholar with no API keys required.53MIT
- AlicenseAqualityDmaintenanceMCP server for the OpenAlex scholarly database, providing AI agents with tools to search and retrieve academic works, authors, and institutions via natural language queries.8MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for academic research using the OpenAlex API, enabling article search, details retrieval, and author profile lookup.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ckgerteis/openalex-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server