Developers

Connect your kitchen to an assistant

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?

Using MCP? There is an MCP server at 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.
Point an agent at this. Meta Muse, ChatGPT and Claude can all build an integration from a public spec. Give yours: https://thepantrybutler.com/openapi.json — it needs no sign-in to read.

Getting a token

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_..."

Endpoints

PathWhat it doesScope
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

What a token cannot do

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.

Limits

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.

← The Pantry Butler