@agentprolabs/pet-recall-mcp
v0.1.0
Published
Monitor pet food and drug recalls from Canadian (CFIA) and US (FDA) government sources
Maintainers
Readme
Pet Recall Watcher MCP
An open-source Model Context Protocol server that monitors pet food and veterinary drug recalls from the Government of Canada (CFIA / Health Canada) and the US FDA (openFDA), making recall data queryable by AI assistants like Claude.
Built by AgentProLabs · Open source under MIT
Status: v0.1. The
npxpackage is pending its first npm publish; the landing page is live at recalls.agentprolabs.com. A hosted HTTP/SSE MCP endpoint is planned for v0.2 — for now use the stdio server below.
What it does
Recall communication at the vet-clinic level is a scramble of distributor emails and listservs, with no machine-readable feed. Pet Recall Watcher ingests the public government recall datasets daily and exposes them over MCP so an AI assistant can answer questions on a clinic's behalf.
- Daily ingestion of pet-relevant recalls from the Government of Canada open dataset and the openFDA food + drug enforcement endpoints.
- Three MCP tools:
query_active_recalls— search/filter active recalls by species, category, region, and date range.lookup_product_status— fuzzy-match a product name against the recall database (handles partial names and minor misspellings).subscribe_recall_alerts— register an email for filtered recall alerts.
- Email notifications via Resend when new recalls match a subscription.
- Landing page with a subscribe form and a recent-recalls feed.
It runs as a local stdio server (via npx) for desktop AI clients.
Quick Start (stdio)
Run directly with npx — no install needed:
npx @agentprolabs/pet-recall-mcpClaude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"pet-recall-watcher": {
"command": "npx",
"args": ["-y", "@agentprolabs/pet-recall-mcp"]
}
}
}Restart Claude Desktop — the tools appear automatically. Then ask, e.g., "Are there any recent dog food recalls in Canada?"
Requirements: Node.js 20+. No configuration needed — the server is a thin
client over the hosted Pet Recall API, so there are no API keys or database
credentials to set. (Advanced/self-host: override the API origin with the
PET_RECALL_API_URL env var.)
Tools
query_active_recalls
Returns active pet food and drug recalls, with optional filtering. Sorted by recall date (newest first), paginated.
| Parameter | Type | Default | Description |
| ------------------ | -------------------------------------------------------------- | ------- | ---------------------------------- |
| species | "dog" | "cat" | "all" | "all" | Filter by affected species |
| product_category | "food" | "treat" | "drug" | "supplement" | "all" | "all" | Filter by product type |
| region | "canada" | "us" | "all" | "all" | Filter by recall origin |
| since_date | ISO 8601 date string | — | Only recalls on or after this date |
| limit | number (1–100) | 20 | Results per page |
| offset | number | 0 | Pagination offset |
Example response:
{
"recalls": [
{
"id": "1e6a57aa-80f6-400a-9896-a7f90baf4cfc",
"title": "Primal Patties for Dogs Beef Formula recalled due to Listeria",
"source": "canada_recalls",
"source_id": "64441",
"species": ["dog"],
"product_category": "food",
"product_names": ["Primal Patties for Dogs – Beef Formula"],
"brand": null,
"risk_level": null,
"reason": "Microbial hazard",
"region": "canada",
"recall_date": "2022-08-05",
"source_url": "https://recalls-rappels.canada.ca/en/alert-recall/...",
"data_freshness": "2026-06-02 23:17:23+00"
}
],
"total_count": 1,
"limit": 20,
"offset": 0
}lookup_product_status
Check whether a specific product has been recalled. Uses PostgreSQL pg_trgm
fuzzy matching against product names and brand — partial names and minor
misspellings still find results. No match is a valid, useful answer (not an
error).
| Parameter | Type | Required | Description |
| ----------------- | ----------------- | ---------- | ----------------------------------------------- |
| query | string (≥2 chars) | Yes | Product name, brand, or UPC to look up |
| match_threshold | number (0.1–1) | No (0.3) | Minimum similarity score (lower = more results) |
Example response (match found):
{
"matches": [
{
"title": "FRESHPET SELECT ... REFRIGERATED DOG FOOD",
"source": "openfda_food",
"risk_level": "Class II",
"recall_date": "2019-07-31",
"source_url": null,
"similarity_score": 0.72,
"matched_field": "product_name"
}
],
"query": "freshpet dog food",
"total_matches": 1,
"data_freshness": "2026-06-02 23:17:23+00"
}Example response (no match):
{
"matches": [],
"query": "asdfghjkl",
"total_matches": 0,
"data_freshness": null
}subscribe_recall_alerts
Subscribe an email to recall alerts matching optional filters. A duplicate (same email + filters) returns the existing subscription rather than creating a new one.
| Parameter | Type | Required | Description |
| ------------------ | -------------------------------------------------------------- | ------------ | ---------------------------------------------------------------- |
| email | string | Yes | Email address for alerts |
| species | "dog" | "cat" | "all" | No ("all") | Only alert for this species |
| product_category | "food" | "treat" | "drug" | "supplement" | "all" | No ("all") | Only alert for this category |
| region | "canada" | "us" | "all" | No ("all") | Only alert for this region |
| webhook_url | string | No | RESERVED for Phase 2 PMS integration — accepted but not acted on |
Example response:
{
"subscription_id": "e5f6g7h8-...",
"email": "[email protected]",
"filters": {
"species": "dog",
"product_category": "food",
"region": "canada"
},
"status": "active",
"created_at": "2026-06-02T00:00:00Z",
"message": "Subscription created"
}Resources
recent-recalls
URI: recall-feed://recent
Returns the 20 most recent recalls across all sources as JSON — lets a client show current recall activity without calling a tool.
Prompts
check-product-safety
A pre-built prompt that takes a product name, runs the fuzzy lookup, and frames the result for a plain-language safety summary.
| Argument | Type | Required | Description |
| -------------- | ------ | -------- | -------------------- |
| product_name | string | Yes | The product to check |
Server Info
| Field | Value |
| --------- | -------------------------------------- |
| Name | pet-recall-watcher |
| Version | 0.1.0 |
| Protocol | MCP (Model Context Protocol) |
| Transport | stdio (local); HTTP/SSE planned (v0.2) |
| Tools | 3 |
| Resources | 1 |
| Prompts | 1 |
Data sources
Daily ingestion from three public, unauthenticated government datasets — CFIA
(Canada), openFDA food, and openFDA drug enforcement. See
docs/DATA-SOURCES.md for endpoints, schema mappings,
freshness caveats, and the pet-relevance filtering strategy.
Development
npm install
npm run typecheck # tsc --noEmit
npm run lint # eslint .
npm run test # vitest run
npm run build # tsc -> dist/Architecture: shared logic in src/ (data-sources, tools, db, notifications);
Cloudflare Workers in workers/ (mcp-server, ingestion, api, notification);
the Astro landing page in landing/. See
IMPLEMENTATION_LOG.md for the build playbook and
docs/PHASE2-HOOKS.md for deferred features.
Coming later
- Hosted HTTP/SSE MCP endpoint at
recalls.agentprolabs.com/mcp(v0.2). match_recall_to_patients— cross-reference a recall against a clinic's patient product records (Phase 2; seedocs/PHASE2-HOOKS.md).
Built by AgentProLabs · Source · Open source under MIT.
