Skip to main content
Glama

Server Details

Search and query CDC public health data — mortality, vaccinations, surveillance, behavioral risk.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 67 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/cdc-health-mcp-server
GitHub Stars
5
Server Listing
cdc-health-mcp-server

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct role: catalog search, schema introspection, controlled-vocabulary listing, SoQL dataset querying, and WONDER mortality querying. The only potential overlap (cdc_discover_datasets vs cdc_list_catalog_vocabulary) is explicitly resolved by descriptions that explain vocabulary values must be looked up before filtering. cdc_query_dataset and cdc_query_wonder both 'query' but target explicitly different CDC systems.

Naming Consistency5/5

All five tools share the cdc_ prefix and a consistent snake_case verb_noun pattern (discover_datasets, get_dataset_schema, list_catalog_vocabulary, query_dataset, query_wonder). No mixed conventions or stray camelCase. Names are readable and predictable.

Tool Count5/5

Five tools is well-scoped for a read-only data-access server, and each maps to a distinct step in the discover-schema-query workflow. Nothing feels redundant or missing at the structural level. This is a lean, purposeful set.

Completeness4/5

The surface covers the full read lifecycle: finding datasets, validating filter vocabulary, inspecting schemas, and querying both Socrata datasets and WONDER, with pagination handled inside tools. Gaps are minor — no export/download tool, no way to enumerate WONDER databases or dataset metadata beyond columns, and sub-national data is unavailable by policy. Agents can work around these within the documented workflows.

Available Tools

5 tools
cdc_discover_datasetsCdc Discover DatasetsA
Read-only
Inspect

Search the CDC dataset catalog by keyword, category, or tag. Returns IDs, names, truncated descriptions, asset types, column counts, and update timestamps. The catalog also holds charts, maps, stories, files, and links; an entry whose columnCount is 0 is one of those and yields no data from the other tools. Use cdc_get_dataset_schema for the full column list of a chosen dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by domain tags (e.g., ["covid19", "surveillance"]). Tags widen the search instead of narrowing it — a dataset matches when it carries any one of them, so every tag added returns more results, and an unrecognized tag matches nothing and leaves the result set unchanged. Values match the catalog's own tag vocabulary, case-insensitively; call cdc_list_catalog_vocabulary for the values in use with their entry counts, or read the tags field on any result. To narrow, combine tags with query or category, which intersect with the tag set.
limitNoResults to return (default 10). One call returns at most 100: a larger limit, up to 10,000, is capped at 100, and the response says so and gives the offset to continue from while more datasets match. offset plus limit must not exceed 10000 once limit is capped.
orderNoResult ordering. "dataset_id" (default) sorts deterministically by each dataset's unique catalog ID — required for stable offset pagination, since consecutive pages form a gap-free, duplicate-free traversal. "relevance" returns best-match ranking for keyword search but is not stably paginable across pages, so walking offsets can skip or repeat datasets.dataset_id
queryNoFull-text search across dataset names and descriptions (e.g., "diabetes mortality", "lead exposure children").
domainNoCDC Socrata host to search. "data.cdc.gov" (default) and "chronicdata.cdc.gov" front the same catalog and return the same entries, so switching hosts neither widens nor narrows a search — chronic-disease and small-area collections such as PLACES, the Heart Disease & Stroke Atlas, and Environmental Public Health Tracking are found from either.data.cdc.gov
offsetNoPagination offset for browsing beyond first page (max 9999). offset plus limit must not exceed 10000 once limit is capped; both CDC portals hold well under two thousand entries, so offsets near that ceiling page past the end of the catalog.
categoryNoFilter by domain category (e.g., "NNDSS", "Vaccinations", "Behavioral Risk Factors"). Values come from the catalog's own vocabulary and are matched exactly, including case — "Vaccinations" matches 89 entries while "Vaccination" matches none. Call cdc_list_catalog_vocabulary for every value with its entry count rather than guessing at one.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when the page came back empty — the catalog values closest to a category or tag filter that matched nothing, each with its entry count; how to broaden a search when no value is close; or the size of the result set when the offset ran past its end.
datasetsNoMatching datasets.
totalCountNoTotal matching datasets in the catalog (for pagination).
appliedFiltersNoFilters applied to this query; absent fields indicate no filter on that dimension. Query, category, and tags intersect with each other, but multiple tags union.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries most of the burden — and it delivers real behavioral context: descriptions in results are truncated, and columnCount=0 entries are charts/maps/stories/files/links that will produce nothing in downstream query tools. It does not cover rate limits, auth requirements, or the fact that the schema already notes the 100-result cap, but the truncation and empty-dataset traps are the non-obvious traits an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the purpose, no filler, and each subsequent sentence adds a distinct fact (return shape, non-dataset caveat, next-step tool). The enumeration of returned fields is slightly redundant given an output schema exists, which keeps this just below maximal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 100% schema coverage, an output schema, and a readOnly annotation, the description only needs to add judgment-level context — and it does: what comes back, the truncation caveat, why columnCount=0 entries are dead ends, and which tool to call next. Nothing an agent needs to select or invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents the tag-widening semantics, the category exact-match/case rules, the limit cap at 100, and the stability tradeoff between order modes. The description only echoes the facet names ("keyword, category, or tag") without adding format or vocabulary guidance beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Search the CDC dataset catalog") plus the three search facets (keyword, category, tag), and explicitly scopes the result set ("Returns IDs, names, truncated descriptions, asset types, column counts, and update timestamps"). It also draws a boundary against a sibling by naming cdc_get_dataset_schema as the tool for full column lists, so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use and explicitly delegates a related need to cdc_get_dataset_schema. It also warns that columnCount=0 entries are non-dataset assets that "yield no data from the other tools," which meaningfully shapes downstream tool choice. It stops short of an explicit when-not-to-use-this-tool-itself statement or naming cdc_query_dataset as the follow-on for retrieving actual rows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cdc_get_dataset_schemaCdc Get Dataset SchemaA
Read-only
Inspect

Fetch the column schema for a CDC dataset — names, data types, descriptions, row count, and last-updated timestamp. Returns the first 100 columns by default; wide datasets continue via column_offset. The dataset description is capped at 4,000 characters by default; pass full_description: true for the whole text. Get dataset IDs from cdc_discover_datasets.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoCDC Socrata host to fetch the dataset from. "data.cdc.gov" (default) and "chronicdata.cdc.gov" front the same catalog, so a four-by-four ID resolves on either and the default works whichever host the dataset was found on.data.cdc.gov
datasetIdYesFour-by-four dataset identifier (e.g., "bi63-dtpu"). Obtain from cdc_discover_datasets.
column_limitNoColumns to return in this call (default 100). Every dataset under the default arrives whole; past it the response reports totalCount and a nextOffset to pass back as column_offset. Raise this to pull a wide schema in one call — a value at or above the column count returns every column.
column_offsetNoIndex of the first column to return, for continuing past a previous call (default 0). Columns keep the order the dataset declares, so column_offset plus column_limit walks the schema without gaps or repeats. An offset at or past the column count returns an empty window rather than an error.
full_descriptionNoReturn the dataset description whole (default false). By default a description longer than 4,000 characters is cut there, and the response sets descriptionTruncated and descriptionLength. Column descriptions are never shortened either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe column_limit that bounded this response.
nameNoDataset display name from the catalog (e.g., "Provisional COVID-19 Deaths by Sex and Age").
errorNoPresent when the call failed. Absent on success.
shownNoNumber of columns returned in this response.
noticeNoGuidance when the response is a subset of the schema — which columns it covers, how to reach the rest, or that column_offset ran past the end.
columnsNoThe requested window of dataset columns, with full types and descriptions. Bounded by column_limit/column_offset; the enrichment fields say how the window sits in the whole schema.
rowCountNoTotal rows in the dataset; omitted when neither a live nor a cached figure is available. Read rowCountSource before sizing a pagination walk against it — the cached figure can understate an actively-updated dataset by a third or more.
truncatedNoTrue when the returned columns are a subset of the schema. Absent means every column of the dataset is in this response.
updatedAtNoLast data update timestamp when provided.
nextOffsetNoValue to pass as column_offset on the next call to continue after the last column returned. Present only when columns remain beyond this window.
totalCountNoTotal columns in the dataset schema, before column_limit/column_offset.
descriptionNoDataset description when provided, as plain text — markup stripped and entity references decoded. Capped at 4,000 characters by default and ending in "…" when cut, with descriptionTruncated and descriptionLength set; pass full_description: true for the whole text. Column descriptions are never shortened.
rowCountSourceNoProvenance of rowCount. "live" is a count(*) run against the dataset for this call. "cached" is the figure Socrata stored when it last built its column cache, returned when the count request did not succeed; Socrata does not refresh it as rows land. Absent exactly when rowCount is absent.
descriptionLengthNoCharacter count of the whole description, present only when description was cut. Call again with full_description: true to read all of it.
descriptionTruncatedNoTrue when description was cut at the 4,000-character cap. Absent means description is the whole text.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already declares the safety profile, so the bar is lower. The description still adds real behavioral context beyond the annotations: a 100-column default window, column_offset continuation for wide datasets, and a 4,000-character default cap on the dataset description with the full_description escape hatch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each earning its place: purpose first, then the two behavioral caveats (pagination, truncation), then the ID source. No filler and the most important constraint is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the operational gaps an agent needs — default window size, continuation, and description truncation. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents domain, column_limit, column_offset, and full_description in detail. The description restates the defaults at a higher level but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Fetch the column schema for a CDC dataset') and enumerates exactly what is returned (names, data types, descriptions, row count, last-updated). It distinguishes itself from the data-returning sibling cdc_query_dataset and routes to cdc_discover_datasets for IDs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It supplies a clear prerequisite ('Get dataset IDs from cdc_discover_datasets') and context for use, and the pagination/truncation notes imply the workflow for wide datasets. It stops short of explicitly stating when to prefer this over cdc_query_dataset or cdc_list_catalog_vocabulary, so no exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cdc_list_catalog_vocabularyList CDC Catalog VocabularyA
Read-only
Inspect

