Bigred97

au-weather-mcp

Community Bigred97
Updated

MCP server for Australian weather. 21 curated locations, current observations + 16-day forecasts + historical archive (1940+). Backed by Open-Meteo (CC BY 4.0, includes BOM data under licence).

au-weather-mcp

testsPyPIPythonLicense: MIT

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 from
  • attribution — CC-BY 4.0 notice for both Open-Meteo and BOM
  • retrieved_at — UTC timestamp when we fetched
  • server_version — which wheel served the call (debugging stale uvx caches)
  • stale — true if we're serving cached data because upstream failed; comes with stale_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.

MCP Server · Populars

MCP Server · New