Inspiration

Household logistics are a real, daily coordination problem: who cooks, what fits everyone's diet and allergies, what's actually in the pantry, and how the evening fits around dinner. Voice assistants answer questions, but they don't run the household. We wanted to prove an Alexa+ skill can be a first-class stateful agent — one sentence in, a planned and partially-executed evening out.

What it does

Hearth is an MCP server for Alexa+ that manages a household as state:

  • Plans the week — "Plan next week's dinners, vegetarian on Tuesdays and Thursdays, Alex is dairy-allergic" becomes 7 unique, allergy-aware dinners with a cook assigned.
  • Shops — diffs the meal plan against the pantry and auto-fills the shopping list with only the shortfalls.
  • Cooks — opens a guided cooking session with ingredient/step checks and advance/resume.
  • Winds down — generates a timed evening routine (start → prep → cook → serve → clean up) anchored to dinner time.
  • Answers — who's cooking, what's for dinner, what's in the pantry, what can we make with what we have, who's home.

It does this by calling its own 25 MCP tools through the same Streamable HTTP endpoint any Alexa+ client uses A simulated-Alexa+ React app streams every tool call live over SSE, so the agent's reasoning is visible while it runs. The same server plugs into any MCP HTTP client.

How we built it

TypeScript full-stack.

  • Server: Express 5 + the official @modelcontextprotocol/sdk (Streamable HTTP transport, 2025-11-25 spec). File-backed household state (data/household.json) gives cross-session long-term memory.
  • Agent: Amazon Bedrock (Claude via the Converse API, tool calling) with a deterministic local intent-router fallback, so the stack runs offline and in CI. Domain logic (meal planner, shopping diff, routine timetables) is deterministic — the LLM only calls tools.
  • Front-end: React + Vite Alexa+ screen with a live agent trace and a household dashboard.
  • Self-hosting proof : orchestrate.task spins up a real MCP client inside the server and drives the loop through the live endpoint, so the demo is the runtime.

Challenges we ran into

MCP spec churn across SDK versions, Express 5 route-pattern changes, zod v4 validation inside the SDK, and getting the Bedrock Converse API to describe MCP tool schemas cleanly. The full friction log is below.

Accomplishments we're proud of

  • A true agent-over-MCP loop: the server is both MCP server and MCP client, so the demo round-trips the real protocol instead of faking tool calls.
  • Deterministic correctness guaranteed by the domain layer even when the planner is a regex, with an optional Bedrock path for real LLM tool-calling.
  • Long-term-memory state ("The Talents" household) persisted across sessions.
  • Honest degradation: every failure path (no plan, no routine, no session, junk input, typos like "brekfast"/"diner", emoji) returns a helpful answer, covered by a 34-case edge/intent test battery.

What we learned

  • A server can be its own agent : MCP's uniform tool contract made it natural to have the MCP server also act as an MCP client (orchestrate.task) — the demo round-trips the real protocol instead of faking calls, which forced us to get the transport right.
  • Keep the LLM a tool-caller, not a calculator. Leaving meal planning, pantry diffs, and timetables deterministic means the answers are correct even offline and in CI; the model only decides which tool to call. This also gave us a clean degrade path when Bedrock isn't configured.
  • Voice UX is failure-path UX. A sentence can be a typo, emoji, whitespace, or off-topic, and the household may have no plan/routine/session yet. Every one of those paths had to end in a helpful sentence — we now guard them with a 34-case edge/intent battery.
  • Protocol churn is a maintenance cost. MCP shipped four spec versions in ~14 months; pinning the SDK and isolating it behind one adapter saved us.

What's next

TTS turn-taking for real Alexa devices, Google Calendar + Zigbee/Hue routine triggers through more MCP servers, and self-service household membership.

Built with

TypeScript · Node.js · Express · React · Vite · Model Context Protocol (MCP) · @modelcontextprotocol/sdk · Amazon Bedrock · Claude · AWS · Zod · Server-Sent Events

Share this project:

Updates

Submission history