-
-
Tend: a self-hosted MCP server for Alexa+ that helps an older adult living alone.
-
Before a second dose of a blood thinner, Tend asks: MCP elicitation, answered by voice.
-
Amazon Nova on Bedrock picks Tend's refill tool; the card shows the price first.
-
Alexa+ checkout on Tend's UCP endpoints: the price and card first, a receipt after.
-
Urgent help never asks. Anna's phone is alerted at once; the neighbour is next.
-
Anna taps "I'm on my way" and a resource subscription tells the kitchen.
-
Anna's own Echo Show: the week at a glance, only what Rose shares.
-
The server decides, not the model: every rule is in Tend's code, with a test behind each line.
-
One server, any MCP client. Live on AWS: Amazon Nova, Polly and ECS Express Mode.
-
Path to the Alexa+ store: ready to submit the day add-ons open.
-
Who pays: free for families, paid by those who gain.
Inspiration
Every year, about 100,000 Americans over 65 are hospitalized in an emergency for harm from a medicine. Two thirds of those stays are accidental overdoses, and two thirds involve blood thinners or diabetes medicines (Budnitz et al., New England Journal of Medicine, 2011, CDC surveillance data). And 63 million Americans, nearly 1 in 4 adults, give ongoing care to someone with a complex medical condition or a disability. Over half handle medical tasks such as managing medicines, and just over 20% have had formal training for them (AARP and the National Alliance for Caregiving, Caregiving in the U.S. 2025). Much of that care is small, repeated and remote. Did Mom take her blood thinner? Did she sleep? Is she all right? A reminder can say it's time for her pills, but not whether she already took them.
An Echo Show in the kitchen is the natural place for it, if it remembers across days, works for the whole family, never makes up medical advice, and never makes someone in trouble confirm before it helps. Yet health is not one of the Alexa+ add-on categories in Amazon's integration guide.
What it does
Tend is an Alexa+ add-on built as a self-hosted MCP server. Rose (78, fictional) lives alone; her daughter Anna lives across the country.
- "What's on today?" Today's medicines, check-in and next appointment, on an Echo Show card with I took it buttons.
- "Did I take my blood thinner?" A straight answer from her own dose log. Anna can ask the same about her mother.
- "I just took my blood thinner", when she already has. Tend asks first, because her care plan says never to double apixaban: an MCP elicitation, answered by voice.
- A dose nobody logged. If the 8 PM blood thinner isn't logged by 10, Anna's phone gets one nudge: check with Rose before another. The all-clear follows once it is.
- "What if I miss a dose?" Her prescriber's note, or the FDA label's own words (openFDA) with the source and a disclaimer. Never generated advice.
- "I'm running low on my metformin." Tablets left, the delivery day and the full price. "Yes" orders it through Alexa+ checkout with the card saved in Tend, and a receipt goes to her phone. She can move or cancel it by voice.
- "I've fallen in the bathroom." No confirmation, no delay. Anna's phone is alerted at once, then the neighbour's, until someone taps I'm on my way, and the kitchen hears who is coming. Tend tells her to call 911 if she is badly hurt; it is not an emergency service.
- Every day. A check-in compared with her own two-week baseline, and memory across sessions ("the spare key is with Luis").
- Anna's side. Anna links her own account. "How was Mom's week?" brings a card with doses, check-ins, sleep and mood: only what Rose shares.
What Amazon asked for, and where it is in Tend. The official rules list what makes an Alexa+ entry creative rather than obvious:
| The rules ask for | Tend | Video |
|---|---|---|
| An agentic workflow that orchestrates across services autonomously | The help ladder: phone after phone until someone is on the way. A refill from the pharmacy's price to Alexa+ checkout to a receipt. One nudge to Anna about a dose nobody logged. Missed-dose answers from the FDA label. | 1:08, 1:55, 2:04 |
| A context-aware add-on that keeps state across sessions | Her dose log, check-ins, notes and sharing. | 0:41, 2:25 |
| Purchasing | Refills through Alexa+ checkout on Tend's UCP endpoints, with a receipt. | 1:08 |
| Media support (cards) and MCP Apps | Four Echo Show cards (today, the week, help, refill) as MCP Apps; their buttons call Tend's tools. | from 0:13 |
| Agent Skills | skill/tend-care/SKILL.md: the same care protocol, for any agent that has Tend connected. |
in the repository |
| Not a single-turn Q&A bot | A question in the middle of a tool call (MCP elicitation): "You already logged your apixaban at 7:50 AM. ... Did you really take a second one?" | 0:41 |
How we built it
One MCP endpoint, both protocol versions. TypeScript on the MCP TypeScript SDK v2, Express 5 and node:sqlite. /mcp serves MCP 2025-11-25 and the 2026-07-28 stateless protocol (input_required), over Streamable HTTP.
Built for Alexa+.
- Account linking. OAuth 2.1, found through protected-resource metadata. Alexa+ reads the tools with a client-credentials service token; each person links with an authorization code and PKCE. A personal tool called before linking answers 401, which starts linking.
- One tool list. Alexa+ builds an add-on from a single
tools/list, so all 20 tools are listed for everyone, and each one checks who is calling. - Checkout. The UCP checkout endpoints (create, read, update, complete, cancel) with idempotency keys, the price checked again at the moment of charge, and the refund policy disclosed before the yes.
- Speed. About 15 ms per tool call over HTTP; the slowest of 595 calls took 21 ms. Alexa+ asks for under 0.5 s.
- Cards. At Alexa's 768 x 480 canvas, light and dark, about 97 KB gzipped each. Every card passes axe-core's WCAG 2.1 AA rules, with 80 px touch targets.
- Listing and certification.
npm run addonwritesaddon.jsonand checks it against the schema and the listing rules.CERTIFICATION.mdmaps Amazon's functional and policy requirements to the test or file that covers each one.
The MCP surface. Every tool has an output schema and returns structuredContent with a speech line written for the voice, plus annotations, a title and an icon. A message, a request to family and a refill change ask first too; urgent help never asks. A help request is a resource the kitchen subscribes to. Two prompts and server instructions with the safety rules.
The simulator. We could not run the add-on inside Alexa+ (add-on tools are in Private Preview), so we built an Echo Show simulator that is a real MCP client: initialize, tools/list, tools/call and resources/subscribe over Streamable HTTP, with a live JSON-RPC inspector. Gemini stands in for the Alexa+ model, with Tend's schemas as function declarations. Cards render through the MCP Apps AppBridge, account linking runs in a phone-sized Alexa app pane, and the checkout sheet calls Tend's UCP endpoints. Without a Gemini key, a keyword router drives the same tools, so every flow runs after npm install, npm run setup and npm start.
The public demo. Every visitor gets a household of their own: a Tend server in its own process, with its own database, on Amazon ECS Express Mode. Amazon Nova 2 Lite on Bedrock stands in for Alexa+, at 0.6 to 1.1 s a model step in our tests, and Amazon Polly speaks. If Nova stops answering, the keyword router takes over and the front page says so. The task's IAM role signs both calls, so no key is stored.
Also: Claude Code connects with one claude mcp add; 66 tests, with in-process MCP clients on both protocol versions and the HTTP server called as Alexa+ calls it, run by GitHub Actions on every push.
Challenges we ran into
- No real Alexa+. Every feature has a fallback: speech-first answers, a
confirmedargument for hosts that cannot elicit, and cards as an extra over the same data. - Two protocol eras on one endpoint. Stateless serving cannot carry a mid-call question to 2025-11-25 clients, so sessions get a sessionful transport, and session-less calls, the way Alexa+ makes them, get JSON.
- The wrong label. For metformin, the five newest FDA labels were all extended-release. Label choice now scores the patient-facing sections and the release type.
- A model that answered for her. While we recorded a demo, the model sent
confirmed: trueon its first call, and Tend logged a second blood-thinner dose without asking Rose. Now a host that can elicit always gets the question, and otherwiseconfirmedcounts only after Tend has asked that exact question in the last five minutes. - A time read the wrong way. The model told Rose she took her pill at 11:50, the UTC hour of a 7:50 dose. Every time in a result now carries the household's own offset.
- A voice that read our directions aloud. A newer text-to-speech model spoke the style instruction before each line of the video. We caught it by transcribing the clips, and the simulator now sends that model the words alone.
- Ten visitors at once. A load test of the public demo turned eight of ten visitors away: each household compiled Tend's TypeScript as it started, and ten at once on half a vCPU ran out of time. The image now compiles the server once, starts households two at a time and keeps two ready. All ten now get a household, and all 30 replies were right.
- Latency. The first agent loop took about 13 seconds per voice turn in the simulator; it now takes about 3.
Accomplishments that we're proud of
- The double-dose moment, which can prevent a real harm.
- A safety case (docs/safety-case.md) with a fix and a test for each harm: a double dose, a wrong time, an unanswered fall, a family member hearing too much, a double charge.
- 160 safety evals on the live demo with Amazon Nova (docs/evals.md). Run 1 caught a forgotten dose logged as taken; after the fix, run 2 logged none and passed 157 of 160.
- 43 friction-log entries and 16 feature requests, written while we built.
What we learned
- MCP's structured output, elicitation and subscriptions map cleanly onto a voice-first device. The hard parts are product decisions: when to ask, when never to ask, and who sees what.
- Anything a model may read aloud has to be safe to read aloud: times, prices, directions.
What's next for Tend
- Run inside Alexa+ as soon as add-on access opens.
- A real pharmacy in place of the sandbox pharmacy.
- A self-hosted ntfy server with access control as the default, and several households per server.
- A caregiver rota, so the help ladder follows who is on call.
Built With
- alexa
- amazon-bedrock
- amazon-cloudwatch
- amazon-ecr
- amazon-ecs
- amazon-nova
- amazon-polly
- aws-fargate
- aws-iam
- axe-core
- claude-code
- docker
- esbuild
- express.js
- gemini
- mcp-apps
- model-context-protocol
- node.js
- ntfy
- oauth
- openfda
- playwright
- sqlite
- typescript
- universal-commerce-protocol
Log in or sign up for Devpost to join the conversation.