Inspiration

Every visitor to Mauritius meets the same moment. You planned an evening out in Grand Baie, and the rain comes in. A generic assistant gives you a generic list. A local friend tells you where to go instead, five minutes away, in one breath. About 1.44 million visitors came to Mauritius in 2025. We wanted their assistant to be that friend.

Ambree is an AI travel concierge for the Indian Ocean, in private beta in four destinations. This Alexa+ build starts with Mauritius, where our founder lives.

What it does

Ambree for Alexa+ gives any voice assistant Ambree's hyper-local Mauritius knowledge, through a self-hosted MCP server (spec 2025-11-25, Streamable HTTP):

  • replan_day: the traveller says it's raining, or the live forecast says it will. Ambree swaps the outdoor plan for up to three covered places nearby, of different kinds, with approximate drive times. Wind keeps you off the water. An orange or red cyclone alert near the island means: stay put and follow the Mauritius Meteorological Services.
  • weather_now: the next hours from MET Norway, plus GDACS cyclone alerts.
  • find_places and place_details: 50 places in 13 areas, each with a cited source and a check date.

Every tool returns a speech field: at most two sentences, written for the ear.

Alexa+ developer tools are open only to select partners, so the voice front end is a simulated Alexa+ experience: a web page with speech in and spoken replies out. Its agent is a real MCP client of the server, and an "Under the hood" panel shows each MCP call as it happens.

How we built it

  • TypeScript on Node 22 with no framework: node:http, the official MCP TypeScript SDK (1.32.1) and zod. A stateless Streamable HTTP server answering in JSON.
  • The agent lists the tools from our own /mcp with the SDK client and lets Amazon Nova 2 Lite (through OpenRouter) choose them. With no key, a keyword router calls the same tools over MCP, so the repo runs end to end without any account.
  • Live data from MET Norway Locationforecast 2.0 (cached until Expires, revalidated with If-Modified-Since) and GDACS.
  • A dataset researched place by place, with a source for each. Places that are closed, like a museum shut for roof repairs, were left out.
  • Hardening for a public demo: Origin and Host checks, per-IP rate limits, a passcode gate with a signed cookie, a strict CSP, no third-party requests from the page, a daily AI budget cap, and logs that never hold what people say.
  • An Agent Skill (skills/ambree-mauritius/SKILL.md) tells any agent when to call each tool.
  • 177 unit and integration tests plus 8 Playwright browser tests, all offline, and two rounds of security review whose 26 findings are all fixed.

Challenges we ran into

  • The SDK returns an unknown tool as isError instead of a protocol error, drops tool icons from tools/list, and emits draft-07 schemas. Our friction log has each case, the time it cost, and a suggested fix.
  • Writing for the ear: one decision, two sentences, times said the way people say them ("until about three").
  • Keeping the data honest: checking what is actually open in 2026.

Accomplishments that we're proud of

  • A spec-precise MCP server that works the same in MCP Inspector, Claude and our simulated Alexa+.
  • A rain re-plan that answers in under a second with real places nearby.
  • Anyone can clone the repo and run the whole thing with npm ci && npm start, no key needed.

What we learned

Voice changes the product. On a screen, a list of ten options is fine. Out loud, the answer has to be one decision. MCP makes that knowledge portable: one server, any assistant.

What's next

Ambree's main app gets the same tools. Next come opening hours and live events, more Indian Ocean destinations, and real Alexa+ as soon as access opens.

Built With

  • amazon-nova
  • gdacs
  • mcp-typescript-sdk
  • met-norway
  • model-context-protocol
  • node.js
  • openrouter
  • playwright
  • typescript
  • vitest
  • web-speech-api
  • zod
Share this project:

Updates

Submission history