switzerland-parliament-mcp-server について
Curia Vista と Amtliches Bulletin の公開データを検索する、スイス連邦議会向け MCP サーバーです。議会案件、討論、投票、議員、申告された利害関係を扱い、stdio と Streamable HTTP に対応します。
主な機能
- 01案件を題名、提出者、状態で検索
- 02案件本文と手続き履歴の取得
- 03国民議会の記名投票を取得
- 04討論記録と原文の検索
- 05議員と申告された利害関係の検索
- 06識別子、言語、会期の参照情報を表示
活用シーン
- 01議会案件の手続き経過を追跡
- 02国民議会の投票と議員の判断を確認
- 03議員や議題から討論発言を検索
- 04議員の委員会所属と申告利害を確認
MCP 対応
スイス議会の案件、投票、討論、議員、申告された利害関係を扱う 7 つの読み取り専用ツールを MCP クライアントに提供します。stdio と Streamable HTTP に対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://switzerland-parliament.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-switzerland-parliament https://switzerland-parliament.caseyjhand.com/mcp{"mcpServers":{"cyanheads-switzerland-parliament":{"type":"http","url":"https://switzerland-parliament.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-switzerland-parliament":{"type":"http","url":"https://switzerland-parliament.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-switzerland-parliament":{"type":"http","url":"https://switzerland-parliament.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-switzerland-parliament":{"serverUrl":"https://switzerland-parliament.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
7| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | ページサイズの要求値。既定値は 20、上限は 100。委員会のページは役職候補を数え、バイト数の制限により案件数が少なくなる場合があります。 |
| query | string | いいえ | タイトルの部分文字列を 1 つ指定します。句読点とダイアクリティカルマークは保持してください。 |
| author | string | いいえ | 公開された提出者ラベルの部分文字列。すべての共同署名者が対象になるわけではありません。 |
| cursor | string | いいえ | 前回の呼び出しで返された不透明な nextCursor を、同一のフィルターで使用します。省略すると最初から開始します。 |
| typeId | string | いいえ | chparl_list_reference の business_types トピックにある案件種別コード。 |
| language | enum | いいえ | メタデータの言語:de(既定)、fr、または it。de | fr | it |
| statusId | string | いいえ | chparl_list_reference の statuses トピックにある現在のステータスコード。 |
| sessionId | string | いいえ | chparl_list_reference の sessions トピックにある提出会期 ID。 |
| committeeId | string | いいえ | chparl_list_reference の committees トピックにある委員会番号。公開済みの委員会役職のいずれかに一致します。 |
| submittedTo | string | いいえ | 提出日の上限(指定日を含む)。形式は YYYY-MM-DD。 |
| submittedFrom | string | いいえ | 提出日の下限(指定日を含む)。形式は YYYY-MM-DD。 |
詳細
@cyanheads/switzerland-parliament-mcp-server
MCP を通じて、スイスの議会案件、投票、討論、議員、申告された利害関係を検索できます。STDIO または Streamable HTTP に対応しています。
概要
Curia Vista と Amtliches Bulletin に掲載されたスイス連邦議会の記録を扱います。議会案件を検索し、原文や手続きの履歴を読み、いずれかの院での討論を追い、国民議会の記名投票を確認し、議員や申告された利害関係を調べられます。公開 OData サービスを API キーなしで利用します。stdio プロセスまたはローカルの Streamable HTTP サーバーとして動作します。
検索結果には、出典 URL とダウンロード日とともに、Parlamentsdienste der Bundesversammlung, Bernをクレジットとして表示します。これは非公式な複製です。出典コンテンツには議会のオープンデータ利用条件が適用されます。基礎となる著作者の権利は保持されます。
ツール
| ツール | 説明 |
|---|---|
chparl_search_business | タイトル、提出者、種別、ステータス、提出会期、日付、委員会での役割を指定して案件を検索します |
chparl_get_business | 案件のメタデータ、原文、ステータス履歴、法案、関連案件、委員会審査、討論テーマを取得します |
chparl_get_votes | 国民議会の記名投票を検索し、議員の投票内容をページ単位で取得するか、投票数と会派別集計の全体を読み取ります |
chparl_search_transcripts | 案件、テーマ、発言者、会期、議会、日付で討論の発言箇所を検索し、原文を取得します |
chparl_search_members | 氏名、議会、州、政党、会派で現職または元議員の所属記録を検索します |
chparl_get_member | 議員の基本情報、議会の在任期間、委員会所属、申告された利害関係を取得します |
chparl_list_reference | 識別子、対象範囲、言語、コード、委員会、会期を確認します |
機能リファレンス
chparl_search_business tool
queryはタイトル内の文字列に一致します。authorは公開されている提出者ラベルに一致し、共同署名者すべてを対象とするものではありません。任意のtypeId、statusId、sessionId、committeeId、submittedFrom、submittedToで検索を絞り込めます。日付は範囲に含まれ、会期は提出会期を指します- 新しい正規案件 ID から順に並び、1ページあたりのデフォルト件数は 20 件、最大件数は 100 件です。
nextCursorを変更せずにフィルターを指定して続行します。一致しないカーソルを指定するとinvalid_cursorエラーになります - 委員会での検索では役割候補を調べ、重複のない案件を返すため、ページの件数が少なくなる場合があり、
totalCountが省略されることもあります。委員会フィルターを指定しない場合、totalCountはフィルター適用前の案件数です(指定されている場合) - 返された
businessIdをchparl_get_business、chparl_get_votes、またはchparl_search_transcriptsに渡します
chparl_get_business tool
- 正規の 8 桁の
businessIdまたは99.1234のような公開されている短縮番号を受け付けます。短縮番号が曖昧な場合はambiguous_business_numberエラーになります。overview(デフォルト)はメタデータと、UTF-8 のサイズを含むavailableTextFieldsを返します section: "texts"はtextDocument.kind: "full" | "outline"を返します。複数のフィールドに内容があり、完全な結果が 24,000 バイトに達する場合、自動開示ではフィールドごとのサイズを示す概要が返されます。textFieldsを明示的に選択した場合、または内容のあるフィールドが 1 つだけの場合は、このしきい値を超えても全文が返されますdescription、initialSituation、proceedings、draftText、submittedText、reasonText、documentationText、motionText、federalCouncilResponseText、またはfederalCouncilProposalTextを選択します。未公開の選択項目はunavailableTextFieldsに表示されます。原文の HTML、空白、改行コードはそのまま保持されますstatus_history、bills、related_business、preconsultations、subjectsはそれぞれ個別にページ分割されます。デフォルトは 20 件、最大は 100 件で、続行にはnextOffsetを使います。ページ分割はこれらのセクションにのみ適用され、textFieldsはtextsのみに適用されます- 該当案件がない場合は
found: falseを返します。関連付けられた法案は議会記録であり、制定法の本文ではありません。大規模な討論を絞り込むにはsubjectsを使います
chparl_get_votes ツール
mode: "votes"とbusinessIdで開始すると、採決記録のメタデータが返されます。1ページあたりの件数はデフォルトで10件、最大50件です。返されたvoteIdをmode: "members"(デフォルト50件、最大100件、任意のpersonNumberを指定可能)またはmode: "groups"(全件、ページ分割なし)とともに使用します- 会員の採決記録は、2003年冬会期以降の国民議会を対象としています。全州議会の会員の採決結果はここでは利用できません。結果が空でも、採決がなかったことを示すものではありません
membersはdecisionCounts.scope: "page"を返します。groupsは公開されている会員の全行を読み込んでから、scope: "vote"、complete: true、および会派別の合計を返します。会員データが利用できない場合、投票数がゼロの完全な合計は推定されません- 件数は現在の所属ではなく、採決記録に公開されている所属情報に基づきます。元の決定ラベル、不明なコード、欠落している決定はそのまま表示されます。文書化されているコードは、1=賛成、2=反対、3=棄権、6=第57条第4項に基づく欠席、7=議長は投票しない、です
- ページ分割のあるモードでは
nextOffsetを使って続行します。found: falseは、案件または選択した採決が存在しないことを、子コレクションが空であることと区別します
chparl_search_transcripts ツール
- 会議録の対象は1999年冬会期からで、両院が含まれます。
businessId、subjectId、personNumber、sessionId、日付の境界値、または完全一致のtranscriptIdのうち、少なくとも1つを指定してください。院だけの指定では不十分です queryは原文テキスト内の部分文字列を1つ検索します。さらにsessionId、または両端を含めて最大31暦日のdateFrom/dateTo範囲が必要です- 検索結果ではデフォルトでメタデータと
textSizeBytesが返されます。1ページあたりの件数はデフォルトで20件、最大100件です。includeText: trueを指定すると、発言全文が返されます。デフォルトは3件、最大10件です。フィルターを変更せずにnextOffsetを使って続行します - 完全一致の
transcriptIdではデフォルトで全文が返され、併せて指定できるのはlanguageとincludeTextのみです。includeText: falseを明示するとメタデータが返されます。議事録IDと議題IDは10進数の文字列のまま扱われます businessIdとsubjectIdは同時に指定できません。案件の検索では関連するすべての議題(最大20件)が対象になります。議論の対象がそれを超える場合はbusiness_scope_too_broadが返されるため、chparl_get_businessのsubjectsセクションで対象を確認してから、subjectIdを1つ指定してくださいmetadataLanguageは発言者のテキストを翻訳しません。languageOfTextがない場合、言語は不明のままです。foundは完全一致IDが見つからない場合を示し、scopeFoundは案件が見つからない場合と、案件に発言記録がない場合を区別します
chparl_search_members ツール
queryは公開されている名、姓、または正式名称の部分文字列に一致します。membershipはcurrent(デフォルト)、former、またはallです。任意のcouncil、cantonId、partyId、groupIdで絞り込めます- 検索結果は、重複を除いた人物ではなく、MemberCouncil の所属記録です。1ページあたりの件数はデフォルトで20件、最大100件で、
nextOffsetを使って続行します - プロフィールの取得と会員の採決結果の絞り込みには
personNumberを使います。これはPerson.IDと一致するとは限りません。院の指定にはN/S、またはドイツ語、フランス語、イタリア語の正式な院名を使用できます
chparl_get_member ツール
personNumberが必要です。overview(デフォルト)は、議会での身元情報と、ページ分割なしで基本となるすべての MemberCouncil 所属を返しますcouncil_terms、committees、interestsはそれぞれ独立してページ分割されます。デフォルトは20件、最大100件で、nextOffsetを使って続行します。overviewではページ分割の指定を省略してください- 委員会の行は公開されている所属情報であり、過去の委員会所属をすべて網羅した一覧ではありません。
paidフラグがない場合は不明を意味します。また、利益情報が空でも利益相反がないことを示すものではありません - 身元情報が見つからない場合は、検索方法の案内とともに
found: falseが返されます
chparl_list_reference ツール
- トピック:
identifiers、coverage、languages、business_types、statuses、councils、cantons、parties、groups、committees、sessions。返された ID は他のツールで使用します - ページあたりのデフォルトは 50 件、最大は 100 件で、
nextOffsetを使って続きを取得します。日付を指定できるのはsessionsのみです。dateFromはセッション開始日、dateToはセッション終了日を指定し、どちらも指定日を含みます statusesは、2023 年 7 月 1 日時点で有効な公式の旧・現行語彙のスナップショットで、eraを含みます。未知の現行コードも表示されます。識別子、対象範囲、言語の説明は静的で、その他の辞書は最新情報です
機能
@cyanheads/mcp-ts-core を基盤としており、stdio と Streamable HTTP トランスポート、切り替え可能な認証(none/jwt/oauth)、交換可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースに対応した構造化ログを備えています。
スイス議会に特化した機能:
- API キー不要の読み取り専用アクセスで、議案、手続き上の関係、国民議会の採決記録、討論の抜粋、議員、申告済みの利害関係を取得できます
- 翻訳のフォールバックなしで、
de(デフォルト)、fr、itのメタデータを利用できます。イタリア語のすべての項目が揃っているかは確認されていません。英語とロマンシュ語の翻訳は提供されません - 公開済みのテキストと HTML は変更されません。併せて提供されるリンク/画像参照インデックスは、元の属性を保持し、利用可能な場合はクリック可能な絶対 HTTP(S) URL を提供します
- ワークフロー全体に 45 秒の期限が設けられています。上流の検索に時間がかかる場合は、テキストの対象範囲を絞ると役立ちます
エージェントに適した出力:
content[]とstructuredContentの両方に、同じレコード、出典情報、フィルター、通知、ページ情報が含まれます。複数行のテキストと HTML は、損失なく復元できるよう、フェンス付きテキストブロック内で JSON エンコードされます- コレクションには
returnedCount、ページ分けがある場合はeffectiveLimit、hasMore、利用可能な場合は続きの情報が含まれます。totalCountは判明している場合のみ表示されます。ライブデータの更新により、オフセットページの内容は変わる場合があります - コレクションの応答は、24,000 バイトの結果上限内にレコード全体が収まるよう調整されます。そのためページが短くなることはありますが、返されたフィールドが短縮されることはありません。分割できない大きなレコードは通知とともに全体が返されます。テキスト選択、議員の概要、グループの合計もすべて完全な状態で返されます
- 欠損値は不明のまま扱われます。結果が空の場合はガイダンスが表示され、レート制限時には再試行の案内とともに
upstream_rate_limitedが返されます
はじめに
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加します。
{
"mcpServers": {
"switzerland-parliament-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/switzerland-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、npx を使用します(Bun は不要です)。
{
"mcpServers": {
"switzerland-parliament-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/switzerland-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、Docker を使用します。
{
"mcpServers": {
"switzerland-parliament-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/switzerland-parliament-mcp-server:latest"]
}
}
}
Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。
- API キーやアカウントは不要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/switzerland-parliament-mcp-server.git
- ディレクトリに移動します:
cd switzerland-parliament-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# Optional: edit framework transport, auth, logging, or telemetry settings
設定
サーバー固有の環境変数は必要ありません。
| 変数 | 説明 | デフォルト |
|---|---|---|
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモード:stateless、stateful、または auto。 | stateless |
MCP_AUTH_MODE | 認証:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、warning、error など)。 | info |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ)。 | <app-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
共通のフレームワーク設定の上書きについては、.env.example を参照してください。
サーバーの実行
ローカル開発
-
本番用バージョンをビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行する:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() のエントリーポイントとサービスのセットアップです。ツールは7つで、リソースとプロンプトはありません。 |
src/mcp-server/tools | ツール定義、損失のない共通レンダリング、レコード全体に基づくページ調整です。 |
src/services/parliament | OData クライアント、ワークフローの期限、ドメインスキーマとサービス、来歴、参照スナップショットです。 |
tests/ | src/ の構成に対応する単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークがキャッチします。ツールのロジックに
try/catchを使用しないでください - ロギングには
ctx.log、ストレージにはctx.stateを使用してください - 新しいツールとリソースは、
src/index.tsのcreateApp()配列に登録してください - 外部 API 呼び出しはラップしてください。未加工データを検証し、ドメイン型に正規化してから、出力スキーマに従って返します。不足しているフィールドを捏造しないでください
貢献
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
このプロジェクトは Apache 2.0 License のもとでライセンスされています。詳細は LICENSE ファイルを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。