au-weather-mcp
Ask Claude about Australian weather and get real, current numbers — not "I don't have access to that data." This MCP server gives Claude (and other MCP clients like Cursor) live access to Australian weather data via Open-Meteo, which aggregates Bureau of Meteorology observations under licence. Plain-English location keys (sydney, cairns, alice_springs), 80+ years of historical data, 16-day forecasts.
Companion to abs-mcp (ABS macro stats), rba-mcp (Reserve Bank), and ato-mcp (tax + charity register) — together the four cover Australia's most-asked public data.
What you can ask
Once installed, your LLM can answer questions like:
| Question | Real response |
|---|---|
| What's the weather in Sydney right now? | Current temperature, humidity, wind, rain, pressure with the time stamped |
| Forecast for Melbourne next week? | 7-day daily forecast with max/min temps and rain |
| How was Sydney summer in January 2020? | Historical daily data from Open-Meteo's archive (1940+) |
| Compare rainfall in Cairns vs Brisbane this year | Multi-location queries with provenance per row |
| Tropical Queensland weather today | Search fuzzy by region/state/description |
Every response carries a CC-BY 4.0 attribution string and a direct Open-Meteo URL the agent can cite back to the user.
Why Open-Meteo (not BOM directly)
BOM publishes their own JSON/XML endpoints, but they actively 403 non-browser User-Agents and have no documented commercial-use path below their ~$5k/yr Registered User Service. Open-Meteo:
- Aggregates BOM data under their existing licensing arrangements with national meteorological services
- Free tier is explicit and generous; commercial use is $30/mo with public terms
- Returns clean, versioned, schema-stable JSON with units alongside every value
- Covers historical data back to 1940 via their archive endpoint
- No API key, no User-Agent gymnastics
We attribute both Open-Meteo and BOM in every response.
Install
# After publish:
uvx au-weather-mcp
# Local dev:
uv pip install -e .
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"weather": {
"command": "uvx",
"args": ["--upgrade", "au-weather-mcp"]
}
}
}
The --upgrade flag makes uvx re-check PyPI on each Claude Desktop launch, so bug fixes propagate without manual cache refresh. Costs ~100ms at startup.
For a local checkout (before PyPI publish):
{
"mcpServers": {
"weather": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/au-weather-mcp", "au-weather-mcp"]
}
}
}
Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"weather": {
"command": "uvx",
"args": ["--upgrade", "au-weather-mcp"]
}
}
}
Tools
| Tool | What it does |
|---|---|
search_locations(query, limit=10) |
Fuzzy-search the 21 curated AU locations by name, state, or description. |
describe_location(location) |
Lat/lng, timezone, elevation, nearest BOM station, and the canonical Open-Meteo URL. |
latest(location) |
Current weather observation — temp, humidity, wind, rain, pressure. 15-min cache. |
get_weather(location, start_date, end_date, granularity) |
Time-series query. Auto-routes to historical archive (1940+) or forecast (today + 16 days). Daily or hourly granularity. |
list_curated() |
All 21 supported location IDs. |
Accepts almost any input shape
The location parameter on every tool resolves six different input shapes — agents and users don't need to know the curated key format:
| Input shape | Example | Resolves via |
|---|---|---|
| Curated ID | "sydney", "gold_coast" |
Direct curated lookup (fast) |
| Place name, any case | "Sydney", "Gold Coast", "GOLD COAST" |
Normalised curated lookup |
| State code or full name | "NSW", "Queensland", "Western Australia" |
State → capital alias |
| Raw coordinates | "-33.87,151.21" |
Direct lat/lng (AU bbox enforced) |
| Any AU place name | "Byron Bay", "Margaret River", "Toowoomba" |
Open-Meteo geocoding (AU-filtered, population-sorted) |
| Typo of a curated name | "Sydny", "Melbourn" |
High-confidence fuzzy match |
Every response includes a location_resolution field with one of curated, state_alias, raw_coordinates, geocoded, or fuzzy_curated — so the agent (and the user) can see HOW the input was interpreted.
Curated locations
21 locations covering all 8 state/territory capitals plus 13 major regional centres:
| Region | Locations |
|---|---|
| Capitals (8) | sydney · melbourne · brisbane · perth · adelaide · hobart · darwin · canberra |
| NSW regional | newcastle · wollongong |
| QLD regional | gold_coast · sunshine_coast · cairns · townsville · mackay |
| VIC regional | geelong · ballarat · bendigo |
| TAS regional | launceston |
| Remote | alice_springs (NT) · broome (WA) |
Coordinates are anchored to the canonical BOM observation point for each city (e.g. Sydney = Observatory Hill, Melbourne = Olympic Park) so cross-checking against BOM's official observations is straightforward. See src/au_weather_mcp/data/curated/locations.yaml for the full registry.
Worked examples
"What's the weather in Sydney right now?"
latest(location="sydney")
Returns:
{
"location_id": "sydney",
"location_name": "Sydney",
"state": "NSW",
"latitude": -33.8607,
"longitude": 151.205,
"timezone": "Australia/Sydney",
"period": {"start": "2026-05-12T11:30", "end": "2026-05-12T11:30"},
"current": {
"time": "2026-05-12T11:30",
"temperature_c": 19.7,
"apparent_temperature_c": 18.1,
"relative_humidity_pct": 67,
"precipitation_mm": 0.0,
"cloud_cover_pct": 43,
"pressure_msl_hpa": 1034.5,
"wind_speed_kmh": 18.4,
"wind_direction_deg": 149,
"wind_gusts_kmh": 43.2,
"weather_code": 1,
"weather_description": "Mainly clear"
},
"source": "Open-Meteo (aggregates Bureau of Meteorology data under licence)",
"attribution": "Weather data by Open-Meteo.com (https://open-meteo.com), licensed under CC BY 4.0...",
"source_url": "https://api.open-meteo.com/v1/forecast?latitude=-33.8607&...",
"server_version": "0.1.0"
}
"How was Sydney in January 2020?"
get_weather(
location="sydney",
start_date="2020-01-01",
end_date="2020-01-31",
granularity="daily"
)
Returns 31 DailyAggregate rows with temperature_max_c, temperature_min_c, precipitation_sum_mm, and weather descriptions per day.
"7-day Melbourne forecast, hourly detail"
get_weather(
location="melbourne",
start_date="2026-05-12",
end_date="2026-05-19",
granularity="hourly"
)
Returns 168 hourly rows.
Date formats
start_date and end_date must be YYYY-MM-DD. The server validates both the regex and the semantic date — 2024-13-40 raises a clean ValueError rather than silently failing.
| Date range | Routes to | Coverage |
|---|---|---|
end_date >= today - 5 days |
Open-Meteo forecast endpoint | Today + 16 days |
end_date < today - 5 days |
Open-Meteo historical archive | 1940-01-01 onwards |
Trust contract
Every response carries:
source_url— the exact Open-Meteo URL the data came fromattribution— CC-BY 4.0 notice for both Open-Meteo and BOMretrieved_at— UTC timestamp when we fetchedserver_version— which wheel served the call (debugging staleuvxcaches)stale— true if we're serving cached data because upstream failed; comes withstale_reason
Sanity validators reject upstream values outside the plausible Australian range (temperature outside −30°C to +55°C, humidity outside 0-100%, pressure outside 850-1080 hPa). Rather than silently passing bad data to your agent, we raise an explicit validation error so the agent can degrade gracefully.
Development
git clone https://github.com/Bigred97/au-weather-mcp.git
cd au-weather-mcp
uv sync --extra dev
uv pip install -e .
# Unit tests (no network)
uv run pytest
# Live integration tests (hits Open-Meteo)
uv run pytest -m live
The SQLite cache lives at ~/.au-weather-mcp/cache.db. Current observations refresh every 15 minutes (matching Open-Meteo's update cadence), forecasts every 1 hour, historical never (a year-old day in the archive doesn't change). Delete the file to force a refresh.
Sister servers
The four packages run side-by-side in any MCP client; Claude disambiguates via the server prefix (weather:latest vs abs:latest vs rba:latest vs ato:get_data).
- abs-mcp — Australian Bureau of Statistics: labour force, CPI, GDP, wages, housing, population
- rba-mcp — Reserve Bank of Australia: cash rate, FX, lending rates
- ato-mcp — Australian Taxation Office + ACNC: personal tax by postcode, company tax, charity register
Data attribution
Weather data is provided by Open-Meteo, licensed under CC BY 4.0. The underlying observations include data from the Australian Bureau of Meteorology under Open-Meteo's licensing arrangement. Every WeatherResponse from this server includes the full attribution string. If you redistribute responses, credit both Open-Meteo and the BOM.
Changelog
See CHANGELOG.md for release history.
License
MIT — Harry Vass, 2026.