Skip to main content
Glama

Kitchen Table

One Alexa+ helper for the whole household. It remembers what each person needs, across days and across people, follows up on its own, and confirms before acting.

Built for the Alexa+ track of the Amazon Developer Hackathon "Build, Ship, Shape". An MCP server on Cloudflare Workers with a Durable Object per household, plus an MCP Apps board card.

Watch (2 minutes): https://youtu.be/vGV_YJFv-p8 · Live board: https://kitchen-table-mcp.wolfejam2020.workers.dev/demo · Judges' testing steps: TESTING.md

Before

After Sam says yes

Before

After

The story it satisfies

  1. Thursday, Maya (10): "Tell Kitchen Table I need poster board for the science fair on Sunday."

  2. Friday evening, Sam: "Ask Kitchen Table if there's anything I should know." → "Soccer AM is at 9 AM tomorrow. One more thing: Maya needs poster board for Sunday's science fair. Want me to add it to the 11:30 errand run after soccer?"

  3. Sam: "Yes." Nothing is written until this confirmation, in its own turn.

  4. The card updates; the errand list shows poster board "from Maya".

  5. Priya gets a nudge: "Sam added poster board for Maya (Sunday's science fair) to Saturday's 11:30 errand run after soccer."

No purchases are made.

Deed of the week (the opposite of a timeout)

The board names the household member who did the most for someone else this week: "★ Deed of the week · Sam — got Maya's poster board on the run". It is awarded by the server, never claimed or voted on:

  • No tool gives or claims a deed (a test checks the tool list).

  • Only helping someone else's need counts, so scheduling your own earns nothing.

  • One credit per need, so the same need cannot be farmed, and a repeat confirm adds nothing.

  • The last 7 days count; most deeds wins; a tie goes to whoever reached the count first.

Limit: speaker is simulated in this build, so someone could pass another person's name. With real Alexa voice identification the same rules would hold per person.

Related MCP server: mcp-home

Architecture

Alexa+ (voice simulated in the demo) ─▶ an MCP client
                                          │ MCP Streamable HTTP  POST /mcp
                                          ▼
                       Cloudflare Worker  src/index.ts
                         ├─ MCP JSON-RPC (src/mcp.ts)
                         ├─ Durable Object "Household" (src/household.ts, SQLite-backed)
                         ├─ domain + six tools (src/domain.ts)
                         ├─ ui://kitchen-table/board card (src/card.ts)
                         └─ /demo, /demo/state, /demo/log, /admin/reset

No LLM calls inside tools. Every call logs duration_ms; tool-side latency is typically about 25 to 30 ms against the 500 ms Alexa+ limit; an occasional call takes a few hundred ms, and all stay under 500 ms. This build has not been run through a real Alexa+ account or device.

Tools

Tool

What it does

Writes?

add_need

Remember something a member needs, with an optional due date

yes (own list)

whats_new_for_me

Brief the speaker on others' open needs; offers one yes/no suggestion

marks items heard

list_errands

Upcoming errand runs and what's on each (max 5)

no

propose_add_to_errand

Preview adding a need to a run

no

confirm_proposal

Carry out a confirmed proposal and nudge the other parent

yes

mark_done

Mark a need handled

yes

Every result has structuredContent plus a speakable content[].text. Errors are isError: true with a short spoken message. Card tools also return _meta.ui.resourceUri = ui://kitchen-table/board.

confirm_proposal refuses to act within 1 s of the question it answers ("Let me check with you first."), so an agent can't ask and confirm in one turn. turn_gap_ms is logged.

For judges: see TESTING.md for a 1-minute, a 5-minute and a test-suite way to check it.

Run locally

npm install
cp .dev.vars.example .dev.vars     # set MCP_TOKEN and ADMIN_SECRET
npm run dev                         # http://127.0.0.1:8787
npm test                            # starts wrangler dev itself and calls the live /mcp
  • Board: http://127.0.0.1:8787/demo

  • Inspector: npx @modelcontextprotocol/inspector → Streamable HTTP → http://127.0.0.1:8787/mcp, header Authorization: Bearer <MCP_TOKEN>

  • Reset between takes: curl -X POST -H "x-admin-secret: $ADMIN_SECRET" localhost:8787/admin/reset (demo clock). Body {"now":null} uses the real clock; {"now":"<ISO>"} pins a time.

