Haven is an Alexa+ add-on built as a self-hosted MCP server (spec 2025-11-25, Streamable HTTP, 8 tools) on AWS Lambda. An older parent says "Alexa, talk to Arjun", and Alexa+ reaches Haven's MCP tools: a clearly labelled AI version of their child keeps them company, while the real family gets what to ask when they call. Our simulated Alexa+ client is a real MCP client: it sends initialize, tools/list and tools/call over Streamable HTTP, and you can watch every message live in the demo.
Inspiration
Our parents live in other cities. Days go by without a call, and when we do call, it's "Hi, how are you?" "Fine." Then the call ends, and neither side has really said anything.
That is a small sadness for us. For them it can be a health problem:
- Nearly 1 in 5 Indians over 45 report feeling lonely (Longitudinal Ageing Study in India, Wave 1).
- In the US, about 1 in 3 adults aged 50 to 80 feel lonely (University of Michigan National Poll on Healthy Aging, 2024).
- Loneliness is linked to a higher risk of dementia, heart disease, stroke and depression (US Surgeon General's advisory, 2023; WHO Commission on Social Connection, 2025).
- Many older people can't use smartphone apps. Voice works for them.
AI companions are the obvious answer, and a worrying one. A companion that is always available and always agreeable can quietly replace the people it should lead back to.
So we built the opposite: a companion whose job is to make itself less necessary. Haven's success metric isn't time spent talking to the AI. It is real calls per week from family.
What it does
A son or daughter sets Haven up for a parent. In our video that's Arjun in London, for his Ma in Kolkata. Ma talks to Digital Arjun: a clearly labelled AI version of her son, with his face and voice, made with his consent. It keeps her company, remembers what she shares and plays the messages the real Arjun leaves. It never pretends to be him.
- She just talks. "Alexa, talk to Arjun" opens Haven through Alexa+, a tablet or the TV. After that it is hands-free: it listens again after each reply and stops when she goes quiet. There's no app to learn and no buttons.
- Promises wait for the real person. "Will you come home for Diwali?" isn't for an AI to answer. Digital Arjun says so, and a deterministic detector files the question for the real Arjun.
- The family answers in their own voice. Arjun replies with a voice note from WhatsApp. On Ma's tablet the AI face steps aside, and she hears her real son.
- Nothing is sent without her yes. "Tell Arjun the jasmine is blooming" becomes "Shall I send this?", and nothing leaves until she agrees.
- Safety comes first, with no AI in the loop. "Help, I feel dizzy" trips fixed safety rules. Arjun gets an urgent Call now alert in about a second, and Ma's screen tells her to call 112 if she is in danger.
- The evening nudge. Every evening Arjun gets a short update on WhatsApp: how Ma's day went, the stories she told, and what to ask when you call. One tap on Call Ma, and the call is counted.
- The metric that matters. The family chat pins real calls this week against a goal, and how many Haven prompted.
- Honest by design.
- An always-on "Digital Arjun · AI" badge.
- "Are you real?" always gets a fixed answer, never a generated one.
- Setup records consent for the face, the voice and the daily summary.
- Voice ID enrolment. Setup collects a consented voice note of the person Haven is for. That prepares Haven to share personal things only with her (see What's next).
How we built it
- MCP at the core. Haven is a stateless Streamable HTTP MCP server: spec 2025-11-25,
@modelcontextprotocol/sdk1.32.1. It exposes 8 tools:recall_memory,remember,play_family_message,record_reply,create_deferral,log_wellbeing,get_remindersandstart_escalation. Three clients use the same server and the same consent checks:- the simulated Alexa+ client in the browser;
- our conversation engine, through an in-process MCP client;
- any external client, such as MCP Inspector (shown in the video against the live server).
- The model proposes; the server decides. Every turn runs in a fixed order:
- deterministic safety rules;
- a fixed honesty answer;
- a yes/no matcher for a pending send;
- the commitment detector;
- the LLM;
- a deterministic output guard;
- MCP tool calls;
- speech.
- AWS, all in ap-south-1 (Mumbai), all in CDK:
- Hosting: one Lambda (Node 22, arm64; Express on the Lambda Web Adapter) behind a Function URL. It serves the app, the API and
/mcpfrom one origin. - Amazon Bedrock (Converse API with tool use):
- The brain is
openai.gpt-oss-120b-1:0, thenapac.amazon.nova-lite-v1:0, then a rules-only fallback, so she always gets an answer. - Bedrock also writes the evening digest.
- We chose the models with a 15-case bake-off.
- Amazon Polly provides speech, lip-sync visemes for the illustrated avatar, and voice notes.
- DynamoDB holds state and S3 holds recordings.
- EventBridge Scheduler runs the 9 pm digest, warm-ups and the nightly demo reset.
- SSM holds secrets, and CloudWatch alarms and an AWS Budget watch it all.
- Hosting: one Lambda (Node 22, arm64; Express on the Lambda Web Adapter) behind a Function URL. It serves the app, the API and
- Face and voice.
- Anam renders the live photo-real face, and ElevenLabs provides the voice.
- Haven decides every word and streams its own audio into the avatar, so the safety pipeline is never bypassed.
- The face connects only around a reply, to save cost, and falls back to an illustrated avatar if anything fails.
- WhatsApp Cloud API carries the real alerts and digests. Its quick-reply buttons ("Calling now", "I will call tonight") come back through a webhook.
- Web app: React and Vite, designed with Google Stitch and built by hand, with Claude Code as our pair programmer.
- Tests: 761 automated tests, all passing.
Challenges we ran into
- No Alexa+ toolkit access for entrants. We built a real, spec-compliant MCP server plus a clearly labelled simulated Alexa+ client, so the integration is real end to end except the last hop.
- India-specific AWS limits.
- Claude on Bedrock goes through Marketplace, whose payment rules block many Indian accounts.
- Nova 2 Lite was only available through a Global profile.
- We designed around both with in-region gpt-oss-120b and Nova Lite.
- Models disagree on forced tool use. Some Bedrock models reject
toolChoiceand others ignore it. The brain detects which and adapts. - An affordable, reliable live face.
- Photo avatars take over 30 s to build.
- Video won't start in a hidden element.
- Sessions cost by the minute.
- Our fixes: longer timeouts, a transparent-but-rendered player, and connecting the face only while it speaks.
- Keeping an LLM honest. Early runs showed models offering to send messages unprompted, inventing facts about the son, and announcing sends before consent. We moved each of those decisions into deterministic code.
- Alexa+ can't tell add-ons who is speaking. Classic skills get a person ID; Alexa+ add-ons don't (friction log #17). So we built Voice ID enrolment now and designed the check for when that signal exists.
Every one of these is in our friction log with steps, expected versus actual, and a suggested fix.
Accomplishments that we're proud of
- A companion that measures success by real human contact, not by time on the app.
- A real MCP server that works with a simulated Alexa+ client, our own agent and MCP Inspector alike.
- Safety that doesn't depend on the model. Alerts, honesty answers and consent are deterministic. In testing, an urgent alert reached a real phone in 1.6 s.
- A judge-ready demo: one click, a private household per browser tab, no sign-up. You can also create your own family with your own face and voice, with consent.
What we learned
- The most important moments in an AI companion are the ones where the AI steps aside: making a promise, sending a message, raising an alarm.
- MCP is a clean seam for this: one set of tools and consent rules serves every client.
- Plan limits and regional availability shape the architecture as much as the code does.
What's next for Haven
- Ship the MCP server as a real Alexa+ add-on as soon as access opens.
- Voice ID: answer only the person it's for. Check each speaker against the enrolled voice note before sharing anything personal. Alexa's own speaker recognition comes first if Alexa+ passes it to add-ons; an on-device check is the fallback. Safety never depends on it: "help" from anyone still reaches the family.
- A consented pilot with real families, measuring the change in calls per week.
- More languages for the elder; Hindi and Indian English already work in "Create your own".
- Photo sharing from family into the conversation, and clinician-reviewed safety rules.
About the video
The family is fictional. Arjun's face is a generated photo, turned into a live avatar through the app's own consent flow. Every voice in the demo is synthetic (ElevenLabs), except the two of us in the closing pitch. The demo is a live recording of the hosted app, with one scripted input: Ma's speech-to-text was typed in rather than spoken, because the recording machine's speakers and microphone were the same headset. Everything after the transcript is the real app and the real server. The WhatsApp screens are the app's simulated family view; nothing is sent to a real phone in the demo.
Built With
- alexa-plus
- amazon-bedrock
- amazon-cloudwatch
- amazon-dynamodb
- amazon-eventbridge
- amazon-nova
- amazon-polly
- amazon-web-services
- anam
- aws-cdk
- aws-lambda
- aws-systems-manager
- elevenlabs
- express.js
- google-stitch
- gpt-oss
- model-context-protocol
- node.js
- react
- typescript
- vite
- whatsapp-cloud-api
- zod
Log in or sign up for Devpost to join the conversation.