Latest release: v0.4.3 release notes | Changelog
Current published versions: luminus-mcp@0.4.3 and luminus-py==0.4.1.
Real-time European & GB electricity grid data via MCP. 67 tools, most free.
| Tool | Source | Description |
|---|---|---|
get_generation_mix |
ENTSO-E | Real-time generation by fuel type (wind, solar, gas, nuclear, etc.) |
get_day_ahead_prices |
ENTSO-E | Hourly spot prices (EUR/MWh) by bidding zone |
get_balancing_prices |
ENTSO-E | Imbalance/settlement prices per period |
get_carbon_intensity |
ENTSO-E | CO2 intensity (gCO2/kWh) from generation mix |
get_hydro_reservoir |
ENTSO-E | Reservoir filling levels (MWh) for hydro countries |
| Tool | Source | Description |
|---|---|---|
get_intraday_prices |
ENTSO-E | Continuous intraday market prices per bidding zone |
get_imbalance_prices |
ENTSO-E | Real-time settlement/imbalance prices |
get_intraday_da_spread |
Computed | Intraday minus day-ahead spread with directional signal |
get_realtime_generation |
ENTSO-E / BMRS | Actual generation by fuel type (MW), 5-15 min resolution |
get_balancing_actions |
ENTSO-E / BMRS | Activated balancing energy (up/down regulation volumes) |
| Tool | Source | Description |
|---|---|---|
get_renewable_forecast |
ENTSO-E | Day-ahead wind & solar generation forecast (MW) |
get_demand_forecast |
ENTSO-E | Day-ahead total load/demand forecast (MW) |
| Tool | Source | Description |
|---|---|---|
get_gas_storage |
GIE AGSI+ | European gas storage levels, fill %, injection/withdrawal |
get_lng_terminals |
GIE ALSI | LNG terminal inventory, send-out rates, capacity |
get_us_gas_data |
EIA | US gas storage (Bcf) and Henry Hub prices (USD/MMBtu) |
get_eu_gas_price |
Yahoo Finance | TTF/NBP gas prices in EUR/MWh for spark spread calculations |
get_entsog_data |
ENTSOG | Gas pipeline flows, nominations, interruptions, and capacities |
| Tool | Source | Description |
|---|---|---|
get_ancillary_prices |
ENTSO-E | FCR/aFRR/mFRR reserve procurement prices (EUR/MW) |
get_remit_messages |
ENTSO-E | REMIT urgent market messages (forced outages, capacity reductions) |
get_price_spread_analysis |
Computed | BESS arbitrage schedule with optimal charge/discharge windows |
get_regelleistung |
Regelleistung.net | FCR/aFRR/mFRR tender results and procurement prices (DE + EU) |
get_acer_remit |
ACER REMIT | Centralized UMMs and outage events from Inside Information Platforms |
| Tool | Source | Description |
|---|---|---|
get_cross_border_flows |
ENTSO-E | Physical electricity flows between zones (MW) |
get_net_positions |
ENTSO-E | Net import/export position by zone |
get_transfer_capacities |
ENTSO-E | Net transfer capacity (NTC) between zones |
get_outages |
ENTSO-E | Generation & transmission outages with reasons |
get_power_plants |
Open Power System Data | Plant database: capacity, fuel, location, year |
get_auction_results |
JAO | Cross-border capacity auction prices & allocation |
get_transmission_lines |
OpenStreetMap | HV transmission line routes (220kV+) |
get_grid_connection_queue |
NESO TEC Register | GB transmission connection-register signal: queued/contracted projects, MW, status, and dates by connection site |
get_nged_connection_signal |
NGED Connected Data Portal | NGED-only public GSP signal: connection-queue rows plus seasonal TD-limit records where the matched GSP is publicly covered |
get_eu_frequency |
mainsfrequency.com | Real-time grid frequency (Hz) and deviation |
| Tool | Source | Description |
|---|---|---|
get_gb_carbon_intensity |
National Grid ESO | GB carbon intensity, index, and fuel mix |
get_gb_grid_demand |
National Grid ESO | GB demand (MW) and grid frequency (Hz) |
get_elexon_bmrs |
Elexon BMRS | GB imbalance prices, generation by fuel, balancing bids, system warnings |
| Tool | Source | Description |
|---|---|---|
get_commodity_prices |
Yahoo Finance | EUA carbon, Brent crude, TTF gas prices with 5-day history |
| Tool | Source | Description |
|---|---|---|
get_energy_charts |
energy-charts.info | European electricity prices, generation, and flows (no API key) |
get_nordpool_prices |
Nordpool | Nordic and Baltic day-ahead prices at 15-min resolution |
get_smard_data |
SMARD (Bundesnetzagentur) | High-resolution German generation, consumption, and market data |
get_rte_france |
RTE France (ODRE) | French generation (nuclear, wind, solar), consumption, and exchanges |
get_energi_data |
Energi Data Service | Danish real-time CO2, production, prices, and electricity balance |
get_fingrid_data |
Fingrid | Finnish grid data at 3-min resolution (generation, imports, frequency) |
get_terna_data |
Terna | Italian generation, demand, exchanges, and zonal market prices |
get_ree_esios |
REE ESIOS | Spanish prices, demand, generation mix, wind/solar forecast vs actual |
| Tool | Source | Description |
|---|---|---|
get_hydro_inflows |
ERA5-Land (Open-Meteo) | Hydro inflow proxy for 10 European basins (precipitation, snowmelt) |
| Tool | Source | Description |
|---|---|---|
get_terrain_analysis |
Open-Meteo Elevation | Elevation, slope, aspect, and flatness score for a location |
get_grid_proximity |
OpenStreetMap | Nearest substations and HV lines within a radius, with distances |
get_grid_connection_queue |
NESO TEC Register | GB transmission TEC register search by connection site, host TO, technology, status, and agreement type |
get_nged_connection_signal |
NGED Connected Data Portal | NGED-only public GSP signal: connection-queue rows plus seasonal TD-limit records where the matched GSP is publicly covered |
get_distribution_headroom |
SSEN + NPG + UKPN + SPEN + ENWL | All 5 GB DNOs with public data. Nearby published GSP/BSP/primary sites, estimated generation and demand headroom, constraints, and reinforcement timing. SSEN and NPG are free; UKPN, SPEN, and ENWL require free API keys |
get_grid_connection_intelligence |
NESO GSP + TEC + OSM + DNOs | GB grid connection intelligence: polygon-first GSP lookup, TEC register queue, nearby substations, distribution headroom from SSEN/NPG/UKPN/ENWL (closest match), and NGED public queue and TD-limit context |
get_embedded_capacity_register |
UKPN + SPEN + ENWL | Connected and accepted generation/storage near a location, with energy source, capacity, and connection status. Requires API key |
get_flexibility_market |
UKPN + SPEN | Historical flexibility dispatch events with pricing, zones, providers, and technology types. Requires API key |
get_constraint_breaches |
UKPN | Grid constraint breach history: where/when constraints triggered DER curtailment, with duration and energy lost. Requires API key |
get_spen_grid_intelligence |
SPEN | Composite: GSP queue positions, DG connections network capacity (SPD), and capacity management curtailment events. Requires API key |
get_ukpn_grid_overview |
UKPN | Composite: GSP capacity and utilisation, HV flexibility zones with constraint types, and live network faults. Requires API key |
get_land_constraints |
Natural England / EEA Natura 2000 | GB protected areas via Natural England, plus EU Natura 2000 protected sites within a radius |
get_land_cover |
CORINE Land Cover 2018 | Point land-cover classification for EU27 + EEA/EFTA sites, with conservative planning-exclusion flags for wetlands, water bodies, and woodland. GB not covered |
get_agricultural_land |
Natural England ALC | Best and Most Versatile agricultural land screening. Prefers detailed post-1988 surveys, falls back to provisional ALC |
get_flood_risk |
Environment Agency | Flood-planning screen using Flood Zone 2, Flood Zone 3, and flood storage areas |
screen_site |
Composite | PV/BESS site screening: terrain + grid + solar + constraints + agricultural land + flood risk in one pass/warn/fail verdict (GB + EU) |
compare_sites |
Composite | Compare and rank 2-10 candidate PV/BESS sites by verdict, solar resource, grid proximity, and terrain (GB + EU) |
estimate_site_revenue |
PVGIS + ENTSO-E | Estimate annual PV generation revenue or BESS arbitrage revenue for a candidate site. Requires ENTSO-E key. |
shortlist_bess_sites |
Composite | GB-only BESS shortlist: combines compare_sites, screening-level revenue estimates, GB transmission queue intelligence, and SSEN DNO headroom where public SSEN data resolves. Requires ENTSO-E key. |
verify_gis_sources |
All GIS providers | Health check for upstream GIS data sources. Reports status, response time, and provenance metadata |
Roadmap: see docs/gis-roadmap.md.
| Tool | Source | Description |
|---|---|---|
get_weather_forecast |
Open-Meteo | Temperature, wind speed, solar radiation by location |
get_solar_irradiance |
PVGIS | Monthly irradiance, optimal angle, annual PV yield |
get_era5_weather |
ERA5 (Copernicus/ECMWF) | Historical reanalysis: wind at hub height, solar radiation, temperature |
get_stormglass |
Storm Glass | Offshore marine weather: wind, waves, swell, sea temperature (10 req/day) |
npm install luminus-mcpA notebook-friendly Python client now lives under python/.
It wraps luminus-mcp over stdio and exposes plain Python methods like get_day_ahead_prices(), get_generation_mix(), and screen_site().
The package name is luminus-py.
Roadmap: see docs/python-sdk-roadmap.md.
from luminus import Luminus
lum = Luminus(profile="trader")
prices = lum.get_day_ahead_prices(zone="DE")
df = prices.to_pandas()Set keys via environment variables or ~/.luminus/keys.json:
# Option 1: .env file
ENTSOE_API_KEY=your-key-here # Required for most ENTSO-E tools
GIE_API_KEY=your-key-here # Optional: gas storage & LNG
EIA_API_KEY=your-key-here # Optional: US gas data
FINGRID_API_KEY=your-key-here # Optional: Finnish grid data
ESIOS_API_TOKEN=your-token-here # Optional: Spanish market data
STORMGLASS_API_KEY=your-key-here # Optional: offshore marine weather
UKPN_ODS_API_KEY=your-key-here # Optional: UKPN headroom, ECR, flex, constraints
SPEN_ODS_API_KEY=your-key-here # Optional: SPEN headroom, ECR, grid intelligence
ENWL_ODS_API_KEY=your-key-here # Optional: ENWL headroom, ECR// Option 2: ~/.luminus/keys.json (alternative to env vars)
{
"ENTSOE_API_KEY": "your-key-here",
"GIE_API_KEY": "your-key-here",
"UKPN_ODS_API_KEY": "your-key-here",
"SPEN_ODS_API_KEY": "your-key-here",
"ENWL_ODS_API_KEY": "your-key-here"
}Key resolution order: environment variable first, then ~/.luminus/keys.json. Tools with missing keys are automatically skipped at startup (they never appear in the tool list).
All keys are free:
- ENTSO-E: Register at transparency.entsoe.eu, then email transparency@entsoe.eu
- GIE: Register at agsi.gie.eu
- EIA: Register at eia.gov/opendata
- Fingrid: Register at data.fingrid.fi
- ESIOS: Email consultasios@ree.es to request a token
- Storm Glass: Register at stormglass.io
- UKPN: Register at ukpowernetworks.opendatasoft.com → My API Keys
- SPEN: Register at spenergynetworks.opendatasoft.com → My API Keys
- ENWL: Register at electricitynorthwest.opendatasoft.com → My API Keys
Many tools work without any API key: energy-charts.info, ENTSOG, Elexon BMRS, RTE France, Energi Data Service, ERA5 weather, hydro inflows, Nordpool, SMARD, and more.
By default all available data tools are registered. Use --profile to load only what you need, cutting context window cost by 60-90%:
npx luminus-mcp --profile trader # 8 tools: prices, spreads, commodities
npx luminus-mcp --profile grid # 17 tools: flows, outages, infrastructure, DNO data
npx luminus-mcp --profile generation # 6 tools: gen mix, forecasts, carbon
npx luminus-mcp --profile gas # 5 tools: storage, LNG, pipeline flows
npx luminus-mcp --profile renewables # 5 tools: wind/solar forecasts, hydro
npx luminus-mcp --profile gb # 3 tools: GB carbon, demand, Elexon
npx luminus-mcp --profile bess # 11 tools: arbitrage, ancillary, revenue, shortlist, flex, constraints
npx luminus-mcp --profile regional # 8 tools: country-specific sources
npx luminus-mcp --profile weather # 5 tools: forecasts, ERA5, marine
npx luminus-mcp --profile gis # 22 tools: solar, terrain, grid, queue, screening, comparison, shortlist, DNO data, verification
npx luminus-mcp --profile full # all 67 tools (default)Two meta-tools are always registered regardless of profile:
luminus_discover— list available tools and profilesluminus_status— server health: registered tool count, active profile, configured/missing API keys
# Full tool set
claude mcp add luminus -- npx luminus-mcp
# With a profile (recommended for faster responses)
claude mcp add luminus -- npx luminus-mcp --profile trader{
"mcpServers": {
"luminus": {
"command": "npx",
"args": ["luminus-mcp", "--profile", "trader"],
"env": {
"ENTSOE_API_KEY": "your-key-here"
}
}
}
}Ask your AI agent:
- "What's powering Germany's grid right now?"
- "Compare day-ahead prices across France, Spain, and Italy"
- "How full are Europe's gas storage facilities?"
- "Show me wind generation forecast for tomorrow in Denmark"
- "What's the carbon intensity in GB right now?"
- "Are there any nuclear outages in France?"
- "What's the net transfer capacity between Norway and Germany?"
- "Show me gas pipeline flows through the Netherlands"
- "What are GB imbalance prices doing today?"
- "Get historical wind speeds at 100m for a North Sea offshore site"
- "What did FCR tender prices look like this week?"
- "How much is France exporting to Spain right now?"
- "What's the Danish CO2 intensity in DK1?"
- "Show Finnish wind production over the last 24 hours"
- "What are the hydro inflow conditions in Norway?"
- "Get offshore weather forecast for the Dogger Bank wind farm"
- "What's the Spanish day-ahead price curve today?"
| Source | Link | Coverage |
|---|---|---|
| ENTSO-E Transparency Platform | transparency.entsoe.eu | 30+ European countries |
| ENTSOG Transparency Platform | transparency.entsog.eu | European gas pipelines |
| National Grid ESO | carbonintensity.org.uk | GB |
| NESO Data Portal | api.neso.energy | GB transmission connection registers and GIS boundary datasets |
| NGED Connected Data Portal | connecteddata.nationalgrid.co.uk | NGED public GSP queue and transmission-distribution limit datasets |
| SSEN Open Data Portal | data-api.ssen.co.uk | SSEN distribution headroom, network capacity, and generation availability datasets |
| Northern Powergrid Open Data Portal | northernpowergrid.opendatasoft.com | Northern Powergrid heat-map substation headroom and service-area datasets |
| Elexon BMRS | bmrs.elexon.co.uk | GB balancing mechanism |
| GIE AGSI+ / ALSI | agsi.gie.eu | European gas & LNG |
| EIA | eia.gov | US natural gas |
| energy-charts.info | energy-charts.info | EU electricity (Fraunhofer ISE) |
| Nordpool | nordpoolgroup.com | Nordic & Baltic markets |
| SMARD | smard.de | German electricity |
| Regelleistung.net | regelleistung.net | EU balancing reserves (FCR/aFRR/mFRR) |
| RTE France (ODRE) | odre.opendatasoft.com | French electricity |
| Energi Data Service | energidataservice.dk | Danish electricity |
| Fingrid | data.fingrid.fi | Finnish grid (3-min) |
| Terna | developer.terna.it | Italian electricity |
| REE ESIOS | esios.ree.es | Spanish electricity |
| ACER REMIT | acer-remit.eu | EU market transparency |
| Yahoo Finance | finance.yahoo.com | Energy commodities |
| Open-Meteo / ERA5 | open-meteo.com | Weather forecast + ERA5 reanalysis |
| PVGIS | re.jrc.ec.europa.eu | Global solar irradiance |
| Storm Glass | stormglass.io | Marine/offshore weather |
| Open Power System Data | open-power-system-data.org | European power plants |
| JAO | jao.eu | Cross-border auctions |
| OpenStreetMap | openstreetmap.org | Transmission lines, substations |
| Open-Meteo Elevation | open-meteo.com | Terrain elevation (Copernicus EU-DEM) |
| Natural England Open Data | naturalengland-defra.opendata.arcgis.com | England protected areas and agricultural land classification |
| EEA Natura 2000 | bio.discomap.eea.europa.eu | EU Natura 2000 protected sites |
| Environment Agency Flood Map for Planning | environment.data.gov.uk | England flood zones and flood storage areas |
| mainsfrequency.com | mainsfrequency.com | European grid frequency |
Luminus is meant to be boring in the right places: typed inputs, read-only data access, small runtime dependencies, and reproducible release checks.
Current repo guardrails:
- CI runs
npm test,npm run build,npm audit --omit=dev, andnpm pack --dry-run - Dependabot watches npm and GitHub Actions dependencies
dist/is cleaned before every build, so stale files do not leak into the published tarball- package runtime is pinned to supported Node versions via
.nvmrcandpackage.jsonengines - raw upstream errors stay hidden unless
LUMINUS_DEBUG=1is enabled locally - tools with missing API keys are silently excluded at startup (reduced attack surface)
- all tool calls are logged to
~/.luminus/audit.jsonlwith sensitive parameter redaction - API keys can be stored in
~/.luminus/keys.jsoninstead of environment variables (with Unix permission warnings for world-readable files)
See SECURITY.md for the release checklist and vulnerability reporting path.
Most ENTSO-E tools require an API key. Set it in .env, ~/.luminus/keys.json, or pass via your MCP config's env block. Tools with missing keys are automatically excluded from registration, so they won't appear in the tool list. Tools that don't need a key (energy-charts, Nordpool, SMARD, Elexon, etc.) always work.
- Wrong zone code: Use two-letter country codes (
DE,FR,GB) or ENTSO-E bidding zone codes (10YDE-VE-------2). See tool descriptions for valid zones. - Date range: Some APIs only serve recent data (24-48h). Don't request dates more than a few days in the past unless the tool description says otherwise.
- Weekend/holiday: Day-ahead auction results may not exist for the current day if the auction hasn't cleared yet.
| Source | Limit | What happens |
|---|---|---|
| ENTSO-E | ~400 req/min | HTTP 429 — wait and retry |
| Storm Glass | 10 req/day (free) | HTTP 403 after limit hit |
| OpenStreetMap (Overpass) | ~10k/day | Slow responses, then timeout |
| GIE (AGSI+/ALSI) | ~60 req/min | HTTP 429 |
If you hit a rate limit, the error message will include the HTTP status code. Wait a minute and retry.
# Rebuild from source
npm run build
# Run the small regression suite
npm test
# Check runtime dependency vulnerabilities
npm audit --omit=devLuminus now normalises tool failures into five buckets:
- Invalid parameters: bad zone, corridor, date, or missing required input
- Configuration error: missing API key or env var
- No data returned: request was valid, but the upstream source had no matching data
- Upstream source error: timeout, 4xx/5xx, or provider-side failure
- Unexpected server error: anything else
By default, tool responses stay short and actionable. If you need raw internals while debugging locally, set:
LUMINUS_DEBUG=1That adds the raw upstream error text to MCP responses and prints the underlying error to stderr.
All tool calls are logged to ~/.luminus/audit.jsonl as newline-delimited JSON. Each entry includes a timestamp, tool name, and parameters (with sensitive values like API keys automatically redacted).
# View recent tool calls
tail -20 ~/.luminus/audit.jsonl | jq .
# Log location
# Windows: C:\Users\<you>\.luminus\audit.jsonl
# macOS/Linux: ~/.luminus/audit.jsonlAudit logging is fire-and-forget and never blocks tool execution. Logs rotate automatically at 50MB.
Runtime deps are intentionally small: MCP SDK, dotenv, fast-xml-parser, and zod. Transitive deps still matter, so before releases you should run:
npm audit --omit=devThe package pins path-to-regexp via overrides to avoid the known vulnerable 8.0.0-8.3.0 range pulled in through the MCP SDK's Express stack.
Luminus aggregates publicly available European energy data. It is a data-access layer, not an energy trading model. It does not provide:
- Trading recommendations or financial advice
- Sub-second or tick-level market data
- Historical data beyond what each upstream API offers (typically days to weeks; ERA5 is the main multi-year exception)
- Guaranteed uptime — upstream APIs go down independently
Data freshness depends on each source. Most update every 15-60 minutes. Check the timestamp or updated_at field in tool responses.
MIT. See LICENSE.
See docs/gis-roadmap.md for the shipped sprint baseline, current tranche, next actions, and hard caveats.
The current GIS tranche is built to favour keyless or low-friction public sources for a UK/EU MVP.
| Source | What we use it for | API key needed? | Registration needed? | Notes |
|---|---|---|---|---|
| PVGIS | solar resource / yield context | No | No | Public HTTP access, good fit for UK/EU MVP |
| Open-Meteo elevation | terrain and elevation context | No | No | Public HTTP access, lightweight for point lookups |
| OpenStreetMap / Overpass / OpenInfraMap-derived queries | substations, lines, coarse grid proximity | No | No | Keyless but public endpoints can be slow or flaky, so fallback logic matters |
| NESO Data Portal TEC register | GB transmission connection-register signal | No | No | Public CKAN datastore API, updated twice weekly, but it is transmission-only and not a DNO headroom map |
| Natural England / UK open GIS services | protected areas, constraint screening, agricultural land classification | Usually no | Usually no | Public access, but service quality and endpoint shape can be inconsistent |
| EEA Natura 2000 | EU protected-area screening | No | No | Good first EU-wide layer, but it is not the full national planning-constraints stack in each country |
| Environment Agency Flood Map for Planning | Flood Zone 2/3 and flood storage area screening | No | No | Public ArcGIS service for England planning layers, but still not a substitute for a site-specific FRA |
| CORINE / Copernicus-style open data | land-cover and broader EU layers | No | Usually no for basic access/downloads | Better suited to staged ingestion or pre-processing than naive live API calls |
- Most of the MVP stack is keyless.
- You do not need to register just to use the current GIS tool set.
- Public GIS endpoints are still not the same thing as production-grade infrastructure.
- For the first version, we should prove usefulness with public sources first, then decide later whether to cache, mirror, or formalise any upstream dependencies.
We do not treat docs as proof. We check sources by:
- live sample calls from the code
- tests around parsing and failure handling
- clean upstream-specific error messages
- fallback logic for brittle public services where it is worth it
- build + audit + real tool proofs before locking a sprint
verify_gis_sourcestool — pings each upstream provider and reports ok/degraded/unreachable with response times
Every GIS tool response includes a source_metadata block with:
- provider and licence — where the data comes from and under what terms
- coverage — geographic and temporal scope
- reliability — high/medium/low, based on observed uptime and endpoint quality
- caveats — known limitations specific to that source
- attribution — required credit line
This metadata is not marketing. It is there so callers can judge how much to trust a response, especially when making decisions that matter (site acquisition, planning applications, grid connection quotes).
Right now the right approach is:
- use keyless public sources where possible
- avoid signing up for unnecessary services too early
- only add registration-based or commercial sources later if reliability or coverage genuinely demands it