{"name":"com.entsoemcp/entsoe-mcp","slug":"entsoemcp-entsoe-mcp","title":"entsoe-mcp","description":"European power-market data: day-ahead & balancing prices, load, generation, flows, outages. 47 zones","url":"https://mcp.market/server/entsoemcp-entsoe-mcp","rating":null,"grade":"C","score":63,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":8,"ok":8,"last_checked_at":"2026-09-21T07:50:34.667Z","last_ok_at":"2026-09-21T07:50:34.667Z","latency_ms":192},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://entsoemcp.com","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://entsoemcp.com/mcp"}],"packages":[],"tools":[{"name":"compare_zones","description":"Compare one endpoint across multiple zones.\n\n`start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE.\n`tz=\"local\"` is rejected (zones may differ); pass an explicit IANA\ntz like \"Europe/Berlin\" if you need wall-clock alignment.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"data_coverage","description":"Show ingest coverage and lag for (endpoint × zone) — call before queries\nif you're not sure whether the data is landed yet.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"zone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false}},{"name":"get_crossborder_flow","description":"Cross-border physical flow (MW) between two adjacent zones.\n\n`start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE.\n`tz=\"local\"` uses the FROM-zone's timezone; or pass an IANA name.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_day_ahead_prices","description":"Day-ahead clearing price for a bidding zone, in the zone's trading\ncurrency (EUR for euro zones; the per-row `currency` column and the\nresponse `unit` say which — GB=GBP, PL/RO/BG carry local-currency eras).\n\n`start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE.\nFor 'all of April 2026' use start=2026-04-01, end=2026-05-01\n(end=2026-04-30 silently drops the final UTC day — and 1–2 local-time\nhours of April for European zones in CET/CEST). The response's\n`period` block shows the resolved window so you can verify\n(a 30-day month is 720 hours).\n\n`tz`: pass \"local\" to interpret start/end as wall-clock in the zone's\ntimezone, or an explicit IANA name like \"Europe/Berlin\". The server\nconverts to UTC at the boundary.\n\nIf you're computing a **generation-weighted** price metric — capture\nprice, capture rate, value factor, merchant-PPA achieved price — use\n`get_derivation(slug=\"capture_price\", …)` instead. It runs server-side\nover the full window and returns monthly rows; no row cap, no pagination.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_derivation","description":"Compute **capture price**, **capture rate** (a.k.a. value factor /\nquality factor / Marktwertfaktor), **TBx battery-arbitrage spreads**,\nand other generation-weighted market metrics server-side from landed\nParquet. Use this instead of fetching hourly prices + hourly generation\nyourself and weighting them client-side — server-side aggregation has\nno row cap and no pagination.\n\n`slug`: a key from list_derivations() — today: `\"capture_price\"`,\n`\"negative_price_hours\"`, `\"residual_load\"`, `\"res_share\"`,\n`\"emissions\"`, `\"tb_spread\"`.\n\n`tb_spread` returns monthly (default) or annual (aggregation='annual')\nTop-Bottom spreads TB1/TB2/TB4/TB6 in <currency>/MW per period — the sum\nof daily (top-x minus bottom-x hourly prices) over SDAC market days. The\nonly slug accepting `aggregation`, and the only one accepting\nmulti-zone `zone` ('all', a list, or CSV). Example — annual TB2 across\nevery European market in ONE call:\n  get_derivation(\"tb_spread\", \"2025-01-01\", \"2026-01-01\",\n                 zone=\"all\", aggregation=\"annual\")\nFor a single day's top/bottom hour TIMESTAMPS use get_tb_spread.\n\n`capture_price` returns monthly rows per (zone, psr_type, currency) with\ncolumns: currency, capture_price_eur_per_mwh, baseload_price_eur_per_mwh,\nquality_factor (the capture rate = capture/baseload), total_gen_mwh,\nn_hours. Months are bucketed by local time using the zone's IANA\ntimezone.\n\nCURRENCY (capture_price and tb_spread alike): the `*_eur_per_mwh` /\n`tb*_eur_per_mw` key names are FIXED for API stability and do NOT track\nthe actual unit — read the row's `currency` column, which is\nauthoritative (EUR for euro zones, GBP for GB, PLN/RON/BGN for the\nPL/RO/BG local-currency eras). The response echoes it top-level as\n`currency`; a window spanning two currencies instead sets `unit` to null\nwith `mixed_currency: true` and a `currencies` list. A month (or period)\nspanning a redenomination splits into one row PER CURRENCY, each computed\nonly from that currency's hours — so never average or sum a price column\nacross rows with different `currency` values. Summing `total_gen_mwh`\nacross them IS correct: the split rows partition the month's hours rather\nthan duplicating them. `quality_factor` is a ratio and stays comparable\nacross currencies.\n\n`emissions` returns monthly rows per (zone, psr_type) with columns:\ngeneration_mwh, n_hours, emission_factor_kg_per_mwh, emissions_t_co2.\nProduction-based; IPCC AR5 lifecycle factors. Zero-emission rows\n(nuclear, wind, solar, hydro, geothermal, marine) appear with\nemissions_t_co2 = 0 — useful for stacked charts.\n\nFilter via `psr_types=[\"solar\",\"wind_onshore\",\"wind_offshore\"]` (or\nraw B-codes like \"B16\") to get only the technologies you care about.\nDefaults to all psr_types that have generation data.\n\nExample — Spain solar capture price, last 12 months:\n  get_derivation(\"capture_price\", \"2025-05-01\", \"2026-05-01\",\n                 zone=\"ES\", psr_types=[\"B16\"], tz=\"Europe/Madrid\")\nExample — Germany 2024 emissions by fuel:\n  get_derivation(\"emissions\", \"2024-01-01\", \"2025-01-01\",\n                 zone=\"DE_LU\", tz=\"Europe/Berlin\")\nReturns 12 monthly rows in one call; no pagination.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_generation","description":"Aggregated generation (MW) per production type.\n\n`start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE.\nFor a full calendar month set `end` to the first day of the next\nmonth. Pass `tz=\"local\"` or an IANA name to interpret start/end as\nwall-clock in that timezone.\n\nIf you're computing a **generation-weighted** price metric — capture\nprice, capture rate, value factor, merchant-PPA achieved price — use\n`get_derivation(slug=\"capture_price\", …)` instead. It runs server-side\nover the full window and returns monthly rows; no row cap, no pagination.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_load","description":"Actual or forecast load (MW). kind = actual | forecast | both.\n\n`start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE.\nFor a full calendar month set `end` to the first day of the next\nmonth. Pass `tz=\"local\"` or an IANA name to interpret start/end as\nwall-clock in that timezone.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_outages","description":"Generation-unit unavailability events (UMM).\n\n`start`/`end` default to UTC; `start` inclusive, `end` EXCLUSIVE. An\noutage is returned if it overlaps the window. Pass `tz=\"local\"` or an\nIANA name to interpret start/end as wall-clock in that timezone.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_series","description":"Generic time-series query for ANY registered series endpoint.\n\nOne tool covers every (non-outage) endpoint in the registry, so adding\na new dataset (call `list_endpoints()` to see the current 14) gets an\nMCP surface automatically — no new tool to learn.\n\nArgument shape adapts to the endpoint:\n  • single-zone (day_ahead_price, actual_load, generation_per_type, …)\n    → pass `zone=\"DE_LU\"`\n  • cross-zone  (crossborder_flow, scheduled_exchanges,\n                 net_transfer_capacity_dayahead)\n    → pass `from_zone=\"DE_LU\"` AND `to_zone=\"FR\"`\n  • psr-dependent (generation_per_type, wind_solar_forecast,\n                   installed_generation_capacity)\n    → optionally filter via `psr_types=[\"solar\",\"wind_onshore\"]`\n\n`start`/`end`: UTC by default; `start` inclusive, `end` EXCLUSIVE\n(for \"all of April 2026\" use end=2026-05-01). Pass `tz=\"local\"` or an\nIANA name to interpret as wall-clock in that timezone.\n\n`aggregation`: 'raw' (default — native PT15M/PT60M per endpoint),\n'hourly' (AVG over quarters → one row per hour, useful for the\ngrowing list of PT15M-stored endpoints like DE_LU day_ahead_price),\n'daily', or 'monthly'. For day-ahead prices specifically the auction\nstill clears hourly even where stored at PT15M, so AVG=any-quarter;\nSUM would 4× over-count.\n\nOutage-family endpoints (different schema) stay on `get_outages()`.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_tb_spread","description":"Top-Bottom (TBx) spread — daily battery-arbitrage benchmark.\nTBx = sum(top X priced hours) − sum(bottom X priced hours) over the\nday-ahead clearing prices for `zone` on `date`. The day is the SDAC\nmarket day (23/25 hours on DST-transition days). `date` must be a\nbare YYYY-MM-DD — time-bearing strings are rejected.\nReturns both `spread` (<currency>/MW/day) and `mean_spread`\n(<currency>/MWh = spread/X) in the zone's trading currency — see the\nresponse `currency`/`unit` (EUR for euro zones; GB=GBP).\nCommon X: 1, 2, 4.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"zone":{"type":"string"},"date":{"type":"string"},"x":{"default":2,"type":"integer"}},"required":["zone","date"],"additionalProperties":false}},{"name":"list_derivations","description":"List computed-metric derivations available via get_derivation().\n\nEach derivation is a metric computed on-the-fly from one or more\nlanded endpoints (Tier-2 Parquet). Today: capture_price (monthly\nVWAP capture price + baseload + capture rate per technology;\n\"capture rate\" is the industry-standard name for what the JSON\nresponse calls `quality_factor`), negative_price_hours, residual_load,\nres_share, emissions (monthly CO2 emissions per fuel using IPCC\nAR5 lifecycle factors, production-based), and tb_spread (monthly or\nannual Top-Bottom battery-arbitrage spread TB1/TB2/TB4/TB6 per zone\non SDAC market days; accepts zone='all' for every zone in one call).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"list_endpoints","description":"List supported ENTSO-E endpoint families.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"family":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false}},{"name":"list_psr_types","description":"List production-type (psr_type) codes. Pass zone= to scope the answer.\n\nMost codes are ENTSO-E's B01..B25 and mean the same thing in every\nENTSO-E zone. A few are source-native (source != \"entsoe\") and exist only\nwhere that source publishes — they express concepts the B-codes cannot,\nso they are NOT interchangeable with a similar-looking B-code. Check\n`source` and read `description` before comparing a code across zones.\n\nPassing zone= also returns `taxonomy_note` for zones that mix taxonomies\n(e.g. GB), and per-code `endpoints` showing where each code comes from.\n\nEach code carries `counts_as_generation`: when False the figure is a net\nflow or net storage number, not production — do not sum it into a\ngeneration total.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"zone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false}},{"name":"list_zones","description":"List registered ENTSO-E bidding zones.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"active_only":{"default":true,"type":"boolean"},"cluster":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false}}],"scan":{"score":63,"grade":"C","scanned_at":"2026-09-20T21:00:21.632Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T21:00:21.615Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2013ms"]},"poisoning":{"score":13,"max":15,"notes":["14 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool get_derivation: …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.…"},{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://entsoemcp.com/mcp","reachable":true,"authRequired":false,"latencyMs":2013,"serverInfo":{"name":"MCP Energy Data","version":"1.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://entsoemcp.com/apple-touch-icon.png","source":"registry","width":180,"height":180},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}