mcpField
P
parlament-mcp

parlament-mcp

ローカル
github.com法務・行政25 週間前に更新

parlament-mcp について

parlament-mcpは、Curia Vista APIを通じてスイス連邦議会のデータをAIアプリケーションに提供します。APIキーなしで議会案件を検索でき、討論記録の出典付き抜粋や全文を取得できます。

主な機能

  1. 01議会案件の検索
  2. 02案件の詳細取得
  3. 03議員と投票の検索
  4. 04議会会期の一覧
  5. 05討論記録の検索と取得

活用シーン

  1. 01テーマや状況による係属中の動議の検索
  2. 02州や政党による議員の検索
  3. 03議会演説の出典付き原文の取得

MCP 対応

MCPクライアントに、連邦議会の案件、議員、投票、会期、討論記録を検索・取得する読み取り専用ツールを提供します。

設定

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

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

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

パッケージ
pypiparlament-mcp0.4.1

ツール

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

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

詳細

🇩🇪 ドイツ語版

🏛️ parlament-mcp

CI PyPI version License: MIT Swiss Public Data MCP Portfolio

Swiss Public Data MCP Portfolio の一部 – AI モデルをスイスの公共データソースに接続します。

注記: このサーバーは連邦レベル(Curia Vista)を対象としています。このリポジトリには、 openparldata-mcp/ 配下に、26 の州と約 70 の自治体議会を対象とする 準国家レベルの対応プロジェクトも独立したサブプロジェクトとして含まれています (OpenParlData.ch)。この 2 つは独立したサーバーです。

Curia Vista OData API(ws.parlament.ch)を介して、 AI モデルをスイス連邦議会に接続する MCP サーバーです。 動議、インターペレーション、投票、議員、会期、および Amtliches Bulletin の 逐語的な議事録にアクセスできます。API キーは不要です (フェーズ 1 ― 認証不要を優先)。


🎯 主なデモクエリ

メタデータレイヤー:

「学校での AI に関する、審議中の動議はありますか?」 → parlament_search_business(keyword="KI", keyword2="Schule", status="Eingereicht")

逐語的な議事録(Amtliches Bulletin):

「2024 年春会期に、国民議会議員の Munz は Volksschule について何と言いましたか?AB の正確な引用を付けて、発言をそのまま教えてください。」 → parlament_search_transcripts(speaker_name="Munz", session_id=5202, keyword="Volksschule") → 続いて、全文を取得するには parlament_get_transcript(transcript_id=…) を実行します。

安定したソース URL とともに、短く引用可能な抜粋(AB 2024 N, 2024-03-13, Munz Martina)を返します。 逐語的なテキストは必要に応じて取得され、一括取得されることはありません。

→ 利用者別のその他のユースケース →

KI-Fachgruppe Stadtverwaltung Zürich に最適です。教育分野の AI に関する審議中の動議を見つけたり、 議場で実際に発言された内容をすぐに引用したりできます。

デモ:Claude が MCP ツール呼び出しで審議中の AI 関連動議を検索


🔧 ツール

ツール説明
parlament_search_businessキーワード、種類、ステータス、議会、日付で動議を検索します
parlament_get_business1 件の案件の詳細(本文、FC の回答)を取得します
parlament_search_members州(例:ZH)、政党、議会で議員を検索します
parlament_get_votes賛成/反対の意味を含む議会投票を取得します
parlament_get_sessions後続のクエリに使う ID とともに、直近の会期一覧を取得します
parlament_search_transcripts議事録を検索します → AB の引用とソース URL を含む引用可能な抜粋(発言者/会期/案件/日付で絞り込み)
parlament_get_transcriptID で 1 件の発言の逐語的な全文を取得します(上限あり、ページ分割、is_excerpt フラグ付き)

🏗️ アーキテクチャ

┌──────────────────────────────────┐
│     MCP Host (Claude Desktop /    │
│     Claude API / IDE)             │
└─────────────┬─────────────────────┘
              │ MCP Protocol (JSON-RPC 2.0)
              │ Transport: stdio (local) / SSE (cloud)
