---
summary: "ntfy_fetch_messages returns the newest window, single-message id fetches skip truncation, priority validation collapses to one error, and emoji-tag search pages past its cap"
breaking: false
security: false
---

# 2.2.1 — 2026-07-29

## Changed

- **`ntfy_fetch_messages`** keeps the newest `limit` messages of a matched window instead of the oldest, matching `ntfy://{topic}`; results stay listed oldest-first within the kept window, and the truncation notice now states the counts kept and dropped. ([#22](https://github.com/cyanheads/ntfy-mcp-server/issues/22))
- **`PrioritySchema`** on `ntfy_publish_message` and `ntfy_fetch_messages` collapsed from a five-branch `z.union([z.literal(1..5)])` to a single `z.int().min(1).max(5)` node — one `{ type: 'integer', minimum: 1, maximum: 5 }` JSON Schema entry instead of five, and an out-of-range value now fails with one message instead of an `invalid_union` dump. ([#21](https://github.com/cyanheads/ntfy-mcp-server/issues/21))
- **`ntfy_search_emoji_tags`** gained `offset` (default 0); `EmojiTagService.search` slices `[offset, offset + limit)` and the `truncated` notice now names the next `offset` to page with, plus a dedicated notice when `offset` overshoots the match count. ([#18](https://github.com/cyanheads/ntfy-mcp-server/issues/18))

## Fixed

- **`shapeMessage`** (`src/services/ntfy/message-shape.ts`) takes an opt-out `truncateBody` option; `ntfy_fetch_messages` calls with `truncateBody: false` when a request is pinned to one message by `id`, returning that message's full body instead of the ~500-char list cap. ([#17](https://github.com/cyanheads/ntfy-mcp-server/issues/17))
