swiss-statistics-mcp について
swiss-statistics-mcpは、BFS STAT-TAB PxWeb APIを通じて、研究者や公共データ分析者にスイスの公式統計を提供します。カタログ検索、条件付きデータ取得、州間比較に加え、旧市町村、建設、価格指数の照会に対応し、APIキーは不要です。
主な機能
- 0121テーマの統計カタログ検索
- 02表の絞り込みと統計データ取得
- 03州をまたいだデータ比較
- 04市町村情報と歴史系列の照会
- 05建設・価格指数データの取得
活用シーン
- 01州別の人口や社会指標の比較
- 02教育統計の検索と指定データの取得
- 03市町村合併前後の統計値の対応付け
- 04建設活動・投資・価格指数の照会
MCP 対応
MCP サーバーとして、カタログ参照、データ取得、州間比較などのツールを通じて、BFS STAT-TABおよび関連する公開統計を提供します。認証不要で、stdioとStreamable HTTPに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
📊 swiss-statistics-mcp
STAT-TAB PxWeb API を介してスイス連邦統計局(BFS)のデータを利用する MCP サーバー — 21 のテーマにわたる 682 のデータセットを、認証なしで利用できます
デモ
成熟度
このサーバーは、PyPI classifierに基づくと**アルファ版(0.x)**です。1.0 になるまでは、次の点にご注意ください。
- ツール名、入力スキーマ、出力 JSON キーは、マイナーバージョン間で変更される可能性があります
- クラウド環境にデプロイする場合は、
mainではなく特定の git タグに固定してください - 読み取り専用のオープンデータ用途では本番環境で使用できますが、ユーザー向けの用途では実験的なものとして扱ってください
破壊的変更については、CHANGELOG.mdをご覧ください。
概要
swiss-statistics-mcp は、認証なしで STAT-TAB PxWeb API を介してスイス連邦統計局(BFS)に AI ネイティブにアクセスできるようにします。
| 項目 | 詳細 |
|---|---|
| API | STAT-TAB PxWeb API v1 |
| エンドポイント | https://www.pxweb.bfs.admin.ch/api/v1/ |
| 提供元 | スイス連邦統計局(BFS) |
| データセット | 21 のテーマ分野にわたる 682 の表 |
| 言語 | ドイツ語(de)、フランス語(fr)、イタリア語(it)、英語(en) |
| ライセンス | オープンガバメントデータ(OGD) — BFS の利用規約 |
| 認証 | 不要 — 完全に公開されています |
デモで使う質問: 「2024 年にチューリッヒ州の前期中等教育学校に通った生徒数は?」 — BFS の実データを使用し、ハルシネーションはありません。
特長
- 📊 15 個のツール:21 の統計テーマ(682 のデータセット)に対応する 8 個 + 基礎自治体/歴史データの参照レイヤー用 4 個 + 建設/不動産用 2 個 + 価格指数用 1 個
- 🔍 BFS のデータカタログ全体を対象とした全文検索
- 🎓 教育統計と人口データ向けの便利なツール
- 🏗️ 建設統計 — Arbeitsvorrat の先行指標を含む、新築建物/住宅と建築投資
- 🏠 価格指数 — BFS の DAM/CKAN ソースを介した建設価格指数(Baupreisindex、解析済み系列)と住宅価格指数(IMPI)
- 🏔️ 任意の表と変数を対象とした州間比較
- 🔓 API キー不要 — すべてのデータがオープンライセンスの下で提供されています
- ☁️ 2 種類のトランスポート — stdio(Claude Desktop)+ Streamable HTTP(クラウド)
前提条件
- Python 3.11+
- uv(推奨)または pip
インストール
# Clone the repository
git clone https://github.com/malkreide/swiss-statistics-mcp.git
cd swiss-statistics-mcp
# Install
pip install -e .
# or with uv:
uv pip install -e .
または uvx を使う方法(恒久的なインストールは不要):
uvx swiss-statistics-mcp
クイックスタート
# stdio (for Claude Desktop)
python -m swiss_statistics_mcp.server
# Streamable HTTP, loopback only (default: host=127.0.0.1, port=8000)
python -m swiss_statistics_mcp.server --http --port 8000
# Streamable HTTP, all interfaces (only behind a reverse proxy with access control)
MCP_HOST=0.0.0.0 python -m swiss_statistics_mcp.server --http --port 8000
# or
python -m swiss_statistics_mcp.server --http --host 0.0.0.0 --port 8000
Claude Desktop ですぐに試してみましょう:
「2023 年にチューリッヒ州で働いていた教師の人数は?」 「ベルン州の人口を年齢別に教えてください」 「2022 年の全州における社会扶助率を比較してください」
設定
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します。
{
"mcpServers": {
"swiss-statistics": {
"command": "python",
"args": ["-m", "swiss_statistics_mcp.server"]
}
}
}
または uvx を使う方法:
{
"mcpServers": {
"swiss-statistics": {
"command": "uvx",
"args": ["swiss-statistics-mcp"]
}
}
}
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Cursor / Windsurf / VS Code + Continue
設定構文は Claude Desktop と同一です。ファイル名はクライアントによって異なります。
- Cursor: プロジェクトフォルダー内の
.cursor/mcp.json、またはグローバル設定の~/.cursor/mcp.json - Windsurf:
~/.codeium/windsurf/mcp_config.json - VS Code + Continue:
.continue/config.json
クラウドへのデプロイ(ブラウザーアクセス用の SSE)
ブラウザー版の claude.ai 経由で使用する場合(ローカルソフトウェアを利用できない管理対象ワークステーションなど)。
⚠️ セキュリティに関する注意 — このサーバーには認証機能がありません。 公開 URL にすると、デプロイ先の IP アドレスを使って BFS API にアクセスするオープンプロキシになります。URL を知っているクライアントは誰でもツールを操作し、プラットフォームの利用枠を消費し、トラフィックをあなたの IP アドレスに帰属させることができます。次の順に、2 つの対策を検討してください。
- アクセス制御の背後に配置する — Render の「Private Service」、Cloudflare Access、またはコンテナーの前段に Basic-Auth や IP 許可リストを設定したリバースプロキシを配置します。
- 公開オープンデータプロキシとして運用する — すべてのデータが BFS OGD(Public Open Data)であり、ツールが読み取り専用であるため、この場合に限り許容できます。
サーバーはデフォルトで
127.0.0.1にバインドします。コンテナーポートで公開するには、MCP_HOST=0.0.0.0を明示的に設定する(Render の環境変数として設定するなど)か、--host 0.0.0.0を渡す必要があります。上記の対策を講じずに設定しないでください。
Render.com:
- リポジトリを GitHub にプッシュするか、フォークします
- render.com で「New Web Service」を選択し、GitHub リポジトリに接続します
- 環境変数を設定します:
MCP_HOST=0.0.0.0 - 起動コマンドを設定します:
python -m swiss_statistics_mcp.server --http --port 8000 - claude.ai の「Settings」→「MCP Servers」で、
https://your-app.onrender.com/sseを追加します
💡 「開発者のノート PC には stdio、ブラウザーには SSE。」
出力スキーマ
v0.2.0 以降、すべてのツールは JSON 文字列ではなく、型付き Pydantic モデルを返します。FastMCP はこれらを構造化コンテンツとしてシリアライズするため、MCP クライアントはフィールドを直接読み取れます。
# Old (pre-0.2.0)
result = await bfs_get_data(...) # str
data = json.loads(result) # dict
print(data["rows_total"])
# New (>= 0.2.0)
result = await bfs_get_data(...) # DataTableResult
print(result.rows_total) # 1000
print(result.truncated) # True
すべての結果には、トップレベルに error: str | None と hint: str | None が含まれます。result.error is None は成功を意味します。データを返すツール(bfs_get_data、bfs_education_stats、bfs_population、bfs_compare_cantons)には、機械的に上限到達を検出できるよう、truncated: bool、rows_total: int、rows_returned: int も含まれます。
| ツール | 結果の型 |
|---|---|
bfs_browse_catalog | BrowseCatalogResult |
bfs_search_tables | SearchTablesResult |
bfs_get_table_metadata | TableMetadataResult |
bfs_get_data | DataTableResult |
bfs_education_stats | DataTableResult |
bfs_population | DataTableResult |
bfs_compare_cantons | DataTableResult |
bfs_featured_datasets | FeaturedDatasetsResult |
lookup_commune | LookupCommuneResult |
resolve_historical_commune | ResolveHistoricalCommuneResult |
list_communes | ListCommunesResult |
search_historical_series | SearchHistoricalSeriesResult |
bfs_construction_activity | ConstructionActivityResult |
bfs_construction_investment | ConstructionInvestmentResult |
bfs_price_index | PriceIndexResult |
参照レイヤーの結果には、追加で source(出典表記)と provenance(live_api | cached)が含まれます。また、SearchHistoricalSeriesResult には、必須の HSSO 非商用利用に関する注意書きを含む licence_note も含まれます。建設関連および価格指数の結果にも、同じエンベロープ形式で source と provenance が含まれます。
利用可能なツール
| ツール | 説明 |
|---|---|
bfs_featured_datasets | 特に関連性の高いデータセットを厳選した一覧(教育と人口統計を重視) |
bfs_browse_catalog | カタログを閲覧します。全21テーマ(theme_code なし)、またはテーマ内の全テーブル(例:theme_code="15" = 教育・科学) |
bfs_search_tables | データカタログ全体(682データセット)を全文検索します |
bfs_get_table_metadata | 特定のテーブルの変数、値、メタデータ |
bfs_get_data | 寸法と値による任意のフィルターを使ったデータ取得 |
bfs_education_stats | 便利なツール:教師、生徒、人口統計シナリオ、奨学金 |
bfs_population | カントン、年、年齢構成、性別ごとの常住人口 |
bfs_compare_cantons | 任意のテーブルと変数についてカントン間で比較します |
lookup_commune | 指定日現在の自治体を名前またはBFS番号で特定します(カントン、有効期間、LINDAS URI) |
resolve_historical_commune | 過去のBFS番号を現在の番号に対応付けます(自治体合併をまたいで古い統計のキーを付け替えます) |
list_communes | 指定日現在のカントンの全自治体を一覧表示します |
search_historical_series | Historical Statistics of Switzerland(HSSO)の長期時系列を検索します |
bfs_construction_activity | 自治体別の新築建物・住宅(年次)、住宅の部屋数構成を含む |
bfs_construction_investment | 地域/カントン/自治体別の建築投資額とArbeitsvorrat(先行指標) |
bfs_price_index | 建設価格指数(Baupreisindex、解析済み系列)/住宅不動産価格指数(IMPI、出典リンク) |
これらのツールのうち4つは、ポートフォリオの参照レイヤーを構成します(結合キーを参照)。公式のBFS自治体番号を信頼できる結合キーに変換し、自治体合併より前の統計のキーを付け替えられます。2つのbfs_construction_*ツールはSTAT-TABのテーマ09(Bau- und Wohnungswesen)を対象としています(建設関連の出典を参照)。bfs_price_indexはSTAT-TABに含まれない価格指数を対象としています(価格指数の出典を参照)。
建設関連の出典
| キューブID | タイトル | 対象期間 | 使用ツール |
|---|---|---|---|
px-x-0904030000_106 | 自治体別、建物タイプ別の新築住宅付き建物 | 2013– | bfs_construction_activity |
px-x-0904030000_105 | 自治体別、部屋数別の新築住宅 | 2013– | bfs_construction_activity |
px-x-0904010000_205 | 大地域/カントン/自治体別の建築投資額とArbeitsvorrat | 1994– | bfs_construction_investment |
2013年以前の自治体レベルの建物系列は、廃止されたキューブ
px-x-0904030000_101/_104(1995–2012)にあり、異なる地理コードを使用しているため、これらのツールでは照会されません。建物・住宅の数値は公式の年次確定統計です。最新の登録状況や建設パイプラインについては、swiss-housing-mcpと照合してください(意図的な冗長性)。
価格指数のデータソース
bfs_price_index は、STAT-TAB 経由では公開されていない 2 つの指数に対応しています。データセットは opendata.swiss(CKAN)にあり、データファイル自体は BFS DAM assets にあります。
| 指数 | ソース | 返されるデータ |
|---|---|---|
baupreisindex | opendata.swiss のデータセット Schweizerischer Baupreisindex (Multibasen) → DAM XLSX アセット | 全国の半期ごとの指数系列(Schweiz, Baugewerbe Total)。基準期間を含みます |
impi | opendata.swiss のデータセット Schweizerischer Wohnimmobilienpreisindex (IMPI) → DAM PDF/HTML アセット | 公式ソースへのリンクのみ。BFS は機械可読な IMPI 系列を公開していません |
2 つの特記事項には、こちらで対処しています。
ckan.opendata.swissはデフォルトの User-Agent に HTTP 403 を返すため、すべての呼び出しで独自のswiss-statistics-mcp/<version>User-Agent を送信します。また、DAM アセットは形式が混在しているため、レスポンスのcontent-typeを確認して XLSX を選択し(PDF は除外します)、結果は 24 時間キャッシュされます。
使用例
| クエリ | ツール |
|---|---|
| 「2023 年にチューリッヒで働いていた教師は何人ですか?」 | bfs_education_stats |
| 「後期中等教育の在籍者数は 2031 年までどのように推移しますか?」 | bfs_education_stats |
| 「年齢別のチューリッヒ州の人口は何人ですか?」 | bfs_population |
| 「すべての州の社会扶助率を比較してください」 | bfs_compare_cantons |
| 「学校の建物に関するデータはありますか?」 | bfs_search_tables |
| 「2000 年以降に合併したチューリッヒの自治体と、過去の統計を現在のどの BFS 番号に対応させればよいかを教えてください」 | resolve_historical_commune |
| 「現在のグラールス州のすべての自治体を一覧表示してください」 | list_communes |
| 「HSSO の人口に関する長期系列を検索してください」 | search_historical_series |
| 「2018 年以降、ヴィンタートゥールで部屋数別に何戸の新築住宅が建てられましたか?」 | bfs_construction_activity |
| 「チューリッヒ州の建築投資額と Arbeitsvorrat はいくらですか?」 | bfs_construction_investment |
| 「建設価格指数は 2015 年以降どのように推移しましたか?」 | bfs_price_index |
テーマ
| コード | テーマ | コード | テーマ |
|---|---|---|---|
| 01 | 人口 | 12 | 貨幣、銀行、保険 |
| 02 | 地域と環境 | 13 | 社会保障 |
| 03 | 労働と所得 | 14 | 健康 |
| 04 | 国民経済 | 15 | 教育と科学 |
| 05 | 価格 | 16 | 文化、メディア、情報社会 |
| 06 | 産業とサービス | 17 | 政治 |
| 07 | 農業と林業 | 18 | 一般政府 |
| 08 | エネルギー | 19 | 犯罪と刑事司法 |
| 09 | 建設と住宅 | 20 | 経済・社会状況 |
| 10 | 観光 | 21 | 持続可能な開発 |
| 11 | モビリティと交通 |
アーキテクチャ
┌─────────────────┐ ┌──────────────────────────────┐ ┌──────────────────────────┐
│ Claude / AI │────▶│ Swiss Statistics MCP │────▶│ BFS STAT-TAB │
│ (MCP Host) │◀────│ (MCP Server) │◀────│ PxWeb API v1 │
└─────────────────┘ │ │ └──────────────────────────┘
│ 15 Tools │
│ + commune/historical ref │
│ + construction (theme 09) │
│ + price indices (DAM/CKAN) │
│ Stdio | Streamable HTTP │
│ │
│ No authentication required │
└──────────────────────────────┘
データソースの特性
| ソース | プロトコル | 対象範囲 | 認証 | ライセンス |
|---|---|---|---|---|
| BFS STAT-TAB | PxWeb REST API | 682 の表、21 のテーマ | なし | OGD |
| BFS AGVCH(自治体登録簿) | REST(CSV/XLSX) | スナップショット、変更、対応表 | なし | OGD |
| HSSO(歴史統計) | 静的 XLSX ダンプ | 約 750 の長期統計表 | なし | CC BY-NC-SA 3.0 |
| BFS DAM + opendata.swiss(CKAN) | CKAN メタデータ + DAM XLSX/PDF | Baupreisindex、IMPI | なし(独自の UA が必要) | OGD |
アーキテクチャの決定
- AGVCH の自治体登録簿 → アーキテクチャ A(ライブ API のみ)。 公式 REST サービス(
snapshot/correspondances/mutations/levels)は、認証不要でバージョン管理されたシンプルな API です。2026-07-19 にライブで動作することを確認済みです。そのため、自治体ツールは共有のリトライポリシーと 24 時間のインメモリキャッシュを使用して、API に直接クエリします。ダンプへのフォールバックは不要です。確認事項: ライブスナップショット CSV のヘッダーはInscription,Radiation,Rec_Type_frです(API PDF に記載されたEinschreibung,Streichungではありません)。また、HistoricalCodeはレベル間で一意ではありません。自治体のカントンを特定する際、Parentリンクは階層によって区別されます。 - HSSO → アーキテクチャ C(ダンプのみ)。 HSSO には API がなく、安定した URL(
/get/{CHAPTER}.{NN}{suffix}.xlsx)でテーブルごとの静的な XLSX ファイルのみを提供しています。search_historical_seriesは章ページからタイトルのインデックスを構築してキャッシュし、安定したダウンロード URL を返します。HSSO のライセンスは CC BY-NC-SA 3.0(非営利) です。このサーバーの OGD 基準とは異なるため、HSSO の応答にはすべてlicence_noteに非営利利用に関する明示的な注意書きが含まれます。
結合キー
参照レイヤーは、Swiss Public Data MCP Portfolio 内の異なるサーバーのデータを確実に結合できるようにするものです。ポートフォリオ全体で使用するキーは、次の 3 つの識別子です。
| キー | 識別対象 | 正規形式 | 備考 |
|---|---|---|---|
BFS commune number(BfsCode) | 政治自治体 | 整数。例:261(チューリッヒ) | 統計、地理、教育、医療データを結合するための主要キーです。安定した LINDAS/Linked-Data URI:https://ld.admin.ch/municipality/{BfsCode}。時間の経過とともに変化します。合併により新しい番号が付与されるため、過去のデータは resolve_historical_commune を使ってキーを付け替える必要があります。 |
| EGID | 個々の建物(Eidg. Gebäudeidentifikator) | 9 桁の整数 | 建物/住戸レベルのデータ(GWR、エネルギー、住所)の結合キーです。1 つの自治体には多数の EGID が含まれます。BfsCode は各 EGID が属する自治体です。 |
| カントン略称 | カントン | 2 文字。例:ZH | 最も大まかな地理キーです。Parent チェーンをたどることで、どの自治体からも導出できます(canton_abbr として公開)。 |
キーの付け替えが重要な理由。 BFS の自治体番号は、自治体の合併、分割、またはカントン間の移動があるたびに変わります。合併前に公開された統計では旧番号が使われているため、キーを付け替えずに現在のデータと結合すると、行がひそかに除外されたり、誤って割り当てられたりします。resolve_historical_commune(bfs_number, from_date, to_date) は、古い数値を集約すべき現在の番号のセット resolves_to と、合併や名称変更およびその日付を含む mutation_path を返します。ポートフォリオ内の他のサーバーも、この契約を概念的に反映することを想定しています。これにより、同じキーがどこでも同じように解決されます。
例(基準クエリ)。 「2000 年以降に合併したチューリッヒの自治体はどれですか?」 — たとえば、旧 132 Hirzel と 133 Horgen はどちらも現在の 295 Horgen に付け替えられます。また、134/140/142 は 293 Wädenswil に付け替えられます。
プロジェクト構成
swiss-statistics-mcp/
├── src/swiss_statistics_mcp/
│ ├── __init__.py # Package
│ └── server.py # 15 tools
├── tests/
│ └── test_server.py # Unit + integration tests (mocked HTTP)
├── .github/workflows/ci.yml # GitHub Actions (Python 3.11/3.12/3.13)
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md # English
├── CONTRIBUTING.de.md # German version
├── SECURITY.md # English
├── SECURITY.de.md # German version
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German version
可観測性
サーバーは、stderr にツール呼び出しごとに JSON ログ行を 1 行出力します。
{"ts": "2026-05-20T04:02:28", "level": "INFO", "logger": "swiss_statistics_mcp",
"event": "tool_start", "tool": "bfs_browse_catalog", "rid": "1091cb73", "params_keys": ["theme_code", "lang", "limit"]}
{"ts": "2026-05-20T04:02:28", "level": "INFO", "logger": "swiss_statistics_mcp",
"event": "tool_end", "tool": "bfs_browse_catalog", "rid": "1091cb73", "status": "ok", "duration_ms": 303}
rid— 同じ呼び出しのtool_startとtool_endを関連付ける 8 文字の相関 IDparams_keys— 入力フィールド名のソート済みリスト(値や個人を特定できる情報は含みません)duration_ms—tool_endイベントに記録される呼び出しごとのレイテンシstatus—"ok"または"error"。ツールで例外が発生した場合はerror_typeが追加されます
Render などのクラウドプラットフォームでは、これらを直接インデックス化して、ツールごとのレイテンシダッシュボードやエラー率アラートに利用できます。詳細な出力を有効にするには MCP_LOG_LEVEL=DEBUG を設定し、呼び出しごとのイベントを抑制するには WARNING を設定します。
ℹ️ ログは stderr に出力されるため、stdio トランスポート上の MCP プロトコル(stdout を使用)と衝突することはありません。
レジリエンス
サーバーは、一時的な BFS-API の不調が LLM に届く前に吸収します。
- リトライ —
5xx、429、ネットワークエラーは、指数バックオフ(0.5s → 4s)を使って最大 3 回リトライします。4xxエラーはすぐに表面化するため、クライアントの不具合が隠されません。MCP_RETRY_MAX_ATTEMPTS、MCP_RETRY_WAIT_INITIAL、MCP_RETRY_WAIT_MAX環境変数で調整できます。 - メタデータキャッシュ — テーブルのメタデータ(変数、値のドメイン、最終更新日時)は、
(table_id, lang)ごとにメモリ内に 1 時間キャッシュされます。初回の一覧表示/詳細表示の処理でキャッシュがウォームアップされ、その後の呼び出しは即座に返されます。 - 並行処理の上限 —
bfs_browse_catalog(テーマモード)でのメタデータ取得のファンアウトは、FANOUT_CONCURRENCY = 5によって並列数が制限されます。limit=20の場合、上流 API に過剰な負荷をかけずに、所要時間を逐次処理時の約 20s から約 4s に短縮できます。
既知の制限事項
- PxWeb API: クエリを短時間に連続して実行すると、レート制限が適用される場合があります。サーバーはカタログインデックスを 1 時間、テーブルメタデータを 1 時間キャッシュします
- 言語: データセットのタイトルとディメンション値はデフォルトでドイツ語です。フランス語、イタリア語、英語への対応状況はテーブルによって異なります
- JSON-STAT2: 複雑なクロス集計の一部では、大きな結果セットが返されることがあります。ディメンションフィルターを使ってクエリを絞り込んでください
- コミューン登録簿(AGVCH): ライブスナップショット CSV のヘッダーには
Inscription/Radiation/Rec_Type_frが使われます(API PDF に記載のEinschreibung/Streichungという名前ではありません)。HistoricalCodeは階層をまたいで一意ではないため、Parentチェーンを 1 階層ずつたどって州を特定します。スナップショット/変更は 24 時間キャッシュされます。 - HSSO: ライセンスは CC BY-NC-SA 3.0(非営利) です。帰属表示が必要で、商用利用は禁止されています。すべてのレスポンスには
licence_noteにこの情報が含まれます。HSSO にはテーブルごとの期間フィルターがないため、search_historical_seriesのperiod引数は参考情報にすぎません。実際の期間は XLSX で確認してください。search_historical_seriesが返すのは安定した XLSX ダウンロード URL であり、解析済みの系列値ではありません。 - PxWeb のコミューンコードはキューブ間で一貫していません。
px-x-0904030000_106/_107では値コードがゼロ埋めされた BFS 番号(0261)そのものですが、px-x-0904030000_105では連番の不透明な ID(160)であり、BFS 番号はラベル(......0261 Zürich)にのみ含まれます。bfs_construction_activityはコードを推測せず、ラベル内の BFS 番号を照合して、各キューブをそれぞれのライブディメンション値に対応付けます。 - 建設データの対象範囲: 現在の Gemeinde レベルの建物系列は 2013 年に始まるため、
bfs_construction_activityではsince_year >= 2013が受け付けられます。値は統合された公式年次統計です。建物投資額(bfs_construction_investment)の単位は 1000 CHF です。Arbeitsvorratは翌年の建築ボリュームを示す(金額ベースの先行指標です)。 - 価格指数(
bfs_price_index): IMPI(住宅用不動産価格指数)は BFS によって PDF/HTML 形式のみで公開されており、機械可読な系列はありません。そのため、index="impi"は値ではなく、公式ソースへのリンクと明示的な制限事項を返します。Baupreisindex XLSX は、全国の半年ごとの系列(Schweiz、Baugewerbe Total)に解析されます。地域別/対象物件種別の内訳はソース XLSX にありますが、返されません。DAM アセット ID は再公開のたびに変わるため、CKAN メタデータからライブで解決され、ハードコードされません。上流の XLSX 構造が変わった場合、ツールは誤った値を返さず、明確なエラーを返します。
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 の更新でどちらかが知らないうちに変わることはありません。同じファイルでは、実際の接続からネゴシエートされたリビジョンも読み取ります。また、tests/test_modern_wire.pyでは、HTTP 経由で streamable_http_app() の ASGI アプリを実行し、server/discover、serverInfo のスタンプ、2026-07-28 で必須となる resultType、SEP-2549 の鮮度ヒント、不完全なエンベロープに対する名前付きの拒否を検証します。
どちらの形式も残します。測定した接続から分かるのは、今日ネゴシエートされたリビジョンです。SDK の更新で上限が変われば、新しい値がそのまま測定されます。これを検出できるのは定数の固定だけです。両者が検証する内容は異なり、互いに置き換えることはできません。
サーバーの識別情報
モダン世代では、接続ごとに一度だけではなく、すべての結果の _meta に serverInfo がスタンプされ、SDK による補完はありません。SDK は「バージョンが指定されていないサーバーは空の version を報告する」としています。そのため、このサーバーでは構築時に title、version、description、website_url を宣言し、すべての応答に server.jsonで公開されているものと同じ識別情報を含めています。
version、description、website_url はリテラルとして書き込まず、パッケージメタデータから読み取ります。ここにリテラルを置くと、pyproject.toml と server.json に加えて 3 つ目のコピーになり、しかもどこにも表示されず、誰も最新の状態に保たない唯一のコピーになります。title はリテラルのままにします。表示名はパッケージメタデータではないためです。
icons は意図的に未設定にしています。このリポジトリにはアイコンのアセットがなく、実体のない URL を作るより、フィールドを省略するほうが適切だからです。同じ理由で、空のフィールドよりフィールドがないほうが適切です。website_url は URL 検証のない str | None であり、スタンプは exclude_none を指定してダンプされます。そのため、None はフィールドを省略しますが、"" はすべての呼び出し元に "websiteUrl": "" を送信します。
SDK の LATEST_PROTOCOL_VERSION は、ハンドシェイク世代ではなくモダン世代の別名である点に注意してください。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする世代が変わっても検出できません。
更新ポリシー。 ゲートの検証に失敗した場合、定数を安易に編集しないでください。2 つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正常に動作することを確認してから、定数、このセクション、README.de.md、CHANGELOG.mdをまとめて更新してください。
テスト
# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls)
pytest tests/ -m "live"
安全性と制限
- 読み取り専用: すべてのツールは HTTP GET リクエストのみを実行し、データを書き込んだり、変更したり、削除したりすることはありません。
- 個人データなし: STAT-TAB は集計済み統計データセットを返します。このサーバーが個人を特定できる情報(PII)を処理または保存することはありません。
- レート制限: PxWeb API は、レート制限が文書化されていない公開エンドポイントです。全 682 テーブルのカタログに対して短い間隔で繰り返しリクエストを送らないでください。サーバーはリクエストごとに 30 秒のタイムアウトを設定し、カタログのインデックスを 1 時間キャッシュします。
- データの更新頻度: BFS は定期的に統計値を更新しており、リアルタイムではありません。統計値は、クエリ時点での上流データベースの状態を反映しています。
- 利用規約: データは BFS 利用規約(OGD) の対象です。STAT-TAB のデータはすべてオープンガバメントデータとして公開されており、出典を明記すれば自由に利用できます。
- 保証なし: このサーバーはコミュニティプロジェクトであり、スイス連邦統計局とは関係ありません。利用可能かどうかは、上流の BFS API に依存します。
変更履歴
CHANGELOG.md を参照してください。
貢献
CONTRIBUTING.md を参照してください。
セキュリティ
読み取り専用で、PII を扱わず、認証も不要な、固定の BFS エンドポイントを 1 つだけ使用します。セキュリティ対策の全容と、受け入れているリスクに関する判断については、 SECURITY.md を参照してください。
ライセンス
MIT ライセンス — LICENSE を参照してください。
作者
Hayal Oezkan · malkreide
クレジットと関連プロジェクト
- BFS: www.bfs.admin.ch — スイス連邦統計局
- STAT-TAB: www.pxweb.bfs.admin.ch — PxWeb データベースインターフェース
- プロトコル: Model Context Protocol — Anthropic / Linux Foundation
- 関連: swiss-cultural-heritage-mcp — SIK-ISEA、国立博物館、国立図書館
- 関連: fedlex-mcp — Fedlex SPARQL を介したスイス連邦法
- 関連: zurich-opendata-mcp — CKAN、天気、大気質、チューリッヒ市
- 関連: swiss-transport-mcp — OJP 経路検索、SIRI-SX 運行障害情報
- 関連: global-education-mcp — UNESCO UIS および OECD Education at a Glance
- ポートフォリオ: Swiss Public Data MCP Portfolio
インストール
uv の uvx を使って実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json 内でトップレベルの servers キーを使用します)。
{
"mcpServers": {
"swiss-statistics-mcp": {
"command": "uvx",
"args": [
"swiss-statistics-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。