Inspiration

Three weeks ago I submitted DayZer0 to Shipaton. It's a health coach app I built after a year of figuring out my own health, and then finding out that what worked for me didn't survive contact with my family's week. Its coach is called Daizee. At the end of that write-up I listed what I wanted to do next, and the first thing on the list was "talking to Daizee instead of typing."

This is that. But once I started, I ran into a problem that's bigger than voice.

Voice assistants forget you the moment a conversation ends. Tell one on Monday that you're allergic to peanuts, and on Wednesday it has no idea. For a health coach that isn't a small bug. Remembering you is the whole job.

So I didn't want to build "Daizee, but on Alexa." I wanted Daizee's memory to live somewhere the assistant can't lose it.

What it does

daizee-mcp is a small server that a voice assistant calls whenever it needs to remember something about you, check something, or log something. I built it for Alexa+, but any assistant that speaks MCP can use it.

You talk the way you'd talk to a person. Say "I'm allergic to peanuts" once. Come back days later in a completely new conversation and say "log pad thai for dinner". The assistant doesn't know about the allergy anymore, but the server does. The meal gets logged, and Daizee tells you pad thai often contains peanuts.

Memories don't stay forever, either. I learned this the hard way building the app: a coach that remembers everything is worse than one that remembers nothing, because it keeps working around a sore knee you got over weeks ago. So every note has a lifespan. A two-week trip lasts two weeks, a sore knee five days, an allergy about a year. Before a note runs out, Daizee asks whether it's still true. And when you ask her to forget something, she always asks "are you sure?" first. The server enforces that step, not a prompt, because a misheard "yes" should never delete an allergy.

It also isn't a separate toy. Connected to DayZer0's real database, a meal I tell the assistant about shows up in the app on my phone a moment later, with the same meal card Daizee posts when you type.

There are seven tools: today's progress, today's plan, logging a meal, remembering something, recalling what she knows, forgetting (with the confirmation), and logging a weigh-in. Every reply is one short sentence written to be heard, not read, and your weight is never said out loud. It shows on screen instead.

How I built it

The server uses the official MCP TypeScript SDK over Streamable HTTP, on spec 2025-11-25. It's stateless, so it runs comfortably as a single Cloud Function.

I made one decision early that shaped everything else: there's no AI model inside the server. The assistant does the talking and understanding; the server only does memory, rules and logging. That keeps every call fast and predictable (a few milliseconds of server time). It also fits Amazon's guidance for Alexa+ add-ons, which says not to just relay the chat to another AI.

The memory rules are a TypeScript port of what DayZer0's backend already does: priorities, lifespans, duplicates, check-ins before something expires. Allergy checks happen in the server, on every meal, whatever the assistant decides to say.

For the real-app connection, the server writes meals and weigh-ins into the app's Firestore in exactly the shape the app writes them. The app's own backend reacts as if you'd typed. I didn't change a line of the app for this. Before pointing it at real data, I tested it in the Firebase emulator running the app's actual functions, and it can only touch accounts on an allowlist. Each user is identified by their own DayZer0 sign-in token, which is what Alexa+ account linking would send.

Since I don't have Alexa+ add-on access, I built a web page that plays the assistant's part. It's a real MCP client, using the same SDK. You can talk to it, and it answers in a natural voice. Gemini decides which tool to call, and Google's text-to-speech reads the reply. There's a "New conversation" button that wipes the assistant's memory, so you can see the server's survive. A "Behind the scenes" panel shows every MCP message with the server's own timing. It's hosted on Firebase with fictional data, so anyone can try it.

The honest part

The server, the tools, the memory and safety rules, and the connection to the real app are all real and tested. Alexa+ itself is simulated. Add-on tooling is limited to select partners right now, so nothing here has run on an actual Alexa device, and none of it is certified by Amazon.

In the video, Maya, Kim and Natasha are AI-generated, to show the kind of people I built this for. Every reply Daizee gives them is the product's real answer to that sentence, captured from the demo and played in its real voice.

Challenges I ran into

Voice turned out to be a safety problem, not just a convenience. When I sent Gemini a recording of pure silence, it transcribed it as "The quick brown fox jumps over the lazy dog." A compressed browser recording turned "pad thai" into "badhai". If you're checking allergies, a misheard dish isn't a typo; it's the wrong answer, and a made-up "yes" could confirm a forget. So silent audio never reaches the model, the transcription is told the words this service actually uses, and anything destructive needs a real, server-checked confirmation.

The other hard part was writing into a live app without being reckless. I built the allowlist, a separate switch you have to turn on deliberately for a real project, and emulator tests against the app's own functions before I let it near real data.

What I'm proud of

Most of all, that a fresh conversation really does lose nothing. Giving Daizee an actual memory was the part of the app I was proudest of, and now that memory follows you to any assistant.

Also: 331 automated tests pass on a fresh clone, including ones that drive the server with the real MCP client over HTTP, plus 4 more that run against the Firebase emulator. An evaluation of 17 spoken phrases, including a prompt-injection attempt, picks the right tool every time, at about 2.4 seconds per spoken turn. And along the way I found and fixed a bug in the MCP TypeScript SDK itself.

What I learned

Keep the assistant thin and put the memory and the rules in the service. Then it doesn't matter which assistant you talk to or how often the conversation resets: the safety net is still there.

Voice changes the design too. Every answer needs one sentence you can understand by ear, and some things, like your weight, belong on a screen and not in the room.

What's next

Running on Alexa+ itself as soon as add-on access opens. Building the sign-in step for full account linking (the server already checks the tokens). Then opening it to DayZer0's users, so the people I built the app for can just talk to Daizee.

What's new for this hackathon

DayZer0, the Android app, existed before this hackathon. I also entered it in Shipaton 2026 on September 30. This project is not the app. daizee-mcp is a separate, new open-source repository, started on October 14 for this hackathon.

Everything in it is new: the MCP server and its seven tools, the TypeScript port of the app's memory rules, the allergy and diet checks, the connection to the live app's data, per-user token sign-in, the web page that stands in for Alexa+, and the tests and recorded MCP trace.

Before: Daizee lived inside one Android app, and you had to type to her. Now her memory is a service any MCP assistant can call. It survives a fresh conversation, and what you say lands in the app. I didn't change the app's code for this.

The commit-by-commit account is in docs/SIGNIFICANT_UPDATE.md, and the video shows all of the new work running.

Built With

  • cloud-firestore
  • cloud-functions
  • firebase
  • firebase-authentication
  • firebase-hosting
  • gemini
  • google-cloud-text-to-speech
  • google-secret-manager
  • mcp-typescript-sdk
  • model-context-protocol
  • node.js
  • streamable-http
  • typescript
  • vite
  • vitest
  • zod
Share this project:

Updates

Submission history