Skip to main content
Glama

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.

Related MCP server: EnergyAtIt MCP Server

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

  • Official individual-asset Historical CSD Generation Data at hourly and five-minute resolution

  • Optional incremental DuckDB index and partitioned Parquet snapshots for repeatable research

  • Official AIL, Pool Price, wind, solar, and combined wind/solar forecast publications through one typed get_forecast contract, with persisted publication vintages and point-in-time as_of selection that excludes unknown publication chronology

  • Official supply-adequacy, supply-surplus, FFR Net Schedule, Dispatch Down Service, TMR reference-price, and AIES system-event reports

  • Official historical adequacy/cushion web codes, transmission outages, planning-area hourly load/generation, constrained volume, EEA events, operating-reserve directives, and the current Pool Participant registry through one typed research-archive contract

  • 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, price distributions, capture price, net load, supply stack, generation, outage association, generalized forecast accuracy, asset gross energy revenue, CSD-versus- metered comparisons, ramps, supply-surplus associations, and transparent supply-tightness indicators, plus participant concentration, regional, constrained-volume, scarcity, and compact system-frequency analysis

  • Deterministic research manifests identify exact input publications, parameters, methodology, completeness, and degradation warnings for multi-source market-event analysis

  • Public operating-reserve active/standby prices, seven-day forecasts, activations, and summaries

  • 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, bearer authentication required for non-loopback binds by default, rate/concurrency limits, request-size bounds, probes, and correlation IDs

  • Reusable MCP prompts plus glossary, capability, dataset, and methodology resources

Implemented datasets

Dataset

Tool

Notes

Market snapshot

get_market_snapshot

Current cohesive view

Pool Price

get_pool_prices

Hourly CAD/MWh

System Marginal Price

get_system_marginal_prices

Minute-level CAD/MWh

Alberta Internal Load

get_load

MW; optional forecast

Generation / fuel mix

get_generation

Current all fuels; historical wind/solar

Interchange

get_interchange

Current path flows MW

Operating reserves

get_reserves

Current MW indicators

Generator outages

get_outages

Hourly outage capacity by fuel/technology

AIES capacity/outages

get_generation_capacity

Hourly MC, AC, operating, and mothball outage MW

Load outage forecast

get_load_outage_forecast

Hourly forecast MW

Energy Merit Order

get_energy_merit_order

Historical blocks; 60-day publication delay

Unit commitments

get_unit_commitments

Generating-unit commitment directives

Intertie capability

get_intertie_capability

Import/export ATC, TTC, margins, gross offers

Intertie capability outages

get_intertie_outages

Outages affecting interties/flowgates

Metered volumes

get_metered_volumes

Hourly MWh by asset; optional ID filters

OR offer control

get_operating_reserve_offer_control

Historical reserve offer blocks; 60-day delay

Approved Tx outages

get_approved_transmission_outages

AESO-approved planned transmission outages

Long-range Tx outages

get_long_range_transmission_outages

Tentative ~24-month significant outages

MCSINR

get_monthly_cumulative_net_revenue

Cumulative net revenue vs offer-cap trigger

Secondary offer limit

get_secondary_offer_price_limit

Whether secondary offer cap is in effect

Assets

get_assets

Registry with filters

Historical CSD generation

get_historical_generation

Individual assets; hourly / five-minute operational MW

Official forecasts

get_forecast

AIL / Pool Price / wind / solar; source-specific horizons and cadence

Official research archive

get_research_data

Historical adequacy/cushion, transmission, planning-area, constraint, EEA, OR-directive, and current participant records

Supply adequacy / cushion

get_supply_adequacy

Official hourly categorical status bands

Supply surplus

get_supply_surplus

Official hourly zero-price forecast status

FFR Net Schedule

get_ffr_net_schedule

Hourly scheduled imports (negative) / exports (positive) MW

Dispatch Down Service

get_dispatch_down_service

Published DDS availability MW

TMR reference price

get_tmr_reference_price

Published CAD/MWh value by effective date

AIES system events

get_system_events

Bounded event-log comments; no inferred event end

UC settlement summary

get_uc_settlement_summary

Hourly CAD amount and charged MW

OR prices

get_operating_reserve_prices

Active and standby price components and volumes

OR forecast

get_operating_reserve_forecast

Current seven-day hourly MW forecast

OR activations

get_operating_reserve_activations

Hourly standby volume and activation price

Analytics: summarize_market_history, assess_supply_tightness, compare_market_periods, find_price_events, explain_market_conditions, compare_forecast_to_actual, get_price_statistics, get_price_duration_curve, analyze_market_event, calculate_capture_prices, analyze_net_load, analyze_supply_stack, analyze_intertie_utilization, analyze_generation_mix, analyze_asset_dispatch, analyze_outage_impact, analyze_forecast_error, calculate_asset_energy_revenue, compare_csd_to_metered, analyze_ramps, analyze_supply_surplus_events, summarize_operating_reserve_market, analyze_participant_concentration, analyze_regional_load_generation, analyze_constrained_volume, analyze_scarcity, and analyze_system_frequency.

Architecture

The documentation site includes a full architecture and MCP Inspector walkthrough.

MCP clients
    |
    v
FastMCP adapter (aeso_mcp/mcp)
    |
    v
Domain services (market, grid, history, forecasts, reports, research, reserves, operations)
    |
    +---------------+----------------+----------------+----------------+
    |               |                |                |
    v               v                v                v
GridStatus     Direct APIM     Public reports    CSD archive
    |               |           (ets.aeso.ca)      (Box)
    +-------+-------+
            |
            v
      AESO APIM gateway

Domain code does not depend on FastMCP. Framework changes should stay in aeso_mcp/mcp/. All 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 or Box hosts.

Requirements

Installation

See LIMITATIONS.md for an honest gap inventory.

export AESO_API_KEY=your-key
uvx aeso-mcp

For incremental DuckDB/Parquet historical storage:

uvx --from 'aeso-mcp[analytics]' 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 \
  -e AESO_MCP_HTTP_BEARER_TOKEN=replace-with-a-long-random-token \
  -p 8000:8000 \
  aeso-mcp

Send the same token in the MCP client's Authorization: Bearer ... header. The image binds to 0.0.0.0, so it intentionally requires bearer authentication by default.

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

See the documentation site's MCP client configurations for maintained Codex, ChatGPT desktop app, Claude Desktop, Claude Code, and Cursor setup instructions.

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. A non-loopback bind now refuses to start unless AESO_MCP_HTTP_BEARER_TOKEN is configured. An explicit AESO_MCP_HTTP_ALLOW_INSECURE_REMOTE=true override exists for isolated environments that accept the risk; it is never the default. Also set AESO_MCP_HTTP_ALLOWED_HOSTS and AESO_MCP_HTTP_ALLOWED_ORIGINS for the deployment. /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?

  • How inaccurate was the seven-day wind forecast during that event?

  • Was AESO publishing a supply-surplus or tight supply-cushion status at the time?

  • What gross Pool Price energy revenue did this asset's metered MWh earn?

  • Explain the evidence associated with today's price increase.

Tools

Tool

Purpose

get_market_snapshot

Current market overview

get_pool_prices

Hourly Pool Price history

get_system_marginal_prices

Minute-level SMP history

get_load

Alberta Internal Load

get_generation

Fuel mix / renewable history

get_interchange

Intertie flows

get_reserves

Operating reserve indicators

get_outages

Hourly generator outage capacity by fuel

get_generation_capacity

AIES capability and outage grouping by fuel

get_load_outage_forecast

Hourly load-outage forecast

get_energy_merit_order

Historical energy merit-order blocks

get_unit_commitments

Generating-unit commitment directives

get_intertie_capability

Intertie/flowgate ATC, TTC, and margins

get_intertie_outages

Outages affecting intertie capability

get_metered_volumes

Metered energy by asset

get_operating_reserve_offer_control

Historical reserve offer-control blocks

get_approved_transmission_outages

Approved planned transmission outages

get_long_range_transmission_outages

Tentative long-range transmission outages

get_assets

Asset registry

get_monthly_cumulative_net_revenue

Current MCSINR publication

get_secondary_offer_price_limit

Current secondary offer-cap status

compare_market_periods

Aggregate period comparison

find_price_events

High-price event detection

explain_market_conditions

Structured evidence (not causal prose)

compare_forecast_to_actual

AIL forecast vs actual accuracy

summarize_market_history

Compact hourly/daily/weekly/monthly price and load summaries

assess_supply_tightness

Transparent reserve-adjusted supply-margin screening

get_historical_generation

Official individual-asset CSD archive history

sync_historical_store

Incremental local DuckDB/Parquet ingestion

get_historical_store_status

Local coverage, manifests, and partition status

get_forecast

Official AIL, Pool Price, wind, solar, and combined wind/solar forecasts

get_research_data

Bounded page from one verified official historical/spatial/reliability archive

get_supply_adequacy

Official supply-adequacy and market-supply-cushion status bands

get_supply_surplus

Official hourly supply-surplus forecast status

get_ffr_net_schedule

Historical scheduled FFR intertie transfer

get_dispatch_down_service

Dispatch Down Service availability report

get_tmr_reference_price

Published TMR reference price

get_system_events

Bounded AIES Event Log messages

get_uc_settlement_summary

Public hourly UC amount and charged volume

get_price_statistics

Price distribution and volatility statistics

get_price_duration_curve

Pool Price exceedance curve

analyze_market_event

Focus versus baseline multi-series associations

calculate_capture_prices

Generation-weighted price and capture rate

analyze_net_load

AIL minus selected renewable generation

analyze_supply_stack

Historical offer-stack analysis

analyze_intertie_utilization

Gross-offer to capability proxy

analyze_generation_mix

CSD energy and share by fuel

analyze_asset_dispatch

Asset output, capacity factor, and ramps

analyze_outage_impact

Hourly outage-price association

analyze_forecast_error

General forecast error, percentiles, market-hour and lead-time profiles

calculate_asset_energy_revenue

Metered MWh × Pool Price gross energy revenue

compare_csd_to_metered

Operational CSD output versus metered MWh

analyze_ramps

Cadence-aware AIL, net-load, renewable, or asset ramps

analyze_supply_surplus_events

Price/load/renewable associations during explicit surplus states

get_operating_reserve_prices

Active/standby price components and volumes

get_operating_reserve_forecast

Seven-day reserve-volume forecast

get_operating_reserve_activations

Hourly standby activations

summarize_operating_reserve_market

Product price/volume/activation summary

analyze_participant_concentration

Offered-volume shares and HHI using current participant mapping

analyze_regional_load_generation

Planning-area and regional load/generation aggregates

analyze_constrained_volume

Planning-area/fuel constrained MWh and optional price association

analyze_scarcity

Historical adequacy/cushion web codes, EEA, and price context

analyze_system_frequency

Compact six-hour 10-second frequency statistics; no raw row output

Market and research tools are read-only. sync_historical_store writes only to the configured local historical-store root; it does not mutate AESO or another external system.

Resources

URI

Content

aeso://glossary

Market terminology

aeso://datasets

Dataset catalog

aeso://methodology/pool-price

Pool Price interpretation

aeso://methodology/system-marginal-price

SMP interpretation

aeso://capabilities

Complete 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.

  • Point-in-time forecasts: as_of selects only vintages with known issue/publication times at or before the boundary. Unknown chronology is excluded; target intervals absent from persisted history remain unobserved rather than being backfilled from a later publication.

  • 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.

  • Research identity: analyze_market_event.analysis_manifest records exact sources, parameters, methodology version, warnings, and a deterministic SHA-256 analysis_id.

Development

uv sync --group dev
uv run ruff check src tests scripts
uv run pyright src
uv run pytest tests/unit tests/contract tests/mcp tests/evals --cov=aeso_mcp
uv run python scripts/generate_catalog.py --check
uv run mkdocs build --strict
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.

Development status

Version 0.3.0 includes the historical store, full CSD generation adapter, official forecast/report providers, general research analytics, operating-reserve market surface, eval suite, and documentation site. Unreleased work adds point-in-time forecast vintages, reproducibility manifests, release-policy hardening, and the verified official research-data archive.

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.

Available Tools

57 tools
analyze_asset_dispatchAnalyze Asset DispatchB
Read-onlyIdempotent

Summarizes official hourly CSD dispatch for selected assets: energy, average/peak generation, available capacity factor, and hourly ramp extremes.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the read-only, idempotent, non-destructive profile, so the description does not need to restate safety. It adds some context by specifying the source ('official hourly CSD dispatch') and the aggregation focus, but it does not disclose edge-case behavior, data-availability assumptions, or how the time interval is handled beyond what the schema already notes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the verb, resource, and scope, then lists the metrics. Every phrase contributes; there is no filler or repetition of annotation fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus annotations and output schema give a fairly complete picture for a straightforward summarization tool. However, the lack of asset-ID provenance or any usage routing leaves an agent to infer how to populate the request correctly, especially given the large sibling set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% at the top level, and the description does not compensate: it only says 'selected assets', which maps loosely to asset_ids, and 'hourly' implies a time window, but it does not explain the request object, the format or source of asset IDs, or the interval semantics. The nested start/end descriptions do some work, but the top-level request parameter is undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb, 'Summarizes', ties it to a concrete resource ('official hourly CSD dispatch'), and enumerates the derived metrics (energy, generation, capacity factor, ramp extremes). This distinguishes it from raw-data siblings like get_generation and get_metered_volumes by signaling an aggregated analysis over dispatch data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to choose this tool over siblings such as analyze_ramps, get_generation, or compare_csd_to_metered. The description implies a use case but never states exclusions, prerequisites, or context where an alternative would be better.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_forecast_errorAnalyze Forecast ErrorA
Read-onlyIdempotent

