Skip to content

Recall Kitchen

by adamdecaf · remote · no sign-in to list tools · v1.0.1 · published by GitHub user adamdecaf

US recalls MCP: free API key/signup or x402 $0.025 Base; some tools need key; verify↑limits

Deletes · 3Changes · 7

20 tools: 3 can delete or cancel things, 7 change things and 10 only read.

Scanned Oct 21, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http recall-kitchen https://app.recallkitchen.com/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

20 tools

Deletes or cancels 3Claude Code: deny
  • remove_inventory_productRemove a product from this API key's inventory by id.No findings

    Why it is in this group

    • The name "remove_inventory_product" says "remove": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Remove a product from this API key's inventory by id. Requires an API key.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • remove_watch_patternRemove a recall watch pattern for this API key.No findings

    Why it is in this group

    • The name "remove_watch_pattern" says "remove": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Remove a recall watch pattern for this API key. Requires an API key.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • revoke_api_keyRevoke an API key by key_id from list_api_keys.No findings

    Why it is in this group

    • The name "revoke_api_key" says "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Revoke an API key by key_id from list_api_keys. Requires an API key. Revoking the current key will fail subsequent calls.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
Changes things 7Claude Code: ask
  • add_inventory_productAdd a product to this API key's inventory.No findings

    Why it is in this group

    • The name "add_inventory_product" says "add": a word for a change.
    Description, as the server wrote it
    Add a product to this API key's inventory. Optional category is food, beverage, baby, household, electronics, vehicle, medical_device, drug, cosmetics, pet, or other. Requires a verified account (sign in at https://app.recallkitchen.com with the signup email). Unverified signup keys cannot add inventory.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • add_watch_patternAdd a recall watch pattern for this API key.No findings

    Why it is in this group

    • The name "add_watch_pattern" says "add": a word for a change.
    Description, as the server wrote it
    Add a recall watch pattern for this API key. Same websearch syntax as search_product_recalls (AND, OR, -exclude, quoted phrases). New matches show up in Recall Kitchen. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • check_tracked_productsCheck this API key's watch patterns and inventory against current indexed recalls (including historical notices).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Check this API key's watch patterns and inventory against current indexed recalls (including historical notices). Does not create notifications. Generic patterns such as food or hazard only match in titles. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • create_api_keyCreate an additional API key for this account.No findings

    Why it is in this group

    • The name "create_api_key" says "create": a word for a change.
    Description, as the server wrote it
    Create an additional API key for this account. Requires an existing API key. Unverified accounts may have only one key; verified accounts may have three. Usage is counted per account, not per key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • give_feedbackReport a bug, missing capability, bad search result, or confusing schema to the Recall Kitchen team.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Report a bug, missing capability, bad search result, or confusing schema to the Recall Kitchen team. Use this instead of silently working around a problem. message is required and should include the MCP tool names you called, the actions you took, the query or identifiers, and any recall_id. Do not send API keys, photos, or PII. Optional category: bad_result, tool_error, missing_capability, confusing_schema, docs, other. Optional severity: blocked, workaround, annoyance. No API key or x402 required. Does not count against search quotas.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • mark_notification_readMark a recall notification as read (default) or unread.No findings

    Why it is in this group

    • The name "mark_notification_read" says "mark": a word for a change.
    Description, as the server wrote it
    Mark a recall notification as read (default) or unread. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • signupCreate a Recall Kitchen account and API key from an email.No findings

    Why it is in this group

    • The description's first verb is "create": a word for a change.
    Description, as the server wrote it
    Create a Recall Kitchen account and API key from an email. No API key or x402 payment required. Set accept_terms true only after you ask the person and they confirm they are 13 or older and accept the Terms (https://recallkitchen.com/terms), Privacy Policy (https://recallkitchen.com/privacy) and API Terms (https://recallkitchen.com/api-terms); never set it automatically or on the person's behalf. The key is returned once. Unverified accounts have lower rate limits (60 tool calls/hour, 400/day, one key) and can add a few watch patterns. Sign in at https://app.recallkitchen.com with the same email to verify, raise limits, and add inventory. Does not re-issue a key if the email already has an account.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
Only reads 10Claude Code: allow, ask for 2 outbound
  • get_product_recallGet a recall by id, including extracted lots, UPCs, model numbers, locations, contact info, and product photo URLsReads private dataReads text others writeNo findings

    Why it is in this group

    • The name "get_product_recall" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "get" and "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Get a recall by id, including extracted lots, UPCs, model numbers, locations, contact info, and product photo URLs

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: true
  • list_api_keysList this account's API keys (id, name, prefix, created).No findings

    Why it is in this group

    • The name "list_api_keys" says "list": a word for reading.
    Description, as the server wrote it
    List this account's API keys (id, name, prefix, created). Secrets are not shown. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • list_inventoryList this API key's tracked inventory products.No findings

    Why it is in this group

    • The name "list_inventory" says "list": a word for reading.
    Description, as the server wrote it
    List this API key's tracked inventory products. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • list_recall_notificationsList recall notifications for this API key.No findings

    Why it is in this group

    • The name "list_recall_notifications" says "list": a word for reading.
    Description, as the server wrote it
    List recall notifications for this API key. unread defaults to true (unread only); pass false for all. New matches show up in Recall Kitchen. Empty for new accounts until a new matching recall is published; not a backfill of check_tracked_products. message is a short plain-text summary. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • list_watch_patternsList this API key's recall watch patterns.No findings

    Why it is in this group

    • The name "list_watch_patterns" says "list": a word for reading.
    Description, as the server wrote it
    List this API key's recall watch patterns. Requires an API key.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • lookup_productLook up a product by UPC/EAN.Reads text others writeNo findings

    Why it is in this group

    • The name "lookup_product" says "lookup": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Look up a product by UPC/EAN. Returns found=false when unknown. Does not search recalls.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: true
  • search_product_recallsSearch product recalls by query.Reads text others writeNo findings

    Why it is in this group

    • The name "search_product_recalls" says "search": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Search product recalls by query. Query uses websearch syntax: unquoted words are AND, OR is or, -term excludes, quoted phrases match as a unit (example: Generac Generator -Portable). Optional filters: source (cpsc, fdafoodsafety, FDAMedWatch, usda, nhtsa, canada, costco, target, walmart, openfda), since/until (YYYY-MM-DD), location (country, region, or place, ANDed with the query), offset, limit. Descriptions are truncated and extracted products are capped; use get_product_recall for the full text.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: true
  • search_product_recalls_by_upcSearch recalls by UPC/EAN or a barcode image URL/data URI/MCP image content.Reads text others writeCan send data outNo findings

    Why it is in this group

    • The name "search_product_recalls_by_upc" says "search": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "search" and "url": it reads web pages, which anyone can write.
    • untrusted-inputThe input takes a URL (input.url), and the tool reads it: it reads web pages, which anyone can write.
    • outboundThe input takes a URL (input.url): a request to a URL can carry data to whoever runs it.

    Claude Code: ask, because it is tagged outbound.

    Description, as the server wrote it
    Search recalls by UPC/EAN or a barcode image URL/data URI/MCP image content. Matches extracted recall UPCs first. Returns found=false when the UPC is unknown.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: true
  • search_product_recalls_from_imagePhoto (beta): identify products in a public HTTPS image URL, data:image/...;base64 URI, or MCP image content part.Reads text others writeCan send data outNo findings

    Why it is in this group

    • The name "search_product_recalls_from_image" says "search": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "http": it reads web pages, which anyone can write.
    • untrusted-inputThe input takes a URL (input.url), and the tool reads it: it reads web pages, which anyone can write.
    • outboundThe input takes a URL (input.url): a request to a URL can carry data to whoever runs it.

    Claude Code: ask, because it is tagged outbound.

    Description, as the server wrote it
    Photo (beta): identify products in a public HTTPS image URL, data:image/...;base64 URI, or MCP image content part. Local files are not supported. Each product includes match (upc, model, text, category) and confidence. Category matches omit recalls unless include_category_matches=true. Requires an API key or x402; not included in the free anonymous per-IP quota.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: true
  • search_recalls_by_identifierSearch recalls by extracted UPC, lot code, model number, product name, or VIN.Reads text others writeNo findings

    Why it is in this group

    • The name "search_recalls_by_identifier" says "search": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Search recalls by extracted UPC, lot code, model number, product name, or VIN. Multiple identifiers are AND-matched on the same product. VIN lookup lists NHTSA campaigns for the decoded year and make; confirm your vehicle on nhtsa.gov/recalls. lot_code matches extracted lot codes after normalizing spaces, case, and punctuation; if lots were not extracted, also searches notice title and description — verify against the notice. product_name falls back to the same full-text search as search_product_recalls when no exact extracted name matches, and returns a hint if still empty.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

12 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 private-data tool breaks every one.

Reads private data1
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write6
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out2
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
deny to break every path
{
  "permissions": {
    "deny": [
      "mcp__recall-kitchen__get_product_recall"
    ]
  }
}

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Install

Pinned to version 1.0.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http recall-kitchen https://app.recallkitchen.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__recall-kitchen__get_product_recall",
      "mcp__recall-kitchen__list_api_keys",
      "mcp__recall-kitchen__list_inventory",
      "mcp__recall-kitchen__list_recall_notifications",
      "mcp__recall-kitchen__list_watch_patterns",
      "mcp__recall-kitchen__lookup_product",
      "mcp__recall-kitchen__search_product_recalls",
      "mcp__recall-kitchen__search_recalls_by_identifier"
    ],
    "ask": [
      "mcp__recall-kitchen__add_inventory_product",
      "mcp__recall-kitchen__add_watch_pattern",
      "mcp__recall-kitchen__check_tracked_products",
      "mcp__recall-kitchen__create_api_key",
      "mcp__recall-kitchen__give_feedback",
      "mcp__recall-kitchen__mark_notification_read",
      "mcp__recall-kitchen__search_product_recalls_by_upc",
      "mcp__recall-kitchen__search_product_recalls_from_image",
      "mcp__recall-kitchen__signup"
    ],
    "deny": [
      "mcp__recall-kitchen__remove_inventory_product",
      "mcp__recall-kitchen__remove_watch_pattern",
      "mcp__recall-kitchen__revoke_api_key"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as recall-kitchen. Review it before you use it.

Capability tags behind 6 rules
  • mcp__recall-kitchen__get_product_recall private-data, untrusted-input
  • mcp__recall-kitchen__lookup_product untrusted-input
  • mcp__recall-kitchen__search_product_recalls untrusted-input
  • mcp__recall-kitchen__search_product_recalls_by_upc untrusted-input, outbound
  • mcp__recall-kitchen__search_product_recalls_from_image untrusted-input, outbound
  • mcp__recall-kitchen__search_recalls_by_identifier untrusted-input