Inspiration

Every household has a drawer (or a downloads folder) full of paperwork that matters only on the day you need it: when the insurance renews, whether the dishwasher is still under warranty, how much notice the lease needs. The answer is always in a document somewhere, and finding it takes longer than the question. A voice assistant is the most natural place to ask, but it has never known what my documents say.

What it does

HomeDocs is an MCP server that gives Alexa+ a memory for household paperwork.

  • Ask a question and get a one or two sentence answer that names the document it came from: "Your tenant insurance covers your bike up to $1,500 when it's locked."
  • Add a document by uploading a PDF or a phone photo. Bedrock reads it and pulls out the title, provider, key dates and a summary, and it is searchable immediately.
  • Say "remember that my car registration renews May 3rd" to save a note by voice, or "forget my old lease" to remove one.
  • When something is due in the next two weeks, the light ring glows yellow like an Echo notification. "What are my notifications?" reads them out.

Because I don't own an Echo, the demo runs on a web app that simulates an Alexa+ device: tap the ring, speak, and hear the reply as it is being written, sentence by sentence; tap again to interrupt. A side panel shows every MCP tool call live, so you can see exactly what the assistant looked up.

How I built it

  • MCP server in Python with the official MCP SDK (protocol 2025-11-25, stateless Streamable HTTP), hosted on Amazon Bedrock AgentCore Runtime with Cognito JWT auth. Six tools: search_documents, list_upcoming_dates, list_documents, get_document, save_document and delete_document, each with MCP tool annotations marking whether it only reads or changes data.
  • Search: documents are split into short overlapping passages, embedded with Titan Text Embeddings V2, and stored in Amazon S3 Vectors. Documents live in DynamoDB. Locally the same code runs on Qdrant and JSON files, chosen by a setting.
  • Agent: a FastAPI service on AWS Lambda (Lambda Web Adapter, response streaming). It opens an MCP session, gives the tools to Claude Haiku 4.5 on Bedrock through the ConverseStream API, runs the tool loop, and streams each step and each word of the answer to the browser, which sends every finished sentence to Amazon Polly while the next one is still being written. Uploads go through Converse with a forced tool call, so extraction always returns structured JSON.
  • Agent Skill: how to use the tools by voice lives in a SKILL.md in the open Agent Skills format. The MCP server serves it as a resource, and the agent loads it from there as its instructions, so Alexa+, my simulator and any other MCP client follow the same guide.
  • Web app: React and TypeScript, browser speech recognition for the mic, served from S3 through CloudFront, which also routes /api/* to Lambda.
  • Infrastructure: all Terraform, with least-privilege IAM roles, Secrets Manager for the Cognito secret, a demo passcode so the public site can't run up a bill, EventBridge schedules that keep it warm and reset the demo data nightly, and CloudWatch alarms plus a GitHub Actions pipeline for tests.

Challenges I ran into

  • Keeping latency low enough for voice. I use a fast model, keep answers to two sentences, stream the answer and speak it sentence by sentence, keep the Lambda and one AgentCore session warm, and skip the model entirely for the notification check.
  • Dates. The servers run on UTC, which is already tomorrow for North American users in the evening, so the browser sends its local date and the agent passes it to the MCP tools.
  • Getting CloudFront, a streaming Lambda function URL and POST uploads to work together. CloudFront origin access control needs a client-side body hash for POST, so I used a secret origin header that the app checks instead.
  • Bedrock capacity errors on a regional inference profile, fixed by moving to the global profile. The details are in the friction log.

Accomplishments that I'm proud of

  • The same MCP server works in MCP Inspector, in my simulator, and on AgentCore, with no code changes between local and cloud, only settings.
  • The server carries its own Agent Skill, so a new client learns how to use it from the server itself.
  • Uploading a store receipt and asking about its warranty a few seconds later.
  • The whole stack is serverless and costs a few dollars a month at demo traffic.

What I learned

How MCP's Streamable HTTP transport behaves behind a managed runtime, how to design tool descriptions so a model picks the right tool for spoken questions, and how far S3 Vectors goes for a small RAG workload without running a vector database.

What's next for HomeDocs

  • Connect it to a real Alexa+ device and Alexa's own reminders, so the yellow ring is a real notification.
  • Per-user sign-in, so a household shares one document set.
  • Email forwarding: send a bill to an address and it is filed automatically.

Built With

  • agent-skills
  • amazon-bedrock
  • amazon-cognito
  • amazon-polly
  • amazon-s3-vectors
  • aws-lambda
  • bedrock-agentcore
  • claude
  • cloudfront
  • dynamodb
  • eventbridge
  • fastapi
  • mcp
  • python
  • react
  • terraform
  • titan-embeddings
  • typescript
Share this project:

Updates

Submission history