List the controlled vocabularies cdc_discover_datasets' category and tags filters are matched against — every domain category and domain tag the CDC catalog publishes, each with the number of entries carrying it. Call it before filtering a search: a value the catalog does not carry matches nothing and returns an empty page, which is indistinguishable from a real value with no results. All categories come back whole; the tag vocabulary runs to roughly 1,600 values, so tags are ranked by entry count and returned one page at a time via tag_limit and tag_offset. Pass filter to narrow both vocabularies to the values whose words contain it.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoCDC Socrata host to read the vocabulary from. "data.cdc.gov" (default) and "chronicdata.cdc.gov" front the same catalog and publish the same vocabulary, so this selects which host answers, never which values exist.data.cdc.gov
filterNoNarrow both vocabularies to the values related to this text. A value matches when every word of the filter appears inside one of its words ("vaccin" reaches "Vaccinations" and "covid-19 vaccination"), or when the whole value appears in the filter. Matching is not fuzzy — a misspelling returns nothing rather than a guess — and a filter under three letters is ignored.
tag_limitNoTags to return in this call (default 50). Tags are ranked by entry count, so the default page is the most-used end of the vocabulary; the response reports how many matched and a nextOffset while more remain. A tag_limit at or above the number of matching tags returns all of them in one call. Categories are never paged — every one arrives whole.
tag_offsetNoIndex of the first tag to return, for continuing past a previous call (default 0). Ranking is stable, so tag_offset plus tag_limit walks the vocabulary without gaps or repeats. An offset at or past the number of matching tags returns an empty tag list rather than an error.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe tag_limit that bounded this response.
tagsNoThe requested window of domain tags, ranked by entry count. Pass values to cdc_discover_datasets' tags input; tags union there, so each one added widens the result set.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of tags returned in this response.
domainNoCDC Socrata host this vocabulary was read from.
noticeNoGuidance when the response is a subset of the vocabulary, when a filter too short to discriminate was ignored, when the filter matched nothing, or when tag_offset ran past the end of the matches.
tagCountNoTags matching the filter, before tag_limit and tag_offset.
truncatedNoTrue when the returned tags are a subset of the matching ones. Absent means every matching tag is in this response.
categoriesNoEvery domain category matching the filter, ranked by entry count. Pass a value to cdc_discover_datasets' category input exactly as spelled here.
nextOffsetNoValue to pass as tag_offset on the next call to continue after the last tag returned. Present only while matching tags remain.
categoryCountNoCategories matching the filter. Every one of them is in this response.
vocabularySizeNoSize of each full vocabulary on this host, before any filter was applied.
truncationCeilingNoUpper bound on the entry count of every tag after this page — the tags from nextOffset on. Tags are ranked by entry count, so none of those is carried by more entries than the last tag shown. It does not bound the tags before tag_offset: those rank at or above the first tag shown.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only readOnlyHint=true, and the description adds substantial behavior beyond that: categories are never paged, tags number ~1,600 and are returned ranked by entry count one page at a time, ranking is stable so offset+limit walks without gaps, and an offset past the end yields an empty list rather than an error. It also discloses that matching is not fuzzy and that filters under three letters are ignored. It stops short of describing the response's actual shape, though an output schema exists to cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose comes first, then the usage rule, then paging behavior, then the filter — a well-ordered, front-loaded structure. It is dense with useful detail rather than filler, though "All categories come back whole" is restated in the tag_limit schema description, costing a little redundancy in an otherwise tight passage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter, read-only listing tool with full schema coverage, an output schema, and readOnlyHint annotations, the description supplies everything an agent needs: when to call it, how paging works, and how filtering behaves. No relevant gap remains for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are themselves detailed, so the baseline would be 3. The description still adds synthesized meaning — why tag_limit/tag_offset exist together (ranking plus paging), that a limit at or above the match count returns everything in one call, and that filter matching is whole-value-substring rather than fuzzy — which is more than a restatement of the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List the controlled vocabularies") and pins the scope precisely: the domain categories and domain tags that cdc_discover_datasets' category and tags filters are matched against. It explicitly ties itself to a named sibling, so an agent can distinguish it from the other cdc_* tools without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ("Call it before filtering a search") and the concrete failure mode that justifies it — an unknown value returns an empty page indistinguishable from a valid value with no results. It also names the sibling whose filters it serves and explains the filter parameter's role, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cdc_query_datasetCdc Query DatasetA
Read-only
Inspect

Execute a SoQL query against any CDC dataset. Supports filtering, aggregation, sorting, full-text search, and field selection. Use cdc_discover_datasets to find dataset IDs and cdc_get_dataset_schema to inspect columns before querying.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoSoQL GROUP BY clause. Requires aggregate functions in select.
limitNoMax rows to return (default 100). One call returns at most 5,000 rows: a larger limit, up to 1,000,000, is capped at 5,000, and the response says so and gives a nextOffset when more rows remain. Fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from.
orderNoSoQL ORDER BY clause. Field name with optional ASC/DESC: "total_deaths DESC". Set one from the first page whenever paging with offset, and keep it for the whole walk: SODA does not order results implicitly, so consecutive offsets without a deterministic order, or under a changed one, can skip or repeat rows. End it with a tie-breaker unique to each row: on ungrouped rows, the system field `:id`, present on every dataset (order="year DESC, :id"); on a grouped query, the grouped columns (order="total DESC, state"); on a distinct select, the selected columns. Socrata rejects `:id` once rows are grouped.
whereNoSoQL WHERE clause. Strings must be single-quoted: "state='California' AND year=2020". If a column name matches a SoQL keyword (group, select, where, order, limit, offset, having, search), wrap it in backticks: "`group`='By Year'".
domainNoCDC Socrata host to query. "data.cdc.gov" (default) and "chronicdata.cdc.gov" front the same catalog, so a four-by-four ID returns the same rows from either and the default works whichever host the dataset was found on.data.cdc.gov
havingNoSoQL HAVING clause. Filters aggregated results.
offsetNoRow offset for pagination (max 1,000,000). Pair with a deterministic order clause — an offset walk over unordered results can skip or repeat rows.
searchNoFull-text search across all text columns. For precise filtering use the where parameter instead.
selectNoSoQL SELECT clause — column names, aliases, or aggregates: "state, sum(deaths) as total_deaths". Omit for all columns. To enumerate distinct values of a column, set select to "{column}, count(*) as count" with group="{column}" and order="count DESC, {column}".
datasetIdYesFour-by-four dataset identifier (e.g., "bi63-dtpu"). Obtain from cdc_discover_datasets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe row limit that bounded this response: the requested limit, or 5,000 when a larger one was capped.
rowsNoResult rows with requested fields. Most values are strings (including numbers/dates); geo columns return GeoJSON objects.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of rows returned in this response.
noticeNoGuidance when no rows matched, when offset ran past the end of the result set, when further rows remain (naming a limit above 5,000 that was capped), or when the response budget cut the page short — how to verify filters, lower offset, resume paging under the same order or restart it from offset 0 under one that makes the walk gap-free, or broaden the query.
rowCountNoNumber of rows returned in this response.
truncatedNoTrue when rows exist beyond the ones returned, established by fetching one row more than the limit rather than inferred from the row count. Absent means this response is the complete remainder of the result set.
nextOffsetNoOffset to pass on the next call, under the same order, to resume immediately after the last row returned. Present only when further rows exist and the resume point is within the offset ceiling. The walk is gap-free only when that order ends in a tie-breaker unique to each row; when it does not, the notice says to restart from offset 0 with one.
effectiveQueryNoThe SoQL clauses sent to Socrata, as `$clause=value` pairs joined by "&". Values read exactly as they were supplied — not URL-encoded — so a clause can be copied back into the matching parameter of another call.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the capability surface (filtering, aggregation, full-text search) which frames what the query can do, but it does not disclose result-size limits, pagination behavior, or rate limits in the prose — those live in the schema. Adequate but not rich given the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, capabilities second, prerequisite workflow third. No redundancy and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the inputs are exhaustively documented in the schema. The description supplies the needed orientation for a 10-parameter query tool; only the relationship to cdc_query_wonder is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description maps its capability list to the corresponding parameters (where, group, order, search, select), adding marginal connective value, but every parameter already carries detailed inline documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Execute a SoQL query against any CDC dataset', and enumerates the supported operations (filtering, aggregation, sorting, full-text search, field selection). It distinguishes itself from cdc_discover_datasets and cdc_get_dataset_schema by naming them as prerequisites, though it does not clarify how it differs from cdc_query_wonder.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear workflow context: call cdc_discover_datasets for dataset IDs and cdc_get_dataset_schema to inspect columns before querying. It provides positive routing guidance but no explicit exclusions or when-not conditions (e.g., vs cdc_query_wonder).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cdc_query_wonderCdc Query WonderA
Read-only
Inspect

Query CDC WONDER for national US mortality statistics — deaths, population, and crude/age-adjusted death rates — across its five mortality databases, selected with the database input: final underlying-cause data for 1999–2020 (the default) or 2018–2024, provisional data running from 2018 through the current year, and two multiple-cause databases covering the same two eras. Break results out by year, age group, sex, and/or race, and filter by ICD-10 cause of death, sex, age group, or year range; on a multiple-cause database, mcd_icd10 additionally matches a cause listed anywhere on the death certificate rather than only the one certified as underlying. Each database holds a different span of years (1999–2026 across all of them) and a request whose year_range falls outside the selected one's span is rejected with that span named. WONDER is a separate CDC system from the Socrata datasets the other cdc_* tools query. Data is national only — sub-national (state/county) breakdowns are not available through the API (CDC vital-statistics policy). Cause of death is a filter, not a grouping. Some measure cells come back as a CDC status token rather than a number — "Suppressed" (withheld for confidentiality), "Unreliable" (a rate from fewer than 20 deaths), or "Not Applicable" (no population denominator); those cells read null in rows and each one is listed in cellNotes with its token. CDC also drops whole rows before sending the table — strata with zero deaths, and strata whose death count is suppressed — so a stratum can be missing from rows entirely; messages carries CDC's statement whenever that happened. Each response is bounded by a 200,000-character budget counted over the whole result, so a broad grouping — one can run past two thousand rows — comes back a page at a time: the response reports the table's totalCount and a nextOffset to continue from, and limit takes smaller pages. Paging shapes the response only — WONDER is asked once either way, and the figures, caveats and hidden-row notices are the same on every page. CDC rejects requests made less than 15 seconds apart across all five databases, so calls are spaced automatically: calls made while another is running wait their turn and run one after another, each queued call adding about 16 seconds plus its own query time before it returns.

