Back to Browse

Aeso MCP Server

Developer ToolsLow Risk10.0MCP RegistryLocal
Free

Server data from the Official MCP Registry

Typed Alberta electricity market data and analytics via official AESO APIs.

About

Typed Alberta electricity market data and analytics via official AESO APIs.

Security Report

10.0
Low Risk10.0Low Risk

Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry.

3 files analyzed · 1 issue found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

What You'll Need

Set these up before or after installing:

AESO APIM subscription keyRequired

Environment variable: AESO_API_KEY

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-bchoi-qwe-aeso-mcp": {
      "env": {
        "AESO_API_KEY": "your-aeso-api-key-here"
      },
      "args": [
        "aeso-mcp"
      ],
      "command": "uvx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

aeso-mcp

Agent-native, strongly typed access and analytics for Alberta's electricity market using official AESO data.

Independent open-source project. Not affiliated with or endorsed by the Alberta Electric System Operator (AESO).

What it is

aeso-mcp is a Model Context Protocol (MCP) server that exposes Alberta electricity-market observations and deterministic analytics to AI clients. It is designed for energy analysts, researchers, developers, journalists, market participants, and AI agents that need reliable, structured AESO data—not a thin REST decorator layer.

Features

  • Typed MCP tools with Pydantic inputs/outputs and structured results
  • Current market snapshot combining price, load, generation, interchange, and reserves
  • Paginated historical Pool Price, System Marginal Price, load, and generation retrieval
  • Authenticated APIM reports for merit order, commitments, capability/outages, interties, metered volumes, and operating-reserve offer control
  • Deterministic analytics: compact history summaries, period comparison, event detection, condition evidence, forecast accuracy, and transparent supply-tightness indicators
  • One complete server package and startup path: AESO_API_KEY is always required; there is no reduced credential-free server mode
  • Query bounds, cache provenance, completeness metadata, upstream Retry-After handling, and secret-safe machine-readable errors
  • Hardened HTTP transport with Host/Origin validation, optional bearer authentication, rate and concurrency limits, request-size bounds, probes, and correlation IDs
  • Reusable MCP prompts plus glossary, capability, dataset, and methodology resources

Implemented datasets

DatasetToolNotes
Market snapshotget_market_snapshotCurrent cohesive view
Pool Priceget_pool_pricesHourly CAD/MWh
System Marginal Priceget_system_marginal_pricesMinute-level CAD/MWh
Alberta Internal Loadget_loadMW; optional forecast
Generation / fuel mixget_generationCurrent all fuels; historical wind/solar
Interchangeget_interchangeCurrent path flows MW
Operating reservesget_reservesCurrent MW indicators
Generator outagesget_outagesHourly outage capacity by fuel/technology
AIES capacity/outagesget_generation_capacityHourly MC, AC, operating, and mothball outage MW
Load outage forecastget_load_outage_forecastHourly forecast MW
Energy Merit Orderget_energy_merit_orderHistorical blocks; 60-day publication delay
Unit commitmentsget_unit_commitmentsGenerating-unit commitment directives
Intertie capabilityget_intertie_capabilityImport/export ATC, TTC, margins, gross offers
Intertie capability outagesget_intertie_outagesOutages affecting interties/flowgates
Metered volumesget_metered_volumesHourly MWh by asset; optional ID filters
OR offer controlget_operating_reserve_offer_controlHistorical reserve offer blocks; 60-day delay
Approved Tx outagesget_approved_transmission_outagesAESO-approved planned transmission outages
Long-range Tx outagesget_long_range_transmission_outagesTentative ~24-month significant outages
MCSINRget_monthly_cumulative_net_revenueCumulative net revenue vs offer-cap trigger
Secondary offer limitget_secondary_offer_price_limitWhether secondary offer cap is in effect
Assetsget_assetsRegistry with filters

Analytics: summarize_market_history, assess_supply_tightness, compare_market_periods, find_price_events, explain_market_conditions, and compare_forecast_to_actual.

Architecture

MCP clients
    |
    v
FastMCP adapter (aeso_mcp/mcp)
    |
    v
Domain services (market, grid, assets, operations, analytics, transmission, market power)
    |
    +---------------------+------------------------+
    |                     |                        |
    v                     v                        v
GridStatus provider    Direct AESO APIM    Public-reports client
    |                     |                        |
    +----------+----------+                        |
               |                                   |
               v                                   v
       AESO APIM gateway                       ets.aeso.ca

Domain code does not depend on FastMCP. Framework changes should stay in aeso_mcp/mcp/. Both upstream clients are implementation details of this single server: the APIM key is sent only to apimgw.aeso.ca and is never sent to the allow-listed ets.aeso.ca report host.

Requirements

Installation

See LIMITATIONS.md for an honest gap inventory.

From PyPI (recommended)

export AESO_API_KEY=your-key
uvx aeso-mcp

From GitHub

To run the current repository version directly:

export AESO_API_KEY=your-key
uvx --from git+https://github.com/bchoi-qwe/aeso-mcp.git aeso-mcp

Development

git clone https://github.com/bchoi-qwe/aeso-mcp.git
cd aeso-mcp
uv sync --group dev
cp .env.example .env   # set AESO_API_KEY
uv run aeso-mcp

Docker

docker build -t aeso-mcp .
docker run --rm -e AESO_API_KEY=your-key -p 8000:8000 aeso-mcp