Calculates forecast-minus-actual bias, MAE, RMSE, denominator-aware MAPE, error percentiles, and breakdowns by market hour and lead time for AIL, Pool Price, wind, solar, or combined wind/solar when the official source provides paired values.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesGeneric forecast-error request for supported actual/forecast pairs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
seriesYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsNo
mean_errorNo
by_lead_timeNo
by_market_hourNo
error_percentilesNo
observation_countYes
mean_absolute_errorNo
missing_actual_countNo
missing_forecast_countNo
root_mean_squared_errorNo
mean_absolute_percentage_errorNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the safety profile is fully covered. The description adds meaningful behavioral nuance: it computes denominator-aware MAPE (not plain MAPE) and only operates 'when the official source provides paired values', which is an operational constraint not present in annotations. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, information-dense sentence that front-loads the action ('Calculates') and enumerates all key metrics before the conditional caveat. Every clause earns its place with no wasted wording, and the structure is easy to parse despite the long list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full input schema, complete parameter descriptions, annotations, and an output schema present, the description is largely sufficient to understand the tool's scope and output. The only real gap is the unstated behavior when paired values are not available—the description flags the condition but does not explain what the tool would do in that case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents start/end timezone handling, series enum values, and the percentiles array. The description adds a natural-language mapping of the series names to supported forecast types, but does not provide deeper parameter semantics than the schema already supplies. The baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact metrics calculated (forecast-minus-actual bias, MAE, RMSE, denominator-aware MAPE, error percentiles) and the scope of supported resources (AIL, Pool Price, wind, solar, wind_solar), with a conditional qualifier. This is a specific verb+resource definition and clearly differentiates it from generic forecast/comparison tools by enumerating the analytical output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear context: use it for supported forecast/actual pairs and when the official source provides paired values, listing the series types it can handle. However, it does not name alternatives such as compare_forecast_to_actual or get_forecast, nor does it state when not to use this tool, leaving routing decisions to the agent's inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_generation_mixAnalyze Generation MixA
Read-onlyIdempotent

Aggregates official hourly individual-asset CSD generation into energy, share, average MW, and peak MW by fuel type.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
total_generation_mwhYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds modest context (aggregation of CSD data into time-window metrics) but does not disclose edge behavior such as how 'peak MW' is computed over the interval or how hourly records are aggregated. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One 19-word sentence with the verb and resource front-loaded and every word carrying information. No filler, no redundancy, and the output metrics are enumerated compactly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the core call contract is largely complete. The notable gaps are the undocumented fuel_types value domain/default behavior and the lack of sibling differentiation, both of which matter given the crowded tool family.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The nested start/end parameters are thoroughly documented in the schema (inclusive/exclusive, timezone behavior), but the top-level request object and fuel_types have no schema descriptions. The description's 'by fuel type' clarifies that fuel_types is the grouping/filtering dimension, yet valid fuel type values and the default when fuel_types is omitted remain undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('aggregates'), a precise resource ('official hourly individual-asset CSD generation'), and the exact derived output metrics (energy, share, average MW, peak MW by fuel type). This distinguishes it from siblings like get_generation (raw data) and analyze_supply_stack without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to choose this tool over alternatives. With over 50 siblings including get_generation, get_historical_generation, and analyze_supply_stack, the agent must infer selection solely from the name and output metrics; there are no explicit selection conditions, exclusions, or alternative references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_intertie_utilizationAnalyze Intertie UtilizationA
Read-onlyIdempotent

Summarizes gross offers relative to available intertie transfer capability by path and direction. This is an offer-to-capability proxy, not metered flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
methodologyYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description adds useful behavioral nuance by clarifying that the output is a proxy (gross offers vs capability) and not metered flow, which helps set expectations about what the metric means. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, followed by an important caveat. There is no redundancy or filler; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With output schema present and annotations covering read-only safety, the description need not explain return values or idempotency. It communicates the analytical intent and distinguishes the tool from metered-flow alternatives. However, the optional interties parameter's semantics are not explicitly tied to 'path and direction', leaving a minor gap in fully instructing invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain start_date, end_date, or the optional interties parameter. Although the schema provides types and requiredness, the description leaves the meaning of interties and the behavior when omitted implicit, forcing the agent to infer domain knowledge rather than providing clear parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Summarizes') and a precise resource ('gross offers relative to available intertie transfer capability by path and direction'). It also clearly distinguishes itself from metered-flow tools by stating it is an offer-to-capability proxy, not metered flow, which separates it from sibling tools like get_metered_volumes and get_interchange.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when the user wants an offer-to-capability proxy rather than actual metered flow. However, it does not explicitly name alternatives or state when not to use it, so an agent must infer the usage boundary from the phrase 'not metered flow' rather than receive explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_market_eventAnalyze Market EventA
Read-onlyIdempotent

Compares structured price, demand/forecast, supply, merit-order, intertie, commitment, and operating-reserve evidence in a focus window against a supplied or immediately preceding baseline. Returns descriptive associations, not causal claims.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
metricsYes
evidenceYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
focus_endYes
focus_startYes
methodologyYes
baseline_endYes
baseline_startYes
ranked_associationsYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds value by disclosing that output is descriptive rather than causal and that the baseline may be supplied or automatically taken from the immediately preceding period. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler: the first front-loads the comparison behavior and evidence scope, the second states the output limitation. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex analytical tool, the description captures the input window, baseline handling, evidence dimensions, and output nature; an output schema exists so return structure need not be repeated. It could be more explicit about how baseline parameters relate to the focus window, but the core call semantics are adequately conveyed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning, but it only glosses a 'focus window' and 'baseline' without explaining baseline_start/end semantics or how the preceding baseline is selected. The schema gives timezone notes for start/end, but baseline fields remain underdocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('compares') with a clearly enumerated evidence scope (price, demand/forecast, supply, merit-order, intertie, commitment, operating reserve) and states the output type ('descriptive associations, not causal claims'). This distinguishes it from single-source getters and from causal explanation tools in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (multi-domain comparison in a focus window) and cautions against causal interpretation, but it does not explicitly compare against close siblings like compare_market_periods or explain_market_conditions. It provides clear context without explicit alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_net_loadAnalyze Net LoadA
Read-onlyIdempotent

Calculates hourly Alberta Internal Load minus selected CSD renewable generation (wind and solar by default), including average, peak, and minimum net load.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes
peak_net_load_mwNo
average_net_load_mwNo
minimum_net_load_mwNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint, idempotentHint, and destructiveHint false. The description adds useful behavioral context beyond those annotations: the calculation is hourly, defaults to wind and solar, allows selecting renewable fuels, and produces average, peak, and minimum net load values. This helps the agent understand the tool's output shape and configurable behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence packs the action, resource, formula, defaults, and output statistics without redundancy. The most important information is front-loaded, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema provided and read-only annotations covering safety, the description supplies the core calculation logic, defaults, and output metrics. The main minor gap is that 'CSD' is not explained, but this is a domain acronym rather than a missing behavioral requirement. Overall, an agent has enough to understand what the tool computes and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents start and end semantics, but renewable_fuels has no description. The description partially compensates by indicating that renewable generation is selectable and defaults to wind and solar, but it does not specify accepted fuel values, string formats, or how the request object maps to the calculation. Parameter semantics are therefore adequate but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Calculates') and clearly identifies the resource and formula: hourly Alberta Internal Load minus selected CSD renewable generation, with wind and solar as defaults. It also lists the computed statistics (average, peak, minimum), which distinguishes it from generic load or generation retrieval tools among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for net-load analysis after subtracting renewable generation, but it gives no explicit when-to-use guidance, no conditions, and no mention of alternatives. An agent can infer the purpose but is not told when to choose this over get_load, get_generation, or other analysis tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_outage_impactAnalyze Outage ImpactB
Read-onlyIdempotent

Joins hourly generator outage capacity to Pool Price and reports high-outage versus other-hour price differences plus Pearson correlation as non-causal associations.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
methodologyYes
threshold_mwNo
matched_observationsYes
high_outage_observationsYes
outage_price_correlationNo
price_difference_cad_per_mwhNo
average_price_high_outage_cad_per_mwhNo
average_price_other_hours_cad_per_mwhNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds a valuable interpretation caveat by labeling the Pearson correlation as non-causal, but it adds no context on data completeness, missing-hour handling, or the meaning of the default threshold behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence that front-loads the core operation (the join), then the outputs, then the caveat. Every clause earns its place, though splitting the causality caveat into its own sentence would improve scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The analytical intent, output schema, and safety annotations cover the tool's core well. However, high_outage_threshold_mw semantics and default-null behavior are undocumented in both schema and description, leaving an agent to guess what counts as a high-outage hour. For an analysis tool of moderate complexity this is adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description names no parameters. The schema documents start/end timezone handling but leaves high_outage_threshold_mw with no description; the phrase 'high-outage' is only a weak hint, and the nested request wrapper is never mentioned. The description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs and resources: it 'joins hourly generator outage capacity to Pool Price' and 'reports high-outage versus other-hour price differences plus Pearson correlation.' This makes the analytic purpose clear and distinguishes it from siblings like get_outages or get_pool_prices, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'as non-causal associations' qualifier is an implied usage constraint, telling the agent how to frame results, but there is no explicit when-to-use guidance, no exclusions, and no routing to alternatives like get_outages for raw outage lists or analyze_market_event for broader event analysis.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_rampsAnalyze RampsA
Read-onlyIdempotent

Calculates cadence-aware up/down ramps for AIL, net load, wind, solar, or selected asset CSD generation. Supports hourly and five-minute cadence where the source supports it, skips non-consecutive observations, reports MW per interval and MW/hour, and never fills missing values.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest cadence-aware ramp statistics for one supported market series.

Output Schema

ParametersJSON Schema
NameRequiredDescription
seriesYes
cadenceYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
largest_rampsNo
cadence_minutesYes
observation_countYes
maximum_up_ramp_mwNo
ramp_percentiles_mwNo
maximum_down_ramp_mwNo
ramp_observation_countYes
maximum_up_ramp_mw_per_hourNo
maximum_down_ramp_mw_per_hourNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description discloses meaningful behaviors: it supports hourly and five-minute cadence where available, skips non-consecutive observations, reports MW per interval and MW/hour, and never fills missing values. This gives an agent a clear model of how the tool processes data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two dense sentences with no filler. The primary action is front-loaded, and each clause adds a distinct behavioral fact without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, annotations, and the presence of an output schema, the description covers the essential behavioral gaps: cadence handling, missing-value policy, non-consecutive observation handling, and output units. Nothing critical for invoking the tool correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even though the description does not add much per-parameter detail. The high-level mention of series types and cadence aligns with the schema but does not deepen understanding beyond what the parameter descriptions already provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific analysis ('Calculates cadence-aware up/down ramps') and enumerates the applicable resources: AIL, net load, wind, solar, or asset CSD generation. This clearly distinguishes it from sibling analysis tools like analyze_net_load or analyze_generation_mix.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its capability statement, but it does not explicitly say when to choose this tool over alternatives or when not to use it. It provides some context about cadence support and data handling, but no exclusionary guidance relative to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_supply_stackAnalyze Supply StackB
Read-onlyIdempotent

Analyzes one historical Energy Merit Order hour: price-sorted offer blocks, offered and dispatched MW, and the highest dispatched offer price.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
blocksYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
offered_mwYes
hour_endingYes
report_dateYes
dispatched_mwYes
marginal_offer_cad_per_mwhNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds scope context (one historical hour and its key outputs) but no further behavioral traits such as data availability, error behavior, or edge cases. This is acceptable but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence with no filler. It front-loads the core action and resource, then lists key outputs efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, annotations, and output schema together provide a minimally viable picture for a read-only analysis tool. It clearly states what the tool does, but omits usage guidance and parameter-level detail, leaving some context for the agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never names report_date, hour_ending, or limit. It only weakly implies a historical hour input, so it does not compensate for the schema gap enough to help an agent map the textual description to the required parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Analyzes') and identifies a clear resource: one historical Energy Merit Order hour, and it lists distinctive outputs such as price-sorted offer blocks and highest dispatched offer price. It does not explicitly contrast itself with sibling tools like get_energy_merit_order, so it lacks full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool instead of nearby alternatives such as get_energy_merit_order or analyze_supply_surplus_events. It implies a focus on a single historical hour, but no exclusions or alternative conditions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_supply_surplus_eventsAnalyze Supply Surplus EventsA
Read-onlyIdempotent

