
Swiss Energy Mcp
io.github.malkreidePublished by GitHub account malkreidev0.5.1Updated Nov 3, 2026
Swiss energy data via SFOE/BFE and GeoAdmin REST APIs
Overview
Swiss Energy's local MCP server; no sign-in required; STDIO.
No AI overview yet: these facts come from the registry entry and the server itself.
Installation
In SourceWeft
- Open Swiss Energy Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
🇨🇭 Part of the Swiss Public Data MCP Portfolio
⚡ swiss-energy-mcp
[Version] [License: MIT] [Python 3.11+] [MCP] [Data Source] [Tests] [CI]
MCP server for Swiss energy data from the Federal Office of Energy (SFOE/BFE) via GeoAdmin REST API and opendata.swiss — no API key required.
[swiss-energy-mcp demo – Claude asks for power plants near Wädenswil]
Overview
swiss-energy-mcp gives AI assistants structured, location-based access to Switzerland's energy infrastructure. Built on open geodata from the Swiss Federal Office of Energy (SFOE/BFE) via the GeoAdmin REST API and the opendata.swiss catalogue — completely authentication-free.
The server is part of a growing portfolio of Swiss open data MCP servers. Think of it as the energy atlas counterpart to swiss-road-mobility-mcp: while the latter maps mobility, this server maps where Switzerland produces electricity, where solar potential exists, and which municipalities hold the "Energiestadt" label.
Anchor demo query: "Which power plants are within 20 km of the school in Wädenswil — and is the municipality an Energiestadt?"
Features
- 🔍 10 ready-to-use tools covering all major energy data layers from SFOE/BFE
- ⚡ Power plants — all types: photovoltaic, hydro, wind, biomass, nuclear, with optional category filter
- 💨 Wind turbines — detailed data incl. manufacturer, model, hub height, annual production
- 💧 Hydropower plants — type, status, turbine capacity, expected annual output
- ☀️ PV large installations — project name, capacity, annual/winter production, altitude
- 🌿 Biogas plants — plant name, output
- 🏙️ Energiestädte — municipalities with the Swiss "Energiestadt" label (score, year awarded, audits)
- 🏠 Solar roof potential — suitability category, area, orientation, and slope per roof segment
- 📊 Location energy profile — combines 5 layers into a single overview for any Swiss location
- 🗂️ SFOE dataset search — full-text search across SFOE publications on opendata.swiss
- ✅ Status check — verifies availability of both upstream APIs
- ☁️ Dual transport — stdio for Claude Desktop, Streamable HTTP for cloud deployment
Prerequisites
- Python 3.11+
uv(recommended) orpip
Installation
Claude Desktop (stdio transport)
Add to your claude_desktop_config.json:
Config file locations:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Local development
Cloud / HTTP transport (Streamable HTTP)
For use via claude.ai in the browser (e.g. on managed workstations without local software):
💡 "stdio for the developer laptop, HTTP for the browser."
Quickstart
Once connected in Claude Desktop, try:
Available Tools
All tools accept WGS84 coordinates (lat/lon). Conversion to Swiss LV95 is handled internally.
Example Use Cases
→ More use cases by audience →
Data Sources
BFE Layers used:
ch.bfe.elektrizitaetsproduktionsanlagench.bfe.windenergieanlagench.bfe.statistik-wasserkraftanlagench.bfe.photovoltaik-grossanlagench.bfe.biogasanlagench.bfe.energiestaedtech.bfe.solarenergie-eignung-daecher
Configuration
All variables use the SWISS_ENERGY_ prefix and are validated at startup.
Both list-valued variables also accept a JSON array — ["https://a.test"] —
in addition to the comma-separated form.
See .env.example for a template.
MCP Protocol Version
This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.
Both revisions are pinned in
tests/test_protocol_version.py and asserted
against the installed SDK, so a Dependabot bump of mcp cannot move either one
silently. The handshake ceiling is measured against a live initialize through
the assembled ASGI stack, not read off a constant name.
Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern
era, not for the handshake era — pinning against it alone would leave the era
that current clients actually negotiate free to drift.
Update policy. When the gate fails, do not edit the constant blindly: read
the spec changelog between the two revisions, verify the server still behaves,
then move the constant, this section, README.de.md and
CHANGELOG.md together.
Server identity
Every modern-era response carries the server's identity under
_meta["io.modelcontextprotocol/serverInfo"]; the handshake era carries the
same block once, in initialize.serverInfo:
version comes from the installed package metadata, never from a literal in
src/ — scripts/check_version_sync.py rejects a hand-maintained number
there. Both eras are measured through the assembled ASGI stack in
tests/test_server_identity.py: the SDK
default for version is the empty string, so a missing constructor argument
is silent rather than red.
MCP Primitives
The server uses all three MCP primitives:
- Tools — 10 read-only tools (see above). Every search tool returns an
EnergyResponseenvelope: structuredresultsplus a Markdownsummary, explicitsource/licenseattribution, and amatch_typefield. - Resource —
energy://layers, the static catalogue of BFE GeoAdmin layers. - Prompt —
energy_site_assessment, a guided location-analysis template.
Development Phase
The server is in Phase 1 (read-only). See docs/roadmap.md for the phased architecture and docs/security.md for the egress allow-list, SSRF protection and trifecta assessment.
Safety & Limits
Architecture
Infrastructure Components
Project Structure
Known Limitations
- GeoAdmin radius search: Maximum search radius depends on layer density; very large radii may return partial results
- Solar potential: Layer
ch.bfe.solarenergie-eignung-daechercovers building footprints — not all roof types are classified - Energiestadt: Only municipalities with active label are included; historical entries may be incomplete
- opendata.swiss CKAN: Full-text search covers metadata only, not document contents
Testing
Changelog
See CHANGELOG.md
Contributing
See CONTRIBUTING.md (🇩🇪 Deutsch)
Security
See SECURITY.md (🇩🇪 Deutsch) for the security policy and posture summary, and docs/security.md for the full technical security model.
License
MIT License — see LICENSE
Author
Hayal Oezkan · malkreide
Credits & Related Projects
- Data: SFOE/BFE via GeoAdmin — Swiss Federal Office of Energy
- Data: opendata.swiss — Swiss Open Government Data portal
- Protocol: Model Context Protocol — Anthropic / Linux Foundation
- Related: swiss-road-mobility-mcp — MCP server for Swiss mobility data
- Related: zurich-opendata-mcp — MCP server for Zurich city open data
- Portfolio: Swiss Public Data MCP Portfolio
Installation
Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
Source: README.md at commit 2608613
Tools
0Version history
2- v0.5.1LatestNov 3, 2026
- v0.4.1Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts