mcpField
S
swiss-culture-mcp

swiss-culture-mcp

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

swiss-culture-mcp について

文化研究向けに、スイス連邦文化庁のデータを提供するMCPサーバーです。保護対象の町並み、生活文化、文化賞、報道発表、文化庁のデータセットを、APIキーなしで公開データソースから取得できます。

主な機能

  1. 01場所を指定したISOS町並み検索
  2. 02州または分類別のISOS一覧
  3. 03町並みの詳細と統計の取得
  4. 04スイスの生活文化の閲覧
  5. 05文化賞と連邦文化庁の報道発表の検索
  6. 06opendata.swissの文化庁データセット検索

活用シーン

  1. 01スイスの町並みが保護対象か確認
  2. 02州で受け継がれる生活文化を調査
  3. 03スイスの文化賞や発表を確認
  4. 04opendata.swissで文化庁のデータセットを検索

MCP 対応

文化遺産と関連する公開データを照会する10個のツールと3個のリソースを提供します。stdioとStreamable HTTPに対応しています。

設定

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

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

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

パッケージ
pypiswiss-culture-mcp1.2.0

ツール

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

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

詳細

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

🏛️ swiss-culture-mcp

Version License: MIT Python 3.11+ MCP Data Source CI

連邦文化庁(BAK)のスイス文化遺産データ(ISOS の町並み、無形文化遺産、文化賞、プレスリリース)を扱う MCP サーバーです。API キーは不要です。

🌐 英語 | ドイツ語

デモ:Claude が MCP ツール呼び出しを介して ISOS の町並みを照会


概要

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
#ツール説明
1bak_search_isos地名から ISOS の町並みを検索
2bak_isos_by_kanton州内のすべての ISOS 対象を一覧表示
3bak_get_isos_detailISOS 対象の詳細をすべて取得
4bak_isos_by_kategorie集落の種類(Stadt、Dorf など)で ISOS を絞り込み
5bak_isos_statisticsISOS 目録の統計(州ごとのサンプル)
6bak_get_newsBAK の最新プレスリリース
7bak_get_kulturpreiseスイスの文化賞(映画賞、文学大賞など)
8bak_get_opendataopendata.swiss の BAK データセット
9bak_list_traditionsスイスの無形文化遺産を一覧表示
10bak_get_tradition_detail伝統の詳細な説明を取得

3 つのリソース: bak://isos/kantone · bak://isos/kategorien · bak://kulturpreise/uebersicht


データソース

ソースAPI の種類内容
geo.admin.chREST MapServerISOS(保護に値するスイスの町並みの連邦目録)
news.admin.chRSS FeedBAK のプレスリリース、文化賞
opendata.swissCKAN REST APIBAK のオープンデータセット
lebendige-traditionen.chHTML 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_TRANSPORTstdioトランスポート:stdio または streamable_http(streamable-http も使用できます)。2026-07-28 時代の情報には、HTTP トランスポート経由でのみアクセスできます。
MCP_HOST127.0.0.1HTTP トランスポートのバインド先ホスト(デフォルトはループバック)
MCP_PORT8000HTTP トランスポートのポート
MCP_ALLOW_PUBLIC_BINDfalsetrue の場合、認証なしで 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_LEVELINFODEBUG、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(推奨):

  1. リポジトリを GitHub にプッシュするか、フォークします
  2. render.com で「New Web Service」→ GitHub リポジトリに接続します
  3. Render のダッシュボードで環境変数を設定します。以下を含めてください。 MCP_ALLOWED_HOSTS=your-app.onrender.com および、ブラウザーベースのクライアントの場合は ALLOWED_ORIGINS=https://claude.ai
  4. 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-282026-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


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

インストール

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

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

コメント

MCP は初めてですか?

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

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