@cyanheads/cpsc-recalls-mcp-server
Public Hosted Server: https://cpsc-recalls.caseyjhand.com/mcp
Overview
Consumer product recalls from the CPSC saferproducts.gov database — toys, electronics, furniture, appliances, children's products, tools, and clothing. Search recalls by product, brand, retailer, or hazard, fetch full detail for a specific recall number, or pull a recent-recalls feed for a date window.
Tools
Tool | Description |
| Search consumer product recalls by title, product name, brand, retailer, importer, distributor, hazard, remedy, or description keyword, with optional date filtering and offset paging |
| Full detail for a single recall by recall number — hazards, remedy, products, injuries, images, and the official CPSC page |
| Fetch the most recent recalls ordered newest-first, scoped to a configurable date window |
Skills
Skill | Description |
| Find and confirm US consumer product recalls with the |
CPSC covers consumer products, including some that sit next to another agency's domain: child-resistant packaging for drugs and supplements, ATVs and snowmobiles, bicycle tires, and gun safes and locks. Food and drugs (FDA), on-road vehicles and their tires (NHTSA), boats (USCG), pesticides (EPA), and firearms (ATF) belong to other agencies; every response carries this jurisdiction note.
Related MCP server: mcp-cpsc
Capability reference
cpsc_search_recalls tool
At least one criterion, combined with AND: nine text filters of up to 500 characters each (
title_search, usually the highest-signal, plusproduct_name,manufacturer,retailer,importer,distributor,description_search,remedy,hazard_search) and two date axes (date_start/date_endfor the issue date,updated_start/updated_endfor the last CPSC publish date);limit(1–10,000, default 20; a page holds at most 200) andoffsetpage throughtotal_foundEach text filter matches every word, in any order, as a case-insensitive substring with no stemming — search a stem (
batterfinds battery and batteries)Returns the issue and last-published dates, hazards, remedy options and instructions, products, UPCs, manufacturer, importer, retailer, and distributor names, images,
cpsc_url, and per-recalldata_quality_notes; zero matches is an empty success whoseeffectiveQueryechoes the criteria and whose notice names the criterion to relax. Failures:missing_criteria,invalid_date_range,upstream_rejected(not retryable),upstream_error(retryable)has_moreis the paging signal; a page cut short by the 64,000-byte response budget, or held to 200 under a largerlimit, carries a notice with the offset to continue from
cpsc_get_recall tool
One
recall_number: 5 digits ("25043"), with a lettera–don some 1998–2001 records ("99003a"); only the record with exactly that number is returnedReturns the complete record — nullable
description(where model numbers usually live), hazards, remedy options and instructions, every product variant, UPCs, injury narrative, company names by role, country of manufacture, images, coordinated-agency recall URLs, anddata_quality_notesFailures:
not_found(resolve a number throughcpsc_search_recallsorcpsc_get_recent; for the bare base of a lettered family such as01160, the hint names the separate lettered recalls01160a,01160b,01160c),upstream_rejected(not retryable),upstream_error(retryable)
cpsc_get_recent tool
dayslook-back window (1–365, default 30) anchored to today;limit(1–10,000, default 20; a page holds at most 100) andoffsetpage throughtotal_found, since narrowingdaysdrops the oldest recalls rather than paging. Older recalls are reachable throughcpsc_search_recallsdate boundsReturns a lightweight record per recall — number, date, title, hazards, remedy types, product names,
cpsc_url,data_quality_notes— forcpsc_get_recallto expand;has_moreis the paging signal, and an empty window, an offset past the end, a budget-cut page, or a page held to 100 under a largerlimitcarries a notice. Failures:upstream_rejected(not retryable),upstream_error(retryable)
cpsc-recalls-guide skill
Helps an agent check whether a specific product, model, serial, or UPC was recalled, sweep a brand's or retailer's recall history, monitor new or republished recalls for a hazard, and decide whether a product is CPSC's at all
Served over MCP as the resource
skill://cpsc-recalls-guide/SKILL.mdunder the templateskill://{+path}; also ships inskills/for plugin installs and the.mcpbbundle
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
CPSC-specific:
Full client for the CPSC saferproducts.gov public recalls API — search, single-recall detail, and a recent-recalls feed
Every-word matching on all nine text filters — each word in any order, as a case-insensitive substring with no stemming, against the plain text the results show — applied over the complete result set before paging so
total_foundandhas_morestay accurate;hazard_search(aliashazard) covers hazard text, product names, and remedy instructionsHandles 5-digit recall numbers and the lettered numbers some 1998–2001 records carry, matching the requested number exactly
One 50-second budget per call covers every CPSC attempt and retry, so a stalled request ends as a retryable
upstream_errorbefore an MCP client's default 60-second timeoutJurisdiction boundary documented in every response — names the drug-packaging, vehicle, tire, and gun-safe products CPSC does recall, and the agencies that own the rest
Agent-friendly output:
Provenance on every response —
source_note,cpsc_url, and(CPSC source text)blockquote labels distinguish relayed CPSC narrative from the server's own guidancePlain text on both surfaces — the HTML markup and character codes CPSC stores in some records (
&,<br>, stray table tags) are converted to plain text before matching and output, andcontent[]escapes Markdown so model and serial numbers such as1HFVE05**K4000003keep every character; recall pages and coordinated recalls render as links, and product images render inline with their captions; HTTP(S) addresses preserve CPSC’s URL values on both surfaces, while other schemes remain visible as textPagination discriminators —
total_found,offset,has_more, andtruncatedon every search/recent response so agents can tell when results are clipped and page withoffset; each surface of a page stays within a 64,000-byte budget, and a notice gives the next offset when the budget or the page ceiling ends a page early; an oversizedlimitis served at the page ceiling rather than rejecteddata_quality_noteson every response — gaps observed in the upstream record (missing hazard text, no product entries), derived from which fields CPSC left blank rather than any judgment callJurisdiction note (
cpsc_jurisdiction) on every response — lets agents route callers to the correct agency (FDA, NHTSA, USCG, EPA, ATF) when a product is out of scope
Getting started
Connect to the hosted instance (Streamable HTTP, stateless), no install:
claude mcp add --transport http cpsc-recalls-mcp-server https://cpsc-recalls.caseyjhand.com/mcpOr run it locally:
claude mcp add cpsc-recalls-mcp-server -- npx -y @cyanheads/cpsc-recalls-mcp-serverFor other clients, add this to the MCP config file:
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/cpsc-recalls-mcp-server"]
}
}
}No API key is required — the CPSC public recalls API is freely accessible. For Docker or a source build, see Running the server.
Configuration
All configuration is validated at startup via Zod schemas. Key environment variables:
Variable | Description | Default |
| Transport: |
|
| HTTP server port |
|
| HTTP server host |
|
| HTTP endpoint path |
|
| Public origin for TLS-terminating reverse-proxy deployments | — |
| Session handling: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only) |
|
| Log each failed tool call's arguments and result, redacted by key name and capped at |
|
| Storage backend: |
|
| Enable OpenTelemetry |
|
No server-specific API keys are required. See .env.example for the full list of optional overrides.
Running the server
Local development
Requires Bun v1.4.0 or higher (or Node.js v24+). No API key is needed.
Clone and install:
git clone https://github.com/cyanheads/cpsc-recalls-mcp-server.git cd cpsc-recalls-mcp-server && bun install cp .env.example .env # optional — no required API keysBuild and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpFor Streamable HTTP, set the transport and port; the server listens at
http://localhost:3010/mcp:MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite
Docker
docker build -t cpsc-recalls-mcp-server .
docker run --rm -p 3010:3010 cpsc-recalls-mcp-serverTo run the published image over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/cpsc-recalls-mcp-server:latest"].
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/cpsc-recalls-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
|
|
| Tool definitions ( |
| CPSC recall service — API client, types, and |
Development guide
See CLAUDE.md / AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools in the
createApp()arrays insrc/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
CPSC MCP — US consumer-product safety recalls (CPSC, free, no auth).
U.S. federal product recalls from FDA, FSIS, CPSC, and NHTSA, in one schema.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.203 npm2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAccess US consumer-product safety recalls from the CPSC, free and without authentication.319 npmMIT

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- AlicenseNot gradedqualityBmaintenanceSearch and fetch ~800K Federal Reserve economic time-series from the FRED API via MCP, with STDIO or Streamable HTTP transport.353 npm1Apache 2.0