Server data from the Official MCP Registry
Query the AEMO NEM in plain English — 5-min prices, demand, generation, rooftop PV.
Query the AEMO NEM in plain English — 5-min prices, demand, generation, rooftop PV.
This is a well-structured MCP server for Australian electricity market data with proper input validation, no security vulnerabilities, and appropriate permissions for its stated purpose. The codebase demonstrates solid security practices including validated inputs, no credential leakage, and proper async/cache handling. Minor code quality observations around broad exception handling do not materially impact security. Supply chain analysis found 5 known vulnerabilities in dependencies (1 critical, 3 high severity). Package verification found 1 issue.
4 files analyzed · 9 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Add this to your MCP configuration file:
{
"mcpServers": {
"io-ausdata-aemo-mcp": {
"args": [
"aemo-mcp"
],
"command": "uvx"
}
}
}From the project's GitHub README.
mcp-name: io.ausdata/aemo-mcp
Ask Claude about Australia's electricity market and get real, current numbers — 5-minute spot prices, regional demand, generation by fuel, interconnector flows, rooftop solar — not "I don't have access to that data." This MCP server gives Claude (and other MCP clients like Cursor) live access to the Australian Energy Market Operator (AEMO) NEMWEB feeds, with curated mappings for the most-asked indicators.
Hosted access? For cross-source queries, webhooks, an always-on REST API, and a uniform response envelope across all 9 sources, see ausdata.io — free tier available (500 calls/mo, no card).
Companion to abs-mcp (ABS macro stats), rba-mcp (RBA interest + FX rates), ato-mcp (ATO tax + ACNC charity), apra-mcp (banking + superannuation), aihw-mcp (health & welfare), asic-mcp (companies + financial advisers), and au-weather-mcp (Australian weather) — together they cover the most-asked Australian official data.
Once installed, your LLM can answer questions like:
| Question | What the tool does |
|---|---|
| What's the current NSW spot price? | latest("dispatch_price", filters={"region":"NSW1"}) |
| Did SA hit negative pricing in the last 24 hours? | get_data("dispatch_price", filters={"region":"SA1"}, start_period=…) and filter value < 0 |
| Generation by fuel type right now in QLD | latest("generation_scada", filters={"region":"QLD1"}), aggregated by fuel |
| Weekly average dispatch price for VIC, last 4 weeks | get_data("dispatch_price", filters={"region":"VIC1"}, start_period=…) |
| Rooftop PV forecast for tomorrow | get_data("rooftop_pv", filters={"section":"forecast"}, start_period="<tomorrow>") |
| What's the current flow across Heywood (VIC ↔ SA)? | latest("interconnector_flows", filters={"interconnector":"V-SA"}) |
| Total NEM demand right now | latest("dispatch_region") |
Every answer comes with the interval timestamp (AEMO market time, UTC+10), units (MW, $/MWh), and a link back to the NEMWEB source. The MCP wraps NEMWEB's CSV/ZIP feeds and exposes them through 5 plain-English tools.
# After publish:
uvx --upgrade aemo-mcp
# Local dev:
uv pip install -e .
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"aemo": {
"command": "uvx",
"args": ["--upgrade", "aemo-mcp"]
}
}
}
Why
--upgrade?uvx aemo-mcp(without the flag) uses whatever wheel is cached and never adopts new PyPI releases on its own.--upgrademakes uvx check PyPI on each launch and pull a newer release if one exists. Recommended for everyone except offline-first / pinned-version workflows. To verify which version is currently serving you, look at theserver_versionfield on anyDataResponse.
If you also have rba-mcp / abs-mcp installed, all servers run side-by-side.
Claude disambiguates with the server prefix (aemo:get_data, rba:get_data,
abs:get_data).
For local dev (pre-PyPI):
{
"mcpServers": {
"aemo": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/aemo-mcp", "aemo-mcp"]
}
}
}
Add to ~/.cursor/mcp.json (or workspace .cursor/mcp.json):
{
"mcpServers": {
"aemo": {
"command": "uvx",
"args": ["--upgrade", "aemo-mcp"]
}
}
}
| Tool | What it does |
|---|---|
search_datasets(query, limit=10) | Fuzzy-search the 7 curated NEM datasets by name, topic, or region. |
describe_dataset(dataset_id) | Schema, filters, source URL, cadence, and example queries for one dataset. |
get_data(dataset_id, filters, start_period, end_period, format) | Query data. Records / series / csv format. |
latest(dataset_id, filters) | Most recent 5-min or 30-min interval for time-series feeds. |
list_curated() | The 7 curated dataset IDs. |
The 7 datasets cover ~95% of typical NEM analytic queries:
dataset_id | Cadence | Source | Use case |
|---|---|---|---|
dispatch_price | 5 min | DispatchIS / DISPATCHPRICE | Current spot price per region; negative-pricing detection |
dispatch_region | 5 min | DispatchIS / DISPATCHREGIONSUM | Demand + scheduled + semi-scheduled gen + net interchange |
interconnector_flows | 5 min | DispatchIS / DISPATCHINTERCONNECTORRES | MW flow + losses across NEM interconnectors |
generation_scada | 5 min | Dispatch_SCADA | DUID-level MW (every unit), aggregable by fuel |
rooftop_pv | 30 min | ROOFTOP_PV/ACTUAL + FORECAST | Regional rooftop solar (actual + forecast) |
predispatch_30min | 30 min | PredispatchIS | 30-min forecast, ~40h horizon |
daily_summary | Daily | Daily_Reports | Yesterday's full data in one drop |
Use list_curated() to enumerate, describe_dataset(dataset_id) to learn
the filters available on each.
NSW1 (New South Wales), QLD1 (Queensland), SA1 (South Australia), TAS1 (Tasmania), VIC1 (Victoria). Western Australia (WEM) and the Northern Territory are not on the NEM and are out of scope.
Every DataResponse carries:
source = "Australian Energy Market Operator"attribution — AEMO Copyright Permissions verbatim attribution stringsource_url — the NEMWEB folder the data came fromretrieved_at — UTC timestamp of the fetchinterval_start / interval_end — period coveredstale — True if the latest interval is older than 2× the feed cadenceserver_version — the wheel that served the callThis package is MIT-licensed (see LICENSE).
The AEMO data it fetches is published under AEMO's Copyright Permissions policy: AEMO grants general permission to use AEMO Material for any purpose (commercial included) on the sole condition of accurate attribution of the relevant material and AEMO as its author. See https://aemo.com.au/privacy-and-legal-notices/copyright-permissions.
End-users redistributing data fetched via this server must credit AEMO.
The canonical attribution string is on every DataResponse.attribution.
"What's the current NSW spot price?"
latest(dataset_id="dispatch_price", filters={"region": "NSW1"})
→ {"records": [{"period": "2026-05-14T10:05:00+10:00", "value": 87.5, "dimensions": {"region": "NSW1", "metric": "rrp"}, "unit": "$/MWh"}], ...}
"NSW spot price for the last 24 hours"
get_data(dataset_id="dispatch_price", filters={"region": "NSW1"},
start_period="2026-05-13", end_period="2026-05-14")
"Did SA hit negative pricing in the last 24 hours?"
get_data(dataset_id="dispatch_price", filters={"region": "SA1"},
start_period="<24h ago>")
Then the LLM filters value < 0 client-side.
"Generation by fuel type right now in QLD"
latest(dataset_id="generation_scada", filters={"region": "QLD1"})
→ DUID-level rows with fuel attribution; the LLM aggregates by fuel.
PUBLIC_DISPATCHIS_YYYYMMDDHHmm_<seq>.zip), so max() is enough.I,/D, row format where a
single ZIP holds several tables (DISPATCHPRICE, DISPATCHREGIONSUM,
DISPATCHINTERCONNECTORRES, etc.).git clone https://github.com/Bigred97/aemo-mcp
cd aemo-mcp
uv sync --extra dev
uv pip install -e .
uv run pytest -q
Run live tests (hit NEMWEB):
uv run pytest -q -m live
Zero-flake validation:
for i in $(seq 1 10); do uv run pytest -q || break; done
Built by Harry Vass. Issues + PRs welcome at github.com/Bigred97/aemo-mcp.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.