Aligns official AESO supply-surplus status runs with observed Pool Price, AIL, and wind/solar generation. Durations are reported only when the official sequence provides an explicit end boundary. Results are descriptive associations, not causation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesBounded descriptive analysis of officially published surplus events.

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
event_countYes
total_explicit_duration_hoursYes
explicitly_bounded_event_countYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and idempotent annotations, the description adds important behavioral caveats: durations are only reported when the official sequence provides an explicit end boundary, and results are descriptive associations, not causation. These are meaningful constraints for interpreting the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry the core purpose and key caveats with no filler. The primary operation is front-loaded, and each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a complete input schema and an output schema, the description covers the central purpose and the main behavioral caveats. It does not detail how missing official sequences affect the overall result beyond duration reporting, but this is a minor gap for an analysis tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: both start and end parameters are fully described with timezone and inclusivity/exclusivity semantics. The description adds no parameter-specific detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific analytical operation: aligning official AESO supply-surplus status runs with observed Pool Price, AIL, and wind/solar generation. This clearly distinguishes the tool from raw data retrieval siblings like get_supply_surplus and other market analysis tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear context: use when a bounded descriptive comparison of official surplus status against observed market and generation data is needed. It does not explicitly name alternatives or state when not to use the tool, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assess_supply_tightnessAssess Supply TightnessA
Read-onlyIdempotent

Combines the current market snapshot with hourly available generation capability and outages. Returns transparent supply-margin arithmetic plus a deterministic tight/watch/comfortable screening signal; it is not an AESO declaration or a causal price explanation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
methodologyYes
observed_atYes
tightness_signalYes
mothball_outage_mwNo
net_interchange_mwNo
operating_outage_mwNo
aeso_supply_cushion_mwNo
gross_supply_margin_mwNo
aeso_supply_cushion_codeNo
alberta_internal_load_mwNo
aeso_supply_cushion_statusNo
reserve_adjusted_margin_mwNo
aeso_supply_adequacy_statusNo
contingency_reserve_required_mwNo
aeso_supply_adequacy_status_codeNo
maximum_generation_capability_mwNo
available_generation_capability_mwNo
reserve_adjusted_margin_pct_of_loadNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the tool as readOnly, idempotent, and openWorld. The description adds useful behavioral context by emphasizing the output is deterministic and transparent arithmetic, and clarifying it carries no official AESO status. This goes beyond the structured annotations and sets correct expectations for downstream use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core computation and return type, plus a clarifying exclusion. Every sentence contributes meaning and no length is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema and safety annotations, the description adequately covers what the tool computes, what kind of signal it returns, and the caveat about non-official status. It could be more explicit about exactly when to choose it over sibling supply-analysis tools, but the core context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, there is no schema burden for the description to carry, and the baseline for 0-param tools is 4. The description also names the implicit inputs (market snapshot, generation capability, outages) which helps an agent conceptualize what the tool evaluates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: it combines market snapshot, generation capability, and outages to compute supply-margin arithmetic and a deterministic screening signal. It also distinguishes the output from an AESO declaration or causal price explanation, so an agent can tell it apart from analytical siblings like explain_market_conditions or get_supply_adequacy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when a transparent, deterministic supply-tightness screening signal is needed. It explicitly states what it is not for (not an AESO declaration, not a causal price explanation), but does not name alternative tools or provide an explicit 'when to use vs get_supply_adequacy' routing statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_asset_energy_revenueCalculate Asset Energy RevenueA
Read-onlyIdempotent

Joins hourly metered energy (MWh) by selected asset to hourly AESO Pool Price (CAD/MWh) over [start, end). Returns gross Pool Price energy revenue, realized capture price, arithmetic average matched market price, capture rate, matched hours, and explicit missing intervals. This is not total settlement revenue.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesJoin hourly metered energy to hourly Pool Price for selected assets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, open-world, idempotent, and non-destructive, so the description does not need to restate safety. It adds useful behavioral detail beyond annotations: the join methodology, the inclusive/exclusive interval behavior, and the promise of explicit missing intervals, which is important for a calculation tool that might silently drop data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: it opens with the core join, lists the key output metrics, and finishes with a concise caveat. Every sentence earns its place without restating the tool name or repeating the schema verbosely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a computation tool with a rich input schema, an output schema, and safety annotations, the description is largely complete. It names the calculation inputs, the outputs, missing-interval handling, and the key settlement caveat. It could slightly improve by distinguishing itself from calculate_capture_prices, but that is more usage guidance than core completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the input schema already documenting start/end date-time behavior and asset_ids selection. The description reinforces that the operation is a join by selected asset over [start, end), but it adds little parameter-level meaning not already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise operation — joining hourly metered energy by asset with hourly AESO Pool Price — and specifies the returned metrics (gross revenue, capture price, capture rate, matched hours, missing intervals). It also explicitly delimits its scope with 'This is not total settlement revenue,' which distinguishes it from settlement-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a clear use case — calculating Pool Price energy revenue from matched metered and price data — and provides an explicit exclusion by stating it is not total settlement revenue. However, it does not specify when to choose this tool over nearby alternatives such as calculate_capture_prices or get_monthly_cumulative_net_revenue, so usage routing remains partially inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_capture_pricesCalculate Capture PricesA
Read-onlyIdempotent

Joins hourly Pool Price to official CSD generation and calculates generation-weighted capture price and capture rate by requested asset and/or fuel group.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation as read-only, non-destructive, and idempotent. The description adds meaningful behavioral context beyond that: it identifies the data sources (hourly Pool Price, official CSD generation), the join operation, and the generation-weighting methodology, giving the agent a clearer model of what happens when invoked.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the core action and data source. Every phrase adds information, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and annotations covering safety, the description is largely adequate. It explains the data sources, the computation approach, and the available filter dimensions. Minor gaps remain around whether filters are optional and how results are grouped when both asset_ids and fuel_types are provided, but these are not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does partially by explaining that filtering is by 'asset and/or fuel group,' which maps to asset_ids and fuel_types, and that the time window is required. However, it does not add details about accepted ID formats, fuel group values, or behavior when no asset/fuel filter is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action: joining hourly Pool Price to CSD generation and calculating generation-weighted capture price and capture rate. This distinguishes it from sibling tools like get_pool_prices and get_generation, which retrieve raw inputs rather than perform the analytic calculation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool — when capture prices/rates by asset or fuel group are needed — but it does not explicitly state exclusions or alternative tools. There is no direct guidance on when to prefer this over related calculation tools such as calculate_asset_energy_revenue.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_csd_to_meteredCompare Csd To MeteredA
Read-onlyIdempotent

Compares hourly operational Historical CSD generation (MW converted to interval MWh) against hourly settlement-metered energy (MWh) by asset. Returns matched-hour differences, percentage errors, and missing-source counts. CSD operational output and metered settlement energy are distinct source concepts.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesCompare hourly operational CSD generation with hourly metered energy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent hints. The description adds meaningful behavioral context: the MW-to-interval-MWh conversion, the matched-hour methodology, percentage errors, missing-source counts, and the explicit warning that CSD operational output and metered settlement energy are distinct source concepts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences front-load the core comparison and output, followed by a one-sentence conceptual clarification. No filler or redundancy; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers inputs, comparison logic, output contents, and source-concept distinction, and an output schema exists for return-value details. It is complete for a read-only comparison tool, though explicit sibling differentiation would make it fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with start and end timezone handling and asset_ids constraints already documented. The description contributes context like 'hourly' and 'by asset', but does not need to add much because the schema already carries the parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: compares hourly operational Historical CSD generation against hourly settlement-metered energy by asset. It also specifies what is returned (matched-hour differences, percentage errors, missing-source counts), making the tool's purpose unmistakable and distinguishing it from generic compare tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through the comparison of CSD operational output versus metered settlement energy, but no explicit when-to-use or when-not-to-use guidance is given. Given many sibling comparison tools like compare_forecast_to_actual and compare_market_periods, explicit alternatives would strengthen this dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_forecast_to_actualCompare Forecast To ActualA
Read-onlyIdempotent

Compares Alberta Internal Load forecast versus actual over [start, end) in MW. Returns mean error, MAE, RMSE, MAPE, and paired intervals. Timestamps are America/Edmonton.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesCompare Alberta Internal Load forecast versus actual over a range.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rmse_mwNo
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsNoPaired intervals (may be truncated for large ranges).
mean_error_mwNo
max_abs_error_mwNo
mean_abs_error_mwNo
observation_countYes
mean_abs_pct_errorNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond annotations by clarifying half-open interval boundaries ([start, end)) and the timezone interpretation (America/Edmonton), which materially affect how inputs are interpreted and results are produced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences front-load the core function, then list outputs and timezone context. Every clause adds value and nothing is redundant or speculative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple structure, complete parameter schemas, rich annotations, and existing output schema, the description provides sufficient context. It covers what data is compared, the interval, the units, the returned metrics, and the timezone behavior—no critical gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with start/end inclusivity and timezone handling already documented in the schema. The description's interval notation and timezone note largely restate this information, adding only minimal extra meaning such as the MW unit context for the comparison.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Compares'), the exact resource ('Alberta Internal Load forecast versus actual'), the interval semantics, units, and the expected outputs. This clearly differentiates the tool from siblings like get_forecast or get_load, and its metric-focused output distinguishes it from analyze_forecast_error.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case: when you need forecast-versus-actual error metrics over a time range. However, it does not explicitly name alternatives or state when not to use this tool, especially given closely related siblings like analyze_forecast_error and compare_market_periods.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_market_periodsCompare Market PeriodsA
Read-onlyIdempotent

Compares aggregate pool-price and load statistics between two America/Edmonton market periods. Returns averages, min/max/median prices, load stats, and deltas. Does not assert causation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesCompare aggregate pool-price and load statistics across two periods.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
period_aYesAggregate statistics for one market period.
period_bYesAggregate statistics for one market period.
warningsNo
load_avg_delta_mwNo
load_avg_pct_changeNo
price_avg_pct_changeNo
price_avg_delta_cad_per_mwhNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond the annotations by specifying the aggregate nature of the statistics, the inclusion of deltas, and the important caveat that the tool 'does not assert causation.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences. The first sentence front-loads the core action and scope, and the second adds a valuable interpretative caveat without unnecessary detail. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to explain return values. It provides the essential information needed to invoke the tool correctly: the comparison target, the market area, the statistic types, and the causal limitation. No critical information for selecting or calling the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by identifying the timezone 'America/Edmonton' and clarifying that the comparison is about pool-price and load statistics, which helps the agent understand the semantic context of the four date-time parameters even though the schema already defines their types and required status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific action: 'Compares aggregate pool-price and load statistics between two America/Edmonton market periods.' It names the exact resource and scope, and the comparison-of-two-periods framing distinguishes it from sibling tools like get_price_statistics or get_pool_prices, which do not emphasize dual-period comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a clear use case: comparing aggregate pool-price and load statistics across two distinct historical periods. It does not explicitly name alternatives or exclusions, but the context is sufficiently clear that an agent would know when to select this tool over single-period or forecast-related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_market_conditionsExplain Market ConditionsA
Read-onlyIdempotent

Returns structured evidence for market conditions in a focus window versus a baseline window (default: immediately preceding equal-length window). Includes observed metrics and associated_changes. Does not claim causation; the calling model should produce any natural-language explanation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest structured evidence for market conditions around a time window.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
focus_endYes
focus_startYes
baseline_endYes
baseline_startYes
notable_movementsYes
associated_changesYes
observed_conditionsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, open-world, and non-destructive behavior. The description adds meaningful behavioral context beyond annotations by disclosing that the tool returns observed metrics and associated_changes without asserting causation, and that the calling model must generate any natural-language explanation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each carrying distinct information: the comparison and default baseline, the output components, and the critical limitation/caveat. There is no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with a fully described schema and an output schema, the description covers the default baseline and the non-causal nature of the output. It could add a little more context about what 'market conditions' evidence is intended to support, but the output schema likely supplies that detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents request.start, request.end, and the optional baseline window. The description's mention of the default preceding equal-length baseline restates information already present in the schema (baseline_start's default), adding no new semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and resource ('structured evidence for market conditions in a focus window versus a baseline window'), clearly conveying the comparison task. It distinguishes the tool from a natural-language analyst by stating it does not claim causation, though it does not explicitly name or contrast a sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use it when structured market-condition evidence is needed and a baseline comparison is desired, with a default baseline if none is supplied. It does not enumerate exclusions or explicitly name alternatives, but the boundary between this tool and a natural-language explainer is stated via the final sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_price_eventsFind Price EventsA
Read-onlyIdempotent

Detects sustained high Pool Price events in CAD/MWh over [start, end). Threshold may be an absolute CAD/MWh value or a percentile (default 90th). Returns event boundaries, duration, peak/average price, and load context when available.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesDetect sustained high-price intervals in pool price history.

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
threshold_cad_per_mwhYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, non-destructive, idempotent behavior, so the description's job is to add context. It does so by disclosing the threshold mechanism (absolute or percentile, default 90th) and the nature of the result (event boundaries and load context when available). This adds meaningful behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The core detection behavior is front-loaded, followed by threshold semantics and the return value summary, so every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description need not enumerate return fields in detail. It covers the interval, threshold modes, default behavior, and output categories, which is sufficient for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the description does not need to compensate. It does restate the threshold alternatives and default percentile, which is helpful, but it does not add material meaning beyond the schema's already detailed parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Detects'), a clear resource ('sustained high Pool Price events'), and an explicit interval ('[start, end)'), which distinguishes it from sibling tools that return raw prices or market snapshots. It also states the output shape ('event boundaries, duration, peak/average price'), leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for detecting sustained high-price events, but it does not explicitly state when to use this tool versus alternatives such as analyze_market_event, get_price_statistics, or get_pool_prices. No exclusions or alternative routing guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_approved_transmission_outagesGet Approved Transmission OutagesA
Read-onlyIdempotent

