---
summary: "Fixes gutenberg_browse_popular enrichment validation, a mirror-URL leak in text_fetch_failed, omitted empty/null fields in formatted output, dropped editors and summaries, unbounded retry ladders, and operator-URL leaks through ctx.log."
breaking: false
security: false
---

# 0.1.8 — 2026-08-22

## Fixed

- **`gutenberg_browse_popular`'s complete results now pass enrichment validation** — the `truncated` trailer branches on the value instead of always claiming truncation, and the complete branch populates `truncated`/`shown`/`cap` through `ctx.enrich`. ([#8](https://github.com/cyanheads/gutenberg-mcp-server/issues/8))
- **`gutenberg_get_text`'s `text_fetch_failed` carries its recovery hint and no longer names the resolved mirror URL** — the message now names the book instead of the request URL, which embeds the operator-configured mirror host. ([#9](https://github.com/cyanheads/gutenberg-mcp-server/issues/9))
- **`gutenberg_get_book` and `gutenberg_search_books` state empty and null fields instead of omitting them** — authors/translators/editors, subjects, bookshelves, and summary render unconditionally (`None`/`Not available`), so a `content[]`-only client can tell a known-empty field from one the server never reported. ([#10](https://github.com/cyanheads/gutenberg-mcp-server/issues/10), [#13](https://github.com/cyanheads/gutenberg-mcp-server/issues/13))
- **`normalizeBook` no longer drops editors or extra summaries** — `editors` reads from the upstream `RawBook.editors` array instead of a hardcoded `[]`, and a new `summaries` field on `Book` and `gutenberg_get_book`'s output carries every summary Gutendex sends, not just the first. ([#11](https://github.com/cyanheads/gutenberg-mcp-server/issues/11))
- **Catalog and text-mirror retry ladders run under a wall-clock budget** — `withUpstreamDeadline` (`src/services/upstream-deadline.ts`) aborts an exhausted ladder into a declared `catalog_unavailable`/`text_fetch_failed` error instead of letting a slow upstream outrun the client's default request timeout. Catalog per-attempt timeout drops to 5s under a 15s ladder budget; the text mirror keeps 30s under a new 35s budget. ([#12](https://github.com/cyanheads/gutenberg-mcp-server/issues/12))
- **`ctx.log` calls in the catalog and text services no longer leak operator-configured base URLs** — cache-hit and fetch logging now pass request parameters (search params, book id, format) instead of the resolved URL, since `ctx.log` mirrors onto the client-visible `notifications/message` stream. ([#14](https://github.com/cyanheads/gutenberg-mcp-server/issues/14))
