fedlex-mcp について
fedlex-mcpは、スイスの連邦法、公開協議、公式用語を検索するMCPサーバーです。法令調査や協議期限の確認に加え、多言語の用語検索にも対応します。
主な機能
- 01連邦法、官報、条約などの検索
- 02協議の期限と詳細の確認
- 03TERMDATの用語と定義の検索
- 04FedlexとLINDASのSPARQLエンドポイントを個別に利用
- 05stdioとStreamable HTTPのトランスポート
活用シーン
- 01テーマやSR番号から法令を検索
- 02公開中の協議と締切を確認
- 03法令の履歴や施行予定の変更を調査
- 04他言語での公式用語を検索
MCP 対応
連邦法、協議、TERMDATに関する12個のツールと2個のリソースをMCPクライアントに提供します。stdioとStreamable HTTPに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
:switzerland: Swiss Public Data MCP Portfolio の一部です
:balance_scale: fedlex-mcp
スイス連邦法、協議、公式用語のための MCP サーバーです。Claude Desktop または Claude.ai を通じて、SR を検索し、協議の締切を確認し、国語間で用語を翻訳できます。
概要
fedlex-mcp は、AI アシスタント(Claude)をスイスの3つの公式 SPARQL データソースに接続します。
- 連邦法は、Fedlex SPARQL エンドポイントを通じて提供されます。体系的法令集(SR)、官報(AS)、連邦官報(BBl)、条約が含まれます。
- **協議(Vernehmlassungen)**は、同じ Fedlex エンドポイント(
jolux:Consultation)を通じて提供されます。法案に誰でも意見を述べられる、議会提出前の段階です。 - TERMDAT は、連邦事務局の用語データベースで、LINDAS SPARQL エンドポイントを通じて提供されます。de/fr/it/rm/en の公式用語に対応する語を収録しています。
3つすべてが SPARQL ベースです。だからこそ、別々のサーバーを3つ用意するのではなく、1つにまとめています。新しい技術スタックは不要で、既知のパターンに基づく新しいクエリだけで対応できます。
**たとえるなら:**連邦法の USB-C です。Fedlex は何に回答する必要があるかを教え、TERMDAT はそれが他の国語で何と呼ばれるかを教えます。
機能
- :balance_scale: 連邦法、協議、用語を扱う 12個のツール、2個のリソース
- :mag: SPARQL を活用 — 分離された2つのエンドポイント(Fedlex + LINDAS)により、障害の影響が共有されません
- :globe_with_meridians: 5言語 — ドイツ語、フランス語、イタリア語、ロマンシュ語、および用語向けの英語
- :unlock: API キー不要 — すべてのデータはオープンな再利用ライセンスの下で提供されます
- :cloud: 2種類のトランスポート — stdio(Claude Desktop)+ Streamable HTTP(クラウド)
基準となるデモクエリ
「教育関連で現在受付中の協議はどれですか?締切はいつまでで、担当部署はどこですか?また、回答に使う重要な専門用語のフランス語とイタリア語は何ですか?」
1回の会話で、2つのエンドポイントにまたがる3つのツールを連携させます。
fedlex_get_open_consultations(topic="education")
→ fedlex_get_consultation(event_id="proj/2026/71/cons_1")
→ termdat_lookup_term(term="Volksschule", target_languages=["fr","it"])
受付中の各協議には deadline、days_remaining(リクエスト時に Europe/Zurich で計算され、0 は締切当日)、および算出された status が含まれます。期限切れの協議が受付中として表示されることはありません。Fedlex は何に、いつまでに回答する必要があるかを示し、TERMDAT はそれを他の国語でどう表現するかを示します。
keyword="Volksschule"ではなく、topic="education"を使ってください。 Fedlex の協議には主題の分類体系がなく、タイトルに対するフリーテキスト検索で絞り込みます。「Volksschule」という語は、協議のタイトルに一度も登場しません。topicフィルターは、明示されたキーワード群(Bildung、Schule、Berufsbildung、Hochschule、…)に展開され、検索した用語を正確に報告します。
前提条件
- Python 3.11+
- uv(推奨)または pip
インストール
uv の uvx を使って実行します。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用します。VS Code では .vscode/mcp.json 内のトップレベルの servers キーを使用してください)。
{
"mcpServers": {
"fedlex-mcp": {
"command": "uvx",
"args": [
"fedlex-mcp"
]
}
}
}
ソースからのインストール
# Clone the repository
git clone https://github.com/malkreide/fedlex-mcp.git
cd fedlex-mcp
# Install
pip install -e .
# or with uv:
uv pip install -e .
または uvx を使用します(永続的なインストールは不要です)。
uvx fedlex-mcp
クイックスタート
# stdio (for Claude Desktop)
python -m fedlex_mcp.server
# Streamable HTTP (port 8000)
python -m fedlex_mcp.server --http --port 8000
Claude Desktopですぐに試してみましょう:
「職業訓練に関する、現在有効な連邦法をすべて表示してください」 「データ保護法には何と書かれていますか?現在も有効ですか?」 「教育に関する協議で、現在受付中のものと締切日を教えてください」 「公式用語では、『Volksschule』はフランス語とイタリア語で何と呼ばれていますか?」
設定
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します:
{
"mcpServers": {
"fedlex": {
"command": "python",
"args": ["-m", "fedlex_mcp.server"]
}
}
}
または、uvx を使用します:
{
"mcpServers": {
"fedlex": {
"command": "uvx",
"args": ["fedlex-mcp"]
}
}
}
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
クラウドデプロイ(ブラウザーアクセス用の SSE)
ブラウザーから claude.ai を使う場合(たとえば、ローカルソフトウェアを利用できない管理対象ワークステーションの場合):
Render.com(推奨):
- リポジトリを GitHub にプッシュするか、フォークします
- render.com で「New Web Service」を選択し、GitHub リポジトリに接続します
- 起動コマンドを設定します:
python -m fedlex_mcp.server --http --port 8000 - claude.ai の「Settings」→「MCP Servers」で、
https://your-app.onrender.com/sseを追加します
「開発者のノートパソコンには stdio、ブラウザーには SSE。」
デモ
利用可能なツール
| # | ツール | ソース | 説明 |
|---|---|---|---|
| 1 | fedlex_search_laws | Fedlex | 題名内のキーワードで連邦法令集(SR)を検索します |
| 2 | fedlex_get_law_by_sr | Fedlex | SR 番号で法律を取得します(例:235.1 = データ保護法) |
| 3 | fedlex_get_recent_publications | Fedlex | 連邦官報(AS)の最新刊行物を取得します |
| 4 | fedlex_get_upcoming_changes | Fedlex | まもなく施行される法律を取得します(法令モニタリング) |
| 5 | fedlex_search_gazette | Fedlex | 連邦公報(BBl)を検索します |
| 6 | fedlex_get_law_history | Fedlex | 法律の全バージョンを取得します(バージョン履歴) |
| 7 | fedlex_search_treaties | Fedlex | 国際条約を検索します(SR 番号が 0. で始まるもの) |
| 8 | fedlex_get_open_consultations | Fedlex | 締切日モニタリング — 受付中の協議(eventEndDate >= today、Europe/Zurich)。それぞれに days_remaining と導出された status があり、締切日の近い順に並べ替えられます。topic/keyword は任意です |
| 9 | fedlex_search_consultations | Fedlex | 協議のタイトル/説明を全文検索します。フィルター(トピック、ステータス、締切日の範囲、担当機関)も利用できます |
| 10 | fedlex_get_consultation | Fedlex | 1 つの eventId の詳細を取得します:締切日、days_remaining、担当機関、導出されたステータス、文書 |
| 11 | termdat_lookup_term | LINDAS | 用語から de/fr/it/rm/en の対応語を取得します。定義も含まれます |
| 12 | termdat_get_concept | LINDAS | URI または ID に対応する TERMDAT エントリー全体を取得します |
使用例
| クエリ | ツール |
|---|---|
| 「職業訓練に関する、現在有効な連邦法をすべて表示してください」 | fedlex_search_laws |
| 「データ保護法には何と書かれていますか?」 | fedlex_get_law_by_sr |
| 「今後 3 か月以内に施行される法律を教えてください」 | fedlex_get_upcoming_changes |
| 「DSG のバージョン履歴を表示してください」 | fedlex_get_law_history |
| 「教育に関する協議で、受付中のものと締切日を教えてください」 | fedlex_get_open_consultations |
| 「言語法に関する終了済みの協議を検索してください」 | fedlex_search_consultations |
| 「協議 proj/2026/71/cons_1 の詳細と文書をすべて表示してください」 | fedlex_get_consultation |
| 「『Volksschule』はフランス語とイタリア語で何と呼ばれていますか?」 | termdat_lookup_term |
| 「TERMDAT エントリー 40109 の全体を表示してください」 | termdat_get_concept |
→ 対象者別の使用例をさらに見る →
アーキテクチャ
1 つのサーバーの背後に、分離された 2 つの SPARQL エンドポイントがあります。httpx クライアントとタイムアウトが個別に設定されているため、LINDAS の障害が fedlex_* ツールに影響することはなく、その逆も同様です。
+-------------------+ +------------------------------+ +--------------------------+
| Claude / AI |---->| Fedlex MCP |---->| Fedlex SPARQL Endpoint |
| (MCP Host) |<----| (MCP Server) |<----| fedlex.data.admin.ch |
+-------------------+ | | | (law + consultations) |
| 12 Tools . 2 Resources | +--------------------------+
| Stdio | SSE |
| | +--------------------------+
| Isolated clients: |---->| LINDAS SPARQL Endpoint |
| - Fedlex (law + cons.) |<----| lindas.admin.ch/query |
| - LINDAS (TERMDAT) | | (fch/termdat, TERMDAT) |
| | +--------------------------+
| No authentication required |
+------------------------------+
データモデル
JOLux オントロジー — 連邦法(Fedlex)
jolux:ConsolidationAbstract <- SR entry
+-- jolux:isRealizedBy -> jolux:Expression (URI ends in /de, /fr, /it, /rm)
+-- jolux:title "Federal Act of 19 June 1992 on Data Protection"
+-- jolux:titleShort "DSG"
+-- jolux:historicalLegalId "235.1"
jolux:inForceStatus: .../0 In force · .../1 No longer published in SR · .../3 No longer in force
JOLux オントロジー — 協議(Fedlex、同じエンドポイント)
jolux:Consultation
+-- jolux:eventId "proj/2026/71/cons_1"
+-- jolux:eventTitle multilingual (de/fr/it)
+-- jolux:eventDescription multilingual
+-- jolux:consultationStatus -> vocabulary URI (0..6, /2 = "Laufend"/running)
+-- jolux:foreseenImpactToLegalResource -> the legal resource it will amend (link to SR)
+-- jolux:hasSubTask -> ?t
+-- jolux:eventStartDate <- opened_on
+-- jolux:eventEndDate <- the deadline (xsd:date, calendar day)
+-- jolux:institutionInChargeOfTheEvent <- lead department
+-- jolux:institutionInChargeOfTheEventLevel2 <- lead office
+-- jolux:opinionHasDraftRelatedDocument <- consultation documents
jolux:Consultation には主題分類がありません。テーマによる絞り込みは eventTitle のみを対象としたフリーテキスト検索で行い、status はソースのステータスフィールドではなく、期限から導出されます。
立法のライフサイクル — 協議の位置づけ(すべてこの1つのサーバー内):
Vernehmlassung Bundesblatt (BBl) Systematische Sammlung (SR)
(consultation) ─────► (dispatch / act text) ───► (consolidated law in force)
──────────────── ───────────────────── ───────────────────────────
fedlex_get_open_ fedlex_search_gazette fedlex_search_laws
consultations (eli/fga/…) fedlex_get_law_by_sr
fedlex_search_ fedlex_get_law_history
consultations (eli/cc/…)
fedlex_get_consultation
│ jolux:foreseenImpactToLegalResource
└───────────────────────────────────────────► links a consultation forward
to the SR resource it amends
協議段階は、影響を与えることのできる最も早い公開時点です。上記のツールを使うと、草案がBundesblattに掲載される前に、何が公開中で、いつまでかを確認できます。
schema.org — 用語(LINDAS経由のTERMDAT、グラフ fch/termdat)
<concept> = https://register.ld.admin.ch/termdat/40109 (a schema.ld.admin.ch/Term, ValidatedEntry)
+-- schema:name preferred name per language (de/fr/it/en; rm effectively absent)
+-- schema:description multilingual definition
+-- schema:hasPart -> <term> = .../termdat/40109/3/de (synonym/variant, language + position suffix)
SPARQL エンドポイント: https://fedlex.data.admin.ch/sparqlendpoint · https://lindas.admin.ch/query
ライセンス: fedlex.admin.chに従い自由に再利用できます。LINDAS経由のTERMDATもオープンな再利用が可能です。
アーキテクチャ上の決定
ARCH A — 3つすべてのデータ領域でライブ SPARQL のみを使用し、既存のFedlex統合との一貫性を保ちます(2026-07-18決定)。
どちらのソースも認証不要のSPARQLエンドポイントで、許容可能な応答時間であるため、ダンプやオフラインへのフォールバックは不要です。Fedlexのエンドポイントがダウンすれば、いずれにせよサーバーは機能しません。また、キャッシュを追加しても問題を隠すだけです。LINDASは別のエンドポイントであり、その停止によって fedlex_* ツールの性能を低下させてはなりません。
分離要件: FedlexとLINDASでは、httpxクライアント、タイムアウト、エラーおよびステータスの報告をそれぞれ分離します。LINDASのタイムアウトによって fedlex_* の呼び出しが失敗することはなく、その逆もありません(分離テストで確認します)。
言語
| コード | 言語 |
|---|---|
de | ドイツ語(デフォルト、最も網羅的) |
fr | フランス語 |
it | イタリア語 |
rm | ロマンシュ語 |
プロジェクト構成
fedlex-mcp/
+-- src/fedlex_mcp/
| +-- __init__.py # Package
| +-- server.py # 12 tools, 2 resources (Fedlex + LINDAS)
+-- tests/
| +-- test_server.py # Unit tests (mocked)
+-- .github/workflows/ci.yml # GitHub Actions (Python 3.11/3.12/3.13)
+-- pyproject.toml
+-- CHANGELOG.md
+-- CONTRIBUTING.md # Contributing guide (English)
+-- CONTRIBUTING.de.md # Contributing guide (German)
+-- SECURITY.md # Security policy (English)
+-- SECURITY.de.md # Security policy (German)
+-- LICENSE
+-- README.md # This file (English)
+-- README.de.md # German version
既知の制限事項
- SPARQL の複雑さ: 非常に広範なキーワード検索では、タイムアウト(45秒)になる場合があります
- 言語の対応範囲: ドイツ語が最も網羅的で、他の言語ではデータが不足している場合があります
- 履歴データ: すべての法律の過去のバージョンに、機械可読なメタデータがあるわけではありません
- レート制限: エンドポイントで、頻度の高いリクエストが制限される場合があります
協議 — 対象範囲と信頼性(利用する前にお読みください)
- 連邦のみです。州の協議は対象外です。 Fedlex に収録されているのは連邦(Bund)の協議です。学校当局(Schulamt)にとって、より関連性の高いことが多い州の協議は、Fedlex にも本ツールにも含まれていません。これは明確な対象範囲の境界であり、回避策で補うべき欠落ではありません。
- プッシュ通知サービスではありません。 MCP はプル型です。サーバーはリクエストに応じて、現在公開中の協議と、まもなく期限を迎える協議を回答します。通知、スケジュール設定、アラートには対応していません。繰り返し確認するかどうかは、利用者または外部スケジューラーに委ねられており、サーバーは行いません。「公開中の協議はありません」は、現在公開中のものがないという意味であり、今後も公開されないという意味ではありません。
- テーマによる絞り込みは自由入力方式で、完全ではありません。
jolux:Consultationには主題/分類の分類体系がありません(2026-07-20 にライブ環境で検証済み)。絞り込みはタイトルのみを対象とする部分文字列検索です。topic="education"は、明示されたキーワードの和集合に展開され、意図的に広めに一致します(絞り込みが狭すぎると、誤った安心感を与えるためです)。誤検出(例:無関係なタイトルに含まれる「Ausbildung」)や、ニッチな表現による検出漏れが起こる可能性があります。レスポンスには、検索した用語が常に記載されます。 - 収録範囲/反映の遅延: 協議は約2,553件です。1960~1991年の過去の資料は連邦公文書館に保管されており、対象範囲外です。新たに公開された協議は、Fedlex の公開内容が上流から反映されるまでの遅延を経て表示されます(リアルタイムではありません)。
- 期限は Europe/Zurich の暦日で終了します。
days_remainingはリクエスト時に計算され、キャッシュされません。0は期限が今日であることを示します。
ライブ環境での確認結果(2026-07-20 に検証済み):
| クエリ | ステータス | レコード数 | 備考 |
|---|---|---|---|
COUNT(?s) {?s a jolux:Consultation} | OK | 2,553 | 全件 |
開始日/終了日を含む hasSubTask | OK | 2,553件中2,505件 | 期限が設定されていないものが48件 |
公開中の協議(eventEndDate >= today) | OK | 42 | 期限は2026年秋まで |
consultation-status 語彙 | OK | 7個の値 | /0~/6、/2 = 実施中 |
| タイトルに「volksschule」/「lehrplan」を含むもの | OK | 0 / 0 | 基準語自体では何も見つからないため、topic を使用してください |
タイトルに「bildung」を含むもの(単独)と topic="education" の和集合 | OK | 44 vs 66 | キーワードの和集合のほうが広範囲です |
REGEX(LCASE(?t), "a|b") による選言 | 動作しません | 0 | このエンドポイントでは結果が無言で空になります。代わりに CONTAINS を OR で連結してください |
- 注意点 1 — ステータスフィールドより期限が優先されます。 ステータス
/2(「Laufend」/実施中)とeventEndDateは、独立した2つのシグナルです。サーバーは日付からstatusを導出します。期限を過ぎている場合は、ソース側のステータスにかかわらずAbgeschlossenとなるため、期限切れの協議が実施中として表示されることはありません。2つの値が一致しない場合、レコードにはstatus_conflict: trueが設定され、元のラベルはstatus_sourceに保持されます。
TERMDAT(LINDAS)— 検証結果(2026-07-18に確認済み)
| クエリ | ステータス | レコード数 | 備考 |
|---|---|---|---|
グラフ内の COUNT(DISTINCT ?s) a schema.ld:Term | OK | 77,692 | |
schema:name の言語タグ | OK | de/fr/it/en | rm は実質的に存在しません(0) |
schema:name = "Volksschule" を検索 | OK | 1 | 用語 URI …/termdat/40109/3/de を返します |
概念 URI …/termdat/40109 | OK | – | 4つの言語バリアントと定義 |
- 特記事項 2 — 実態確認との不一致(明確に記載)。 連邦官房は TERMDAT の項目数を約 400,000 件と公表しています。LINDAS に含まれるのは 77,692 件です。この差の理由は不明です。おそらく、検証済みで公開されたサブセットのみが Linked Data として公開されています。用語が見つからなくても、TERMDAT にその用語がないことを意味するわけではありません。LINDAS のサブセットに含まれていないことを意味するだけです。 モデルが誤った結論を出さないよう、すべての TERMDAT 応答にこの注記が付いています。
- 特記事項 3 — 2種類の URI 階層。 概念 URI(
…/termdat/40109)には優先名と定義が含まれます。言語/位置のサフィックスが付いた用語 URI(…/termdat/40109/3/de)は、schema:hasPartを介して関連付けられた同義語/バリアントです。ツールはどちらの形式も受け付け、内部で概念 ID に正規化します。
このツールではできないこと
- サブスクリプションやアラート通知サービスではありません。 監視、通知、メール送信、リマインダーは行いません。問い合わせがあったときに回答します。定期的な確認は、サーバー外でユーザーまたは外部スケジューラーが実行します。
- 州の情報源ではありません。 対象は連邦(Bund)の協議のみです。「既知の制限事項」を参照してください。
- 法律上の助言ではありません。 公開メタデータと公式文書へのリンクを返します。期限とステータスは公開データから機械的に導出されるため、意思決定に重要な情報は、リンク先の Fedlex ページで確認してください。
ポートフォリオ内の関連プロセス
スイス連邦の立法は一連のプロセスで進み、このサーバーはそのうちの1段階、つまり議会前の協議を担います。全体の流れは3つの MCP サーバーで表現できます。
Vernehmlassung → Botschaft → Parlament → Referendum
(consultation) (dispatch) (debate) (popular vote)
fedlex-mcp fedlex-mcp parlament-mcp swiss-democracy-mcp
- 協議(議会前): このサーバーの
fedlex_*consultation*ツール。 - 議会段階:
parlament-mcp— 連邦議会での討論、動議、投票。 - 国民投票/レファレンダム:
swiss-democracy-mcp— 連邦の国民投票。協議はそれより前に行われる別段階であり、重複はありませんが、同じ立法ライフサイクルの一部です。
プロジェクトのフェーズ
このサーバーは**フェーズ 1(読み取り専用)**です。すべてのツールに
readOnlyHint: true / destructiveHint: false が注釈されており、公開されている
Fedlex SPARQL エンドポイントへのクエリのみを行います。書き込み、送信、ファイルシステム操作の機能はありません。
| フェーズ | 範囲 | ステータス |
|---|---|---|
| 1 — 読み取り専用 | SR/AS/BBl/条約のクエリ | ✅ 現在 |
| 2 — 書き込み可能 | (予定なし) | — |
| 3 — マルチエージェント | (予定なし) | — |
後続のフェーズへ移行する場合、書き込み可能なツールを追加する前に、監査を再実施し、監査カタログに記載されたヒューマン・イン・ザ・ループの制御を導入する必要があります。
MCP プロトコルのバージョン
このサーバーは、同一のエンドポイントで2つのプロトコル世代に対応しています。接続時のクライアントからの最初のリクエストによって適用される世代が決まり、後から別の世代を要求しても拒否されます。
| 世代 | リビジョン | 対応するクライアント |
|---|---|---|
initialize ハンドシェイク | 2024-11-05 … 2025-11-25 | 現在のクライアントが使用する方式です。サーバーは要求されたリビジョンを返します。リクエストでそれより新しいリビジョンが指定された場合は、上限である 2025-11-25 を返します。 |
| リクエストごとのエンベロープ | 2026-07-28 | 2026-07-28 の _meta エンベロープを含むリクエストにより、モダンな接続が開始されます。 |
両方のリビジョンは
tests/test_protocol_version.py で固定され、インストール済み SDK に対して検証されるため、Dependabot による mcp の更新で、どちらかが気付かないうちに変更されることはありません。ハンドシェイクの上限は、定数名から読み取るのではなく、構成済みの ASGI スタックを通した実際の initialize によって測定されます。
SDK の LATEST_PROTOCOL_VERSION はmodern
時代のエイリアスであり、handshake 時代のエイリアスではありません。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする時代が変化しても検知できなくなります。
更新ポリシー。 ゲートに失敗した場合、定数を確認せずに編集しないでください。2 つのリビジョン間の仕様の変更履歴を読み、サーバーが引き続き動作することを確認してから、定数、このセクション、README.de.md、および
CHANGELOG.md をまとめて更新してください。
modern リビジョンによる次の 4 つの影響が、このサーバーに現れています。
- CORS でルーティングヘッダーを指定します。
Mcp-Method、Mcp-Name、Mcp-Protocol-Versionはすべてのストリーマブル HTTP リクエストに含まれます。また、ブラウザーが送信できるのは、サーバーが許可リストに登録したヘッダーに限られます。server.pyのCORS_ROUTING_HEADERSを参照してください。 - 一覧取得メソッドは鮮度のヒントを返します。
tools/list、resources/list、resources/templates/list、server/discoverは、ttlMs300000 とcacheScopepublicを返します(CACHE_HINTS)。resources/readは意図的にこれを返しません。連邦法を返すため、廃止された法令を 5 分間新鮮なものとして扱ってはならないからです。 - ログ通知はありません。 ロギング機能は
2026-07-28(SEP-2577)時点で非推奨です。v2.0.1 までは、すべてのツールがctx.info()/ctx.error()経由でnotifications/messageを送信していました。handshake 接続ではlogging機能を宣言せずに送信し、modern 接続では非推奨の呼び出しとして SDK に破棄されていました。現在、可観測性は運用担当者が担います(stderr への structlog 出力、オプションの OpenTelemetry)。失敗はツールの結果自体で呼び出し元に伝わります(isError: true、以下を参照)。 serverInfoにパッケージのバージョンが含まれます。2026-07-28では、ID はinitializeで一度だけ送信されるのではなく、すべてのレスポンスの_metaに記録されます。v2.0.1 までは、そのversionは空文字列でした。
ツールの失敗には isError: true が設定されます。 仕様では、実行エラー(Fedlex または LINDAS に到達できない、本文が JSON ではないなど)は JSON-RPC エラーではなく、isError: true を設定したツールの結果として報告されます。2025-11-25 以降、入力スキーマに違反する引数も実行エラーとして扱われるため、モデルは入力を修正できます。SDK はツールの実行前に、エンベロープなしでこれらに応答します。この動作は両方の時代で測定されており、未知のツール名についても同様です。v2.0.1 までは、サーバー独自の失敗は
isError: false として返され、エンベロープ内の match_type: "error" だけが失敗を示していました。エンベロープは引き続き structuredContent として送信されます。「該当なし」
(match_type: "none")は有効な回答であり、エラーとしてフラグ付けされません。登録済みのすべてのツールは、両方の時代で
tests/test_tool_errors.py によりチェックされます。
時間のかかる SPARQL 呼び出しでは進捗が報告されます。 呼び出しには最大 45 秒かかることがあり、その時間のほとんどは試行と試行間のバックオフに費やされます。progressToken を送信するクライアントは、試行ごとに 1 つの notifications/progress を受け取ります。たとえば「Fedlex にリクエスト中(試行 1/3)」、再試行時には「Fedlex:HTTP 503 の後、試行 2/3」のように報告されます。存在しない合計値を作り出すことがないよう、total は含まれません。ストリーマブル HTTP では、2026-07-28 にこのためレスポンスが SSE に切り替わります。トークンがなければ何も送信されません。ロギングとは異なり、サーバーからクライアントへの進捗通知は非推奨ではありません。tests/test_progress.py を参照してください。
両方の時代について、ワイヤー経由のテストを
tests/test_modern_era.py で実施しています。組み立てた ASGI スタックを通したセッションレスの
server/discover と tools/call、および各時代で、ログ通知も SDK の非推奨警告も発生してはならないツール呼び出しをテストします。
テスト
# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls)
pytest tests/ -m "live"
安全性と制限
- **読み取り専用:**すべてのツールは SPARQL SELECT クエリのみを実行します。どちらのエンドポイントでも、データの書き込み、変更、削除は行われません。12 個すべてのツールに
readOnlyHint: true/destructiveHint: false/idempotentHint: trueのアノテーションが付いています。 - **個人データなし:**Fedlex には公開法令、公報、協議に関するメタデータが含まれ、TERMDAT には公式用語が含まれています。このサーバーでは、個人を特定できる情報(PII)を処理も保存もしません。
- **レート制限:**Fedlex と LINDAS の SPARQL エンドポイントは、文書化されたレート制限のない公開サービスです。
limitパラメーターは控えめに使用してください(デフォルトは 20、最大 100)。サーバーはエンドポイントごとにリクエストのタイムアウトを 45 秒に設定し、一時的な障害に限り再試行します。 - **エンドポイントの分離:**Fedlex と LINDAS は別々のクライアントとタイムアウトを使用するため、LINDAS が停止しても
fedlex_*ツールには影響しません。 - **データの鮮度:**結果にはクエリ実行時点のエンドポイントの状態が反映されます。このサーバーはキャッシュを行いません。
- **利用規約:**データには fedlex.admin.ch の再利用条件が適用されます。商用・その他の目的で無料で再利用できます。
- **保証なし:**このサーバーはコミュニティプロジェクトであり、スイス連邦首相府とは提携していません。利用可能かどうかは、上流の SPARQL エンドポイントに依存します。
変更履歴
CHANGELOG.md を参照してください。
コントリビューション
CONTRIBUTING.md を参照してください。
セキュリティ
セキュリティ対策、強化制御、脆弱性の報告方法については、SECURITY.md を参照してください。
ライセンス
MIT License — LICENSE を参照してください。
作者
Hayal Oezkan . malkreide
クレジットと関連プロジェクト
- Fedlex:fedlex.admin.ch — スイス連邦首相府
- TERMDAT / LINDAS:lindas.admin.ch — スイス行政機関のリンクトデータサービス
- プロトコル:Model Context Protocol — Anthropic / Linux Foundation
- 関連:parlament-mcp — スイス連邦議会(議会審議段階)
- 関連:swiss-democracy-mcp — スイス連邦の国民投票(国民投票段階)
- 関連:swiss-cultural-heritage-mcp — スイスの文化遺産データ
- 関連:zurich-opendata-mcp — チューリッヒ市のオープンデータ
- 関連:swiss-transport-mcp — スイスの公共交通機関
- ポートフォリオ:Swiss Public Data MCP Portfolio
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。