# Reported issues for cdc-health-mcp-server

Pod holds 18 of 18 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 [cdc-health-mcp-server](/mcp/cdc-health-mcp-server).

## Most discussed

### bug(cdc_query_wonder): relational input errors bypass consistent recovery

### Server version

0.9.1

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

Three errors that can be caught from the input alone slip past `cdc_query_wonder`'s declared `invalid_query` contract:

- A reversed `year_range` fails a Zod `.refine()` during argument parsing, returning `invalid_arguments` (-32602) instead of `invalid_query` with its recovery.
- A repeated `group_by` dimension…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/41) · 2026-08-11 · closed · 3 comments

### bug(cdc_query_wonder): caveat and message links lose their destinations

### Server version

0.9.1

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 27.0

### Description

CDC WONDER caveats and messages end in a "More information." link to the methodology behind them. `cleanText()` in `xml-parser.ts` strips every tag before decoding, so the anchor text survives and the `href` is gone from both `structuredContent` and `content[]`. On a D158 response, 7 of 8 caveats and the "Totals…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/40) · 2026-08-11 · closed · 3 comments

### feat(cdc_get_dataset_schema): make wide schemas selectively retrievable

## Use case

A caller needs the schema to construct a SoQL query, but some CDC datasets expose hundreds of columns. `cdc_get_dataset_schema` and `cdc://datasets/{datasetId}` currently return every column and description in one response, with no selector or continuation path.

For `ua7e-t2fy` (Weekly Hospital Respiratory Data), the live schema holds 322 columns. Replaying the tool's own transform against that live payload measures ≈104,214 bytes of `structuredContent` and ≈92,650 bytes of…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/38) · 2026-08-11 · closed · 3 comments

### bug(cdc_query_dataset): an offset past the end reads as a filter or spelling problem

### Server version

0.9.0

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

An empty page at `offset > 0` gets the same notice as a query that matched nothing: check spelling, check filter types, broaden the WHERE clause. `format()` renders the same suggestions into `content[]`. A caller who paged past the end of a real result set is sent after a filter problem that does not exist. The SODA data endpoint…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/54) · 2026-09-20 · closed · 2 comments

### feat(cdc_query_wonder): age_groups cannot select the Not Stated group WONDER returns

`age_groups` on `cdc_query_wonder` exposes the eleven ten-year groups (`1` … `85+`) but omits `NS` (Not Stated), the twelfth value the ten-year-age variable accepts. Deaths whose age was not recorded therefore cannot be included in a filtered query, and there is no way to ask for them on their own.

The value is present on every mortality database the tool reaches — the `.V5` option list is identical across all five:

```
*All*, 1, 1-4, 5-14, 15-24, 25-34, 35-44, 45-54, 55-64, 65-74, 75-84,…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/35) · 2026-08-09 · closed · 2 comments

### bug(cdc_get_dataset_schema): unescaped column descriptions break the formatted table

### Server version

0.8.0

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

The `format()` in `src/mcp-server/tools/definitions/get-dataset-schema.tool.ts` interpolates `col.description` straight into a markdown table cell. Socrata column descriptions carry raw newlines and can carry pipes, so a single such column terminates its table row and everything after it renders as loose text.…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/24) · 2026-08-09 · closed · 2 comments

### bug(cdc_query_dataset): the 200,000-char budget bounds rows once, but the response serializes them twice

### Server version

0.9.0

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`MAX_ROW_CHARS = 200_000` is charged `JSON.stringify(row)` once, but every row reaches the caller twice: as JSON in `structuredContent` and as a line of the markdown table in `content[]`. The delivered response is roughly 1.5× the documented budget. Truncation disclosure (`truncated`/`shown`/`cap`/`nextOffset`) is correct; the…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/53) · 2026-09-20 · closed · 1 comment

### bug(cdc_discover_datasets): HTML markup consumes the truncated description budget

### Server version

0.8.7

### mcp-ts-core version

0.13.2

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 27.0

### Description

Catalog descriptions arrive as raw HTML and reach both output surfaces untouched. Discovery truncates to 300 characters before the markup is removed, so on a description that opens with a styled block the whole budget goes to tags and inline CSS and the ellipsis lands before the first word about the dataset.…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/51) · 2026-09-20 · closed · 1 comment

## Most recent

### bug(format): literal HTML and Markdown in query values render as markup

### Server version

0.9.2

### mcp-ts-core version

0.13.6

### Runtime

Node.js

### Runtime version

26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

`escapeTableCell` escapes pipes and collapses newlines, but leaves HTML and Markdown syntax active. Literal values survive in `structuredContent` while the rendered surface changes their meaning.

Related: #24

### Steps to reproduce

Call `cdc_query_dataset` with:
```json
{"datasetId":"bi63-dtpu","select":"'<b>literal</b>…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/61) · 2026-09-30 · open · 0 comments

### bug(inputs): empty query filters silently become unrestricted requests

### Server version

0.9.2

### mcp-ts-core version

0.13.6

### Runtime

Node.js

### Runtime version

26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

Explicit empty query clauses and age lists are accepted, discarded, and returned as successful unrestricted requests. Omission and a supplied empty filter should not silently mean the same thing.

### Steps to reproduce

```json
{"name":"cdc_query_dataset","arguments":{"datasetId":"bi63-dtpu","where":"","select":"","limit":1}}…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/60) · 2026-09-30 · open · 0 comments

### bug(cdc_list_catalog_vocabulary): later pages misstate omitted-tag ceiling

### Server version

0.9.2

### mcp-ts-core version

0.13.6

### Runtime

Node.js

### Runtime version

26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

`truncationCeiling` claims to bound every tag not returned, but later pages omit earlier, higher-count tags too.

Related: #50

### Steps to reproduce

1. Call `cdc_list_catalog_vocabulary` with `{"tag_limit":1}`.
2. Call again with `{"tag_limit":1,"tag_offset":50}`.

### Actual behavior

The first page contains `nndss` with 294…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/59) · 2026-09-30 · open · 0 comments

### bug(cdc_query_wonder): exhausted pages falsely say no rows matched

### Server version

0.9.2

### mcp-ts-core version

0.13.6

### Runtime

Node.js

### Runtime version

26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

An exhausted page has correct structured guidance but contradictory `content[]`: the main block says no rows matched and recommends broader filters.

Related: #54

### Steps to reproduce

Call `cdc_query_wonder` with:
```json
{"year_range":{"from":2020,"to":2020},"offset":1}
```

### Actual behavior

`rowCount: 0`, `totalCount:…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/58) · 2026-09-30 · open · 0 comments