Obtaining an AESO API key

  1. Register at the AESO developer portal
  2. Subscribe to the AESO public API product
  3. Copy the primary/secondary subscription key
  4. Set AESO_API_KEY in your environment (never commit it)

Missing credentials produce an actionable startup error. The key is never returned through MCP tools or logged.

Example MCP client configuration

Cursor / Claude Desktop style (stdio)

{
  "mcpServers": {
    "aeso": {
      "command": "uvx",
      "args": ["aeso-mcp"],
      "env": {
        "AESO_API_KEY": "your-key"
      }
    }
  }
}

HTTP transport

uv run aeso-mcp --transport http --host 127.0.0.1 --port 8000

HTTP always validates Host and Origin. For a remotely reachable deployment, explicitly set AESO_MCP_HTTP_ALLOWED_HOSTS and AESO_MCP_HTTP_ALLOWED_ORIGINS; set AESO_MCP_HTTP_BEARER_TOKEN to require bearer authentication. /healthz and /readyz contain no market data or secrets. See .env.example for all bounded runtime settings.

Example prompts

  • What is Alberta's current grid situation?
  • What is the current pool price?
  • Show Alberta pool prices over the last 24 hours.
  • Compare today's pool prices with yesterday's.
  • Which hours had the highest prices this week?
  • How much wind and solar are producing right now?
  • What happened during the largest price spike this week?
  • Explain the evidence associated with today's price increase.

Tools

ToolPurpose
get_market_snapshotCurrent market overview
get_pool_pricesHourly Pool Price history
get_system_marginal_pricesMinute-level SMP history
get_loadAlberta Internal Load
get_generationFuel mix / renewable history
get_interchangeIntertie flows
get_reservesOperating reserve indicators
get_outagesHourly generator outage capacity by fuel
get_generation_capacityAIES capability and outage grouping by fuel
get_load_outage_forecastHourly load-outage forecast
get_energy_merit_orderHistorical energy merit-order blocks
get_unit_commitmentsGenerating-unit commitment directives
get_intertie_capabilityIntertie/flowgate ATC, TTC, and margins
get_intertie_outagesOutages affecting intertie capability
get_metered_volumesMetered energy by asset
get_operating_reserve_offer_controlHistorical reserve offer-control blocks
get_approved_transmission_outagesApproved planned transmission outages
get_long_range_transmission_outagesTentative long-range transmission outages
get_assetsAsset registry
get_monthly_cumulative_net_revenueCurrent MCSINR publication
get_secondary_offer_price_limitCurrent secondary offer-cap status
compare_market_periodsAggregate period comparison
find_price_eventsHigh-price event detection
explain_market_conditionsStructured evidence (not causal prose)
compare_forecast_to_actualAIL forecast vs actual accuracy
summarize_market_historyCompact hourly/daily/weekly/monthly price and load summaries
assess_supply_tightnessTransparent reserve-adjusted supply-margin screening

All tools are read-only, non-destructive, and network-dependent.

Resources

URIContent
aeso://glossaryMarket terminology
aeso://datasetsDataset catalog
aeso://methodology/pool-pricePool Price interpretation
aeso://methodology/system-marginal-priceSMP interpretation
aeso://capabilitiesComplete tool, prompt, and resource surface
aeso://methodology/{dataset}Dataset-specific interpretation and caveats

Prompts: daily_market_brief, investigate_price_event, and compare_market_days.

Data semantics

  • Timezone: America/Edmonton (AESO market time). DST days may have 23 or 25 local hours.
  • Intervals: Explicit interval_start / interval_end (half-open ranges in requests).
  • Units: Pool Price / SMP → CAD/MWh; load / generation / interchange / reserves → MW.
  • Status: Metadata includes actual / forecast / etc. Forecasts are never implied to be settled actuals.
  • Finality: Operational feeds may be preliminary; do not assume final settlement.
  • Completeness: Metadata reports available/missing series and expected/missing observations where the source cadence is known. Optional enrichment failures are surfaced as partial or degraded results with warnings.
  • Pagination: Raw price, SMP, load, generation, and operational reports return page metadata with next_offset. Use summarize_market_history before retrieving long raw series.
  • Cache timing: retrieved_at identifies the upstream fetch; served_at, cache_hit, and cache_age identify when and how the response was served.

Development

uv sync --group dev
uv run ruff check src tests
uv run pyright src
uv run pytest tests/unit tests/contract tests/mcp --cov=aeso_mcp
uv build

Optional live tests:

AESO_API_KEY=... uv run pytest tests/integration -m integration

MCP Inspector:

# Prefer the console entrypoint; or point Inspector at:
# uv run aeso-mcp
npx @modelcontextprotocol/inspector uv run aeso-mcp

Tests

  • tests/unit — time, bounds, analytics, config
  • tests/contract — AESO APIM fixtures via respx
  • tests/mcp — tool/resource discovery and structured outputs
  • tests/integration — opt-in live AESO calls

Security

See SECURITY.md. Highlights: no arbitrary URL/shell/SQL tools, host allow-list, secret hygiene, bounded queries, stderr logging for stdio.

Roadmap

  • Optional DuckDB/Parquet historical analytics store
  • Broader forecast vs actual tools

Contributing

See CONTRIBUTING.md.

License

MIT — see LICENSE.

Disclaimer

This project is an independent open-source interface to publicly documented AESO APIs. It is not an official AESO product and is not affiliated with or endorsed by AESO. Market data may be preliminary or incomplete; verify critical decisions against official AESO publications.

Reviews

No reviews yet

Be the first to review this server!