Skip to main content
Glama

cpsc-recalls-mcp-server

Get Recent CPSC Recalls

cpsc_get_recent
Read-only

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.

Input Schema

TableJSON 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

TableJSON Schema
NameRequiredDescriptionDefault
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).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema 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."
  2. Changed10 schema 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."
  3. Changed1 schema 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."
  4. Changed6 schema 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"
      -]
  5. Changed7 schema 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"
      +]
  6. Changed4 schema 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"
      +]
  7. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.