databasedmcp

← Articles

How to build a recipe box and meal planner with Claude

Save recipes by pasting them to Claude, plan the week's dinners in a sentence, and get a shopping list that skips what's in the cupboard.

7 min read

databasedmcp gives your AI assistant databases it keeps between conversations, so everything in this article works from the day you connect it. Free to start, no card.

Get started free

Why build it yourself

Recipe apps like Paprika or Mealime do three jobs: keep your recipes, plan the week and turn the plan into a shopping list. Under the screens, that's recipes, their ingredients and a calendar of meals.

Claude is good at the messy part. Paste a recipe from anywhere and it pulls out the ingredients and quantities. Say "the curry on Monday and Wednesday" and it fills in the plan. The shopping list is a query that adds up the week and leaves out what's in your pantry.

Connect Claude to databasedmcp

databasedmcp is a remote MCP server that gives AI assistants private SQLite databases, with nothing to install.

In Claude on the web, desktop or mobile, open Settings → Connectors, choose Add custom connector and enter https://databasedmcp.com/mcp. Select Connect, sign in to databasedmcp with your email or Google, and select Allow. Then turn databasedmcp on for a conversation from the tools menu.

Claude asks before it runs anything that changes or deletes data. Reading runs without asking.

Any other MCP client works the same way; the docs have the details.

Copy this prompt to build it

Paste this into Claude to set up the database, its tables and its guide in one go. The rest of this article walks through what it makes and how you use it.

prompt
Set up a recipe box and meal planner for me in databasedmcp, in one go.

1. Create a database called recipes, described as "Recipe box and meal planner: recipes, ingredients, a weekly plan, and a pantry, so the shopping list skips what I already have".
2. Create four tables:
   - recipes: id, name (required), serves, minutes, tags (a JSON array like ["vegetarian", "quick"], defaults to []), steps (the method as numbered lines), source.
   - ingredients: id, recipe_id (references recipes), item (required, lowercase and singular, like "onion"), qty (a number, decimals allowed), unit (g, ml, tbsp, tsp or pcs).
   - meal_plan: id, day (date, required), meal (breakfast, lunch or dinner), recipe_id (references recipes). One recipe per meal per day: make day and meal unique together.
   - pantry: item (the key, spelled the same way as in ingredients).
3. Write the database a guide that says what each table is for, how to write items and units so the shopping list adds up, to remove a pantry item when I say I've run out, and the query for "what do I need to buy for next week": the week's planned ingredients added up by item and unit, leaving out what's in the pantry.

From then on: when I paste a recipe, save it with its ingredients and steps. When I plan meals, add them to meal_plan on the right dates. When I say I have something, add it to the pantry. Show me the tables when you're finished.

Ask for the database

You don't write the schema. Describe what you want:

Set up a recipe box and meal planner in databasedmcp: recipes with servings, time, tags and steps; their ingredients with quantities and units; a plan of which recipe I'm cooking for which meal on which day; and a pantry list of what I already have. Build my shopping list from the plan minus the pantry.

Claude creates a database called recipes and its tables:

schema
CREATE TABLE recipes (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  serves INTEGER,
  minutes INTEGER,
  tags TEXT NOT NULL DEFAULT '[]',
  steps TEXT,
  source TEXT
);

CREATE TABLE ingredients (
  id INTEGER PRIMARY KEY,
  recipe_id INTEGER NOT NULL REFERENCES recipes(id),
  item TEXT NOT NULL,
  qty REAL,
  unit TEXT
);

CREATE TABLE meal_plan (
  id INTEGER PRIMARY KEY,
  day TEXT NOT NULL,
  meal TEXT NOT NULL CHECK (meal IN ('breakfast', 'lunch', 'dinner')),
  recipe_id INTEGER NOT NULL REFERENCES recipes(id),
  UNIQUE (day, meal)
);

CREATE TABLE pantry (
  item TEXT PRIMARY KEY
);

It also writes the database a guide on how the tables are meant to be used. The guide comes back with the schema whenever an assistant looks the database up. Claude files things the same way next week as today, and so does any other assistant you connect.

guide
# recipes: recipes, ingredients, plan, pantry

