mcpField
C
canada-parliament-mcp-server

canada-parliament-mcp-server

リモート
github.com/cyanheads法務・行政1今日更新
リポジトリ

canada-parliament-mcp-server について

canada-parliament-mcp-serverは、AIクライアントなどのMCPクライアントにカナダ連邦議会の記録を提供し、調査に利用できます。法案、議員、下院の投票、Hansard演説を検索でき、出典とデータ範囲も示します。

主な機能

  1. 01法案の検索と議案資料の取得
  2. 02現職・歴代議員の検索
  3. 03下院の採決と投票記録の確認
  4. 04索引化されたHansard演説の検索
  5. 05出典とデータ範囲の提示

活用シーン

  1. 01法案の立法段階の追跡
  2. 02議員の所属と投票記録の確認
  3. 03下院採決結果の比較
  4. 04法案に関する演説の検索

MCP 対応

MCPサーバーは法案、議員、投票、演説、参照データを検索・取得する8つのツールを提供します。stdioとStreamable HTTPに対応します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://canada-parliament.caseyjhand.com/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npm@cyanheads/canada-parliament-mcp-server0.2.0

ツール

8
パラメーター型必須説明
limitintegerいいえ1回の呼び出しで返される行数は最大1~100です。10000までのより大きな値を指定しても、通知とともに100行が返されます。
offsetintegerいいえ選択した並び順における 0 始まりのオフセット。
statusstringいいえcanparl_list_reference の bill_statuses トピックにある公式法案ステータス。
sessionanyいいえ議会会期。省略すると現行会期になります。
sponsorstringいいえOpenParliament の MP slug、政治家のパス/HTTPS URL(canparl_get_member の member.slug、または includeFormer を指定した canparl_search_members の行)、あるいは現職 MP の公式 personId。上院議員はインデックス対象外です。現職 personId と一致する数字のみの値、その /politicians/<digits>/ パス、またはプロフィール URL は、その personId として読み取られます。
billCodestringいいえ分割法案の接尾辞(C-15A など)を含む正確な法案コード。bill s321、S321、S 321、S-321 を受け付けます。
billTypestringいいえcanparl_list_reference の bill_types トピックにある公式法案種別。
titleContainsstringいいえ英語またはフランス語の長いタイトルまたは短いタイトルに含まれる、大小文字を区別しないリテラル部分文字列。
originatingChamberstringいいえHouse、House of Commons、または Senate。大文字と小文字は区別しません。

詳細

@cyanheads/canada-parliament-mcp-server

MCP を介して、カナダ連邦法案、国会議員、下院の採決、ハンサードの演説を追跡します。STDIO または Streamable HTTP に対応。

8 個のツール

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

公開ホストサーバー: https://canada-parliament.caseyjhand.com/mcp


概要

LEGISinfo、下院、OpenParliamentから、カナダ連邦議会の記録を取得します。下院・上院の法案を各段階に沿って追跡し、現職および元国会議員を検索し、記録された下院採決を確認し、索引化された下院のハンサード演説を閲覧できます。公開ソースの利用に API キーは必要ありません。

ツール
ツール説明
canparl_search_bills表題、番号、議院、種類、状況、または索引化された提出議員で、会期中の公式法案を検索します
canparl_get_bill提出議員と表題、各段階、読会の節目、採決、刊行物、立法概要、注記、ウェブ上の参照情報、成立法の引用情報など、公式法案資料を閲覧します
canparl_search_members現在の下院議員名簿、または OpenParliament の過去の氏名索引を検索します
canparl_get_member議員のプロフィール、日付付きの在任記録、提出法案、最近の投票を閲覧します
canparl_search_votes法案、結果、文書の種類、日付、または主題で、記録された下院採決を検索します
canparl_get_vote採決の公式集計、党派別の集計、個々の記録済み投票を閲覧します
canparl_search_speeches発言者、討議または言及された法案、日付、英語の文字列で、索引化された下院演説を検索します
canparl_list_reference実際の会期の対象範囲と、ソースごとのフィルター用語を確認します

機能リファレンス

canparl_search_bills ツール
  • titleContains、billCode、originatingChamber、billType、status、sponsorをAND条件で組み合わせます。limitは1~100(デフォルトは25。最大10,000までの値は、通知とともに100に制限されます)。オフセットページネーションに対応しています
  • 二言語のタイトル、ステータス、直近の主要段階、国王裁可日を返します。フィルター適用後の正確なtotalとpagination.nextOffsetも含まれます
  • 法案の行全体を返し、レスポンスの予算24,000バイトに達する前に処理を停止します。同一のフィルターを指定してpagination.nextOffsetを使用し、続きを取得してください。単一の行が予算を超える場合は、通知とともに行全体を返します
  • sponsorには、OpenParliamentのスラッグ、/politicians/パス、プロフィールURL(canparl_get_memberのmember.slug、またはincludeFormerの検索結果の行から取得)、あるいは現職議員のpersonIdを指定します。数字のみの値が現職議員のpersonIdと一致する場合、またはその/politicians/<digits>/パスやURLの場合は、canparl_get_memberと同じ検証済み対応表を使って解決されます。appliedFilters.sponsorNameには、使用されたプロフィール名が示されます
  • スポンサー検索の対象はOpenParliamentのインデックスのみ(sponsorCoverage: "openparliament_index")で、上院議員は含まれません。100件ずつのページを10ページ以上スキャンすると、sponsor_scan_incompleteとして失敗します