┌─────────────▼─────────────────────┐
│          parlament-mcp            │
│   FastMCP · Python · Pydantic v2  │
│                                   │
│  ┌── metadata layer (server.py) ──┐
│  │  search_business · get_business │
│  │  search_members · get_votes     │
│  │  get_sessions                   │
│  └─────────────────────────────────┘
│  ┌── transcript layer ────────────┐  ← separate module (transcripts.py)
│  │  search_transcripts (excerpts) │    · Language='DE' dedups editions
│  │  get_transcript (verbatim)     │    · Type=1 = real speeches only
│  └─────────────────────────────────┘    · retry + 45s read timeout
└─────────────┬─────────────────────┘
              │ HTTPS / OData v3
┌─────────────▼─────────────────────┐
│  ws.parlament.ch / odata.svc      │
│  Curia Vista – No Auth Required   │
│                                   │
│  Business · Vote · MemberCouncil  │   metadata path
│  Session ─< Meeting ─< Subject ─< Transcript   transcript path
└───────────────────────────────────┘

🚀 インストール

Claude Desktop(stdio)

~/Library/Application Support/Claude/claude_desktop_config.json に追加します。

{
  "mcpServers": {
    "parlament": {
      "command": "uvx",
      "args": ["parlament-mcp"]
    }
  }
}
ローカル開発
git clone https://github.com/malkreide/parlament-mcp
cd parlament-mcp
pip install -e .
python -m parlament_mcp.server
クラウド/Railway(SSE)
MCP_TRANSPORT=sse MCP_HOST=0.0.0.0 PORT=8080 python -m parlament_mcp.server
# SSE endpoint: http://your-host:8080/sse
ネットワークバインディング

デフォルトでは、サーバーは 127.0.0.1(localhost のみ)にバインドします。 MCP_HOST=0.0.0.0 は、コンテナー/クラウド環境(Docker、Railway、 Render、Kubernetes)内でのみ設定してください。ローカルの開発マシンでは、決して 0.0.0.0 にバインドしないでください。ローカルネットワークにサーバーを公開してしまいます (NeighborJack のリスク)。コンテナー内だと検出されない環境でこの設定を行うと、 サーバーは警告をログに記録します。

トランスポートは MCP_TRANSPORT で選択します(デフォルトは stdio、または sse/ streamable-http)。--http は streamable-http のエイリアスとして引き続き利用できます。

認証(任意)

HTTP トランスポートはデフォルトで公開されており、読み取り専用データを提供します。ベアラートークンを必須にするには、CORS/認証アプリファクトリーを使ってサーバーを起動し、MCP_BEARER_TOKENS を設定します。

MCP_BEARER_TOKENS="alice:tok_abc,bob:tok_def" MCP_ALLOWED_ORIGINS="https://claude.ai" \
  uvicorn parlament_mcp.server:create_http_app --factory --host 0.0.0.0 --port 8080

各リクエストには Authorization: Bearer <token> が必要です。ID はセッションヘッダーではなく、検証済みトークンから取得されます(docs/security.md を参照)。

Docker
docker compose up --build          # binds 127.0.0.1:8080 only
# or build the hardened image directly (non-root, read-only FS):
docker build -t parlament-mcp .

Kubernetes マニフェスト(強化された securityContext、リソース制限、送信トラフィック用 NetworkPolicy、Mcp-Session-Id によるスティッキールーティング)は deploy/k8s/ にあります。HAProxy のスティックテーブルの例は deploy/haproxy.cfg にあります。


🔗 相乗効果

パートナーサーバー組み合わせ
openparldata-mcp連邦 ↔ 地方 — 州と自治体にまたがる同じ質問
fedlex-mcp法律の条文 ↔ その成立に至った議会審議
zurich-opendata-mcp市の政策 ↔ 州・連邦の動議
swiss-statistics-mcpデータによる裏付け ↔ 統計を引用する動議

強力なクエリの例:

