sweden-parliament-mcp-server について
Riksdagen Open Data の記録を検索する MCP サーバーです。議会文書、演説、投票、議員、SFS 法令を扱い、stdio または Streamable HTTP で動作します。
主な機能
- 01議会文書と SFS 法令の検索
- 02文書本文と決定情報の取得
- 03会期や議員による演説検索
- 04報告書と議員投票の取得
- 05議員と任務履歴の検索
活用シーン
- 01委員会や会期で議会文書を検索
- 02議会討論の発言内容を確認
- 03報告書の決定と会派別投票数を確認
- 04議員の公開された任務履歴を調査
MCP 対応
スウェーデン議会の文書、法令、演説、投票、議員情報を検索する 7 つの読み取り専用ツールを MCP クライアントに提供します。stdio と Streamable HTTP に対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://sweden-parliament.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-sweden-parliament https://sweden-parliament.caseyjhand.com/mcp{"mcpServers":{"cyanheads-sweden-parliament":{"type":"http","url":"https://sweden-parliament.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-sweden-parliament":{"type":"http","url":"https://sweden-parliament.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-sweden-parliament":{"type":"http","url":"https://sweden-parliament.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-sweden-parliament":{"serverUrl":"https://sweden-parliament.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
7| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 要求する項目数。100 を超える値は 100 に制限され、その旨が通知されます。 |
| topic | enum | はい | 参照する語彙またはガイダンストピック。document_types | committees | parties | constituencies | speech_types | sessions | identifiers | coverage |
| offset | integer | いいえ | 0 始まりのローカル項目オフセット。 |
詳細
@cyanheads/sweden-parliament-mcp-server
MCP を通じて、スウェーデンの議会文書、演説、投票、議員、法令を検索できます。STDIO または Streamable HTTP に対応しています。
概要
リクスダーゲンのオープンデータから、スウェーデンの議会記録を検索できます。法案や委員会報告を探し、公表された決定や本会議投票を確認し、演説を読み、議員の役職を調べ、統合版 SFS 法令を取得できます。stdio プロセスまたはローカルの Streamable HTTP サーバーとして動作し、API キーは不要です。
情報源:スウェーデン議会。この独立したサービスは、スウェーデン議会(Sveriges riksdag)が運営または推奨するものではありません。スウェーデン語のタイトル、ラベル、決定、本文は情報源の表記を保持しています。英語のラベルは、情報源に記載されている場合に限り表示されます。
ツール
| ツール | 説明 |
|---|---|
riksdag_list_reference | 公式の文書種別、委員会、政党、選挙区、会期を参照し、識別子と対象範囲に関するガイダンスを確認します |
riksdag_search_documents | キーワード、種別、会期、委員会、政党、日付で議会文書と統合版 SFS 法令を検索します |
riksdag_get_document | 公表情報、決定、留保意見、活動、リンク、ページ分割された本文を読み取ります |
riksdag_search_speeches | 会期内の討論見出し、議員、政党から演説を検索し、get モードで全文を取得します |
riksdag_get_votes | 報告書の決定と政党別の本会議投票集計、または会期中の特定議員の本会議投票を読み取ります |
riksdag_search_members | 名前、政党、選挙区、情報源サービスの分類で名簿項目を検索します |
riksdag_get_member | 指定した議員 IID と公表済みの役職履歴を読み取ります |
機能リファレンス
riksdag_list_reference ツール
topic:document_types、committees、parties、constituencies、speech_types、sessions、identifiers、またはcoverage- スウェーデン語ラベル、利用可能なソースの英語ラベル、ソースへのリンク、
referenceVerifiedAtを含む日付付きオフラインスナップショットです。文書のサブタイプは親コードとは別に維持され、会期カタログは現在の会期に追いついていない場合があります offsetによるページネーションです。limitのデフォルトは 20 で、上限は 100 です。totalCountと完全なnextCall引数が含まれます
riksdag_search_documents ツール
query、documentType、session、committee、party、dateFrom、dateToは任意です。日付にはYYYY-MM-DDを使用し、コードまたは完全一致する参照ラベルを指定できます- リモートの
pageは 1 から始まります。pageSizeのデフォルトは 10 で、上限は 50 です。取得したすべての行がソース順で返され、利用可能なtotalCountとnextCallも含まれます - 統合版法令には
documentType: "sfs"を使用します。時間のかかる全文検索はsessionまたはdocumentTypeで絞り込んでください
riksdag_get_document ツール
- 検索で取得した
documentId、または1974:152などの曖昧さのない SFS 識別子が必須です。レコードが見つからない場合はfound: falseが返されます - メタデータ、完全なアウトライン、最初のテキストページを取得する場合は
sectionsを省略します。metadata、decisions、reservations、activities、properties、attachments、references、text、またはsource_htmlを選択できます - テキストと HTML では Unicode コードポイントのオフセット(
textOffset/htmlOffset)を使用します。長さのデフォルトは 1,000 で、明示的に指定したtextLength/htmlLengthの値が優先されます。配列セクションではsectionOffset/sectionLimitを使用します(デフォルトは 20、適用される上限は 100) nextTextCall、nextHtmlCall、または各sectionPages[].nextCallを使用し、revisionを保持してください。レコードが変更されている場合はrevision_changedエラーになります。添付ファイルはリンクであり、ダウンロードされたファイルではありません- SFS の
versionKind: "consolidated"は公表された統合版テキストを示しており、将来施行される規定が含まれる場合があります。制定時点の法的バージョンや特定時点の法的バージョンではありません
riksdag_search_speeches ツール
mode: "search"(デフォルト)ではsessionが必須です。任意のmemberId、party、speechType: "all" | "speech"で選択を絞り込めます。speechを指定すると答弁を除外しますheadingContainsは大文字小文字とダイアクリティカルマークを無視し、すべてのトークンが見出しと小見出しに含まれるかを照合します。演説本文は検索しません- ローカルの
offsetによるページネーションです。limitのデフォルトは 5 で、上限は 20 です。textCountのデフォルトは 1 で、上限は 5 です。メタデータのみを取得する場合は 0 を指定できます mode: "get"では、検索結果からコピーした取得用のspeechIdが必須です。sourceSpeechIdは使用できません。get モードでは検索フィルターが拒否されます。textOffsetと任意のtextLengthを指定すると、nextTextCallを通じて公表された本文全体を読み取れます。テキストページのデフォルトは 1,000 コードポイントですtextStateはincluded、not_requested、unavailable、またはfailedです。一時的なハイドレーションの失敗には復旧の詳細が含まれます。検索またはテキストの継続呼び出しではrevisionを保持してください
riksdag_get_votes ツール
modeとsessionが必須です。mode: "report"ではreport(議案番号、または session:designation)またはレポートのdocumentIdを指定します。mode: "member"ではmemberIdが必須で、partyを指定できます- レポートモードでは、権威ある決定と完全な会派グループが返されます。1 つの
pointを選択するか、pointOffset/pointLimitを使用します(デフォルトは 5、適用される上限は 10)。メンバーモードではoffset/limitを使用します(デフォルトは 20、適用される上限は 500) - 公表された主要な投票のみが対象で、すべての投票ラウンドが対象ではありません。
rollCallStateはavailable、acclamation、not_published、またはunknownです。acclamationと判定するには明示的な決定の証拠が必要で、投票行が空であることだけを根拠にしてはなりません - 集計数が欠けている場合、その値は不明のままです。ソースにある追加の投票ラベルは
otherVotesに保持されます。残りの全ポイントまたはメンバー行を取得するには、revisionを指定してnextCallを使用してください
riksdag_search_members ツール
- 任意の
nameContainsは、大文字・小文字と発音区別符号を無視してすべてのトークンに一致します。partyとconstituencyには、コードまたは参照ラベルの完全一致を指定できます sitting: "all" | "serving" | "not_serving"のデフォルトはallです。これは、実際の在職状況や選出された議員かどうかではなく、ソースの在職分類で絞り込みます。過去の登録情報や大臣が含まれる場合があり、分類が不明なものはallに含まれます- ローカルの
offsetページネーションです。limitのデフォルトは 20 で、最大 100 に制限されます。candidateCount、絞り込み後の正確なtotalCount、revision、nextCallを返します memberIdの先頭のゼロは保持してください。一部の欧州議会の登録情報には IID がなく、detailAvailable: falseが返されます。そのsourceRecordIdは別の識別子であり、riksdag_get_memberでは使用できません
riksdag_get_member ツール
- 検索結果から取得した、先頭のゼロを含む数値文字列の
memberIdが必須です。該当する登録情報がない場合は、ガイダンスとともにfound: falseを返します - 公開されている登録メタデータと役職をソース順に返します。
assignmentOffset/assignmentLimitのデフォルトはそれぞれ 0 / 20 で、適用される上限は 100 です assignmentTotal、nextCall、revisionにより、すべての情報を順に取得できます。役職の日付はソースの精度を維持しており、過去の在職状況を示すものではありません。連絡先情報と写真は除外されます
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、切り替え可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースに対応した構造化ログを備えています。
Riksdag 固有の機能:
- API キー不要で、公式の文書、発言、投票、議員の各エンドポイントに加え、日付付きの公式参照テーブルにアクセスできます
- 文書テキストは、標準の Markdown または SFS のソーステキストとして取得でき、元の HTML は個別に選択できます
- アップストリームの同時実行制御、上限付きの公開レスポンスキャッシュ、キュー処理、再試行、テキストの取得に適用される 55 秒の共通期限を備えています
- 過去のデータの範囲はレコードの種類によって異なります。発言と投票のデータは 1993/94 年からで、それ以前の投票データには欠落があります
エージェント向けの出力:
content[]とstructuredContentの両方に、ソースの帰属、取得時刻、有効なフィルター、ソースに関する警告を含めます- 行、セクション、テキストに対する完全な継続呼び出しを用意し、ローカルでの継続処理ではリビジョンを確認します。変化し続けるリモートの文書検索は、固定されたスナップショットではありません
- 該当なし、利用できないテキスト、不明な件数、ソースの在職分類を明示します。候補が上限に達した場合は、不完全な取得結果を返さず、
candidate_limit_reachedとして失敗します
はじめに
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"sweden-parliament-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/sweden-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または npx を使用する場合(Bun は不要です):
{
"mcpServers": {
"sweden-parliament-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/sweden-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または Docker を使用する場合:
{
"mcpServers": {
"sweden-parliament-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/sweden-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 以降)。
- Riksdagen Open Data の利用に API キーやアカウントは不要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/sweden-parliament-mcp-server.git
- ディレクトリに移動します:
cd sweden-parliament-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env for optional transport, authentication, or logging overrides
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
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 | 7 つのツールを登録し、サービスを初期化して、ステートレス HTTP セッションを選択します。 |
src/mcp-server/tools/definitions | 7 つの読み取り専用ツール定義。リソースとプロンプトはありません。 |
src/services/riksdag | Riksdagen エンドポイントの解析、参照テーブル、トランスポート、キャッシュ、テキスト変換、継続処理。 |
tests/ | src/ の構成に対応するユニットテストと統合テスト。 |
完全なファイルツリーについては、docs/tree.md を参照してください。
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します — ツールのロジックで
try/catchを使用しないでください - ログには
ctx.logを、ストレージにはctx.stateを使用します src/index.tsのcreateApp()配列に新しいツールとリソースを登録します- 外部 API 呼び出しをラップします:生データを検証 → ドメイン型に正規化 → 出力スキーマを返す。欠落しているフィールドを決して捏造しないでください
貢献
課題の報告を歓迎します。提出前にチェックとテストを実行してください:
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。