canparl_get_bill ツール
  • canparl_search_billsのbillCodeとそのsessionを指定します。スポンサーとその所属のtitle、下院・上院・国王裁可の各段階、下院の採決記録(dateTimeは議決が記録された日時ではなく、LEGISinfoの会期日時です)、上院の投票記録、刊行物、statuteを返します
  • 議会図書館の立法上のsummaryと議案資料のnotesもプレーンテキストで返します(各注記のリンクはtext (href)の形式で保持されます)。さらに、6つの読会のmilestonesをUTC時刻として、関連するwebReferences(プレスリリース、背景資料、費用見積もりの注記)も返します。URLは公開された形式のまま渡され、取得は行われません
  • レスポンスの予算24,000バイトを超える場合は、sponsor、statute、milestonesをインラインで含むkind: "outline"を返します。セクションとしてsponsor、stages.house、stages.senate、stages.royalAssent、divisions、senateVoteDetails、publications、statute、summary.en、summary.fr、notes.en、notes.fr、milestones、webReferencesを一覧表示します。sectionを指定して再度呼び出し、コレクションはoffsetとlimit(1~100、デフォルトは20。最大10,000までの値は、通知とともに100に制限されます)を使ってページ分割し、pagination.nextOffsetで続きを取得してください
  • ページにはレコード全体が含まれます。分割できないレコードまたは言語セクションが予算を超える場合は、disclosureとともに全体を返します。null、空、範囲外の各セクションは区別されます

canparl_search_members ツール
  • 現職議員名簿では、nameとridingの部分文字列、province(郵便番号または正式名称)、partyで検索できます。limitは1~100(デフォルトは25。最大10,000までの値は、通知とともに100に制限されます)。フィルター適用後の正確なtotalを返します
  • includeFormer: trueを指定すると、代わりにOpenParliamentの過去の名前インデックスを検索します。1語の場合は姓に、複数語の場合は記録されている氏名全体に一致します。この検索では地理フィルターと政党フィルターは受け付けられません。行には名前とスラッグのみが含まれる場合があり、totalはnullです
  • detailLookupを変更せずにcanparl_get_memberへ渡します。現職議員の行には公式のpersonIdが、過去の議員の行にはOpenParliamentのslugが含まれます
  • 議員の行全体を返し、レスポンスの予算24,000バイトに達する前に処理を停止します。同一のフィルターを指定してpagination.nextOffsetを使用し、続きを取得してください。単一の行が予算を超える場合は、通知とともに行全体を返します

canparl_get_member ツール
  • detailLookup から personId または slug をちょうど1つ指定します。プロフィールと日付付きの memberships を返します。現在の personId と一致する数字のみの slug、またはその /politicians/<digits>/ パスやURLは、その personId として読み取られます
  • 現職者との照合では、公式IDと記録された氏名または公開済みの別名を確認します。正確な氏名での検索結果が空の場合は、スラッグを推測せず、アクセント記号やミドルイニシャルに対応するために範囲を限定した姓での検索を行います
  • sponsoredBills(0~5、デフォルトは5)と recentVotes(0~10、デフォルトは10)は、billsOffset と votesOffset を使って個別にページングします。0 を指定するとそのセクションを省略し、10,000までの値は上限に切り詰められ、その旨が通知されます
  • 公式の personId を1つ指定すると、最新のセッションまたは votesSession におけるその議員の投票が、公式議員投票フィードから1回のリクエストで新しい順に取得されます。必要に応じて votesBillCode で絞り込めます。ballot は Yes/No/Paired を使用し、officialBallot は Yea/Nay/Paired をそのまま保持し、source はフィード名を示します。それ以外の議員の投票には、引き続き OpenParliament のデータが使用されます
  • 各活動セクションは available、unavailable、または not_requested を報告し、failure メタデータを含みます。取得できない履歴が空として報告されることはありません
  • プロフィールの links は取得されません。絶対URLの http または https は公開されたとおりに中継され、相対値は https://openparliament.ca を基準に解決されます