Returns AESO-approved planned transmission outages (approval_status=approved). Omit start/end for the current public publication. Historical start/end select publication windows and are tightly bounded. Distinct from generator outages and from long-range tentative outages.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest approved transmission planned outages. Omit ``start``/``end`` for the current AESO publication. When provided, the range selects historical *publication* windows (not outage intervals) and is tightly bounded because upstream navigation walks archive pages.

Output Schema

ParametersJSON Schema
NameRequiredDescription
outagesYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
approval_statusYes
publication_timeNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds behavior beyond annotations: start/end select publication windows, not outage intervals, and lookups are tightly bounded because upstream navigation walks archive pages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with purpose first, usage second, and differentiation third. Every sentence adds information and there is no filler or redundant elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple parameter surface, rich annotations, and presence of an output schema, the description covers what the tool returns, how to request current vs historical data, and how it differs from related outage tools. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents start as optional inclusive and end as optional exclusive, and schema coverage is 100%. The description repeats this at a high level and adds the 'current public publication' and 'tightly bounded' nuance, but it doesn't carry substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Returns AESO-approved planned transmission outages (approval_status=approved)', giving a specific verb, resource, and filter. It also explicitly differentiates from generator outages and long-range tentative outages, which maps to sibling tools and prevents confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent to omit start/end for the current public publication and to use them for tightly bounded historical publication windows. It doesn't explicitly name the exact sibling tool for generator or tentative outages, so alternative routing is implied rather than fully explicit, but the usage cases are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assetsGet AssetsA
Read-onlyIdempotent

Returns AESO market asset registry records with optional filters for asset ID, pool participant, operating status, and asset type. Results may be truncated by the limit parameter.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesFilterable asset list request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
assetsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
truncatedNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The truncation caveat ('Results may be truncated by the limit parameter') adds genuine behavioral context beyond the annotations' readOnly/openWorld/idempotent hints — it warns the agent that a query may return an incomplete result set, which affects downstream reasoning. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The primary action and filter scope are front-loaded in the first sentence, and the truncation caveat earns its place in the second.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with a rich annotation profile and an output schema, the description covers purpose, filter scope, and the key truncation behavior. Minor omissions like default limit and ordering are already visible in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and property names are self-explanatory, so the baseline is 3. The description adds marginal value by mapping natural-language filters (e.g., 'pool participant') to schema parameters and noting that limit can truncate results.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Returns') and resource ('AESO market asset registry records'), and enumerates the filter dimensions. Among the ~60 sibling tools, none other targets the asset registry, so the tool is clearly distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied — use this to fetch asset registry records with optional filters — but no explicit when-to-use guidance, exclusions, or alternative tool routing is given. With many sibling tools, explicit routing would help, though the purpose is self-evident enough to infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dispatch_down_serviceGet Dispatch Down ServiceA
Read-onlyIdempotent

Returns bounded official AESO Dispatch Down Service availability publications. DDS is distinct from energy-market dispatch and metered generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest point-in-time Dispatch Down Service availability records.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
recordsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds complementary context: results are 'bounded official AESO publications', and DDS is conceptually distinct from related market data. This helps an agent interpret the data source and scope, though pagination behavior is left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. It front-loads the core return behavior, then adds a single clarifying distinction. It avoids repeating information already present in annotations or the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema fully documents the required request object, start/end semantics, timezone handling, and optional limit/offset. Annotations cover the safety and idempotency profile, and an output schema exists. The only minor ambiguity is the word 'bounded', but the limit/offset parameters and schema constraints resolve it sufficiently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% at the request parameter level, with nested start/end descriptions including timezone interpretation and limit/offset constraints/defaults. The tool description itself adds no parameter-specific meaning beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and names a precise resource ('AESO Dispatch Down Service availability publications'). It also explicitly distinguishes DDS from energy-market dispatch and metered generation, which helps the agent differentiate it from siblings like get_generation or get_metered_volumes without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for Dispatch Down Service availability data and warns against confusing it with energy-market dispatch or metered generation. However, it does not provide explicit when-to-use guidance or name an alternative tool to prefer in other cases; the usage context is suggestive rather than prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_energy_merit_orderGet Energy Merit OrderA
Read-onlyIdempotent

Returns one historical AESO Energy Merit Order report date as paginated offer blocks. Reports are released with a 60-day delay. Prices are CAD/MWh and volumes are MW; timestamps use America/Edmonton.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest one AESO report date with bounded output pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
blocksYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, open-world, and non-destructive behavior. The description adds valuable behavioral context beyond those annotations: the 60-day publication delay, the units (CAD/MWh, MW), and the timezone (America/Edmonton), which materially affect interpretating results. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, each adding necessary information: the primary purpose, the data recency constraint, and the unit/timezone context. There is no fluff or repetition of schema details, and the most important purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover side effects, the description supplies the remaining critical contextual facts: history-only scope, 60-day delay, units, timezone, and paginated offer-block format. An agent has enough to select and use the tool correctly without additional description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already fully documents report_date, limit, and offset with defaults and bounds. The description adds only general context about report units and pagination, which does not need to replace the schema's parameter documentation. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns one historical AESO Energy Merit Order report date as paginated offer blocks, which is a specific verb, resource, and scope. This distinguishes it from sibling tools like get_system_marginal_prices or get_pool_prices, which serve different market data purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is for historical merit order data, with a 60-day release delay, so agents can infer it is not for real-time queries. It does not explicitly name alternative tools or exclusions, but the historical qualifer and report type provide sufficient routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ffr_net_scheduleGet Ffr Net ScheduleA
Read-onlyIdempotent

Returns the bounded official FFR Net Schedule archive. AESO defines scheduled imports as negative and exports as positive; this is not FFR offered or dispatched.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest the bounded official FFR Net Schedule archive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is handled. The description adds genuine value beyond annotations by disclosing the AESO sign convention (imports negative, exports positive) and by drawing a boundary against offered/dispatched data, both essential for correct interpretation. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero filler: the first delivers the core purpose, the second delivers the critical sign convention and scope boundary. Content is front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema carries return-value documentation, annotations carry the safety profile, and the schema carries parameters at 100% coverage. The description supplies the one non-obvious interpretive fact (sign convention) and a scope boundary. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with start, end, limit, and offset all documented including timezone semantics for naive datetimes. The description adds no parameter-level detail beyond the schema; the word 'bounded' loosely echoes the limit/offset mechanism but contributes nothing new. Baseline 3 applies since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Returns') and a well-scoped resource ('bounded official FFR Net Schedule archive'), with qualifiers 'bounded' and 'official' pinning down scope. The explicit clarification ('this is not FFR offered or dispatched') further distinguishes it from adjacent data categories an agent might confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use conditions and no named sibling alternatives. The negative clause ('not FFR offered or dispatched') gives a partial when-not signal, but it stops short of routing the agent to the correct alternative or stating the situation in which this tool is preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_forecastGet ForecastA
Read-onlyIdempotent

Returns typed official AESO actual and forecast observations over [start, end) for AIL, Pool Price, wind, solar, or combined wind/solar where the requested source horizon exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesBounded request for an official AESO forecast series. ``horizon`` is required by current renewable files (the 12-hour and seven-day reports have different cadence and revision behaviour), while historical actual-vs-forecast files use ``historical``. The field is optional to keep callers able to request the shared AIL/pool-price series; providers choose the only valid source for those products.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only, idempotent, open-world, and non-destructive behavior. The description adds useful context beyond annotations: the half-open [start, end) interval semantics and the conditional "where the requested source horizon exists", which alerts the agent that data availability is not guaranteed. This goes beyond the annotation baseline without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that packs in the resource, scope, interval semantics, series options, and a data-availability caveat. There is no filler or unnecessary repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description provides enough orienting context for an agent to decide whether this tool fits the request. It covers what data is returned, for which series, over what interval, and notes the horizon-existence condition; return-value details are covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents the request object, start/end timezone interpretation, horizon requirements, series enum, and pagination fields. The tool description adds little parameter-level meaning beyond restating the series and interval, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, "Returns", and identifies the resource as "typed official AESO actual and forecast observations" over a defined interval. It further specifies the supported series (AIL, Pool Price, wind, solar, combined wind/solar), making it easy to distinguish from forecast-related siblings like get_operating_reserve_forecast or get_load_outage_forecast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its use for retrieving official AESO forecast/actual observations for the listed series, but it does not explicitly state when to use this tool versus alternatives. No exclusions or alternative tool names are mentioned, so the guidance relies on inference from the tool name and scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_generationGet GenerationA
Read-onlyIdempotent

Returns Alberta generation data. Omit start/end for the current fuel-mix snapshot (all fuels, MW). Provide start and end for historical wind and solar hourly generation. Renewable share uses wind + solar + hydro over total generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest generation / fuel-mix data. Without a date range, returns the current CSD fuel mix (all fuels). With a date range, returns historical wind and solar generation where available.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
snapshotNo
warningsNo
intervalsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful behavioral context: the snapshot includes all fuels in MW, historical data is hourly wind/solar, and renewable share is computed as wind + solar + hydro over total generation. Pagination and limit behavior are not mentioned but are available in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words: purpose first, then conditional usage, then a metric definition. Front-loaded and every sentence contributes to the caller's understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a nested request schema and an output schema, the description covers the key behavioral modes and the renewable-share definition. It does not explain pagination or the exact output structure, but the schema and annotations fill those gaps, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the nested request schema already explains the two date-range modes. The description enhances this by explicitly telling the user to omit or provide start/end and by defining the renewable-share calculation. Limit and offset are left to schema defaults, which is acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Returns Alberta generation data') and clearly distinguishes the two operating modes: current fuel-mix snapshot vs historical wind/solar hourly generation. This makes it separable from sibling tools like get_generation_capacity or analyze_generation_mix without needing to inspect them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit, actionable usage guidance: omit start/end for the current fuel-mix snapshot, and provide them for historical wind and solar generation. It does not explicitly contrast with sibling tools such as get_historical_generation, but the parameter-based conditions are unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_generation_capacityGet Generation CapacityA
Read-onlyIdempotent

Returns hourly AIES maximum and available generation capability plus operating and mothball outages by fuel class. The inclusive date range is bounded to 31 days; values are MW and output is paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest an inclusive AESO report-date range with bounded output pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description goes further by adding the inclusive 31-day date bound, MW units, hourly granularity, fuel-class breakdown, and paginated output, all of which are meaningful operational details beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundant phrasing. The core return value is stated first, followed by key operational constraints (date bound, units, pagination). Every phrase contributes to the agent's understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and annotations, the description supplies the necessary operational context: data resolution (hourly), scope (AIES), content (capacity and outages by fuel class), date restriction (31 days), units (MW), and pagination. Nothing critical for correct invocation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description already covers 100% of parameters, including the request object description of an inclusive report-date range with bounded pagination. The description adds value by explicitly stating the 31-day maximum inclusive range and confirming that output is paginated, which directly relates to start_date, end_date, limit, and offset semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific verb ('Returns'), a specific resource ('hourly AIES maximum and available generation capability plus operating and mothball outages by fuel class'), and clarifies units and pagination. It is clearly distinguishable from sibling tools like get_generation or get_outages because it focuses on capacity capability rather than actual generation or general outages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear context of what data is returned (capacity and outage status by fuel class) and constraints (31-day limit, MW, paginated), so an agent can infer when it is appropriate. However, it does not explicitly state when to prefer this tool over alternatives such as get_generation, get_outages, or get_historical_generation, nor does it mention exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historical_generationGet Historical GenerationA
Read-onlyIdempotent

Returns official AESO CSD individual-asset generation over [start, end), at hourly or five-minute resolution. Supports bounded asset/fuel filters and pagination. This operational CSD archive is not settlement-metered data.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRetrieve individual-asset CSD generation from the AESO archive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: the '[start, end)' half-open interval, the timezone-naive interpretation as America/Edmonton market time, the optional refresh behavior, and the caveat that the archive is not settlement-metered data. These go beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first packs the core semantics (resource, interval, resolution, filters, pagination), and the second adds a critical caveat. Every clause earns its place, and the key constraints are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich schema, output schema, and annotations, the description covers the essential operational semantics: interval bounds, resolution choice, filtering, pagination, and the non-settlement caveat. Minor gaps like pagination details and the refresh mechanism's behavior are not fully explained, but the schema and output schema already carry much of that load.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents parameters thoroughly. The description adds semantic value by explaining that filters are bounded ('Bounded asset/fuel filters'), that the interval is half-open, and that the data is operational CSD not settlement-metered. This is enough to elevate above the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), a specific resource ('AESO CSD individual-asset generation'), a precise interval semantics ('[start, end)'), and two resolution options. It also distinguishes this from settlement-metered data, which helps differentiate it from sibling tools like get_csd_to_metered.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for historical official CSD generation queries and notes that this archive is not settlement-metered, giving a useful exclusion. It doesn't explicitly name sibling alternatives like compare_csd_to_metered or summarize_market_history, but the interval and filter scope make the usage context reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historical_store_statusGet Historical Store StatusA
Read-onlyIdempotent