ParametersJSON Schema
NameRequiredDescriptionDefault
sexNoFilter by sex.all
limitNoRows to return from the table CDC sent — any positive integer. Omit to take as many as fit. Either way fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows, their cell notes, and the caveats and messages, as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from. WONDER's request carries no limit of its own, so this pages a table already fetched in full rather than narrowing the query: the deaths, rates, caveats and hidden-row notices are the same whichever page is read.
offsetNoIndex of the first row to return, for continuing past a previous call (default 0, max 10,000). Rows keep the order CDC returned them in, which is stable for a given query, so offset plus limit walks the table without gaps or repeats. An offset at or past the row total returns an empty page rather than an error.
databaseNoWhich WONDER mortality database to query. "underlying_1999_2020" (D76) is final data for 1999–2020 and the default. "provisional" (D176) runs 2018 through the current year, updated weekly, and returns the most recent years labelled e.g. "2025 (provisional)". "underlying_2018_2024" (D158) is settled — not provisional — data for 2018–2024. "multiple_1999_2020" (D77) and "multiple_2018_2024" (D157) record every cause listed on the death certificate; without an mcd_icd10 filter they return the same figures as the underlying-cause database for the same era, so pick one only to use that filter. The two 1999–2020 databases report race in CDC's four bridged groups; the other three use the six single-race groups — figures broken out by race are not comparable between the two families.underlying_1999_2020
group_byNoDimensions to break results out by (1–4, each at most once), in output-column order — e.g. ["year"], ["year","sex"], ["age_group","race"]. Results are always national. Cause of death is a filter (cause_icd10), not a grouping. "race" resolves to whichever race vocabulary the selected database uses — four bridged groups (Asian and Pacific Islander combined) on the 1999–2020 databases, six single-race categories on the others, one of them "More than one race" — so a race series from one family cannot be spliced onto one from the other.
mcd_icd10NoFilter to deaths with any of these ICD-10 codes recorded anywhere on the death certificate, whether or not it was the underlying cause — e.g. "died with a respiratory condition listed", a population no underlying-cause query can produce. Takes one code or range, or a list of them, e.g. opioid involvement as ["T40.0","T40.1","T40.2","T40.3","T40.4","T40.6"]. Valid only when database is "multiple_1999_2020", "multiple_2018_2024", or "provisional"; the other databases record only the underlying cause and reject it. "999--999", the withheld-cause marker described under cause_icd10, is offered here too but only by "provisional". Combines with cause_icd10, which keeps meaning the underlying cause: a death must match both filters. Omit for all causes.
age_groupsNoRestrict to deaths in any of the listed age groups — e.g. ["25-34","35-44"] covers both; a repeated group counts once. "1" is the under-1-year group. "NS" is the group CDC puts a death in when the age was not recorded; it is not covered by any of the ten-year groups, so a filter listing all eleven of those still leaves those deaths out and returns fewer deaths than the same query unfiltered. CDC refuses "NS" beside only some of the other groups: list it on its own to count those deaths, or list all twelve values — the same as omitting age_groups — to include them. Omit for all ages, which includes them.
year_rangeNoInclusive year range; from must not be later than to. These bounds span every database (1999–2026); the years the selected one actually holds are narrower, and a range outside them is rejected with that database's span named. Omit for all years the database holds.
cause_icd10NoFilter to ICD-10 underlying causes of death — the single condition CDC certified as having started the chain of events leading to death. Takes one code or range, or a list of them for a cause defined as a code set, e.g. drug overdose as ["X40","X41","X42","X43","X44","X60","X61","X62","X63","X64","X85","Y10","Y11","Y12","Y13","Y14"]. Omit for all causes. Accepted by every database. "999--999" is not an ICD-10 code but CDC's own marker for deaths whose cause it is still withholding under the provisional database's six-month reporting lag; it counts that backlog, and only the "provisional" database offers it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoRows this call asked for — limit when set, otherwise every row from offset to the end of the table. A shown below it means the response budget cut the page short.
rowsNoResult rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and age_adjusted_rate (per 100,000) when age standardization is possible — it is omitted when age_group is a grouping dimension or age_groups selects a single group. Dimension values are CDC's own labels with only surrounding whitespace removed, so the same year keys identically across databases; nothing inside a label is changed, and on the provisional database a year reads "2025 (provisional)" or "2026 (provisional and partial)" rather than a bare year. A measure cell CDC returned as a status token instead of a number is null here; cellNotes names the cell and the token. These are one page of the table CDC sent, in its order, bounded by limit and by the response budget; totalCount says how many rows the whole table holds.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of rows returned in this response.
noticeNoGuidance when no rows matched, when the returned rows are a page of a larger table — naming whether limit or the response budget ended it — or the offset ran past it, and a note when CDC returned a status token in place of a measure value.
caveatsNoCDC-provided caveats and footnotes: data revisions, population-estimate sources, suppression and rate-reliability rules. CDC's links to its methodology pages are kept as Markdown links, e.g. "[More information.](https://wonder.cdc.gov/wonder/help/ucd-expanded.html#Confidence-Intervals)". They describe the whole table CDC assembled, so they come back complete on every page rather than scoped to the rows returned.
databaseNoWONDER dataset code the rows came from — e.g. "D76", "D176", "D157".
messagesNoNotices CDC attached to this table, verbatim apart from links, which are kept as Markdown links. The ones that matter say rows were withheld before the table was sent — "Rows with zero Deaths are hidden." and "Rows with suppressed Deaths are hidden." A withheld row is absent from rows entirely, with nothing in the table marking the gap, so while this array is non-empty a stratum missing from rows may have been dropped rather than unobserved, and any count, ranking, or completeness claim drawn from rows is partial. These describe the whole table, so they come back complete on every page. Empty when CDC withheld no rows.
rowCountNoNumber of rows returned in this response — the page size whenever it falls short of totalCount.
cellNotesNoOne entry per measure cell CDC returned as a status token rather than a number, covering the rows in this response only. Those cells read null in rows, so this is what tells a withheld value apart from an unreliable one or a genuinely absent one.
truncatedNoTrue when rows remain past the ones returned. Absent means this response runs to the end of the table, which is also the case for an offset past it.
nextOffsetNoOffset to pass on the next call to resume immediately after the last row returned. Present only when further rows remain.
totalCountNoRows in the whole table CDC returned, before any page was taken. Exact rather than estimated — the table is parsed in full before a page is taken from it.
databaseTitleNoCDC's own title for that database, e.g. "Underlying Cause of Death, 1999-2020". Names the era and record type the rows describe, so a result read on its own is self-describing.
effectiveQueryNoHuman-readable summary of the grouping and filters sent to WONDER.
suppressedCountNoHow many cellNotes carry the "Suppressed" token — cells CDC withheld for confidentiality. Counted over the rows in this response, so it tracks the page rather than the whole table.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=true in annotations, the description carries the behavioral burden and does so richly: 15-second cross-database rate limiting with automatic queueing (~16s per queued call plus query time), a 200,000-character response budget with totalCount/nextOffset paging, CDC row-dropping for zero-death and suppressed strata surfaced via messages, and null cells tokenized as Suppressed/Unreliable/Not Applicable listed in cellNotes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and most sentences carry distinct information justified by a 9-parameter, five-database tool. However, paging behavior is explained in the body and then restated at length inside the limit and offset parameter descriptions, and the rate-limit/proxy detail is unusually long, introducing some redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool of this complexity — nested year_range, union list semantics, 50-entry caps, era-specific vocabularies — the description covers the operational gaps: paging, rate limiting, hidden rows, and status tokens. With an output schema present, it correctly avoids re-explaining return structure while still disclosing non-obvious response behaviors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine cross-parameter meaning the schema does not: race vocabularies differ by database era and cannot be spliced, mcd_icd10 is valid only on multiple-cause/provisional databases, and the 999--999 withheld-cause marker is provisional-only. These interactions materially affect how parameters must be combined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opening sentence names a specific verb and resource — query CDC WONDER for national US mortality statistics — and enumerates the concrete outputs (deaths, population, crude/age-adjusted rates). It explicitly distinguishes itself from siblings by stating WONDER is a separate CDC system from the Socrata datasets the other cdc_* tools query, so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance for each database, states when mcd_icd10 applies (multiple-cause or provisional only), and rules out misuse by noting cause of death is a filter not a grouping and that sub-national breakdowns are unavailable. It also contrasts itself against the other cdc_* tools, satisfying the alternatives requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedcdc_discover_datasets5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Results to return (default 10, max 100). offset plus limit must not exceed 10000."New value: +"Results to return (default 10). One call returns at most 100: a larger limit, up to 10,000, is capped at 100, and the response says so and gives the offset to continue from while more datasets match. offset plus limit must not exceed 10000 once limit is capped."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +10000
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset for browsing beyond first page (max 9999). offset plus limit must not exceed 10000; both CDC portals hold well under two thousand entries, so offsets near that ceiling page past the end of the catalog."New value: +"Pagination offset for browsing beyond first page (max 9999). offset plus limit must not exceed 10000 once limit is capped; both CDC portals hold well under two thousand entries, so offsets near that ceiling page past the end of the catalog."
      • changedOutput schema / properties / datasets / items / properties / description / description
        Previous value: -"Dataset description when provided by the catalog, as plain text — markup stripped and entity references decoded — then truncated to 300 characters, so the limit bounds visible text. Fetch the full text via cdc_get_dataset_schema."New value: +"Dataset description when provided by the catalog, as plain text — markup stripped and entity references decoded — then truncated to 300 characters, so the limit bounds visible text. Fetch the full text via cdc_get_dataset_schema with full_description: true; without it, that tool caps the description at 4,000 characters."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: Socrata API returns 429 Too Many Requests. `dataset_not_found`: Socrata returned 404 for the catalog endpoint itself — the Discovery API address is wrong or the service moved. `access_denied`: Socrata returned 403 — the catalog refused this request rather than failing to serve it. `upstream_error`: Socrata catalog API returned a 5xx server error. `page_out_of_range`: offset plus limit exceeds 10000, which Socrata's catalog rejects outright. `invalid_query`: Catalog API returned 400 — typically a malformed query or invalid filter value. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: Socrata API returns 429 Too Many Requests. `dataset_not_found`: Socrata returned 404 for the catalog endpoint itself — the Discovery API address is wrong or the service moved. `access_denied`: Socrata returned 403 — the catalog refused this request rather than failing to serve it. `upstream_error`: Socrata catalog API returned a 5xx server error. `page_out_of_range`: offset is above 0 and offset plus limit, after the 100-entry cap, exceeds 10000, which Socrata's catalog rejects outright. `invalid_query`: Catalog API returned 400 — typically a malformed query or invalid filter value. Other values are possible when a failure originates below the handler."
    • Changedcdc_get_dataset_schema6 fields changed
      • changedInput schema / properties / column_limit / description
        Previous value: -"Columns to return in this call (default 100, max 500). Every dataset under the default arrives whole; past it the response reports totalCount and a nextOffset to pass back as column_offset. Raise this to pull a wide schema in one call."New value: +"Columns to return in this call (default 100). Every dataset under the default arrives whole; past it the response reports totalCount and a nextOffset to pass back as column_offset. Raise this to pull a wide schema in one call — a value at or above the column count returns every column."
      • changedInput schema / properties / column_limit / maximum
        Previous value: -500New value: +9007199254740991
      • addedInput schema / properties / full_description
        Added value: +{
        +  "default": false,
        +  "description": "Return the dataset description whole (default false). By default a description longer than 4,000 characters is cut there, and the response sets descriptionTruncated and descriptionLength. Column descriptions are never shortened either way.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / description / description
        Previous value: -"Dataset description when provided, in full as plain text — markup stripped and entity references decoded. Never truncated here; cdc_discover_datasets is the surface that shortens it."New value: +"Dataset description when provided, as plain text — markup stripped and entity references decoded. Capped at 4,000 characters by default and ending in \"…\" when cut, with descriptionTruncated and descriptionLength set; pass full_description: true for the whole text. Column descriptions are never shortened."
      • addedOutput schema / properties / descriptionLength
        Added value: +{
        +  "description": "Character count of the whole description, present only when description was cut. Call again with full_description: true to read all of it.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / descriptionTruncated
        Added value: +{
        +  "description": "True when description was cut at the 4,000-character cap. Absent means description is the whole text.",
        +  "type": "boolean"
        +}
    • Changedcdc_list_catalog_vocabulary3 fields changed
      • changedInput schema / properties / tag_limit / description
        Previous value: -"Tags to return in this call (default 50, max 500). Tags are ranked by entry count, so the default page is the most-used end of the vocabulary; the response reports how many matched and a nextOffset while more remain. Categories are never paged — all 55 arrive whole."New value: +"Tags to return in this call (default 50). Tags are ranked by entry count, so the default page is the most-used end of the vocabulary; the response reports how many matched and a nextOffset while more remain. A tag_limit at or above the number of matching tags returns all of them in one call. Categories are never paged — every one arrives whole."
      • changedInput schema / properties / tag_limit / maximum
        Previous value: -500New value: +9007199254740991
      • changedOutput schema / properties / truncationCeiling / description
        Previous value: -"Upper bound on the entry count of every tag not returned. Tags are ranked by entry count, so no omitted tag is carried by more entries than the last one shown."New value: +"Upper bound on the entry count of every tag after this page — the tags from nextOffset on. Tags are ranked by entry count, so none of those is carried by more entries than the last tag shown. It does not bound the tags before tag_offset: those rank at or above the first tag shown."
    • Changedcdc_query_dataset7 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max rows to return (default 100, max 5000). Fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from."New value: +"Max rows to return (default 100). One call returns at most 5,000 rows: a larger limit, up to 1,000,000, is capped at 5,000, and the response says so and gives a nextOffset when more rows remain. Fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from."
      • changedInput schema / properties / limit / maximum
        Previous value: -5000New value: +1000000
      • changedInput schema / properties / order / description
        Previous value: -"SoQL ORDER BY clause. Field name with optional ASC/DESC: \"total_deaths DESC\". Set one whenever paging with offset: SODA does not order results implicitly, so consecutive offsets without a deterministic order can skip or repeat rows. When the dataset has no natural unique column, Socrata's documented minimum tie-breaker is the system field `:id`, present on every dataset — order=\":id\"."New value: +"SoQL ORDER BY clause. Field name with optional ASC/DESC: \"total_deaths DESC\". Set one from the first page whenever paging with offset, and keep it for the whole walk: SODA does not order results implicitly, so consecutive offsets without a deterministic order, or under a changed one, can skip or repeat rows. End it with a tie-breaker unique to each row: on ungrouped rows, the system field `:id`, present on every dataset (order=\"year DESC, :id\"); on a grouped query, the grouped columns (order=\"total DESC, state\"); on a distinct select, the selected columns. Socrata rejects `:id` once rows are grouped."
      • changedInput schema / properties / select / description
        Previous value: -"SoQL SELECT clause — column names, aliases, or aggregates: \"state, sum(deaths) as total_deaths\". Omit for all columns. To enumerate distinct values of a column, set select to \"{column}, count(*) as count\" with group=\"{column}\" and order=\"count DESC\"."New value: +"SoQL SELECT clause — column names, aliases, or aggregates: \"state, sum(deaths) as total_deaths\". Omit for all columns. To enumerate distinct values of a column, set select to \"{column}, count(*) as count\" with group=\"{column}\" and order=\"count DESC, {column}\"."
      • changedOutput schema / properties / cap / description
        Previous value: -"The requested limit that bounded this response."New value: +"The row limit that bounded this response: the requested limit, or 5,000 when a larger one was capped."
      • changedOutput schema / properties / nextOffset / description
        Previous value: -"Offset to pass on the next call to resume immediately after the last row returned. Present only when further rows exist and the resume point is within the offset ceiling; a deterministic order clause is what makes the walk gap-free."New value: +"Offset to pass on the next call, under the same order, to resume immediately after the last row returned. Present only when further rows exist and the resume point is within the offset ceiling. The walk is gap-free only when that order ends in a tie-breaker unique to each row; when it does not, the notice says to restart from offset 0 with one."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched, when offset ran past the end of the result set, when further rows remain, or when the response budget cut the page short — how to verify filters, lower offset, resume paging, or broaden the query."New value: +"Guidance when no rows matched, when offset ran past the end of the result set, when further rows remain (naming a limit above 5,000 that was capped), or when the response budget cut the page short — how to verify filters, lower offset, resume paging under the same order or restart it from offset 0 under one that makes the walk gap-free, or broaden the query."
    • Changedcdc_query_wonder6 fields changed
      • changedInput schema / properties / age_groups / description
        Previous value: -"Restrict to deaths in any of the listed age groups — e.g. [\"25-34\",\"35-44\"] covers both; a repeated group counts once. \"1\" is the under-1-year group. \"NS\" is the group CDC puts a death in when the age was not recorded; it is not covered by any of the ten-year groups, so a filter listing all eleven of those still leaves those deaths out and returns fewer deaths than the same query unfiltered. List \"NS\" alongside them to match an unfiltered total, or on its own to count them. Omit for all ages, which includes them."New value: +"Restrict to deaths in any of the listed age groups — e.g. [\"25-34\",\"35-44\"] covers both; a repeated group counts once. \"1\" is the under-1-year group. \"NS\" is the group CDC puts a death in when the age was not recorded; it is not covered by any of the ten-year groups, so a filter listing all eleven of those still leaves those deaths out and returns fewer deaths than the same query unfiltered. CDC refuses \"NS\" beside only some of the other groups: list it on its own to count those deaths, or list all twelve values — the same as omitting age_groups — to include them. Omit for all ages, which includes them."
      • changedInput schema / properties / cause_icd10 / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "const": "999--999",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ICD-10 underlying-cause code or range. WONDER takes a node of its ICD-10 tree — a chapter such as \"A00-B99\" (infectious) or \"V01-Y89\" (external causes), a block such as \"X40-X49\" (accidental poisoning) or \"C00-C97\" (malignant neoplasms), or a single code such as \"I21\" — and rejects any other span, e.g. \"X40-X44\", naming it in the error. List the codes (or blocks) to cover a span that is not a tree node.",
        -    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "A list of 1–50 entries, each in the single-value form, matched as a union: a death counts once when it matches any of them, so a code set such as X40–X44 plus X60–X64 is one series with one set of rates. Repeated entries are ignored.",
        -    "items": {
        -      "anyOf": [
        -        {
        -          "const": "999--999",
        -          "type": "string"
        -        },
        -        {
        -          "description": "ICD-10 underlying-cause code or range. WONDER takes a node of its ICD-10 tree — a chapter such as \"A00-B99\" (infectious) or \"V01-Y89\" (external causes), a block such as \"X40-X49\" (accidental poisoning) or \"C00-C97\" (malignant neoplasms), or a single code such as \"I21\" — and rejects any other span, e.g. \"X40-X44\", naming it in the error. List the codes (or blocks) to cover a span that is not a tree node.",
        -          "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -          "type": "string"
        -        }
        -      ],
        -      "description": "One list entry: an ICD-10 code or range, or the withheld-cause marker."
        -    },
        -    "maxItems": 50,
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "const": "999--999",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ICD-10 underlying-cause code or range. WONDER takes a node of its ICD-10 tree — a chapter such as \"A00-B99\" (infectious) or \"V01-Y89\" (external causes), a block such as \"X40-X49\" (accidental poisoning) or \"C00-C97\" (malignant neoplasms), or a single code such as \"I21\" — and rejects any other span, e.g. \"X40-X44\", naming it in the error. List the codes (or blocks) to cover a span that is not a tree node.",
        +    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "A list of up to 50 entries, each in the single-value form, matched as a union: a death counts once when it matches any of them, so a code set such as X40–X44 plus X60–X64 is one series with one set of rates. Repeated entries are ignored. An empty list reads as omitted.",
        +    "items": {
        +      "anyOf": [
        +        {
        +          "const": "999--999",
        +          "type": "string"
        +        },
        +        {
        +          "description": "ICD-10 underlying-cause code or range. WONDER takes a node of its ICD-10 tree — a chapter such as \"A00-B99\" (infectious) or \"V01-Y89\" (external causes), a block such as \"X40-X49\" (accidental poisoning) or \"C00-C97\" (malignant neoplasms), or a single code such as \"I21\" — and rejects any other span, e.g. \"X40-X44\", naming it in the error. List the codes (or blocks) to cover a span that is not a tree node.",
        +          "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +          "type": "string"
        +        }
        +      ],
        +      "description": "One list entry: an ICD-10 code or range, or the withheld-cause marker."
        +    },
        +    "maxItems": 50,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Rows to return from the table CDC sent (1–5000). Omit to take as many as fit. Either way fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows, their cell notes, and the caveats and messages, as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from. WONDER's request carries no limit of its own, so this pages a table already fetched in full rather than narrowing the query: the deaths, rates, caveats and hidden-row notices are the same whichever page is read."New value: +"Rows to return from the table CDC sent — any positive integer. Omit to take as many as fit. Either way fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows, their cell notes, and the caveats and messages, as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from. WONDER's request carries no limit of its own, so this pages a table already fetched in full rather than narrowing the query: the deaths, rates, caveats and hidden-row notices are the same whichever page is read."
      • changedInput schema / properties / limit / maximum
        Previous value: -5000New value: +9007199254740991
      • changedInput schema / properties / mcd_icd10 / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "const": "999--999",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ICD-10 code or range, same form as cause_icd10 — a chapter such as \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), a block such as \"J09-J18\" (influenza and pneumonia), or a single code such as \"T40.1\" (heroin).",
        -    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "A list of 1–50 entries, each in the single-value form, matched as a union: a death counts once when it matches any of them, so a code set such as X40–X44 plus X60–X64 is one series with one set of rates. Repeated entries are ignored.",
        -    "items": {
        -      "anyOf": [
        -        {
        -          "const": "999--999",
        -          "type": "string"
        -        },
        -        {
        -          "description": "ICD-10 code or range, same form as cause_icd10 — a chapter such as \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), a block such as \"J09-J18\" (influenza and pneumonia), or a single code such as \"T40.1\" (heroin).",
        -          "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -          "type": "string"
        -        }
        -      ],
        -      "description": "One list entry: an ICD-10 code or range, or the withheld-cause marker."
        -    },
        -    "maxItems": 50,
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "const": "999--999",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ICD-10 code or range, same form as cause_icd10 — a chapter such as \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), a block such as \"J09-J18\" (influenza and pneumonia), or a single code such as \"T40.1\" (heroin).",
        +    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "A list of up to 50 entries, each in the single-value form, matched as a union: a death counts once when it matches any of them, so a code set such as X40–X44 plus X60–X64 is one series with one set of rates. Repeated entries are ignored. An empty list reads as omitted.",
        +    "items": {
        +      "anyOf": [
        +        {
        +          "const": "999--999",
        +          "type": "string"
        +        },
        +        {
        +          "description": "ICD-10 code or range, same form as cause_icd10 — a chapter such as \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), a block such as \"J09-J18\" (influenza and pneumonia), or a single code such as \"T40.1\" (heroin).",
        +          "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +          "type": "string"
        +        }
        +      ],
        +      "description": "One list entry: an ICD-10 code or range, or the withheld-cause marker."
        +    },
        +    "maxItems": 50,
        +    "type": "array"
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_query`: The request contradicts itself — a year_range whose from is later than its to, or a group_by dimension listed twice — or does not fit the selected database — a year_range outside the years it holds, mcd_icd10 against a database that records only the underlying cause, or the withheld-cause marker against one that keeps no withheld backlog — or WONDER itself rejected it, e.g. an ICD-10 code or range its tree does not hold, or a filter/grouping combination it does not allow. `rate_limited`: A request reached WONDER less than 15 seconds after the previous response to the same source IP finished, and WONDER returned 429. This server queues its own calls, so the earlier request usually came from another client sharing that IP. `upstream_error`: WONDER returned an unexpected response or was unreachable. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_query`: The request contradicts itself — a year_range whose from is later than its to, or a group_by dimension listed twice — or asks for a combination CDC refuses — age_groups holding \"NS\" beside only some of the known age groups — or does not fit the selected database — a year_range outside the years it holds, mcd_icd10 against a database that records only the underlying cause, or the withheld-cause marker against one that keeps no withheld backlog — or WONDER itself rejected it, e.g. an ICD-10 code or range its tree does not hold, or a filter/grouping combination it does not allow. `rate_limited`: A request reached WONDER less than 15 seconds after the previous response to the same source IP finished, and WONDER returned 429. This server queues its own calls, so the earlier request usually came from another client sharing that IP. `upstream_error`: WONDER returned an unexpected response or was unreachable. Other values are possible when a failure originates below the handler."
  2. 1 tool update
    • Changedcdc_query_wonder17 fields changed
      • changedInput schema / properties / age_groups / description
        Previous value: -"Restrict to deaths in any of the listed age groups — e.g. [\"25-34\",\"35-44\"] covers both. \"1\" is the under-1-year group. \"NS\" is the group CDC puts a death in when the age was not recorded; it is not covered by any of the ten-year groups, so a filter listing all eleven of those still leaves those deaths out and returns fewer deaths than the same query unfiltered. List \"NS\" alongside them to match an unfiltered total, or on its own to count them. Omit for all ages, which includes them."New value: +"Restrict to deaths in any of the listed age groups — e.g. [\"25-34\",\"35-44\"] covers both; a repeated group counts once. \"1\" is the under-1-year group. \"NS\" is the group CDC puts a death in when the age was not recorded; it is not covered by any of the ten-year groups, so a filter listing all eleven of those still leaves those deaths out and returns fewer deaths than the same query unfiltered. List \"NS\" alongside them to match an unfiltered total, or on its own to count them. Omit for all ages, which includes them."
      • changedInput schema / properties / cause_icd10 / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "const": "999--999",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ICD-10 underlying-cause code or chapter range. Ranges must match WONDER chapter boundaries exactly (an invalid code is rejected and named in the error) — valid examples: \"A00-B99\" (infectious), \"C00-C97\" (malignant neoplasms), \"I00-I99\" (circulatory), \"J00-J98\" (respiratory), \"V01-Y89\" (external causes), or a single code like \"I21\".",
        -    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "const": "999--999",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ICD-10 underlying-cause code or range. WONDER takes a node of its ICD-10 tree — a chapter such as \"A00-B99\" (infectious) or \"V01-Y89\" (external causes), a block such as \"X40-X49\" (accidental poisoning) or \"C00-C97\" (malignant neoplasms), or a single code such as \"I21\" — and rejects any other span, e.g. \"X40-X44\", naming it in the error. List the codes (or blocks) to cover a span that is not a tree node.",
        +    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "A list of 1–50 entries, each in the single-value form, matched as a union: a death counts once when it matches any of them, so a code set such as X40–X44 plus X60–X64 is one series with one set of rates. Repeated entries are ignored.",
        +    "items": {
        +      "anyOf": [
        +        {
        +          "const": "999--999",
        +          "type": "string"
        +        },
        +        {
        +          "description": "ICD-10 underlying-cause code or range. WONDER takes a node of its ICD-10 tree — a chapter such as \"A00-B99\" (infectious) or \"V01-Y89\" (external causes), a block such as \"X40-X49\" (accidental poisoning) or \"C00-C97\" (malignant neoplasms), or a single code such as \"I21\" — and rejects any other span, e.g. \"X40-X44\", naming it in the error. List the codes (or blocks) to cover a span that is not a tree node.",
        +          "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +          "type": "string"
        +        }
        +      ],
        +      "description": "One list entry: an ICD-10 code or range, or the withheld-cause marker."
        +    },
        +    "maxItems": 50,
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / cause_icd10 / description
        Previous value: -"Filter to a specific ICD-10 underlying cause of death — the single condition CDC certified as having started the chain of events leading to death. Omit for all causes. Accepted by every database. \"999--999\" is not an ICD-10 code but CDC's own marker for deaths whose cause it is still withholding under the provisional database's six-month reporting lag; it counts that backlog, and only the \"provisional\" database offers it."New value: +"Filter to ICD-10 underlying causes of death — the single condition CDC certified as having started the chain of events leading to death. Takes one code or range, or a list of them for a cause defined as a code set, e.g. drug overdose as [\"X40\",\"X41\",\"X42\",\"X43\",\"X44\",\"X60\",\"X61\",\"X62\",\"X63\",\"X64\",\"X85\",\"Y10\",\"Y11\",\"Y12\",\"Y13\",\"Y14\"]. Omit for all causes. Accepted by every database. \"999--999\" is not an ICD-10 code but CDC's own marker for deaths whose cause it is still withholding under the provisional database's six-month reporting lag; it counts that backlog, and only the \"provisional\" database offers it."
      • changedInput schema / properties / group_by / description
        Previous value: -"Dimensions to break results out by (1–4), in output-column order — e.g. [\"year\"], [\"year\",\"sex\"], [\"age_group\",\"race\"]. Results are always national. Cause of death is a filter (cause_icd10), not a grouping. \"race\" resolves to whichever race vocabulary the selected database uses — four bridged groups (Asian and Pacific Islander combined) on the 1999–2020 databases, six single-race groups plus a multiracial category on the others — so a race series from one family cannot be spliced onto one from the other."New value: +"Dimensions to break results out by (1–4, each at most once), in output-column order — e.g. [\"year\"], [\"year\",\"sex\"], [\"age_group\",\"race\"]. Results are always national. Cause of death is a filter (cause_icd10), not a grouping. \"race\" resolves to whichever race vocabulary the selected database uses — four bridged groups (Asian and Pacific Islander combined) on the 1999–2020 databases, six single-race categories on the others, one of them \"More than one race\" — so a race series from one family cannot be spliced onto one from the other."
      • changedInput schema / properties / limit / description
        Previous value: -"Rows to return from the table CDC sent (1–5000). Omit to return the whole table. WONDER's request carries no limit of its own, so this pages a table already fetched in full rather than narrowing the query: the deaths, rates, caveats and hidden-row notices are the same whichever page is read. A four-dimension grouping can run past a thousand rows, so set this and follow nextOffset to walk them."New value: +"Rows to return from the table CDC sent (1–5000). Omit to take as many as fit. Either way fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows, their cell notes, and the caveats and messages, as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from. WONDER's request carries no limit of its own, so this pages a table already fetched in full rather than narrowing the query: the deaths, rates, caveats and hidden-row notices are the same whichever page is read."
      • changedInput schema / properties / mcd_icd10 / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "const": "999--999",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ICD-10 code or chapter range, same form as cause_icd10 — e.g. \"J00-J98\" (respiratory), \"E00-E89\" (endocrine/metabolic), \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), or a single code like \"I21\".",
        -    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "const": "999--999",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ICD-10 code or range, same form as cause_icd10 — a chapter such as \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), a block such as \"J09-J18\" (influenza and pneumonia), or a single code such as \"T40.1\" (heroin).",
        +    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "A list of 1–50 entries, each in the single-value form, matched as a union: a death counts once when it matches any of them, so a code set such as X40–X44 plus X60–X64 is one series with one set of rates. Repeated entries are ignored.",
        +    "items": {
        +      "anyOf": [
        +        {
        +          "const": "999--999",
        +          "type": "string"
        +        },
        +        {
        +          "description": "ICD-10 code or range, same form as cause_icd10 — a chapter such as \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), a block such as \"J09-J18\" (influenza and pneumonia), or a single code such as \"T40.1\" (heroin).",
        +          "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +          "type": "string"
        +        }
        +      ],
        +      "description": "One list entry: an ICD-10 code or range, or the withheld-cause marker."
        +    },
        +    "maxItems": 50,
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / mcd_icd10 / description
        Previous value: -"Filter to deaths with this ICD-10 code recorded anywhere on the death certificate, whether or not it was the underlying cause — e.g. \"died with a respiratory condition listed\", a population no underlying-cause query can produce. Valid only when database is \"multiple_1999_2020\", \"multiple_2018_2024\", or \"provisional\"; the other databases record only the underlying cause and reject it. \"999--999\", the withheld-cause marker described under cause_icd10, is offered here too but only by \"provisional\". Combines with cause_icd10, which keeps meaning the underlying cause. Omit for all causes."New value: +"Filter to deaths with any of these ICD-10 codes recorded anywhere on the death certificate, whether or not it was the underlying cause — e.g. \"died with a respiratory condition listed\", a population no underlying-cause query can produce. Takes one code or range, or a list of them, e.g. opioid involvement as [\"T40.0\",\"T40.1\",\"T40.2\",\"T40.3\",\"T40.4\",\"T40.6\"]. Valid only when database is \"multiple_1999_2020\", \"multiple_2018_2024\", or \"provisional\"; the other databases record only the underlying cause and reject it. \"999--999\", the withheld-cause marker described under cause_icd10, is offered here too but only by \"provisional\". Combines with cause_icd10, which keeps meaning the underlying cause: a death must match both filters. Omit for all causes."
      • changedInput schema / properties / year_range / description
        Previous value: -"Inclusive year range. These bounds span every database (1999–2026); the years the selected one actually holds are narrower, and a range outside them is rejected with that database's span named. Omit for all years the database holds."New value: +"Inclusive year range; from must not be later than to. These bounds span every database (1999–2026); the years the selected one actually holds are narrower, and a range outside them is rejected with that database's span named. Omit for all years the database holds."
      • changedOutput schema / properties / cap / description
        Previous value: -"The requested limit that bounded this response."New value: +"Rows this call asked for — limit when set, otherwise every row from offset to the end of the table. A shown below it means the response budget cut the page short."
      • changedOutput schema / properties / caveats / description
        Previous value: -"CDC-provided caveats and footnotes: data revisions, population-estimate sources, suppression and rate-reliability rules. They describe the whole table CDC assembled, so they come back complete on every page rather than scoped to the rows returned."New value: +"CDC-provided caveats and footnotes: data revisions, population-estimate sources, suppression and rate-reliability rules. CDC's links to its methodology pages are kept as Markdown links, e.g. \"[More information.](https://wonder.cdc.gov/wonder/help/ucd-expanded.html#Confidence-Intervals)\". They describe the whole table CDC assembled, so they come back complete on every page rather than scoped to the rows returned."
      • changedOutput schema / properties / cellNotes / items / properties / row / description
        Previous value: -"Zero-based index into rows — the rows in this response, so it is relative to the page when limit or offset is set."New value: +"Zero-based index into rows — the rows in this response, so it is relative to the page rather than to the whole table."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_query`: The request does not fit the selected database — a year_range outside the years it holds, mcd_icd10 against a database that records only the underlying cause, or the withheld-cause marker against one that keeps no withheld backlog — or WONDER itself rejected it, e.g. an unknown ICD-10 code or a filter/grouping combination it does not allow. `rate_limited`: A request reached WONDER less than 15 seconds after the previous response finished, and WONDER returned 429. `upstream_error`: WONDER returned an unexpected response or was unreachable. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_query`: The request contradicts itself — a year_range whose from is later than its to, or a group_by dimension listed twice — or does not fit the selected database — a year_range outside the years it holds, mcd_icd10 against a database that records only the underlying cause, or the withheld-cause marker against one that keeps no withheld backlog — or WONDER itself rejected it, e.g. an ICD-10 code or range its tree does not hold, or a filter/grouping combination it does not allow. `rate_limited`: A request reached WONDER less than 15 seconds after the previous response to the same source IP finished, and WONDER returned 429. This server queues its own calls, so the earlier request usually came from another client sharing that IP. `upstream_error`: WONDER returned an unexpected response or was unreachable. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / messages / description
        Previous value: -"Notices CDC attached to this table, verbatim. The ones that matter say rows were withheld before the table was sent — \"Rows with zero Deaths are hidden.\" and \"Rows with suppressed Deaths are hidden.\" A withheld row is absent from rows entirely, with nothing in the table marking the gap, so while this array is non-empty a stratum missing from rows may have been dropped rather than unobserved, and any count, ranking, or completeness claim drawn from rows is partial. These describe the whole table, so they come back complete on every page. Empty when CDC withheld no rows."New value: +"Notices CDC attached to this table, verbatim apart from links, which are kept as Markdown links. The ones that matter say rows were withheld before the table was sent — \"Rows with zero Deaths are hidden.\" and \"Rows with suppressed Deaths are hidden.\" A withheld row is absent from rows entirely, with nothing in the table marking the gap, so while this array is non-empty a stratum missing from rows may have been dropped rather than unobserved, and any count, ranking, or completeness claim drawn from rows is partial. These describe the whole table, so they come back complete on every page. Empty when CDC withheld no rows."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched, when the returned rows are a page of a larger table or the offset ran past it, and a note when CDC returned a status token in place of a measure value."New value: +"Guidance when no rows matched, when the returned rows are a page of a larger table — naming whether limit or the response budget ended it — or the offset ran past it, and a note when CDC returned a status token in place of a measure value."
      • changedOutput schema / properties / rowCount / description
        Previous value: -"Number of rows returned in this response — the page size when limit or offset is set."New value: +"Number of rows returned in this response — the page size whenever it falls short of totalCount."
      • changedOutput schema / properties / rows / description
        Previous value: -"Result rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and age_adjusted_rate (per 100,000) when age standardization is possible — it is omitted when age_group is a grouping dimension or age_groups selects a single group. Dimension values are CDC's own labels with only surrounding whitespace removed, so the same year keys identically across databases; nothing inside a label is changed, and on the provisional database a year reads \"2025 (provisional)\" or \"2026 (provisional and partial)\" rather than a bare year. A measure cell CDC returned as a status token instead of a number is null here; cellNotes names the cell and the token. When limit or offset is set these are one page of the table CDC sent, in its order; totalCount says how many rows the whole table holds."New value: +"Result rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and age_adjusted_rate (per 100,000) when age standardization is possible — it is omitted when age_group is a grouping dimension or age_groups selects a single group. Dimension values are CDC's own labels with only surrounding whitespace removed, so the same year keys identically across databases; nothing inside a label is changed, and on the provisional database a year reads \"2025 (provisional)\" or \"2026 (provisional and partial)\" rather than a bare year. A measure cell CDC returned as a status token instead of a number is null here; cellNotes names the cell and the token. These are one page of the table CDC sent, in its order, bounded by limit and by the response budget; totalCount says how many rows the whole table holds."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Rows in the whole table CDC returned, before limit/offset. Exact rather than estimated — the table is parsed in full before a page is taken from it."New value: +"Rows in the whole table CDC returned, before any page was taken. Exact rather than estimated — the table is parsed in full before a page is taken from it."
  3. 1 tool update
    • Changedcdc_query_dataset2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max rows to return (default 100, max 5000). Fewer come back when the page would cross the 200,000-character response budget; the response says so and gives a nextOffset to resume from."New value: +"Max rows to return (default 100, max 5000). Fewer come back when the page would carry the response past its 200,000-character budget, counted over the whole result — the rows as JSON and as the rendered table together; the response says so and gives a nextOffset to resume from."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched, when further rows remain, or when the response budget cut the page short — how to verify filters, resume paging, or broaden the query."New value: +"Guidance when no rows matched, when offset ran past the end of the result set, when further rows remain, or when the response budget cut the page short — how to verify filters, lower offset, resume paging, or broaden the query."
  4. 4 tool updates
    • Changedcdc_discover_datasets4 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Filter by domain category (e.g., \"NNDSS\", \"Vaccinations\", \"Behavioral Risk Factors\")."New value: +"Filter by domain category (e.g., \"NNDSS\", \"Vaccinations\", \"Behavioral Risk Factors\"). Values come from the catalog's own vocabulary and are matched exactly, including case — \"Vaccinations\" matches 89 entries while \"Vaccination\" matches none. Call cdc_list_catalog_vocabulary for every value with its entry count rather than guessing at one."
      • changedInput schema / properties / tags / description
        Previous value: -"Filter by domain tags (e.g., [\"covid19\", \"surveillance\"]). Tags widen the search instead of narrowing it — a dataset matches when it carries any one of them, so every tag added returns more results, and an unrecognized tag matches nothing and leaves the result set unchanged. Values match the catalog's own tag vocabulary, case-insensitively; the tags field on each result shows which values are in use. To narrow, combine tags with query or category, which intersect with the tag set."New value: +"Filter by domain tags (e.g., [\"covid19\", \"surveillance\"]). Tags widen the search instead of narrowing it — a dataset matches when it carries any one of them, so every tag added returns more results, and an unrecognized tag matches nothing and leaves the result set unchanged. Values match the catalog's own tag vocabulary, case-insensitively; call cdc_list_catalog_vocabulary for the values in use with their entry counts, or read the tags field on any result. To narrow, combine tags with query or category, which intersect with the tag set."
      • changedOutput schema / properties / datasets / items / properties / description / description
        Previous value: -"Dataset description when provided by the catalog, truncated to 300 characters. Fetch the full text via cdc_get_dataset_schema."New value: +"Dataset description when provided by the catalog, as plain text — markup stripped and entity references decoded — then truncated to 300 characters, so the limit bounds visible text. Fetch the full text via cdc_get_dataset_schema."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the page came back empty — how to broaden a search that matched nothing, where to check tag values when a tag filter was applied, or the size of the result set when the offset ran past its end."New value: +"Guidance when the page came back empty — the catalog values closest to a category or tag filter that matched nothing, each with its entry count; how to broaden a search when no value is close; or the size of the result set when the offset ran past its end."
    • Changedcdc_get_dataset_schema3 fields changed
      • changedOutput schema / properties / description / description
        Previous value: -"Dataset description when provided."New value: +"Dataset description when provided, in full as plain text — markup stripped and entity references decoded. Never truncated here; cdc_discover_datasets is the surface that shortens it."
      • changedOutput schema / properties / rowCount / description
        Previous value: -"Total number of rows when reported by upstream; omitted when unknown."New value: +"Total rows in the dataset; omitted when neither a live nor a cached figure is available. Read rowCountSource before sizing a pagination walk against it — the cached figure can understate an actively-updated dataset by a third or more."
      • addedOutput schema / properties / rowCountSource
        Added value: +{
        +  "description": "Provenance of rowCount. \"live\" is a count(*) run against the dataset for this call. \"cached\" is the figure Socrata stored when it last built its column cache, returned when the count request did not succeed; Socrata does not refresh it as rows land. Absent exactly when rowCount is absent.",
        +  "enum": [
        +    "live",
        +    "cached"
        +  ],
        +  "type": "string"
        +}
    • Addedcdc_list_catalog_vocabulary
    • Changedcdc_query_dataset2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataset_not_found`: Dataset ID does not exist or has been retired. `no_such_column`: WHERE/SELECT/GROUP/ORDER references a column that does not exist on this dataset. `type_mismatch`: Filter value type does not match the column data type (e.g., quoting a number). `invalid_query`: Socrata rejected the SoQL query for other syntax or semantic reasons. `access_denied`: Socrata returned 403 — typically an ID naming a chart, map, story, file, or external link rather than a tabular dataset. `rate_limited`: Socrata API returns 429 Too Many Requests. `upstream_error`: Socrata data API returned a 5xx server error. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataset_not_found`: Dataset ID does not exist or has been retired. `no_such_column`: WHERE/SELECT/GROUP/ORDER references a column that does not exist on this dataset. `type_mismatch`: Filter value type does not match the column data type (e.g., quoting a number). `invalid_query`: Socrata rejected the SoQL query for other syntax or semantic reasons. `not_queryable`: The ID names a non-tabular asset: the data endpoint answered with rows carrying no fields, and the asset reports no columns. `access_denied`: Socrata returned 403 — typically an ID naming a story, file, or external link rather than a tabular dataset. `rate_limited`: Socrata API returns 429 Too Many Requests. `upstream_error`: Socrata data API returned a 5xx server error. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "dataset_not_found",
        -  "no_such_column",
        -  "type_mismatch",
        -  "invalid_query",
        -  "access_denied",
        -  "rate_limited",
        -  "upstream_error"
        -]New value: +[
        +  "dataset_not_found",
        +  "no_such_column",
        +  "type_mismatch",
        +  "invalid_query",
        +  "not_queryable",
        +  "access_denied",
        +  "rate_limited",
        +  "upstream_error"
        +]
  5. 1 tool update
    • Changedcdc_query_wonder2 fields changed
      • removedOutput schema / properties / rows / items / additionalProperties / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / additionalProperties / type
        Added value: +[
        +  "string",
        +  "number",
        +  "null"
        +]
  6. 4 tool updates
    • Changedcdc_discover_datasets6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "datasets",
        +      "totalCount",
        +      "appliedFilters"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: Socrata API returns 429 Too Many Requests. `dataset_not_found`: Socrata returned 404 for the catalog endpoint itself — the Discovery API address is wrong or the service moved. `access_denied`: Socrata returned 403 — the catalog refused this request rather than failing to serve it. `upstream_error`: Socrata catalog API returned a 5xx server error. `page_out_of_range`: offset plus limit exceeds 10000, which Socrata's catalog rejects outright. `invalid_query`: Catalog API returned 400 — typically a malformed query or invalid filter value. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "dataset_not_found",
        +            "access_denied",
        +            "upstream_error",
        +            "page_out_of_range",
        +            "invalid_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "datasets",
        -  "totalCount",
        -  "appliedFilters"
        -]
    • Changedcdc_get_dataset_schema6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "name",
        +      "columns",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `dataset_not_found`: Dataset ID does not exist or has been retired. `not_queryable`: The ID names a catalog asset with no columns — a chart, map, story, file, or external link rather than a tabular dataset. `access_denied`: Socrata returned 403 — the asset is not readable through this endpoint or access is restricted. `invalid_query`: Socrata rejected the metadata request with a 400. `rate_limited`: Socrata API returns 429 Too Many Requests. `upstream_error`: Socrata metadata API returned a 5xx server error. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "dataset_not_found",
        +            "not_queryable",
        +            "access_denied",
        +            "invalid_query",
        +            "rate_limited",
        +            "upstream_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "name",
        -  "columns",
        -  "totalCount"
        -]
    • Changedcdc_query_dataset6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "rowCount",
        +      "effectiveQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `dataset_not_found`: Dataset ID does not exist or has been retired. `no_such_column`: WHERE/SELECT/GROUP/ORDER references a column that does not exist on this dataset. `type_mismatch`: Filter value type does not match the column data type (e.g., quoting a number). `invalid_query`: Socrata rejected the SoQL query for other syntax or semantic reasons. `access_denied`: Socrata returned 403 — typically an ID naming a chart, map, story, file, or external link rather than a tabular dataset. `rate_limited`: Socrata API returns 429 Too Many Requests. `upstream_error`: Socrata data API returned a 5xx server error. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "dataset_not_found",
        +            "no_such_column",
        +            "type_mismatch",
        +            "invalid_query",
        +            "access_denied",
        +            "rate_limited",
        +            "upstream_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "rowCount",
        -  "effectiveQuery"
        -]
    • Changedcdc_query_wonder6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "rowCount",
        +      "database",
        +      "databaseTitle",
        +      "caveats",
        +      "cellNotes",
        +      "messages",
        +      "suppressedCount",
        +      "effectiveQuery",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_query`: The request does not fit the selected database — a year_range outside the years it holds, mcd_icd10 against a database that records only the underlying cause, or the withheld-cause marker against one that keeps no withheld backlog — or WONDER itself rejected it, e.g. an unknown ICD-10 code or a filter/grouping combination it does not allow. `rate_limited`: A request reached WONDER less than 15 seconds after the previous response finished, and WONDER returned 429. `upstream_error`: WONDER returned an unexpected response or was unreachable. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_query",
        +            "rate_limited",
        +            "upstream_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "rowCount",
        -  "database",
        -  "databaseTitle",
        -  "caveats",
        -  "cellNotes",
        -  "messages",
        -  "suppressedCount",
        -  "effectiveQuery",
        -  "totalCount"
        -]
  7. 3 tool updates
    • Changedcdc_get_dataset_schema10 fields changed
      • addedInput schema / properties / column_limit
        Added value: +{
        +  "default": 100,
        +  "description": "Columns to return in this call (default 100, max 500). Every dataset under the default arrives whole; past it the response reports totalCount and a nextOffset to pass back as column_offset. Raise this to pull a wide schema in one call.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / column_offset
        Added value: +{
        +  "default": 0,
        +  "description": "Index of the first column to return, for continuing past a previous call (default 0). Columns keep the order the dataset declares, so column_offset plus column_limit walks the schema without gaps or repeats. An offset at or past the column count returns an empty window rather than an error.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The column_limit that bounded this response.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / columns / description
        Previous value: -"Dataset columns with types and descriptions."New value: +"The requested window of dataset columns, with full types and descriptions. Bounded by column_limit/column_offset; the enrichment fields say how the window sits in the whole schema."
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Value to pass as column_offset on the next call to continue after the last column returned. Present only when columns remain beyond this window.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the response is a subset of the schema — which columns it covers, how to reach the rest, or that column_offset ran past the end.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of columns returned in this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total columns in the dataset schema, before column_limit/column_offset.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the returned columns are a subset of the schema. Absent means every column of the dataset is in this response.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "columns"
        -]New value: +[
        +  "name",
        +  "columns",
        +  "totalCount"
        +]
    • Changedcdc_query_dataset6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max rows to return (default 100, max 5000)."New value: +"Max rows to return (default 100, max 5000). Fewer come back when the page would cross the 200,000-character response budget; the response says so and gives a nextOffset to resume from."
      • changedInput schema / properties / offset / description
        Previous value: -"Row offset for pagination (max 1,000,000)."New value: +"Row offset for pagination (max 1,000,000). Pair with a deterministic order clause — an offset walk over unordered results can skip or repeat rows."
      • changedInput schema / properties / order / description
        Previous value: -"SoQL ORDER BY clause. Field name with optional ASC/DESC: \"total_deaths DESC\"."New value: +"SoQL ORDER BY clause. Field name with optional ASC/DESC: \"total_deaths DESC\". Set one whenever paging with offset: SODA does not order results implicitly, so consecutive offsets without a deterministic order can skip or repeat rows. When the dataset has no natural unique column, Socrata's documented minimum tie-breaker is the system field `:id`, present on every dataset — order=\":id\"."
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to resume immediately after the last row returned. Present only when further rows exist and the resume point is within the offset ceiling; a deterministic order clause is what makes the walk gap-free.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched or results were truncated — how to verify filters, paginate, or broaden the query."New value: +"Guidance when no rows matched, when further rows remain, or when the response budget cut the page short — how to verify filters, resume paging, or broaden the query."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the result row count hit the requested limit and may be incomplete."New value: +"True when rows exist beyond the ones returned, established by fetching one row more than the limit rather than inferred from the row count. Absent means this response is the complete remainder of the result set."
    • Changedcdc_query_wonder16 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Rows to return from the table CDC sent (1–5000). Omit to return the whole table. WONDER's request carries no limit of its own, so this pages a table already fetched in full rather than narrowing the query: the deaths, rates, caveats and hidden-row notices are the same whichever page is read. A four-dimension grouping can run past a thousand rows, so set this and follow nextOffset to walk them.",
        +  "maximum": 5000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Index of the first row to return, for continuing past a previous call (default 0, max 10,000). Rows keep the order CDC returned them in, which is stable for a given query, so offset plus limit walks the table without gaps or repeats. An offset at or past the row total returns an empty page rather than an error.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The requested limit that bounded this response.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / caveats / description
        Previous value: -"CDC-provided caveats and footnotes: data revisions, population-estimate sources, suppression and rate-reliability rules."New value: +"CDC-provided caveats and footnotes: data revisions, population-estimate sources, suppression and rate-reliability rules. They describe the whole table CDC assembled, so they come back complete on every page rather than scoped to the rows returned."
      • changedOutput schema / properties / cellNotes / description
        Previous value: -"One entry per measure cell CDC returned as a status token rather than a number. Those cells read null in rows, so this is what tells a withheld value apart from an unreliable one or a genuinely absent one."New value: +"One entry per measure cell CDC returned as a status token rather than a number, covering the rows in this response only. Those cells read null in rows, so this is what tells a withheld value apart from an unreliable one or a genuinely absent one."
      • changedOutput schema / properties / cellNotes / items / properties / row / description
        Previous value: -"Zero-based index into rows."New value: +"Zero-based index into rows — the rows in this response, so it is relative to the page when limit or offset is set."
      • changedOutput schema / properties / messages / description
        Previous value: -"Notices CDC attached to this table, verbatim. The ones that matter say rows were withheld before the table was sent — \"Rows with zero Deaths are hidden.\" and \"Rows with suppressed Deaths are hidden.\" A withheld row is absent from rows entirely, with nothing in the table marking the gap, so while this array is non-empty a stratum missing from rows may have been dropped rather than unobserved, and any count, ranking, or completeness claim drawn from rows is partial. Empty when CDC withheld no rows."New value: +"Notices CDC attached to this table, verbatim. The ones that matter say rows were withheld before the table was sent — \"Rows with zero Deaths are hidden.\" and \"Rows with suppressed Deaths are hidden.\" A withheld row is absent from rows entirely, with nothing in the table marking the gap, so while this array is non-empty a stratum missing from rows may have been dropped rather than unobserved, and any count, ranking, or completeness claim drawn from rows is partial. These describe the whole table, so they come back complete on every page. Empty when CDC withheld no rows."
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to resume immediately after the last row returned. Present only when further rows remain.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched, and a note when CDC returned a status token in place of a measure value."New value: +"Guidance when no rows matched, when the returned rows are a page of a larger table or the offset ran past it, and a note when CDC returned a status token in place of a measure value."
      • changedOutput schema / properties / rowCount / description
        Previous value: -"Number of rows returned."New value: +"Number of rows returned in this response — the page size when limit or offset is set."
      • changedOutput schema / properties / rows / description
        Previous value: -"Result rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and age_adjusted_rate (per 100,000) when age standardization is possible — it is omitted when age_group is a grouping dimension or age_groups selects a single group. Dimension values are CDC's own labels with only surrounding whitespace removed, so the same year keys identically across databases; nothing inside a label is changed, and on the provisional database a year reads \"2025 (provisional)\" or \"2026 (provisional and partial)\" rather than a bare year. A measure cell CDC returned as a status token instead of a number is null here; cellNotes names the cell and the token."New value: +"Result rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and age_adjusted_rate (per 100,000) when age standardization is possible — it is omitted when age_group is a grouping dimension or age_groups selects a single group. Dimension values are CDC's own labels with only surrounding whitespace removed, so the same year keys identically across databases; nothing inside a label is changed, and on the provisional database a year reads \"2025 (provisional)\" or \"2026 (provisional and partial)\" rather than a bare year. A measure cell CDC returned as a status token instead of a number is null here; cellNotes names the cell and the token. When limit or offset is set these are one page of the table CDC sent, in its order; totalCount says how many rows the whole table holds."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of rows returned in this response.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / suppressedCount / description
        Previous value: -"How many cellNotes carry the \"Suppressed\" token — cells CDC withheld for confidentiality."New value: +"How many cellNotes carry the \"Suppressed\" token — cells CDC withheld for confidentiality. Counted over the rows in this response, so it tracks the page rather than the whole table."
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Rows in the whole table CDC returned, before limit/offset. Exact rather than estimated — the table is parsed in full before a page is taken from it.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when rows remain past the ones returned. Absent means this response runs to the end of the table, which is also the case for an offset past it.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "rowCount",
        -  "database",
        -  "databaseTitle",
        -  "caveats",
        -  "cellNotes",
        -  "messages",
        -  "suppressedCount",
        -  "effectiveQuery"
        -]New value: +[
        +  "rows",
        +  "rowCount",
        +  "database",
        +  "databaseTitle",
        +  "caveats",
        +  "cellNotes",
        +  "messages",
        +  "suppressedCount",
        +  "effectiveQuery",
        +  "totalCount"
        +]
  8. 4 tool updates
    • Changedcdc_discover_datasets9 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"CDC Socrata portal to search. \"data.cdc.gov\" (default) is the main CDC catalog; \"chronicdata.cdc.gov\" hosts chronic-disease and small-area datasets (PLACES, the Heart Disease & Stroke Atlas, Environmental Public Health Tracking)."New value: +"CDC Socrata host to search. \"data.cdc.gov\" (default) and \"chronicdata.cdc.gov\" front the same catalog and return the same entries, so switching hosts neither widens nor narrows a search — chronic-disease and small-area collections such as PLACES, the Heart Disease & Stroke Atlas, and Environmental Public Health Tracking are found from either."
      • changedInput schema / properties / limit / description
        Previous value: -"Results to return (default 10, max 100)."New value: +"Results to return (default 10, max 100). offset plus limit must not exceed 10000."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset for browsing beyond first page (max 9999)."New value: +"Pagination offset for browsing beyond first page (max 9999). offset plus limit must not exceed 10000; both CDC portals hold well under two thousand entries, so offsets near that ceiling page past the end of the catalog."
      • changedInput schema / properties / tags / description
        Previous value: -"Filter by domain tags (e.g., [\"covid19\", \"surveillance\"])."New value: +"Filter by domain tags (e.g., [\"covid19\", \"surveillance\"]). Tags widen the search instead of narrowing it — a dataset matches when it carries any one of them, so every tag added returns more results, and an unrecognized tag matches nothing and leaves the result set unchanged. Values match the catalog's own tag vocabulary, case-insensitively; the tags field on each result shows which values are in use. To narrow, combine tags with query or category, which intersect with the tag set."
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"Filters applied to this query; absent fields indicate no filter on that dimension."New value: +"Filters applied to this query; absent fields indicate no filter on that dimension. Query, category, and tags intersect with each other, but multiple tags union."
      • changedOutput schema / properties / appliedFilters / properties / tags / description
        Previous value: -"Tag filters used."New value: +"Tag filters used — a dataset matched when it carried any one of them."
      • addedOutput schema / properties / datasets / items / properties / assetType
        Added value: +{
        +  "description": "Catalog asset type as Socrata reports it — \"dataset\", \"filter\", \"chart\", \"map\", \"story\", \"file\", or \"href\". Descriptive only: \"filter\" entries carry real columns and query normally, while \"chart\" and \"map\" entries do not. Read columnCount, not this field, to decide whether an entry is queryable.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / datasets / items / properties / columnCount / description
        Previous value: -"Number of columns in the dataset when reported by the catalog."New value: +"Number of columns in the dataset when reported by the catalog. A count of 0 means the entry is not tabular — cdc_get_dataset_schema and cdc_query_dataset return no usable data for it."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no datasets matched — echoes the applied filters and suggests how to broaden the search."New value: +"Guidance when the page came back empty — how to broaden a search that matched nothing, where to check tag values when a tag filter was applied, or the size of the result set when the offset ran past its end."
    • Changedcdc_get_dataset_schema1 field changed
      • changedInput schema / properties / domain / description
        Previous value: -"CDC Socrata portal hosting the dataset. Use the same portal you found the dataset on via cdc_discover_datasets: \"data.cdc.gov\" (default) or \"chronicdata.cdc.gov\"."New value: +"CDC Socrata host to fetch the dataset from. \"data.cdc.gov\" (default) and \"chronicdata.cdc.gov\" front the same catalog, so a four-by-four ID resolves on either and the default works whichever host the dataset was found on."
    • Changedcdc_query_dataset2 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"CDC Socrata portal hosting the dataset. Must match the portal the dataset lives on: \"data.cdc.gov\" (default) or \"chronicdata.cdc.gov\" (PLACES and other chronic-disease/small-area datasets)."New value: +"CDC Socrata host to query. \"data.cdc.gov\" (default) and \"chronicdata.cdc.gov\" front the same catalog, so a four-by-four ID returns the same rows from either and the default works whichever host the dataset was found on."
      • changedOutput schema / properties / effectiveQuery / description
        Previous value: -"Assembled SoQL query string sent to the Socrata API."New value: +"The SoQL clauses sent to Socrata, as `$clause=value` pairs joined by \"&\". Values read exactly as they were supplied — not URL-encoded — so a clause can be copied back into the matching parameter of another call."
    • Changedcdc_query_wonder20 fields changed
      • changedInput schema / properties / age_groups / description
        Previous value: -"Restrict to specific ten-year age groups — e.g. [\"25-34\",\"35-44\"]. \"1\" is the under-1-year group. Omit for all ages."New value: +"Restrict to deaths in any of the listed age groups — e.g. [\"25-34\",\"35-44\"] covers both. \"1\" is the under-1-year group. \"NS\" is the group CDC puts a death in when the age was not recorded; it is not covered by any of the ten-year groups, so a filter listing all eleven of those still leaves those deaths out and returns fewer deaths than the same query unfiltered. List \"NS\" alongside them to match an unfiltered total, or on its own to count them. Omit for all ages, which includes them."
      • changedInput schema / properties / age_groups / items / enum
        Previous value: -[
        -  "1",
        -  "1-4",
        -  "5-14",
        -  "15-24",
        -  "25-34",
        -  "35-44",
        -  "45-54",
        -  "55-64",
        -  "65-74",
        -  "75-84",
        -  "85+"
        -]New value: +[
        +  "1",
        +  "1-4",
        +  "5-14",
        +  "15-24",
        +  "25-34",
        +  "35-44",
        +  "45-54",
        +  "55-64",
        +  "65-74",
        +  "75-84",
        +  "85+",
        +  "NS"
        +]
      • changedInput schema / properties / cause_icd10 / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ICD-10 underlying-cause code or chapter range. Ranges must match WONDER chapter boundaries exactly (an invalid code is rejected and named in the error) — valid examples: \"A00-B99\" (infectious), \"C00-C97\" (malignant neoplasms), \"I00-I99\" (circulatory), \"J00-J98\" (respiratory), \"V01-Y89\" (external causes), or a single code like \"I21\".",
        -    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "const": "999--999",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ICD-10 underlying-cause code or chapter range. Ranges must match WONDER chapter boundaries exactly (an invalid code is rejected and named in the error) — valid examples: \"A00-B99\" (infectious), \"C00-C97\" (malignant neoplasms), \"I00-I99\" (circulatory), \"J00-J98\" (respiratory), \"V01-Y89\" (external causes), or a single code like \"I21\".",
        +    "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / cause_icd10 / description
        Previous value: -"Filter to a specific ICD-10 underlying cause of death. Omit for all causes."New value: +"Filter to a specific ICD-10 underlying cause of death — the single condition CDC certified as having started the chain of events leading to death. Omit for all causes. Accepted by every database. \"999--999\" is not an ICD-10 code but CDC's own marker for deaths whose cause it is still withholding under the provisional database's six-month reporting lag; it counts that backlog, and only the \"provisional\" database offers it."
      • addedInput schema / properties / database
        Added value: +{
        +  "default": "underlying_1999_2020",
        +  "description": "Which WONDER mortality database to query. \"underlying_1999_2020\" (D76) is final data for 1999–2020 and the default. \"provisional\" (D176) runs 2018 through the current year, updated weekly, and returns the most recent years labelled e.g. \"2025 (provisional)\". \"underlying_2018_2024\" (D158) is settled — not provisional — data for 2018–2024. \"multiple_1999_2020\" (D77) and \"multiple_2018_2024\" (D157) record every cause listed on the death certificate; without an mcd_icd10 filter they return the same figures as the underlying-cause database for the same era, so pick one only to use that filter. The two 1999–2020 databases report race in CDC's four bridged groups; the other three use the six single-race groups — figures broken out by race are not comparable between the two families.",
        +  "enum": [
        +    "underlying_1999_2020",
        +    "provisional",
        +    "underlying_2018_2024",
        +    "multiple_1999_2020",
        +    "multiple_2018_2024"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / group_by / description
        Previous value: -"Dimensions to break results out by (1–4), in output-column order — e.g. [\"year\"], [\"year\",\"sex\"], [\"age_group\",\"race\"]. Results are always national. Cause of death is a filter (cause_icd10), not a grouping."New value: +"Dimensions to break results out by (1–4), in output-column order — e.g. [\"year\"], [\"year\",\"sex\"], [\"age_group\",\"race\"]. Results are always national. Cause of death is a filter (cause_icd10), not a grouping. \"race\" resolves to whichever race vocabulary the selected database uses — four bridged groups (Asian and Pacific Islander combined) on the 1999–2020 databases, six single-race groups plus a multiracial category on the others — so a race series from one family cannot be spliced onto one from the other."
      • addedInput schema / properties / mcd_icd10
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "",
        +      "type": "string"
        +    },
        +    {
        +      "const": "999--999",
        +      "type": "string"
        +    },
        +    {
        +      "description": "ICD-10 code or chapter range, same form as cause_icd10 — e.g. \"J00-J98\" (respiratory), \"E00-E89\" (endocrine/metabolic), \"S00-T98\" (injury and poisoning, a chapter the underlying-cause finder does not list), or a single code like \"I21\".",
        +      "pattern": "^[A-Z][0-9]{2}(\\.[0-9]+)?(-[A-Z][0-9]{2}(\\.[0-9]+)?)?$",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "Filter to deaths with this ICD-10 code recorded anywhere on the death certificate, whether or not it was the underlying cause — e.g. \"died with a respiratory condition listed\", a population no underlying-cause query can produce. Valid only when database is \"multiple_1999_2020\", \"multiple_2018_2024\", or \"provisional\"; the other databases record only the underlying cause and reject it. \"999--999\", the withheld-cause marker described under cause_icd10, is offered here too but only by \"provisional\". Combines with cause_icd10, which keeps meaning the underlying cause. Omit for all causes."
        +}
      • changedInput schema / properties / year_range / description
        Previous value: -"Inclusive year range within 1999–2020. Omit for all years."New value: +"Inclusive year range. These bounds span every database (1999–2026); the years the selected one actually holds are narrower, and a range outside them is rejected with that database's span named. Omit for all years the database holds."
      • changedInput schema / properties / year_range / properties / from / description
        Previous value: -"First year (1999–2020)."New value: +"First year (1999–2026 across all databases; the selected one holds a narrower span)."
      • changedInput schema / properties / year_range / properties / from / maximum
        Previous value: -2020New value: +2026
      • changedInput schema / properties / year_range / properties / to / description
        Previous value: -"Last year (1999–2020)."New value: +"Last year (1999–2026 across all databases; the selected one holds a narrower span)."
      • changedInput schema / properties / year_range / properties / to / maximum
        Previous value: -2020New value: +2026
      • addedOutput schema / properties / cellNotes
        Added value: +{
        +  "description": "One entry per measure cell CDC returned as a status token rather than a number. Those cells read null in rows, so this is what tells a withheld value apart from an unreliable one or a genuinely absent one.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One flagged measure cell: where it is and what CDC put there.",
        +    "properties": {
        +      "column": {
        +        "description": "Measure column whose numeric value the token replaced.",
        +        "type": "string"
        +      },
        +      "row": {
        +        "description": "Zero-based index into rows.",
        +        "type": "number"
        +      },
        +      "token": {
        +        "description": "Token CDC returned in place of a number: \"Suppressed\" (withheld for confidentiality, fewer than 10 persons), \"Unreliable\" (rate from fewer than 20 deaths — published, not withheld), or \"Not Applicable\" (no population denominator).",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "row",
        +      "column",
        +      "token"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / database / description
        Previous value: -"WONDER database queried (D76 — Underlying Cause of Death, 1999–2020)."New value: +"WONDER dataset code the rows came from — e.g. \"D76\", \"D176\", \"D157\"."
      • addedOutput schema / properties / databaseTitle
        Added value: +{
        +  "description": "CDC's own title for that database, e.g. \"Underlying Cause of Death, 1999-2020\". Names the era and record type the rows describe, so a result read on its own is self-describing.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / messages
        Added value: +{
        +  "description": "Notices CDC attached to this table, verbatim. The ones that matter say rows were withheld before the table was sent — \"Rows with zero Deaths are hidden.\" and \"Rows with suppressed Deaths are hidden.\" A withheld row is absent from rows entirely, with nothing in the table marking the gap, so while this array is non-empty a stratum missing from rows may have been dropped rather than unobserved, and any count, ranking, or completeness claim drawn from rows is partial. Empty when CDC withheld no rows.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched, or a note that CDC suppressed some cells."New value: +"Guidance when no rows matched, and a note when CDC returned a status token in place of a measure value."
      • changedOutput schema / properties / rows / description
        Previous value: -"Result rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and — unless grouped by age_group — age_adjusted_rate (per 100,000). Suppressed measure cells (< 10 deaths) are null."New value: +"Result rows. Each carries the requested group-by dimensions plus deaths, population, crude_rate, and age_adjusted_rate (per 100,000) when age standardization is possible — it is omitted when age_group is a grouping dimension or age_groups selects a single group. Dimension values are CDC's own labels with only surrounding whitespace removed, so the same year keys identically across databases; nothing inside a label is changed, and on the provisional database a year reads \"2025 (provisional)\" or \"2026 (provisional and partial)\" rather than a bare year. A measure cell CDC returned as a status token instead of a number is null here; cellNotes names the cell and the token."
      • changedOutput schema / properties / suppressedCount / description
        Previous value: -"Number of measure cells CDC suppressed (< 10 deaths), returned as null."New value: +"How many cellNotes carry the \"Suppressed\" token — cells CDC withheld for confidentiality."
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "rowCount",
        -  "database",
        -  "caveats",
        -  "suppressedCount",
        -  "effectiveQuery"
        -]New value: +[
        +  "rows",
        +  "rowCount",
        +  "database",
        +  "databaseTitle",
        +  "caveats",
        +  "cellNotes",
        +  "messages",
        +  "suppressedCount",
        +  "effectiveQuery"
        +]
  9. 1 tool update
    • Addedcdc_query_wonder
  10. 2 tool updates
    • Changedcdc_discover_datasets1 field changed
      • addedInput schema / properties / order
        Added value: +{
        +  "default": "dataset_id",
        +  "description": "Result ordering. \"dataset_id\" (default) sorts deterministically by each dataset's unique catalog ID — required for stable offset pagination, since consecutive pages form a gap-free, duplicate-free traversal. \"relevance\" returns best-match ranking for keyword search but is not stably paginable across pages, so walking offsets can skip or repeat datasets.",
        +  "enum": [
        +    "dataset_id",
        +    "relevance"
        +  ],
        +  "type": "string"
        +}
    • Changedcdc_query_dataset2 fields changed
      • changedInput schema / properties / offset / description
        Previous value: -"Row offset for pagination."New value: +"Row offset for pagination (max 1,000,000)."
      • changedInput schema / properties / offset / maximum
        Previous value: -9007199254740991New value: +1000000
  11. 3 tool updates
    • Changedcdc_discover_datasets6 fields changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "default": "data.cdc.gov",
        +  "description": "CDC Socrata portal to search. \"data.cdc.gov\" (default) is the main CDC catalog; \"chronicdata.cdc.gov\" hosts chronic-disease and small-area datasets (PLACES, the Heart Disease & Stroke Atlas, Environmental Public Health Tracking).",
        +  "enum": [
        +    "data.cdc.gov",
        +    "chronicdata.cdc.gov"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / datasets / items / properties / columnCount
        Added value: +{
        +  "description": "Number of columns in the dataset when reported by the catalog.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / datasets / items / properties / columnNames
        Removed value: -{
        -  "description": "Available column field names when provided.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • addedOutput schema / properties / datasets / items / properties / columnSample
        Added value: +{
        +  "description": "First 8 column field names as a preview. Call cdc_get_dataset_schema for the full column list with data types.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / datasets / items / properties / columnTypes
        Removed value: -{
        -  "description": "Column data types (parallel to columnNames) when provided.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedOutput schema / properties / datasets / items / properties / description / description
        Previous value: -"Dataset description when provided by the catalog."New value: +"Dataset description when provided by the catalog, truncated to 300 characters. Fetch the full text via cdc_get_dataset_schema."
    • Changedcdc_get_dataset_schema1 field changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "default": "data.cdc.gov",
        +  "description": "CDC Socrata portal hosting the dataset. Use the same portal you found the dataset on via cdc_discover_datasets: \"data.cdc.gov\" (default) or \"chronicdata.cdc.gov\".",
        +  "enum": [
        +    "data.cdc.gov",
        +    "chronicdata.cdc.gov"
        +  ],
        +  "type": "string"
        +}
    • Changedcdc_query_dataset1 field changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "default": "data.cdc.gov",
        +  "description": "CDC Socrata portal hosting the dataset. Must match the portal the dataset lives on: \"data.cdc.gov\" (default) or \"chronicdata.cdc.gov\" (PLACES and other chronic-disease/small-area datasets).",
        +  "enum": [
        +    "data.cdc.gov",
        +    "chronicdata.cdc.gov"
        +  ],
        +  "type": "string"
        +}
  12. 1 tool update
    • Changedcdc_query_dataset1 field changed
      • changedInput schema / properties / where / description
        Previous value: -"SoQL WHERE clause. Strings must be single-quoted: \"state='California' AND year=2020\"."New value: +"SoQL WHERE clause. Strings must be single-quoted: \"state='California' AND year=2020\". If a column name matches a SoQL keyword (group, select, where, order, limit, offset, having, search), wrap it in backticks: \"`group`='By Year'\"."
  13. 1 tool update
    • Changedcdc_query_dataset4 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The requested limit that bounded this response.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no rows matched — suggests how to verify filter values or broaden the WHERE clause."New value: +"Guidance when no rows matched or results were truncated — how to verify filters, paginate, or broaden the query."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of rows returned in this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the result row count hit the requested limit and may be incomplete.",
        +  "type": "boolean"
        +}
  14. 1 tool update
    • Changedcdc_query_dataset1 field changed
      • changedInput schema / properties / datasetId / description
        Previous value: -"Four-by-four dataset identifier (e.g., \"bi63-dtpu\")."New value: +"Four-by-four dataset identifier (e.g., \"bi63-dtpu\"). Obtain from cdc_discover_datasets."
  15. 2 tool updates
    • Changedcdc_discover_datasets3 fields changed
      • changedOutput schema / properties / appliedFilters / description
        Previous value: -"Filters that were applied to this query; absent fields indicate no filter on that dimension."New value: +"Filters applied to this query; absent fields indicate no filter on that dimension."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no datasets matched — echoes the applied filters and suggests how to broaden the search.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total matching datasets (for pagination)."New value: +"Total matching datasets in the catalog (for pagination)."
    • Changedcdc_query_dataset4 fields changed
      • addedOutput schema / properties / effectiveQuery
        Added value: +{
        +  "description": "Assembled SoQL query string sent to the Socrata API.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no rows matched — suggests how to verify filter values or broaden the WHERE clause.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / query
        Removed value: -{
        -  "description": "Assembled SoQL query string sent to Socrata.",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "rowCount",
        -  "query"
        -]New value: +[
        +  "rows",
        +  "rowCount",
        +  "effectiveQuery"
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides access to 73 CDC public health datasets covering disease surveillance, vaccination tracking, behavioral risk factors, environmental health, and outbreak detection across 18 surveillance systems through the Socrata Open Data API.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query U.S. public-health datasets such as disease surveillance, mortality, behavioral risk factors, and flu activity through the Socrata API, using natural language or direct tool calls.
    16 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to discover, inspect, and query CMS open datasets covering Medicare/Medicaid provider, spending, enrollment, drug pricing, quality, hospital, nursing home, and ACO data. Supports keyword search, metadata lookup, paged row retrieval, full-text search, and exact-match column filters.
    9 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Connect your ads, shop, analytics, social, CRM and finance platforms once, then let Claude, ChatGPT, Cursor or any MCP client read, join and explain your numbers. Public statistics from the World Bank, IMF, Eurostat, OECD, WHO and SEC filings come as context, searchable and chartable from the same tools. Read-only by design, every number carries its source.
    57
    358 npm
    2
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.