- **recipes**: one per dish. `tags` is a JSON array (["vegetarian", "quick"]). `steps` is the method as numbered lines.
- **ingredients**: one row per ingredient per recipe. `item` is lowercase and singular ("onion", "chickpeas") so the shopping list adds up. `unit` uses g, ml, tbsp, tsp or pcs.
- **meal_plan**: one recipe per day per meal (breakfast, lunch, dinner).
- **pantry**: items I already have. Remove one when I say I've run out.

Shopping list for next week: `SELECT i.item, sum(i.qty) AS qty, i.unit FROM meal_plan m JOIN ingredients i ON i.recipe_id = m.recipe_id WHERE m.day BETWEEN date('now', 'weekday 1') AND date('now', 'weekday 1', '+6 days') AND i.item NOT IN (SELECT item FROM pantry) GROUP BY i.item, i.unit ORDER BY i.item`

Use it

From here on you talk, and Claude writes the rows. Each request below is one statement:

Save these two: my chickpea curry and the lemon pasta from my sister.
execute
INSERT INTO recipes (name, serves, minutes, tags, steps) VALUES (?, ?, ?, ?, ?), (?, ?, ?, ?, ?)
-- params: ["Chickpea curry",4,35,"[\"vegetarian\", \"batch\"]","1. Soften the onion in oil.\n2. Add spices, then tomatoes and chickpeas.\n3. Simmer 20 minutes and stir in the spinach.","Lemon pasta",2,20,"[\"vegetarian\", \"quick\"]","1. Boil the pasta.\n2. Toss with butter, lemon and parmesan."]
Here are the ingredients for both.
execute
INSERT INTO ingredients (recipe_id, item, qty, unit) VALUES (1, ?, ?, ?), (1, ?, ?, ?), (1, ?, ?, ?), (1, ?, ?, ?), (2, ?, ?, ?), (2, ?, ?, ?), (2, ?, ?, ?)
-- params: ["onion",1,"pcs","chickpeas",800,"g","chopped tomatoes",400,"g","spinach",200,"g","spaghetti",200,"g","lemon",1,"pcs","parmesan",50,"g"]
Next week: curry on Monday and Thursday, lemon pasta on Tuesday.
execute
INSERT INTO meal_plan (day, meal, recipe_id) VALUES (date('now', 'weekday 1'), 'dinner', 1), (date('now', 'weekday 1', '+1 day'), 'dinner', 2), (date('now', 'weekday 1', '+3 days'), 'dinner', 1)

weekday 1 is the coming Monday, so the plan lands on the right dates whatever day you ask.

I already have onions and spaghetti.
execute
INSERT OR IGNORE INTO pantry (item) VALUES (?), (?)
-- params: ["onion","spaghetti"]

Ask it questions

Once there's data, each report you'd pay for is a single query:

What do I need to buy for next week?
query
SELECT i.item, sum(i.qty) AS qty, i.unit FROM meal_plan m JOIN ingredients i ON i.recipe_id = m.recipe_id WHERE m.day BETWEEN date('now', 'weekday 1') AND date('now', 'weekday 1', '+6 days') AND i.item NOT IN (SELECT item FROM pantry) GROUP BY i.item, i.unit ORDER BY i.item

The curry is on twice, so its chickpeas add up to 1,600 g.

Something vegetarian in under 30 minutes?
query
SELECT r.name, r.minutes FROM recipes r, json_each(r.tags) t WHERE t.value = ? AND r.minutes <= ? ORDER BY r.minutes
-- params: ["vegetarian",30]
What haven't I cooked in a while?
query
SELECT r.name, max(m.day) AS last_planned FROM recipes r LEFT JOIN meal_plan m ON m.recipe_id = r.id GROUP BY r.id ORDER BY last_planned

You can also open the database on the website, page through its rows and run read-only SQL yourself.

What you give up

There are no photos. databasedmcp keeps text and numbers, so the recipe is its ingredients and steps. Keep a link to the original if you want the picture. Paid recipe apps also save a recipe from a web page with one tap. Here you paste it, and Claude does the sorting.

There's no cooking mode, no timers and no shopping list that syncs to your partner's phone as you tick things off. You can ask Claude for the list on your phone at the shop, and anyone on your account can see the database. If the household shops from one shared app, that's what the paid apps are for.

Try it

databasedmcp is free to start, with no card. Free has 100 tool calls a week, enough to set this up and try it for a week. Starter has 1,000 for everyday use.

Create an account

More articles · databasedmcp · Docs