Inspiration

Voice assistants are starting to do things for us: place orders, change the thermostat, book events. That's convenient until something happens on a shared account and someone asks, "Who approved this? Why did it do that? Can we undo it?" I couldn't find a good answer to those three questions for agentic assistants, so I built one.

What it does

Black Box for Alexa+ is an audit and undo layer for an assistant's actions. It's a real MCP server with a simulated Alexa+ experience on top of it.

  • A tamper-evident ledger. Every action is recorded, including the ones that were held or blocked. Each entry is hashed together with the entry before it, so editing an old record breaks the chain at exactly that entry.
  • "Why did you do that?" You can ask about any action, and it replays what you said and the reason the assistant acted.
  • Undo. Recent actions can be reversed, and the reversal is logged too, so history is never rewritten.
  • Guardrails. A spending limit holds large orders until you confirm them, and quiet hours block thermostat changes at night. Each outcome is logged with its reason.

The Ledger tab also shows a live "MCP traffic" card listing every call the app makes to the server.

How we built it

The server is Node with Express, the official MCP SDK (1.29.0) and zod. It's stateless Streamable HTTP and exposes nine tools: check_action, record_action, explain_action, undo_action, set_guardrail, verify_chain, list_ledger, plus two demo-only helpers. It runs on Render's free tier. The front end is plain JavaScript, HTML and CSS on GitHub Pages, with no framework. The simulated Alexa+ app mirrors every action to the server, and a smoke-test page checks the live server end to end. Everything was written and deployed from an iPad.

Challenges we ran into

Building on a tablet made everything harder in small ways. Pasting a large file into GitHub's editor got cut off, so I split the app into smaller files. My first Render deploy failed because package.json hadn't been saved. Voice input was the biggest problem: speech recognition aborted on iPadOS in both Safari and Chrome with an Apple speech-service error, even on a bare test page, so I dropped voice input and kept typed requests with spoken replies. Spoken replies also went silent at first, because iOS blocks speech that isn't tied to a recent tap. Replacing an async hash with a synchronous one fixed it.

Accomplishments that we're proud of

I didn't have much in the way of resources, just an iPad and free tools, and I'm proud that I still built a working MCP server, deployed it, and tested it live. I built it to help people who share an assistant trust what it does for them. Watching the chain break at the exact edited entry, then having the server confirm it, is the moment I'm proudest of. I'm also glad I was able to describe honestly what's real and what's simulated.

What we learned

I learned how MCP works end to end: building a stateless server with typed tools, calling it from a browser, and testing it against a live deployment. I also learned how hash chains make tampering visible, and how much iPadOS limits what a web page can do with speech.

What's next for Black Box for Alexa+

Right now the app decides holds and blocks itself, and the server returns the same verdict alongside it. The next step is making the server the single decision-maker. The server's ledger is held in memory and resets on restart, so it needs real storage, and the chain should be anchored somewhere outside the server so even someone with server access can't quietly rewrite it. I'd also like to try the real Alexa+ add-on registration, which I didn't attempt here.

Built With

Share this project:

Updates

Submission history