Skip to main content
Glama

cpsc-recalls-mcp-server

Server Details

US consumer product recalls from the CPSC — hazards, remedies, and affected products.

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 51 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/cpsc-recalls-mcp-server
GitHub Stars
1
Server Listing
@cyanheads/cpsc-recalls-mcp-server

TDQS

A4.7/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct purpose: searching by criteria, fetching recent recalls, and retrieving a full record by recall number. There is no functional overlap—an agent can easily choose the right tool for the task.

Naming Consistency4/5

All tools share the cpsc_ prefix and follow a verb-first pattern: get_recall, get_recent, search_recalls. The only minor deviation is 'get_recent' omitting the object noun, but the pattern remains predictable and readable.

Tool Count5/5

Three tools is an ideal scope for a read-only recall lookup server: search, browse recent, and fetch by ID. Each tool earns its place and there is no bloat or inadequacy.

Completeness5/5

The surface fully covers the recall lookup workflow: discover recalls via search or recent listing, then drill into full details with recall_number. No obvious lifecycle operations are missing because the server is inherently read-only.

Available Tools

3 tools
cpsc_get_recallGet CPSC Recall DetailA
Read-onlyIdempotent
Inspect

Fetch the full record for one CPSC recall by recall number: hazard description, remedy instructions, every product variant, UPCs, incident and injury reports, images, and the official CPSC recall page URL. Get a recall number from cpsc_search_recalls or cpsc_get_recent. CPSC jurisdiction: consumer products only — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), and firearms (ATF) are covered by other agencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
recall_numberYesCPSC recall number: 5 digits for 2002–present records, e.g. "25043", or 5 digits plus a letter a–d for 1998–2001 records, e.g. "99003a". Get one from cpsc_search_recalls or cpsc_get_recent results.

Output Schema

ParametersJSON Schema
NameRequiredDescription
upcsNoUPC codes for this recall (sparse — ~4% of records have UPCs). CPSC lists UPCs for the recall as a whole, not per product, so on a recall covering several products a UPC cannot be tied to one of them.
errorNoPresent when the call failed. Absent on success.
titleNoOfficial recall title.
imagesNoProduct and identification images from the recall notice.
hazardsNoHazards — read this first.
cpsc_urlNoOfficial CPSC recall page — authoritative source for consumers.
injuriesNoInjury and incident report narrative, e.g. "None reported" or incident count.
productsNoProducts covered. A recall may include multiple products. Model numbers are often in the description text, not a structured field.
importersNoImporter company names.
retailersNoRetailer names with sale date ranges and price.
descriptionNoFull recall description including product identification details. Model numbers are typically embedded here, not in a structured field. Null when CPSC published the record without a description — rare, but a genuine record can still be complete otherwise.
recall_dateNoDate issued, ISO 8601.
source_noteNoProvenance caveat: recall fields are CPSC record text with HTML markup and character codes converted to plain text, not otherwise edited or verified; check cpsc_url before a consumer-facing decision.
distributorsNoDistributor company names.
last_updatedNoDate last published, ISO 8601.
manufacturersNoManufacturer names (often empty — see importers).
recall_numberNoRecall identifier.
remedy_optionsNoRemedy types available: Refund, Repair, Replace, New Instructions, Dispose, Label, No Remedy Available, Inspect. Often empty — CPSC classified the remedy on fewer than half its records. Read remedy_instructions when this is empty, and fall back to cpsc_url when that is empty too, rather than reporting that no remedy exists.
consumer_contactNoContact information for claiming the remedy. Null when not provided.
cpsc_jurisdictionNoWhich products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF).
data_quality_notesNoGaps this server observed in the CPSC record — absent description, absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing.
coordinated_recallsNoURLs of coordinated recalls by other agencies (e.g., Canada Health).
remedy_instructionsNoFull remedy instructions — exactly what a consumer should do and how to claim.
manufacturer_countriesNoCountries of manufacture.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds behavioral context by listing the full set of returned components, the prerequisite of having a valid recall number, and the jurisdictional limit. It does not contradict the annotations; no destructive or state-changing behavior is implied.

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?

The description is three sentences, each serving a distinct purpose: what the tool returns, how to get the input, and jurisdictional scope. It is front-loaded with the core action and content list, with no filler or 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 single-parameter read tool with an output schema and annotations, the description is materially complete. It covers prerequisites, included data, and exceptions. It does not explain error responses, but the simple nature of the tool and the presence of an output schema make that non-critical.

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 the baseline is 3. The description adds value beyond the schema by telling the agent where to obtain a recall number (from cpsc_search_recalls or cpsc_get_recent), which is not in the schema. It also reinforces that recall_number is the unique lookup key, making it clear how to populate the single required parameter.

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 'Fetch the full record for one CPSC recall by recall number' — a specific verb and resource — then enumerates exactly what is included (hazard description, remedy, variants, UPCs, incidents, images, URL). It clearly distinguishes from siblings: cpsc_search_recalls returns a list, cpsc_get_recent returns recent recalls, while this tool returns a single full detail record.

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 explicitly says 'Get a recall number from cpsc_search_recalls or cpsc_get_recent,' giving a prerequisite and pointing to the sibling tools that supply the input. It also provides an exclusion rule by listing agencies for non-consumer products (FDA, NHTSA, etc.), clarifying when not to use CPSC. It lacks a direct 'use this instead of X when...' comparison, but the context is clear enough that an agent can determine when to invoke it.

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

cpsc_get_recentGet Recent CPSC RecallsA
Read-only
Inspect

