Inspiration
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for Outing Copilot
Inspiration
Most weather questions to a voice assistant are really decisions: can I walk the dog before it rains? is the air OK for my kid today? which day this weekend works for a picnic? A forecast read-out leaves the user to do the maths. We wanted Alexa+ to just answer.
What it does
Outing Copilot is a self-hosted MCP server. Ask about an activity — walk, run, bike ride, picnic, playground trip or dog walk — for a place and a day, and it returns:
- the best daylight window (whole hours between sunrise and sunset, only future hours, 1–6 hours long),
- a verdict: go, maybe, or skip,
- the concerns behind it (rain chance, feels-like temperature, wind, UV, air quality),
- what to bring (rain jacket, warm layer, sunscreen, water, mask),
- any active US National Weather Service alert, and whether it's a public holiday.
Answers come as a one-sentence speech field for voice, a card for screen devices, and full
structured data. It also remembers things across sessions: nicknamed places ("home", "grandma")
and household preferences such as asthma (which switches to a stricter AQI limit).
It is careful about what it doesn't know. Air-quality forecasts only cover the first four to five days, so later days are marked unknown; in asthma mode those days are scored cautiously and the answer says so ("Heads up: air-quality data isn't available that far out for Monday and Tuesday, so I've docked those days."). Ambiguous places are named out loud ("I picked Portland, Oregon; say Portland, Maine if you meant that one"), and a nickname that is also a real city triggers a heads-up. Every error — a missing place, an out-of-range duration, an unknown activity, a service outage — comes back as one speakable sentence.
How we built it
- Official MCP Python SDK (
mcp2.3.0),MCPServer, served over Streamable HTTP at/mcp. Negotiates protocol 2025-11-25 with handshake-era clients (and 2026-07-28 with newer ones). - Five free, key-less public services per request: Open-Meteo Geocoding, Open-Meteo Forecast, Open-Meteo Air Quality, Nager.Date, and api.weather.gov. Forecast and air quality are fetched in parallel, then holidays and alerts.
- A pure-Python scoring engine gives every daylight hour a 0–100 score per activity (each activity has its own comfort range, wind limit and rain tolerance) and finds the best contiguous window.
- A small JSON store keeps places and preferences between sessions.
- 47 automated tests run fully offline against recorded API responses; a demo script plays a simulated Alexa+ conversation through a real MCP client.
Challenges we ran into
- Air-quality coverage is shorter than the weather forecast. We measured it (the API accepts up to 7 days but fills AQI for only about 4–5), then treated the gap as "unknown" instead of "clean air".
- Making answers short enough to speak but still explain why. We cap each spoken answer at the window, the top concerns, one tip, and an alert.
- Not suggesting a time that has already passed: the forecast is in the location's local time, so we filter with the location's UTC offset (and made the clock injectable for tests).
- Keeping tests deterministic while using live data: every upstream call goes through one HTTP client whose transport can be swapped for recorded fixtures.
Accomplishments we're proud of
- One question orchestrates five services and comes back as a single decision.
- Zero API keys: anyone can clone it and run it in two commands.
What we learned
MCP tool design for voice is different from tool design for chat: structured data for the model, plus a ready-to-speak sentence and a card, works better than raw numbers.
What's next
- Hosting it publicly so Alexa+ can reach it, with rate limiting and caching.
- Proactive nudges ("rain starts in 20 minutes — head home now").
- Rich visual cards / MCP Apps on Echo Show.
Built With
- httpx
- mcp
- nager-date
- national-weather-service-api
- open-meteo
- pytest
- python
- streamable-http