---
summary: "hn_get_user gains submissionOffset to page through a user's full submission history; hn_search_content gains a compact view that drops duplicated body text; upstream HTTP failures now classify onto a typed reason and recovery hint instead of a raw fetch error."
breaking: false
security: false
---

# 0.5.13 — 2026-07-28

## Added

- **`hn_get_user`** — `submissionOffset` (integer, min 0, default 0) pages through `user.submitted` in windows of `submissionCount`, so histories beyond the first page are reachable. Enrichment echoes the applied `submissionOffset` and either the next offset to request or the valid range when the offset is past the end. [#12](https://github.com/cyanheads/hn-mcp-server/issues/12)
- **`hn_search_content`** — `view: "full" | "compact"` (default `"full"`) controls per-hit body projection. `"compact"` omits `text` and `highlights.text` — the pair that can repeat a long comment body twice per hit — while keeping id, title, url, domain, author, points, comment count, timestamp, parent story, title highlight, and `matchedWords`. The projection is applied before either output surface is built, so `structuredContent` and `content[]` stay equivalent. [#15](https://github.com/cyanheads/hn-mcp-server/issues/15)

## Changed

- **`HnService`** — every fetch site now routes through a shared `getJson` helper wrapped in `withUpstreamHttpErrors`, which rewrites a non-2xx `FetchHttpError` into a classified `McpError` carrying `data.reason` and `data.recovery.hint`. Reasons: `upstream_rejected` (4xx other than 429, `InvalidParams`), `upstream_rate_limited` (429, `RateLimited`), `upstream_unavailable` (5xx, `ServiceUnavailable`). The wrapper sits outside `withRetry`, so retry eligibility, `Retry-After` handling, timeouts, and caller aborts still classify against the framework's original error. The upstream URL and verbatim response body are dropped from the client-facing message and `data`, staying only on the `cause` chain. [#16](https://github.com/cyanheads/hn-mcp-server/issues/16)
- **`parseJsonBody`** — a 200 response whose body is neither an HTML error page nor valid JSON now classifies as `upstream_malformed` (`ServiceUnavailable`) instead of letting a raw `SyntaxError` — which quotes the offending body back at the client — escape uncaught. [#16](https://github.com/cyanheads/hn-mcp-server/issues/16)
- **`hn_get_stories`**, **`hn_get_thread`**, **`hn_get_user`**, **`hn_search_content`** — each tool's `errors[]` contract now declares `upstream_rejected`, `upstream_rate_limited`, `upstream_unavailable`, `upstream_html`, and `upstream_malformed`, matching the reasons `HnService` can now throw.
