Inspiration

Planning a short trip means juggling a flight site, a hotel site and a calendar, and then doing the math yourself. A voice assistant should be able to take "a long weekend in Barcelona in November, we have $2,500" and simply come back with the best package.

What it does

Trip Scout is a self-hosted MCP server plus an Agent Skill that turns Alexa+ into a travel planner.

  • plan_trip compares round-trip fares for up to 14 departure dates in parallel, pulls well-rated hotels for the 3 cheapest dates and ranks complete flight + hotel packages against the budget.
  • find_cheapest_dates returns a price calendar and the day that saves the most.
  • search_flights / search_hotels return live Google Flights and Google Hotels results (prices, stops, CO2, ratings).
  • Traveler profile (home airport, party size, cabin, hotel standards) is stored per user, so it never has to be repeated.
  • Price watches keep first / current / best price and full history; "did any of my prices drop?" re-checks them all.
  • Every tool returns a short, voice-ready speech line and structuredContent rendered by an MCP Apps view — Echo Show-style cards with flights, stops, CO2 and hotel ratings.

How we built it

  • MCP server in Python on the official SDK, spec 2025-11-25 over Streamable HTTP (/mcp): 10 tools, progress notifications, one MCP Apps resource (ui://trip-scout/view.html, text/html;profile=mcp-app, linked through _meta.ui.resourceUri).
  • Agent Skill (skills/trip-scout/SKILL.md) teaches the model which tool to call and how to speak: one short sentence, details on screen, never read out flight numbers.
  • Own flight and hotel engines: Google Flights' tfs protobuf and Google Hotels' ts/qs search state are built by hand — no browser, no API key. A thread-pool planner fans out the searches; a 10-minute TTL cache makes follow-up questions instant.
  • Honest ranking: hotels use a Bayesian rating prior (a 5.0 with 12 reviews doesn't beat a 4.7 with 3,000), hostels/dorms and single rooms for groups are filtered out, packages are ranked by value against the budget.
  • Per-user state in SQLite keyed by x-user-id; Origin/Host validation (DNS-rebinding protection), localhost binding and optional bearer auth (TRIP_SCOUT_TOKEN).
  • Simulated Alexa+ host (allowed by the rules, source in web/): loads the Agent Skill, lets an LLM (any OpenAI-compatible endpoint, e.g. Amazon Bedrock) call the MCP tools, speaks the answer, and renders the MCP App like an Echo Show, with a live MCP activity log. A rule-based fallback router keeps it working when the LLM is unavailable.

Challenges we ran into

  • There is no way yet for outside developers to point a real Alexa+ at an MCP endpoint, so we built a faithful simulated host.
  • The latest MCP Python SDK (2.x) negotiates a newer protocol and renamed FastMCP; we pinned mcp<2 to speak exactly 2025-11-25.
  • Voice latency: a second LLM round trip after each tool call doubled response time, so tools now return a ready-to-speak speech field.

Accomplishments that we're proud of

  • A live end-to-end MCP smoke test (protocol negotiation, all 10 tools, the MCP Apps resource, live flights / dates / hotels / packages / watches) plus offline unit tests.
  • One sentence triggers ~17 live searches and still answers in a single spoken sentence.

What we learned

Voice needs a different output contract than chat: one short spoken sentence, everything else on the screen — Agent Skills + MCP Apps express exactly that.

What's next for Trip Scout

Connect to a real Alexa+ endpoint as soon as registration opens, and proactive price-drop announcements ("Your Barcelona fare dropped $80").

Built With

  • agent-skills
  • alexa
  • curl-cffi
  • mcp
  • mcp-apps
  • model-context-protocol
  • protobuf
  • python
  • sqlite
  • starlette
  • streamable-http
  • uvicorn
Share this project:

Updates

Submission history