---
summary: "Page-based aggregate modes and elections search reach page 2 (#12); election resources surface pagination instead of dropping it (#12); candidate totals sub-fetch pages independently and every cycle renders (#13, #18); itemized next_cursor delimited for text-only clients (#21)"
breaking: false
security: false
---

# 0.4.15 — 2026-07-26

## Added

- **`page` input on aggregate/search modes** — `openfec_search_contributions`, `openfec_search_disbursements`, and `openfec_search_expenditures` accept `page` for their page-based aggregate modes (`by_size`/`by_state`/`by_employer`/`by_occupation`, `by_purpose`/`by_recipient`/`by_recipient_id`, `by_candidate`); itemized mode ignores it and keeps paginating with `cursor`. `openfec_lookup_elections` accepts `page` and `per_page` on both search paths (`/v1/elections/` and `/v1/elections/search/`); summary mode sends neither, since `/v1/elections/summary/` accepts no page parameters. Previously these modes had no way to reach page 2 at all. ([#12](https://github.com/cyanheads/openfec-mcp-server/issues/12))
- **`missing_totals` output field on `openfec_search_candidates`** — names any requested candidate IDs the totals sub-fetch could not cover before hitting its page cap. ([#18](https://github.com/cyanheads/openfec-mcp-server/issues/18))

## Changed

- **`openfec://election/...` resources return `pagination` and a `truncation_notice`** — previously these resources discarded upstream pagination entirely and silently returned only the first page; they now surface the upstream `pagination` object plus a `truncation_notice` naming `openfec_lookup_elections` and its `page` argument when `pages > 1`. ([#12](https://github.com/cyanheads/openfec-mcp-server/issues/12))
- **`openfec_search_candidates` totals sub-fetch pages `/v1/candidates/totals/` on its own terms** — the sub-fetch no longer inherits the candidate search's `page`, since that endpoint is separately paged from the candidate list; it now requests the endpoint's maximum page size (100) and walks its own `pagination.pages`, capped at 5 pages. With `include_totals`, a single-candidate lookup now returns every cycle rather than being capped by the search's `per_page`. ([#18](https://github.com/cyanheads/openfec-mcp-server/issues/18))
- **`openfec_search_candidates` totals formatter groups rows by candidate instead of overwriting** — every cycle now renders per candidate, labelled `— Financial Totals (cycle YYYY) —`; previously the formatter kept only the last totals row seen per candidate ID, so a candidate with multiple cycles lost all but one. ([#13](https://github.com/cyanheads/openfec-mcp-server/issues/13))
- **`openfec_lookup_elections` summary mode renders its pagination trailer** — the trailer is now built before the mode branch, so summary mode emits `_1 result(s) · page 1/1 · 1 per page_` instead of returning before the trailer line. ([#13](https://github.com/cyanheads/openfec-mcp-server/issues/13))
- **`next_cursor` delimited in `content[]`** — `openfec_search_contributions`, `openfec_search_disbursements`, and `openfec_search_expenditures` now render the token wrapped in a code span (`next_cursor:` followed by the backticked token) instead of a bare trailing string, so a text-only client can find its exact end. ([#21](https://github.com/cyanheads/openfec-mcp-server/issues/21))
- **`page` excluded from cursor query identity** — `CURSOR_IDENTITY_EXCLUDES` now also excludes `page` alongside `cursor` and `per_page`, since it addresses the page-based aggregate modes rather than the keyset; varying it between an itemized call and its cursor replay no longer raises `cursor_query_mismatch`.
