mcpField
S
swiss-statistics-mcp

swiss-statistics-mcp

ローカル
github.com法務・行政22 週間前に更新

swiss-statistics-mcp について

swiss-statistics-mcpは、BFS STAT-TAB PxWeb APIを通じて、研究者や公共データ分析者にスイスの公式統計を提供します。カタログ検索、条件付きデータ取得、州間比較に加え、旧市町村、建設、価格指数の照会に対応し、APIキーは不要です。

主な機能

  1. 0121テーマの統計カタログ検索
  2. 02表の絞り込みと統計データ取得
  3. 03州をまたいだデータ比較
  4. 04市町村情報と歴史系列の照会
  5. 05建設・価格指数データの取得

活用シーン

  1. 01州別の人口や社会指標の比較
  2. 02教育統計の検索と指定データの取得
  3. 03市町村合併前後の統計値の対応付け
  4. 04建設活動・投資・価格指数の照会

MCP 対応

MCP サーバーとして、カタログ参照、データ取得、州間比較などのツールを通じて、BFS STAT-TABおよび関連する公開統計を提供します。認証不要で、stdioとStreamable HTTPに対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"malkreide-swiss-statistics": {
"command": "uvx",
"args": [
"swiss-statistics-mcp"
]
}
}
}
起動コマンドuvx swiss-statistics-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiswiss-statistics-mcp0.8.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

🇨🇭 スイス公共データ MCP ポートフォリオの一部です

📊 swiss-statistics-mcp

Version License: MIT Python 3.11+ MCP No Auth Required CI

STAT-TAB PxWeb API を介してスイス連邦統計局(BFS)のデータを利用する MCP サーバー — 21 のテーマにわたる 682 のデータセットを、認証なしで利用できます

🇩🇪 ドイツ語版


デモ

デモ:Claude が bfs_education_stats を使用


成熟度

このサーバーは、PyPI classifierに基づくと**アルファ版(0.x)**です。1.0 になるまでは、次の点にご注意ください。

  • ツール名、入力スキーマ、出力 JSON キーは、マイナーバージョン間で変更される可能性があります
  • クラウド環境にデプロイする場合は、main ではなく特定の git タグに固定してください
  • 読み取り専用のオープンデータ用途では本番環境で使用できますが、ユーザー向けの用途では実験的なものとして扱ってください

破壊的変更については、CHANGELOG.mdをご覧ください。


概要

swiss-statistics-mcp は、認証なしで STAT-TAB PxWeb API を介してスイス連邦統計局(BFS)に AI ネイティブにアクセスできるようにします。

項目詳細
APISTAT-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 つの対策を検討してください。

  1. アクセス制御の背後に配置する — Render の「Private Service」、Cloudflare Access、またはコンテナーの前段に Basic-Auth や IP 許可リストを設定したリバースプロキシを配置します。
  2. 公開オープンデータプロキシとして運用する — すべてのデータが BFS OGD(Public Open Data)であり、ツールが読み取り専用であるため、この場合に限り許容できます。

サーバーはデフォルトで 127.0.0.1 にバインドします。コンテナーポートで公開するには、MCP_HOST=0.0.0.0 を明示的に設定する(Render の環境変数として設定するなど)か、--host 0.0.0.0 を渡す必要があります。上記の対策を講じずに設定しないでください。

Render.com:

  1. リポジトリを GitHub にプッシュするか、フォークします
  2. render.com で「New Web Service」を選択し、GitHub リポジトリに接続します
  3. 環境変数を設定します:MCP_HOST=0.0.0.0
  4. 起動コマンドを設定します:python -m swiss_statistics_mcp.server --http --port 8000
  5. 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_catalogBrowseCatalogResult
bfs_search_tablesSearchTablesResult
bfs_get_table_metadataTableMetadataResult
bfs_get_dataDataTableResult
bfs_education_statsDataTableResult
bfs_populationDataTableResult
bfs_compare_cantonsDataTableResult
bfs_featured_datasetsFeaturedDatasetsResult
lookup_communeLookupCommuneResult
resolve_historical_communeResolveHistoricalCommuneResult
list_communesListCommunesResult
search_historical_seriesSearchHistoricalSeriesResult
bfs_construction_activityConstructionActivityResult
bfs_construction_investmentConstructionInvestmentResult
bfs_price_indexPriceIndexResult

参照レイヤーの結果には、追加で 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_seriesHistorical 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大地域/カントン/自治体別の建築投資額とArbeitsvorrat1994–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 にあります。

指数ソース返されるデータ
baupreisindexopendata.swiss のデータセット Schweizerischer Baupreisindex (Multibasen) → DAM XLSX アセット全国の半期ごとの指数系列(Schweiz, Baugewerbe Total)。基準期間を含みます
impiopendata.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-TABPxWeb REST API682 の表、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/PDFBaupreisindex、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 文字の相関 ID
  • params_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-282026-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


クレジットと関連プロジェクト

インストール

uv の uvx を使って実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json 内でトップレベルの servers キーを使用します)。

{
  "mcpServers": {
    "swiss-statistics-mcp": {
      "command": "uvx",
      "args": [
        "swiss-statistics-mcp"
      ]
    }
  }
}

コメント

MCP は初めてですか?

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

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