bag-health-mcp について
bag-health-mcpは、スイスの感染症サーベイランスと公衆衛生指標を調べるMCPサーバーです。分析担当者や行政機関向けに、BAG、Obsan、Versorgungsatlas、Sucht Schweizの集計データを読み取り専用で提供します。
主な機能
- 01感染症のトピックと系列を一覧
- 02疾病の時系列データを取得
- 03州別の状況を確認
- 04複数ソースの健康指標を検索
- 05CSVまたはJSONの生データを取得
活用シーン
- 01州ごとのインフルエンザ動向を追跡
- 02スイスの麻疹発生状況を確認
- 03州別の医療供給指標を比較
- 04全国の青少年健康調査の推移を確認
MCP 対応
ライブデータ照会ツール、静的な参照リソース、再利用可能なプロンプトをMCPクライアントに公開します。ツールは公開データソースを読み取ります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
10掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| params | any | はい |
詳細
bag-health-mcp
Swiss Public Data MCP Portfolio の一部です。AI モデルをスイスの公共データソースに接続します。
スイスの公衆衛生データを扱う MCP サーバーです。中核となるのは、スイス連邦公衆衛生局(BAG)の 感染症ダッシュボード(IDD) です。インフルエンザ、COVID-19、麻疹、下水サーベイランスなど、51 種類の病原体を対象とする疫学的監視を提供します。さらに、スイス保健観測所(Obsan)、Versorgungsatlas(医療供給アトラス。州別時系列データを含む)、Sucht Schweiz(HBSC 青少年調査)の複数の情報源を統合した健康指標レイヤーを追加しています。すべて読み取り専用の公開オープンガバメントデータです。
できること
"Wie ist die aktuelle Grippesituation im Kanton Zürich verglichen mit den letzten Wochen?"
→ bag_health_mcp__get_canton_situation(canton="ZH")
"Gibt es aktuell einen Masernausbruch in der Schweiz?"
→ bag_health_mcp__get_disease_data(series_id="measles/cases/incValue/year", canton="all")
"Wie entwickelt sich das SARS-CoV-2-Signal im Abwasser?"
→ bag_health_mcp__list_series(topic="wastewater_viral_load")
→ bag_health_mcp__get_disease_data(series_id="wastewater_viral_load/NA/value/date", ...)
"Welche Krankheitsdaten stellt das BAG aktuell bereit?"
→ bag_health_mcp__list_diseases()
"Wie hat sich der Alkoholkonsum bei 15-Jährigen seit 2010 entwickelt?" # 🎯 anchor query
→ bag_health_mcp__search_health_indicators(source="suchtschweiz", topic="alkohol")
→ bag_health_mcp__get_indicator_series(source="suchtschweiz",
indicator_id="monam/alkoholkonsum-alter-11-15", region="ZH", year_from=2010)
→ More use cases by audience →
🎯 デモの代表的な質問 — 「チューリッヒ州の15歳の飲酒量は2010年以降どのように変化し、スイス全体と比べてどうですか?」 HBSC の青少年データ(Obsan 経由)では、95%信頼区間とともに、2010年以降のスイス全体の傾向を確認できます。この指標は全国のみを対象としているため、その旨を示す
region_noteが回答に含まれます(HBSC は州別の代表性を持ちません)。Obsan の他の指標の多くは州別に公表されています。以下の区分に関する注記を参照してください。これらは集計された人口統計であり、個人向けの助言ではありません。docs/tool-design-health-indicators.mdを参照してください。
ツール
感染症サーベイランス(BAG IDD):
| ツール | 説明 |
|---|---|
bag_health_mcp__list_diseases | 51 の疾患トピックをすべてカテゴリ別に一覧表示します |
bag_health_mcp__list_series | 特定の疾患のデータ系列を一覧表示します |
bag_health_mcp__get_series_details | 利用可能なフィルターの切り口(州、年齢、性別)を表示します |
bag_health_mcp__get_disease_data | 時系列のサーベイランスデータを取得します |
bag_health_mcp__get_canton_situation | 州の状況概要を表示します(Schulamt のユースケース) |
bag_health_mcp__list_export_files | 利用可能な完全版エクスポートデータセットを一覧表示します |
bag_health_mcp__download_export | 未加工の CSV/JSON エクスポートをダウンロードします |
bag_health_mcp__get_data_version | 現在のデータバージョン(毎週水曜日に更新) |
健康指標 — Obsan、Versorgungsatlas、Sucht Schweiz(複数のソース):
| ツール | 説明 |
|---|---|
bag_health_mcp__search_health_indicators | source(obsan / versorgungsatlas / suchtschweiz)、トピック、地域、年の範囲で指標を検索します |
bag_health_mcp__get_indicator_series | 指標の時系列を取得し、どの切り口(variant:全国/州別/年齢階級別/社会的地位別/分布)を返したか、およびほかにどの切り口があるかを示します。州別の切り口には region='ZH' を渡します。すべてに 95% 信頼区間が付いています |
⚠️ 集計済みの人口統計のみです。 指標ツールが提供するのは、人口レベルの集計値(年齢/性別/地域別の有病率・指標)です。個人への助言、診断、症例評価を行うものではなく、個人データも含まれません。 この点は両方のツール説明とすべての応答(
aggregate_statistics_notice)に記載されており、学校の文脈で予防に関するトピックを扱うsuchtschweiz(HBSC)では特に重要です。ソース:Obsanind.obsan.admin.ch(クリーンな JSON API)。Sucht Schweiz HBSC は Obsan のミラー経由(全国)。Versorgungsatlas は Tarifpool から、州別の年/値の系列(26 州とCHの全国合計、95% 信頼区間、州と CH の比率)を返します。ソースごとの調査メモをご覧ください。
Obsan は指標を単一の系列ではなく、複数の切り口で公開しています。 2026-08-08 にカタログの 60 件以上を測定したところ、50 件に州別の切り口(
kg)、49 件に年齢階級別(ag)、24 件に社会的地位別(sd)があり、通常の全国別(g)は 3 件のみでした。それぞれ測定内容と単位が異なるため、get_indicator_seriesはvariantで返した切り口を明示し、ほかの切り口をvariants_availableに列挙します。60 件中 8 件は系列をまったく公開していません。この場合は空の結果を返すのではなく、その理由を示して失敗します。調査結果はtests/fixtures/obsan_variant_census.jsonに記録され、日付も付されています。
ツールのアノテーション
すべてのツールには、ホストが呼び出さずに動作を判断できるよう、MCP のツールアノテーションが付いています。ここではすべてのツールが同じです。公開され、許可リストに登録されたデータソース(BAG IDD、Obsan、Versorgungsatlas)から読み取ることしかありません。
| アノテーション | 値 | 意味 |
|---|---|---|
readOnlyHint | true | ツールが状態を変更することはありません。 |
destructiveHint | false | 破壊的な副作用はありません。 |
idempotentHint | true | 呼び出しを繰り返しても、追加の影響はありません。 |
openWorldHint | true | ツールは外部システム(上流のデータ API)にアクセスします。 |
したがって、ホストはすべての呼び出しを安全なキャッシュ可能な読み取りとして扱えます。値は server.py で READ_ONLY として一度だけ宣言され、10 個すべてのツールに適用されます。
MCP プリミティブ
このサーバーでは、3 つの MCP プリミティブすべてを、それぞれ最適な用途に使用します。
ツール(10)— IDD API(上記)を呼び出す、リアルタイムかつパラメーター指定可能なアクションです。
リソース — ホストが取得してキャッシュできる、静的で読み取り専用の参照データです。引数や上流への呼び出しは不要です。
| リソース URI | 説明 |
|---|---|
bag://reference/cantons | ツールで受け付ける州コード(FL、all を含む) |
bag://reference/disease-categories | カテゴリー別の疾病トピック分類 |
bag://reference/data-licence | データソース、帰属表示、ライセンス条件 |
プロンプト — ホストが公開できる、再利用可能でパラメーター指定可能なワークフローです(例:スラッシュコマンドとして)。
| プロンプト | 引数 | 目的 |
|---|---|---|
canton_situation_brief | canton | Schulamt 向けの公衆衛生状況報告書を作成します |
outbreak_check | disease, canton | 疾病の流行レベルが現在高まっているか確認します |
リアルタイムのサーベイランスデータはツールで提供します(パラメーター指定可能で、毎週変化するためです)。固定の参照データはリソースとして公開し、推奨される複数ツールを使ったワークフローはプロンプトとしてまとめています。
学校・市行政との関連性
Schulamt / Kreisschulbehörden:
- 州内のインフルエンザと ARI の発生率を監視します
- 麻疹の症例が 1 件でも確認された場合、ワクチン接種率の低い学校に警告を出します
- 百日咳の動向を追跡し、ワクチン未接種の乳児(学童のきょうだい)を守ります
Stadtverwaltung / KI-Fachgruppe:
- 構造化された週次データを使って公衆衛生レポートを作成します
- 臨床症例の 1 週間前に先行指標となる下水サーベイランスを活用します
ポートフォリオとの相乗効果:
bag-epl-mcp→ 「どのような治療法が掲載されていますか?」(EPL 医薬品データベース)bag-health-mcp→ 「現在、何が流行していますか?」(サーベイランスデータ)
データソース
- IDD API:
https://api.idd.bag.admin.ch— 認証は不要です - 更新周期:毎週水曜日
- 対象範囲:スイスとリヒテンシュタイン(FL)、26 州
- トピック:51 種類の病原体、1386 系列のデータ
データソースとライセンス / データソースとライセンス
| ソース | 提供元 | ライセンス | 帰属表示が必要 |
|---|---|---|---|
| Infectious Disease Dashboard (IDD) | Federal Office of Public Health (FOPH / BAG) | opendata.swiss オープンガバメントデータ — 自由に利用できますが、ソースの帰属表示が必要です(スイス OGD 条件、CC BY 相当) | はい |
| 健康指標 | Obsan — Swiss Health Observatory(ind.obsan.admin.ch) | 機械可読な明示的ライセンスはありません。スイス OGD の慣行に従い、自由に利用できますが、指標ごとのソースを記載してください | はい |
| 医療提供体制アトラス | Versorgungsatlas(BAG/Obsan、versorgungsatlas.ch) | 同上(スイス OGD の慣行に従い、ソースを記載してください) | はい |
| HBSC 青少年調査 | Sucht Schweiz — HBSC、Obsan のミラー経由で取得 | 同上(スイス OGD の慣行に従い、「Sucht Schweiz — HBSC」と記載してください) | はい |
必要な引用表記: Federal Office of Public Health FOPH — Infectious Disease Dashboard (IDD)、opendata.swiss を通じたオープンデータ。 指標ツールについては、各レスポンスの provenance.source に具体的な上流ソース(例:Obsan 経由の「Sucht Schweiz — HBSC」)が記載されています。すべてのツールレスポンスには、下流の利用者が自動的に表示できるよう、provenance ブロック(attribution と license フィールド)に帰属表示が含まれています。
Architecture:
┌─────────────────┐ api.idd.bag.admin.ch (IDD API, no auth)
MCP Host │ bag-health-mcp │──▶ ind.obsan.admin.ch (Obsan JSON API)
(Claude, etc.) ──▶│ MCP SDK │──▶ versorgungsatlas.ch (indicator catalogue)
│ 10 Tools │ all HTTPS, egress allow-listed, no auth
└─────────────────┘
インストール
Claude Desktop(stdio)
{
"mcpServers": {
"bag-health": {
"command": "uvx",
"args": ["bag-health-mcp"]
}
}
}
クラウド/HTTP
pip install bag-health-mcp
python -m bag_health_mcp.server --http --port 8000
トランスポート、ホスト、ポートは環境変数(MCP_TRANSPORT
(http/stdio)、MCP_HOST、MCP_PORT)で設定します。デプロイでは、この方法を推奨します(ローカルでの使用には、引き続き --http フラグも使用できます)。サーバーはデフォルトで 127.0.0.1 にバインドされるため、ローカルの HTTP サーバーがネットワークに公開されることはありません。コンテナー/クラウドへのデプロイでは、MCP_HOST=0.0.0.0 を明示的に設定することで、すべてのインターフェースにバインドします。付属の Dockerfile ではこの設定を行っています。
⚠️ セキュリティ: HTTP トランスポートを使用すると、サーバーがネットワーク上に公開されます。ネットワークが隔離された環境でのみ、
127.0.0.1以外にバインドしてください。公開ネットワークや共有ネットワークに直接バインドしないでください。localhost 以外のホストにバインドすると、起動時に警告が記録されます。デフォルトの stdio トランスポートには、ネットワークへの露出がありません。詳しくはdocs/security-posture.mdをご覧ください。
HTTP 認証(任意): MCP_AUTH_TOKEN を設定すると、すべての HTTP リクエストに Authorization: Bearer <token> を要求します(それ以外の場合は 401)。未設定の場合、認証は行われません(stdio/ローカルでの使用には適しています)。これによりサーバーを呼び出せるユーザーを制限します。実際のユーザー ID を識別するには、ゲートウェイを前段に配置してください。
CORS(ブラウザーのクライアント): MCP_CORS_ORIGINS に許可するオリジンをカンマ区切りで設定すると、ブラウザーからのクロスオリジンアクセスが有効になります。2026-07-28 のルーティングヘッダー(Mcp-Method、Mcp-Name、Mcp-Protocol-Version)はプリフライトを通過します。サーバーはセッションヘッダーを発行しないため、公開されるセッションヘッダーはありません。空の場合、クロスオリジンアクセスは許可されません(ワイルドカードは使用しません)。
ホスト許可リスト(DNS リバインディング対策): このサーバーにアクセスする際に使用する名前を、ポートを含めてカンマ区切りで MCP_ALLOWED_HOSTS に設定します。例:bag.example.ch:8000。それ以外の Host で届いたリクエストは 421 で拒否されます。ループバックは許可されるため、コンテナーのヘルスチェックは引き続き動作します。
localhost 以外へのバインド時に未設定の場合、このチェックは無効のままになり、警告が記録されます。これはゲートウェイを前段に置くデプロイ構成を想定しており、その場合はゲートウェイが Host を検証します。名前を推測することはありません。0.0.0.0 では、ここで到達可能な名前を特定できず、誤った推測をすると、保護対象であるはずのデプロイそのものが拒否されてしまうためです。
これは MCP_AUTH_TOKEN とは独立しています。トークンはリクエストを行っているユーザーを示し、こちらはサーバーへのアクセスに使われている名前を示します。リバインディング攻撃は、すでにトークンを保持しているブラウザー上で実行されます。
(セッションアフィニティが不要で、リソース制限や MCP ゲートウェイを備えた)大規模な運用については、デプロイとスケーリングのガイドおよび deploy/ のリファレンスマニフェストをご覧ください。
ロギング: サーバーは、RFC 5424 の重大度を含む構造化 JSON ログを、1 行につき 1 オブジェクトで stderr に出力します。stdout は stdio JSON-RPC トランスポート用に確保されています。ログレベルは MCP_LOG_LEVEL で設定します(デフォルトは INFO)。
トレース(任意): テレメトリー用の追加パッケージをインストールし、サーバーの送信先に OTLP コレクターを設定すると、ツール呼び出しごとの OpenTelemetry スパンと、計測された送信 HTTP を取得できます。
pip install "bag-health-mcp[telemetry]"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"
# optional: OTEL_SERVICE_NAME=bag-health-mcp
追加パッケージがインストールされ、かつ OTEL_* エンドポイントが設定されている場合を除き、トレースは何も行いません。スパンに含まれるのはツール名と、エラー時の例外クラスのみです。ツールの引数、州、監視データは決して含まれません。
利用可能な疾患トピック
| カテゴリー | トピック |
|---|---|
| 呼吸器 | influenza, covid19, acute_respiratory_infection, respiratory_pathogens |
| 腸管感染症 | campylobacteriosis, salmonellosis, ehec, listeriosis, hepatitis_a/e |
| 性感染症・血液媒介感染症 | hiv, aids, syphilis, gonorrhea, hepatitis_b/c, chlamydiosis |
| ワクチンで予防可能な感染症 | measles, pertussis, rubella, tetanus, diphtheria, ipd, meningo |
| ベクター媒介感染症 | lyme_borreliosis, tick-borne_encephalitis, dengue, malaria, zika |
| 下水 | wastewater_viral_load, wastewater_sequencing |
デモ
Claude がチューリッヒ州のインフルエンザの状況を質問しています。ツール呼び出しは 1 回で、構造化された結果と、行動につながるドイツ語の要約が得られます。
MCP プロトコルバージョン
このサーバーは MCP 2026-07-28 をネイティブにサポートしており、同じエンドポイントで旧バージョンのすべてのクライアントにも引き続き対応します。接続時の最初のリクエストによって、その接続のプロトコル世代が決まります。後から別の世代を主張した場合は拒否されます。
| 世代 | リビジョン | 利用するクライアント |
|---|---|---|
| リクエストごとのエンベロープ | 2026-07-28 | 2026-07-28 の _meta エンベロープを含むリクエスト。initialize もセッションも不要です。SDK 自身の Client はデフォルトでここに接続します。 |
initialize ハンドシェイク | 2024-11-05 … 2025-11-25 | まだ 2026-07-28 を話さないクライアント。サーバーは要求されたリビジョンで応答します。リクエストがより新しいリビジョンを要求した場合は、上限である 2025-11-25 で応答します。 |
ここで「ネイティブ」とは何を意味するのか、各項目は
tests/test_spec_2026_07_28.pyで検証されています。
- どちらの世代でもセッションはありません。
Mcp-Session-Idを含むレスポンスはなく、どのレプリカでもどのリクエストにも応答できるため、通常のラウンドロビンロードバランサーで十分です(デプロイとスケーリングを参照)。ハンドシェイクを使うクライアントには、意図的にstateless_http=Trueを使用しています。 - 非推奨の機能はありません。 プロトコルロギング(
ctx.info/ctx.warning)、サンプリング、ルートは2026-07-28で非推奨です(SEP-2577)。サーバーはこれらを一切使用せず、運用ログは stderr に出力します。テストスイートではMCPDeprecationWarningをエラーにするため、呼び出しが再導入されると CI が失敗します。 - サーバーからクライアントへのリクエストはありません。 クライアントに問い合わせるツールはないため、
2026-07-28では利用できなくなったバックチャネルに依存するものはありません。 - 進捗(サーバーからクライアントへの通知。仕様には引き続き存在します)は、どちらの世代でもツール呼び出しのレスポンスストリームに届きます。
- リスティングメソッドでのキャッシュヒント(
ttlMs/cacheScope、SEP-2549)、およびルーティングヘッダーMcp-Method、Mcp-Name、Mcp-Protocol-Versionに対する CORS。
両方のリビジョンは tests/test_protocol_version.pyで固定され、インストール済み SDK と照合して検証されるため、Dependabot による mcp の更新によって、どちらかが気付かないうちに変わることはありません。ハンドシェイクの上限は定数名から読み取るのではなく、組み立て済みの ASGI スタックを通した実際の initialize で測定します。
SDK の LATEST_PROTOCOL_VERSION はハンドシェイク世代ではなく、新しい世代の別名である点に注意してください。これだけを基準に固定すると、ハンドシェイク世代が変更されても検出できません。
更新ポリシー。 ゲートで失敗した場合、定数を何も確認せずに編集しないでください。2つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正常に動作することを確認したうえで、定数、このセクション、README.de.md、CHANGELOG.mdをまとめて更新してください。
安全性と制限
| 項目 | 詳細 |
|---|---|
| アクセス | 読み取り専用 — 書き込み操作はできません |
| 外部通信 | コード層の許可リスト:サーバーが接続するのは3つの公開データホスト(api.idd.bag.admin.ch、ind.obsan.admin.ch、www.versorgungsatlas.ch)のみです。HTTPS のみを使用し、リダイレクトの各段階を含むすべてのリクエストで適用されます(SSRF/SEC-004 + SEC-021)。ネットワーク層の補完ポリシーは deploy/networkpolicy.yamlにあります |
| 個人データ | ありません — すべてのデータソースは集計済み/匿名化済みです(法律により BAG IDD は州単位、指標は年齢/性別/地域ごとの人口集計です) |
| レート制限 | 公開されている IDD API のレート制限はありません。サーバーはデフォルトで、呼び出しごとのレスポンスを104データポイントに制限します(limit_weeks パラメーター) |
| タイムアウト | API 呼び出しごとに30秒 |
| 認証 | API キーは不要です — すべてのデータに公開アクセスできます |
| データライセンス | opendata.swiss OGD — 無償利用可能。出典の明記が必要(CC BY 相当)。FOPH IDD の引用が必要です。データソースとライセンスを参照してください |
| 利用規約 | BAG IDD API ToSが適用されます |
既知の制限事項
- ベータ API:IDD API は
v0.1 betaと表示されています。スキーマは予告なく変更される場合があります - 週次更新:データはリアルタイムではなく、水曜日のみ更新されます
- 州レベルの粒度:一部の希少疾患では、州レベルのデータに十分な症例数がありません(プライバシー保護のため非公開)
- 年齢グループ:利用できるディメンションは疾患系列によって異なります。
bag_health_mcp__get_series_detailsを使って確認してください
コンプライアンス
- ISDS(チューリッヒ市): 情報セキュリティの保護必要性に関する分類の草案
(Grundwert ごとの Schutzbedarfsanalyse と対策のマッピング)を
docs/isds-klassifikation.mdに掲載しています。技術的根拠に基づく ISBO/OIZ の承認待ちの草案であり、拘束力のある 分類ではありません。 - データ分類(Schulamt): データは ÖFFENTLICH / BUI
(公開 OGD、個人データなし、州レベルで集計済み、少数セルはソース側で非公開)
に分類されています。分類案と集計リスクに関する注記は
docs/datenklassifikation-schulamt.mdにあります。 集計を行うbag_health_mcp__get_canton_situationツールは、応答にこの情報を表示します。 - セキュリティ態勢: lethal-trifecta 評価(サーバーは厳密に
読み取り専用のため、影響を受けません)、シークレット管理に関する決定(シークレットなし — 公開データ)、
ネットワーク露出に関する注記は
docs/security-posture.mdにあります。 - フェーズ別アーキテクチャ: これは フェーズ 1(読み取り専用) のサーバーです。書き込み/送信
機能は、文書化された前提条件が満たされるまで保留されています。
docs/roadmap.mdをご覧ください。 - 脆弱性の報告: セキュリティ問題を非公開で報告する方法については、セキュリティポリシーをご覧ください。
貢献
CONTRIBUTING.md(ドイツ語)をご覧ください。
セキュリティ
セキュリティ態勢と脆弱性を機密扱いで報告する方法については、SECURITY.md(ドイツ語)をご覧ください。
ライセンス
コード: MIT(LICENSE をご覧ください)。
データ: BAG IDD は opendata.swiss 上のオープンガバメントデータであり、 出典の表示を条件とする自由な利用(スイスの OGD 条件、CC BY 相当)が認められています。 パブリックドメインではありません。データを再利用する際は、連邦公衆衛生局 FOPH(IDD)を出典として明記してください。データソースとライセンスをご覧ください。
作者
Hayal Oezkan · github.com/malkreide
関連ポートフォリオサーバー
swiss-statistics-mcp— BFS の人口統計データbag-epl-mcp— BAG の医薬品償還リストzurich-opendata-mcp— チューリッヒ市のオープンデータ
インストール
uv の uvx を使って実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code の .vscode/mcp.json ではトップレベルの servers キーを使用します)。
{
"mcpServers": {
"bag-health-mcp": {
"command": "uvx",
"args": [
"bag-health-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。