Reports local DuckDB/Parquet coverage, detected cadence gaps, source-file and partition counts, schema version, and whether optional storage dependencies are installed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
enabledYes
datasetsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
store_pathYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds valuable behavioral context by specifying exactly what diagnostic information is reported (coverage, cadence gaps, counts, schema version, dependency checks), which goes beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose ('Reports local DuckDB/Parquet coverage') and then efficiently enumerates each reported item. Every clause earns its place without any redundant wording or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter status-reporting tool with an output schema present, this description is complete. It covers all relevant dimensions of the tool's behavior—coverage, gaps, counts, schema version, and dependency checks—and the output schema handles return-value details, so no necessary information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the input schema is empty, so the baseline of 4 applies. The description doesn't need to explain parameter semantics since there are none, and the schema coverage is already 100%, leaving nothing undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific reporting verb and names the exact resource ('local DuckDB/Parquet coverage') plus a detailed list of what it reports, including cadence gaps, counts, schema version, and dependency status. This clearly differentiates it from sibling data retrieval tools like get_historical_generation, which report market data rather than storage health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when this tool should be used: whenever an agent needs to assess the completeness or health of the local historical data store, such as before running sync_historical_store. It provides clear context for the tool's purpose, though it does not explicitly name alternatives or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_interchangeGet InterchangeA
Read-onlyIdempotent

Returns current Alberta interchange flows by path in MW, including net interchange. Positive/negative path signs follow AESO Current Supply Demand conventions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
observed_atYes
net_interchange_mwYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description is not responsible for side-effect disclosure. It adds meaningful behavioral context by explaining the AESO sign convention and that results are current flows, going beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. The first states the core purpose and measurement unit; the second adds the sign convention. No wasted words or redundant schema repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema, this description is complete. It specifies the resource, units, temporal scope, and a key interpretive detail. Nothing else is needed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema fully covers input semantics. The description's mention of 'by path' refers to output granularity, not a parameter, so no additional parameter guidance is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns current Alberta interchange flows by path in MW and includes net interchange. It also specifies the sign convention, distinguishing it from intertie capability and outage tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives like get_intertie_capability or get_intertie_outages. The description implies current flow retrieval but does not state exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_intertie_capabilityGet Intertie CapabilityA
Read-onlyIdempotent

Returns hourly import/export ATC, TTC, reliability margins, and gross offers for AESO interties and flowgates. Supports hour-ending bounds and optional versioned reports; date ranges are limited to 100 days and output is paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest hourly intertie capability, optionally including revision history.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's added value lies in disclosing operational constraints: hour-ending bounds, versioned reports, 100-day date range limit, and paginated output. These go beyond the annotations and help the agent anticipate response size and filtering behavior, though it does not detail error handling or exact response structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero filler. The first sentence front-loads the core purpose and data content; the second efficiently covers operational constraints. Every phrase provides information needed for correct invocation, making it an ideal size for an agent-facing tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and thorough annotations, the description adequately covers the essential operational context: data type, constraints, and pagination. It does not explicitly address when to use this tool versus sibling tools, but the detailed resource scope makes the use case reasonably clear. A small gap remains around differentiating from related intertie tools, but this is not critical for basic invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While schema description coverage is high and defaults/min/max exist, the tool description adds meaning by translating 'hour-ending bounds' to the start_hour_ending/end_hour_ending parameters, 'optional versioned reports' to include_versions, and 'paginated' to limit/offset. This clarifies how the nested parameters are intended to be used, which is not obvious from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns') and a clear resource ('hourly import/export ATC, TTC, reliability margins, and gross offers for AESO interties and flowgates'). This is far more specific than the tool name and clearly defines the scope of data returned, distinguishing it from likely siblings like get_interchange or get_intertie_outages by its precise data content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool through its detailed resource and data output, but does not provide explicit guidance on when to prefer it over alternatives or when not to use it. It mentions constraints like the 100-day limit and pagination, which affect usage, but does not name alternative tools or exclusion criteria, leaving usage decisions to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_intertie_outagesGet Intertie OutagesA
Read-onlyIdempotent

Returns outages affecting AESO interties or flowgates for an inclusive date range. Includes affected paths and event boundaries in America/Edmonton; output is paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest an inclusive AESO report-date range with bounded output pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
outagesYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context by stating output is paginated and that affected paths and event boundaries are reported in America/Edmonton timezone. This goes beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence front-loads the action and scope, then appends output details and pagination. There is no filler or redundancy, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one nested parameter, a rich output schema, and strong annotations, the description covers the core purpose, domain, timezone, and pagination behavior. The only minor gap is the lack of explicit differentiation from the many sibling outage-related tools, but the 'interties or flowgates' scope makes the intended use clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers parameter semantics at 100% with the request description 'inclusive AESO report-date range with bounded output pagination.' The tool description repeats the ideas of 'inclusive' and 'paginated' but does not add new parameter-level meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Returns'), resource ('AESO interties or flowgates'), and scope ('inclusive date range'). The description also mentions affected paths and event boundaries, adding precision beyond the title. It does not explicitly distinguish itself from siblings like get_outages, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies its use case: retrieving outages that affect interties/flowgates. However, it offers no direct guidance about when to choose this over alternative outage tools such as get_outages or get_approved_transmission_outages. The inclusive date range and pagination are operational details rather than usage conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_loadGet LoadA
Read-onlyIdempotent

Returns Alberta Internal Load (AIL) observations in MW for [start, end). Optionally includes load forecast values when available. Timestamps are America/Edmonton. Maximum range: 90 days.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest Alberta Internal Load (AIL) observations.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context beyond that: exact interval semantics, timezone handling, a 90-day maximum range, and the caveat that forecast values are included only 'when available'. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, and every sentence adds necessary information: units, interval, timezone, maximum range, and optional forecast inclusion. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward read-only data retrieval tool, the description plus rich schema and annotations cover what an agent needs to call it correctly: interval semantics, timezone, range limit, and optional behavior. Output schema exists, so return structure does not need to be described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already document start/end inclusivity and timezone interpretation, and include_forecast is explained. The description mostly restates these semantics rather than adding new meaning. Limit and offset are not described in the description, but their defaults and bounds are clear from schema metadata, so the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Returns Alberta Internal Load (AIL) observations in MW'. Clearly defines the data type, unit, and interval [start, end), making the tool distinguishable from related market and generation tools even without naming a sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving AIL observations, with interval and forecast inclusion guidance, but it does not explicitly state when to prefer this over sibling tools like get_forecast or get_load_outage_forecast. No exclusions or alternatives are given, so usage context is clear but selection guidance is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_load_outage_forecastGet Load Outage ForecastA
Read-onlyIdempotent

Returns AESO hourly load-outage forecast observations in MW for an inclusive, maximum 31-day range. Timestamps use America/Edmonton and output is paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest an inclusive AESO report-date range with bounded output pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds valuable behavioral context beyond those: the data is hourly, in MW, the date range is inclusive and capped at 31 days, timestamps use America/Edmonton, and output is paginated. These are exactly the kind of operational details annotations don't convey, so the description meaningfully supplements them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. The first sentence front-loads what the tool returns, the unit, and the range; the second covers timezone and pagination. Every piece of information is essential for calling the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description is nearly complete. It covers the critical constraints an agent must know: inclusive dates, 31-day max, timezone, and pagination. The only minor gap is the behavior when the range exceeds 31 days (whether it errors or truncates), but this is not crucial because the cap is explicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description covers 100% of parameters (100% coverage), so baseline is 3. The description adds meaning beyond the schema by explaining that start_date and end_date form an inclusive range capped at 31 days, and that pagination applies (aligned with limit/offset). This directly enriches the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Returns', the resource 'AESO hourly load-outage forecast observations in MW', and the date range constraint, which is specific and distinguishes this from generic tools like get_load or get_outages. However, it does not explicitly name a sibling tool or contrast itself with alternatives, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus the many sibling tools (e.g., get_load, get_outages, get_forecast). It does not mention conditions, exclusions, or alternatives, leaving the agent to infer the use case from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_long_range_transmission_outagesGet Long Range Transmission OutagesA
Read-onlyIdempotent

Returns Long Range Significant Transmission Outages covering ~24 months ahead. Entries may be tentative and not AESO-approved (approval_status=tentative). Do not confuse with get_approved_transmission_outages.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest the current Long Range Significant Transmission Outages publication.

Output Schema

ParametersJSON Schema
NameRequiredDescription
outagesYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
approval_statusYes
publication_timeNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description doesn't need to restate those. It adds useful context beyond annotations: the ~24-month forward-looking horizon and the fact that entries may be tentative with approval_status=tentative and not AESO-approved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The core function and key caveat are front-loaded, and the sibling disambiguation is placed at the end without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover safety/idempotency, the description supplies the remaining essential selection context: temporal horizon, tentative approval status, and sibling differentiation. Nothing critical for an agent to call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single parameter's description already explains that long-range reports are tentative/coordination listings and that only the current publication is supported. The tool description adds no further parameter-specific detail, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns'), names the exact resource ('Long Range Significant Transmission Outages'), and adds a temporal scope (~24 months ahead). It also distinguishes itself from the sibling get_approved_transmission_outages by flagging the tentative, non-AESO-approved nature of the data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly warns not to confuse this tool with get_approved_transmission_outages, providing a clear exclusion and identifying the alternative. It conveys that this tool is for tentative, not-yet-approved long-range outages, though it doesn't fully spell out when the approved tool should be preferred beyond the name and contrast.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_snapshotGet Market SnapshotA
Read-onlyIdempotent

Returns a cohesive current-state view of the Alberta electricity market including recent pool price, system marginal price, Alberta Internal Load, generation by fuel, net interchange, and operating reserves. Units: prices CAD/MWh, power MW. Timezone: America/Edmonton.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
observed_atYes
renewable_shareNo
interchange_pathsNo
generation_by_fuelNo
net_interchange_mwNo
wind_generation_mwNo
solar_generation_mwNo
total_generation_mwNo
pool_price_cad_per_mwhNo
alberta_internal_load_mwNo
contingency_reserve_required_mwNo
system_marginal_price_cad_per_mwhNo
dispatched_contingency_reserve_total_mwNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description adds value by explaining that the view is 'cohesive' and 'current-state', and by specifying units (CAD/MWh, MW) and timezone (America/Edmonton). It does not define exactly how 'recent' is measured, but the output schema mitigates that gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with two sentences that state the core purpose, enumerate included data, and add units and timezone. Every sentence earns its place with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a zero-parameter snapshot tool with an output schema, so the description is complete for invocation. It names the market and geographic scope, lists the major bundled metrics, and provides essential interpretation details such as units and timezone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so there are no parameter semantics for the description to clarify. The baseline for no-parameter tools is satisfied, and the description appropriately focuses on output content instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and names a precise resource ('Alberta electricity market'), then enumerates the metrics included, such as pool price, system marginal price, Alberta Internal Load, generation, net interchange, and operating reserves. This clearly distinguishes it from the granular sibling getters by positioning it as a cohesive current-state snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this tool for a cohesive current-state view of multiple market metrics at once. It does not explicitly name alternatives or say when not to use it, but the snapshot framing makes the use case obvious relative to the granular sibling tools like get_pool_prices or get_generation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_metered_volumesGet Metered VolumesA
Read-onlyIdempotent

Returns hourly AESO metered energy in MWh by asset. Filter by up to 20 asset IDs or 20 pool-participant IDs (not both); unfiltered requests are limited to 16 days and all output is paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest metered volumes, optionally filtered by assets or participants.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses the mutual exclusivity of filters, the 16-day limit on unfiltered requests, and pagination behavior. These are non-obvious execution traits the agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The main result is front-loaded, and constraints are packed efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With output schema and rich annotations present, the description covers essential invocation details: unit, granularity, filter constraints, date-window limitation, and pagination. Nothing critical is missing for an agent to select and call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the request object with property names and limits, so baseline is 3 at high coverage. The description adds semantic meaning by clarifying that asset_ids and pool_participant_ids cannot be combined and that omitting filters restricts the date window.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns') and resource ('hourly AESO metered energy in MWh by asset'), making it easy to distinguish from sibling tools like get_load or get_generation. The unit and granularity are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: filters can be up to 20 asset IDs or pool-participant IDs but not both, unfiltered requests are limited to 16 days, and output is paginated. It does not explicitly name alternative tools or conditions for choosing them, so a full score is not warranted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_monthly_cumulative_net_revenueGet Monthly Cumulative Net RevenueA
Read-onlyIdempotent

