# Reported issues for fema-mcp-server

Pod holds 17 of 17 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [fema-mcp-server](/mcp/fema-mcp-server).

## Most discussed

### bug(search_nfip): calls that stage nothing still mint a canvas

### Server version

0.1.13

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### Description

With DataCanvas enabled, `fema_search_nfip` calls `canvas.acquire()` before `spillover()`. Without a `canvas_id`, this mints a canvas (a DuckDB instance plus a `CANVAS_MAX_CANVASES_PER_TENANT` slot) that the response exposes only on a spill. An inline result, `no_results`, or an upstream failure before staging leaves that canvas…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/5) · 2026-06-08 · closed · 7 comments

### feat(search_nfip): bound the canvas-disabled inline response by the preview budget

### Use case

With DataCanvas disabled, `fema_search_nfip` returns up to `limit` claims inline and applies no size bound: the default `limit` of 1,000 inlines about 279 KB of claim JSON, and the maximum of 10,000 about 2.8 MB, before the `format()` text. With the canvas enabled, the inline preview is capped at 100,000 characters. A caller on a canvas-disabled deployment gets a response far larger than a model context handles well, with no signal it could have asked for less.

### Proposed…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/37) · 2026-09-24 · closed · 1 comment

### bug(search_nfip): capped spill reports staged rows as total_count

### Server version

0.3.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

When a `fema_search_nfip` spill hits the 50,000-row canvas cap, `total_count` reports the number of staged rows, not the number of matching claims. The field is described as "Total matching claims in the filtered dataset before the limit", and the handler returns `total_count: result.handle.rowCount`.

### Steps to reproduce

1.…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/36) · 2026-09-24 · closed · 1 comment

### bug(search_nfip): cause_of_damage and occupancy_type descriptions misstate the returned codes

### Server version

0.3.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_search_nfip` passes OpenFEMA's `causeOfDamage` and `occupancyType` codes through unchanged. The output schema, though, describes `cause_of_damage` as text (`"Flooding"`, `"Tidal Overflow"`) and `occupancy_type` as `1=Single Family, 2=2-4 Family, 6=Non-Residential`. The `NfipClaims` v3 [data…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/35) · 2026-09-24 · closed · 1 comment

### bug(query_dataset): catalog-listed dataset that 404s gets spelling advice

### Server version

0.2.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_query_dataset` resolves versions from the OpenFEMA dataset catalog, keyed on each entry's `webService` path. A listed dataset whose endpoint returns 404 fails as `unknown_dataset`, with advice to check the name's spelling and case. Two names OpenFEMA serves are also rejected: `OpenFemaDataSets`, the catalog's own documented…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/33) · 2026-09-24 · closed · 1 comment

### bug(assistance,search,query_dataset): paging past the end reports no results with the wrong recovery

### Server version

0.2.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_get_housing_assistance`, `fema_get_public_assistance`, and `fema_search_disasters` throw `no_results` (and `fema_query_dataset` returns a "No records found … check field names and filter syntax" notice) whenever the returned page is empty, even when the upstream total is non-zero because `offset` is past the end. The…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/32) · 2026-09-24 · closed · 1 comment

### bug(search_disasters): date_from/date_to reach OpenFEMA unvalidated

### Server version

0.2.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_search_disasters` declares `date_from` and `date_to` as free `z.string()` and interpolates them into `declarationDate ge '<value>T00:00:00.000Z'`. Any string reaches OpenFEMA. Free text (`yesterday`) is rejected with HTTP 400, which the service maps to `invalid_filter`, a reason this tool doesn't declare, so the caller gets…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/31) · 2026-09-24 · closed · 1 comment

### bug(search_nfip): FimaNfipClaims v2 is deprecated and removed on 2026-10-15

### Server version

0.2.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_search_nfip` reads `FimaNfipClaims` v2 (`fetchNfipClaims` in `src/services/openfema/openfema-service.ts`). OpenFEMA has deprecated that dataset: its data is frozen as of 2026-06-01 and the endpoint is removed on 2026-10-15. The replacement is `NfipClaims` v3 (the `Fima` prefix is dropped). After the removal date every…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/30) · 2026-09-24 · closed · 1 comment

## Most recent

### bug(dataframe_query): declares invalid_query, which the canvas never throws

### Server version

0.3.0

### mcp-ts-core version

^0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_dataframe_query` declares one error reason, `invalid_query`, which the canvas never throws. The reasons the framework's SQL gate and engine actually emit (`invalid_sql`, `missing_table`, `non_select_statement`, `multi_statement`, `denied_function`, `sql_parse_error`, and others) reach the wire undeclared, so none of them…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/38) · 2026-09-24 · open · 0 comments

