---
summary: "worldbank_get_poverty answers PIP's World, regional, income-group, and lending-group aggregates at any poverty line, accepts ISO2 and model-estimate-only codes, and resolves MRV to PIP's latest estimate year by default. Tools now keep the service's error data on re-throw."
breaking: true
security: false
---

# 0.4.0 — 2026-09-25

## Added

- **`worldbank_get_poverty` serves PIP's aggregates from `/pip-grp`** ([#52](https://github.com/cyanheads/worldbank-mcp-server/issues/52), [#58](https://github.com/cyanheads/worldbank-mcp-server/issues/58)): `WLD`, the World Bank regions (`SSF`, `EAS`, `AFE`, …), income groups (`HIC`, `LIC`, `LMIC`/`LMC`, `UMIC`/`UMC`), and lending groups (`IDX`, `IDB`/`BLND`, `IBD`/`IBRD`, `REST`), merged with economy rows in one paged list. Aggregate rows carry `isAggregate: true` and `popInPoverty`, and their `estimationType` is `actual`, `nowcast`, or `projection`.
- **New `worldbank_get_poverty` rejections, thrown before any data request:** `ambiguous_aggregate` for WDI's IDA total (`IDA`, `XG`), `unserved_aggregate` for FCV/PovcalNet groupings and `MIC`/`LMY`, and `aggregate_filter_conflict` for `welfare_type` or `reporting_level` beside an aggregate.
- **ISO2 codes on `worldbank_get_poverty`** ([#53](https://github.com/cyanheads/worldbank-mcp-server/issues/53)) resolve through the World Bank country index (`NG` → `NGA`, `ZG` → `SSF`), and `appliedFilters.countries` echoes the codes as queried. The index backs a new `WorldBankApiService.lookupCountry`.
- **Economies PIP publishes only as model estimates** (`AFG`, `GUM`) are answered from one `country=all` request instead of failing `country_not_found` ([#57](https://github.com/cyanheads/worldbank-mcp-server/issues/57)). With `fill_gaps: false` they return no rows, and a notice says why.
- **`limit` is accepted as an alias for `per_page`** on every tool that pages ([#47](https://github.com/cyanheads/worldbank-mcp-server/issues/47)). The advertised `inputSchema` is unchanged.

## Changed

- **Breaking: `worldbank_get_poverty` output fields `regionCode`, `regionName`, `reportingLevel`, `welfareType`, and `isInterpolated` are nullable**, and are `null` on aggregate rows. `isAggregate` and `popInPoverty` are new fields on every row.
- **Breaking: `year: "MRV"` follows `fill_gaps`** ([#40](https://github.com/cyanheads/worldbank-mcp-server/issues/40)). With the default `fill_gaps: true`, each economy resolves to PIP's latest estimate year rather than its latest survey year, and a notice points to `fill_gaps: false`, which keeps the old reading. An aggregate resolves to its newest year.
- **Breaking: the `invalid_parameter` recovery is chosen per throw** ([#55](https://github.com/cyanheads/worldbank-mcp-server/issues/55)). It points a parameter at the message's values only when the message lists them, and otherwise at the parameter's description.
- **`worldbank_search_projects` gives an upstream 4xx its own recovery** ([#38](https://github.com/cyanheads/worldbank-mcp-server/issues/38)), naming the `query` characters the Projects API refuses. A 5xx keeps the retry-once recovery.
- **`WORLDBANK_CATALOG_CACHE_TTL_MS` also covers** PIP's regions table and economy list, and the country index behind poverty ISO2 codes.

## Fixed

- **Re-thrown service errors keep the service's `data`** ([#38](https://github.com/cyanheads/worldbank-mcp-server/issues/38)). `retryable`, `status`, `detail`, `parameters`, `availablePppVersions`/`releaseVersion`, and `page`/`perPage` now reach the client from every tool and resource that re-throws one, so the text ends `· not retryable` where the service set it.
- **A `year` outside PIP's coverage names the accepted span** (`year accepts all, MRV, 1963–2026`), read from the whole 404 body ([#55](https://github.com/cyanheads/worldbank-mcp-server/issues/55)). Quoted lists are also carried in `data.acceptedValues`.
- **One caller cancelling no longer fails every concurrent request that shares a reference load** ([#61](https://github.com/cyanheads/worldbank-mcp-server/issues/61)). The load runs under its own timeout-bounded signal, and a cancelled caller rejects alone.

## Dependencies

- `@socketsecurity/bun-security-scanner` ^1.1.2 → ^1.1.3 (dev)
