canada-parliament-mcp-server について
canada-parliament-mcp-serverは、AIクライアントなどのMCPクライアントにカナダ連邦議会の記録を提供し、調査に利用できます。法案、議員、下院の投票、Hansard演説を検索でき、出典とデータ範囲も示します。
主な機能
- 01法案の検索と議案資料の取得
- 02現職・歴代議員の検索
- 03下院の採決と投票記録の確認
- 04索引化されたHansard演説の検索
- 05出典とデータ範囲の提示
活用シーン
- 01法案の立法段階の追跡
- 02議員の所属と投票記録の確認
- 03下院採決結果の比較
- 04法案に関する演説の検索
MCP 対応
MCPサーバーは法案、議員、投票、演説、参照データを検索・取得する8つのツールを提供します。stdioとStreamable HTTPに対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://canada-parliament.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-canada-parliament https://canada-parliament.caseyjhand.com/mcp{"mcpServers":{"cyanheads-canada-parliament":{"type":"http","url":"https://canada-parliament.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-canada-parliament":{"type":"http","url":"https://canada-parliament.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-canada-parliament":{"type":"http","url":"https://canada-parliament.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-canada-parliament":{"serverUrl":"https://canada-parliament.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
8| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 1回の呼び出しで返される行数は最大1~100です。10000までのより大きな値を指定しても、通知とともに100行が返されます。 |
| offset | integer | いいえ | 選択した並び順における 0 始まりのオフセット。 |
| status | string | いいえ | canparl_list_reference の bill_statuses トピックにある公式法案ステータス。 |
| session | any | いいえ | 議会会期。省略すると現行会期になります。 |
| sponsor | string | いいえ | OpenParliament の MP slug、政治家のパス/HTTPS URL(canparl_get_member の member.slug、または includeFormer を指定した canparl_search_members の行)、あるいは現職 MP の公式 personId。上院議員はインデックス対象外です。現職 personId と一致する数字のみの値、その /politicians/<digits>/ パス、またはプロフィール URL は、その personId として読み取られます。 |
| billCode | string | いいえ | 分割法案の接尾辞(C-15A など)を含む正確な法案コード。bill s321、S321、S 321、S-321 を受け付けます。 |
| billType | string | いいえ | canparl_list_reference の bill_types トピックにある公式法案種別。 |
| titleContains | string | いいえ | 英語またはフランス語の長いタイトルまたは短いタイトルに含まれる、大小文字を区別しないリテラル部分文字列。 |
| originatingChamber | string | いいえ | House、House of Commons、または Senate。大文字と小文字は区別しません。 |
詳細
@cyanheads/canada-parliament-mcp-server
MCP を介して、カナダ連邦法案、国会議員、下院の採決、ハンサードの演説を追跡します。STDIO または Streamable HTTP に対応。
公開ホストサーバー: 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_HOST | HTTPのバインドアドレス。 | 127.0.0.1 |
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を参照してください。
サーバーの実行
ローカル開発
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/legisinfo | LEGISinfo サービス — セッションの検出、公式法案一覧、法案資料。 |
src/services/ourcommons | House of Commons サービス — 現在の議員名簿、会議記録、議員投票の XML。 |
src/services/openparliament | OpenParliament サービス — 過去の議員 ID、活動、演説、所属。 |
src/domain | 共有スキーマ、正規化、参照用語集、リクエストの予算。 |
src/config | Zod によるサーバー固有の環境変数の解析と検証。 |
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 の利用規約が適用されます。この無料かつ非営利の中継サービスは、政府による推奨やオープンデータライセンスを意味するものではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。