canparl_search_votes ツール
  • billCode、result(Agreed To、Negatived、Tie)、documentType、オタワの日付による両端を含む dateFrom と dateTo、および subjectContains を指定できます。limit は1~100(デフォルトは25。10,000までの値は100に切り詰められ、その旨が通知されます)で、オフセットを使ってページングします
  • 新しい順に、公式の集計値とフィルター適用後の正確な total を返します。canparl_get_vote には session と number を渡してください
  • 投票記録の各行全体を返し、応答サイズが24,000バイトに達すると早めに停止します。同じフィルターを指定して pagination.nextOffset に進んでください。1行だけでサイズを超える場合は、その行全体を通知とともに返します

canparl_get_vote ツール
  • number とその session を指定します。ballot(Yea、Nay、Paired。Yes/No も使用可能)、personId、party、province は投票ページのみを絞り込みます。limit は1~400(デフォルトは30。10,000までの値は400に切り詰められ、その旨が通知されます)で、オフセットを使ってページングします
  • tally、byParty、ballotsTotal は投票全体を対象とし、ballotsMatched はフィルターに一致した投票を対象とします。tallyMatchesBallots は件数を変更せずに不一致を示します
  • 投票は Yea、Nay、Paired です。棄権者は一覧に含まれないため、投票記録のない personId を指定すると空のページが返されます
  • ページの応答サイズが24,000バイトに達すると、truncated と通知を付けて停止します。残りを取得するには nextOffset に進んでください

canparl_search_speeches ツール
  • スコープの指定が必要です。politician、billDebated または mentionedBill({ session, code })、dateFrom、dateTo のいずれかを指定します。contains は英語の文字列リテラルとして検索され、それ単独ではスコープになりません。limit は1~10(デフォルトは5。10,000までの値は10に切り詰められ、その旨が通知されます)。ページの応答サイズが24,000バイトに達すると停止し、少なくとも1件の発言を全体のまま返します
  • politician には、canparl_search_bills の sponsor と同じスラッグ、パス、URL、または現在の personId の値を指定し、同じ方法で解決します。appliedFilters.politicianName は、使用されたプロフィール名を示します
  • 1回の呼び出しでスキャンする生候補は最大100件です。一致がないと結論付ける前に、同じフィルターを指定して nextOffset に進み、exhausted になるまで続けてください。それでも結果は OpenParliament のインデックスのみを対象とします
  • 発言日の政党と選挙区を含む、完全な英語の content を返します(利用できない場合は null)。substantiveOnly(デフォルトは true)を指定すると手続き上の発言を除外し、委員会の記録は除外され、その件数が excludedCommittees に記録されます

canparl_list_reference ツール
  • topic:sessions、bill_types、bill_statuses、vote_results、vote_document_types、またはparties。ページネーションなしで完全な一覧を返します
  • sessionsではsessionを指定せず、各セッションの法案の対象範囲がbasicかfullか、および下院の投票記録の対象範囲を返します。それ以外のトピックではセッションを指定し、各値がフィードでobservedとして記録されているかを示します

特長

@cyanheads/mcp-ts-coreを基盤としています。stdioおよびStreamable HTTPトランスポート、プラグイン可能な認証(none/jwt/oauth)、交換可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションのOpenTelemetryトレースに対応した構造化ログを備えています。

カナダ議会に特化した機能:

  • 公式の法案データはセッション35-1(1994年)から、全記録は37-1(2001年)から、下院の投票記録は38-1(2004年)から利用できます。OpenParliamentの過去の名前インデックスは1994年まで遡ります
  • 法案は両院を対象とします。議員、投票記録、発言に関するツールは下院を対象とします。過去のデータに存在しないフィールドはnullのままです
  • セッションは"45-1"または{ "parliament": 45, "session": 1 }で指定できます。セッションを省略すると、発言の法案スコープを除き、現在の公式法案フィードから解決されます
  • ソースごとのリクエスト間隔調整、短期間のインメモリーキャッシュ、再試行、全ツール共通の50秒のタイムアウトを備えています。OpenParliamentへのリクエストは開始間隔を2秒空けて逐次処理するため、提案法案やOpenParliamentの投票データの取得には数十秒かかる場合があります
  • 公式ソースからのHTTP 403拒否は、upstream_blocked、ソース名、および後ほどそのソースを再試行するよう促す案内とともに失敗として返されます。レスポンスのHTMLは含まれず、公式データが別のソースのデータに置き換えられることはありません

エージェント向けの出力:

  • 出典情報:取得が成功するたびに、source、url、元のretrievedAt、cachedを含みます
  • 明示的な対象範囲:正規化されたappliedFilters、継続用フィールド、通知、型付きの失敗理由により、該当なしと、利用不可または不完全なデータを区別します
  • 両方の出力形式:完全なソーステキストを含むすべてのstructuredContent値は、Markdown形式のcontent[]にも出力されます

