Recipe Studio¶
TL;DR
An MCP-connected decision engine for recipe selection: PostgreSQL stores your pantry, recipe bank, and meal history; a scoring engine ranks options against your actual situation; and natural-language questions get real answers back. Stack: Python ยท MCP ยท PostgreSQL 16. Design phase.
The question "what are we cooking tonight?" sounds simple. It's not. It involves what's in the pantry, what we've already eaten this week, how much time we have, and whatever preferences are in play that day.
This project is a decision engine for that problem. Ask a question, hit an MCP server connected to a PostgreSQL database, get back a ranked list of options based on your actual situation.
Still in the design phase โ but the problem is real and the schema thinking is started.
How It Works¶
graph TB
A["User Question"] --> B["MCP Server"]
B --> C[("PostgreSQL")]
C -->|pantry inventory| D["Scoring Engine"]
C -->|recipe bank| D
C -->|meal history| D
D --> E["Ranked Recipe List"]
Under the Hood¶
The schema is built around the three things that matter at decision time: what's in the pantry, what's been cooked recently, and how long a recipe takes. pantry_item is the key constraint โ it filters the recipe bank before scoring starts, so the system never surfaces a recipe you can't actually make. meal_history prevents repetition, the default failure mode of most "suggest something" features.
recipe:
id, name, prep_time_minutes, tags[]
ingredient:
id, name, unit
recipe_ingredient:
recipe_id, ingredient_id, quantity
pantry_item:
ingredient_id, quantity_on_hand, last_updated
meal_history:
recipe_id, date_cooked
The scoring engine is intentionally simple: pantry coverage, recency, and prep time. No ML โ the goal is a system that's fast and auditable from day one without needing training data.
A recipe scores higher when:
- Most ingredients are already in the pantry
- It hasn't been cooked recently
- Prep time fits the day
The MCP layer sits between the user and the database: a natural-language question resolves into a structured query, and the response is a ranked list โ not a single answer โ so the final call stays with the person eating.
Stack: Python ยท MCP Server ยท PostgreSQL 16