Developers
The Pantry Butler knows what is actually in someone's kitchen. That makes one question answerable here that a recipe search cannot answer anywhere: what can I cook tonight, with what I already have?
https://thepantrybutler.com/mcp — streamable HTTP,
JSON-RPC, same bearer tokens. Prefer it: the tools carry descriptions that tell an
assistant when to use them, which a REST spec can only hint at.
https://thepantrybutler.com/openapi.json — it needs no sign-in to read.
Create one on the Connect page. It is shown once and stored only as a
hash, so copy it then. Choose read unless the assistant needs to add things.
curl https://thepantrybutler.com/api/v1/cook-tonight \
-H "Authorization: Bearer pb_live_..."
| Path | What it does | Scope | |
|---|---|---|---|
GET |
/api/v1/me |
Who this token acts for Plan, recipe count and remaining allowance. Never returns an email address. |
read |
GET |
/api/v1/cook-tonight |
What can I cook right now? Every saved recipe scored against what is actually in this person's kitchen, best matches first. `can_make: true` means nothing is missing. This is the question the app exists to answer and the one no recipe search can. |
read |
GET |
/api/v1/pantry |
What is in the kitchen Items with their location (pantry, fridge, freezer) and expiry where known. |
read |
POST |
/api/v1/pantry |
Add items to the kitchen Send plain language — "2 lemons", "half a bag of spinach". Up to 50 at a time. Optional `location` of pantry, fridge or freezer. |
write |
GET |
/api/v1/recipes |
Saved recipes Title, source credit, source link and timings for up to 200 recipes. |
read |
POST |
/api/v1/recipes |
Save a recipe — a draft, or a link to queue Takes either shape. Send a DRAFT ({ title, ingredients, steps, … }) and it is saved to the cookbook — this is how you finish an import. Send a bare { url } and it returns 202 with { accepted, url, imported: false }: the link is checked against the account's recipe limit and nothing is imported. The full flow is POST /api/v1/capture to read the recipe, then POST the draft back here. |
write |
POST |
/api/v1/capture |
Read a recipe out of a link POST { url }. Runs the AI extraction and returns { draft, confidence }. The draft is NOT saved — POST it to /api/v1/recipes to keep it. Counts against the account's AI fair-use allowance, and a link somebody already captured is served from cache and costs nothing. A low confidence means the page gave too little to work from: the draft comes back mostly empty with `__note` explaining why and `__paste` suggesting where the recipe probably is — social posts often keep the ingredients in the first comment, and some sites answer a server with a sign-in wall rather than the post. |
write |
A token reaches these endpoints and nothing else. It cannot see or change a subscription, alter account settings, delete an account, or read an email address. If one leaks, revoke it in Account — the worst case is someone sees a recipe list.
120 requests a minute per token. Up to 10 live tokens per account. Tokens can be given an expiry when created, and revoked at any time.