Inspiration

Every reminder tool tracks what you have not done yet. The expensive failures are somewhere else: the things you did, and then never handed over. In the archive this project came out of, ten finished submissions were ready to go and six of them died past their deadline — not for lack of work, but at a step that takes thirty seconds.

What it does

lastmile is a self-hosted MCP server an assistant like Alexa+ can call. It is built on three ideas:

  1. prepared is a state of its own. open → prepared → delivered. "Finished but not handed over" is what the server speaks up about; not-yet-started work does not bury it.
  2. Rank by the window, not the date. actionable_until is the last instant the remaining human step can still succeed, computed backwards from the deadline through the opening hours of the channel you have to use (notary, post office, courier, counter, phone, online). A lease affidavit due Sunday at midnight really closes Friday at 4 PM, because notaries do not work weekends: the calendar hides 56 hours.
  3. Delivered requires proof. commitment_advance refuses to reach delivered without a receipt number, confirmation id or URL, and refuses to skip prepared.

Every tool returns a speech field written to be read aloud (capped at 240 characters by rebuilding the sentence, never by truncating it) plus the structured data behind it.

Tools: at_risk, spoken_brief, window_for, commitment_add, commitment_advance, delivery_proof; resource lastmile://channels.

How we built it

  • Node 22+, @modelcontextprotocol/sdk 1.30.0, Streamable HTTP with per-session transports, storage in built-in node:sqlite (no native build).
  • Time zones from the runtime's IANA database via Intl, so daylight-saving transitions stay right without a data file.
  • 47 tests, including an end-to-end test that connects the official MCP client over Streamable HTTP, and a test that the demo shows its point on all seven weekdays.
  • No API keys, no accounts and no network calls, so judges can run it freely: npm install && npm test && npm run demo && npm start.
  • Built with the help of an AI coding assistant (Claude); the design decisions, tests and every number in this write-up were checked by running the code.

About the demo video

We did not have an Alexa+ device. Following the resources page ("You can simulate an Alexa+ experience … via a web app"), the video uses a web-app simulator included in the repository (npm run simulate). Utterances are typed and a keyword stub chooses which tool to call; on a real Alexa+ device the model makes that choice. Every MCP call and every answer shown is real, and each spoken answer in the video is the server's own speech text. Voices in the video are synthesised (ElevenLabs).

Challenges

Full friction log in FRICTION.md. The main ones:

  • A fresh transport per request passes a hand-written initialize and then fails on the client's next message with Server not initialized, while the server log looks healthy.
  • A time-window demo depends on the weekday it is run. Our first fix still broke on Saturdays; we found it while recording the video on a Saturday, and now test all seven days.
  • Hearing the answers spoken for the first time exposed a courier explanation that omitted the 24-hour transit time. The tests had not caught that.

What's next

  • Connect a real Alexa+ client in place of the keyword stub.
  • Proactive delivery: speak the spoken_brief sentence unprompted when a prepared item's window is about to close.
  • User-defined channels with their own opening hours and holidays.

Links

Built With

Share this project:

Updates

Submission history