"Zeige mir alle Zürcher Motionen zu KI in der Bildung
 und verlinke die relevanten Bundesgesetze aus fedlex-mcp."

📊 データソース

  • API: ws.parlament.ch/odata.svc
  • 認証: なし(フェーズ 1 — 認証なしを優先)
  • プロトコル: OData v3 / JSON
  • 対象範囲: 1978 年以降のすべての議会案件、2000 年頃以降の投票。 構造化された逐語記録(Amtliches Bulletin)は 1999-12-06 以降 (1891~1999 年の記録はアーカイブのスキャン画像のみです。既知の制限事項を参照)。
  • 更新サイクル: リアルタイム(政府の公式データ)
著作権 — 逐語引用が許可されています

スイス当局の公式議事録は、URG(スイス著作権法)第 5 条第 1 項 a 号に基づき、著作権の対象外です。そのため、Amtliches Bulletin に掲載された議会審議の逐語表現は自由に複製・引用できます。議事録ツールが返すのは、まさにその内容そのものであり、要約で置き換えたものではありません。


📜 データソースとライセンス

ソースライセンス表記
Curia Vista (ws.parlament.ch)CC BY 4.0© Schweizer Parlament, CC BY 4.0

各ツールは、型付きの results に加えて source、license、provenance、match_type、count を含む、型付きの構造化レスポンスを返します(FastMCP は出力スキーマを公開します)。データは変更せずに渡されます。

🧭 フェーズ

このサーバーは フェーズ 1 — 読み取り専用ラッパー(すべてのツールで readOnlyHint: true、書き込みなし)です。フェーズモデル全体と移行基準については、docs/roadmap.md を参照してください。

🔖 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 の更新で、どちらかが気付かないうちに変わることはありません。同じファイルでは、登録済みサーバーに対して各世代につき 1 回、実際のクライアント接続を行い、定数から推測するのではなく、接続からリビジョンを読み取ってネゴシエーションも検証しています。

2026-07-28 世代では、サーバーの識別情報を伝えるハンドシェイクがありません。代わりに SDK が結果の _meta に io.modelcontextprotocol/serverInfo を付与します。サーバーはそこにパッケージバージョンを渡すため (tests/test_server_info.py)、どちらの世代でも同じバージョンが報告されます。

SDK の LATEST_PROTOCOL_VERSION はハンドシェイク世代ではなくモダン世代の別名である点に注意してください。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする世代が変更されても検知できません。

更新ポリシー。 ゲートで失敗した場合は、定数を確認せずに編集しないでください。2 つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正常に動作することを確認してから、定数、このセクション、README.de.md、CHANGELOG.md をまとめて更新してください。

🧱 MCP プリミティブ

フェーズ 1 ではツールのみを使用します。その理由とフェーズ 2 のリソース計画については、 docs/adr/ADR-003-mcp-primitives.md を参照してください。

🏷️ ツールのアノテーション

すべてのツールで、動作に沿った明示的なアノテーションを宣言しています。

ToolreadOnlydestructiveidempotentopenWorld
parlament_search_business✅—✅✅
parlament_get_business✅—✅✅
parlament_search_members✅—✅✅
parlament_get_votes✅—✅✅
parlament_get_sessions✅—✅✅
parlament_search_transcripts✅—✅✅
parlament_get_transcript✅—✅✅

📈 オブザーバビリティ

構造化 JSON ログは stderr に出力されます(stdout は stdio プロトコル用に確保されています)。OpenTelemetry のトレーシングで各ツール呼び出しをラップし、送信 HTTP を自動計測します。スパンを送信するには、OTEL_EXPORTER_OTLP_ENDPOINT を設定してください(otel-export エクストラが必要です)。セキュリティ対策の全容(Lethal-Trifecta 評価、送信先許可リスト、ゲートウェイの強化)については、docs/security.md を参照してください。


🛡️ 安全性と制限

