Rose, 84, in her kitchen: Alexa, I'm just going to take my blood thinner.
Alexa: Hold on, Rose. Grace gave you today's warfarin at 9:10 this morning. Your warfarin is once a day, so not another until tomorrow.
Nobody told Alexa that in the moment. Grace, the home aide, logged the morning dose four hours earlier. Ada, Rose's daughter, set the rule twelve days ago from the cardiologist's letter. Hearth held both, and it was Hearth's server, not the language model, that refused the dose and wrote the refusal down.
The problem
63 million Americans are family caregivers (AARP and the National Alliance for Caregiving, 2025). Care for one parent gets split between a daughter with the doctor's letters, a son two states away, a paid aide on weekday mornings, and the parent herself, who forgets. Nobody holds the whole picture, and the gaps are where people get hurt: older Americans have about 100,000 emergency hospitalisations a year for adverse drug events, two thirds of them unintentional overdoses, and warfarin is involved in a third (Budnitz et al., NEJM 2011).
The one device in that house that hears everybody is the speaker in the kitchen. Alexa+ can take actions now, which makes it useful there and also dangerous there. An assistant acting for a family has to know who said what, whose word counts, what has already been done today, and it has to be able to say why.
What Hearth does
Hearth is an Alexa+ add-on, built as a self-hosted MCP server. It is the family's shared memory and its conscience.
- It stops the second dose.
give_dosechecks the family's rule against today's record and refuses. The check runs in server code, so once the assistant reports the dose, nothing the model says can turn the refusal into a yes. The name on the bottle ("warfarin sodium", "Jantoven 5 mg") reaches the same rule, and a medicine with no rule gets "check with Ada first", not "logged". - It carries the carer's handover. At the end of her shift Grace says "I'm off. Mom ate half her lunch, she was a bit dizzy after her walk, and we're nearly out of Ensure." One tool call: the handover goes on the family board and to the family's phones, Ensure goes on the shared shopping list, and the dizziness is flagged to Ada, who has the say over Mom's health, and pinned in front of her for two days. Hearth does not judge whether it matters; it makes sure the person who decides hears it today. Tom's catch-up that evening includes the handover, and when Ada says "order what's on the list", it is the Ensure Grace reported that gets priced, and paying for it ticks it off the list.
- A medication rule changes only in the name of the person with the say. When Tom says "Mom's warfarin is twice a day", Hearth files it as a proposal and answers "Ada has the say over Mom's warfarin, so it stays once a day until Ada confirms." Ada settles it by saying the rule herself, and any change made in her name is pinned on her board, because Hearth cannot hear who is speaking.
- One request, five steps. "Mom's cardiology moved to Thursday at ten, sort it out." Hearth moves the calendar entry, assigns Tom because the family rota says he does Thursdays, cancels Tuesday's ride and books a new one for 9:15 (a sandbox ride provider), leaves a note for Tom and Grace on the family board and pushes it to Tom's phone (a real ntfy notification), and warns if a dose falls during the trip. That is one sentence and one tool call, and every step is on the record. The calendar, rota and board are Hearth's own books, not outside services.
- It remembers across sessions and devices. That evening, Tom asks his own (simulated) Echo Dot "What did I miss with Mom?" Hearth knows when he last talked to the house and tells him only what has changed since, including the dose it stopped.
- It settles disagreements, and says how. "Mom's coffee stops at three. Tom said six, but Ada has the say over what she eats and drinks."
- It lets situations end. "No wine while she's on the antibiotics" holds until "Mom finished the antibiotics", then stops applying by itself.
- It buys the Alexa+ way. "Reorder her warfarin" prices the refill and checks it against Ada's $50 limit and last week's orders. The card shows those checks and a Pay button. Per the Alexa+ payments docs, Alexa+ then runs the checkout on Hearth's Universal Commerce Protocol endpoints (voice PIN, the card on the account, idempotent completion); in the demo the simulated client plays that part against a sandbox merchant. Hearth never charges anything itself.
- It keeps an honest record. The server writes down every tool call as it happens, with what it read and what it wrote, in a hash chain whose head it signs after every call into a witness file kept apart from the record. Truncating it, or editing, deleting or reordering an entry and recomputing the hashes, fails the check. Each result hands the client a receipt, and "show me the record" checks the receipt the device kept, which catches a rewrite even by someone holding the signing key, up to that receipt. If the assistant reports an action it never checked with Hearth first, "why did you do that?" says so.
- It draws on the screen and talks on a speaker. Results carry an MCP Apps card sized for the Echo Show, plus a complete spoken sentence for an Echo Dot with no screen.
How it is built
- MCP 2025-11-25 over Streamable HTTP, hand-rolled: 15 tools with annotations,
structuredContent, and an MCP Apps view (ui://hearth/card-<hash>.html,text/html;profile=mcp-app) named in_meta.ui.resourceUrion both the tool and the result. - OAuth 2.1 authorization code flow with PKCE (S256), both well-known documents, and the three places Alexa+ departs from stock MCP: a
401with noWWW-Authenticateheader, both metadata documents required, and bearer tokens in the query string refused. - UCP checkout (
/.well-known/ucp,/checkout-sessions,…/complete,…/cancel), withIdempotency-Keyreplay, business failures returned as 200 withmessages[], andCache-Control: no-store. - No model on the read path. Resolving what is true is a dictionary lookup (scope, then authority, then recency, with a reason), so the server's share of the 500 ms Alexa+ allows is tiny; the rest is network. The server's own time is stamped on every response in
Server-Timing: p50 about 0.1 ms forcheck_doseon our test box, flat from the first call to the 5,000th, because the record is appended, never rewritten. - An Agent Skill (
skills/hearth-care/SKILL.md, open Agent Skills format) that teaches any agent to use Hearth safely. The simulated client's model planner loads it, anddemo/assistant.pyruns Claude Code as a second MCP client with the same skill. - One household per account, isolated, persisted to disk.
- A classic Alexa skill that is an MCP client of Hearth (
skill/, ASK SDK for Python): Alexa's NLU picks the intent, the skill makes thetools/callover Streamable HTTP, says Hearth's text verbatim, and draws Hearth's card in APL on an Echo Show. Its MCP client is standard-library only, because Alexa-hosted skills run Python 3.8 and the official MCP SDK needs 3.10 (friction log entry 12). Its tests drive the real handler against a running Hearth, on Python 3.8 as well as 3.12;docs/ALEXA_TEST.mdhas the steps for the developer console's simulator. - Tests: Hearth's own suite (conformance tests written from the Alexa+ requirements as documented, the care household, the record, resolution, phrasing, extraction, the listing, the simulator), an interop test in which the official MCP Python SDK client talks to Hearth unmodified, and the official MCP conformance suite in CI. Parts of the suite came from hand mutation testing of
oauth.py,household.pyandapp.py.
Simulated, and why
Alexa+ add-on tooling (the MCP Toolkit, the CLI, the Web Simulator) is "available to select partners only", and hackathon entrants cannot get access. So the video shows a simulated Alexa+ client, labelled as such on every screen, at /alexa. It is a real MCP client: it authorises with PKCE, opens an MCP session per device (kitchen Echo Show, Tom's Echo Dot, Ada's Alexa app), lists tools, reads Hearth's MCP App and hosts it the way an Echo Show would, calls tools over Streamable HTTP, and plays the host's part in checkout. The MCP traffic can be shown live beside the conversation. A language model stands in for Alexa's: it is given Hearth's real tools/list and Hearth's Agent Skill, and chooses every tool call; the header names the model. In the video it is a small open model on the laptop (Qwen2.5 7B Instruct through Ollama), which planned every filmed line correctly in one to three seconds; Amazon Bedrock (Converse API) or any OpenAI-compatible endpoint is one setting away. A small model is enough because the safety is in the server. Three things never depend on the model's reading, and the header says when any steps in: a question never records a dose, a dose being taken always reaches give_dose, and an appointment stays on the weekday the person said. The public deployment has no model key, so there the offline rules plan, and the header says so. Every word Alexa says is the text Hearth returned, except the order confirmation after "yes", which is the host's own line built from the completed checkout session.
Also simulated: the ride service and the pharmacy are sandbox providers. Nothing books a car or charges a card. Hearth is not a medical device: it enforces the rules the family gives it and knows no pharmacology.
What's next
The day the Alexa+ toolkit opens: alexa-ai new mcp --mcp-server-url https://…/mcp. Then a per-voice speaker identifier from Alexa+ (friction log entry 8), so that who has the say over medication no longer depends on the model naming the speaker. After that, pharmacy and ride partners through the same UCP and tool surfaces, and the signed checkpoint pushed to each family member's phone every day, so that every entry before it is covered by a copy the operator does not hold.
Built With
- agent-skills
- alexa-plus
- alexa-skills-kit
- amazon-bedrock
- amazon-polly
- apl
- ask-sdk-core
- ed25519
- fastapi
- mcp
- mcp-apps
- modelcontextprotocol-conformance
- ntfy
- oauth2.1-pkce
- ollama
- piper-tts
- playwright
- python
- qwen2.5
- universal-commerce-protocol
- uvicorn
