-
-
Priya's phone: Meera's message, her reply, and an urgent alert saying emergency services were already contacted.
-
At 2 pm Saathi raises the reminder, logs how Meera feels in her words, and takes a message for her daughter Priya.
-
Family page (a direct MCP client): how Meera has seemed in Claude's hedged words, today's update, and a note from Priya.
-
Emergency services first: Saathi contacts them (simulated, no real call), then alerts family with what was said and when.
-
Saathi reads the reminder time back before saving it, shows an MCP Apps card, and remembers new family news.
Inspiration
Millions of older people live alone while their children live in another city or another country. The family worries; the parent doesn't want to be a burden. A daily phone call tells you "I'm fine". It doesn't tell you that Mum has been quieter all week, or that Dad forgot his tablet again. Most "elder tech" is either a panic button or a surveillance camera. We wanted something warmer: a companion that talks with them every day, gets to know them, and quietly keeps the family close. Saathi means "companion" in Hindi.
What it does
Saathi is an ambient voice companion for Alexa+.
- Gets to know them. After every conversation, Claude reflects in the background. It decides what is worth remembering ("grandson Arjun has a cricket match on Saturday"), how the person came across ("seemed cheerful, especially about the cricket"), and what it's learning over days. The next morning it asks: "How did the match go?"
- Checks in and handles reminders. It runs scheduled check-ins and reads medicine times back before saving them. Reminder cards are rendered as MCP Apps.
- Carries messages both ways. "Tell Priya the roses are out" reaches her phone at once. Priya leaves a note on the family page, and Saathi reads it aloud at the next check-in and sends the reply straight back.
- Gives family an honest picture. Family see a "How Meera has seemed" view with hedged impressions labelled not a medical assessment. They get a text if something seems worrying, and an evening summary.
- Emergency services first. In a medical emergency Saathi contacts emergency services first, says help is on the way, and then sends the family an urgent text and email saying help has already been called.
How we built it
Browser (elder) ──WebSocket──► Simulated Alexa+ host ──MCP / Streamable HTTP──► Saathi MCP server
Web Speech, MCP Apps cards Strands agent + Claude 16 tools, SQLite
on Amazon Bedrock reminders, memory,
Browser (family) ──────────────── direct MCP client ───────────────────────────────► family loop, alerts
- A real MCP server (Python SDK, spec 2025-11-25, Streamable HTTP) with 16 tools: memory and
reflection, reminders, due events, family updates and digests, two-way notes, and emergency escalation.
It validates Origin headers and serves MCP Apps cards (
ui://saathi/...). - A simulated Alexa+ host. Self-hosted MCP servers can't be connected to real Alexa+ devices by participants, so we built the host ourselves: a Strands Agents agent running Claude Haiku 4.5 on Amazon Bedrock, connected to the server as a genuine MCP client. Its persona and guardrails ship as an Agent Skill. Before every turn its system prompt is rebuilt from Saathi's long-term memory.
- Two MCP clients, one server. The family page talks to the server directly from the browser, and the MCP inspector panel shows every JSON-RPC frame live.
- An engagement index, not a word count. "Quieter than usual" compares four signals (elaboration, initiative, disclosure, reciprocity) against the person's own 14-day median:
$$E = \frac{1}{|S|}\sum_{s \in S} \min\left(2,\ \frac{x_s}{\tilde{x}_s}\right)$$
Here \(x_s\) is today's value of signal \(s\) and \(\tilde{x}_s\) is the person's usual. Below 0.6 reads as quieter than usual; above 1.4, more talkative. Only counts are stored, never transcripts.
- Two-layer emergency detection.
- An instant phrase check runs before any model sees the words. It covers heart attack and stroke signs, falls, self-harm and a few Hindi phrases, and it works offline.
- A Claude Haiku check runs in parallel with the conversation on every message, with a 10-second limit. It catches indirect wording like "my words are coming out wrong and my arm feels heavy".
If the check is unsure or too slow, Saathi asks "Are you okay?" and escalates after 30 seconds without an answer. Dispatch is simulated behind a plug-in interface; software must never auto-dial real emergency lines.
- Delivery. Email goes through Amazon SES and texts through Amazon SNS, with a Gmail SMTP fallback. A phone-style page shows everything Priya receives.
- Open source: the browser kit (voice loop, MCP Apps host, Streamable HTTP client with frame recording, and inspector) became its own MIT project, mcp-voice-sim, so anyone can demo an Alexa+-style MCP server.
- Tested: 106 pytest tests (protocol, emergencies with a stubbed Haiku verdict, reflection, the full
storyline), Vitest tests for the kit, and a real-browser end-to-end run. Everything runs offline with one
command,
./demo.sh, using a deterministic router, so judges need no AWS credentials.
Challenges we ran into
- Empty replies from the live agent. Claude often speaks before a tool call ("That's wonderful! Let me
remember that.") and then ends on an empty message.
str(AgentResult)only returns the last message, so we collect the spoken text from the whole turn. - Speed vs. safety in emergencies. An LLM call can't be allowed to delay help. We run the Haiku check alongside the conversation, behind a hard timeout, with the phrase list as an instant first layer.
- Our AWS account was on the Free plan. An organization policy denied SES, and SMS wasn't available. Both integrations are implemented and covered by tests with stubbed AWS calls. For the demo we added an SMTP fallback and a phone page showing exactly what would be texted.
- Tone. Early on Claude answered a joke with "It's not funny at all". A short example in the Agent Skill fixed it, but when the example matched the conversation too closely, Claude copied it word for word. The example now uses a different topic.
- MCP SDK 2.x renames and a Strands version pin meant most online examples didn't work as written. Every issue is in our friction log.
Accomplishments that we're proud of
- A companion that gets more personal every day, without a fixed label dictionary: Claude decides what matters, inside guardrails that keep it kind, hedged and never clinical.
- An emergency path that puts emergency services before family, and never lets a slow model call stand between someone and help.
- Saathi never lies about what it shares. Asked "what do you tell Priya?", it answers truthfully.
- A reusable open-source kit that came out of the project.
What we learned
- MCP Apps plus Agent Skills make a voice add-on feel like a product, not a chatbot.
- Background reflection is where the "intelligence" lives. Keeping it off the conversation's critical path keeps Saathi responsive.
- With older users, how something is said matters as much as what: read times back, never announce bookkeeping, and meet their tone.
What's next for Saathi
- Connect to a real Alexa+ device when self-hosted MCP add-ons open up.
- Plug a professional monitored-response service in behind the dispatcher interface.
- Move to SES and SNS on a paid account, with proper SMS origination.
- Multiple languages, starting with Hindi conversations end to end.
- Let the family tune check-in times and reminders from the family page.
Built With
- agent-skills
- amazon-bedrock
- amazon-ses
- amazon-sns
- amazon-web-services
- boto3
- claude
- css3
- esbuild
- fastapi
- html5
- javascript
- mcp-apps
- model-context-protocol
- pytest
- python
- sqlite
- strands-agents
- uvicorn
- vitest
- web-speech-api
Log in or sign up for Devpost to join the conversation.