entsoe-mcp
European power-market data: day-ahead & balancing prices, load, generation, flows, outages. 47 zones
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"entsoe-mcp": {
"url": "https://entsoemcp.com/mcp"
}
}
}远程端点
https://entsoemcp.com/mcpstreamable-http它能做什么
工具清单
工具(14)
🟢list_zones(active_only, cluster)
List registered ENTSO-E bidding zones.
输入模式
{
"type": "object",
"properties": {
"active_only": {
"default": true,
"type": "boolean"
},
"cluster": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"result": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
}
},
"required": [
"result"
],
"x-fastmcp-wrap-result": true
}🟢list_endpoints(family)
List supported ENTSO-E endpoint families.
输入模式
{
"type": "object",
"properties": {
"family": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"result": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
}
},
"required": [
"result"
],
"x-fastmcp-wrap-result": true
}🟢list_psr_types(zone)
List production-type (psr_type) codes. Pass zone= to scope the answer. Most codes are ENTSO-E's B01..B25 and mean the same thing in every ENTSO-E zone. A few are source-native (source != "entsoe") and exist only where that source publishes — they express concepts the B-codes cannot, so they are NOT interchangeable with a similar-looking B-code. Check `source` and read `description` before comparing a code across zones. Passing zone= also returns `taxonomy_note` for zones that mix taxonomies (e.g. GB), and per-code `endpoints` showing where each code comes from. Each code carries `counts_as_generation`: when False the figure is a net flow or net storage number, not production — do not sum it into a generation total.
输入模式
{
"type": "object",
"properties": {
"zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_series(endpoint, start, end, zone, from_zone, ...)
Generic time-series query for ANY registered series endpoint. One tool covers every (non-outage) endpoint in the registry, so adding a new dataset (call `list_endpoints()` to see the current 14) gets an MCP surface automatically — no new tool to learn. Argument shape adapts to the endpoint: • single-zone (day_ahead_price, actual_load, generation_per_type, …) → pass `zone="DE_LU"` • cross-zone (crossborder_flow, scheduled_exchanges, net_transfer_capacity_dayahead) → pass `from_zone="DE_LU"` AND `to_zone="FR"` • psr-dependent (generation_per_type, wind_solar_forecast, installed_generation_capacity) → optionally filter via `psr_types=["solar","wind_onshore"]` `start`/`end`: UTC by default; `start` inclusive, `end` EXCLUSIVE (for "all of April 2026" use end=2026-05-01). Pass `tz="local"` or an IANA name to interpret as wall-clock in that timezone. `aggregation`: 'raw' (default — native PT15M/PT60M per endpoint), 'hourly' (AVG over quarters → one row per hour, useful for the growing list of PT15M-stored endpoints like DE_LU day_ahead_price), 'daily', or 'monthly'. For day-ahead prices specifically the auction still clears hourly even where stored at PT15M, so AVG=any-quarter; SUM would 4× over-count. Outage-family endpoints (different schema) stay on `get_outages()`.
输入模式
{
"type": "object",
"properties": {
"endpoint": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"from_zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"to_zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"aggregation": {
"default": "raw",
"type": "string"
},
"psr_types": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"endpoint",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_day_ahead_prices(zone, start, end, aggregation, tz)
Day-ahead clearing price for a bidding zone, in the zone's trading currency (EUR for euro zones; the per-row `currency` column and the response `unit` say which — GB=GBP, PL/RO/BG carry local-currency eras). `start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. For 'all of April 2026' use start=2026-04-01, end=2026-05-01 (end=2026-04-30 silently drops the final UTC day — and 1–2 local-time hours of April for European zones in CET/CEST). The response's `period` block shows the resolved window so you can verify (a 30-day month is 720 hours). `tz`: pass "local" to interpret start/end as wall-clock in the zone's timezone, or an explicit IANA name like "Europe/Berlin". The server converts to UTC at the boundary. If you're computing a **generation-weighted** price metric — capture price, capture rate, value factor, merchant-PPA achieved price — use `get_derivation(slug="capture_price", …)` instead. It runs server-side over the full window and returns monthly rows; no row cap, no pagination.
输入模式
{
"type": "object",
"properties": {
"zone": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"aggregation": {
"default": "raw",
"type": "string"
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"zone",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_tb_spread(zone, date, x)
Top-Bottom (TBx) spread — daily battery-arbitrage benchmark. TBx = sum(top X priced hours) − sum(bottom X priced hours) over the day-ahead clearing prices for `zone` on `date`. The day is the SDAC market day (23/25 hours on DST-transition days). `date` must be a bare YYYY-MM-DD — time-bearing strings are rejected. Returns both `spread` (<currency>/MW/day) and `mean_spread` (<currency>/MWh = spread/X) in the zone's trading currency — see the response `currency`/`unit` (EUR for euro zones; GB=GBP). Common X: 1, 2, 4.
输入模式
{
"type": "object",
"properties": {
"zone": {
"type": "string"
},
"date": {
"type": "string"
},
"x": {
"default": 2,
"type": "integer"
}
},
"required": [
"zone",
"date"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_load(zone, kind, start, end, aggregation, ...)
Actual or forecast load (MW). kind = actual | forecast | both. `start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. For a full calendar month set `end` to the first day of the next month. Pass `tz="local"` or an IANA name to interpret start/end as wall-clock in that timezone.
输入模式
{
"type": "object",
"properties": {
"zone": {
"type": "string"
},
"kind": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"aggregation": {
"default": "raw",
"type": "string"
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"zone",
"kind",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_generation(zone, start, end, psr_types, aggregation, ...)
Aggregated generation (MW) per production type. `start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. For a full calendar month set `end` to the first day of the next month. Pass `tz="local"` or an IANA name to interpret start/end as wall-clock in that timezone. If you're computing a **generation-weighted** price metric — capture price, capture rate, value factor, merchant-PPA achieved price — use `get_derivation(slug="capture_price", …)` instead. It runs server-side over the full window and returns monthly rows; no row cap, no pagination.
输入模式
{
"type": "object",
"properties": {
"zone": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"psr_types": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null
},
"aggregation": {
"default": "raw",
"type": "string"
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"zone",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_crossborder_flow(from_zone, to_zone, start, end, aggregation, ...)
Cross-border physical flow (MW) between two adjacent zones. `start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. `tz="local"` uses the FROM-zone's timezone; or pass an IANA name.
输入模式
{
"type": "object",
"properties": {
"from_zone": {
"type": "string"
},
"to_zone": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"aggregation": {
"default": "raw",
"type": "string"
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"from_zone",
"to_zone",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢get_outages(zone, start, end, kind, min_mw, ...)
Generation-unit unavailability events (UMM). `start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. An outage is returned if it overlaps the window. Pass `tz="local"` or an IANA name to interpret start/end as wall-clock in that timezone.
输入模式
{
"type": "object",
"properties": {
"zone": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"kind": {
"default": "generation",
"type": "string"
},
"min_mw": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"zone",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢compare_zones(endpoint, zones, start, end, aggregation, ...)
Compare one endpoint across multiple zones. `start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. `tz="local"` is rejected (zones may differ); pass an explicit IANA tz like "Europe/Berlin" if you need wall-clock alignment.
输入模式
{
"type": "object",
"properties": {
"endpoint": {
"type": "string"
},
"zones": {
"items": {
"type": "string"
},
"type": "array"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"aggregation": {
"default": "daily",
"type": "string"
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"endpoint",
"zones",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢data_coverage(zone, endpoint)
Show ingest coverage and lag for (endpoint × zone) — call before queries if you're not sure whether the data is landed yet.
输入模式
{
"type": "object",
"properties": {
"zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"endpoint": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}🟢list_derivations
List computed-metric derivations available via get_derivation(). Each derivation is a metric computed on-the-fly from one or more landed endpoints (Tier-2 Parquet). Today: capture_price (monthly VWAP capture price + baseload + capture rate per technology; "capture rate" is the industry-standard name for what the JSON response calls `quality_factor`), negative_price_hours, residual_load, res_share, emissions (monthly CO2 emissions per fuel using IPCC AR5 lifecycle factors, production-based), and tb_spread (monthly or annual Top-Bottom battery-arbitrage spread TB1/TB2/TB4/TB6 per zone on SDAC market days; accepts zone='all' for every zone in one call).
输入模式
{
"type": "object",
"properties": {},
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"result": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
}
},
"required": [
"result"
],
"x-fastmcp-wrap-result": true
}🟢get_derivation(slug, start, end, zone, from_zone, ...)
Compute **capture price**, **capture rate** (a.k.a. value factor / quality factor / Marktwertfaktor), **TBx battery-arbitrage spreads**, and other generation-weighted market metrics server-side from landed Parquet. Use this instead of fetching hourly prices + hourly generation yourself and weighting them client-side — server-side aggregation has no row cap and no pagination. `slug`: a key from list_derivations() — today: `"capture_price"`, `"negative_price_hours"`, `"residual_load"`, `"res_share"`, `"emissions"`, `"tb_spread"`. `tb_spread` returns monthly (default) or annual (aggregation='annual') Top-Bottom spreads TB1/TB2/TB4/TB6 in <currency>/MW per period — the sum of daily (top-x minus bottom-x hourly prices) over SDAC market days. The only slug accepting `aggregation`, and the only one accepting multi-zone `zone` ('all', a list, or CSV). Example — annual TB2 across every European market in ONE call: get_derivation("tb_spread", "2025-01-01", "2026-01-01", zone="all", aggregation="annual") For a single day's top/bottom hour TIMESTAMPS use get_tb_spread. `capture_price` returns monthly rows per (zone, psr_type, currency) with columns: currency, capture_price_eur_per_mwh, baseload_price_eur_per_mwh, quality_factor (the capture rate = capture/baseload), total_gen_mwh, n_hours. Months are bucketed by local time using the zone's IANA timezone. CURRENCY (capture_price and tb_spread alike): the `*_eur_per_mwh` / `tb*_eur_per_mw` key names are FIXED for API stability and do NOT track the actual unit — read the row's `currency` column, which is authoritative (EUR for euro zones, GBP for GB, PLN/RON/BGN for the PL/RO/BG local-currency eras). The response echoes it top-level as `currency`; a window spanning two currencies instead sets `unit` to null with `mixed_currency: true` and a `currencies` list. A month (or period) spanning a redenomination splits into one row PER CURRENCY, each computed only from that currency's hours — so never average or sum a price column across rows with different `currency` values. Summing `total_gen_mwh` across them IS correct: the split rows partition the month's hours rather than duplicating them. `quality_factor` is a ratio and stays comparable across currencies. `emissions` returns monthly rows per (zone, psr_type) with columns: generation_mwh, n_hours, emission_factor_kg_per_mwh, emissions_t_co2. Production-based; IPCC AR5 lifecycle factors. Zero-emission rows (nuclear, wind, solar, hydro, geothermal, marine) appear with emissions_t_co2 = 0 — useful for stacked charts. Filter via `psr_types=["solar","wind_onshore","wind_offshore"]` (or raw B-codes like "B16") to get only the technologies you care about. Defaults to all psr_types that have generation data. Example — Spain solar capture price, last 12 months: get_derivation("capture_price", "2025-05-01", "2026-05-01", zone="ES", psr_types=["B16"], tz="Europe/Madrid") Example — Germany 2024 emissions by fuel: get_derivation("emissions", "2024-01-01", "2025-01-01", zone="DE_LU", tz="Europe/Berlin") Returns 12 monthly rows in one call; no pagination.
输入模式
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"start": {
"type": "string"
},
"end": {
"type": "string"
},
"zone": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null
},
"from_zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"to_zone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"psr_types": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null
},
"aggregation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"tz": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": "local"
}
},
"required": [
"slug",
"start",
"end"
],
"additionalProperties": false
}输出模式
{
"type": "object",
"additionalProperties": true
}社区
证据