Skip to main content
Glama
SOTA9

Weather-mcp-server

by SOTA9
README.md
# Weather-Prediction MCP Server + Agent

Day 3 homework: a weather-forecast MCP server (pattern borrowed from
`databricks-lakebase-app-day-3`'s Alpaca paper-trading MCP server) wired to
a Databricks Agent Bricks agent.

## Architecture

Agent Bricks agent  --(MCP tool calls)-->  mcp_server/weather_mcp_server.py  --(REST)-->  Open-Meteo (+ NWS alerts, US only)

- `mcp_server/weather_mcp_server.py` - FastMCP server exposing 5 tools over
  streamable HTTP (the transport Databricks' MCP gateway expects).
- `mcp_server/weather_broker.py` - adapter module: all HTTP calls and
  response parsing for Open-Meteo (geocoding + forecast) and the NWS
  alerts API. No API key required for either.
- `mcp_server/app.yaml` / `mcp_server/requirements.txt` - Databricks App
  config.

## Weather API + auth

**Open-Meteo** (https://open-meteo.com/) - free, no signup, no API key,
~10,000 calls/day (non-commercial use). No Databricks secret needed.
NWS alerts (https://api.weather.gov/) - also free, no key, US-only.

## Tools

| Tool | Purpose |
|---|---|
| `get_current_weather(location)` | Current temperature, humidity, wind, conditions |
| `get_forecast(location, days)` | Multi-day forecast (temp high/low, precip %, conditions) |
| `predict_umbrella_needed(location, date)` | Judgment call: recommends an umbrella if precipitation probability > 40% (tunable via `UMBRELLA_THRESHOLD_PCT`) |
| `get_severe_weather_alerts(location)` *(stretch)* | Active NWS alerts, US only |
| `compare_weather(locations, date)` *(stretch)* | Side-by-side forecast comparison across cities |

## Setup steps

1. `cd mcp_server && pip install -r requirements.txt`
2. `python weather_mcp_server.py` - serves MCP on `:8000` locally.
3. Sanity-check with an MCP Inspector or `curl` before deploying.
4. Push this repo to your own Git remote.
5. In Databricks: create a Git folder pointing at this repo, then
   **Compute > Apps > Create app > Custom**, name it e.g.
   `weather-forecast-mcp`, source = the Git folder's `mcp_server/`
   subfolder. Deploy, copy the app URL.
6. **AI Gateway > MCPs > Add MCP** - register the app URL as an external
   MCP server (streamable HTTP).
7. **Agents > Agent Bricks > Create agent** - add the registered MCP
   server as a tool, paste in the system prompt below, deploy, and chat
   with it.

## Agent system prompt

You are a weather assistant. Always call a weather tool before answering
any question about current conditions or forecasts - never guess or make
up weather data. Use get_current_weather for "what's it like right now"
questions, get_forecast for future-looking questions, and
predict_umbrella_needed when the user asks whether they need an umbrella,
jacket, or similar. If a location can't be resolved or a tool returns an
error, tell the user plainly and ask them to clarify the location rather
than guessing. Only use get_severe_weather_alerts for US locations.

## Demo

1. "Will it rain in Chicago tomorrow?"
2. "Should I bring a jacket to Austin this weekend?"
3. "Compare the weather in Miami and Denver on 2026-08-15."
4. "What's the weather right now in Dakar?"

*(see attached transcripts/screenshots for full tool-call traces and
answers)*

## Test Transcripts

### 7. Severe-weather alerts: US vs non-US

**Test 7a: US City - Miami, Florida**

```python
>>> get_severe_weather_alerts('Miami')
```

Response:
```json
{
  "location": "Miami",
  "country": "United States",
  "alerts": [
    {
      "event": "Heat Advisory",
      "severity": "Moderate",
      "headline": "Heat Advisory issued August 9 at 1:15AM EDT until August 9 at 6:00PM EDT by NWS Miami FL",
      "effective": "2026-08-09T01:15:00-04:00",
      "expires": "2026-08-09T18:00:00-04:00"
    }
  ]
}
```

**Result:** ✓ Returns active alerts from NWS API (when alerts exist)

---

**Test 7b: Non-US City - Dakar, Senegal**

```python
>>> get_severe_weather_alerts('Dakar')
```

Response:
```json
{
  "location": "Dakar",
  "country": "Senegal",
  "alerts": [],
  "note": "NWS alerts only cover US locations; this location is outside the US."
}
```

**Result:** ✓ Returns empty alerts with explanatory note for non-US locations

---

**Test 7c: US City with no active alerts - Chicago, Illinois**

```python
>>> get_severe_weather_alerts('Chicago')
```

Response:
```json
{
  "location": "Chicago",
  "country": "United States",
  "alerts": []
}
```

**Result:** ✓ Returns empty list when no alerts are active (still queries NWS API)

---

**Run the tests yourself:**
```bash
python test_severe_weather_alerts.py
```

**For your agent playground, try asking:**
- "Are there any weather alerts in Miami?"
- "Check for severe weather in Dakar, Senegal"
- "What weather alerts are active in San Francisco?"

## Notes

- No secrets committed; Open-Meteo and NWS need no auth. If you swap in a
  key-requiring API (e.g. WeatherAPI.com), store the key as a Databricks
  secret following the `_secret()` / `WorkspaceClient().secrets.get_secret()`
  pattern from the Day 3 reference repo's `alpaca_broker.py` - never
  hardcode it.