カナダ議会のリサーチガイドでは、法案、投票記録、議員、Hansardの記録を関連付け、過去について結論を出すために必要な根拠を説明しています。プラグインインストール、npm、Docker、デスクトップバンドルに同梱されており、MCP経由でskill://canada-parliament-guide/SKILL.mdから利用できます。

はじめに

Claude Codeでホストサーバーに接続します:

claude mcp add --transport http canada-parliament-mcp-server https://canada-parliament.caseyjhand.com/mcp

または、ローカルで実行します:

claude mcp add canada-parliament-mcp-server -- npx -y @cyanheads/canada-parliament-mcp-server

その他のクライアントでは、MCP設定ファイルに次の内容を追加します:

{
  "mcpServers": {
    "canada-parliament-mcp-server": {
      "command": "npx",
      "args": ["-y", "@cyanheads/canada-parliament-mcp-server"]
    }
  }
}

APIキーは不要です。任意でCANPARL_USER_AGENTを設定すると、上流ソースに対してデプロイ環境を識別できます。Dockerまたはソースからビルドして実行する方法については、サーバーの実行を参照してください。

設定

変数説明デフォルト
CANPARL_USER_AGENT上流ソースに送信するHTTP User-Agentです。空欄の場合はデフォルト値を使用します。CRとLFは拒否されます。canada-parliament-mcp-server ([email protected]; https://github.com/cyanheads/canada-parliament-mcp-server)
MCP_TRANSPORT_TYPEトランスポート:stdioまたはhttp。stdio
MCP_HTTP_HOSTHTTPのバインドアドレス。127.0.0.1
MCP_HTTP_PORTHTTPサーバーのポート。3010
MCP_SESSION_MODEHTTPのセッションモード: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_ENABLEDOpenTelemetryを有効にします。false

すべてのサーバー設定と、フレームワーク共通のオーバーライドについては.env.exampleを参照してください。

サーバーの実行

ローカル開発

Bun v1.4.0 以上(または Node.js v24 以上)と、parl.ca、ourcommons.ca、openparliament.ca へのインターネット接続が必要です。

git clone https://github.com/cyanheads/canada-parliament-mcp-server.git
cd canada-parliament-mcp-server
bun install
cp .env.example .env
  • 本番バージョンをビルドして実行する:

    # 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
    
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/canada-parliament-mcp-server:latest

このイメージでは、HTTP トランスポート、ステートレスセッション、および /var/log/canada-parliament-mcp-server へのログ出力がデフォルトで有効です。MCP クライアントから stdio 経由で実行するには、"command": "docker" と "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/canada-parliament-mcp-server:latest"] を使用してください。docker build -t canada-parliament-mcp-server . でローカルにビルドできます。OpenTelemetry の依存パッケージはデフォルトでインストールされます。省略するには --build-arg OTEL_ENABLED=false を指定してください。

プロジェクト構成

ディレクトリ目的
src/mcp-server/tools/definitionsツール定義(*.tool.ts)、共有 Markdown レンダラー、共有の議員 ID 対応表。
src/services/legisinfoLEGISinfo サービス — セッションの検出、公式法案一覧、法案資料。
src/services/ourcommonsHouse of Commons サービス — 現在の議員名簿、会議記録、議員投票の XML。
src/services/openparliamentOpenParliament サービス — 過去の議員 ID、活動、演説、所属。
src/domain共有スキーマ、正規化、参照用語集、リクエストの予算。
src/configZod によるサーバー固有の環境変数の解析と検証。
skills/ツールを呼び出すエージェント向けに公開された議会調査ガイド。
tests/合成された上流フィクスチャを使用するパーサー、サービス、ツール、統合テスト。

完全なツリーについては、docs/tree.md を参照してください。

開発ガイド

開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。

  • ハンドラーは例外をスローし、フレームワークが捕捉します。既知のソース障害を変換する場合、または任意の付加情報を維持する場合に限り、例外を捕捉してください。
  • ログには ctx.log を使用し、適用されたフィルター、合計、通知には ctx.enrich を使用してください。
  • 新しいツールは src/index.ts の createApp() 配列に登録してください。
  • 外部 API 呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに従って返します。不足しているフィールドを決して捏造しないでください。

コントリビューション

Issue を歓迎します。提出前にチェックとテストを実行してください。

bun run devcheck
bun run test

ライセンス

コードは Apache 2.0 の下でライセンスされています。議会データは議会および、使用されている場合は OpenParliament のクレジットを明記した非公式の複製であり、著作権は議会に帰属します。再利用には、それぞれ議会の通知、議長の許可、上院の利用規約、OpenParliament API の利用規約が適用されます。この無料かつ非営利の中継サービスは、政府による推奨やオープンデータライセンスを意味するものではありません。

コメント

MCP は初めてですか?

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

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