# Reported issues for openalex-mcp-server

Pod holds 14 of 14 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [openalex-mcp-server](/mcp/openalex-mcp-server).

## Most discussed

### bug(search_entities, resolve_name, citation_graph): uppercase ID schemes and PubMed URLs pass through to OpenAlex verbatim and 404

### Server version

0.7.9

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### OS

Linux (Docker)

### Description

`openalex_search_entities` (`id`), `openalex_resolve_name`, and `openalex_get_citation_graph` (`seed_id`) forward two common identifier spellings to OpenAlex verbatim, and OpenAlex answers 404 for both even though the work exists:

| Input | Sent to OpenAlex | Result |
|:---|:---|:---|
| `PMID:21491125` /…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/66) · 2026-08-25 · closed · 4 comments

### bug(search_entities, resolve_name, citation_graph): PMCID is advertised as an accepted identifier but resolves for no work

### Server version

0.7.11

### mcp-ts-core version

^0.12.7

### Runtime

Node.js

### Runtime version

Node 24

### Transport

HTTP (Streamable HTTP)

### OS

macOS

### Description

`PMCID` is listed as an accepted identifier on `openalex_search_entities` (`id`), `openalex_resolve_name` (`query`), and `openalex_get_citation_graph` (`seed_id`), and in the matching README bullets. No PMCID resolves — [OpenAlex](https://openalex.org) indexes none, so every `pmcid:` lookup is a guaranteed…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/67) · 2026-09-09 · closed · 2 comments

### feat(config): declare stateless session mode in createApp() — blocked on mcp-ts-core#376

### Use case

`Dockerfile` sets `ENV MCP_SESSION_MODE="stateless"`; every other launch path (`bunx`, `npm start`, a local checkout with no `.env`) gets none of that and falls through to the framework schema default, `auto`, which resolves to `stateful`. The hosted deployment (Docker) runs stateless today, confirmed by the absence of an `Mcp-Session-Id` response header on `initialize`. Source and every non-Docker launch path still disagree with it.

`.env.example` was already corrected in…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/65) · 2026-08-22 · open · 2 comments

### feat(search_entities): alias summary_stats leaves (h_index, i10_index) so bibliometric selects resolve

### Use case

`select: ["h_index"]` on `authors` fails, and nothing in the failure says where `h_index` actually lives. It is real OpenAlex data at `summary_stats.h_index`, but `select` only projects top-level fields, so the caller has to already know the parent object to reach the leaf.

The rejection lists every valid `authors` field. `summary_stats` is in that list, but nothing connects it to `h_index` — the caller sees 21 names, none resembling what they asked for:

```
h_index is not a…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/64) · 2026-07-30 · closed · 2 comments

### bug(describe_fields): query path drops zero-similarity fields, hiding the parent of a nested leaf

### Server version

0.7.10

### mcp-ts-core version

^0.12.5

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

http

### Description

`openalex_describe_fields` exists so a caller who guessed a field name can find the real one. Its `query` path fails hardest on exactly that case: `rankFields` drops every candidate scoring `0`, so a field with no lexical overlap with the query is omitted from `fields` while `total` still counts it.

`h_index` is real OpenAlex author data — it…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/63) · 2026-07-30 · closed · 2 comments

### bug(enrichment): list responses hide the upstream 100-author cap

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

A works list returns only the first 100 authorships of a large collaboration without indicating that the author/affiliation data is partial. The same work's singleton lookup returns the full list.

### Steps to reproduce

Call `openalex_search_entities` with:

```json…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/73) · 2026-09-09 · open · 1 comment

### bug(output): large records exceed context limits without bounded retrieval

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Page-size and top-level field selection do not bound response size. One requested field on one work can exceed two megabytes per response surface.

Related: #29 (curated defaults; full-record and explicit-field requests remain unbounded).

### Steps to reproduce

Call `openalex_search_entities`:

```json…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/72) · 2026-09-09 · open · 1 comment

### bug(text): markup and scientific entities survive normalization unescaped

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Text normalization decodes only six named HTML entities, leaves HTML/JATS markup intact, and interpolates provider strings directly into Markdown. Scientific named entities and literal formatting characters therefore do not survive as readable plain text consistently across clients.

Related: #2 (numeric/hex and…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/76) · 2026-09-09 · open · 0 comments

## Most recent

### feat(analyze_trends): label numeric unknown buckets explicitly

### Use case

APC distributions expose OpenAlex's numeric missing-value sentinel as if it were a real negative amount. The caller needs to distinguish unknown charges from measured values before comparing publication costs.

### Proposed behavior

Preserve the provider key for round-tripping, but label or annotate numeric unknown buckets explicitly on both response surfaces. Document `include_unknown` semantics for numeric groupings.

### Evidence

On v0.7.12, call `openalex_analyze_trends`:…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/75) · 2026-09-09 · open · 0 comments

### bug(pagination): exhausted pages receive no-match recovery advice

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Empty terminal pages are presented as queries with no matches, despite nonzero totals and a cursor showing that earlier pages were already consumed.

Related: #7 (true-empty query notices).

### Steps to reproduce

1. Search `{"entity_type":"publishers","query":"Elsevier","per_page":2}`. It returns two records and a…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/74) · 2026-09-09 · open · 0 comments

### bug(search_entities): semantic pagination and input limits are silent

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Semantic search accepts a cursor but drops it, exposes no page input, and reports its 50-result candidate cap as a total without explaining the limit.

Related: #8 (per-page cap only).

### Steps to reproduce

Call `openalex_search_entities`:

```json
{"entity_type":"works","query":"Estimating groundwater recharge…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/71) · 2026-09-09 · open · 0 comments

### bug(filters): alias collisions silently overwrite constraints

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

`translateFilters()` maps aliases into an object with last-write-wins behavior. Two declared constraints can collapse into one while the response echoes both as applied.

Related: #17 (alias introduction).

### Steps to reproduce

Call `openalex_search_entities` with `entity_type:"works"`, `per_page:1`,…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/70) · 2026-09-09 · open · 0 comments

### bug(validation): blank inputs become unfiltered successful queries

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Explicitly empty search and aggregation inputs are silently omitted instead of rejected. An empty aggregation field can turn an upstream list response into a successful empty aggregation.

### Steps to reproduce

Call:

- `openalex_search_entities`: `{"entity_type":"works","id":"","per_page":1,"select":["id"]}`.
-…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/69) · 2026-09-09 · open · 0 comments

### bug(identifiers): returned keyword URLs fail to resolve

### Server version

0.7.12 (`8d6339b`)

### mcp-ts-core version

0.12.7

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Keyword IDs returned by `openalex_search_entities` cannot round-trip into its own ID lookup or `openalex_resolve_name`.

Related: #50 (numeric native-ID routing; keyword IDs use a path and slug).

### Steps to reproduce

1. Search: `{"entity_type":"keywords","query":"groundwater","per_page":1}`. The returned ID is…

[Read the thread](https://github.com/cyanheads/openalex-mcp-server/issues/68) · 2026-09-09 · open · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/openalex-mcp-server/issues).
