Inspiration
We watched a video about what happens to food after it's thrown away. In a landfill it rots without oxygen and releases methane, a greenhouse gas far more potent than CO₂ in the short term. Then we looked up the numbers. In 2022 the world wasted about 1.05 billion tonnes of food, around 19% of everything produced. 60% of that waste happened in households, and food loss and waste together generate 8 to 10% of global greenhouse gas emissions.
Nobody decides to throw food away. It happens because we can't see the back of the fridge, we forget when we opened the milk, and the moment we choose what to cook is never the moment we think about what's expiring. Technology should help us use our resources better, and the kitchen is where this waste begins. So we set out to give every household a personal food manager it can talk to, one that speaks up before the food goes bad.
That became Eat Me First: an Alexa+ kitchen agent that reads your grocery receipt, tracks what's expiring, plans dinner around the food about to go bad, and re-plans when something runs out mid-cook.
What it does
- Reads a receipt photo. Amazon Bedrock extracts the line items as structured JSON, and the items go straight into the pantry.
- Ages the pantry by itself. Every item gets an expiry date and a status: fresh, expiring soon, or expired.
- Understands spoken context. "I opened that milk a while back" shortens the milk's shelf life. No barcode or catalog knows that.
- Answers "what can I cook tonight?" with a recipe built around what expires first, and leaves expired items out on purpose.
- Re-plans mid-cook. If an ingredient runs out, it keeps the same dish, removes what's gone, and still uses the expiring food.
How we built it
The whole product surface is a self-hosted MCP server implementing the MCP specification 2025-11-25 over Streamable HTTP, the open standard Alexa+ uses for integrations. Clients negotiate a real protocol session, receive an Mcp-Session-Id, and call five JSON-Schema-typed tools, including get_inventory_status, update_pantry_context, ingest_receipt_items and generate_and_adapt_recipe. We verified the full session with the official MCP client in a smoke test.
The architecture has three layers, each with one job:
| Layer | Job |
|---|---|
| MCP server (Python) | Exposes the tools and orchestrates every request |
| Amazon Bedrock (Converse API, Claude Sonnet 4.5) | Two calls with different jobs: one extracts items from the receipt, one reasons about dinner |
| PostgreSQL | Owns every date, through a database trigger |
Our key design decision: the AI never decides when food expires. The model handles the fuzzy work (reading a photo, inventing a recipe), and the database handles the work that must be exact. When an item is inserted, a trigger computes its expiry date:
$$ d_{\text{exp}} = d_{\text{purchase}} + \text{shelf_life}(\text{item}) $$
If the user gives spoken context ("I opened it a while back"), a custom date overrides the default. The urgency of each item is the number of days it has left:
$$ \Delta = d_{\text{exp}} - d_{\text{today}} \qquad \text{status} = \begin{cases} \text{expired} & \Delta < 0 \ \text{expiring soon} & 0 \le \Delta \le k \ \text{fresh} & \Delta > k \end{cases} $$
The recipe tool reads the pantry sorted by $\Delta$, ascending, so the food closest to going bad always reaches the model first. Because status is computed in one place, the voice channel and the screen can never disagree.
The device surface is a Next.js app designed for an Echo Show: an ambient pantry view, a voice strip showing each request and the MCP tool it called, and a full-screen recipe stage built for a cook with busy hands. A server-side proxy forwards every request to the MCP server as a real tools/call. Since we don't have an Alexa+ device, a developer bench fires each voice request through that same proxy, the same way an MCP client would.
The stack runs locally with Docker Compose (PostgreSQL), the Python MCP server, and the Next.js frontend. It's open source under the MIT license.
Challenges we ran into
- Choosing what the AI should not do. Our first instinct was to let the model guess shelf life. It was inconsistent, and an assistant that's wrong about whether chicken is safe is worse than no assistant. Moving all date logic into a PostgreSQL trigger made the system predictable and easy to test.
- Re-planning, not regenerating. Asking the model for "a new recipe without milk" gave us a completely different dish. The fix was to send the previous recipe together with the excluded items, so the agent adapts the plan instead of starting over.
- Bedrock model lifecycle. The model ID we started with reached end of life mid-hackathon. We moved to a Claude Sonnet 4.5 inference profile, which also taught us how Bedrock routes cross-region inference.
- Credentials and configuration. AWS credentials had to live in the AWS credentials file, not in
.env. We learned this the hard way when the server silently couldn't reach Bedrock. - Receipts are messy. Non-English receipts and restaurant bills match nothing in the ingredient catalog. We scoped the catalog to 15 common ingredients and made unmatched items visibly grey instead of guessing.
- Time-relative test data. Expiry dates are relative to the purchase date, so our demo data drifted every day. We added controls to reset items through the product itself instead of editing the database by hand.
What we learned
- MCP is more than an API wrapper. Sessions, typed tool schemas and Streamable HTTP give an agent a stable contract, and state that lives in a database survives far beyond one conversation.
- Split deterministic and probabilistic work. Let the database be exact and let the model be creative. Each does its job better when it doesn't do the other's.
- The Bedrock Converse API makes it simple to run two focused calls instead of one giant prompt, and focused calls proved more reliable.
- Design for the kitchen, not the desk. Large type, one recipe step at a time, and voice first, because the user's hands are busy and their eyes are on the pan.
What's next
- Connect to a live Alexa+ environment as soon as access allows.
- Expand the ingredient catalog and support receipts in more languages, starting with Spanish.
- Proactive nudges: "Your tomatoes expire tomorrow, want a recipe?"
- Track the food saved per household and turn it into an estimate of avoided emissions.
Sources: UNEP Food Waste Index Report 2024, as reported by PBS NewsHour.
Built With
- alexa-plus
- amazon-bedrock
- amazon-web-services
- claude-sonnet-4.5
- docker
- model-context-protocol
- next.js
- node.js
- postgresql
- python
- react
- typescript
Log in or sign up for Devpost to join the conversation.