swiss-culture-mcp について
文化研究向けに、スイス連邦文化庁のデータを提供するMCPサーバーです。保護対象の町並み、生活文化、文化賞、報道発表、文化庁のデータセットを、APIキーなしで公開データソースから取得できます。
主な機能
- 01場所を指定したISOS町並み検索
- 02州または分類別のISOS一覧
- 03町並みの詳細と統計の取得
- 04スイスの生活文化の閲覧
- 05文化賞と連邦文化庁の報道発表の検索
- 06opendata.swissの文化庁データセット検索
活用シーン
- 01スイスの町並みが保護対象か確認
- 02州で受け継がれる生活文化を調査
- 03スイスの文化賞や発表を確認
- 04opendata.swissで文化庁のデータセットを検索
MCP 対応
文化遺産と関連する公開データを照会する10個のツールと3個のリソースを提供します。stdioとStreamable HTTPに対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
🏛️ swiss-culture-mcp
連邦文化庁(BAK)のスイス文化遺産データ(ISOS の町並み、無形文化遺産、文化賞、プレスリリース)を扱う MCP サーバーです。API キーは不要です。
🌐 英語 | ドイツ語
概要
swiss-culture-mcp は、スイスの文化データを AI アシスタントから利用できるようにします。このサーバーは、Claude などの LLM を、保護対象の町並み(ISOS)から無形文化遺産の伝統、最新の文化賞まで、スイスの国民文化遺産につなぎます。
データソース: geo.admin.ch REST API · news.admin.ch RSS · opendata.swiss CKAN · lebendige-traditionen.ch
API キーは不要です。 すべてのデータソースは一般公開されています(オープンガバメントデータ)。
デモ用の基本クエリ: 「チューリッヒ市の学区にはどのような保護対象の町並みがあり、そこでどのような無形文化遺産が受け継がれていますか?」
機能
- 🏘️ ISOS 検索 – 名称、州、集落の種類から、保護に値するスイスの町並みの連邦目録を検索
- 📜 無形文化遺産 – スイスの無形文化遺産 228 件
- 🏆 文化賞 – スイス映画賞、文学大賞、音楽賞など
- 📰 BAK プレスリリース – 連邦文化庁の最新ニュース
- 📦 オープンデータカタログ – opendata.swiss の BAK データセット
- ☁️ デュアルトランスポート – Claude Desktop 向けの stdio、クラウドデプロイ向けの Streamable HTTP
| # | ツール | 説明 |
|---|---|---|
| 1 | bak_search_isos | 地名から ISOS の町並みを検索 |
| 2 | bak_isos_by_kanton | 州内のすべての ISOS 対象を一覧表示 |
| 3 | bak_get_isos_detail | ISOS 対象の詳細をすべて取得 |
| 4 | bak_isos_by_kategorie | 集落の種類(Stadt、Dorf など)で ISOS を絞り込み |
| 5 | bak_isos_statistics | ISOS 目録の統計(州ごとのサンプル) |
| 6 | bak_get_news | BAK の最新プレスリリース |
| 7 | bak_get_kulturpreise | スイスの文化賞(映画賞、文学大賞など) |
| 8 | bak_get_opendata | opendata.swiss の BAK データセット |
| 9 | bak_list_traditions | スイスの無形文化遺産を一覧表示 |
| 10 | bak_get_tradition_detail | 伝統の詳細な説明を取得 |
3 つのリソース: bak://isos/kantone · bak://isos/kategorien · bak://kulturpreise/uebersicht
データソース
| ソース | API の種類 | 内容 |
|---|---|---|
| geo.admin.ch | REST MapServer | ISOS(保護に値するスイスの町並みの連邦目録) |
| news.admin.ch | RSS Feed | BAK のプレスリリース、文化賞 |
| opendata.swiss | CKAN REST API | BAK のオープンデータセット |
| lebendige-traditionen.ch | HTML Fetch | 無形文化遺産 228 件 |
前提条件
- Python 3.11+
uvまたはpip- API キーは不要です
インストール
# Recommended: uvx (no install step needed)
uvx swiss-culture-mcp
# Alternative: pip
pip install swiss-culture-mcp
クイックスタート
# Start the server (stdio mode for Claude Desktop)
uvx swiss-culture-mcp
Claude Desktop ですぐに試せます:
「グラウビュンデン州の保護対象の町並みをすべて表示して」 「アッペンツェル州ではどのような無形文化遺産が受け継がれていますか?」 「2026 年に授与されたスイスの文化賞を教えて」
設定
環境変数
| 変数 | デフォルト値 | 説明 |
|---|---|---|
MCP_TRANSPORT | stdio | トランスポート:stdio または streamable_http(streamable-http も使用できます)。2026-07-28 時代の情報には、HTTP トランスポート経由でのみアクセスできます。 |
MCP_HOST | 127.0.0.1 | HTTP トランスポートのバインド先ホスト(デフォルトはループバック) |
MCP_PORT | 8000 | HTTP トランスポートのポート |
MCP_ALLOW_PUBLIC_BIND | false | true の場合、認証なしで 0.0.0.0 へのバインドを許可します。認証を行うリバースプロキシ(Cloudflare Access、oauth2-proxy など)の背後でのみ設定してください。 |
MCP_ALLOWED_HOSTS | (空) | このサーバーが応答するホスト名をカンマ区切りで指定します。スキームは含めません(mcp.example.ch)。HTTP トランスポートの Host/Origin チェックに使用されます。ループバック以外にデプロイする場合は必ず設定してください。以下の警告を参照してください。ループバックは常に許可されるため、コンテナのヘルスチェックは引き続き動作します。 |
ALLOWED_ORIGINS | (空) | CORS オリジンを、スキームを含めてカンマ区切りで指定します(https://claude.ai)。空の場合、ブラウザベースの MCP クライアントは許可されません。stdio とブラウザ以外のクライアントには影響しません。* も使用できますが、警告としてログに記録されます。 |
LOG_LEVEL | INFO | DEBUG、INFO、WARNING、ERROR — stderr に構造化 JSON ログを出力します |
Claude Desktop の設定
{
"mcpServers": {
"swiss-culture": {
"command": "uvx",
"args": ["swiss-culture-mcp"]
}
}
}
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Claude Desktop を再起動すると、すべてのツールを利用できます。質問の例:
- 「グラウビュンデン州にある保護対象の町並みをすべて表示してください」
- 「アルプホルンとビューシェル演奏の伝統とは何ですか?」
- 「2026 年に授与されたスイスの文化賞は何ですか?」
- 「シュタイン・アム・ラインの旧市街は ISOS インベントリに登録されていますか?」
- 「アッペンツェル州では、どの生きた伝統が実践されていますか?」
クラウドデプロイ(Streamable HTTP)
ブラウザーの claude.ai 経由で使用する場合(ローカルソフトウェアのない管理対象ワークステーションなど):
コネクター URL は常に、デプロイ先のホストとトランスポートパスを組み合わせたものです:
https://<host>/mcp。claude.ai の「設定」→「MCP サーバー」で追加してください。
Render.com(推奨):
- リポジトリを GitHub にプッシュするか、フォークします
- render.com で「New Web Service」→ GitHub リポジトリに接続します
- Render のダッシュボードで環境変数を設定します。以下を含めてください。
MCP_ALLOWED_HOSTS=your-app.onrender.comおよび、ブラウザーベースのクライアントの場合はALLOWED_ORIGINS=https://claude.ai - claude.ai の「設定」→「MCP サーバー」で、
https://your-app.onrender.com/mcpを追加します
Docker。 リポジトリにはマルチステージの Dockerfile
(python:3.13-slim、非 root、TCP ヘルスチェック)が含まれています。コンテナー内ではプラットフォームのエッジプロキシ経由でしかアクセスできないため、トランスポート、0.0.0.0 バインド、MCP_ALLOW_PUBLIC_BIND=true があらかじめ設定されています。MCP_ALLOWED_HOSTS はイメージ内では意図的に未設定です。ホスト名はデプロイ先によって異なり、推測した値を設定すると、実際のすべてのリクエストが HTTP 421 で拒否されます:
docker build -t swiss-culture-mcp .
docker run -p 8000:8000 \
-e MCP_ALLOWED_HOSTS=mcp.example.ch \
-e ALLOWED_ORIGINS=https://claude.ai \
swiss-culture-mcp
この2つの変数は異なるものを保護するため、互いの代わりにはなりません。
0.0.0.0にバインドしたこのサーバーに対し、Origin: https://claude.aiを含むリクエストを送信して確認した結果:
MCP_ALLOWED_HOSTSALLOWED_ORIGINSHost/Origin チェック POST プリフライト 設定済み 設定済み 有効 200許可 設定済み — 有効 403拒否 — 設定済み 無効 200許可 — — 無効 200拒否 2種類の失敗は同じものではないため、列ごとに確認してください。 ブラウザークライアントが動作するかどうかは
ALLOWED_ORIGINSで決まります。これを設定しないと、リクエストは拒否されます(Host の許可リストが有効な場合、トランスポートによって403が返されます。これは拒否されたOriginによるものです。拒否されたHostの場合は421になります)。または、ブラウザーがレスポンスを読み取れません。デプロイが安全かどうかはMCP_ALLOWED_HOSTSで決まります。これを設定しないとbuild_transport_security()はNoneを返し、HostとOriginヘッダーは一切チェックされません。3行目が落とし穴です。ブラウザークライアントは接続でき、すべて問題ないように見えますが、デプロイは DNS リバインディングに対して無防備です。パブリックバインドでは両方を設定してください。ブラウザーベースのクライアントからサーバーに接続させない場合に限り、ALLOWED_ORIGINSを未設定にできます。MCP_ALLOWED_HOSTSはパブリックバインドで未設定のままにしないでください。
# Local HTTP mode (loopback only — safe default, no allow-list needed)
MCP_TRANSPORT=streamable_http MCP_PORT=8000 python -m swiss_culture_mcp.server
# Public bind (DANGEROUS — only behind an authenticating reverse proxy)
MCP_TRANSPORT=streamable_http MCP_HOST=0.0.0.0 MCP_ALLOW_PUBLIC_BIND=true \
MCP_ALLOWED_HOSTS=mcp.example.ch python -m swiss_culture_mcp.server
⚠️ セキュリティ: サーバー自体には認証機能がありません。上流の認証レイヤーを設けずにパブリックインターフェースへバインドすると、連邦政府のデータソースへのオープンプロキシになります。
0.0.0.0を使ったデプロイの前段には、必ず認証を行うリバースプロキシ(Cloudflare Access、oauth2-proxy、nginx + auth_request)を配置してください。
⚠️ パブリックバインドでは
MCP_ALLOWED_HOSTSを設定してください。 設定しないとHostとOriginヘッダーは一切チェックされず、サーバーは DNS リバインディングに対して無防備になります。攻撃者が被害者のブラウザーをサーバーに向け、外部のHostを使って通信できてしまいます。このような起動のたびに、サーバーはdns_rebinding_protection_offをログに記録します。この行は形式的なものではなく、保護が無効であることを示す兆候です。ループバックバインドでは許可リストは不要です。SDK がバインドホストから許可リストを自動的に導き出します。
アーキテクチャ
┌─────────────────┐ ┌──────────────────────────┐ ┌──────────────────────────┐
│ Claude / AI │────▶│ Swiss Culture MCP │────▶│ geo.admin.ch REST │
│ (MCP Host) │◀────│ (MCP Server) │◀────│ news.admin.ch RSS │
└─────────────────┘ │ │ │ opendata.swiss CKAN │
│ 10 Tools · 3 Resources │ │ lebendige-traditionen │
│ Stdio | Streamable HTTP │ └──────────────────────────┘
└──────────────────────────┘
プロジェクト構成
swiss-culture-mcp/
├── src/
│ └── swiss_culture_mcp/
│ ├── __init__.py
│ └── server.py # All 10 tools, 3 resources
├── tests/
│ ├── conftest.py # pytest configuration
│ └── test_server.py # 36 tests (unit + live)
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md # Contribution guide (English)
├── CONTRIBUTING.de.md # Contribution guide (German)
├── SECURITY.md # Security policy & posture (English)
├── SECURITY.de.md # Security policy & posture (German)
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German version
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 の更新で、どちらかが気付かないうちに変わることはありません。
SDK の LATEST_PROTOCOL_VERSION は、ハンドシェイク時代ではなくモダンな時代の別名であることに注意してください。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする時代が、意図せず変更される可能性があります。
モダンな時代は、推測ではなく実測されます。
tests/test_modern_era.py はサーバーの実際の ASGI アプリを構築し、2026-07-28 のエンベロープ、initialize ハンドシェイク、および各不正形式のバリエーションを含むリクエストを送信します。モダンなリクエストに応答すること、2 つの時代が分離されていること(モダンなワイヤー上では initialize はメソッドではなく、ハンドシェイクの上限は 2025-11-25 であり、2026-07-28 は返されないこと)、server/discover が固定されたリビジョンを正確に示すこと、他のリビジョンが要求された場合は要求されたリビジョンとサポートされているリビジョンの両方を示す -32022 で拒否されること、さらに ttlMs/cacheScope と serverInfo がワイヤーフィールドとして届くことを検証します。
重要なのは、モダンな時代に対応しているのはストリーミング可能な HTTP エントリーポイントのみだという点です。stdio とプロセス内クライアントが使用するのは initialize ハンドシェイクだけで、それ以外は使用しません。プロセス内クライアントを使って仕様をテストしても、検証できるのはハンドラーであり、プロトコル時代ではありません。この見落としにより、1 文字の不具合が見逃されていました。main() は HTTP トランスポートを streamable_http として起動していましたが、SDK の run() が受け取るのは streamable-http です。そのため、トランスポートは ValueError で異常終了し、サーバーは仕様に対応できていませんでした。mcp.run をモックし、同じ誤記を手書きで複製した文字列と比較していたため、すべてのテストが成功したままでした。
サーバーの識別情報。 仕様 2026-07-28 では、ハンドシェイク時代のようにセッションごとに 1 回ではなく、すべての応答の _meta に serverInfo が含まれます。このサーバーは、名前、タイトル、説明、Web サイトの URL、およびパッケージメタデータ(外向きの User-Agent と同じソースである importlib.metadata)から取得したバージョンを設定します。手作業で管理されたリテラルは、scripts/check_version_sync.py によって拒否されます。
名前は swiss-culture-mcp です。ディストリビューション、コンソールスクリプト、レジストリエントリー、外向きの User-Agent と同じ綴りです。2026-09-20 までは swiss_culture_mcp でした。場所によって綴りが異なる識別情報は、正しい識別情報とは言えません。tests/test_servername.py では、リテラルを同じリテラルと照合するのではなく、各ソースをまとめて検証します。Python のロガーでは意図的にアンダースコアを維持しています。これはサーバーの識別情報ではなくロガー名であり、名前を変更しても整合性は取れず、運用者のログ設定をすべて壊してしまうためです。
更新ポリシー。 ゲートに失敗した場合、定数をむやみに編集しないでください。2 つのリビジョン間の仕様の変更履歴を確認し、サーバーが引き続き正常に動作することを検証してから、定数、このセクション、README.de.md、CHANGELOG.md を一緒に更新してください。
テスト
# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls)
PYTHONPATH=src pytest tests/ -m "live"
使用例
学校/教育
"Which protected townscapes are there in the school districts of the city of Zurich?"
→ bak_isos_by_kanton(kanton="ZH") + bak_get_isos_detail(...)
"Find living traditions for a project week on the theme of cultural heritage"
→ bak_list_traditions() + bak_get_tradition_detail(slug="...")
"Which UNESCO World Heritage Sites are also in ISOS?"
→ bak_search_isos(query="...") + bak_get_opendata(query="UNESCO")
市政/空間計画
"Is the building at address X within an ISOS perimeter?"
→ bak_search_isos(query="community/place name")
"Which BAK datasets are available for GIS integration?"
→ bak_get_opendata() → WMS/WFS URLs for GIS software
AI ワーキンググループ/デモ
"Show current cultural policy of the federal government"
→ bak_get_news() + bak_get_kulturpreise()
→ More use cases by audience →
安全性と制限
| 項目 | 詳細 |
|---|---|
| アクセス | 読み取り専用 — サーバーはデータを変更または削除できません |
| 個人データ | 個人データはありません — すべての情報源は、集約された公開文化遺産データです |
| レート制限 | クエリごとの上限を内蔵しています(例:ISOS の結果は最大 100 件、ニュース項目は 50 件、カテゴリ項目は 200 件) |
| タイムアウト | API 呼び出しごとに 20 秒 |
| 認証 | API キーは不要です — 4 つのデータソースはすべて一般公開されています |
| ライセンス | すべてのデータはオープンライセンス(Open Government Data)の下で公開されています:geo.admin.ch、opendata.swiss、news.admin.ch |
| 利用規約 | 各データソースの利用規約が適用されます:geo.admin.ch、opendata.swiss、news.admin.ch、lebendige-traditionen.ch |
既知の制限事項
- ISOS の統計情報: カントンごとのサンプルに基づいており、すべてのカントンを網羅しているわけではありません
- Living Traditions: HTML スクレイピングを使用しているため、lebendige-traditionen.ch の構造が変更されると動作しなくなる可能性があります
- BAK のニュース/賞: RSS フィードは最新の項目に限られています
- opendata.swiss CKAN: 全文検索で他の公開元の結果が返される場合があります
- このサーバーが提供するアドレスは、推測ではなく実測に基づいています。
scripts/record_fixtures.pyは実行のたびに各アドレスを再確認し、4 つの検証用アドレス(架空の geo.admin.ch サービス、架空の BAK パス、架空のニュース組織番号、架空の伝統スラッグ)も併せて確認します。2026-08-08 には無効なアドレスが 1 つありました:bak_isos_overviewは BAK の情報源として.../home/kulturerbe/baukultur.htmlを公開していましたが、HTTP 404 であり、kulturerbeブランチ全体も存在しませんでした。推測した代替 URL ではなく、HTTP 200 が確実に返る BAK のルートに置き換えました。 - ほかのすべては問題ありませんでした。 geo.admin.ch、opendata.swiss、gisos、isos、
org-nr=314を指定したニュースフィード、伝統のページは、すべて実際のコンテンツを返します。この null の結果も記録しています。これがなければ、次回の確認は何もない状態から始めることになります。
他の MCP サーバーとの連携
swiss-culture-mcp は、ポートフォリオ内のほかのサーバーと組み合わせて使用できます:
| 組み合わせ | ユースケース |
|---|---|
+ swiss-transport-mcp | 文化観光:公共交通機関を利用した伝統文化のある場所への日帰り旅行 |
+ zurich-opendata-mcp | 地域の文化アトラス:ISOS + チューリッヒ市のイベント |
+ global-education-mcp | 国際比較による文化教育 |
+ fedlex-mcp | 文化財移転法 + BAK の執行慣行 |
+ swiss-statistics-mcp | カントン別の文化支出(BFS のデータ) |
変更履歴
CHANGELOG.md を参照してください
コントリビューション
コントリビューションを歓迎します。CONTRIBUTING.md をご覧ください。
セキュリティ
セキュリティ態勢、強化の詳細、責任ある脆弱性開示の手順については、SECURITY.md に記載されています。
ライセンス
MIT License — LICENSE をご覧ください
作者
Hayal Oezkan · malkreide
クレジットと関連プロジェクト
- データ: Bundesamt für Kultur (BAK) – 連邦文化庁
- ISOS: geo.admin.ch – 連邦地形測量局 swisstopo
- 伝統: lebendige-traditionen.ch – BAK の生きた伝統の登録簿
- プロトコル: Model Context Protocol – Anthropic / Linux Foundation
- 関連プロジェクト: zurich-opendata-mcp – チューリッヒ市のオープンデータ向け MCP サーバー
- ポートフォリオ: Swiss Public Data MCP Portfolio
インストール
uv の uvx 経由で実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json のトップレベルキー servers を使用します):
{
"mcpServers": {
"swiss-culture-mcp": {
"command": "uvx",
"args": [
"swiss-culture-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。