Returns the current AESO Monthly Cumulative Settlement Interval Net Revenue (MCSINR) public report. Includes cumulative CAD vs 1/6 annualized unavoidable costs and whether the secondary offer price limit trigger has been reached. Timestamps: America/Edmonton hour-ending intervals.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest the current market-power mitigation public reports.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes
report_timeNo
headroom_to_trigger_cadNo
latest_cumulative_net_revenue_cadNo
secondary_offer_price_limit_triggeredNo
one_sixth_annualized_unavoidable_costs_cadNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds useful behavioral context: the report is the current public report, includes cumulative CAD vs 1/6 annualized unavoidable costs, includes the trigger status, and uses America/Edmonton hour-ending interval timestamps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The first sentence identifies the tool's output; the second adds content and timezone details. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter schema, the existing output schema, and the comprehensive annotations, the description is nearly complete. It clearly identifies what is returned and key formatting details. It lacks explicit usage-scenario guidance, but that is a relatively minor gap for this read-only report tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add anything about the 'request' or 'current_only' parameters beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Returns'), a specific resource ('AESO Monthly Cumulative Settlement Interval Net Revenue (MCSINR) public report'), and clarifies the report's key contents. This makes it easy to distinguish from the many sibling market-report tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives. For example, it mentions the secondary offer price limit trigger, but does not direct agents to a dedicated sibling tool like get_secondary_offer_price_limit when that is the only needed value.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_operating_reserve_activationsGet Operating Reserve ActivationsA
Read-onlyIdempotent

Returns hourly standby operating-reserve activation volume and volume-weighted activation price for an inclusive market-date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose read-only, idempotent, open-world, and non-destructive behavior. The description adds useful semantics like 'inclusive market-date range' and 'hourly', but it does not go into potential pagination behavior or data availability, which is acceptable given the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes meaning, making it appropriately concise for this tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema and annotations cover return shape and safety/idempotence, while the description provides the important inclusive-market-date-range semantics. It does not explain how to choose this tool over siblings or describe optional filters, but those are discoverable from the schema, so the definition is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It clarifies that the date range is inclusive and market-date based, but says nothing about reserve_types, limit, or offset. This is only partial compensation for the missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), the resource ('standby operating-reserve activation volume' and 'volume-weighted activation price'), granularity ('hourly'), and the date-range scope. This clearly distinguishes it from sibling tools like get_operating_reserve_prices and get_operating_reserve_forecast by focusing on activations rather than prices or forecasts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance about when to use this tool versus sibling alternatives. An agent must infer from the name and wording that it is about activations, and no conditions, exclusions, or alternative tool references are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_operating_reserve_forecastGet Operating Reserve ForecastA
Read-onlyIdempotent

Returns the current public seven-day hourly forecast of active and standby regulating, spinning, and supplemental operating-reserve volumes in MW.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, and the description adds valuable context: data is current, public, seven-day, hourly, reported in MW, and covers active and standby volumes. It does not describe pagination or public-api limis, but no annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no filler. It front-loads the action and most important scope facts, making every phrase informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With rich annotations, an output schema, and only one nested input parameter, the description conveys the essential data scope well. It could be more complete about request-field semantics and sibling differentiation, but the schema and annotation context make the tool callable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description only names the reserve types, which are already shown in the schema enum. It does not explain the required 'request' container or the limit/offset pagination controls, so the description fails to compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Returns' and clearly identifies the resource: a current public seven-day hourly forecast of active and standby regulating, spinning, and supplemental operating-reserve volumes in MW. It is specific and easily understood, though it does not explicitly distinguish itself from siblings like get_reserves or get_operating_reserve_prices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The terms 'forecast' and 'seven-day' imply use for near-term forecasted reserve volumes, but the description provides no explicit when-to-use or when-not-to-use guidance. It does not mention that get_operating_reserve_prices or get_operating_reserve_actives should be used for prices or actual activations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_operating_reserve_offer_controlGet Operating Reserve Offer ControlA
Read-onlyIdempotent

Returns one historical AESO Operating Reserve Offer Control report date as paginated blocks. Reports are released with a 60-day delay; prices are CAD/MWh, volumes are MW, and timestamps use America/Edmonton.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest one AESO report date with bounded output pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
blocksYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds valuable beyond-annotation context: the 60-day delay, units (CAD/MWh and MW), timezone (America/Edmonton), and paginated delivery, which help the agent interpret results and set expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the action and resource, then packs essential constraints (delay, units, timezone, pagination) into the remaining sentence. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, rich annotations, and a single required parameter, the description covers the key operational constraints: historical scope, delay, units, timezone, and pagination. A minor gap is that it does not define what 'Operating Reserve Offer Control' means, but the title and sibling context provide enough orientation for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the request object description already explains bounded output pagination. The main tool description adds units and timezone but does not add parameter-specific semantics beyond what the schema already documents; the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Returns'), a specific resource ('one historical AESO Operating Reserve Offer Control report date'), and a distinguishing behavior ('as paginated blocks'). It is easily distinguishable from sibling operating reserve tools, which cover prices, forecasts, or activations rather than offer control report dates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for historical report dates and notes the 60-day release delay, giving useful context about when data will be available. However, it does not explicitly state when to prefer this tool over alternatives such as get_operating_reserve_prices or get_operating_reserve_forecast, nor does it mention any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_operating_reserve_pricesGet Operating Reserve PricesA
Read-onlyIdempotent

Returns daily active and standby operating-reserve price components and volumes by regulating, spinning, or supplemental product and time block. Active price, standby premium, activation strike, and clearing blended price remain distinct.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behaviors, so the bar is lower. The description adds useful interpretive context: that active price, standby premium, activation strike, and clearing blended price remain distinct. This prevents an agent from incorrectly aggregating or conflating these components.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry exactly the needed information: the first defines the scope and outputs, the second clarifies an important semantic distinction. There is no wasted wording or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and rich annotations, the description covers the core domain and return semantics, but lacks usage guidance and pagination behavior. It also does not specify allowed date ranges or timezone conventions, which an agent would need for correct invocation. It is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter documentation. It references the reserve_types enum values ('regulating, spinning, or supplemental') and 'time block' which loosely maps to start_date/end_date and the product dimension. However, it does not explain the request wrapper, limit/offset pagination, or date format, leaving a meaningful gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns') and resource ('operating-reserve price components and volumes') and identifies the key dimensions (regulating/spinning/supplemental product, time block, active versus standby). This makes it clearly distinguishable from siblings like get_operating_reserve_activations, get_operating_reserve_forecast, and summarize_operating_reserve_market.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance about when to use this tool versus alternatives. The description implies it is for daily reserve price data, but it does not mention exclusions, preferred scenarios, or sibling tools. An agent would have to infer usage from the resource name and content.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_outagesGet OutagesA
Read-onlyIdempotent

Returns hourly AESO generator outage capacity by technology/fuel for [start, end) (Total Outage MW plus per-fuel components). Timestamps: America/Edmonton. For transmission planned outages use get_approved_transmission_outages or get_long_range_transmission_outages.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest hourly generator outage capacity by fuel/technology.

Output Schema

ParametersJSON Schema
NameRequiredDescription
outagesYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds valuable behavioral context beyond annotations: hourly granularity, half-open interval semantics, timezone (America/Edmonton), and that the response is a total with per-fuel breakdowns. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences deliver the essential purpose, interval behavior, timezone, and routing to alternatives. Every clause earns its place, and the most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, annotations cover safety traits, and the parameter schema documents the two inputs completely, the description adds the remaining needed semantics (hourly aggregation, interval boundaries, per-fuel components, timezone, and sibling differentiation). Nothing critical is missing for an agent to select and call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and both parameters already have thorough descriptions including timezone handling and inclusive/exclusive semantics. The description reinforces hourly interval behavior but does not need to add parameter-level detail; the schema does the heavy lifting, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Returns'), a precise resource ('hourly AESO generator outage capacity by technology/fuel'), and the interval semantics ('[start, end)'). It also clarifies the output composition ('Total Outage MW plus per-fuel components'), which makes the tool's purpose unambiguous and distinct from the transmission outage tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use alternatives: 'For transmission planned outages use get_approved_transmission_outages or get_long_range_transmission_outages.' This directly differentiates generator outages from transmission outages, giving an agent clear routing guidance without needing to inspect sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pool_pricesGet Pool PricesA
Read-onlyIdempotent

Returns actual AESO hourly Pool Price observations in CAD/MWh for the requested market interval [start, end). Use get_system_marginal_prices for minute-level real-time pricing. Timestamps are America/Edmonton. Maximum range: 366 days.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest hourly Alberta Pool Price observations.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description does not need to repeat those. It adds valuable context: data is actual observed hourly Pool Price (not forecast), timestamps are America/Edmonton, and the range is capped at 366 days.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each carrying necessary information: what is returned, how to choose the sibling, and the key time/range constraints. No filler or redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description covers all practical call constraints: timezone, range limit, interval semantics, and unit. The alternative-tool guidance closes the main ambiguity among siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 even without description-level parameter detail. The description adds meaning beyond the schema by specifying units (CAD/MWh), the [start, end) interval convention, timezone handling, and the maximum allowed range, which helps agents set correct parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and identifies the exact resource: actual AESO hourly Pool Price observations in CAD/MWh over a market interval [start, end). It names the sibling tool get_system_marginal_prices as the distinct alternative, so an agent can differentiate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs when to use the sibling: 'Use get_system_marginal_prices for minute-level real-time pricing.' It also states a hard constraint (maximum range 366 days) that governs when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_price_duration_curveGet Price Duration CurveA
Read-onlyIdempotent

Returns an evenly sampled Pool Price duration curve sorted from highest to lowest with exceedance percentages over [start, end).

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pointsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
observation_countYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable behavioral detail beyond annotations: the curve is evenly sampled, sorted descending, includes exceedance percentages, and operates over a half-open interval [start, end).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One crisp sentence delivers the core behavior, ordering, sampling, and interval semantics without wasted words. It is front-loaded with the action and resource, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, output schema, and nested property descriptions, the description covers the essential behavior well. The main gap is usage guidance relative to similar market-price tools, but the operational contract is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for explaining parameters. It only restates the interval boundary behavior already present in the schema's start/end descriptions and does not explain the 'points' parameter, its default, or how it affects the evenly sampled output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the exact resource ('Pool Price duration curve') and states the verb 'Returns', along with key output traits: evenly sampled, sorted highest to lowest, and exceedance percentages. This distinguishes it from sibling price-related tools like get_pool_prices or get_price_statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool returns but gives no guidance on when to choose it over alternative tools or when it would be inappropriate. No exclusions, prerequisites, or sibling distinctions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_price_statisticsGet Price StatisticsA
Read-onlyIdempotent

Calculates count, mean, median, range, population standard deviation, negative/high price hours, and requested percentiles from complete hourly Pool Price observations.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
percentilesYes
observation_countYes
median_cad_per_mwhNo
average_cad_per_mwhNo
maximum_cad_per_mwhNo
minimum_cad_per_mwhNo
negative_price_hoursNo
standard_deviation_cad_per_mwhNo
hours_at_or_above_100_cad_per_mwhNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as read-only, open-world, and idempotent. The description adds valuable behavioral specifics: it computes population standard deviation (not sample), includes negative/high price hours, and supports requested percentiles. The 'complete observations' phrasing also hints at a data-completeness assumption, which is useful context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence that front-loads the action and resource. Every listed statistic is relevant and contributes to understanding the tool's output. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity of a nested request object and 0% schema description coverage, the description does not fully equip an agent to correctly structure the call. The output schema and annotations cover returns and safety, but the tool's core trigger parameters (start, end, percentiles) are only vaguely alluded to. Overall, it is minimally viable but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description must compensate, but it only hints at one parameter ('requested percentiles') and provides no meaning for the request object's start/end properties or how percentiles should be formatted. It does not explain that the request must contain a time interval, leaving a significant gap for an agent constructing input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Calculates' with a clear resource ('complete hourly Pool Price observations') and enumerates the exact statistics produced. This clearly distinguishes it from sibling tools like get_pool_prices or get_price_duration_curve, which focus on raw data or distribution shapes rather than aggregate statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given on when to prefer this tool over alternatives. The phrase 'complete hourly Pool Price observations' implies a data-completeness requirement, but it does not state when to use this versus get_price_duration_curve, find_price_events, or other statistical tools. There are no exclusions or alternative references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reservesGet ReservesA
Read-onlyIdempotent

Returns current AESO operating reserve indicators in MW, including contingency reserve required/dispatched and fast frequency response volumes when published.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
observed_atYes
long_lead_time_volume_mwNo
contingency_reserve_required_mwNo
fast_frequency_response_offered_mwNo
dispatched_contingency_reserve_gen_mwNo
fast_frequency_response_dispatched_mwNo
dispatched_contingency_reserve_other_mwNo
dispatched_contingency_reserve_total_mwNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context by noting that data is current, expressed in MW, and only available 'when published.' This goes beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single purposeful sentence. It front-loads the core result and then adds the most important scope qualifier ('when published') without any filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple parameterless read-only tool with an output schema, the description covers the essential information: what data is returned, the units, the current-time scope, and the publication dependency. No critical calling context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the parameter documentation burden is minimal. The description still adds useful context about units and data contents, which is more than required given the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it returns current AESO operating reserve indicators in MW. It further names exact contents (contingency reserve required/dispatched and fast frequency response volumes), which clearly differentiates it from sibling tools focused on prices, forecasts, or activations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: this tool is for current operating reserve indicators, not forecasts, activations, or prices. The phrase 'when published' also signals timing constraints. It does not explicitly name alternatives or exclusion conditions, but the context is strong enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_secondary_offer_price_limitGet Secondary Offer Price LimitA
Read-onlyIdempotent

