---
summary: "crossref_search_works cursor walks terminate correctly; blank cursor normalized"
breaking: false
security: false
---

# 0.3.3 — 2026-08-06

## Fixed

- **`crossref_search_works`** withholds `nextCursor` on a page with no records instead of relaying Crossref's continuation token indefinitely — a cursor walk now terminates the same way `nextWorksCursor` already does on `crossref_search_journals` / `crossref_search_funders`. [#41](https://github.com/cyanheads/crossref-mcp-server/issues/41)
- The empty-page `notice` now branches on `returned === 0` instead of `totalResults === 0`, naming which of three causes applies: nothing matched, an offset past the end of a matching list, or a completed cursor walk. The prior guard only covered the first case. [#41](https://github.com/cyanheads/crossref-mcp-server/issues/41)
- A blank `cursor` (`""`) is normalized to absent at the top of the handler, so it no longer falls between the offset and cursor paths — `{"cursor": "", "offset": 20}` pages by offset instead of throwing `cursor_offset_conflict`, and `{"cursor": ""}` pages by offset without being reported as a completed cursor walk. [#42](https://github.com/cyanheads/crossref-mcp-server/issues/42)

Seven tests added to `tests/tools/search-works.tool.test.ts` covering the exhausted cursor page, a bounded walk that would spin if the token were relayed, the offset-past-the-end page, the notice reaching `content[]`, the selector sent upstream for a whitespace cursor, the offset pairing, and the notice on an empty blank-cursor page. 247 tests pass; `bun run devcheck` clean.
