cpsc-recalls-mcp-server
Server Details
US consumer product recalls from the CPSC — hazards, remedies, and affected products.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/cpsc-recalls-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/cpsc-recalls-mcp-server
Available Tools
3 toolscpsc_get_recallGet CPSC Recall DetailARead-onlyIdempotentInspect
Full detail for a single CPSC recall by recall number. Returns the complete record: hazard description, remedy instructions, all product variants, incident/injury reports, images, and the official CPSC recall page URL. Use after cpsc_search_recalls or cpsc_get_recent to get the full picture on a specific recall. CPSC jurisdiction: consumer products only — food, vehicles, drugs, and pesticides are covered by other agencies.
| Name | Required | Description | Default |
|---|---|---|---|
| recall_number | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| upcs | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| title | No | Official recall title. |
| images | No | Product and identification images from the recall notice. |
| hazards | No | Hazards — read this first. |
| cpsc_url | No | Official CPSC recall page — authoritative source for consumers. |
| injuries | No | Injury and incident report narrative, e.g. "None reported" or incident count. |
| products | No | Products covered. A recall may include multiple products. Note: model numbers are often in the description text, not a structured field. |
| importers | No | Importer company names. |
| retailers | No | Retailer names with sale date ranges and price. |
| description | No | 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. |
| recall_date | No | Date issued, ISO 8601. |
| source_note | No | Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision. |
| distributors | No | Distributor company names. |
| last_updated | No | Date last published, ISO 8601. |
| manufacturers | No | Manufacturer names (often empty — see importers). |
| recall_number | No | Recall identifier. |
| remedy_options | No | 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. |
| consumer_contact | No | Contact information for claiming the remedy. Null when not provided. |
| cpsc_jurisdiction | No | 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). |
| data_quality_notes | No | 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. |
| coordinated_recalls | No | URLs of coordinated recalls by other agencies (e.g., Canada Health). |
| remedy_instructions | No | Full remedy instructions — exactly what a consumer should do and how to claim. |
| manufacturer_countries | No | Countries of manufacture. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description correctly avoids repeating that. It adds substantive behavior detail: the exact contents of the return (hazard description, remedy instructions, product variants, incident reports, images, official URL) and the jurisdiction note. No contradiction with annotations. Slight gap: doesn't mention error behavior for invalid recall numbers, but that's minor given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero fluff. The first sentence states the action and scope, the second lists what's returned, and the third gives usage context and jurisdiction. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one simple parameter, full annotations for safety (readOnly, idempotent), and an output schema (not shown but noted as present). The description provides usage guidance, return fields, and boundary conditions. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema fully documents recall_number with a pattern, example formats, and guidance to obtain it from search results. The description itself doesn't need to add anything to the parameter semantics; it correctly relies on the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches full detail for a single CPSC recall by recall number, listing the specific fields it returns (hazard, remedy, variants, incidents, images, official URL). This distinguishes it from siblings: it's for a specific recall, not a search or a recent list. The verb 'get' and resource 'recall detail' are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool after cpsc_search_recalls or cpsc_get_recent to get the full picture on a specific recall. Also notes the CPSC jurisdiction limitation (consumer products only), indirectly telling when not to use it (food, vehicles, drugs, pesticides). This is clear routing guidance with no ambiguity.
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 RecallsARead-onlyInspect
Fetch the most recent CPSC consumer product recalls, ordered newest-first. Use for "what's been recalled lately?" or a product safety feed. Always applies a date window (default: last 30 days) — without a date filter the API returns all 9,800+ records. Page past limit with offset: narrowing days cannot page, because the window is anchored to today and shrinking it drops the oldest records rather than advancing past the newest. CPSC jurisdiction: consumer products only — food, vehicles, drugs, and pesticides are covered by other agencies.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look back this many days from today. Defaults to 30. Use 7 for a weekly digest, 90 for a quarterly review. | |
| limit | No | Maximum number of recalls to return. Defaults to 20. | |
| offset | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| offset | No | Number of recalls skipped before this window. |
| period | No | Date range queried. |
| recalls | No | Recent recalls, newest-first. |
| has_more | No | True when recalls remain past this window — call again with offset raised by the number of recalls returned. |
| truncated | No | True when total_found exceeds the limit. Independent of offset. |
| source_note | No | Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision. |
| total_found | No | Total recalls in this period, counted before offset and limit narrow the window. |
| cpsc_jurisdiction | No | 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by explaining that the tool always applies a date window, warns that without a filter it returns 9,800+ records, details the paging limitation that shrinking the window drops oldest records, and clarifies CPSC jurisdiction. This is rich behavioral context that prevents misuse and sets accurate expectations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then usage guidance, then the crucial date-window and paging caveats, and finally jurisdiction. Every sentence carries essential information—no filler or redundancy. The structure guides the agent from what the tool does to how to use it safely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all operational aspects for correct invocation: ordering, date window behavior, paging caveats, and jurisdiction boundaries. The output schema is present, so return format is covered. An agent can confidently call this tool without missing critical constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for all three parameters. The description adds critical semantic context: the consequence of not filtering (all 9,800+ records) and the subtle paging behavior that narrowing the days window cannot advance pages. This goes beyond the schema's static definitions, though the schema already documents offset behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'Fetch', the resource 'most recent CPSC consumer product recalls', and the ordering 'newest-first'. It clearly distinguishes this tool as a recency-focused listing, which is distinct from fetching a specific recall or searching. The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it for 'what's been recalled lately?' or a product safety feed, providing clear context for when to choose this tool. It does not name sibling tools or mention when not to use it, but the guidance is direct enough for an agent to correctly identify this as the go-to for recent recalls.
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 RecallsARead-onlyIdempotentInspect
Search consumer product recalls from the CPSC (Consumer Product Safety Commission) database. Covers toys, electronics, furniture, appliances, children's products, tools, and clothing — everything under CPSC jurisdiction. Does NOT cover food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), or pesticides (EPA). All filter fields are optional substring matches that combine with AND. Start with title_search when you have a product in hand — CPSC titles carry the brand, product, and hazard phrasing. For hazard-type filtering ("fire", "choking", "burn"), use hazard_search, which matches hazard text, product names, and remedy instructions in one pass. When manufacturer returns no results, try importer, retailer, or distributor: many recalls list one of those as the primary responsible org. Page past limit with offset — total_found and has_more say where the window sits in the full result set. Use cpsc_get_recall with a recall_number from results to retrieve the full record including complete description, all images, and incident reports.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (applied client-side — the API returns all matches). Defaults to 20. | |
| offset | No | 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. | |
| remedy | No | 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. | |
| date_end | No | 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. | |
| importer | No | Importer company name. Use when searching for recalls by the company that brought the product into the US. | |
| retailer | No | Retailer name, e.g. "Walmart", "Target", "Amazon". Substring match against the retailer narrative (which includes store name, dates sold, and price). | |
| date_start | No | 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. | |
| distributor | No | 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. | |
| updated_end | No | 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. | |
| manufacturer | No | 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. | |
| product_name | No | Product name to search for, e.g. "crib", "space heater", "bicycle". Substring match — partial names work. | |
| title_search | No | 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. | |
| hazard_search | No | 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. | |
| updated_start | No | 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. | |
| description_search | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| offset | No | Number of matching records skipped before this window. |
| recalls | No | Matching recalls, ordered newest-first. |
| has_more | No | True when records remain past this window — call again with offset raised by the number of recalls returned. |
| truncated | No | True when total_found exceeds the limit. Independent of offset. |
| source_note | No | Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision. |
| total_found | No | Total matching records, counted after hazard_search is applied and before offset and limit narrow the window. |
| cpsc_jurisdiction | No | 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and idempotentHint, which the description doesn't contradict. It goes beyond this by disclosing client-side filtering behavior ('hazard_search applied client-side after upstream fetch', 'limit applied client-side'), pagination semantics ('offset at or past total_found returns an empty result set rather than an error'), AND-combination of filters, and distinct date axes (date_start vs updated_start). These traits materially affect how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries unique value—scope, exclusions, filter strategy, pagination, and next-step linkage. It is front-loaded with the core purpose and exclusions before diving into usage details, and it uses lists and short sentences to keep scanning easy. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters and an output schema, the description comprehensively covers scope, exclusions, per-filter guidance, fallback strategies (manufacturer → importer/retailer), pagination, and the correct follow-up tool. It explains the distinct date axes and client-side constraints, leaving no significant gap for an agent to call it correctly. The output schema handles return details, so no need to repeat those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema covers all 15 parameters with detailed descriptions, the tool description adds critical nuance per field: title_search is called 'the highest-signal single filter,' hazard_search ORs across fields and is client-side, remedy clarifies it searches narrative not the structured enum, and manufacturer warns that importer/retailer may be the primary org. These enrich the schema meanings and directly reduce misuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Search consumer product recalls from the CPSC database.' It enumerates covered categories and explicitly excludes other agencies (FDA, NHTSA, USCG, EPA), making the tool's scope unambiguous. It also differs from its sibling cpsc_get_recall by describing the search role, and the final sentence directs the agent to that retrieval tool, clearly separating the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides rich, actionable guidance: 'Start with title_search when you have a product in hand,' 'use hazard_search' for hazard concepts, and 'When manufacturer returns no results, try importer, retailer, or distributor.' It also instructs to use cpsc_get_recall for full records and explains pagination with offset. This gives the agent both when-to-use and when-to-avoid this tool, with explicit alternatives.
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. Dates show when Glama detected each change.
3 tool updates
- Changed
cpsc_get_recall6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded 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" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved 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" -]
- Changed
cpsc_get_recent6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "recalls", + "period", + "total_found", + "truncated", + "offset", + "has_more", + "cpsc_jurisdiction", + "source_note" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "recalls", - "period", - "total_found", - "truncated", - "offset", - "has_more", - "cpsc_jurisdiction", - "source_note" -]
- Changed
cpsc_search_recalls6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "recalls", + "total_found", + "truncated", + "offset", + "has_more", + "cpsc_jurisdiction", + "source_note" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "recalls", - "total_found", - "truncated", - "offset", - "has_more", - "cpsc_jurisdiction", - "source_note" -]
3 tool updates
- Changed
cpsc_get_recall1 field changed- changed
Output schema / properties / remedy_options / descriptionPrevious 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."
- Changed
cpsc_get_recent7 fields changed- added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / has_moreAdded value: +{ + "description": "True when recalls remain past this window — call again with offset raised by the number of recalls returned.", + "type": "boolean" +} - added
Output schema / properties / offsetAdded value: +{ + "description": "Number of recalls skipped before this window.", + "type": "number" +} - changed
Output schema / properties / recalls / items / properties / remedy_options / descriptionPrevious 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." - changed
Output schema / properties / total_found / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when total_found exceeds the limit."New value: +"True when total_found exceeds the limit. Independent of offset." - changed
Output schema / requiredPrevious value: -[ - "recalls", - "period", - "total_found", - "truncated", - "cpsc_jurisdiction", - "source_note" -]New value: +[ + "recalls", + "period", + "total_found", + "truncated", + "offset", + "has_more", + "cpsc_jurisdiction", + "source_note" +]
- Changed
cpsc_search_recalls14 fields changed- changed
Input schema / properties / description_search / descriptionPrevious 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." - added
Input schema / properties / distributorAdded 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" +} - added
Input schema / properties / hazard_searchAdded 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" +} - added
Input schema / properties / offsetAdded 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" +} - added
Input schema / properties / remedyAdded 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" +} - added
Input schema / properties / title_searchAdded 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" +} - added
Input schema / properties / updated_endAdded 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." +} - added
Input schema / properties / updated_startAdded 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." +} - added
Output schema / properties / has_moreAdded value: +{ + "description": "True when records remain past this window — call again with offset raised by the number of recalls returned.", + "type": "boolean" +} - added
Output schema / properties / offsetAdded value: +{ + "description": "Number of matching records skipped before this window.", + "type": "number" +} - changed
Output schema / properties / recalls / items / properties / remedy_options / descriptionPrevious 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." - changed
Output schema / properties / total_found / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when total_found exceeds the limit."New value: +"True when total_found exceeds the limit. Independent of offset." - changed
Output schema / requiredPrevious value: -[ - "recalls", - "total_found", - "truncated", - "cpsc_jurisdiction", - "source_note" -]New value: +[ + "recalls", + "total_found", + "truncated", + "offset", + "has_more", + "cpsc_jurisdiction", + "source_note" +]
3 tool updates
- Changed
cpsc_get_recall6 fields changed- added
Output schema / properties / data_quality_notesAdded 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" +} - added
Output schema / properties / description / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / description / descriptionPrevious 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." - removed
Output schema / properties / description / typeRemoved value: -"string" - added
Output schema / properties / source_noteAdded value: +{ + "description": "Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision.", + "type": "string" +} - changed
Output schema / requiredPrevious 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" +]
- Changed
cpsc_get_recent4 fields changed- added
Output schema / properties / recalls / items / properties / data_quality_notesAdded 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" +} - changed
Output schema / properties / recalls / items / requiredPrevious 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" +] - added
Output schema / properties / source_noteAdded value: +{ + "description": "Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "recalls", - "period", - "total_found", - "truncated", - "cpsc_jurisdiction" -]New value: +[ + "recalls", + "period", + "total_found", + "truncated", + "cpsc_jurisdiction", + "source_note" +]
- Changed
cpsc_search_recalls8 fields changed- changed
Input schema / properties / date_end / anyOfPrevious 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" + } +] - changed
Input schema / properties / date_end / descriptionPrevious 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." - changed
Input schema / properties / date_start / anyOfPrevious 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" + } +] - changed
Input schema / properties / date_start / descriptionPrevious 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." - added
Output schema / properties / recalls / items / properties / data_quality_notesAdded 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" +} - changed
Output schema / properties / recalls / items / requiredPrevious 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" +] - added
Output schema / properties / source_noteAdded value: +{ + "description": "Provenance caveat: recall fields are relayed from CPSC unedited and unverified; check cpsc_url before a consumer-facing decision.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "recalls", - "total_found", - "truncated", - "cpsc_jurisdiction" -]New value: +[ + "recalls", + "total_found", + "truncated", + "cpsc_jurisdiction", + "source_note" +]
3 tool updates
- First observed
cpsc_get_recall - First observed
cpsc_get_recent - First observed
cpsc_search_recalls
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
CPSC MCP — US consumer-product safety recalls (CPSC, free, no auth).
Match consumer products to official CPSC recalls and purchase source-linked evidence.
Search 120,000+ recalled products from 8 global safety agencies using AI similarity.
FDA food, drug and device recalls: Class I alerts, firms, status. Updated weekly.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAccess US consumer-product safety recalls from the CPSC, free and without authentication.16MIT

deeprecall-mcpofficial
AlicenseNot gradedqualityDmaintenanceSearch 120,000+ recalled products from CPSC, FDA, EU Safety Gate, and other global agencies via MCP. Enables AI agents to check product safety by text or image.Apache 2.0- AlicenseAqualityCmaintenanceSearch URDB's product integrity database — integrity scores, enshittification events, warranty cuts, and material downgrades across consumer products. Sourced and evidence-backed.4702MIT
- AlicenseNot gradedqualityDmaintenanceEnables instant U.S. vehicle recall lookup by make, model, and year using official NHTSA data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool has a clearly distinct purpose: search for recalls, fetch recent recalls, and get full details by recall number. There is no overlap in functionality, and the descriptions reinforce when to use each.
All tool names follow the cpsc_ prefix with a verb_noun pattern (get_recall, get_recent, search_recalls). The naming is perfectly consistent and predictable.
Three tools is a well-scoped set for a recall lookup server. Each tool serves a necessary role (search, recent, detail) with no redundant or missing core operations.
The tool set covers the full read-only lifecycle for CPSC recalls: searching, browsing recent, and retrieving detailed records. All necessary operations for the domain are present, with no obvious gaps.