Returns the current AESO Secondary Offer Price Limit public report: whether the secondary offer cap is in effect and the CAD/MWh limit when posted. A null limit means the cap is not in effect.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest the current market-power mitigation public reports.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes
report_timeNo
limit_in_effectNo
secondary_offer_price_limit_cad_per_mwhNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral context beyond annotations: it defines the meaning of a null limit (cap not in effect) and frames this as the current public report. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words: the operation and resource are front-loaded, and the null-limit clarification is concise and valuable. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only report with an output schema and rich annotations, the description and schema together fully specify what is returned and how to interpret it. The current-only constraint is captured in the schema, and the null semantics are explained in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for the `request` object and `current_only` field, so the schema already documents the parameters. The description adds no parameter-level detail, but none is needed given the schema's clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource ('AESO Secondary Offer Price Limit public report') and a concrete verb ('Returns'), then specifies the exact content: whether the cap is in effect and the CAD/MWh limit when posted. It also clarifies the null-limit meaning, which distinguishes this tool from the broad sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance or alternative routing is provided; the description simply states what the tool returns. Use is implied by the tool's highly specific subject matter rather than contrasted with siblings, so it is adequate but not directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_supply_adequacyGet Supply AdequacyA
Read-onlyIdempotent

Returns the official AESO hourly Supply Adequacy and Market Supply Cushion status bands. These published categorical metrics are distinct from the derived assess_supply_tightness screening label.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesOptional filter for the current seven-day adequacy publication.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds context about the source ('AESO'), granularity ('hourly'), and categorical nature of the data, but it does not describe operational behavior such as date range restrictions or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, each earning its place: the first defines the tool's output precisely, and the second disambiguates it from a sibling. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, output schema, and clear sibling distinction, the description is sufficient for an agent to understand what this read-only tool returns and how it differs from related tools. The current-seven-day scope is covered in the schema, so the description doesn't need to repeat it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already carries descriptive weight. The request parameter description ('Optional filter for the current seven-day adequacy publication') adds useful context about scope, but individual sub-parameters like start, end, limit, and offset have no description beyond their schema constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Returns') and resource ('official AESO hourly Supply Adequacy and Market Supply Cushion status bands'). It also explicitly separates this tool from the derived assess_supply_tightness screening label, which distinguishes it from a key sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context by identifying the output as official published categorical metrics and contrasting them with the derived assess_supply_tightness label. It does not explicitly say 'use this when...' or 'use assess_supply_tightness instead for...', but the distinction offers practical routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_supply_surplusGet Supply SurplusA
Read-onlyIdempotent

Returns official AESO hourly Supply Surplus status observations. Zero-price states are forecasts/statuses; they are not inferred from observed Pool Price.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesOptional filter for the current supply-surplus status publication.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, open-world, and non-destructive behavior, lowering the description's burden. The description adds a valuable behavioral disclosure: zero-price states must be interpreted as forecast/status values, not as inferences from observed Pool Price. This prevents a likely misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff; the first is front-loaded with verb and resource, and the second carries an essential caveat. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema is present, so return-value details are not the description's job; annotations cover safety and idempotence; the schema covers filtering/pagination. The description supplies the one non-obvious semantic caveat, giving an agent enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high; the request wrapper has a descriptive comment and nested parameters carry defaults/constraints. The description adds 'hourly' and 'official' context but does not explain start/end/limit/offset semantics beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Returns'), a concrete resource ('official AESO hourly Supply Surplus status observations'), and adds a scoping caveat (zero-price states are forecasts/statuses, not inferred from Pool Price). This distinguishes it from price-derived siblings such as get_pool_prices and from analysis-oriented tools like analyze_supply_surplus_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrasing implies use when official AESO Supply Surplus status observations are needed, and the pool-price caveat hints that this is not a price-inference tool. However, it does not explicitly say when to prefer this over siblings such as analyze_supply_surplus_events, nor does it give when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_eventsGet System EventsA
Read-onlyIdempotent

Returns bounded official AIES Event Log messages with a deterministic descriptive classification. Raw published comments remain authoritative and no event end is inferred.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest bounded AIES Event Log entries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
recordsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, the description adds substantial behavioral nuance: messages are 'official' and 'bounded', the classification is 'deterministic', raw published comments remain authoritative, and no event end is inferred. This communicates data provenance and interpretation caveats that annotations do not capture, and it does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the primary function in the first and the key caveats in the second. Every clause carries meaningful information, and there is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, rich annotations, and schema-described start/end parameters. The description adds the missing behavioral guarantees around data authority and event-end inference. Together, these give an agent everything needed to decide whether and how to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high for the top-level request parameter, and start/end carry timezone semantics in the schema itself. The description adds no parameter-level detail beyond that, which is acceptable given the schema already documents the important interval semantics. Limit and offset have no inline description, but their constraints and defaults are present in the schema, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Returns bounded official AIES Event Log messages'. It also adds a distinguishing behavior, 'deterministic descriptive classification', which tells an agent exactly what kind of data this tool returns and how it differs from the large set of sibling tools that fetch prices, loads, or generation data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives like analyze_market_event or find_price_events. The description does not mention when not to use it, what problems it is best suited for, or which sibling would be more appropriate for related event analysis. An agent must infer usage context entirely from the tool name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_marginal_pricesGet System Marginal PricesA
Read-onlyIdempotent

Returns AESO System Marginal Price (SMP) observations in CAD/MWh with minute-level interval boundaries for [start, end). Prefer get_pool_prices for hourly settlement prices. Timestamps are America/Edmonton. Maximum range: 7 days.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest minute-level System Marginal Price (SMP) observations.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate those. It adds meaningful behavioral context beyond annotations: timestamps are in America/Edmonton, intervals are [start, end) with minute-level boundaries, and requests are limited to a 7-day range.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core purpose, then provides sibling differentiation, timezone, and range constraints, all of which are directly useful for invoking the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only data retrieval tool with a rich output schema and strong annotations, the description covers everything needed: what is returned, units, interval semantics, timezone, maximum range, and how to route to a sibling tool. No critical behavioral information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning by clarifying the inclusive/exclusive interval semantics, the timezone interpretation, and the maximum range constraint, which supplements the schema's parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), a specific resource ('AESO System Marginal Price observations'), and clarifies the units (CAD/MWh) and interval semantics ([start, end)). It also differentiates from the closely related sibling get_pool_prices, so an agent can reliably distinguish this tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to prefer get_pool_prices when hourly settlement prices are needed, which provides a clear selection rule between the two most similar tools. It also states the timezone and maximum supported range, giving practical constraints for valid usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tmr_reference_priceGet Tmr Reference PriceA
Read-onlyIdempotent

Returns the official AESO Transmission Must-Run reference price by effective date; the published value is returned without independent recomputation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesOptional date filter for the monthly TMR reference-price report.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
recordsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, openWorld, idempotent, and non-destructive behavior. The description adds meaningful context beyond those annotations: it returns the published AESO value 'without independent recomputation,' which tells the agent that the tool is authoritative and passthrough rather than calculated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the resource, scope, and a key behavioral trait without wasted words. It earns its place and avoids redundancy with the title and schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with a rich output schema, complete parameter schema coverage, and strong annotations, gives an agent everything needed to invoke this tool correctly. The monthly and effective-date context is clear, and the absence of return-value detail is acceptable because an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the request object and its date-filter purpose. The tool description adds the 'by effective date' framing but does not elaborate on limit/offset or date formats; with full schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), a specific resource ('official AESO Transmission Must-Run reference price'), and the key scoping dimension ('by effective date'). It is distinct from all siblings, which target different market data, and it clarifies that the value is the published official value rather than a recomputed estimate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving the official TMR reference price, but it does not explicitly state when to prefer this tool over alternatives or mention any exclusion criteria. The monthly report context in the schema provides some usage signal, but there is no direct when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_uc_settlement_summaryGet Uc Settlement SummaryA
Read-onlyIdempotent

Returns the public AESO hourly Unit Commitment settlement amount in CAD and charged volume in MW for an inclusive market-date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRetrieve public UC settlement summary observations for a date range.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
intervalsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds meaningful context beyond those: the data is public, hourly-grained, inclusive of the provided dates, and returns settlement amount plus charged volume. It does not detail pagination or timezone, but the annotations and output schema reduce the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, compact sentence that front-loads the core result, granularity, units, and date-boundary semantics. There is no filler, redundancy, or unclear structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, idempotent retrieval tool with a nested input schema, full schema coverage, and an output schema, this description is largely complete: it specifies the resource, units, data availability, granularity, and date inclusivity. It could add routing guidance relative to siblings, but the core invocation is fully actionable without it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all parameters with defaults and bounds, so the baseline is 3. The description adds semantic value by specifying 'market-date' and 'inclusive' range behavior, which the bare schema fields do not convey. Limit and offset details remain in the schema, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Returns the public AESO hourly Unit Commitment settlement amount in CAD and charged volume in MW', bounded to an inclusive market-date range. It clearly communicates the exact metric and units, making the tool easy to distinguish from sibling market-data tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to prefer this tool over alternatives, nor does it mention the closely related get_unit_commitments or other sibling tools. The only contextual clue is the date range, which is already implied by the schema, so selection among the many siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_unit_commitmentsGet Unit CommitmentsA
Read-onlyIdempotent

Returns AESO generating-unit commitment directives for an inclusive date range, paginated and bounded to 31 days. Includes issue, begin, operation-start, and operation-end timestamps in America/Edmonton.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest an inclusive AESO report-date range with bounded output pagination.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYesPagination state for a stable in-memory report result.
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
directivesYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the inclusive date range, 31-day limit, pagination behavior, and the America/Edmonton timezone for timestamps. This helps an agent understand what to expect without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each providing necessary information: the first states the resource and core behavior, the second adds key constraints and timestamp details. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of a complete output schema and well-documented nested input schema, the description covers all essential operational details: what the tool returns, date-range handling, pagination bounds, and timestamp timezone. An agent has enough context to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the nested 'request' object already describes an inclusive date range with bounded pagination. The description adds further semantic value by specifying the 31-day bound, pagination, and timezone context, which clarifies the intended use of start_date, end_date, limit, and offset beyond their basic schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and a specific resource ('AESO generating-unit commitment directives'), which clearly identifies what the tool does. It further distinguishes this tool from the large sibling list by focusing on commitment directives, a unique resource not covered by similarly named siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the intended use: request commitment directives within an inclusive date range, with pagination and a 31-day bound. However, it does not explicitly state when to prefer this tool over alternatives or mention any exclusions, such as when to use get_uc_settlement_summary instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_market_historySummarize Market HistoryA
Read-onlyIdempotent

Returns compact hourly, daily, weekly, or monthly Pool Price statistics and optional Alberta Internal Load statistics for [start, end). Use this before requesting raw series for long periods; summaries are capped at 400 buckets.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest compact server-side pool-price and load aggregation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bucketsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the full safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds genuinely useful behavioral context beyond the annotations: the 400-bucket cap and the half-open [start, end) interval semantics. A minor gap is that the failure mode when the cap is exceeded (error vs. truncation) is not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. The first sentence front-loads the core function (verb, resource, granularities, interval), and the second delivers usage guidance plus the critical cap. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists (return values needn't be explained), annotations cover safety, and schema covers 100% of parameters, the description is nearly complete. The main gaps are the unspecified cap-violation behavior and the lack of any mention of the similar sibling get_price_statistics, which an agent could confuse with this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying that bucket granularity maps to Pool Price statistics, identifying 'load' as Alberta Internal Load (a detail absent from the schema's 'load aggregation' phrasing), and giving the 400-bucket constraint that bounds valid start/end spans. This modest but real added value warrants a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Returns') and names the exact resources: compact hourly/daily/weekly/monthly Pool Price statistics plus optional Alberta Internal Load statistics, with explicit [start, end) interval semantics. This clearly distinguishes it from raw-series siblings like get_pool_prices and get_load by framing it as the compact-statistics counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this before requesting raw series for long periods' states a clear when-to-use context, and the 400-bucket cap implies the boundary condition where raw series become necessary. However, it never names the alternative tools explicitly (e.g., get_pool_prices, get_load, or the similar get_price_statistics), so the when-not guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_operating_reserve_marketSummarize Operating Reserve MarketB
Read-onlyIdempotent

Summarizes active prices or standby clearing blended prices and volumes by reserve product; optionally joins standby activations using volume-weighted activation price.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo
methodologyYes

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds meaningful behavioral context by explaining that results are aggregated by reserve product and that activations can optionally be joined using volume-weighted activation price, clarifying what the summarization actually computes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence and is mostly front-loaded with the core action. It is compact, but the phrasing is jargon-heavy and somewhat ambiguous, which prevents a top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema and safety annotations reduce the burden of explaining return shape and side effects. However, for a nested request object with several schema-undocumented parameters and many sibling tools, the description still lacks guidance on date-range semantics and tool selection, making it only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It partially clarifies reserve_types and include_activations, but it does not explain start_date, end_date, limit, or offset, leaving required parameters defined only by their schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific action ('summarizes') and resource (operating_reserve_market), and specifies that it aggregates prices and volumes by reserve product. It does not explicitly distinguish itself from sibling tools such as get_operating_reserve_prices or get_operating_reserve_activations, and phrases like 'active prices or standby clearing blended prices' introduce some ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. It only implies a summarization use case, leaving the agent to infer the appropriate selection among many sibling market-data tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_historical_storeSync Historical StoreA
Idempotent

