Inspiration

I built MemoValet to remember what happens in meetings: the decisions, the tasks, who owns each one and when it's due. That part works. What kept slipping was the step after. Nobody books the follow up meeting, people forget their due dates, and by the time someone checks in it's too late.

So for this hackathon I wanted an assistant that actually acts on that memory. You ask once, pick a time, and the follow up is booked.

What it does

Before, MemoValet kept the decisions and tasks and you arranged the follow up yourself. Now you ask the assistant, choose a time, and it books the follow up and drafts the reminders for you.

In the demo, Maya asks the simulated Alexa+ to set up a follow up for her team's launch planning meeting. The assistant reads the meeting through MemoValet's MCP server and sees which tasks are still open, who owns them and when they're due. Then it offers three 30 minute times after the last open task is due, so there's finished work to review. They appear as cards in Melbourne time. It doesn't check anyone's calendar yet.

Maya picks one by tapping it or saying it. The assistant books that time and only that time, then drafts a reminder for each task owner mentioning the new meeting. The drafts aren't sent.

The follow up then shows in MemoValet's calendar. In the sample workspace the booking is kept in the browser, so it's still there after a refresh. The same assistant can also answer questions about decisions and open tasks.

It's for any team that runs lots of meetings and keeps losing follow ups because nobody owns the next step.

How we built it

The MCP server uses the official MCP TypeScript SDK (version 1.32.1) inside a Next.js route. It follows the 25 November 2025 MCP specification over Streamable HTTP, stateless, with JSON responses. Every request has its Origin header checked so other websites can't call it from a browser. It runs on your own computer, and the README has the steps.

There are seven tools, each with an input schema and tool annotations: search_meeting_memory, list_open_action_items, get_decision_context, prepare_follow_through, find_follow_up_times, book_follow_up and draft_task_reminders. book_follow_up is the only one marked as changing anything, and it just returns the booking for the client to save, since the sample server keeps no state. draft_task_reminders only drafts. The tools return structured content, and the screen turns it into cards.

The simulated Alexa+ is a real MCP client built on the SDK's Streamable HTTP client. It connects to the server, lists the tools and hands them to Gemini 3.1 Flash Lite through function calling. The model chooses which tools to call and in what order, up to eight steps per request. I also connected Claude Code to the same server as an ordinary MCP client, to make sure it works outside my own app. It found all seven tools and used them to read the open tasks and the offered times.

I didn't want the model deciding by itself when to book, so that rule is in code. A booking only goes through for the one time the user chose from times shown in an earlier reply. A tap books exactly that time. A spoken or typed answer has to match exactly one offered time, like "Thursday at 10 am", "Friday" or "the second one". "No" or a plain "yes" books nothing, a conversation can't book twice, and the server only accepts a time it offered. Each rule has automated tests where the model tries to book on its own, and I made sure the tests fail when a rule is removed. Reminders stay as drafts and nothing is sent to anyone.

The screen looks like an Echo Show. You can talk through the microphone button (the browser's speech recognition, set to Australian English) or type. Replies are spoken in a natural voice from Gemini's speech model, with the browser's own voice as a backup. They're kept under 30 words, and the details go on cards: the follow up plan, the times to pick from, the booking and the reminder drafts.

The demo uses a made up workspace (Maya, Priya, Alex and the Acme launch) and never touches real customer data.

What is new during the hackathon

MemoValet existed before the hackathon. It already took meeting notes in 21 languages and kept summaries, decisions, tasks and a calendar for each team. Those older features aren't what I'm asking to be judged on. Everything below was built during the submission period:

  • The MCP server and its seven tools.
  • The simulated Alexa+ assistant, its MCP client and its natural voice.
  • The follow up flow: finding times, booking only a chosen time, and drafting reminders.
  • A follow through panel on each saved meeting, where the owner can check task owners and due dates and schedule the follow up (tested with sample data, not yet released to real accounts).
  • Booked follow ups in the Home screen's upcoming list.
  • A signed in MCP endpoint that prepares a follow up plan from your own saved meeting. Only the meeting's owner can use it, and it only reads.
  • Voice in the Home search bar: ask by speaking, and MemoValet reads a short answer aloud, with the full answer on screen. Try it in the sample workspace at http://localhost:3000/preview.

Challenges we ran into

The first problem was that I couldn't test on a real Alexa+. The developer tools are only open to select partners, as the hackathon FAQ confirms, so no entrant can connect their own MCP server to a real device. I built the simulation as a real MCP client instead, which is the path the FAQ describes.

My first replies were far too long to listen to, because they read out every task and every time. I moved the details onto cards and kept the spoken part short.

Bookings took the most work. Tool annotations only hint that a tool changes data, and my first check looked for words like "book", which wasn't good enough, since "no, don't book it" contains "book" too. Now every booking is tied to one specific offered time the user picked, and the tests use a model that tries to book early, book the wrong time and book twice.

Accomplishments that we're proud of

I'm most pleased that the MCP server isn't tied to my app. My own assistant and Claude Code both use it as an ordinary MCP client. Getting from a past meeting to a booked follow up takes two requests, and the user stays in control the whole time. I'm also proud of the tests, which show the assistant can't book without the user's choice even when the model tries.

What we learned

Spoken answers need a different shape from written ones. If it takes more than a sentence or two, it belongs on screen. I also learned not to rely on the prompt for anything that matters. The booking rules only became trustworthy once they were in code with tests behind them. And because everything sits behind MCP, connecting a second assistant took almost no extra work.

What's next for MemoValet

Next I want to connect the server to a real Alexa+ once testing access opens, and check people's calendars before offering times. I'd also like to use the signed in endpoint with real accounts, with account linking so Alexa+ knows whose meetings to read, and send the reminder drafts by email or Slack after the user approves each one.

Try it

The README has the setup: clone, npm ci, add a free Gemini API key, npm run dev, then open localhost:3000/preview/alexa. The MCP server itself needs no key, and the README shows how to point any MCP client at it.

Built With

Share this project:

Updates

Submission history