srgssr-mcp について
srgssr-mcpは、SRG SSRの公開データをAIアシスタントから利用するための読み取り専用MCPサーバーです。スイスの天気、放送番組表、投票・選挙結果を一つのインターフェースで扱い、ローカルとクラウドの通信方式に対応します。
主な機能
- 01スイスの天気と予報
- 02テレビ・ラジオ番組、エピソード、ライブ配信
- 03日別の電子番組表
- 041900年以降のスイスの投票・選挙結果
- 05SRF、RTS、RSI、RTR、SWIのデータ
- 06ツール、リソース、再利用可能なプロンプト
活用シーン
- 01スイスの地点の天気や予報を調べる
- 02チャンネルの日別テレビ・ラジオ番組表を確認する
- 03エピソードやライブ配信一覧を取得する
- 04国・州レベルの投票や選挙結果を調べる
MCP 対応
ツール、リソース、プロンプトを通じて、SRG SSRの公開APIデータをMCPクライアントに提供します。stdio、SSE、Streamable HTTPの通信方式に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🇨🇭 Swiss Public Data MCP Portfolio の一部です
📺 srgssr-mcp
AI モデルを SRG SSR の公開 API(天気、テレビ・ラジオのメタデータ、番組表、1900 年以降のスイスの国民投票・選挙(SRF、RTS、RSI、RTR、SWI))に接続する MCP サーバーです。
概要
srgssr-mcp を使うと、Claude などの AI アシスタントから、スイスの全国公共放送局である SRG SSR の公開 API に直接アクセスできます。天気予報、テレビ・ラジオのメタデータ、電子番組表、歴史的な民主主義データ(1900 年以降の国民投票・選挙)を、標準化された単一の MCP インターフェースから利用できます。
このサーバーは、SRF Weather、Video、Audio、EPG、Polis(スイスの民主主義)の 5 つのテーマ別クラスターをカバーしています。各クラスターは、SRG SSR API の生データを整形された JSON レスポンスに変換する、専用ツールのグループに対応しています。
デモの主な質問: 「イニシアチブ X に関する国民投票のチューリッヒ州での結果は?」 ―― 幻覚ではなく、Polis システムの過去のリアルタイムデータに基づいて回答します。
機能
- 🌦️ 天気 – 場所の検索、現在の状況、24 時間の時間別予報、7 日間予報(SRF Meteo)
- 📺 動画 – テレビ番組一覧、最新エピソード、全事業部門のライブ TV チャンネル
- 🎙️ 音声 – ラジオ番組一覧、音声エピソード、ライブラジオ局
- 📅 EPG – テレビ・ラジオの各チャンネルの日別番組表
- 🗳️ Polis – 1900 年以降の国民投票・選挙、国および州ごとの結果
- 🏢 複数事業部門 – SRF(ドイツ語)、RTS(フランス語)、RSI(イタリア語)、RTR(ロマンシュ語)、SWI(多言語)
- 🔐 OAuth2 – Client Credentials フローによる自動トークン管理
- ☁️ 2 種類のトランスポート – Claude Desktop 用の stdio、クラウドデプロイ用の Streamable HTTP/SSE
前提条件
- Python 3.11+
- developer.srgssr.ch の API キー(無料登録):
- アカウントを作成してログインします
- 「My Apps」で新しいアプリケーションを作成します
- SRG SSR PUBLIC API V2 製品を追加します
- Consumer Key と Consumer Secret を控えます
⚠️ 利用規約: SRG SSR API は非商用利用が可能です。商用利用については、[email protected] まで直接お問い合わせください。
インストール
# Clone the repository
git clone https://github.com/malkreide/srgssr-mcp.git
cd srgssr-mcp
# Install
pip install -e .
または、uvx を使います(永続的なインストールは不要です):
uvx srgssr-mcp
または、pip を使います:
pip install srgssr-mcp
クイックスタート
# Set credentials
export SRGSSR_CONSUMER_KEY="your-consumer-key"
export SRGSSR_CONSUMER_SECRET="your-consumer-secret"
# Start the server (stdio mode for Claude Desktop)
srgssr-mcp
Claude Desktop ですぐに試してみましょう:
「明日のチューリッヒの天気はどうなりそうですか?」 「今夜の SRF 1 の番組は何ですか?」 「2010 年から 2020 年の間にベルン州で行われた国民投票はどれですか?」
設定
Claude Desktop
最小構成(推奨):
{
"mcpServers": {
"srgssr": {
"command": "uvx",
"args": ["srgssr-mcp"],
"env": {
"SRGSSR_CONSUMER_KEY": "your-consumer-key",
"SRGSSR_CONSUMER_SECRET": "your-consumer-secret"
}
}
}
}
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
保存した後、Claude Desktop を完全に終了してから再起動してください。
その他の MCP クライアント
Cursor、Windsurf、VS Code + Continue、LibreChat、Cline、および mcp-proxy 経由のセルフホストモデルに対応しています。同じ環境変数を設定してください。
クラウドデプロイ(ブラウザーアクセス用の SSE)
ブラウザー上の claude.ai 経由で使用する場合(ローカルソフトウェアを利用できない管理対象ワークステーションなど):
SRGSSR_CONSUMER_KEY=... \
SRGSSR_CONSUMER_SECRET=... \
SRGSSR_MCP_TRANSPORT=streamable-http \
SRGSSR_MCP_HOST=0.0.0.0 \
SRGSSR_MCP_PORT=8000 \
python -m srgssr_mcp.server
トランスポート、ホスト、ポート、マウントパスはすべて環境変数で設定します
(srgssr_mcp.server.Settingsを参照)。SRGSSR_MCP_TRANSPORTで有効な値は
stdio(デフォルト)、sse、streamable-httpです。
💡 「開発者のノート PC には stdio、ブラウザーには SSE。」
MCP プリミティブ
このサーバーは、相互に独立した 3 つの MCP プリミティブすべてを公開します。
| プリミティブ | 考え方 | 内容 |
|---|---|---|
| ツール(動詞) | 実行可能な関数/パラメーター付きクエリ | 15 個のツール — 検索、一覧表示、取得、集計 |
| リソース(名詞) | URI の背後にあるキャッシュに適した受動的データ | EPG エントリーと不変の投票結果 |
| プロンプト(レシピ) | 再利用可能なワークフローテンプレート | 投票分析と日次ブリーフィング |
ツールは、パラメーター付き検索(年の範囲、フリーテキスト、ページ分割された一覧表示など)を扱い、呼び出すたびに異なる結果が返ることがあります。リソースは、キャッシュしても安全な安定したデータポイントを公開します。たとえば、特定のチャンネルと日付の公開済み EPG や、終了したスイスの国民投票の最終結果です。プロンプトは、繰り返し行う複数ステップの分析を標準化するため、ユーザーが毎回一から表現する必要はありません。
リソース
| URI テンプレート | 説明 |
|---|---|
epg://{bu}/{channel_id}/{date} | SRF、RTS、RSI のテレビ/ラジオ番組の日別ガイド(例:epg://srf/srf-1/2026-04-30) |
votation://{votation_id} | 終了したスイスの国民投票の詳細な結果(例:votation://v1) |
EPG 局 ID — ハイフン区切りで、ライブストリーム ID とは異なります。
| 事業部門 | テレビ | ラジオ |
|---|---|---|
| SRF | srf-1、srf-2、srf-info | srf-1、srf-2、srf-2-kultur、srf-3、srf-4、srf-musikwelle、srf-virus |
| RTS | rts-1、rts-2、rts-info | LA1ERE、ESPACE2、COULEUR3、OPTION_MUSIQUE |
| RSI | la-1、la-2 | rete-uno、rete-due、rete-tre |
プロンプト
| 名前 | 引数 | 目的 |
|---|---|---|
analyse_abstimmungsverhalten | votation_id、focus(stadt_land/sprachregionen/kantone) | スイスの国民投票に関する体系的な分析 |
tagesbriefing_kanton | location、channel_id、business_unit、date | 天気と EPG を組み合わせた日次ブリーフィング |
利用可能なツール
ツールの命名規則
このサーバーでは、Python エコシステムの慣習に従い、ツール名に**snake_case**を使用しています。MCP のベストプラクティスでは、LLM のトークン化を最適化するためにcamelCaseが推奨されていますが、snake_caseも引き続き使用可能であり、ツール名を基盤となる Python 関数の識別子に合わせられます。
すべてのツールは、名前空間プレフィックス srgssr_と、意味のある<domain>_<action>の接尾辞を使ったパターン srgssr_<domain>_<action>に従います(例:srgssr_weather_current、srgssr_polis_get_votations)。
🌦️ SRF Weather(4 個のツール)
| ツール | 説明 | データソース |
|---|---|---|
srgssr_weather_search_location | geolocationIdを取得するため、地名または郵便番号で場所を検索します | SRF Meteo |
srgssr_weather_current | スイスの場所の現在の気象状況 | SRF Meteo |
srgssr_weather_forecast_24h | 24 時間の時間別予報 | SRF Meteo |
srgssr_weather_forecast_7day | 7 日間の日別予報 | SRF Meteo |
📺 動画(3 個のツール)
| ツール | 説明 | データソース |
|---|---|---|
srgssr_video_get_shows | 事業部門のテレビ番組を一覧表示します(character_filterで a–z/# を指定すると該当する頭文字の番組を取得し、省略すると全 27 種類を対象にします) | SRG SSR IL |
srgssr_video_get_episodes | 番組の最新エピソードを取得します | SRG SSR IL |
srgssr_video_get_livestreams | ライブテレビチャンネルを一覧表示します | SRG SSR IL |
🎙️ 音声(3 ツール)
| ツール | 説明 | データソース |
|---|---|---|
srgssr_audio_get_shows | ラジオチャンネルの番組一覧(channel_id が必須 — v2 API にはユニット単位の一覧取得機能がありません) | SRG SSR IL |
srgssr_audio_get_episodes | 番組の音声エピソードを取得します | SRG SSR IL |
srgssr_audio_get_livestreams | ラジオのライブ配信局一覧 | SRG SSR IL |
📅 EPG – 電子番組ガイド(1 ツール)
| ツール | 説明 | データソース |
|---|---|---|
srgssr_epg_get_programs | テレビまたはラジオチャンネルの1日の番組表 | SRG SSR IL |
🗳️ Polis – スイスの民主主義(3 ツール)
| ツール | 説明 | データソース |
|---|---|---|
srgssr_polis_get_votations | 1900 年以降の国民投票または州民投票 | Polis API |
srgssr_polis_get_votation_results | 特定の投票の詳細な結果 | Polis API |
srgssr_polis_get_elections | 1900 年以降の選挙結果 | Polis API |
対応する事業部門
| コード | 事業部門 | 言語 |
|---|---|---|
srf | SRF (Schweizer Radio und Fernsehen) | ドイツ語 |
rts | RTS (Radio Télévision Suisse) | フランス語 |
rsi | RSI (Radiotelevisione svizzera) | イタリア語 |
rtr | RTR (Radiotelevisiun Svizra Rumantscha) | ロマンシュ語 |
swi | SWI swissinfo.ch | 多言語 |
使用例
| クエリ | ツール |
|---|---|
| 「明日のチューリッヒの天気は?」 | srgssr_weather_forecast_24h |
| 「今夜、SRF 1 では何が放送されますか?」 | srgssr_epg_get_programs |
| 「Tagesschau の最新エピソードは?」 | srgssr_video_get_episodes |
| 「2010~2020 年のベルン州の国民投票は?」 | srgssr_polis_get_votations |
| 「マスク着用義務の提案に関する州ごとの投票結果は?」 | srgssr_polis_get_votation_results |
| 「現在放送中の RTS ラジオ番組をすべて教えてください」 | srgssr_audio_get_livestreams → srgssr_audio_get_shows |
→ 対象者別の使用例 →
アーキテクチャ
┌─────────────┐
│ Claude / LLM│
└──────┬──────┘
│ MCP (stdio)
┌──────▼───────────────────┐
│ srgssr-mcp Server │
│ ├─ Weather Tools (4) │
│ ├─ EPG Tools (1) │
│ ├─ Polis Tools (3) │
│ ├─ Video Tools (3) │
│ └─ Audio Tools (3) │
└──────┬───────────────────┘
│ HTTPS (OAuth2)
┌──────▼──────────────┐
│ SRG SSR Public APIs │
│ developer.srgssr.ch│
└─────────────────────┘
データソース
| ソース | データ | アクセス |
|---|---|---|
| developer.srgssr.ch | SRG SSR PUBLIC API V2(天気、A/V、EPG、Polis) | OAuth2(無料登録) |
クレジット表記: SRG SSR API にはSRG SSR 利用規約が適用されます。
開発フェーズ
このサーバーは フェーズ 1:読み取り専用ラッパー の段階です。
このサーバーが公開するのは、公開 SRG SSR API に対する GET 形式の操作のみです。設計上、書き込み、変更、削除の機能はありません。脅威モデルへの影響については安全性と制限を参照してください。
フェーズ 1 の完了基準
- 5 つのテーマ別クラスター(天気、動画、音声、EPG、Polis)にわたる 14 個の読み取り専用ツール
- トークンキャッシュを使用した OAuth2 クライアントクレデンシャル認証
- 2 言語のドキュメント(EN/DE)
- テストスイート(単体テスト+ライブテスト)— OPS-001を参照
- 構造化ログ — OBS-003および CHANGELOG を参照
- 本番環境に対応したエラーハンドリング(統一されたリトライ/バックオフ、型付きエラーエンベロープ)
今後のフェーズ
- フェーズ 2(書き込み): 予定されていません。 SRG SSR Public API は契約上読み取り専用であり、書き込み可能なアップストリームのインターフェースはありません。
- フェーズ 3(マルチエージェント): 評価を延期しました。 このサーバーが連携すべき具体的なマルチエージェントのワークフロー(例:
swiss-statistics-mcpまたはswiss-transport-mcpとのサーバー間集約)がユーザーフィードバックで示された時点で、再検討します。
MCP プロトコルバージョン
mcp 2.x は、同じサーバー上で2 つのプロトコル時代に対応しており、接続時のクライアントの最初のリクエストによって、どちらを適用するかが決まります。
| 時代 | リビジョン | 対応するクライアント |
|---|---|---|
initialize ハンドシェイク | 2024-11-05 … 2025-11-25 | 現在のクライアントが使用するプロトコルです。サーバーは要求されたリビジョンを返します。要求されたものがこれより新しい場合は、上限である 2025-11-25 を返します。 |
| リクエストごとのエンベロープ | 2026-07-28 | 2026-07-28 の _meta エンベロープを含むリクエストによって、最新形式の接続が開始されます。 |
src/srgssr_mcp/_app.py の PROTOCOL_VERSION は、最新の時代を示します。インポート時に、インストール済み SDK の SUPPORTED_PROTOCOL_VERSIONS に対して検証されます。ただし、このリストには後方互換性のため 2024-11-05 も含まれているため、このメンバーシップチェックで検出できるのはリビジョンの削除であり、ずれではありません。SDK に対する両方の時代の整合性は tests/test_protocol_version.py で確認しており、ずれを検出するのはこちらです。バージョンの更新は、対応するリリースの CHANGELOG.md に記録されます。
サーバーが実際に送信する内容
上の表は以前、SDK 定数に対する主張にすぎませんでした。現在は tests/test_spec_2026_07_28.py で、MCPServer.streamable_http_app() を使い、httpx.ASGITransport 経由で実際のリクエストを送信し、両方の時代について応答を検証しています。この測定によって確認できる内容は次のとおりです。
| プロパティ | 通信内容 |
|---|---|
| 最新形式の入口 | server/discover。initialize も Mcp-Session-Id も使わず、supportedVersions: ["2026-07-28"] を返します。 |
| ハンドシェイクの上限 | initialize で 2026-07-28 を要求したクライアントには、実測で 2025-11-25 が返されます。推測ではありません。 |
| サーバーの識別情報 | io.modelcontextprotocol/serverInfo は、最新形式のすべての結果の _meta に含まれ、インストール済みパッケージのバージョンを示します。 |
| 鮮度(SEP-2549) | server/discover と 4 つの一覧取得メソッドに、ttlMs: 300000 と cacheScope: public が設定されます。 |
| ツールの表示名 | BaseMetadata に従った title を設定し、ハンドシェイク時代のクライアントはここからしか読み取らないため、annotations.title にも反映します。 |
2026-07-28 で廃止 | ping、logging/setLevel、resources/subscribe、resources/unsubscribe、tasks/* は -32601 を返します。 |
| ロギング機能 | 宣言も使用もしません。SEP-2577 により 2026-07-28 から非推奨となっており、同形式での配信はリクエストごとのオプトインであるため、サーバーは利用を前提にできません。ツールの動作は stderr の structlog に出力されます。詳しくは src/srgssr_mcp/tools/__init__.py を参照してください。 |
425 件のテストが成功し、カバレッジが 96% だった初回の実行で、この測定の価値が明らかになりました。serverInfo.version は空文字列で、すべての tools/call が isError を返していました(FastMCP 1.x の ctx.info(msg, **kwargs) という呼び出し形式が mcp 2.x では拒否されていました)。さらに、8 つのツールが、公開している独自の inputSchema が示す列挙文字列を拒否していました(ConfigDict(strict=True) は列挙型のインスタンスを要求しますが、JSON ペイロードでそのような値を渡すことはできません)。いずれもプロセス内部からは見えません。だからこそ、通信内容のテストが必要なのです。
更新ポリシー
- SDK の依存関係の更新は Dependabot(
.github/dependabot.yml、月次、mcp-sdkラベルでグループ化)経由で行い、マージ前にテストスイート全体を実行します。 - 仕様の更新は機能ブランチで関連する MCP SDK リリースに照らして評価します。破壊的変更の確認には、公式 MCP changelog を正とします。
- 仕様バージョンの更新は必ず
CHANGELOG.mdに記録します。また、外部から観測できる通信契約に変更がある場合は、セマンティックバージョニングに従ってマイナーリリースまたはメジャーリリースを行います。
プロジェクト構成
srgssr-mcp/
├── src/srgssr_mcp/
│ ├── __init__.py # Package
│ └── server.py # MCPServer: 15 tools, OAuth2 client
├── .github/
│ └── workflows/
│ └── ci.yml # GitHub Actions CI (Python 3.11–3.13)
├── pyproject.toml # Build configuration (hatchling)
├── CHANGELOG.md
├── CONTRIBUTING.md # English
├── CONTRIBUTING.de.md # German
├── SECURITY.md # Security policy (English)
├── SECURITY.de.md # Security policy (German)
├── LICENSE # MIT
├── README.md # This file (English)
└── README.de.md # German version
🛡️ 安全性と制限
| 項目 | 詳細 |
|---|---|
| アクセス | 読み取り専用 — サーバーは SRG SSR API から読み取るだけで、コンテンツの投稿、変更、削除はできません |
| 個人データ | 個人データはありません — すべてのエンドポイントは、公開されている放送メタデータ、気象観測データ、過去の投票・選挙結果を提供します |
| レート制限 | developer.srgssr.ch での OAuth2 アプリケーションのプランに応じた制限が適用されます。サーバーはクエリごとに適切な上限(例:エピソードは最大100件、一覧取得1回あたりの番組は最大50件)も設定しています |
| タイムアウト | 上流 API の呼び出しごとに30秒 |
| 認証 | OAuth2 クライアントクレデンシャル(無料登録)。シークレットはローカルに保管され、ログに記録されることはありません |
| ライセンスと利用 | SRG SSR API は非商用利用向けです。商用利用には [email protected] からの書面による許可が必要です |
| 利用規約 | SRG SSR Developer Terms of Use が適用されます — 帰属表示と規約遵守の責任は引き続きユーザーが負います |
既知の制限
- レート制限: SRG SSR API にはレート制限があります。OAuth2 アプリケーションのプランについては、developer.srgssr.ch をご覧ください
- データの鮮度: EPG データには最大6時間の遅延が生じる場合があります
- 過去のデータ: Polis データは1900年まで遡ります。それより古いデータは利用できません
- 地域制限: 一部のストリーミング API はスイス国内でのみ利用できます
- API キーが必要: SRG SSR API の利用には、developer.srgssr.ch から取得できる無料の OAuth2 認証情報が必要です
- 非商用利用: SRG SSR API の規約により、[email protected] から明示的な許可を得ない商用利用は禁止されています
- 天気情報の対象地域: SRF Meteo の対象地域はスイスのみです
コントリビューション
CONTRIBUTING.md(英語) · CONTRIBUTING.de.md(ドイツ語)をご覧ください
セキュリティ
セキュリティ対策の全容、脆弱性の報告手順、および受容済みリスク一覧については、SECURITY.md(英語) · SECURITY.de.md(ドイツ語)をご覧ください。 主要なエグレス制御の概要を以下に示します。
エグレス許可リスト
サーバーは、意図しない外部リクエストを防ぐため、コード層のエグレス許可リスト(SEC-021、SEC-004 の SSRF 防御と併用)を実装しています。すべての送信 HTTP リクエストは、送信前に src/srgssr_mcp/_http.py の _validate_url_safe() で検証されます。
リクエストごとに適用される3つの制御:
- HTTPS のみ —
http://、file://、ftp://など、HTTPS 以外のスキームは拒否されます。 - ホスト許可リスト — URL のホスト名は
ALLOWED_HOSTS = {"api.srgssr.ch"}と完全一致する必要があります(完全一致のため、api.srgssr.ch.attacker.exampleのようなサブドメインを悪用する手口はブロックされます)。OAuth2 トークンエンドポイントとすべてのデータエンドポイントを、1つのホストでカバーします。 - IP ブロックリスト — ホスト名に対して解決されたすべての IP が、プライベート、ループバック、リンクローカル(
169.254.169.254のクラウドメタデータを含む)、CGNAT、マルチキャスト、および予約済みの範囲(IPv4 + IPv6)に該当しないか検査されます。1つでも該当すればリクエストは中止されます — DNS リバインディングに対する多層防御です。
違反は ValueError として検出され、_handle_error によってローカライズされた Konfigurationsfehler: … メッセージに変換されるため、内部ネットワークの詳細が MCP クライアントに漏れることはありません。
SRG SSR の新しいドメインを追加する場合:
src/srgssr_mcp/_http.pyのALLOWED_HOSTSを更新します。- PR と
CHANGELOG.mdに理由を記載します。 tests/test_unit.pyに正常系のテストケースを追加します(test_validate_url_safe_accepts_public_srgssr_hostを参考にしてください)。
ネットワーク層のエグレス(将来の SSE/HTTP デプロイ向け): docs/network-egress.md をご覧ください。現在の stdio トランスポートにはネットワーク層の制御は適用されません — プロセスは MCP クライアントのユーザーコンテキストで実行されます。
ロギング
このサーバーでは、structlog を使用した 構造化ロギング(OBS-003)を採用し、JSON を stderr に出力します。これにより、stdio トランスポートの JSON-RPC 通信に使用する stdout をクリーンに保ちます。
形式:
- 1 行につき 1 件の JSON エンコードされたイベント
- すべてのレコードに ISO 8601 UTC の
timestamp - RFC 5424 の重大度レベル:
debug、info、notice、warning、error、critical、alert、emergency - 呼び出しごとにバインドされるコンテキスト:
tool、business_unit、channel_id、queryなど
出力例:
{"event": "tool_invoked", "tool": "srgssr_weather_search_location", "query": "Bern", "level": "info", "logger": "mcp.srgssr.weather", "timestamp": "2026-04-30T14:23:45.123Z"}
{"event": "tool_succeeded", "tool": "srgssr_weather_search_location", "query": "Bern", "result_count": 3, "matched_variant": "Bern", "level": "info", "logger": "mcp.srgssr.weather", "timestamp": "2026-04-30T14:23:45.456Z"}
ログレベル(RFC 5424):
| レベル | 用途 |
|---|---|
debug | OAuth トークンキャッシュのヒット、内部状態 |
info | ツールの呼び出し、成功した応答、サーバーのライフサイクル |
warning | 回復可能な状態(レート制限が近づいている、未対応の事業部門) |
error | API の失敗、タイムアウト(回復可能) |
critical | 認証情報の問題、サービスの機能低下 |
設定:
デフォルトのレベルは info です。SRGSSR_LOG_LEVEL 環境変数(debug、info、warning、error、critical)で上書きできます。
SRGSSR_LOG_LEVEL=debug srgssr-mcp
JSON 出力はアグリゲーターで扱いやすい形式です。stderr を Datadog、Splunk、Loki などにパイプし、正規表現による解析なしで構造化フィールド(tool、business_unit、level)を使ってフィルタリングできます。
テスト
# Unit tests (no network required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (requires SRG SSR API keys)
PYTHONPATH=src pytest tests/ -m "live"
# Linting
ruff check src/
変更履歴
CHANGELOG.md を参照してください。
データソースとライセンス
このサーバーが公開するすべてのデータは、単一の上流プロバイダーである SRG SSR Public API V2(https://api.srgssr.ch)からリアルタイムで取得されます。各ツールの戻り値は型付きの Pydantic BaseModel であり、最上位に source/license/provenance_url/fetched_at を含みます。そのため、下流の利用者はこの README を再度参照することなく、データの出所を記録できます。SDK は tools/list マニフェストで対応する outputSchema を公開するため、MCP クライアントは後続の呼び出しを正確に計画できます。
| クラスター | プロバイダー | ライセンス | 備考 |
|---|---|---|---|
| 天気 | SRF Meteo (api.srgssr.ch) | SRG SSR Terms of Use | スイス国内に限定 |
| 動画/音声/EPG | SRF · RTS · RSI · RTR · SWI | SRG SSR Terms of Use | メタデータのみ。ストリーム URL は再配布されません |
| Polis(住民投票/選挙) | SRG SSR Polis | SRG SSR Terms of Use | 1900 年以降の履歴データ |
SRG SSR API の利用
- 非商用利用:無料で、申請は不要です。
- 商用利用:[email protected] を通じた書面による許可が必要です。
このサーバーの MIT ライセンスが対象とするのはソースコードのみであり、上流のデータを再ライセンスするものではありません。
ライセンス
MIT License — LICENSE を参照してください。
このプロジェクトで使用する SRG SSR API には、SRG SSR Terms of Use が適用されます。
作者
Hayal Oezkan · github.com/malkreide
クレジットと関連プロジェクト
- データ: SRG SSR Developer Portal · SRF Meteo · Polis API
- プロトコル: Model Context Protocol – Anthropic / Linux Foundation
- 関連プロジェクト:
| サーバー | 説明 |
|---|---|
| zurich-opendata-mcp | チューリッヒ市のオープンデータ(OSTLUFT の大気質、天気、駐車場、地理データ) |
| swiss-transport-mcp | スイスの公共交通機関 – OJP 2.0 の経路検索、SIRI-SX の運行障害 |
| swiss-environment-mcp | BAFU の環境データ – 大気質、水文学、自然災害 |
| swiss-statistics-mcp | BFS STAT-TAB – 682 件の統計データセット |
| fedlex-mcp | Fedlex SPARQL によるスイス連邦法 |
連携例: 「2020 年にチューリッヒ州で行われた国民投票の結果はどうでしたか?投票率は全国平均と比べてどうでしたか?」
→ srgssr-mcp(Polis、州の結果)+ swiss-statistics-mcp(BFS、投票率データ)
- ポートフォリオ: Swiss Public Data MCP Portfolio
インストール
uv の uvx 経由で実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json のトップレベルキー servers を使用します)。
{
"mcpServers": {
"srgssr-mcp": {
"command": "uvx",
"args": [
"srgssr-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。