### bug(cdc_query_wonder): advertised Not Stated age combinations fail

### Server version

0.9.2

### mcp-ts-core version

0.13.6

### Runtime

Node.js

### Runtime version

26.5.0

### Transport

HTTP (Streamable HTTP)

### Description

The `age_groups` input promises a union of listed ages without declaring that `NS` cannot join a partial known-age selection. [CDC documents](https://wonder.cdc.gov/wonder/help/ucd.html#Not%20Stated) this restriction; the tool accepts the combination and spends a request that fails.

Related: #35

### Steps to reproduce

Call…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/57) · 2026-09-30 · open · 0 comments

### feat(cdc_query_wonder): bound the response the way cdc_query_dataset does

### Use case

`limit` on `cdc_query_wonder` has no default, so the whole parsed table comes back. A four-dimension grouping on the default database returns 2,014 rows in one ~480 KB response, enough to swamp a caller's context. The description advises setting `limit`, but nothing enforces it.

Related: #39

| `group_by` (D76, all years, no `limit`) | rows | `structuredContent` | `content[]` | wire |
|:--|--:|--:|--:|--:|
| `["year","age_group","sex","race"]` | 2,014 | 295,952 chars | 181,694…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/49) · 2026-09-20 · closed · 1 comment

### feat(cdc_query_wonder): accept multiple ICD-10 codes in cause_icd10 and mcd_icd10

### Use case

Standard cause-of-death definitions are sets of ICD-10 codes. CDC defines drug overdose as X40–X44, X60–X64, X85 and Y10–Y14, the wording WONDER's own caveats use on a 2018–2024 result. `cause_icd10` and `mcd_icd10` take one value, and WONDER accepts only nodes of its ICD-10 tree: a chapter (`V01-Y89`), a block (`X40-X49`), or a code (`X40`). An arbitrary span like `X40-X44` is rejected (`Invalid 'ICD-10 Codes' codes were found: 'X40-X44'`), so the overdose definition cannot be…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/48) · 2026-09-20 · closed · 1 comment

### bug(cdc_query_wonder): concurrent calls race the request-spacing gate and one is rate-limited

### Server version

0.9.1

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 27.0

### Description

`WonderService.throttle()` computes its wait from `lastRequestTime`, and `query()` only stamps that value in its `finally`, after the response. Calls that enter together read the same stamp. On a cold service they all send immediately. On a warm one they all wait the same amount and then send in the same…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/47) · 2026-09-20 · closed · 1 comment

### bug(cdc_get_dataset_schema): rowCount is a stale cached figure, not the dataset's row count

### Server version

0.8.7

### mcp-ts-core version

0.13.2

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 27.0

### Description

`rowCount` is read from `cachedContents.count` on the first column of the metadata response. Socrata builds that cache once and does not refresh it as rows land, so on actively-updated datasets it understates the real count badly. The field is advertised as "Total number of rows when reported by upstream" with…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/46) · 2026-09-20 · closed · 1 comment

### bug(cdc_query_dataset): chart and map assets return empty rows as a paginated success

### Server version

0.8.7

### mcp-ts-core version

0.13.2

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 27.0

### Description

`cdc_query_dataset` treats a chart or map catalog ID as a queryable dataset. Socrata answers `/resource/{id}.json` for those assets with HTTP 200 and a body of empty objects, so the handler reports a successful page of rows carrying no fields, plus an invitation to keep paging.

The row shape alone can't…

[Read the thread](https://github.com/cyanheads/cdc-health-mcp-server/issues/45) · 2026-09-20 · closed · 1 comment

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