---
summary: "SURVEY_CAPABILITIES rebuilt from a live sweep of all 70 BLS surveys, correcting 12 wrong entries and 51 that silently defaulted to no calculation support (#39); bls_get_series now surfaces zero-observation series (#45) and canvas registration failures (#46) instead of returning silently; bls_search_series resolves CW (CPI-W) series (#51)."
breaking: false
security: false
---

# 0.4.9 — 2026-07-17

## Added

- **`canvas_registration_failed`** — new `bls_get_series` `errors[]` reason, thrown as `ServiceUnavailable` when canvas is configured but `CanvasBridge.registerDataframe` fails to register the dataframe. ([#46](https://github.com/cyanheads/bls-labor-mcp-server/issues/46))

## Fixed

- **`SURVEY_CAPABILITIES` rebuilt from a live sweep of all 70 BLS surveys** — the previous 19-entry table had 12 wrong entries (AP, JT, LA, NW, PC, SA, WP under-reported calculation support; CI, EC, IP, MP, PR over-reported), and the other 51 surveys silently defaulted to `allowsNetChange: false, allowsPercentChange: false, hasAnnualAverages: false`. `bls_get_series`'s description and the `calculations` field's `.describe()` now state that requesting calculations never errors — a survey supporting neither type returns `REQUEST_SUCCEEDED` with an informational message, not a rejection. `docs/design.md`'s Known Limitations and Error Contracts sections corrected to match. ([#39](https://github.com/cyanheads/bls-labor-mcp-server/issues/39))
- **Zero-observation `bls_get_series` results were invisible** — a SeriesID returning no observations, or omitted entirely by the observations mirror, is now named in `enrichment.notice` (composed with the canvas-spill notice when both apply). `seriesRequested`'s `.describe()` corrected — `series[].length` cannot be compared against it to detect an empty series. ([#45](https://github.com/cyanheads/bls-labor-mcp-server/issues/45))
- **Canvas registration failures returned `isError: false` with no dataset handle** — `CanvasBridge.registerDataframe` previously swallowed the failure and returned `undefined`. A spilled `bls_get_series` result now always carries a `dataset` handle, or the tool throws `canvas_registration_failed`. ([#46](https://github.com/cyanheads/bls-labor-mcp-server/issues/46))
- **`bls_search_series` couldn't resolve CPI-W series** — added the `cw` survey to the LABSTAT harvest list; `CWUR…`/`CWSR…` SeriesIDs now resolve (7,868 series indexed). Appended to the end of the survey list rather than grouped with `cu`/`ap`, since `SURVEY_ABBRS` indices are encoded in the observations ingester's resume cursor. ([#51](https://github.com/cyanheads/bls-labor-mcp-server/issues/51))
