swiss-energy-mcp について
swiss-energy-mcp は、スイスのエネルギーインフラとオープンデータを位置情報から調べる MCP サーバーです。AI アシスタント向けに、発電所、再生可能エネルギー、屋根の太陽光ポテンシャル、Energiestädte、データセット検索のツールを提供します。
主な機能
- 01位置情報による発電所検索
- 02風力・水力・太陽光・バイオガス施設の確認
- 03Energiestädte と屋根の太陽光ポテンシャルの確認
- 045 レイヤーを統合した地域プロフィール
- 05SFOE データセット検索
- 06stdio と Streamable HTTP のトランスポート
活用シーン
- 01町の近くにある発電所の検索
- 02地域内の風力タービンの確認
- 03自治体の Energiestadt 認定状況の確認
- 04座標を指定した屋根の太陽光ポテンシャル評価
MCP 対応
MCP クライアントに、10 個の読み取り専用ツール、`energy://layers` リソース、`energy_site_assessment` プロンプトを公開します。ツールは認証なしで GeoAdmin と opendata.swiss を照会します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
⚡ swiss-energy-mcp
GeoAdmin REST API と opendata.swiss を通じてスイス連邦エネルギー庁(SFOE/BFE)のエネルギーデータを提供する MCP サーバーです。API キーは不要です。
概要
swiss-energy-mcp は、AI アシスタントがスイスのエネルギーインフラに、構造化された位置情報ベースの形式でアクセスできるようにします。GeoAdmin REST API と opendata.swiss カタログを通じて、スイス連邦エネルギー庁(SFOE/BFE)のオープンな地理データを利用しており、認証は一切不要です。
このサーバーは、拡大を続けるスイスのオープンデータ MCP サーバーのポートフォリオの一部です。swiss-road-mobility-mcp がモビリティをマッピングするのに対し、このサーバーはスイスの発電場所、太陽光発電のポテンシャルがある場所、そしてどの自治体が「Energiestadt」ラベルを取得しているかをマッピングする、エネルギーアトラス版と考えることができます。
デモでの主要な質問: 「ヴェーデンスヴィルの学校から 20 km 以内に発電所はいくつありますか?また、その自治体は Energiestadt ですか?」
特長
- 🔍 すぐに使える 10 個のツールで、SFOE/BFE の主要なエネルギーデータレイヤーを網羅
- ⚡ 発電所 — 太陽光、水力、風力、バイオマス、原子力の全種類に対応。カテゴリによる絞り込みも可能
- 💨 風力タービン — メーカー、モデル、ハブの高さ、年間発電量などの詳細データ
- 💧 水力発電所 — 種類、状態、タービン容量、年間予想発電量
- ☀️ 大規模太陽光発電設備 — プロジェクト名、容量、年間・冬季の発電量、標高
- 🌿 バイオガス発電所 — 発電所名、出力
- 🏙️ Energiestadt — スイスの「Energiestadt」ラベルを取得した自治体(スコア、取得年、監査)
- 🏠 屋根の太陽光発電ポテンシャル — 屋根の区画ごとの適性カテゴリ、面積、方位、傾斜
- 📊 地域エネルギープロファイル — 5 つのレイヤーを統合し、スイス国内の任意の場所の概要を表示
- 🗂️ SFOE データセット検索 — opendata.swiss に掲載された SFOE の公開資料を全文検索
- ✅ ステータス確認 — 上流の 2 つの API が利用可能かどうかを確認
- ☁️ デュアルトランスポート — Claude Desktop 用の stdio とクラウドデプロイ用の Streamable HTTP に対応
前提条件
- Python 3.11+
uv(推奨)またはpip
インストール
Claude Desktop(stdio トランスポート)
claude_desktop_config.json に追加します。
{
"mcpServers": {
"swiss-energy-mcp": {
"command": "uvx",
"args": ["swiss-energy-mcp"]
}
}
}
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
ローカル開発
git clone https://github.com/malkreide/swiss-energy-mcp.git
cd swiss-energy-mcp
uv sync
uv run swiss-energy-mcp
クラウド/HTTP トランスポート(Streamable HTTP)
ブラウザー版の claude.ai(ローカルソフトウェアのない管理対象ワークステーションなど)から利用する場合:
SWISS_ENERGY_TRANSPORT=http uvx swiss-energy-mcp
💡 「開発用ノート PC では stdio、ブラウザーでは HTTP。」
クイックスタート
Claude Desktop に接続したら、次の質問を試してみてください。
What power plants are within 20 km of Bern?
Show me all wind turbines in the Jura region.
Is Zürich an Energiestadt? What's their score?
What is the solar potential of rooftops near lat=47.37, lon=8.54?
Give me a full energy profile for the region around Lucerne.
Find SFOE datasets about hydropower.
利用可能なツール
| ツール | 説明 |
|---|---|
energy_find_power_plants | 指定した半径内にあるすべての発電所(任意のカテゴリーで絞り込み可能) |
energy_find_wind_turbines | メーカー、モデル、ハブ高さを含む風力タービン |
energy_find_hydro_plants | 発電容量と予想発電量を含む水力発電所 |
energy_find_pv_installations | 年間/冬季の発電量を含む大規模太陽光発電設備 |
energy_find_biogas_plants | バイオガス発電所 |
energy_find_energy_cities | 「Energiestadt」ラベルを持つ自治体 |
energy_solar_potential | 指定地点にある屋根区画の太陽光発電適性 |
energy_location_profile | 指定地点の総合エネルギープロファイル(5 レイヤー) |
energy_search_bfe_datasets | opendata.swiss 上の SFOE データセットを全文検索 |
energy_check_status | GeoAdmin および opendata.swiss API の利用可能状況を確認 |
すべてのツールは WGS84 座標(緯度/経度)を受け付けます。Swiss LV95 への変換は内部で処理されます。
使用例
| クエリ | ツール |
|---|---|
| 「ベルン近郊(半径 20 km)の発電所は?」 | energy_find_power_plants |
| 「ジュラ地方の風力タービンは?」 | energy_find_wind_turbines |
| 「チューリッヒは Energiestadt ですか?」 | energy_find_energy_cities |
| 「緯度=47.37、経度=8.54 付近の屋上の太陽光発電ポテンシャルは?」 | energy_solar_potential |
| 「ルツェルン地域の総合エネルギープロファイルは?」 | energy_location_profile |
| 「水力発電に関する SFOE のデータセットは?」 | energy_search_bfe_datasets |
データソース
| ソース | URL | 認証 |
|---|---|---|
| GeoAdmin REST API(swisstopo) | api3.geo.admin.ch | なし |
| opendata.swiss CKAN API | opendata.swiss/api/3/action | なし |
使用する BFE レイヤー:
ch.bfe.elektrizitaetsproduktionsanlagench.bfe.windenergieanlagench.bfe.statistik-wasserkraftanlagench.bfe.photovoltaik-grossanlagench.bfe.biogasanlagench.bfe.energiestaedtech.bfe.solarenergie-eignung-daecher
設定
すべての変数には SWISS_ENERGY_ プレフィックスが付き、起動時に検証されます。
| 環境変数 | デフォルト | 説明 |
|---|---|---|
SWISS_ENERGY_TRANSPORT | stdio | トランスポートモード:stdio または http |
SWISS_ENERGY_HOST | 127.0.0.1 | HTTP トランスポートのホスト。0.0.0.0 にバインドするのはコンテナー内のみとしてください。 |
SWISS_ENERGY_PORT | 8000 | HTTP トランスポートのポート |
SWISS_ENERGY_CORS_ORIGINS | https://claude.ai | 許可する CORS オリジン(HTTP トランスポート、カンマ区切り) |
SWISS_ENERGY_ALLOWED_HOSTS | (空) | 受信 Host の許可リスト(カンマ区切り)。ループバック以外にバインドする場合のみ必要です。 |
SWISS_ENERGY_LOG_LEVEL | INFO | ログレベル:DEBUG / INFO / WARNING / ERROR |
SWISS_ENERGY_HTTP_TIMEOUT | 20 | 上流 HTTP のタイムアウト(秒) |
リスト形式の 2 つの変数は、カンマ区切り形式に加えて JSON 配列 — ["https://a.test"] —
も使用できます。
テンプレートについては .env.example を参照してください。
MCP プロトコルのバージョン
このサーバーは、同じエンドポイントで2つのプロトコル世代に対応しています。接続時のクライアントからの最初のリクエストによって、どちらを適用するかが決まり、後から届いたもう一方の世代の指定は拒否されます。
| 世代 | リビジョン | 対応するクライアント |
|---|---|---|
initialize ハンドシェイク | 2024-11-05 … 2025-11-25 | 現在のクライアントが使用します。サーバーは要求されたリビジョンで応答し、要求がそれより新しい場合は上限の 2025-11-25 で応答します。 |
| リクエストごとのエンベロープ | 2026-07-28 | 2026-07-28 の _meta エンベロープを含むリクエストによって、モダンな接続が開始されます。 |
どちらのリビジョンも
tests/test_protocol_version.py で固定され、インストール済み SDK と照合されます。そのため、Dependabot による mcp の更新で、どちらかが気付かないうちに変更されることはありません。ハンドシェイクの上限は定数名を確認するのではなく、組み立て済みの ASGI スタックを介した実際の initialize で測定されます。
SDK の LATEST_PROTOCOL_VERSION はハンドシェイク世代ではなく、モダンな世代のエイリアスです。これだけに対して固定すると、現在のクライアントが実際にネゴシエートする世代が変更されても検出できません。
更新ポリシー。 ゲートが失敗した場合、定数をむやみに編集しないでください。2つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正常に動作することを確認してから、定数、このセクション、README.de.md、CHANGELOG.md をまとめて更新してください。
サーバーの識別情報
モダンな世代の各レスポンスには、サーバーの識別情報が _meta["io.modelcontextprotocol/serverInfo"] に含まれます。ハンドシェイク世代では、同じブロックが一度だけ initialize.serverInfo に含まれます。
{
"name": "swiss_energy_mcp",
"title": "Swiss Energy MCP",
"version": "<version from the package metadata>",
"websiteUrl": "https://github.com/malkreide/swiss-energy-mcp"
}
version はインストール済みパッケージのメタデータから取得され、src/ 内のリテラルから取得されることはありません。scripts/check_version_sync.py は、そこで手動管理された数値が使われている場合にエラーにします。両方の世代は、組み立て済みの ASGI スタックを介して
tests/test_server_identity.py で測定されます。SDK の version のデフォルト値は空文字列なので、コンストラクター引数が欠けていてもエラーにはなりません。
MCP プリミティブ
このサーバーは、MCP の3つのプリミティブすべてを使用します。
- ツール — 読み取り専用のツールが10個あります(上記参照)。各検索ツールは
EnergyResponseエンベロープを返します。構造化されたresultsと Markdown のsummaryに加え、明示的なsource/licenseの帰属表示とmatch_typeフィールドを含みます。 - リソース —
energy://layers。BFE GeoAdmin レイヤーの静的カタログです。 - プロンプト —
energy_site_assessment。場所分析のためのガイド付きテンプレートです。
開発フェーズ
このサーバーは**フェーズ1(読み取り専用)**です。段階的なアーキテクチャについては docs/roadmap.md を、送信先許可リスト、SSRF 保護、三位一体評価については docs/security.md を参照してください。
安全性と制限
| 項目 | 詳細 |
|---|---|
| アクセス | 読み取り専用(readOnlyHint: true) — サーバーはデータを変更または削除できません |
| 個人データ | 個人データはありません。すべてのソースは、集約された公共インフラデータです |
| レート制限 | クエリごとの上限を組み込み済み(検索結果は最大50件、デフォルトの半径は5 km) |
| タイムアウト | API 呼び出しごとに20秒 |
| 認証 | API キーは不要です。どちらの API も一般公開されています |
| ライセンス | すべてのデータは opendata.swiss(OGD)経由でオープンライセンスの下に提供されています |
| 利用規約 | 各データソースの利用規約が適用されます:GeoAdmin、opendata.swiss、SFOE/BFE |
アーキテクチャ
┌─────────────────┐ ┌───────────────────────────┐ ┌──────────────────────────┐
│ Claude / AI │────▶│ Swiss Energy MCP │────▶│ SFOE / BFE Open Data │
│ (MCP Host) │◀────│ (MCP Server) │◀────│ │
└─────────────────┘ │ │ │ GeoAdmin REST API │
│ 10 Tools │ │ (api3.geo.admin.ch) │
│ Stdio | HTTP │ │ │
│ │ │ opendata.swiss CKAN │
│ server.py (FastMCP) │ │ (opendata.swiss) │
│ api_client.py │ └──────────────────────────┘
│ LV95 conversion │
│ GeoAdmin queries │
└───────────────────────────┘
インフラストラクチャコンポーネント
| コンポーネント | 比喩 | 機能 |
|---|---|---|
api_client.py | 配電盤 | HTTP リクエスト、座標変換、エラー処理を担当します |
| LV95 converter | 翻訳機 | WGS84(緯度/経度)をスイスの座標系に変換します |
server.py | 店舗 | FastMCP 経由ですべての10個のツールを公開します |
プロジェクト構成
swiss-energy-mcp/
├── src/
│ └── swiss_energy_mcp/
│ ├── server.py # FastMCP setup, lifespan, entry point
│ ├── settings.py # Typed configuration (pydantic-settings)
│ ├── logging_config.py # Structured JSON logging to stderr
│ ├── api_client.py # HTTP client, egress guard, LV95 conversion
│ ├── models.py # Pydantic input/output models
│ ├── formatting.py # Markdown summary builders
│ ├── resources.py # Layer-catalogue resource + prompt
│ └── tools/ # One module per tool group
│ ├── installations.py # power, wind, hydro, PV, biogas
│ ├── places.py # solar, Energiestadt, location profile
│ └── catalog.py # dataset search, status
├── tests/
│ ├── test_unit.py # Pure-unit tests (coords, formatting, egress)
│ ├── test_tools.py # Tool tests with respx-mocked APIs
│ └── test_live.py # Live integration tests (marked `live`)
├── docs/ # roadmap.md, security.md
├── Dockerfile # Multi-stage build, non-root user
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md # Contribution guide (English)
├── CONTRIBUTING.de.md # Contribution guide (German)
├── SECURITY.md # Security policy (English)
├── SECURITY.de.md # Security policy (German)
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German version
既知の制限事項
- GeoAdmin の半径検索: 最大検索半径はレイヤーの密度によって異なります。半径が非常に大きい場合、結果が一部しか返されないことがあります
- 太陽光発電の可能性: レイヤー
ch.bfe.solarenergie-eignung-daecherは建物の外形を対象としており、すべての屋根の種類が分類されているわけではありません - Energiestadt: 有効なラベルを持つ自治体のみが含まれます。過去のデータは不完全な場合があります
- opendata.swiss CKAN: 全文検索の対象はメタデータのみで、ドキュメントの内容は対象外です
テスト
# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Live integration tests (network access required)
PYTHONPATH=src pytest tests/ -m "live"
変更履歴
CHANGELOG.md を参照してください
貢献
CONTRIBUTING.md(🇩🇪 ドイツ語)を参照してください
セキュリティ
セキュリティポリシーとセキュリティ体制の概要については SECURITY.md(🇩🇪 ドイツ語)を、セキュリティモデルの技術的な詳細については docs/security.md を参照してください。
ライセンス
MIT ライセンス — LICENSE を参照してください
作者
Hayal Oezkan · malkreide
クレジットと関連プロジェクト
- データ: SFOE/BFE(GeoAdmin 経由)— スイス連邦エネルギー庁
- データ: opendata.swiss — スイスのオープンガバメントデータポータル
- プロトコル: Model Context Protocol — Anthropic / Linux Foundation
- 関連: swiss-road-mobility-mcp — スイスのモビリティデータ向け MCP サーバー
- 関連: zurich-opendata-mcp — チューリッヒ市のオープンデータ向け MCP サーバー
- ポートフォリオ: Swiss Public Data MCP Portfolio
インストール
uv の uvx で実行でき、クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用します。VS Code では .vscode/mcp.json にトップレベルの servers キーを使用してください)。
{
"mcpServers": {
"swiss-energy-mcp": {
"command": "uvx",
"args": [
"swiss-energy-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。