lobbywatch-mcp について
lobbywatch-mcpは、透明性調査を行うAIクライアント向けに、Lobbywatch.chのスイス連邦議員、利益関係、ロビー団体のデータを提供します。週次ダンプとキャッシュによる代替応答を使い、各応答にデータの帰属表示を含めます。
主な機能
- 01議員プロフィールと利益関係の検索
- 02業界・委員会による絞り込み
- 03ロビー団体と関係議員の取得
- 04議員ランキングと透明性統計
- 05キャッシュ確認とダンプ更新
活用シーン
- 01特定業界に関係する議員の調査
- 02委員会別の透明性スコア分布の確認
- 03ロビー団体に関係する議員の一覧化
MCP 対応
MCP サーバーは、議員、利益関係、ロビー団体、透明性データを検索するツールを公開します。stdio、streamable-http、sse の各トランスポートに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🏛️ lobbywatch-mcp
AI モデルを、スイス連邦議会最大のロビー活動データベース Lobbywatch.ch に接続する MCP サーバーです。利益相反、ロビー団体、入館証、透明性スコアを扱います。
Swiss Public Data MCP Portfolio の一部 — AI モデルをスイスの公共データソースに接続します。
🎯 クエリのデモ
「国民議会の教育・文化委員会(WBK-N)の委員のうち、教育関連出版社や民間教育機関との利益相反を申告しているのは誰ですか。また、その透明性評価はどのようになっていますか?」
国民議会の教育委員会の委員は、教育関連出版社や民間教育機関との利益相反を申告していますか。その報酬の透明性スコアはどのようになっていますか?
デモ
概要
Lobbywatch.ch は、スイス連邦議会議員とロビー団体との関係を扱う最大の公開データベースを運営しています。議員 245 人、約 7,800 件の利害関係(申告済みの委任)、ロビー団体 139 団体、入館証保有者 368 人のデータを収録し、毎週更新されています。ライセンスは CC BY-SA 4.0 です。
lobbywatch-mcp は、Model Context Protocol を介してこのデータを大規模言語モデルに提供します。公式のスイス連邦議会 Curia Vista データを扱う parlament-mcp と併用することを想定しています。この 2 つを組み合わせることで、1 回の会話で、議員が公式に「何を」行ったか、そして「誰と」つながりがあるかを尋ねられます。
機能
- ダンプ優先、API フォールバックのアーキテクチャ。 週次の JSON ダンプを主要なデータソースとして使用します(安定しており、本番環境で検証済み)。ライブの
dataIFREST API は、信頼できるデータを返す用途(ロビー団体、検索)に限って使用します。 - 古いキャッシュへのフォールバック。常に明示します。 ダンプを更新できない場合は、最大 7 日前のキャッシュ済みコピーで応答します。その場合、ダンプを利用するすべての応答に
staleブロックが含まれ、ダウンロード時刻、経過時間、更新に失敗した理由が示されます。データソースは 15 分ごとに再試行されます。lobbywatch_refresh_dumpはフォールバックしません。 - Phase 1 の 7 つのツール — 議員の検索、利益相反の一覧表示、業種別検索、ロビー団体の取得、ランキング、透明性比率、キャッシュ制御。
- CC BY-SA 4.0 の帰属表示を、Pydantic エンベロープを介してすべての応答に組み込みます。
- 2 種類のトランスポート — Claude Desktop 向けの
stdio、クラウドへのデプロイ向けのstreamable-http/sse。 - 「Jositsch」や「Wehrli」のような自然な LLM 入力に対応する、rapidfuzz によるあいまい名前照合。
- 認証不要(Phase 1 — 認証なしを優先)。
アーキテクチャ
┌─────────────────────────────┐
LLM client │ LobbywatchClient │
(Claude Desktop, │ │
Inspector, …) │ ┌───────────────────┐ │
│ │ │ Dump cache │ │ cms.lobbywatch.ch
│ MCP │ │ (24 h TTL, │ │ ┌──────────────────┐
▼ stdio / │ │ ~80 MB resident)├─────┼─────►│ weekly JSON │
┌─────────┐ HTTP │ └───────────────────┘ │ │ export (~17 MB) │
│ FastMCP │◄────►│ │ └──────────────────┘
│ server │ │ ┌───────────────────┐ │ ┌──────────────────┐
└─────────┘ │ │ dataIF REST ├─────┼─────►│ /interface/v1/ │
│ │ (live fallback) │ │ │ json/… │
│ └───────────────────┘ │ └──────────────────┘
└─────────────────────────────┘
外向きの HTTP 通信には、follow_redirects=False を設定した単一の httpx.AsyncClient を使用します。これには、RFC1918/リンクローカル/メタデータ IP をブロックする SSRF ガードと、リクエストごとに名前解決を再実行する httpx イベントフックが含まれます。議員に関するクエリではダンプを主要な信頼できる情報源として使用し、ロビー団体の検索と検索エンドポイントに限り dataIF を使用します。
前提条件
- Python 3.11 以降
- 週次の Lobbywatch JSON エクスポート(ZIP 圧縮で約 17 MB)をダウンロードできるインターネット接続
インストール
PyPI から(初回リリース後):
pip install lobbywatch-mcp
ソースから:
git clone https://github.com/malkreide/lobbywatch-mcp.git
cd lobbywatch-mcp
pip install -e ".[dev]"
使用方法
単独で実行
lobbywatch-mcp
これにより、サーバーが stdio モードで起動します。HTTP の場合:
LOBBYWATCH_MCP_TRANSPORT=http LOBBYWATCH_MCP_PORT=8000 lobbywatch-mcp
コンテナー
強化されたマルチステージの Dockerfile がリポジトリに含まれています(非 root で実行でき、read-only-rootfs に対応しています)。リソース制限、スティッキー LB に関するガイダンス、エグレスの強化については、docs/deployment.md および deploy/docker-compose.example.yml を参照してください。
docker build -t lobbywatch-mcp:0.2.0 .
docker run --rm -p 127.0.0.1:8000:8000 lobbywatch-mcp:0.2.0
Claude Desktop
claude_desktop_config.json に次の設定を追加します。
{
"mcpServers": {
"lobbywatch": {
"command": "uvx",
"args": ["lobbywatch-mcp"]
}
}
}
完全な例は claude_desktop_config.json にあります。
クエリの例
接続したら、次のようなプロンプトを試してみてください。
- 「SP党で interessenbindungen の数が最も多い国会議員を上位10名教えてください。」
- 「出版業界または教育業界で委任を受けている WBK-N の委員は誰ですか?」
- 「ロビー団体『economiesuisse』を調べ、関係する国会議員を一覧にしてください。」
- 「財務委員会(FK-N)の報酬透明性スコアの分布を教えてください。」
ツール
すべてのツール名には、関連するポートフォリオの他のサーバーとの衝突を避けるため、lobbywatch_ 名前空間のプレフィックスが付いています(0.2.0 以降)。
| ツール | 目的 | ソース |
|---|---|---|
lobbywatch_get_parlamentarier(name_or_id) | 全利益相反を含む詳細プロフィール | ダンプ |
lobbywatch_list_interessenbindungen(name_or_id, nur_hauptberuflich, nur_aktiv) | 条件で絞り込んだ委任の一覧 | ダンプ |
lobbywatch_search_parlamentarier_nach_branche(branche_query, kommission, limit) | 業界と委員会による横断的な絞り込み | ダンプ |
lobbywatch_get_lobbygruppe(name_or_id) | 関係する国会議員と組織を含むロビー団体の情報 | ライブデータIF |
lobbywatch_get_ranking(kriterium, kommission, partei, limit) | 指標ごとの上位 N 件 | ダンプ |
lobbywatch_get_transparenzquote(kommission) | 報酬透明性ラベルの分布 | ダンプ |
lobbywatch_refresh_dump() / lobbywatch_dump_status() | キャッシュ制御 | ダンプ |
設定
すべての動作は環境変数で制御します。
| 変数 | デフォルト | 目的 |
|---|---|---|
LOBBYWATCH_MCP_TRANSPORT | stdio | トランスポート(stdio、http、sse) |
LOBBYWATCH_MCP_HOST | 127.0.0.1 | HTTP のバインド先ホスト(認証ゲートウェイの背後にある場合のみ 0.0.0.0 に設定してください) |
LOBBYWATCH_MCP_PORT | 8000 | HTTP のバインド先ポート |
LOBBYWATCH_MCP_CACHE_DIR | ~/.cache/lobbywatch-mcp | ダンプのキャッシュ場所 |
LOBBYWATCH_MCP_CACHE_TTL | 86400(24 時間) | キャッシュの有効期間(秒) |
LOBBYWATCH_MCP_STALE_MAX_AGE | 604800(7 日間) | 更新に失敗した場合に応答に使用できるキャッシュ済みダンプの最長経過時間(秒)。0 にするとフォールバックを無効にします |
LOBBYWATCH_MCP_HTTP_TIMEOUT | 60 | HTTP タイムアウト(秒) |
LOBBYWATCH_MCP_CORS_ORIGINS | (未設定) | HTTP/SSE 用の、カンマ区切りのオリジン許可リスト。設定すると、ブラウザーに Mcp-Session-Id を公開します |
LOBBYWATCH_MCP_LOG_FORMAT | text | text(stdlib フォーマッター)または json(structlog による構造化ログ) |
LOBBYWATCH_MCP_LOG_LEVEL | INFO | DEBUG / INFO / WARNING / ERROR |
LOBBYWATCH_MCP_OTEL_ENABLED | 0 | OpenTelemetry トレーシングを有効にするには 1 に設定します(pip install 'lobbywatch-mcp[obs]' が必要です) |
LOBBYWATCH_MCP_OTEL_ENDPOINT | (未設定) | OTLP/HTTP コレクターのエンドポイント(例:http://localhost:4318/v1/traces) |
プロジェクト構成
lobbywatch-mcp/
├── src/lobbywatch_mcp/
│ ├── __init__.py
│ ├── __main__.py # CLI + transport selection
│ ├── config.py # URLs, cache paths, attribution
│ ├── client.py # Dump download + dataIF client
│ ├── models.py # Pydantic v2 response envelopes
│ └── server.py # FastMCP tool registrations
├── tests/
│ ├── conftest.py # Fixture parliamentarians
│ ├── test_client.py # Respx-mocked unit tests
│ ├── test_server.py # Tool integration tests
│ └── test_live.py # @pytest.mark.live — excluded from CI
├── .github/workflows/
│ ├── ci.yml # Test matrix + ruff
│ └── publish.yml # PyPI OIDC Trusted Publisher
├── claude_desktop_config.json
├── pyproject.toml
└── ...
データライセンスと帰属表示
コードは MIT License の下で公開されています。
データは、この MCP を通じて提供され、© Lobbywatch.ch に帰属し、CC BY-SA 4.0 の下でライセンスされています。すべての応答エンベロープに帰属表示の文字列が含まれます。下流の利用者は、次の事項を守る必要があります。
- データソースとして Lobbywatch.ch を明記してください。
- 派生データセットを同じ CC BY-SA 4.0 の条件で共有してください。
- Lobbywatch はコミュニティが調査・編集したデータベースであり、公式登録簿ではないことを理解してください。透明性調査において信頼できる情報源ですが、連邦議会独自の申告と混同しないでください。
既知の制限事項
- 上流の
/table/parlamentarier/...dataIFREST エンドポイントは現在、空の結果セットを返します。サーバーは週次 JSON ダンプを使用することでこれを回避しています。 - ここで使用している「essential」ダンプ版には、
zutrittsberechtigungen(アクセスバッジ)が含まれていません。今後のリリースでは、non-essential ダンプを使う専用ツールを追加する予定です。
コントリビューション
CONTRIBUTING.mdを参照してください。
セキュリティ
セキュリティ体制、受容したリスクに関する判断、脆弱性の報告方法については、SECURITY.mdを参照してください。
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 の更新でどちらかが気付かないうちに変わることはありません。定数だけでは不十分なため、
tests/test_spec_2026_07_28.pyでは、組み立て済みの ASGI アプリを通じて両方の時代を検証します。これには、セッションなしの server/discover、将来のリビジョンを求める initialize に対して 2025-11-25 を上限とする動作、そして SDK の非推奨機能をエラーとして扱いながら 2026-07-28 の接続経由ですべてのツールを呼び出すテストが含まれます。
2026-07-28 に固有の変更。 lobbywatch_refresh_dump は進捗を notifications/progress として報告します。progressToken を送信するクライアントには、どちらの時代でも通知が届きます。以前は notifications/message でログを記録していましたが、ログ機能は 2026-07-28(SEP-2577)で非推奨となり、ログレベルを指定してオプトインしたリクエストにしか配信されないため、モダンなクライアントには何も届かなくなっていました。現在、serverInfo にはパッケージのバージョンが含まれています。2026-07-28 では、すべての応答の _meta にバージョンが付与されます。
SDK の LATEST_PROTOCOL_VERSION は、ハンドシェイク時代ではなくモダンな時代を指すエイリアスです。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする時代のリビジョンが変動する余地を残してしまうため、注意してください。
更新ポリシー。 ゲートに失敗した場合、定数を無条件に編集しないでください。2つのリビジョン間の仕様変更履歴を確認し、サーバーが引き続き正常に動作することを検証したうえで、定数、このセクション、README.de.md、CHANGELOG.mdをまとめて更新してください。
変更履歴
CHANGELOG.mdを参照してください。
ライセンス
MIT License — LICENSEを参照してください。データは CC BY-SA 4.0 — NOTICE.mdを参照してください。
作者
malkreide · GitHub
Swiss Public Data MCP Portfolioの一部です。
インストール
uv の uvx で実行できます。クローンや手動でのインストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json のトップレベルに servers キーを使用します)。
{
"mcpServers": {
"lobbywatch-mcp": {
"command": "uvx",
"args": [
"lobbywatch-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。