Fetch the most recent CPSC consumer product recalls, newest-first, from a window of the last N days (default 30, up to 365). Use for "what's been recalled lately?" or a product safety feed; to find recalls by product, brand, hazard, or an older date range, use cpsc_search_recalls. Page past limit with offset: narrowing days cannot page, because the window is anchored to today and shrinking it drops the oldest recalls rather than advancing past the newest. A page returns fewer than limit recalls when it reaches the 64,000-byte response size budget; has_more and the notice give the offset to continue from. Pass a recall_number to cpsc_get_recall for the full record. CPSC jurisdiction: consumer products only — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), and firearms (ATF) are covered by other agencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLook back this many days from today. Defaults to 30. Use 7 for a weekly digest, 90 for a quarterly review.
limitNoMaximum number of recalls to return. Defaults to 20. A page returns fewer when it reaches the 64,000-byte response size budget.
offsetNoSkip this many recalls in the window before returning results. To page through total_found, raise offset by the number of recalls the previous page returned — limit, unless that page reached the response size budget. An offset at or past total_found returns an empty result set rather than an error.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent when the page needs explaining: a window with no recalls (with a larger days to try), an offset past the last recall, or a page cut short by the response size budget (with the offset to continue from).
offsetNoNumber of recalls skipped before this window.
periodNoDate range queried.
recallsNoRecent recalls, newest-first.
has_moreNoTrue when recalls remain past this window — call again with offset raised by the number of recalls returned.
truncatedNoTrue when recalls in the window remain past this page — always equal to has_more.
source_noteNoProvenance caveat: recall fields are CPSC record text with HTML markup and character codes converted to plain text, not otherwise edited or verified; check cpsc_url before a consumer-facing decision.
total_foundNoTotal recalls in this period, counted before offset, limit, and the response size budget narrow the window.
cpsc_jurisdictionNoWhich products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF).

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true, and the description adds meaningful behavioral details beyond that: newest-first ordering, window anchored to today, inability to page by narrowing days, the 64,000-byte response size budget, and the has_more/notice continuation mechanism. This gives an agent accurate expectations for pagination and edge cases.

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?

Every sentence earns its place: purpose, use case, pagination behavior, response budget, related tool, and jurisdiction. The most important information is front-loaded, and later sentences expand only where the agent needs behavioral nuance.

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 read-only list tool with an output schema present, the description covers invocation intent, pagination, edge behavior, related tools, and domain boundaries. Nothing critical is missing for an agent to select and call it correctly.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is 3, but the description significantly supplements the schema. It explains how days interacts with the anchored window, why limit may return fewer results due to response size, and exactly how offset should be advanced using the previous page's returned count. This is genuinely useful beyond the JSON Schema field descriptions.

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 most recent CPSC consumer product recalls, newest-first' with a clear time window. It also distinguishes itself from cpsc_search_recalls and cpsc_get_recall, so an agent can immediately tell what this tool is for versus its siblings.

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?

Explicitly says to use this for 'what's been recalled lately?' or a product safety feed, and names cpsc_search_recalls for product/brand/hazard/older-date searches. It also clarifies jurisdiction boundaries with other agencies, leaving little ambiguity about when this tool applies.

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

cpsc_search_recallsSearch CPSC RecallsA
Read-onlyIdempotent
Inspect

Search consumer product recalls from the CPSC (Consumer Product Safety Commission) — toys, electronics, furniture, appliances, children's products, tools, and clothing. Give at least one text filter or date bound; to browse the latest recalls without one, use cpsc_get_recent. Filters combine with AND, and a text filter matches records whose field contains every one of its words, in any order and case-insensitively. Start with title_search when you have a product in hand — CPSC titles carry the brand, product, and hazard phrasing. For hazard types ("fire", "choking", "burn"), use hazard_search, which matches hazard descriptions, product names, and remedy instructions. When manufacturer finds nothing, try importer, retailer, or distributor: many recalls name one of those as the responsible company. Page past limit with offset — total_found counts every match and has_more says whether more remain; a page returns fewer than limit recalls when it reaches the 64,000-byte response size budget. Pass a recall_number to cpsc_get_recall for the full record, including the complete description, all images, and incident reports. CPSC jurisdiction: consumer products only — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), and firearms (ATF) are covered by other agencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of recalls to return on this page. Defaults to 20. A page returns fewer when it reaches the 64,000-byte response size budget; has_more then says more remain.
offsetNoSkip this many matching records before returning results. To page through total_found, raise offset by the number of recalls the previous page returned — limit, unless that page reached the response size budget. An offset at or past total_found returns an empty result set rather than an error.
remedyNoKeyword search within the free-text remedy instructions, e.g. "repair", "refund", "firmware update"; matches instructions containing every word, in any order. This searches the remedy text, not the remedy_options categories — "repair" matches records whose remedy_options list only "Refund" but whose instructions describe a free repair kit. Combines with the other filters using AND; use hazard_search instead to match remedy text as one of several fields.
date_endNoInclude only recalls on or before this date. ISO 8601 format: "YYYY-MM-DD". Must be a real calendar date, and on or after date_start.
importerNoImporter company name. Matches recalls whose importer names contain every word, in any order. Use when searching for recalls by the company that brought the product into the US.
retailerNoRetailer name, e.g. "Walmart", "Target", "Amazon". Matches recalls whose retailer text (store name, dates sold, and price) contains every word, in any order.
date_startNoInclude only recalls on or after this date. ISO 8601 format: "YYYY-MM-DD". Must be a real calendar date — "2026-02-31" and "2026-99-99" are rejected.
distributorNoDistributor company name, e.g. "Walmart", "Costco". Matches recalls whose distributor names contain every word, in any order — a role distinct from retailer and importer, and listed on far fewer recalls.
updated_endNoInclude only recalls last published by CPSC on or before this date. ISO 8601 format: "YYYY-MM-DD". Must be a real calendar date, and on or after updated_start.
manufacturerNoManufacturer name, e.g. "Samsung", "LEGO". Matches recalls whose manufacturer names contain every word, in any order. Many recalls name the importer, retailer, or distributor rather than the manufacturer — try those filters when this finds nothing.
product_nameNoProduct name to search for, e.g. "crib", "space heater", "bicycle". Matches recalls whose product names contain every word, in any order — partial words work.
title_searchNoKeyword search within the recall title, e.g. "chandelier", "space heater", "Graco crib". Matches titles containing every word, in any order. CPSC titles name the brand, the product, and the hazard, which makes this the highest-signal single filter for most searches.
hazard_searchNoHazard or safety-concept keyword, e.g. "fire", "choking", "burn", "tip-over dresser". Matches when every word appears in the hazard descriptions, product names, or remedy instructions — each word in any of the three, in any order, case-insensitive. The filter to use for hazard types; combine it with another filter to narrow a broad hazard.
updated_startNoInclude only recalls last published by CPSC on or after this date. ISO 8601 format: "YYYY-MM-DD". A separate axis from date_start: a 2003 recall re-published in 2025 matches updated_start "2025-01-01". Use to answer "what has CPSC updated recently". Must be a real calendar date.
description_searchNoKeyword search within the recall description only — not the title, hazard text, or remedy instructions; matches descriptions containing every word, in any order. Use for product details not captured in product_name — model numbers, colors, sale channels. For hazard concepts, prefer hazard_search; for the recall headline, prefer title_search.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent when the page needs explaining: zero matches (with which criterion to relax), an offset past the last match, or a page cut short by the response size budget (with the offset to continue from).
offsetNoNumber of matching records skipped before this window.
recallsNoMatching recalls, ordered newest-first.
has_moreNoTrue when records remain past this window — call again with offset raised by the number of recalls returned.
truncatedNoTrue when matching records remain past this page — always equal to has_more.
source_noteNoProvenance caveat: recall fields are CPSC record text with HTML markup and character codes converted to plain text, not otherwise edited or verified; check cpsc_url before a consumer-facing decision.
total_foundNoTotal matching records, counted after every filter is applied and before offset, limit, and the response size budget narrow the window.
effectiveQueryNoThe search criteria as applied, joined with AND: each non-blank text filter trimmed, the hazard alias resolved to hazard_search, and blank date bounds dropped.
cpsc_jurisdictionNoWhich products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool read-only and idempotent, and the description adds substantial behavioral context beyond that: filters combine with AND, text matching is word-containment and case-insensitive, pagination uses offset with total_found and has_more, and pages can stop early at the 64,000-byte response budget. It also discloses CPSC jurisdiction limits and other agencies' coverage.

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?

