mcpField
S
swiss-energy-mcp

swiss-energy-mcp

ローカル
github.com地図・旅行05 週間前に更新

swiss-energy-mcp について

swiss-energy-mcp は、スイスのエネルギーインフラとオープンデータを位置情報から調べる MCP サーバーです。AI アシスタント向けに、発電所、再生可能エネルギー、屋根の太陽光ポテンシャル、Energiestädte、データセット検索のツールを提供します。

主な機能

  1. 01位置情報による発電所検索
  2. 02風力・水力・太陽光・バイオガス施設の確認
  3. 03Energiestädte と屋根の太陽光ポテンシャルの確認
  4. 045 レイヤーを統合した地域プロフィール
  5. 05SFOE データセット検索
  6. 06stdio と Streamable HTTP のトランスポート

活用シーン

  1. 01町の近くにある発電所の検索
  2. 02地域内の風力タービンの確認
  3. 03自治体の Energiestadt 認定状況の確認
  4. 04座標を指定した屋根の太陽光ポテンシャル評価

MCP 対応

MCP クライアントに、10 個の読み取り専用ツール、`energy://layers` リソース、`energy_site_assessment` プロンプトを公開します。ツールは認証なしで GeoAdmin と opendata.swiss を照会します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"malkreide-swiss-energy": {
"command": "uvx",
"args": [
"swiss-energy-mcp"
]
}
}
}
起動コマンドuvx swiss-energy-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiswiss-energy-mcp0.4.1

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

🇨🇭 スイス公共データ MCP ポートフォリオの一部です

⚡ swiss-energy-mcp

Version License: MIT Python 3.11+ MCP Data Source Tests CI

GeoAdmin REST API と opendata.swiss を通じてスイス連邦エネルギー庁(SFOE/BFE)のエネルギーデータを提供する MCP サーバーです。API キーは不要です。

🇩🇪 ドイツ語版

swiss-energy-mcp のデモ – Claude がヴェーデンスヴィル近郊の発電所を尋ねます


概要

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_datasetsopendata.swiss 上の SFOE データセットを全文検索
energy_check_statusGeoAdmin および 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 APIopendata.swiss/api/3/actionなし

使用する BFE レイヤー:

  • ch.bfe.elektrizitaetsproduktionsanlagen
  • ch.bfe.windenergieanlagen
  • ch.bfe.statistik-wasserkraftanlagen
  • ch.bfe.photovoltaik-grossanlagen
  • ch.bfe.biogasanlagen
  • ch.bfe.energiestaedte
  • ch.bfe.solarenergie-eignung-daecher

設定

すべての変数には SWISS_ENERGY_ プレフィックスが付き、起動時に検証されます。

環境変数デフォルト説明
SWISS_ENERGY_TRANSPORTstdioトランスポートモード:stdio または http
SWISS_ENERGY_HOST127.0.0.1HTTP トランスポートのホスト。0.0.0.0 にバインドするのはコンテナー内のみとしてください。
SWISS_ENERGY_PORT8000HTTP トランスポートのポート
SWISS_ENERGY_CORS_ORIGINShttps://claude.ai許可する CORS オリジン(HTTP トランスポート、カンマ区切り)
SWISS_ENERGY_ALLOWED_HOSTS(空)受信 Host の許可リスト(カンマ区切り)。ループバック以外にバインドする場合のみ必要です。
SWISS_ENERGY_LOG_LEVELINFOログレベル:DEBUG / INFO / WARNING / ERROR
SWISS_ENERGY_HTTP_TIMEOUT20上流 HTTP のタイムアウト(秒)

リスト形式の 2 つの変数は、カンマ区切り形式に加えて JSON 配列 — ["https://a.test"] — も使用できます。

テンプレートについては .env.example を参照してください。


MCP プロトコルのバージョン

このサーバーは、同じエンドポイントで2つのプロトコル世代に対応しています。接続時のクライアントからの最初のリクエストによって、どちらを適用するかが決まり、後から届いたもう一方の世代の指定は拒否されます。

世代リビジョン対応するクライアント
initialize ハンドシェイク2024-11-05 … 2025-11-25現在のクライアントが使用します。サーバーは要求されたリビジョンで応答し、要求がそれより新しい場合は上限の 2025-11-25 で応答します。
リクエストごとのエンベロープ2026-07-282026-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


クレジットと関連プロジェクト

インストール

uv の uvx で実行でき、クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用します。VS Code では .vscode/mcp.json にトップレベルの servers キーを使用してください)。

{
  "mcpServers": {
    "swiss-energy-mcp": {
      "command": "uvx",
      "args": [
        "swiss-energy-mcp"
      ]
    }
  }
}

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。