io.github.cyanheads/cpsc-recalls-mcp-server
US consumer product recalls from the CPSC: hazards, remedies, and affected products.
Que pouvez-vous faire avec io.github.cyanheads/cpsc-recalls-mcp-server ?
- 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, case-insensitive, against the plain text the results show — applied over the complete result set before paging so
total_foundandhas_morestay accurate;hazard_search(alias `haza... - Handles both modern 5-digit recall numbers and historical 1998–2001 records with letter suffixes
- Jurisdiction boundary documented in every response — flags food, vehicle, and drug recalls as out of scope before an agent misattributes them
- Provenance on every response —
source_note,cpsc_url, and(CPSC source text)blockquote labels distinguish relayed CPSC narrative from the server's own guidance - Plain 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 as `1... - Pagination 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... data_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 call
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
claude mcp add --transport http cpsc-recalls-mcp-server 'https://cpsc-recalls.caseyjhand.com/mcp'
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"type": "http",
"url": "https://cpsc-recalls.caseyjhand.com/mcp"
}
}
}
@cyanheads/cpsc-recalls-mcp-serverclaude mcp add cpsc-recalls-mcp-server -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/cpsc-recalls-mcp-server@0.3.1
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/cpsc-recalls-mcp-server@0.3.1"
],
"env": {
"MCP_LOG_LEVEL": "info"
}
}
}
}
Variables d'environnement
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
@cyanheads/cpsc-recalls-mcp-serverclaude mcp add cpsc-recalls-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/cpsc-recalls-mcp-server@0.3.1
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/cpsc-recalls-mcp-server@0.3.1"
],
"env": {
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "127.0.0.1",
"MCP_HTTP_PORT": "3010",
"MCP_HTTP_ENDPOINT_PATH": "/mcp",
"MCP_AUTH_MODE": "none",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Variables d'environnement
MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
@cyanheads/cpsc-recalls-mcp-server
Search and retrieve US consumer product recalls from the CPSC (Consumer Product Safety Commission) via MCP. STDIO or Streamable HTTP.
3 Tools
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. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
| Tool | Description |
|---|---|
cpsc_search_recalls | Search consumer product recalls by title, product name, brand, retailer, importer, distributor, hazard, remedy, or description keyword, with optional date filtering and offset paging |
cpsc_get_recall | Full detail for a single recall by recall number — hazards, remedy, products, injuries, images, and the official CPSC page |
cpsc_get_recent | Fetch the most recent recalls ordered newest-first, scoped to a configurable date window |
CPSC jurisdiction is consumer products only — food/drugs (FDA), motor vehicles/tires (NHTSA), boats (USCG), pesticides (EPA), and firearms (ATF) are not in this database; every response carries a jurisdiction note.
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–200, default 20) andoffsetpage throughtotal_found - Returns hazards, remedy options and instructions, products, UPCs, company names by role, 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 carries a notice with the offset to continue from
cpsc_get_recall tool
- One
recall_number: 5 digits for 2002–present records ("25043"), or 5 digits plus a lettera–dfor 1998–2001 records ("99003a") - Returns 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_notes - Failures:
not_found(resolve a number throughcpsc_search_recallsorcpsc_get_recent),upstream_rejected(not retryable),upstream_error(retryable)
cpsc_get_recent tool
dayslook-back window (1–365, default 30) anchored to today;limit(1–100, default 20) andoffsetpage throughtotal_found, since narrowingdaysdrops the oldest recalls rather than paging. Older recalls are reachable throughcpsc_search_recallsdate bounds- Returns 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, or a budget-cut page carries a notice. Failures:upstream_rejected(not retryable),upstream_error(retryable)
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, case-insensitive, 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 instructions - Handles both modern 5-digit recall numbers and historical 1998–2001 records with letter suffixes
- Jurisdiction boundary documented in every response — flags food, vehicle, and drug recalls as out of scope before an agent misattributes them
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 guidance - Plain 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 page, image, and coordinated-recall addresses that contain spaces are percent-encoded incontent[]so each renders as one working link, whilestructuredContentcarries them as CPSC stores them - Pagination 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 ends a page early data_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 call- Jurisdiction 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
Public Hosted Instance
A public instance is available at https://cpsc-recalls.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"type": "streamable-http",
"url": "https://cpsc-recalls.caseyjhand.com/mcp"
}
}
}
Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/cpsc-recalls-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/cpsc-recalls-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"cpsc-recalls-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/cpsc-recalls-mcp-server:latest"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- No API key required — the CPSC public recalls API is freely accessible.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/cpsc-recalls-mcp-server.git
- Navigate into the directory:
cd cpsc-recalls-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# edit .env if needed — no required API keys
Configuration
All configuration is validated at startup via Zod schemas. Key environment variables:
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http | stdio |
MCP_HTTP_PORT | HTTP server port | 3010 |
MCP_HTTP_HOST | HTTP server host | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path | /mcp |
MCP_PUBLIC_URL | Public origin for TLS-terminating reverse-proxy deployments | — |
MCP_SESSION_MODE | Session handling: auto, stateful, or stateless. The server declares stateless in src/index.ts; setting this overrides it. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error) | info |
LOGS_DIR | Directory for log files (Node.js only) | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | Log each failed tool call's arguments and result, redacted by key name and capped at LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). A secret inside a free-form value is not redacted. | false |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1 | in-memory |
OTEL_ENABLED | Enable OpenTelemetry | false |
No server-specific API keys are required. See .env.example for the full list of optional overrides.
Running the server
Local development
- Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http - Run 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-server
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 |
|---|---|
src/index.ts | createApp() entry point — registers tools and inits the CPSC service |
src/mcp-server/tools | Tool definitions (definitions/*.tool.ts) — search, get-recall, get-recent — plus response-budget.ts, the page size budget the two list tools share, and markdown-escape.ts, the escaping applied to CPSC text in content[] |
src/services/cpsc-recall | CPSC recall service — API client, types, and normalize-text.ts, which converts CPSC's HTML markup and character codes to plain text |
Development guide
See CLAUDE.md / AGENTS.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools in the
createApp()arrays insrc/index.ts - Wrap 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 test
License
Apache-2.0 — see LICENSE for details.
Questions fréquentes
Qu'est-ce que io.github.cyanheads/cpsc-recalls-mcp-server ?
US consumer product recalls from the CPSC: hazards, remedies, and affected products.
Comment installer io.github.cyanheads/cpsc-recalls-mcp-server ?
Il fonctionne comme serveur distant. Dans Claude Code : claude mcp add --transport http cpsc-recalls-mcp-server 'https://cpsc-recalls.caseyjhand.com/mcp'. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour io.github.cyanheads/cpsc-recalls-mcp-server ?
Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.
io.github.cyanheads/cpsc-recalls-mcp-server est-il open source ?
Oui. Son code est sur GitHub sous licence Apache-2.0.
Qui maintient io.github.cyanheads/cpsc-recalls-mcp-server ?
Il est publié par cyanheads. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.