---
summary: "Field-test issue triage — HTML entity decoding, abstract select alias, dense flat format, empty-result echo, semantic per_page guard, framework ^0.7.5"
breaking: false
---

# 0.6.3 — 2026-04-26

Patch release driven by the 0.6.2 field-test pass. Closes six issues with concrete behavior changes plus a framework bump. No tool/prompt API surface changes — all output schemas remain backward-compatible additions (`meta.echo`).

## Added

- **`meta.echo` on `openalex_search_entities` and `openalex_analyze_trends`** — every response carries a compact echo of the input criteria (entity_type, query, filters, sort, search_mode for search; entity_type, group_by, filters for analyze). On empty results, the echo is also surfaced in the human-readable text along with a broadening hint, so an LLM can re-issue a corrected call without backscanning its prior tool call. ([#7](https://github.com/cyanheads/openalex-mcp-server/issues/7))
- **Pre-upstream `per_page ≤ 50` guard for semantic search** in `openalex_search_entities`. Caller-side `invalidParams` is thrown before the OpenAlex round-trip, with a clear message naming the cap. The `per_page` description now cross-references the cap and the 1 req/sec rate limit. ([#8](https://github.com/cyanheads/openalex-mcp-server/issues/8))
- **`select: ["abstract"]` alias** on `openalex_search_entities` for `entity_type: "works"` — input is translated to `abstract_inverted_index` before forwarding to OpenAlex, response is reconstructed back to plaintext `abstract`. Symmetric with the existing output-side normalization. ([#5](https://github.com/cyanheads/openalex-mcp-server/issues/5))

## Changed

- **`openalex_search_entities` flat dense `format()` rendering for nested fields** — replaces the per-field JSON code blocks (`**Field:**\n\`\`\`json\n{...}\n\`\`\``) with one-line dot-notation key:value pairs (`**Primary Topic:** id: T11488, display_name: ..., subfield.id: S26041, subfield.display_name: ..., field.id: F26, ...`). Arrays of objects render one item per line with bracket-indexed prefixes. **Every terminal field is preserved** — `structuredContent` and `format()` stay in parity per the framework's `format-parity` rule; the savings come from formatting density, not from dropping data. Roughly 50–70% smaller per-record output on default-select works queries. ([#9](https://github.com/cyanheads/openalex-mcp-server/issues/9))
- **`openalex_search_entities` sort field description** warns that an explicit `sort` overrides relevance ranking entirely when combined with a keyword `query`. ([#3](https://github.com/cyanheads/openalex-mcp-server/issues/3))
- **`openalex_analyze_trends` cursor description** clarifies that the first page is sorted by count descending; only subsequent (cursor) pages are sorted by key. ([#4](https://github.com/cyanheads/openalex-mcp-server/issues/4))
- Bumped `@cyanheads/mcp-ts-core` `^0.7.4` → `^0.7.5` (non-breaking). Skill resyncs in this release: `add-tool` 1.x adds the "seed orientation context" guidance section; `api-utils`, `design-mcp-server`, `field-test`, `polish-docs-meta`, `setup` carry minor authoring updates from the framework.

## Fixed

- **HTML entity decoding at the service boundary** — `display_name`, `raw_source_name`, autocomplete `hint`, and group-by labels coming back from OpenAlex are now decoded from numeric (`&#38;`), hex (`&#x27E9;`), and named (`&amp;`, `&lt;`, etc.) entities before they reach tool output. Decoder is lenient about the trailing semicolon (real OpenAlex data sometimes returns `&#38 Hepatology` without it — surfaced live during the 0.6.3 field-test). Out-of-range numeric code points pass through unchanged instead of throwing `RangeError`. Entities living in `abstract_inverted_index` keys are also decoded via the reconstructed plaintext. ([#2](https://github.com/cyanheads/openalex-mcp-server/issues/2))

## Closed without code changes

- [#6 — truncate verbose `hint` in `resolve_name`](https://github.com/cyanheads/openalex-mcp-server/issues/6) — closed as won't-fix. `resolve-name` has a fully-typed output schema (no `passthrough`); truncating the `hint` field in `format()` while keeping the full string in `structuredContent` violates `format-parity`. The hint length is intentional disambiguation context.
- [#4 part 1 — trim verbose URL keys in analyze_trends](https://github.com/cyanheads/openalex-mcp-server/issues/4) — closed as won't-fix for the same reason. `key` is a typed terminal field; rendering only the URL tail in `format()` would drop the canonical identifier from the human-readable surface.
