---
summary: "census_resolve_geography now resolves metro/micro and combined statistical areas plus consolidated cities (#22), and takes a county_fips input to pin an ambiguous tract to one county (#20)"
breaking: false
security: false
---

# 0.2.0 — 2026-07-31

## Added

- **`geography_type`** gains three values on `census_resolve_geography` — `metropolitan statistical area/micropolitan statistical area` (`TIGERweb/CBSA/MapServer` layers 3+4, 5-digit `GEOID`), `combined statistical area` (`TIGERweb/CBSA/MapServer` layer 0, 3-digit `GEOID`), and `consolidated city` (`TIGERweb/Places_CouSub_ConCity_SubMCD/MapServer` layer 3, 5-digit `CONCITY`) — each named exactly as the Census API names the level, so a resolved `geography_type` feeds `census_query_data`'s `geography_level` unchanged. Metropolitan and micropolitan areas are one Census level split across two layers, so both are queried and merged. ([#22](https://github.com/cyanheads/census-mcp-server/issues/22))
- **`county_fips`** input on `census_resolve_geography` — 1 to 3 digits, zero-padded to the 3 TIGERweb stores, applied as `AND COUNTY='NNN'` on the county and tract layers to pin an ambiguous tract name to one county. ([#20](https://github.com/cyanheads/census-mcp-server/issues/20))
- **`county_scope_unsupported` error reason** — pairing `county_fips` with a street address, or with a `geography_type` (set or auto-detected) that carries no `COUNTY` field, is a validation error thrown before any network call, rather than a scope silently dropped.
- **`fipsSummary`** on every `ambiguous_name` candidate — the value resolving that candidate would have returned, so an ambiguity can be acted on without a second call.

## Changed

- **`state_fips`** is omitted from `census_resolve_geography`'s output for `metropolitan statistical area/micropolitan statistical area` and `combined statistical area` — those levels can span multiple states and take no `parent_fips`. The four previously-supported levels (`state`, `county`, `place`, `tract`) are unaffected and still return it.
- **CBSA and CSA name matching** scopes by state through the row name rather than a `WHERE` clause — those layers carry no `STATE` field, so a state suffix is matched against the hyphenated state list every row's `NAME` ends in: `"Kansas City, MO"` and `"Kansas City, KS"` both resolve to CBSA `28140`, and `"Aberdeen, WA"` returns only the Washington micro area rather than also matching South Dakota's.
- **Tract `ambiguous_name` recovery** now points back at re-calling `census_resolve_geography` with `county_fips` set to the county of the candidate wanted, instead of forwarding to `census_query_data`.
- **`census_list_datasets`** descriptions for `cbp`, `ecnbasic`, and `nonemp` now name every geography level `census_resolve_geography` reaches for that dataset (state, county, and now CBSA/CSA/consolidated city where the dataset publishes them) instead of stopping at state and county.

Tests: `tests/services/geography/geography-service.test.ts` and `tests/tools/census-resolve-geography.tool.test.ts` cover the three new levels, `county_fips` scoping and its validation error, `fipsSummary` on ambiguous candidates, and the state-in-name filter for CBSA/CSA. `tests/tools/census-list-datasets.tool.test.ts` covers the updated dataset descriptions.
