Recall Canary
Server Details
U.S. federal product recalls from FDA, FSIS, CPSC, and NHTSA, in one schema.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP ยท MCP 2025-11-25
- URL
TDQS
Scored across 2 tools
The two tools form a clear search/fetch pair with no overlap: search_recalls returns abbreviated matches, get_recall returns the full record. Descriptions explicitly state the workflow and cross-reference each other's filters (agency/slug, firm.slug).
Both follow a consistent verb_noun pattern (search_recalls, get_recall), and the singular/plural noun distinction correctly signals single-record vs. multi-record operations.
Two tools is thin but well-matched to a read-only recall lookup service where search+detail is the whole workflow. Each tool clearly earns its place with no redundancy.
The domain is read-only recall lookup, and search (with rich filtering, pagination, sorting) plus full-record retrieval with cross-links to firm and preliminary release pages fully covers it. No write operations are expected for this service.
Available Tools
2 toolsget_recallGet one recall by agency and slugRead-onlyInspect
Fetch the full Recall Canary record for a single U.S. federal recall, given the agency and slug returned by search_recalls. Includes the hazard description, the affected product list with lot codes and UPCs, the recommended consumer action, distribution, the agency source link, and the firm slug (firm.slug, with firm.page_url when the firm has a page) for search_recalls' firm filter. Also resolves preliminary agency press releases: an orphan, or a linked one that kept its own URL (its recalls in linked_recalls). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The record slug from its URL, e.g. "acme-foods-peanut-butter". The 26-character ULID id is also accepted and resolves to what its URL shows (for a matched press release, often its recall). | |
| agency | Yes | Lowercase agency segment from the record URL. Part of the lookup key, not decoration: a correct slug under the wrong agency is a miss. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| firm | No | |
| risk | No | The agency rating as the page shows it (for example "High risk" for an FDA Class I recall). Null where the page shows no risk line. |
| slug | No | |
| dates | No | |
| notes | Yes | Caveats for this record, including the aggregator-lag and not-a-clearance statement. |
| title | Yes | Agency-published title. Never model-written. |
| agency | Yes | Known values: FDA, FDA_IRES, FSIS, CPSC, NHTSA, ADMIN. |
| reason | No | The agency's own stated reason, not model-written. |
| status | No | |
| license | Yes | Attribution and terms (DATA-LICENSE). |
| related | No | |
| category | No | Known values: FOOD, DRUG, DEVICE, COSMETIC, CONSUMER_PRODUCT, VEHICLE, AUTO_EQUIPMENT. |
| html_url | Yes | Absolute URL of the human-readable page. |
| products | No | |
| severity | No | Known values: CRITICAL, MODERATE, LOW. |
| timeline | No | Dated steps of the record, in date order. Each step names who acted on that date. |
| canonical | Yes | Absolute URL of this representation. |
| firm_name | No | |
| listed_at | No | Since api 2.6.0. The date the listing shows and sorts by; equals this record's search_recalls row. A recall's listing date is in dates.listed_at. |
| source_url | No | The agency's own notice. |
| api_version | Yes | |
| description | No | Full agency description. FSIS: sanitized HTML; others: plain text. Sanitize or escape before display. |
| hazard_tags | Yes | |
| record_type | Yes | |
| snapshot_at | Yes | ISO-8601 UTC response-generation time, second precision. First key on purpose. |
| advisory_url | No | |
| ai_generated | Yes | Provenance: true where the field holds model-written text. Over-attributes on purpose. |
| distribution | No | |
| published_at | No | Deprecated: the stored pub_date. |
| display_title | No | |
| mcp_truncated | No | Present only when a long list was cut to 25 for this response. |
| product_count | No | The true event scope, which may exceed products.length. |
| story_lead_id | No | Set on a later record of a recall story; the lead it belongs to. |
| critical_flags | No | NHTSA-only in practice. An absent key means the agency did not state the flag. null for a withdrawn (RETRACTED) record. |
| identification | Yes | Page-derived identification: the products and codes the record names. Not a completeness guarantee; `partial` says when the list is incomplete, including when this response cut `products` to 25 (`mcp_truncated.identification_products`). |
| linked_recalls | No | |
| press_releases | No | |
| story_lead_url | No | |
| units_affected | No | |
| consumer_action | No | The "What to do" text. Null on a withdrawn alert. |
| display_summary | No | |
| source_recall_id | No | Agency key; a CPSC one can be stale. |
| content_changed_at | Yes | When the published content last changed. |
| products_truncated | No | True when `product_count` exceeds the length of `products` |
| agency_published_at | No | |
| company_announced_at | No | |
| company_product_list | No | The company's own list of the affected products, when the agency notice points to it instead of naming them. A product missing from `identification` may still be recalled: check this list. |
| display_summary_short | No |
search_recallsSearch U.S. federal product recallsRead-onlyInspect
Search the Recall Canary index of U.S. federal product recalls (FDA, FSIS, CPSC, NHTSA) by keyword, agency, severity, category, distribution state, hazard, firm, or date window. Returns up to 50 matching records per page with abbreviated content (title, firm, severity, date, and the canonical URL of each); call get_recall to fetch the full record. With a keyword, the best matches come first unless sort says otherwise. Unknown agency, severity, category, state and date values are rejected with an error message describing the allowed values. An unknown hazard or firm is also an error. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text query over one index of canonical recalls and preliminary press releases: titles, firm, product name/brand/description, agency reason text, AI summary, hazard tags, and identifiers (UPC, NDC, lot codes, recall and campaign numbers; codes match as printed or as bare digits, including typed in spaced or dashed groups). Every word must match, in any order; words of 3+ characters also match as prefixes (a 2-letter word matches itself and its plural), a plural also matches its singular, and a double-quoted run is an exact phrase. The one operator is an uppercase OR between two words, binding tighter than the implicit AND (`salmonella OR listeria cheese` = (salmonella OR listeria) AND cheese); NOT and NEAR are ordinary words. If no record matches every word, the results fall back to records matching SOME of them and the response says `relaxed: true` (with a notice): those are not confirmed matches. A `q` with more than 10 distinct words or codes is refused with a tool error, not searched in part. Results are ranked by relevance by default. A `q` with no searchable word (only symbols, punctuation or the operators OR / AND) is refused with a tool error, not browsed: omit `q` to browse by filters. Zero results is never evidence a product is unaffected: agencies print codes inconsistently, so also search the brand or product name and compare codes on the record. | |
| to | No | Inclusive upper bound, YYYY-MM-DD at 23:59:59 UTC. | |
| date | No | Relative window, resolved against the request clock. Ignored when `from` or `to` is set. | |
| firm | No | Firm slug: the firm of one recall, as the `firm.slug` value of a get_recall record, or the last part of a /firm/ page URL (for example "acme-foods"). Matches that firm's recalls and press releases. An unknown or malformed slug is an error, not a dropped filter: no search is returned. | |
| from | No | Inclusive lower bound, YYYY-MM-DD at 00:00:00 UTC. | |
| page | No | 1-based page number, 50 records per page. Values above 200 clamp to 200; reach deeper archive by narrowing the date window instead. Pass the next page number in this parameter to navigate paginated results. | |
| sort | No | `relevance` (the default when `q` is set) puts the best matches first. `recent` orders by listing date descending (the default without `q`). `severity` puts CRITICAL then MODERATE first, date descending within each band. | |
| state | No | Two-letter USPS code for a U.S. state or DC. Matches records distributed there or flagged nationwide. Territories are not filterable. Note the round trip: this takes a bare code such as "TX", while `distribution.geos` in the response emits ISO 3166-2 ("US-TX"). | |
| agency | No | Issuing agencies; matches any. Case-insensitive; values are uppercase. | |
| hazard | No | Single-select hazard tag, lowercase and hyphenated, the same filter as the website hazard pages: matches records whose hazard_tags include it, press releases included. Anything else is an error. | |
| category | No | Single-select product category. Case-insensitive; values are uppercase. | |
| severity | No | Matches any. The issuing agency's own level (FDA/FSIS class, NHTSA do-not-drive or park-outside warning) on one scale by a fixed rule; null when the agency gave none. A record reporting null can still match MODERATE here. CPSC records are reachable only via UNKNOWN. Preliminary press releases count as UNKNOWN: a filter without UNKNOWN excludes them. Case-insensitive; values are uppercase. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | The caveat that absence of a match is not a clearance. |
| filters | Yes | The filters as applied, after normalization. An unapplied filter is echoed as null or []. |
| license | Yes | Attribution and terms (DATA-LICENSE). |
| notices | Yes | Rules that narrowed or widened the results, stated in band. Empty when none apply. |
| relaxed | Yes | |
| results | Yes | |
| html_url | Yes | Absolute URL of the human-readable page. |
| canonical | Yes | Absolute URL of this representation. |
| pagination | Yes | |
| api_version | Yes | |
| snapshot_at | Yes | ISO-8601 UTC response-generation time, second precision. First key on purpose. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
get_recall1 field changed- changed
Output schema / properties / identification / descriptionPrevious value: -"Page-derived identification: the products and codes the record names. Not a completeness guarantee; `partial` says when the list is incomplete."New value: +"Page-derived identification: the products and codes the record names. Not a completeness guarantee; `partial` says when the list is incomplete, including when this response cut `products` to 25 (`mcp_truncated.identification_products`)."
- Changed
search_recalls3 fields changed- changed
Input schema / properties / q / descriptionPrevious value: -"Free-text query over one index of canonical recalls and preliminary press releases: titles, firm, product name/brand/description, agency reason text, AI summary, hazard tags, and identifiers (UPC, NDC, lot codes, recall and campaign numbers; codes match as printed or as bare digits, including typed in spaced or dashed groups). Every word must match, in any order; words also match as prefixes, a plural also matches its singular, and a double-quoted run is an exact phrase. The one operator is an uppercase OR between two words, binding tighter than the implicit AND (`salmonella OR listeria cheese` = (salmonella OR listeria) AND cheese); NOT and NEAR are ordinary words. If no record matches every word, the results fall back to records matching SOME of them and the response says `relaxed: true` (with a notice): those are not confirmed matches. Results are ranked by relevance by default. A `q` with no searchable word (only symbols, punctuation or the operators OR / AND) is refused with a tool error, not browsed: omit `q` to browse by filters. Zero results is never evidence a product is unaffected: agencies print codes inconsistently, so also search the brand or product name and compare codes on the record."New value: +"Free-text query over one index of canonical recalls and preliminary press releases: titles, firm, product name/brand/description, agency reason text, AI summary, hazard tags, and identifiers (UPC, NDC, lot codes, recall and campaign numbers; codes match as printed or as bare digits, including typed in spaced or dashed groups). Every word must match, in any order; words of 3+ characters also match as prefixes (a 2-letter word matches itself and its plural), a plural also matches its singular, and a double-quoted run is an exact phrase. The one operator is an uppercase OR between two words, binding tighter than the implicit AND (`salmonella OR listeria cheese` = (salmonella OR listeria) AND cheese); NOT and NEAR are ordinary words. If no record matches every word, the results fall back to records matching SOME of them and the response says `relaxed: true` (with a notice): those are not confirmed matches. A `q` with more than 10 distinct words or codes is refused with a tool error, not searched in part. Results are ranked by relevance by default. A `q` with no searchable word (only symbols, punctuation or the operators OR / AND) is refused with a tool error, not browsed: omit `q` to browse by filters. Zero results is never evidence a product is unaffected: agencies print codes inconsistently, so also search the brand or product name and compare codes on the record." - changed
Output schema / properties / results / items / descriptionPrevious value: -"One compacted listing row. Null-valued keys are omitted, so only record_type, id, agency, url, product_count and hazard_tags are guaranteed. `title` and `reason` are not in this projection; call get_recall for the full record."New value: +"One compacted listing row. Null-valued keys are omitted, so only record_type, id, agency, url, product_count and hazard_tags are guaranteed, and every row carries `display_title` or `title`. `reason` is not in this projection; call get_recall for the full record." - added
Output schema / properties / results / items / properties / titleAdded value: +{ + "description": "Only when `display_title` is absent (a record not yet enriched): the title recallcanary.com shows for it, from the agency record's product names and title; never the agency headline. Not model-written.", + "type": "string" +}
2 tool updates
- First observed
get_recall - First observed
search_recalls
Related MCP Connectors
Search U.S. product recalls (CPSC, FDA, NHTSA, FSIS) by product, brand, model, or UPC code.
Search U.S. FDA, USDA FSIS, and CPSC recalls, fetch one, or diff since a date. API key or x402.
US vehicle, car-seat, product and food recalls, VIN decoding and crash ratings (NHTSA, CPSC, FDA).
CPSC MCP โ US consumer-product safety recalls (CPSC, free, no auth).
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAccess US consumer-product safety recalls from the CPSC, free and without authentication.25 npmMIT
- AlicenseAqualityBmaintenanceSearches US product recalls across CPSC, FDA, and NHTSA in one call, matching by name, brand, model number, UPC, or VIN with confidence scoring.31MIT
- AlicenseNot gradedqualityAmaintenanceSearch and retrieve US consumer product recalls from the CPSC (Consumer Product Safety Commission) via MCP, with STDIO or Streamable HTTP.94 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables Alexa+ and any MCP client to ask out loud whether a car, crib, food or medicine has been recalled, drawing on NHTSA, CPSC and FDA data in parallel. Returns a short spoken answer plus structured recall details such as hazard, remedy and official link.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.