π Try it live: https://d157gr6uv21vdd.cloudfront.net (the simulated Alexa+ host on AWS, talking to the HomeKeeper MCP server on Bedrock AgentCore Runtime. Type a question or press Talk for live voice. Everyone shares one demo household.)
π Code: https://github.com/ritwikareddykancharla/homekeeper-alexa (MIT)
π‘ Inspiration
Every household owns 20 to 40 appliances, each with a manual nobody keeps, a warranty nobody tracks, and a filter nobody remembers to replace. The information exists. It is just scattered across PDFs, receipts, and the back of a cabinet. A voice assistant that lives in the kitchen is the natural place for it, but only if it can actually remember across sessions and read the source material instead of guessing.
π£οΈ "Alexa, the dishwasher is showing E24." π "That's a drain error on your Bosch 300 Series. Check the drain hose for a kink and clean the filter under the lower rack. Want me to show you the steps?"
π― What it does
HomeKeeper is an Alexa+ add-on built as a self-hosted MCP server (spec 2025-11-25, Streamable HTTP). It gives Alexa+ four abilities it does not have today:
- π§ Remembers. Appliances, purchase dates, warranties, and maintenance history persist per household across every conversation.
- π Reads. Manuals are chunked, embedded with Amazon Bedrock, and retrieved per question, so troubleshooting answers are grounded in the actual document, with the source excerpt shown as a card.
- π Plans. When you register an appliance, HomeKeeper derives its maintenance schedule (filters, descaling, inspections) and surfaces what is due.
- π Acts. Consumables are linked to products, so "order the fridge filter" is one turn, confirmed through MCP elicitation.
π§° Tools exposed
| Tool | What it does |
|---|---|
register_appliance |
Add an appliance (brand, model, room, purchase date). Auto-derives its maintenance schedule. |
list_appliances |
Household inventory, rendered as a card. |
ingest_manual |
Attach a manual (URL or upload) and index it for retrieval. |
troubleshoot |
Grounded Q&A against the appliance's manual, with a source-excerpt card. |
maintenance_due |
What needs attention now and in the next 30 days. |
log_maintenance |
Record a completed task and reset its schedule. |
reorder_consumable |
Find and order the matching filter, part, or consumable. |
warranty_status |
Is it still covered, and what is needed to claim. |
maintenance_history |
What has been done, and when. |
remove_appliance |
Forget an appliance. |
Plus a weekly_checkup prompt and four ui://homekeeper/*.html MCP App resources.
ποΈ Architecture
System overview
βββββββββββββββββββββββββββββββββββββββββββββββββ
β π HOUSEHOLD β
β Echo / Alexa+ app Β· or the web simulator β
βββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β voice / text
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π£οΈ MCP HOST (Alexa+, or packages/simulator standing in for it) β
β β
β LLM reasoning βββΊ tool selection βββΊ MCP client βββΊ renders MCP App cards β
βββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ
β Streamable HTTP Β· JSON-RPC Β· session id
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βοΈ HOMEKEEPER MCP SERVER (packages/server, TypeScript, Node 22) β
β hosted on Amazon Bedrock AgentCore Runtime β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β
β β 10 tools β β 4 UI views β β 1 prompt β β elicitationβ β
β β (mcp.ts) β β ui://β¦html β β weekly_checkupβ β (orders) β β
β ββββββββ¬ββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β
β β β
β ββββββββΌββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β service.ts β β knowledge/ β β ai/bedrock.ts β β
β β schedules, orders, β β retrieval.ts β β Claude Sonnet 4.5 β β
β β warranty logic β β manuals, catalog β β Titan Embeddings V2 β β
β ββββββββ¬ββββββββββββββ ββββββββββββ¬βββββββββββ ββββββββββββ¬βββββββββββ β
ββββββββββββΌββββββββββββββββββββββββββββΌβββββββββββββββββββββββββΌβββββββββββββ
βΌ βΌ βΌ
ποΈ Amazon DynamoDB πͺ£ Amazon S3 π€ Amazon Bedrock
household state manual chunks + Converse API +
(single table) embeddings embeddings
π One turn, end to end: "the dishwasher is showing E24"
user ββ1βββΊ host LLM ββ2βββΊ troubleshoot(appliance="dishwasher", question="E24")
β
βΌ
ββββββββββββ HomeKeeper server ββββββββββββ
β 3 resolve appliance (DynamoDB) β
β 4 load manual chunks (S3) β
β 5 hybrid retrieval: β
β cosine(Titan embeddings) β
β + BM25 keywords β
β + exact error-code boost ("E24") β
β 6 Claude synthesises from chunks ONLY β
β 7 return text + _meta.ui.resourceUri β
βββββββββββββββββββ¬ββββββββββββββββββββββββ
β
βββ8ββ spoken answer β΄ troubleshoot card (manual excerpt, steps)
ποΈ Live voice path (simulator)
π€ mic βββ PCM ββββΊ Amazon Nova 2 Sonic (one bidirectional stream)
β
ββ speech recognition
ββ reasoning + tool selection
ββ toolUse βββΊ MCP client βββΊ HomeKeeper βββΊ result βββ
β β
ββββββββββββββββββββ toolResult βββββββββββββββββββββββ
β
ββ text out βββΊ Amazon Polly (Joanna, the classic Alexa voice) βββΊ π
ββ barge-in: user speaks, playback stops, stream continues
Typed turns take a parallel path through the Bedrock Converse tool loop and are spoken by the same Polly voice. If Bedrock is unreachable, a rule-based intent router keeps every tool and card working.
π Order confirmation: elicitation with a fallback
reorder_consumable(appliance, consumable)
β
ββ host supports elicitation? ββ yes βββΊ server.elicitInput(confirm?) βββΊ order placed
β
ββ no βββΊ return quote βββΊ host asks user βββΊ reorder_consumable(..., confirm=true)
Ambiguous references ("the fridge" when there are two) return candidates instead of guessing.
βοΈ Deployment (AWS CDK, infra/)
npm run deploy
β
ββββΊ HomeKeeperStack
β Bedrock AgentCore Runtime (MCP protocol mode, Node 22 direct-code zip, session affinity)
β DynamoDB table Β· S3 bucket Β· IAM role Β· Cognito user pool (optional, -c auth=jwt)
β β
β βΌ
β https://bedrock-agentcore.us-east-1.amazonaws.com/runtimes/<arn>/invocations
β ββ IAM (SigV4) ββ default
β ββ OAuth JWT ββ what Alexa+ account linking expects
β
ββββΊ HomeKeeperDemoStack (the public link above)
EC2 host runs the simulated Alexa+ host from the GitHub main branch
CloudFront in front for HTTPS (microphone) and the voice WebSocket
instance role: Bedrock, Polly, AgentCore invoke
π How we built it
- MCP server: TypeScript on
@modelcontextprotocol/sdk, MCP spec 2025-11-25, Streamable HTTP transport. Runs stateful (sessions, needed for elicitation) or stateless, and honours platform-injected session ids so it runs unchanged locally, under the MCP Inspector, and on AgentCore Runtime. - MCP Apps: tools declare
_meta.ui.resourceUriso Alexa+ (and any MCP Apps host) renders rich cards: appliance inventory, troubleshooting with the manual excerpt, maintenance timeline, order confirmation. Views are single-file HTML served asui://homekeeper/*.htmlresources. - Grounded troubleshooting: manuals are chunked by section and embedded with Titan Text Embeddings V2. Retrieval blends cosine similarity with BM25-style keyword scores and an exact error-code boost, so
E24always surfaces. Claude Sonnet 4.5 synthesises the answer from the retrieved chunks only. - Simulated Alexa+ host: designed as the screen of a kitchen display, with an ambient light field, frosted glass cards and Alexa's light bar reacting to her state. It speaks to the same server exactly as Alexa+ would and is hosted publicly at the link above. This is the demo surface while the Alexa+ MCP Toolkit is in Private Preview.
βοΈ AWS services used (AWS Builder mini challenge)
| Service | Role |
|---|---|
| π€ Amazon Bedrock (Claude Sonnet 4.5, Converse API) | Maintenance schedule refinement, grounded troubleshooting synthesis, host-side reasoning in the simulator |
| 𧬠Amazon Bedrock (Titan Text Embeddings V2) | Manual chunk embeddings for retrieval |
| π Amazon Bedrock AgentCore Runtime | Hosting the MCP server in MCP protocol mode with session affinity |
| ποΈ Amazon Bedrock (Nova 2 Sonic) | Live voice: speech recognition, reasoning, MCP tool calling and barge-in in one stream |
| π Amazon Polly (Joanna, the classic Alexa voice) | The voice the user hears, with SSML for rhythm and error codes; switchable live |
| ποΈ Amazon DynamoDB | Per-household appliances, schedules, history, orders (single-table) |
| πͺ£ Amazon S3 | Manual chunks with embeddings |
| π Amazon Cognito (optional) | JWT issuer for OAuth-protected inbound auth |
| π₯οΈ Amazon EC2 and CloudFront | The public demo host for the simulated Alexa+ experience |
| π§± AWS CDK | Infrastructure as code, both stacks |
π§ Challenges we ran into
- Making elicitation work across hosts that may or may not support it, without the LLM ever placing an order unconfirmed.
- Keeping retrieval honest: pure embedding search misses exact error codes, so retrieval had to become a hybrid.
- Running one server binary unchanged across local, Inspector, and AgentCore, where the platform injects its own session id.
- Nova 2 Sonic's built-in voices were the weak link, so the stream's audio is discarded and each sentence is re-spoken by Polly Joanna.
π Accomplishments that we're proud of
- β A complete end-to-end you can try: utterance to tool call to grounded answer to rendered card, including the elicitation round-trip, running on AWS.
- β Live voice with Nova 2 Sonic driving real MCP tools, with barge-in.
- β Graceful degradation: without Bedrock credentials every tool and card still works in rule-based mode.
π What we learned
MCP Apps plus elicitation is enough to build a genuinely multimodal assistant experience without any proprietary SDK. Grounding answers in retrieved manual text is what turns a chatbot into something you would trust with a dishwasher error code.
π What's next for HomeKeeper
- Register the hosted server with Alexa+ through the MCP Toolkit (
alexa-ai new mcp) once Private Preview access lands. - πΈ Photo-based appliance registration (snap the model plate).
- π΅ Shared households and caretaker access for ageing relatives.
π Open Source
MIT licensed. Source, setup, and deployment instructions: https://github.com/ritwikareddykancharla/homekeeper-alexa
Built With
- amazon-bedrock
- amazon-cloudfront
- amazon-cognito
- amazon-ec2
- amazon-nova
- amazon-polly
- amazon-web-services
- aws-agentcore
- aws-cdk
- claude
- dynamodb
- mcp
- node.js
- typescript
- vite
Log in or sign up for Devpost to join the conversation.