The description is long but dense and front-loaded: the first sentence states the core purpose, and every subsequent sentence adds operational value — filter strategy, pagination, sibling routing, and jurisdiction. There is no filler or redundant restatement of the tool name.

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 15-parameter search tool with no required parameters and two siblings, the description covers the essential gaps: when to search vs. browse, which filter to choose, how pagination and result-size limits work, how to get the full record, and what falls outside CPSC jurisdiction. An output schema exists, so detailed return-value documentation is not needed.

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?

The schema already describes every parameter in detail (100% coverage), so the baseline is 3. The description earns a 4 by adding cross-parameter integration semantics — 'Filters combine with AND' and the general text-matching rule — plus guidance on which parameter to prefer for which intent, which is not fully captured by individual schema descriptions.

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 states a specific verb and resource — 'Search consumer product recalls from the CPSC' — and immediately lists the product categories covered. It also distinguishes itself from siblings by pointing to cpsc_get_recent for browsing without filters and cpsc_get_recall for full record retrieval.

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?

It explicitly says to give at least one text filter or date bound, and names cpsc_get_recent as the alternative when browsing. It also gives concrete filter-selection guidance: start with title_search for a product in hand, use hazard_search for hazard types, try importer/retailer/distributor when manufacturer finds nothing, and use cpsc_get_recall for full records.

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. 3 tool updates
    • Changedcpsc_get_recall2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: No recall exists with the given recall number. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the lookup instead of returning a recall, and it rejects the same request every time. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: No recall exists with the given recall number. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, reported a temporary failure reading its recall data, or sent an unreadable response. `upstream_rejected`: CPSC rejected the lookup instead of returning a recall, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / source_note / description
        Previous value: -"Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision."New value: +"Provenance caveat: recall fields are CPSC record text with HTML markup and character codes converted to plain text, not otherwise edited or verified; check cpsc_url before a consumer-facing decision."
    • Changedcpsc_get_recent2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, reported a temporary failure reading its recall data, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / source_note / description
        Previous value: -"Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision."New value: +"Provenance caveat: recall fields are CPSC record text with HTML markup and character codes converted to plain text, not otherwise edited or verified; check cpsc_url before a consumer-facing decision."
    • Changedcpsc_search_recalls2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `missing_criteria`: No search criterion was given: every text filter was omitted or blank and no date bound was set. `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_criteria`: No search criterion was given: every text filter was omitted or blank and no date bound was set. `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, reported a temporary failure reading its recall data, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / source_note / description
        Previous value: -"Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision."New value: +"Provenance caveat: recall fields are CPSC record text with HTML markup and character codes converted to plain text, not otherwise edited or verified; check cpsc_url before a consumer-facing decision."
  2. 3 tool updates
    • Changedcpsc_get_recall7 fields changed
      • changedInput schema / properties / recall_number / description
        Previous value: -"CPSC recall number. Modern records (2002–present) are 5-digit numeric, e.g. \"25043\". Historical records from 1998–2001 may have a letter suffix a–d, e.g. \"99003a\". Obtain from cpsc_search_recalls results."New value: +"CPSC recall number: 5 digits for 2002–present records, e.g. \"25043\", or 5 digits plus a letter a–d for 1998–2001 records, e.g. \"99003a\". Get one from cpsc_search_recalls or cpsc_get_recent results."
      • changedOutput schema / properties / cpsc_jurisdiction / description
        Previous value: -"CPSC covers consumer products — toys, electronics, furniture, appliances, tools, clothing. Does NOT cover: food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."New value: +"Which products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."
      • changedOutput schema / properties / data_quality_notes / description
        Previous value: -"Gaps this server observed in the upstream CPSC record — absent description, absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."New value: +"Gaps this server observed in the CPSC record — absent description, absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."
      • changedOutput schema / properties / data_quality_notes / items / description
        Previous value: -"One gap found in the upstream record."New value: +"One gap found in the CPSC record."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: No recall exists with the given recall number. `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of a recall record, which the same request will always produce. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: No recall exists with the given recall number. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the lookup instead of returning a recall, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / products / description
        Previous value: -"Products covered. A recall may include multiple products. Note: model numbers are often in the description text, not a structured field."New value: +"Products covered. A recall may include multiple products. Model numbers are often in the description text, not a structured field."
      • changedOutput schema / properties / upcs / description
        Previous value: -"UPC codes for this recall (sparse — ~4% of records have UPCs). UPCs are stored at the recall level in the API, not per-product; when the recall covers multiple products, UPC-to-product attribution is ambiguous."New value: +"UPC codes for this recall (sparse — ~4% of records have UPCs). CPSC lists UPCs for the recall as a whole, not per product, so on a recall covering several products a UPC cannot be tied to one of them."
    • Changedcpsc_get_recent10 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of recalls to return. Defaults to 20."New value: +"Maximum number of recalls to return. Defaults to 20. A page returns fewer when it reaches the 64,000-byte response size budget."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip this many recalls in the window before returning results. Combine with limit to page through total_found — e.g. limit 20 with offset 0, 20, 40. An offset at or past total_found returns an empty result set rather than an error."New value: +"Skip this many recalls in the window before returning results. To page through total_found, raise offset by the number of recalls the previous page returned — limit, unless that page reached the response size budget. An offset at or past total_found returns an empty result set rather than an error."
      • changedOutput schema / properties / cpsc_jurisdiction / description
        Previous value: -"CPSC covers consumer products — toys, electronics, furniture, appliances, tools, clothing. Does NOT cover: food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."New value: +"Which products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when the page needs explaining: a window with no recalls (with a larger days to try), an offset past the last recall, or a page cut short by the response size budget (with the offset to continue from).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / recalls / items / properties / data_quality_notes / description
        Previous value: -"Gaps this server observed in the upstream CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."New value: +"Gaps this server observed in the CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."
      • changedOutput schema / properties / recalls / items / properties / data_quality_notes / items / description
        Previous value: -"One gap found in the upstream record."New value: +"One gap found in the CPSC record."
      • changedOutput schema / properties / recalls / items / properties / remedy_options / description
        Previous value: -"Remedy types: Refund, Repair, Replace, New Instructions, Dispose, Label, No Remedy Available, Inspect. Multiple may apply. Often empty — CPSC classified the remedy on fewer than half its records; call cpsc_get_recall for the remedy narrative when this is empty."New value: +"Remedy types: Refund, Repair, Replace, New Instructions, Dispose, Label, No Remedy Available, Inspect. Multiple may apply. Often empty — CPSC classified the remedy on fewer than half its records; call cpsc_get_recall for the remedy instructions when this is empty."
      • changedOutput schema / properties / total_found / description
        Previous value: -"Total recalls in this period, counted before offset and limit narrow the window."New value: +"Total recalls in this period, counted before offset, limit, and the response size budget narrow the window."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when total_found exceeds the limit. Independent of offset."New value: +"True when recalls in the window remain past this page — always equal to has_more."
    • Changedcpsc_search_recalls31 fields changed
      • changedInput schema / properties / description_search / description
        Previous value: -"Keyword search within the recall Description field only (does not search Title, Hazards, or remedy text). Use for product details not captured in product_name — model numbers, colors, sale channels. For hazard concepts, prefer hazard_search; for the recall headline, prefer title_search."New value: +"Keyword search within the recall description only — not the title, hazard text, or remedy instructions; matches descriptions containing every word, in any order. Use for product details not captured in product_name — model numbers, colors, sale channels. For hazard concepts, prefer hazard_search; for the recall headline, prefer title_search."
      • addedInput schema / properties / description_search / maxLength
        Added value: +500
      • changedInput schema / properties / distributor / description
        Previous value: -"Distributor company name, e.g. \"Walmart\", \"Costco\". Substring match against the Distributors array — a role distinct from retailer and importer, and populated on far fewer records."New value: +"Distributor company name, e.g. \"Walmart\", \"Costco\". Matches recalls whose distributor names contain every word, in any order — a role distinct from retailer and importer, and listed on far fewer recalls."
      • addedInput schema / properties / distributor / maxLength
        Added value: +500
      • changedInput schema / properties / hazard_search / description
        Previous value: -"Hazard or safety-concept keyword, e.g. \"fire\", \"choking\", \"burn\", \"laceration\". Applied client-side after the upstream fetch. Matches when the term appears in any of: hazard descriptions, product names, or remedy instructions (OR across the three, case-insensitive substring). Use this rather than the upstream Hazard parameter, which CPSC recognizes but never matches."New value: +"Hazard or safety-concept keyword, e.g. \"fire\", \"choking\", \"burn\", \"tip-over dresser\". Matches when every word appears in the hazard descriptions, product names, or remedy instructions — each word in any of the three, in any order, case-insensitive. The filter to use for hazard types; combine it with another filter to narrow a broad hazard."
      • addedInput schema / properties / hazard_search / maxLength
        Added value: +500
      • changedInput schema / properties / importer / description
        Previous value: -"Importer company name. Use when searching for recalls by the company that brought the product into the US."New value: +"Importer company name. Matches recalls whose importer names contain every word, in any order. Use when searching for recalls by the company that brought the product into the US."
      • addedInput schema / properties / importer / maxLength
        Added value: +500
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (applied client-side — the API returns all matches). Defaults to 20."New value: +"Maximum number of recalls to return on this page. Defaults to 20. A page returns fewer when it reaches the 64,000-byte response size budget; has_more then says more remain."
      • changedInput schema / properties / manufacturer / description
        Previous value: -"Manufacturer name, e.g. \"Samsung\", \"LEGO\". Substring match against the Manufacturers array. Note: many recalls list the importer or retailer as the primary org rather than the manufacturer — try importer or retailer if this returns no results."New value: +"Manufacturer name, e.g. \"Samsung\", \"LEGO\". Matches recalls whose manufacturer names contain every word, in any order. Many recalls name the importer, retailer, or distributor rather than the manufacturer — try those filters when this finds nothing."
      • addedInput schema / properties / manufacturer / maxLength
        Added value: +500
      • changedInput schema / properties / offset / description
        Previous value: -"Skip this many matching records before returning results. Combine with limit to page through total_found — e.g. limit 20 with offset 0, 20, 40. An offset at or past total_found returns an empty result set rather than an error."New value: +"Skip this many matching records before returning results. To page through total_found, raise offset by the number of recalls the previous page returned — limit, unless that page reached the response size budget. An offset at or past total_found returns an empty result set rather than an error."
      • changedInput schema / properties / product_name / description
        Previous value: -"Product name to search for, e.g. \"crib\", \"space heater\", \"bicycle\". Substring match — partial names work."New value: +"Product name to search for, e.g. \"crib\", \"space heater\", \"bicycle\". Matches recalls whose product names contain every word, in any order — partial words work."
      • addedInput schema / properties / product_name / maxLength
        Added value: +500
      • changedInput schema / properties / remedy / description
        Previous value: -"Keyword search within the free-text remedy instructions, e.g. \"repair\", \"refund\", \"firmware update\". Substring match, applied upstream. This searches the remedy narrative, not the structured remedy_options enum — \"repair\" matches records whose remedy_options list only \"Refund\" but whose instructions describe a free repair kit. Combines with the other filters using AND; use hazard_search instead to match remedy text as one of several fields."New value: +"Keyword search within the free-text remedy instructions, e.g. \"repair\", \"refund\", \"firmware update\"; matches instructions containing every word, in any order. This searches the remedy text, not the remedy_options categories — \"repair\" matches records whose remedy_options list only \"Refund\" but whose instructions describe a free repair kit. Combines with the other filters using AND; use hazard_search instead to match remedy text as one of several fields."
      • addedInput schema / properties / remedy / maxLength
        Added value: +500
      • changedInput schema / properties / retailer / description
        Previous value: -"Retailer name, e.g. \"Walmart\", \"Target\", \"Amazon\". Substring match against the retailer narrative (which includes store name, dates sold, and price)."New value: +"Retailer name, e.g. \"Walmart\", \"Target\", \"Amazon\". Matches recalls whose retailer text (store name, dates sold, and price) contains every word, in any order."
      • addedInput schema / properties / retailer / maxLength
        Added value: +500
      • changedInput schema / properties / title_search / description
        Previous value: -"Keyword search within the recall Title, e.g. \"chandelier\", \"space heater\", \"inclined sleeper\". Substring match. CPSC titles name the brand, the product, and the hazard, which makes this the highest-signal single filter for most searches."New value: +"Keyword search within the recall title, e.g. \"chandelier\", \"space heater\", \"Graco crib\". Matches titles containing every word, in any order. CPSC titles name the brand, the product, and the hazard, which makes this the highest-signal single filter for most searches."
      • addedInput schema / properties / title_search / maxLength
        Added value: +500
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "recalls",
        -      "total_found",
        -      "truncated",
        -      "offset",
        -      "has_more",
        -      "cpsc_jurisdiction",
        -      "source_note"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "recalls",
        +      "total_found",
        +      "truncated",
        +      "offset",
        +      "has_more",
        +      "cpsc_jurisdiction",
        +      "source_note",
        +      "effectiveQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / cpsc_jurisdiction / description
        Previous value: -"CPSC covers consumer products — toys, electronics, furniture, appliances, tools, clothing. Does NOT cover: food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."New value: +"Which products CPSC covers and which agencies cover the rest — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), firearms (ATF)."
      • addedOutput schema / properties / effectiveQuery
        Added value: +{
        +  "description": "The search criteria as applied, joined with AND: each non-blank text filter trimmed, the hazard alias resolved to hazard_search, and blank date bounds dropped.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `no_results`: No recalls matched the search filters, including hazard_search. `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_criteria`: No search criterion was given: every text filter was omitted or blank and no date bound was set. `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `upstream_error`: The CPSC recall service (saferproducts.gov) was unavailable, timed out, or sent an unreadable response. `upstream_rejected`: CPSC rejected the request instead of returning recalls, and it rejects the same request every time. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_date_range",
        -  "no_results",
        -  "upstream_error",
        -  "upstream_rejected"
        -]New value: +[
        +  "missing_criteria",
        +  "invalid_date_range",
        +  "upstream_error",
        +  "upstream_rejected"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when the page needs explaining: zero matches (with which criterion to relax), an offset past the last match, or a page cut short by the response size budget (with the offset to continue from).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / recalls / items / properties / data_quality_notes / description
        Previous value: -"Gaps this server observed in the upstream CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."New value: +"Gaps this server observed in the CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing."
      • changedOutput schema / properties / recalls / items / properties / data_quality_notes / items / description
        Previous value: -"One gap found in the upstream record."New value: +"One gap found in the CPSC record."
      • changedOutput schema / properties / recalls / items / properties / upcs / description
        Previous value: -"UPC codes for this recall (sparse — ~4% of records have UPCs). UPCs are stored at the recall level in the API, not per-product; when a recall covers multiple products, all UPCs apply to the recall as a whole."New value: +"UPC codes for this recall (sparse — ~4% of records have UPCs). CPSC lists UPCs for the recall as a whole, not per product, so on a recall covering several products a UPC cannot be tied to one of them."
      • changedOutput schema / properties / total_found / description
        Previous value: -"Total matching records, counted after hazard_search is applied and before offset and limit narrow the window."New value: +"Total matching records, counted after every filter is applied and before offset, limit, and the response size budget narrow the window."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when total_found exceeds the limit. Independent of offset."New value: +"True when matching records remain past this page — always equal to has_more."
  3. 3 tool updates
    • Changedcpsc_get_recall5 fields changed
      • removedOutput schema / properties / consumer_contact / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / consumer_contact / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: No recall exists with the given recall number `upstream_error`: The saferproducts.gov API returned a transient error or timed out `upstream_rejected`: The saferproducts.gov API answered with an error row instead of a recall record, which the same request will always produce Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: No recall exists with the given recall number. `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of a recall record, which the same request will always produce. Other values are possible when a failure originates below the handler."
    • Changedcpsc_get_recent1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `upstream_error`: The saferproducts.gov API returned a transient error or timed out `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce. Other values are possible when a failure originates below the handler."
    • Changedcpsc_search_recalls1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match `no_results`: No recalls matched the search filters, including hazard_search `upstream_error`: The saferproducts.gov API returned a transient error or timed out `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match. `no_results`: No recalls matched the search filters, including hazard_search. `upstream_error`: The saferproducts.gov API returned a transient error or timed out. `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce. Other values are possible when a failure originates below the handler."
  4. 3 tool updates
    • Changedcpsc_get_recall6 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": [
        +      "recall_number",
        +      "recall_date",
        +      "last_updated",
        +      "title",
        +      "description",
        +      "cpsc_url",
        +      "consumer_contact",
        +      "hazards",
        +      "remedy_options",
        +      "remedy_instructions",
        +      "products",
        +      "upcs",
        +      "injuries",
        +      "manufacturers",
        +      "importers",
        +      "retailers",
        +      "distributors",
        +      "manufacturer_countries",
        +      "images",
        +      "coordinated_recalls",
        +      "data_quality_notes",
        +      "cpsc_jurisdiction",
        +      "source_note"
        +    ]
        +  },
        +  {
        +    "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: `not_found`: No recall exists with the given recall number `upstream_error`: The saferproducts.gov API returned a transient error or timed out `upstream_rejected`: The saferproducts.gov API answered with an error row instead of a recall record, which the same request will always produce Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "upstream_error",
        +            "upstream_rejected"
        +          ],
        +          "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: -[
        -  "recall_number",
        -  "recall_date",
        -  "last_updated",
        -  "title",
        -  "description",
        -  "cpsc_url",
        -  "consumer_contact",
        -  "hazards",
        -  "remedy_options",
        -  "remedy_instructions",
        -  "products",
        -  "upcs",
        -  "injuries",
        -  "manufacturers",
        -  "importers",
        -  "retailers",
        -  "distributors",
        -  "manufacturer_countries",
        -  "images",
        -  "coordinated_recalls",
        -  "data_quality_notes",
        -  "cpsc_jurisdiction",
        -  "source_note"
        -]
    • Changedcpsc_get_recent6 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": [
        +      "recalls",
        +      "period",
        +      "total_found",
        +      "truncated",
        +      "offset",
        +      "has_more",
        +      "cpsc_jurisdiction",
        +      "source_note"
        +    ]
        +  },
        +  {
        +    "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: `upstream_error`: The saferproducts.gov API returned a transient error or timed out `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "upstream_error",
        +            "upstream_rejected"
        +          ],
        +          "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: -[
        -  "recalls",
        -  "period",
        -  "total_found",
        -  "truncated",
        -  "offset",
        -  "has_more",
        -  "cpsc_jurisdiction",
        -  "source_note"
        -]
    • Changedcpsc_search_recalls6 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": [
        +      "recalls",
        +      "total_found",
        +      "truncated",
        +      "offset",
        +      "has_more",
        +      "cpsc_jurisdiction",
        +      "source_note"
        +    ]
        +  },
        +  {
        +    "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_date_range`: date_start is later than date_end, or updated_start is later than updated_end, so the range can never match `no_results`: No recalls matched the search filters, including hazard_search `upstream_error`: The saferproducts.gov API returned a transient error or timed out `upstream_rejected`: The saferproducts.gov API answered with an error row instead of recall records, which the same request will always produce Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_date_range",
        +            "no_results",
        +            "upstream_error",
        +            "upstream_rejected"
        +          ],
        +          "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: -[
        -  "recalls",
        -  "total_found",
        -  "truncated",
        -  "offset",
        -  "has_more",
        -  "cpsc_jurisdiction",
        -  "source_note"
        -]
  5. 3 tool updates
    • Changedcpsc_get_recall1 field changed
      • changedOutput schema / properties / remedy_options / description
        Previous value: -"Remedy types available: Refund, Repair, Replace, Dispose, Label, New Instructions."New value: +"Remedy types available: Refund, Repair, Replace, New Instructions, Dispose, Label, No Remedy Available, Inspect. Often empty — CPSC classified the remedy on fewer than half its records. Read remedy_instructions when this is empty, and fall back to cpsc_url when that is empty too, rather than reporting that no remedy exists."
    • Changedcpsc_get_recent7 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Skip this many recalls in the window before returning results. Combine with limit to page through total_found — e.g. limit 20 with offset 0, 20, 40. An offset at or past total_found returns an empty result set rather than an error.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True when recalls remain past this window — call again with offset raised by the number of recalls returned.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Number of recalls skipped before this window.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / recalls / items / properties / remedy_options / description
        Previous value: -"Remedy types."New value: +"Remedy types: Refund, Repair, Replace, New Instructions, Dispose, Label, No Remedy Available, Inspect. Multiple may apply. Often empty — CPSC classified the remedy on fewer than half its records; call cpsc_get_recall for the remedy narrative when this is empty."
      • changedOutput schema / properties / total_found / description
        Previous value: -"Total recalls in this period before the limit was applied."New value: +"Total recalls in this period, counted before offset and limit narrow the window."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when total_found exceeds the limit."New value: +"True when total_found exceeds the limit. Independent of offset."
      • changedOutput schema / required
        Previous value: -[
        -  "recalls",
        -  "period",
        -  "total_found",
        -  "truncated",
        -  "cpsc_jurisdiction",
        -  "source_note"
        -]New value: +[
        +  "recalls",
        +  "period",
        +  "total_found",
        +  "truncated",
        +  "offset",
        +  "has_more",
        +  "cpsc_jurisdiction",
        +  "source_note"
        +]
    • Changedcpsc_search_recalls14 fields changed
      • changedInput schema / properties / description_search / description
        Previous value: -"Keyword search within the recall Description field only (does not search Title or Hazards text). Use for hazard types like \"fire\", \"choking\", \"burn\", or to find product details not captured in product_name. Note: hazard keywords often appear in the Description field — this is the correct filter for hazard-type searching since the Hazard filter param is non-functional upstream."New value: +"Keyword search within the recall Description field only (does not search Title, Hazards, or remedy text). Use for product details not captured in product_name — model numbers, colors, sale channels. For hazard concepts, prefer hazard_search; for the recall headline, prefer title_search."
      • addedInput schema / properties / distributor
        Added value: +{
        +  "description": "Distributor company name, e.g. \"Walmart\", \"Costco\". Substring match against the Distributors array — a role distinct from retailer and importer, and populated on far fewer records.",
        +  "type": "string"
        +}
      • addedInput schema / properties / hazard_search
        Added value: +{
        +  "description": "Hazard or safety-concept keyword, e.g. \"fire\", \"choking\", \"burn\", \"laceration\". Applied client-side after the upstream fetch. Matches when the term appears in any of: hazard descriptions, product names, or remedy instructions (OR across the three, case-insensitive substring). Use this rather than the upstream Hazard parameter, which CPSC recognizes but never matches.",
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Skip this many matching records before returning results. Combine with limit to page through total_found — e.g. limit 20 with offset 0, 20, 40. An offset at or past total_found returns an empty result set rather than an error.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / remedy
        Added value: +{
        +  "description": "Keyword search within the free-text remedy instructions, e.g. \"repair\", \"refund\", \"firmware update\". Substring match, applied upstream. This searches the remedy narrative, not the structured remedy_options enum — \"repair\" matches records whose remedy_options list only \"Refund\" but whose instructions describe a free repair kit. Combines with the other filters using AND; use hazard_search instead to match remedy text as one of several fields.",
        +  "type": "string"
        +}
      • addedInput schema / properties / title_search
        Added value: +{
        +  "description": "Keyword search within the recall Title, e.g. \"chandelier\", \"space heater\", \"inclined sleeper\". Substring match. CPSC titles name the brand, the product, and the hazard, which makes this the highest-signal single filter for most searches.",
        +  "type": "string"
        +}
      • addedInput schema / properties / updated_end
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "",
        +      "type": "string"
        +    },
        +    {
        +      "description": "ISO 8601 date: \"YYYY-MM-DD\".",
        +      "format": "date",
        +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "Include only recalls last published by CPSC on or before this date. ISO 8601 format: \"YYYY-MM-DD\". Must be a real calendar date, and on or after updated_start."
        +}
      • addedInput schema / properties / updated_start
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "",
        +      "type": "string"
        +    },
        +    {
        +      "description": "ISO 8601 date: \"YYYY-MM-DD\".",
        +      "format": "date",
        +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "Include only recalls last published by CPSC on or after this date. ISO 8601 format: \"YYYY-MM-DD\". A separate axis from date_start: a 2003 recall re-published in 2025 matches updated_start \"2025-01-01\". Use to answer \"what has CPSC updated recently\". Must be a real calendar date."
        +}
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True when records remain past this window — call again with offset raised by the number of recalls returned.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Number of matching records skipped before this window.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / recalls / items / properties / remedy_options / description
        Previous value: -"Remedy types: Refund, Repair, Replace, Dispose, Label, New Instructions. Multiple may apply."New value: +"Remedy types: Refund, Repair, Replace, New Instructions, Dispose, Label, No Remedy Available, Inspect. Multiple may apply. Often empty — CPSC classified the remedy on fewer than half its records; read remedy_summary when this is empty, and cpsc_url when that is empty too."
      • changedOutput schema / properties / total_found / description
        Previous value: -"Total matching records before the limit was applied."New value: +"Total matching records, counted after hazard_search is applied and before offset and limit narrow the window."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when total_found exceeds the limit."New value: +"True when total_found exceeds the limit. Independent of offset."
      • changedOutput schema / required
        Previous value: -[
        -  "recalls",
        -  "total_found",
        -  "truncated",
        -  "cpsc_jurisdiction",
        -  "source_note"
        -]New value: +[
        +  "recalls",
        +  "total_found",
        +  "truncated",
        +  "offset",
        +  "has_more",
        +  "cpsc_jurisdiction",
        +  "source_note"
        +]
  6. 3 tool updates
    • Changedcpsc_get_recall6 fields changed
      • addedOutput schema / properties / data_quality_notes
        Added value: +{
        +  "description": "Gaps this server observed in the upstream CPSC record — absent description, absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing.",
        +  "items": {
        +    "description": "One gap found in the upstream record.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / description / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / description / description
        Previous value: -"Full recall description including product identification details. Model numbers are typically embedded here, not in a structured field."New value: +"Full recall description including product identification details. Model numbers are typically embedded here, not in a structured field. Null when CPSC published the record without a description — rare, but a genuine record can still be complete otherwise."
      • removedOutput schema / properties / description / type
        Removed value: -"string"
      • addedOutput schema / properties / source_note
        Added value: +{
        +  "description": "Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "recall_number",
        -  "recall_date",
        -  "last_updated",
        -  "title",
        -  "description",
        -  "cpsc_url",
        -  "consumer_contact",
        -  "hazards",
        -  "remedy_options",
        -  "remedy_instructions",
        -  "products",
        -  "upcs",
        -  "injuries",
        -  "manufacturers",
        -  "importers",
        -  "retailers",
        -  "distributors",
        -  "manufacturer_countries",
        -  "images",
        -  "coordinated_recalls",
        -  "cpsc_jurisdiction"
        -]New value: +[
        +  "recall_number",
        +  "recall_date",
        +  "last_updated",
        +  "title",
        +  "description",
        +  "cpsc_url",
        +  "consumer_contact",
        +  "hazards",
        +  "remedy_options",
        +  "remedy_instructions",
        +  "products",
        +  "upcs",
        +  "injuries",
        +  "manufacturers",
        +  "importers",
        +  "retailers",
        +  "distributors",
        +  "manufacturer_countries",
        +  "images",
        +  "coordinated_recalls",
        +  "data_quality_notes",
        +  "cpsc_jurisdiction",
        +  "source_note"
        +]
    • Changedcpsc_get_recent4 fields changed
      • addedOutput schema / properties / recalls / items / properties / data_quality_notes
        Added value: +{
        +  "description": "Gaps this server observed in the upstream CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing.",
        +  "items": {
        +    "description": "One gap found in the upstream record.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / recalls / items / required
        Previous value: -[
        -  "recall_number",
        -  "recall_date",
        -  "title",
        -  "hazards",
        -  "remedy_options",
        -  "products",
        -  "cpsc_url"
        -]New value: +[
        +  "recall_number",
        +  "recall_date",
        +  "title",
        +  "hazards",
        +  "remedy_options",
        +  "products",
        +  "cpsc_url",
        +  "data_quality_notes"
        +]
      • addedOutput schema / properties / source_note
        Added value: +{
        +  "description": "Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "recalls",
        -  "period",
        -  "total_found",
        -  "truncated",
        -  "cpsc_jurisdiction"
        -]New value: +[
        +  "recalls",
        +  "period",
        +  "total_found",
        +  "truncated",
        +  "cpsc_jurisdiction",
        +  "source_note"
        +]
    • Changedcpsc_search_recalls8 fields changed
      • changedInput schema / properties / date_end / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ISO 8601 date: \"YYYY-MM-DD\".",
        -    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ISO 8601 date: \"YYYY-MM-DD\".",
        +    "format": "date",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_end / description
        Previous value: -"Include only recalls on or before this date. ISO 8601 format: \"YYYY-MM-DD\"."New value: +"Include only recalls on or before this date. ISO 8601 format: \"YYYY-MM-DD\". Must be a real calendar date, and on or after date_start."
      • changedInput schema / properties / date_start / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "description": "ISO 8601 date: \"YYYY-MM-DD\".",
        -    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "ISO 8601 date: \"YYYY-MM-DD\".",
        +    "format": "date",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_start / description
        Previous value: -"Include only recalls on or after this date. ISO 8601 format: \"YYYY-MM-DD\"."New value: +"Include only recalls on or after this date. ISO 8601 format: \"YYYY-MM-DD\". Must be a real calendar date — \"2026-02-31\" and \"2026-99-99\" are rejected."
      • addedOutput schema / properties / recalls / items / properties / data_quality_notes
        Added value: +{
        +  "description": "Gaps this server observed in the upstream CPSC record — absent hazard text, absent product entries. Derived from which fields CPSC left empty, not from any judgement about the recall itself. Empty when nothing is missing.",
        +  "items": {
        +    "description": "One gap found in the upstream record.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / recalls / items / required
        Previous value: -[
        -  "recall_number",
        -  "recall_date",
        -  "title",
        -  "hazards",
        -  "remedy_options",
        -  "remedy_summary",
        -  "products",
        -  "upcs",
        -  "manufacturers",
        -  "importers",
        -  "retailers",
        -  "cpsc_url",
        -  "images"
        -]New value: +[
        +  "recall_number",
        +  "recall_date",
        +  "title",
        +  "hazards",
        +  "remedy_options",
        +  "remedy_summary",
        +  "products",
        +  "upcs",
        +  "manufacturers",
        +  "importers",
        +  "retailers",
        +  "cpsc_url",
        +  "images",
        +  "data_quality_notes"
        +]
      • addedOutput schema / properties / source_note
        Added value: +{
        +  "description": "Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "recalls",
        -  "total_found",
        -  "truncated",
        -  "cpsc_jurisdiction"
        -]New value: +[
        +  "recalls",
        +  "total_found",
        +  "truncated",
        +  "cpsc_jurisdiction",
        +  "source_note"
        +]
  7. 3 tool updates
    • First observedcpsc_get_recall
    • First observedcpsc_get_recent
    • First observedcpsc_search_recalls

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Access US consumer-product safety recalls from the CPSC, free and without authentication.
    218 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to query cited, current product-safety compliance and recall records, returning only verified official-source data without generating speculative answers.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.