io.github.cyanheads/cpsc-recalls-mcp-server
US consumer product recalls from the CPSC: hazards, remedies, and affected products.
ماذا يمكنك أن تفعل مع 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
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «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"
}
}
}
}
متغيرات البيئة
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"
}
}
}
}
متغيرات البيئة
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').
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
@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.
الأسئلة الشائعة
ما هو io.github.cyanheads/cpsc-recalls-mcp-server؟
US consumer product recalls from the CPSC: hazards, remedies, and affected products.
كيف أثبّت io.github.cyanheads/cpsc-recalls-mcp-server؟
يعمل كخادم بعيد. في Claude Code: claude mcp add --transport http cpsc-recalls-mcp-server 'https://cpsc-recalls.caseyjhand.com/mcp'. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج io.github.cyanheads/cpsc-recalls-mcp-server إلى مفتاح API؟
لا يذكر إدراجه في السجل أي مفتاح أو سر إلزامي. قد تتطلب بعض الميزات حسابًا لدى الخدمة التي يتصل بها.
هل io.github.cyanheads/cpsc-recalls-mcp-server مفتوح المصدر؟
نعم. شيفرته متاحة على GitHub بترخيص Apache-2.0.
من يصون io.github.cyanheads/cpsc-recalls-mcp-server؟
ينشره cyanheads. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.