Incrementally ingests selected AESO generation, pool-price, and load datasets into the configured local DuckDB index and partitioned Parquet snapshots. Reports gaps and duplicate source observations and refreshes preliminary intervals. Requires the optional analytics dependencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesIncrementally ingest supported datasets into DuckDB/Parquet.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
metadataYesProvenance and semantic metadata attached to dataset responses.
warningsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds concrete behavioral context beyond annotations: incremental ingestion, write targets (DuckDB index and Parquet snapshots), reporting of gaps/duplicates, refreshing preliminary intervals, and a prerequisite (optional analytics dependencies). It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with no filler: the first front-loads the core action and target, the second covers side effects and prerequisites. The first sentence is somewhat long but still scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what the tool does, where it writes, side effects, and prerequisites. The output schema and annotations fill in return values and safety details. Minor ambiguity remains around 'refreshes preliminary intervals' and dataset specifics, but those are largely captured by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with detailed start/end timezone and interval semantics, so the description does not need to add parameter-level detail. The description only names the dataset families, which is already reflected in the schema enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('incrementally ingests'), a precise resource ('AESO generation, pool-price, and load datasets into the configured local DuckDB index and partitioned Parquet snapshots'), and a distinct maintenance role. This clearly differentiates it from the read-only get_* and analyze_* sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the synchronization/ingestion tool for the local historical store, contrasting with the query-oriented siblings, but it never explicitly states when to use it, when not to, or that get_historical_store_status should be used to check coverage. No alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 57 tool updatesv0.3.0
    • Addedanalyze_asset_dispatch
    • Addedanalyze_forecast_error
    • Addedanalyze_generation_mix
    • Addedanalyze_intertie_utilization
    • Addedanalyze_market_event
    • Addedanalyze_net_load
    • Addedanalyze_outage_impact
    • Addedanalyze_ramps
    • Addedanalyze_supply_stack
    • Addedanalyze_supply_surplus_events
    • Changedassess_supply_tightness6 fields changed
      • addedOutput schema / properties / aeso_supply_adequacy_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / aeso_supply_adequacy_status_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / aeso_supply_cushion_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / aeso_supply_cushion_mw
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / aeso_supply_cushion_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedcalculate_asset_energy_revenue
    • Addedcalculate_capture_prices
    • Addedcompare_csd_to_metered
    • Changedcompare_forecast_to_actual1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedcompare_market_periods1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedexplain_market_conditions1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedfind_price_events1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_approved_transmission_outages1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_assets1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_dispatch_down_service
    • Changedget_energy_merit_order1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_ffr_net_schedule
    • Addedget_forecast
    • Changedget_generation1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_generation_capacity1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_historical_generation
    • Addedget_historical_store_status
    • Changedget_interchange1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_intertie_capability1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_intertie_outages1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_load1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_load_outage_forecast1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_long_range_transmission_outages1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_market_snapshot1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_metered_volumes1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_monthly_cumulative_net_revenue1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_operating_reserve_activations
    • Addedget_operating_reserve_forecast
    • Changedget_operating_reserve_offer_control1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_operating_reserve_prices
    • Changedget_outages1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_pool_prices1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_price_duration_curve
    • Addedget_price_statistics
    • Changedget_reserves1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedget_secondary_offer_price_limit1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_supply_adequacy
    • Addedget_supply_surplus
    • Addedget_system_events
    • Changedget_system_marginal_prices1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedget_tmr_reference_price
    • Addedget_uc_settlement_summary
    • Changedget_unit_commitments1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Changedsummarize_market_history1 field changed
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "aeso_public_report",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "aeso_csd_archive",
        +  "derived"
        +]
    • Addedsummarize_operating_reserve_market
    • Addedsync_historical_store
  2. 27 tool updatesv0.2.0
    • Addedassess_supply_tightness
    • Changedcompare_forecast_to_actual13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedcompare_market_periods13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedexplain_market_conditions13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedfind_price_events13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedget_approved_transmission_outages
    • Changedget_assets13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedget_energy_merit_order
    • Changedget_generation17 fields changed
      • addedInput schema / properties / request / properties / limit
        Added value: +{
        +  "default": 500,
        +  "maximum": 2000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / request / properties / offset
        Added value: +{
        +  "default": 0,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / page
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Pagination state for a stable in-memory report result.",
        +  "properties": {
        +    "limit": {
        +      "type": "integer"
        +    },
        +    "next_offset": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null
        +    },
        +    "offset": {
        +      "type": "integer"
        +    },
        +    "returned": {
        +      "type": "integer"
        +    },
        +    "total": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "offset",
        +    "limit",
        +    "returned",
        +    "total"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "metadata"
        -]New value: +[
        +  "page",
        +  "metadata"
        +]
    • Addedget_generation_capacity
    • Changedget_interchange13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedget_intertie_capability
    • Addedget_intertie_outages
    • Changedget_load17 fields changed
      • addedInput schema / properties / request / properties / limit
        Added value: +{
        +  "default": 500,
        +  "maximum": 2000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / request / properties / offset
        Added value: +{
        +  "default": 0,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / page
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Pagination state for a stable in-memory report result.",
        +  "properties": {
        +    "limit": {
        +      "type": "integer"
        +    },
        +    "next_offset": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null
        +    },
        +    "offset": {
        +      "type": "integer"
        +    },
        +    "returned": {
        +      "type": "integer"
        +    },
        +    "total": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "offset",
        +    "limit",
        +    "returned",
        +    "total"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "intervals",
        -  "metadata"
        -]New value: +[
        +  "intervals",
        +  "page",
        +  "metadata"
        +]
    • Addedget_load_outage_forecast
    • Addedget_long_range_transmission_outages
    • Changedget_market_snapshot13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedget_metered_volumes
    • Addedget_monthly_cumulative_net_revenue
    • Addedget_operating_reserve_offer_control
    • Changedget_outages36 fields changed
      • changedInput schema / properties / request / description
        Previous value: -"Request generator outage reports."New value: +"Request hourly generator outage capacity by fuel/technology."
      • changedOutput schema / description
        Previous value: -"Generator outage observations."New value: +"Hourly generator outage capacity by technology/fuel."
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • changedOutput schema / properties / outages / items / description
        Previous value: -"One generator outage observation."New value: +"Aggregated hourly generator outage capacity (GridStatus AESO shape)."
      • removedOutput schema / properties / outages / items / properties / asset_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedOutput schema / properties / outages / items / properties / asset_name
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • addedOutput schema / properties / outages / items / properties / biomass_and_other_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / coal_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / cogeneration_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / combined_cycle_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / energy_storage_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • removedOutput schema / properties / outages / items / properties / fuel_type
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • addedOutput schema / properties / outages / items / properties / gas_fired_steam_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / hydro_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • removedOutput schema / properties / outages / items / properties / maximum_capability_mw
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • addedOutput schema / properties / outages / items / properties / mothball_outage_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • removedOutput schema / properties / outages / items / properties / outage_mw
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • addedOutput schema / properties / outages / items / properties / publication_time
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedOutput schema / properties / outages / items / properties / raw
        Removed value: -{
        -  "additionalProperties": {
        -    "anyOf": [
        -      {
        -        "type": "string"
        -      },
        -      {
        -        "type": "number"
        -      },
        -      {
        -        "type": "integer"
        -      },
        -      {
        -        "type": "null"
        -      }
        -    ]
        -  },
        -  "type": "object"
        -}
      • addedOutput schema / properties / outages / items / properties / simple_cycle_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / solar_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / total_outage_mw
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / outages / items / properties / wind_mw
        Added value: +{
        +  "default": 0,
        +  "type": "number"
        +}
      • changedOutput schema / properties / outages / items / required
        Previous value: -[
        -  "interval_start"
        -]New value: +[
        +  "interval_start",
        +  "total_outage_mw"
        +]
    • Changedget_pool_prices17 fields changed
      • addedInput schema / properties / request / properties / limit
        Added value: +{
        +  "default": 500,
        +  "maximum": 2000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / request / properties / offset
        Added value: +{
        +  "default": 0,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / page
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Pagination state for a stable in-memory report result.",
        +  "properties": {
        +    "limit": {
        +      "type": "integer"
        +    },
        +    "next_offset": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null
        +    },
        +    "offset": {
        +      "type": "integer"
        +    },
        +    "returned": {
        +      "type": "integer"
        +    },
        +    "total": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "offset",
        +    "limit",
        +    "returned",
        +    "total"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "intervals",
        -  "metadata"
        -]New value: +[
        +  "intervals",
        +  "page",
        +  "metadata"
        +]
    • Changedget_reserves13 fields changed
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedget_secondary_offer_price_limit
    • Changedget_system_marginal_prices17 fields changed
      • addedInput schema / properties / request / properties / limit
        Added value: +{
        +  "default": 500,
        +  "maximum": 2000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / request / properties / offset
        Added value: +{
        +  "default": 0,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / metadata / properties / available_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / cache_age
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Age of the cached provider result in seconds when served."
        +}
      • addedOutput schema / properties / metadata / properties / cache_hit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / metadata / properties / completeness
        Added value: +{
        +  "default": "unknown",
        +  "description": "Completeness of the requested observations or series.",
        +  "enum": [
        +    "complete",
        +    "partial",
        +    "degraded",
        +    "empty",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / expected_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / expected_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / finality
        Added value: +{
        +  "default": "unknown",
        +  "description": "Whether published observations are final or still preliminary.",
        +  "enum": [
        +    "final",
        +    "preliminary",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / missing_observation_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_observations
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / metadata / properties / missing_series
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata / properties / observation_type
        Added value: +{
        +  "default": "actual",
        +  "description": "What kind of observation a response contains.\n\n``DataStatus`` predates this distinction and remains available for\ncompatibility.  ``observation_type`` should be used when a client needs\nto distinguish an actual observation from a forecast or a derived value.",
        +  "enum": [
        +    "actual",
        +    "forecast",
        +    "derived",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / metadata / properties / provider / enum
        Previous value: -[
        -  "gridstatus",
        -  "aeso_apim",
        -  "derived"
        -]New value: +[
        +  "gridstatus",
        +  "aeso_apim",
        +  "aeso_public_report",
        +  "derived"
        +]
      • addedOutput schema / properties / metadata / properties / served_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / page
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Pagination state for a stable in-memory report result.",
        +  "properties": {
        +    "limit": {
        +      "type": "integer"
        +    },
        +    "next_offset": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null
        +    },
        +    "offset": {
        +      "type": "integer"
        +    },
        +    "returned": {
        +      "type": "integer"
        +    },
        +    "total": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "offset",
        +    "limit",
        +    "returned",
        +    "total"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "intervals",
        -  "metadata"
        -]New value: +[
        +  "intervals",
        +  "page",
        +  "metadata"
        +]
    • Addedget_unit_commitments
    • Addedsummarize_market_history
  3. 13 tool updatesv0.1.1
    • First observedcompare_forecast_to_actual
    • First observedcompare_market_periods
    • First observedexplain_market_conditions
    • First observedfind_price_events
    • First observedget_assets
    • First observedget_generation
    • First observedget_interchange
    • First observedget_load
    • First observedget_market_snapshot
    • First observedget_outages
    • First observedget_pool_prices
    • First observedget_reserves
    • First observedget_system_marginal_prices

TDQS

A3.6/5.0

Scored across 57 tools

Disambiguation3/5

The descriptions are unusually careful about distinguishing related reports, but the 57-tool surface contains dense clusters with overlapping semantics: get_generation/historical_generation/capacity, get_outages/generation_capacity/outage_impact, and supply_adequacy/supply_surplus/assess_supply_tightness/analyze_supply_surplus_eents. An agent could easily select the wrong tool despite the disclaimers, especially among the many analyze_* and summarize_* helpers.

Naming Consistency5/5

Every tool follows snake_case verb_noun (or verb_adjective_noun) naming: get_, analyze_, calculate_, compare_, summarize_, assess_, explain_, find_, sync_. Acronyms like uc, ffr, and tmr are used consistently within the same pattern. No camelCase or mixed verb styles appear.

Tool Count2/5

57 tools is far beyond the 25+ threshold and will cause selection overhead even if the AESO domain is broad. Many tools could be consolidated behind parameters, such as one outages tool with a type flag, one operating-reserve tool with a report type, or one supply-status tool with an official/derived flag. The set feels like a full REST report catalog rather than a curated MCP surface.

Completeness4/5

The set covers the core AESO market surface very thoroughly: prices, load, generation, outages, interties, operating reserves, forecasts, settlements, and analytics. Obvious minor gaps exist, such as historical interchange flows and some single-date report lookups, but agents can usually work around these with existing tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    One-call Australian energy-market plumbing via AEMO — cited, structured responses for market data and analysis, not a data broker.
    5
    172 PyPI
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Connects AI agents to energy infrastructure with 30+ tools for managing sites, assets, dispatch, settlements, compliance, and carbon tracking.
    34
    23 npm
    1
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Provides real-time European and GB electricity grid data via MCP, including generation, prices, carbon intensity, and grid infrastructure.
    44
    45 npm
    6
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A read-only MCP server that exposes European day-ahead electricity prices for ~41 bidding zones via tools like hourly prices, cheapest hours, current price, and cross-zone summary, enabling AI agents to query energy market data.
    1
    -