項目詳細
アクセス読み取り専用(readOnlyHint: true)— サーバーはデータを変更または削除できません
個人データ議会の案件は法律(BGÖ)に基づく公開記録です。非公開データにアクセスしたり、保存したりすることはありません。
レート制限クエリごとに上限を設定しています。最大 100 件(案件/議員)、50 件(投票)、30 件(議事録検索)、10 件(会期)。議事録の全文は呼び出しごとに上限があり、ページ分割されます。誤って会期全体を一度に取得することはありません。
タイムアウトメタデータの呼び出しごとに 20 秒、議事録の読み取りでは 45 秒(逐語検索はより負荷が高いため)
認証API キーは不要です — Curia Vista は一般公開されています
データソーススイス連邦政府の公式データ(Schweizerische Parlamentsdienste)
利用規約ws.parlament.ch の利用規約(ToS)が適用されます — Schweizerische Parlamentsdienste

既知の制限事項

全般

  • OData の substringof() フィルターは、一部のフィールドで大文字と小文字を区別します。
  • ごく最近のセッションでは、API 上のセッション名が null になることがあります。その場合はセッション ID を使用してください。

会議録(Amtliches Bulletin) — 2026-07-19 にライブで検証済み:

  • 対象期間:1999-12-06 以降のみです。 構造化された Transcript エンティティは、1999 年 12 月まで遡ります。**1891~1999 年の討論は、スキャンされたアーカイブ文書(Bundesarchiv / Amtsdruckschriften)としてのみ存在し、**ここには接続されていません(OCR は対象外です)。対象期間より前の日付のみを指定したクエリは、空の結果ではなく説明エラーを返します。
  • ソースにページ番号がありません。 API にページ/欄のフィールドがないため、従来の AB <year> N <page> 形式は作成できません。代わりに、安定して検証可能な AB <year> <N|S>, <date>, <speaker> と、正式な source_url(SubjectId)および transcript_id を出力します。これは文書化された誠実なトレードオフであり、情報の欠落ではありません。
  • 言語の扱い(重要)。 Language は発話言語ではなく、版を示します。ツールが Language eq 'DE' でフィルターするのは、バイト単位で同一の 3 つの版(DE/FR/IT)を 1 つにまとめるためだけです。すべての発言は原文のまま返されるため、フランス語やイタリア語の発言が非表示になることはありません。実際の言語は language フィールド(de/fr/it)に示されます。レスポンスでは language_note を通じてこの点を説明します。
  • 切り詰めは明示され、黙って行われることはありません。 検索では短い抜粋(snippet、約 320 文字)が返され、is_excerpt、total_length_chars、全文を取得するための案内も含まれます。parlament_get_transcript は出力を max_chars で制限します。切り詰めが発生すると is_excerpt=True を設定し、続きの取得に使える next_offset を返します。
  • 逐語のみで、要約はしません。 文言そのものが提供物であり、ツールが実際のテキストを要約に置き換えることはありません。
  • 応答時間: フリーテキストの keyword と speaker_name を組み合わせた場合が最も遅く(約 40 秒)なります。読み込みを 1~2 秒程度に抑えるには、session_id、business_number、または日付範囲を追加してください。

🧪 テスト

pip install -e ".[dev]"

# Unit + mocked integration tests (no network), as run in CI:
PYTHONPATH=src pytest tests/ -m "not live"

# Include live tests against the real ws.parlament.ch API:
PYTHONPATH=src pytest tests/ -m live

HTTP は respx でモック化します。ネットワークに依存するテストには @pytest.mark.live のマークを付け、-m "not live" によって CI から除外します。ツール定義は tool-hashes.json(python -m parlament_mcp.tool_hashes --check)で固定されています。


コントリビューション

CONTRIBUTING.md を参照してください。


セキュリティ

セキュリティポリシーとセキュリティ態勢(脆弱性の報告、Lethal-Trifecta の評価、受容するリスク)については、SECURITY.md を参照してください。


ライセンス

MIT © Hayal Oezkan — LICENSE を参照してください。


作者

Hayal Oezkan · github.com/malkreide

インストール

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

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

コメント

MCP は初めてですか?

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

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