Skip to content

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