Demo clock

The seed is relative to a pinned clock, Fri 2026-10-23 6:30 PM ET, so "tomorrow" is Saturday whenever you record. Dates resolve in America/New_York.

Deploy

npx wrangler secret put MCP_TOKEN
npx wrangler secret put ADMIN_SECRET
npx wrangler deploy

Deployed at https://kitchen-table-mcp.wolfejam2020.workers.dev. addon.json points at it; only the icon and carousel image URLs are still placeholders (assets not made yet).

Connecting a client

Any MCP client that speaks Streamable HTTP can use https://<worker-host>/mcp with Authorization: Bearer <token>. The alexa-skill-mcp-bridge is a route to testing through Alexa; we did not run it for this entry (it needs an AWS account with Bedrock access, which was still being verified).

Auth

  • Simple mode (implemented): a static bearer token from a Worker secret. Demo only.

  • Unauthenticated /mcp returns HTTP 401 with no WWW-Authenticate header, as the Alexa+ quickstart requires. There is a test.

  • OAuth 2.1 + PKCE S256 (not implemented): the Alexa+ quickstart requires it for real account linking. The hackathon rules ask for a self-hosted MCP server on spec 2025-11-25 over Streamable HTTP, which this is, but this build cannot be linked to a real Alexa+ account. The Worker serves no OAuth endpoints.

  • Speaker identity is simulated. speaker is whatever the caller passes. Real Alexa+ voice ID is out of scope, and speaker is not an authentication boundary.

Limitations

  • One fictional household (hh_patel), seeded data, seeded calendar (not a live calendar).

  • No purchases, ever.

  • The MCP Apps card follows the MCP Apps convention (text/html;profile=mcp-app, postMessage tool-result) but the quickstart doesn't document the Alexa+ rendering contract. Unverified.

  • Email is not sent. Nudges go to Priya's inbox view on /demo, and to NOTIFY_WEBHOOK_URL if you set it.

What's new since Aug 31

The whole project.

AI tools used

  • Claude Code: wrote the server, tests, board card, docs, deploy scripts, the demo helper and the video tooling.

  • Grok Voice: the synthetic voices in the video: the narrator, Maya, Sam and Alexa. Labelled as simulated on screen.

  • Kiro CLI: a read-only review of the code and two regression tests it wrote (Accept negotiation, notification 202 with an empty body). Sign-in only worked late on the last night (see the friction log). Its review findings were checked and none was a defect.

  • Kiro Crew: installed and used for a stranger test of this repo (a fresh clone, then TESTING.md followed step by step: 26 of 26 tests passed) and for one suggested test, which we discarded as a duplicate of an existing test.

  • Not used: Amazon Bedrock, AgentCore, Strands and Nova. The server makes no model calls at runtime.

Live: https://kitchen-table-mcp.wolfejam2020.workers.dev/demo · Video: https://youtu.be/vGV_YJFv-p8 · Friction log

License

MIT

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables voice agents such as Alexa+ to keep a shared household list and reminders that record who added what and when, apply precise quantity changes instead of wiping lines, flag implausible misheard items for confirmation, keep one-shot reminders separate from open tasks, undo any change, and give each person a digest of what others modified since they last asked.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables Alexa+ and other MCP clients to manage a household's shared shopping list, bills, chores, and pantry expiry through natural-language voice interactions. It provides read-only briefings and confirmation-gated updates for recurring household logistics.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables a voice assistant to keep a shared, persistent memory of a household's kitchen, turning spoken remarks into pantry updates, scaled recipes, a cart, and confirmed grocery orders. Household members can ask what can be made and for how many, review what is low or out, and place or restock simulated orders only after explicit confirmation.
      32 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables an Alexa+-style assistant to run household routines with cross-session memory of members, allergies, budgets, curfews and past decisions, autonomously re-planning when new observations contradict the original plan. It also serves card and carousel UI resources for screen detail and gates any spending behind an explicit spoken confirmation.
      Apache 2.0