---
summary: "Citation-graph seed validation and reserved-filter-key rejection; recover truncated upstream 400 messages; true population count under sample."
breaking: false
security: false
---

# 0.6.12 — 2026-05-20

## Fixed

- **`openalex_get_citation_graph` seed validation** ([#20](https://github.com/cyanheads/openalex-mcp-server/issues/20)) — non-existent `seed_id` silently returned empty results, indistinguishable from a valid seed with zero edges. Always issue a singleton `/works/{id}` lookup before walking the graph: bad seeds surface as `NotFound` (`entity_not_found`), good seeds with empty graphs return honest empty results. Removes the W-ID skip path that bypassed validation.
- **`openalex_get_citation_graph` reserved filter keys** ([#21](https://github.com/cyanheads/openalex-mcp-server/issues/21)) — `cites`/`cited_by`/`related_to` passed in `filters` were silently dropped but still echoed in `meta.echo`, so callers debugging "why isn't my filter narrowing" saw confirmation their filter applied when it hadn't. Pre-check rejects the reserved key with `InvalidParams` (`reserved_filter_key`) before hitting upstream. `filters` arg description restated to name `direction` as the owner.
- **`parseOpenAlexErrorBody` truncated upstream messages** ([#19](https://github.com/cyanheads/openalex-mcp-server/issues/19)) — the framework caps `responseBody` at 500 bytes; OpenAlex 400s enumerating valid field names exceed that, so strict `JSON.parse` failed on the truncated tail and the useful prefix was dropped (callers saw only `Status: 400`). Regex fallback now extracts the leading `error`/`message` fields from a truncated body. A new `stripTruncatedValidFieldsList` drops the alphabetically-cut "Valid fields are: …" enumeration so agents don't mistake the early-alphabet prefix for the full set; raw upstream stays on `data.upstreamMessage` for debugging.
- **`meta.count` under `sample`** — sampled searches returned the sample size as `count`, contradicting the output schema's "Total results matching the query/filters" contract. Issue a parallel `per_page=1` lookup without `sample`/`seed` and overwrite `count` with the true population.

## Changed

- **`openalex_get_citation_graph` description** ([#22](https://github.com/cyanheads/openalex-mcp-server/issues/22)) — dropped the "thin wrapper over `openalex_search_entities` scoped to works — exposes the direction explicitly so callers do not have to know the underlying filter names" sentence. Implementation leak plus consumer-aware phrasing; the surrounding sentences carry the meaning.