### bug(query_dataset): OpenFEMA 400 errors misattribute the failing clause and field

### Server version

0.2.0

### mcp-ts-core version

^0.13

### Runtime

Bun

### Runtime version

Bun 1.4.x

### Transport

HTTP (Streamable HTTP)

### Description

`OpenFemaService.fetchDataset` maps every JSON 400 from OpenFEMA to `reason: invalid_filter` with a fixed message, discarding the failing clause (`type`) and the field that OpenFEMA's body names. A bad `select` or `orderby` reads as a `$filter` error, and an Int16 overflow on any field (`fyDeclared`, `yearOfLoss`) reads as an…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/29) · 2026-09-22 · closed · 1 comment

### bug(query_dataset): datasets outside v2 are unreachable — base URL pins /api/open/v2

### Server version

0.1.14

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.3.x

### Transport

HTTP (Streamable HTTP)

### Description

`fema_query_dataset` builds every URL from `FEMA_BASE_URL` (default `https://www.fema.gov/api/open/v2`), but [OpenFEMA](https://www.fema.gov/about/openfema/api) versions each dataset separately: as of 2026-09-24 its catalog lists 49 entities, 34 of them only at v1, v3, or v4. A wrong-version request returns a 404 HTML page,…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/27) · 2026-09-19 · closed · 1 comment

### feat(search_nfip): name fema_dataframe_describe in the canvas spill guidance

### Use case

When `fema_search_nfip` spills to a canvas, the guidance in the response names only `fema_dataframe_query`, so an agent writes SQL against guessed column names, and a wrong one fails `invalid_sql` and costs a turn. The inline rows are no reliable column list either: fields that are null on a row are dropped from it, so a small `limit` can hide a column that the canvas table always has.

### Proposed behavior

Every layer that hands out a canvas names `fema_dataframe_describe`…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/26) · 2026-08-13 · closed · 1 comment

### bug(housing_assistance): format drops a dataset's count when its records page is empty

### Server version

0.1.13

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### Description

`fema_get_housing_assistance` always returns `owners_count` and `renters_count` in `structuredContent`, but `format()` prints each count only in its section header, and a section renders only when its records array is non-empty. Whenever one array is empty, that dataset's count is missing from `content[]`: the zero for a dataset…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/25) · 2026-07-16 · closed · 1 comment

### feat(disaster-resource): add actionable not-found recovery contract

### Use case

`fema://disaster/{disasterNumber}` fails with `NotFound` for a malformed, out-of-range, or unknown disaster number, but declares no error contract, so its errors carry no `reason` and no recovery hint. A `fema_get_disaster` caller hitting the same failure gets a `not_found` reason pointing at `fema_search_disasters`; a resource client gets only the failed number.

Related: #2 (added the Int16 guard to this resource without a recovery hint).

### Proposed behavior

Declare one…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/24) · 2026-07-16 · closed · 1 comment

### bug(assistance): out-of-range disaster numbers bypass tool error contracts

### Server version

0.1.13

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### Description

`fema_get_public_assistance` and `fema_get_housing_assistance` accept a `disaster_number` above OpenFEMA's Int16 ceiling (32767). OpenFEMA rejects the filter with HTTP 400, and the service maps it to `reason: invalid_filter`, a reason neither tool declares, so `ctx.recoveryFor('invalid_filter')` resolves to `{}` and the error…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/23) · 2026-07-16 · closed · 1 comment

### bug(search_nfip): non-spilled limit has no retrieval continuation

### Server version

0.1.13

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.14 (env: `CANVAS_PROVIDER_TYPE=duckdb`)

### Transport

HTTP (Streamable HTTP)

### Description

When `fema_search_nfip` returns fewer claims than match and stages nothing, the rest can't be reached: there is no `offset` and no canvas. That covers canvas-disabled deployments, and canvas-enabled ones when the match fits the inline preview (about 320–350 rows). The order isn't total…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/22) · 2026-07-16 · closed · 1 comment

### bug(search_disasters): disclose 10k area-row cap and continuation

### Server version

0.1.13

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### Description

`fema_search_disasters` deduplicates at most the 10,000 most recent designated-area rows (`OVERFETCH_CAP`). When more rows match, a normal page gives no runtime signal: `total_declarations`, `totalCount`, and the `N of M` header report the window's count as the total, and nothing points to older declarations. Only the static…

[Read the thread](https://github.com/cyanheads/fema-mcp-server/issues/21) · 2026-07-16 · closed · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/fema-mcp-server/issues).
