To start developing with Recall Kitchen, you'll need:
- An API key from the MCP
signup tool, or the app's Integrations page
- Or an x402-capable client for anonymous pay-per-request calls
- Familiarity with HTTP APIs or MCP
Authentication
Create a key with the MCP signup tool (email, no existing key) or in the app under Integrations. Send it on every request as Authorization: Bearer rk_... or X-API-Key: rk_.... MCP and HTTP search use the same keys. Without a key, search tool calls require x402 payment (USDC on Base). signup itself is free.
Usage is counted per account, not per key. Unverified signup accounts: 60 requests/hour, 400/day, one key, and no watch/inventory writes. After you sign in at app.recallkitchen.com with the same email: 600/hour, 3,000/day, three keys, 20 watch patterns, and 50 inventory products. Rate-limited responses return HTTP 429 with a Retry-After header and a JSON hint to verify or pay with x402.
curl
Search recalls:
curl -sS -H "Authorization: Bearer rk_..." \
"https://app.recallkitchen.com/api/sources?q=spinach&limit=10"
Call an MCP tool:
curl -sS -H "Authorization: Bearer rk_..." \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_product_recalls","arguments":{"query":"spinach","limit":3}}}' \
https://app.recallkitchen.com/mcp
Fetch one recall (lots, UPCs, locations):
curl -sS -H "Authorization: Bearer rk_..." \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_product_recall","arguments":{"recall_id":"RECALL_ID"}}}' \
https://app.recallkitchen.com/mcp
Against a local server, swap the host for http://localhost:8080.
If a request fails or a client will not connect, email [email protected].
Agent Integrations (MCP, MPP, x402)
Recall Kitchen integrates with the Model Context Protocol (MCP) and
Machine Payment Protocol (MPP) standards for tool use by AI models.
Our MCP implementation leverages x402 (USDC on Base) for micropayments, enabling paid access to tools.
MCP
Tools are free with an API key. Anonymous calls are paid (USDC on Base, $0.025 per call) via x402.
Search tools return compact recall objects with
id, source, title, a truncated description,
url, publishedOn, and up to five extracted products (lots/UPCs/locations).
Use get_product_recall for the full description and full extracted lists.
Prompts (check_product, check_upc, scan_image) and resources
(recall://docs/tools, recall://docs/sources) are available.
Vehicle and VIN search is coming soon.
Call with an API key or x402. Use search_product_recalls for keywords, search_recalls_by_identifier for a UPC/lot/model, search_product_recalls_from_image for a photo URL, data URI, or MCP image content, and get_product_recall for the full notice. Local file paths are not accepted. List tools support offset and return nextOffset when more results exist.
search_product_recalls
Search by query string. 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), since/until, location (country, region, or place, ANDed with the query; CA matches California and "northern california"; United States does not match Canada/Ontario), offset, and limit (1–100, default 3). Descriptions are truncated; call get_product_recall for the full text.
{
"query": "string",
"source": "string",
"since": "YYYY-MM-DD",
"until": "YYYY-MM-DD",
"location": "string",
"offset": 0,
"limit": 3
}
search_product_recalls_by_upc
Search extracted recall UPCs by UPC/EAN, or pass a barcode image as an HTTPS URL or data:image/...;base64 URI. Returns found=false with a hint when the UPC is unknown. Does not attach unrelated keyword hits.
{
"upc": "string",
"image_url": "string",
"limit": 3
}
search_product_recalls_from_image
Identify products in a public HTTPS image URL, a data:image/...;base64 URI (JPEG, PNG, GIF, WebP, BMP; max 8 MiB), or MCP image content (type: image with mimeType and base64 data). Local file paths are not supported. Each product includes match (upc, model, text, or category) and confidence. Category matches (generic cups, coolers, bowls) omit recalls unless include_category_matches is true.
{
"image_url": "string",
"limit": 3,
"include_category_matches": false
}
get_product_recall
Fetch one recall by id, including extracted lots, UPCs, model numbers, locations, stores, and contact info.
{
"recall_id": "string"
}
search_recalls_by_identifier
Search extracted recall data by UPC, lot code, model number, or product name. Multiple fields are AND-matched on the same product.
{
"upc": "string",
"lot_code": "string",
"model_number": "string",
"product_name": "string",
"limit": 3
}
lookup_product
Look up a product by UPC. Returns name and USDA branded-food details when available. Returns found=false when unknown. Does not search recalls.
{
"upc": "string"
}
signup does not require an API key or x402. The other account tools require an API key. Anonymous x402 callers get an error. Unverified accounts cannot add watch patterns or inventory.
signup
Create an account from an email and receive an API key once. No existing key or x402 payment. Does not re-issue a key if the email already has an account. Unverified accounts have lower rate limits until you sign in at app.recallkitchen.com with the same email.
{
"email": "string",
"name": "string"
}
create_api_key
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 shared across keys.
{
"name": "string",
"kind": "agent"
}
check_tracked_products
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 whole words in titles, and are not used as search queries unless weight is 7+.
{
"limit": 3,
"offset": 0
}
list_watch_patterns
List this API key's recall watch patterns.
{}
add_watch_pattern
Add a recall watch pattern. Same websearch syntax as search_product_recalls (AND, OR, -exclude, quoted phrases). Weight is 0–8 and defaults to 4.
{
"pattern": "string",
"weight": 4
}
remove_watch_pattern
Remove a watch pattern.
{
"pattern": "string"
}
list_inventory
List this API key's tracked inventory products.
{
"query": "string",
"limit": 3
}
add_inventory_product
Add a product to this API key's inventory.
{
"name": "string",
"brand": "string",
"category": "string",
"sku": "string"
}
remove_inventory_product
Remove an inventory product by id from list_inventory.
{
"id": 1
}
list_recall_notifications
List recall notifications for this API key. unread defaults to true. Empty for new accounts until a new matching recall is published; this is not a backfill of check_tracked_products.
{
"unread": true,
"limit": 3
}
x402 Payments
Anonymous MCP tool calls require x402 payments. Recall Kitchen currently supports USDC on Base. Send an API key to skip payment.
MCP Endpoints
Recall Kitchen's MCP endpoint is https://app.recallkitchen.com/mcp
(or http://localhost:8080/mcp when running locally).
Authorization: Bearer rk_...
Grok, Claude Code, and Cursor
Most MCP clients have no API-key prompt in the add UI. Pass the key as an HTTP header. If a client still will not connect, email [email protected].
Grok
Use X-API-Key, not Authorization: Bearer.
Grok's HTTP MCP client treats a Bearer header as OAuth and fails initialize because Recall Kitchen does not implement MCP OAuth:
Auth required, when send initialize request
The --header flag is Name: value.
grok mcp add --transport http recall-kitchen https://app.recallkitchen.com/mcp \
--header "X-API-Key: ${RECALL_KITCHEN_API_KEY}"
Local:
grok mcp add --transport http recall-kitchen http://localhost:8080/mcp \
--header "X-API-Key: ${RECALL_KITCHEN_API_KEY}"
Or in ~/.grok/config.toml:
[mcp_servers.recall-kitchen]
url = "http://localhost:8080/mcp"
enabled = true
[mcp_servers.recall-kitchen.headers]
X-API-Key = "rk_..."
If you already added the server with Authorization: Bearer, change that header to X-API-Key and refresh with r in /mcps.
Claude Code
Claude Code sends Authorization as a static header (it does not start OAuth when you pass --header). Official form:
claude mcp add --transport http recall-kitchen https://app.recallkitchen.com/mcp \
--header "Authorization: Bearer ${RECALL_KITCHEN_API_KEY}"
Local:
claude mcp add --transport http recall-kitchen http://localhost:8080/mcp \
--header "Authorization: Bearer ${RECALL_KITCHEN_API_KEY}"
Cursor
Add to project .cursor/mcp.json or global ~/.cursor/mcp.json. Cursor interpolates ${env:VAR} in url and headers:
{
"mcpServers": {
"recall-kitchen": {
"url": "https://app.recallkitchen.com/mcp",
"headers": {
"Authorization": "Bearer ${env:RECALL_KITCHEN_API_KEY}"
}
}
}
}
Claude Code and Cursor send Authorization as a static header. Grok does not — it starts an OAuth handshake — so Grok must use X-API-Key.
Examples
Go client and examples (API key or x402) are in Recall-Kitchen/rk-mcp. Implementation notes: docs/mcp.md.
MPP
Coming Soon -