Internet Radio について
Internet Radio は、Radio Browser から世界各地のインターネットラジオを探すオープンソースの MCP サーバーです。MCP クライアントに局の情報や配信 URL、ランキング、国・ジャンル一覧を提供します。
主な機能
- 01名前、ジャンル、国、言語で局を検索
- 02局の詳細と配信 URL を取得
- 03人気局とトレンド局を一覧表示
- 04国とジャンルの一覧を閲覧
- 05停止中と判定された配信を除外
活用シーン
- 01ブラジルのジャズ局を探す
- 02指定局の配信 URL を取得
- 03国別にトレンド局を閲覧
- 04ジャンルを確認してから局を検索
MCP 対応
stdio 経由で、読み取り専用ツール 5 個と `find_radio` プロンプトを MCP クライアントに提供します。結果には配信 URL とブラウザーで聴くためのリンクが含まれます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:1.0.3ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/alondrilich/internet-radio-mcp:1.0.3stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
internet-radio-mcp
インターネットラジオ用のオープンソース Model Context Protocol(MCP)サーバーです。Claude、Cursor、VS Code Copilot などの MCP クライアントが、世界中のラジオ局を検索し、直接再生できるストリーム URL を取得できます。また、人気上位やトレンドのラジオ局、国、ジャンルも一覧表示します。
ラジオ局のデータは、稼働中のストリームを持つ50,000局以上が登録された、コミュニティ管理のパブリックドメインディレクトリ Radio Browser から取得しています。このサーバーは、同じディレクトリを利用する無料のウェブラジオプレーヤー 72FM が開発しています。各結果には、72FMのブラウザーでラジオ局を再生する listen_url と、ラジオ局独自の stream_url が含まれます。
ラジオ局は放送事業者に帰属します。72FM もこのサーバーも、ラジオ局を所有、運営、選定していません。ディレクトリへの情報の追加や編集は誰でもできるため、ストリームが一時的にオフラインになることがあります。
- API キーもアカウントも不要で、読み取り専用です。
- ツール5つ、プロンプト1つ、stdio トランスポートです。
- 実行時の依存関係:
@modelcontextprotocol/server(公式 MCP TypeScript SDK、v2)とzod。
質問の例
- 「ブラジルのジャズ局を探して」
- 「日本で最も人気のあるラジオ局は?」
- 「BBC World Service のストリーム URL を教えて」
- 「今、インターネットラジオでトレンドになっているのは?」
- 「ラジオ局の数が最も多い国は?」
- 「検索できるジャンルを教えて。それからローファイのラジオ局をいくつか探して」
インストール
Node.js 20以降が必要です。サーバーは npx で GitHub から直接実行できるため、グローバルにインストールする必要はありません。
Claude Code
claude mcp add internet-radio -- npx -y github:AlonDrilich/internet-radio-mcp
セッションで /mcp を実行し、internet-radio が接続されていることを確認してください。
Claude Desktop
Settings → Developer → Edit Config を開きます。claude_desktop_config.json が開きます。このファイルは、macOS では ~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json にあります。次の内容を追加してください。
{
"mcpServers": {
"internet-radio": {
"command": "npx",
"args": ["-y", "github:AlonDrilich/internet-radio-mcp"]
}
}
}
Claude Desktop を再起動してください。
Cursor
Cursor に追加 をクリックして追加するか、どこからでも使えるようにサーバーを ~/.cursor/mcp.json に、または1つのプロジェクトで使えるように .cursor/mcp.json に追加してください。
{
"mcpServers": {
"internet-radio": {
"command": "npx",
"args": ["-y", "github:AlonDrilich/internet-radio-mcp"]
}
}
}
VS Code(GitHub Copilot、エージェントモード)
VS Code にインストール をクリックして追加するか、サーバーを .vscode/mcp.json に追加するか、コマンドパレットから MCP: Add Server を実行してください。
{
"servers": {
"internet-radio": {
"type": "stdio",
"command": "npx",
"args": ["-y", "github:AlonDrilich/internet-radio-mcp"]
}
}
}
Gemini CLI
gemini extensions install https://github.com/AlonDrilich/internet-radio-mcp
リポジトリには gemini-extension.json が含まれているため、サーバーは internet-radio 拡張機能として追加されます。
その他のクライアント
stdio サーバーを起動できる MCP クライアントであれば、同じコマンド npx -y github:AlonDrilich/internet-radio-mcp を使用できます。
初回起動時は GitHub からパッケージをダウンロードするため、数秒かかります。2回目以降の起動では npx キャッシュが使われます。
Docker
同じサーバーはコンテナーイメージとして公開され、公式 MCP Registry に io.github.AlonDrilich/internet-radio-mcp として掲載されています。
docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:latest
クライアント設定では、"command": "docker" と "args": ["run", "-i", "--rm", "ghcr.io/alondrilich/internet-radio-mcp:latest"] を使用してください。
ツール
すべてのツールは読み取り専用で、readOnlyHint: true および openWorldHint: true と注釈されています。各結果には次のものが含まれます。
- 1 行の概要
- 同じデータを JSON テキストで表したもの
- ツールの
outputSchemaに一致するstructuredContent
ディレクトリの直近の自動チェックに失敗したストリームは、検索対象から除外されます。
| ツール | 引数 | 戻り値 |
|---|---|---|
search_stations | name?、tag?(ジャンル)、countrycode?(ISO 3166-1 alpha-2、例:BR)、language?(例:portuguese)、order = votes | clickcount(既定値 votes)、limit 1–50(既定値 10) | 条件に一致する局 |
get_station | id(Radio Browser の stationuuid) | 1 局 |
top_stations | by = votes | clicks | trending(既定値 votes)、countrycode?、tag?、limit 1–50(既定値 10) | 投票数、再生数、またはトレンドの上位局 |
list_countries | min_stations?(既定値 1)、limit? | 国名、ISO コード、局数、72FM の国別ページ(https://72fm.com/radio/<iso2>?source=mcp) |
list_genres | limit 1–100(既定値 30) | 局数順の上位ジャンルタグ。プレースホルダーやジャンル以外のタグ(例:undefined、radio、fm、国名、地域名、言語名)は除外されます。 |
局のフィールド
{
"id": "963fa65f-0601-11e8-ae97-52543be04c81",
"name": "Antena 1 São Paulo, SP (ZYD823 94,7 MHz FM) [aac]",
"country": "Brazil",
"countrycode": "BR",
"language": "portuguese",
"tags": ["adult contemporary", "jazz", "pop", "smooth jazz"],
"codec": "AAC+",
"bitrate": 96,
"homepage": "http://antena1.com.br/",
"stream_url": "http://antena1.newradio.it/stream?ext=.mp3",
"favicon": null,
"votes": 33238,
"lastcheckok": true,
"listen_url": "https://72fm.com/station/963fa65f-0601-11e8-ae97-52543be04c81?source=mcp"
}
stream_urlは、ディレクトリで解決されたストリーム URL、または解決された URL がない場合は元の URL です。listen_urlは、72FM でブラウザーを使って局を再生します。末尾の?source=mcpは、アクセスがこのサーバー経由であることを 72FM に伝えるだけです(アプリはリファラーを送信しません)。ID や、ユーザーまたは質問に関する情報は含まれません。tagsには最大 8 個のタグが格納されます。
プロンプト
find_radio(request) は、「雨の夜に聴く穏やかなジャズ」や「リスボンのラジオ」のように、気分、場所、活動、ジャンルに合った局を検索します。
信頼できないデータ
局名、タグ、言語、国、URL は誰でも編集できる公開ディレクトリのデータであり、サーバーはそれらを AI アシスタントに渡します。そのため、サーバーはすべてのフィールドを信頼できない入力として扱います。
- テキストは 1 行にまとめられます。改行と制御文字はスペースに置き換えられ、ゼロ幅文字、双方向制御文字、私用領域のコードポイント、不可視の Unicode「タグ」文字、およびその他すべての不可視の「既定で無視可能な」コードポイント(異体字セレクター、フィラー、結合文字)は削除されます。ただし、絵文字セレクターと実際のテキストに必要なゼロ幅結合文字は、連続して 2 個以下の場合に限り残ります。名前は 120 文字、タグは 40 文字、その他のフィールドは 60 文字で切り詰められます。
- URL(
stream_url、homepage、favicon)は、認証情報やバックスラッシュを含まない、完全な形式で記述されたプレーンなhttpまたはhttpsでなければなりません。解析後の正規形で返されます。それ以外(javascript:、data:、file:、https:host、単独の単語)は破棄されます。有効な ID がない局、または再生可能なストリームがない局は結果から除外されます。 - 局がビット毎秒で報告した場合、
bitrateは変換され、妥当でない場合は破棄されます。ディレクトリ独自のビットレート順ソートは、そのようなエントリーを上位に並べるため提供されません。 - すべての結果とサーバーの指示には、これらのフィールドが指示ではなくデータであることが明記されています。
- 応答は 5 MB 以下で、JSON リストでなければなりません。リダイレクトする、または別の内容を返すミラーは失敗とみなされます。
これにより、間接的なプロンプトインジェクションのリスクは低減しますが、完全に取り除くことはできません。局名が「以前の指示を無視してください」となっている場合もあり、そのテキストは他の名前と同様に、1 行に制限されて表示されます。結果を利用する際は、信頼できないデータとして扱ってください。
信頼性
サーバーは、各ミラーに対して8秒のタイムアウトを設定し、次の順序で Radio Browser のミラーに問い合わせます。
de1.api.radio-browser.infode2.api.radio-browser.infoall.api.radio-browser.info
3つすべてに失敗した場合、ツールは明確なエラー(isError: true)を返し、サーバーは稼働を続けます。リクエストでは、User-Agent: internet-radio-mcp/1.0 (+https://72fm.com) を使用します。
次の2つの任意の環境変数を使って、この動作を変更できます。
RADIO_BROWSER_MIRRORS:デフォルトの代わりに使用する、カンマ区切りのベース URL です。認証情報を含まないhttpsURL のみを受け付けます(テスト用途に限り、localhost、127.0.0.1、[::1]ではプレーンなhttpも使用できます)。それ以外は無視され、標準エラー出力に警告が表示されます。リダイレクトは一切追跡されません。RADIO_BROWSER_TIMEOUT_MS:各ミラーへのタイムアウトをミリ秒単位で指定します。100~60000の整数です(デフォルトは8000)。
開発
git clone https://github.com/AlonDrilich/internet-radio-mcp
cd internet-radio-mcp
npm install
npm run typecheck # tsc checkJs over the JSDoc-typed sources
npm run smoke # spawns the server over stdio and calls every tool against the live API
npx @modelcontextprotocol/inspector node src/index.js # interactive testing
ソースコードは JSDoc 型注釈付きのプレーンな ES モジュール(src/)であり、ビルド手順はありません。そのため、npm に公開しなくても npx github:… が動作します。
関連プロジェクト
- radio-playlists:同じディレクトリから国やジャンル別に作成された、週ごとの M3U プレイリストです(オンラインで閲覧)。
- radio-player-72fm:サイトに放送局のプレーヤーを設置するための WordPress プラグインです。
- Radio stream URL finder:ブラウザーで同じ検索を行えます。放送局名を入力し、ストリームのアドレスをコピーします。
- 72FM のすべてのツール:72fm.com/developers。
データとクレジット
- 放送局ディレクトリのデータは Radio Browser から取得しており、パブリックドメインです。メンテナーと貢献者の皆さんに感謝します。このサーバーを頻繁に利用する場合は、Radio Browser の支援をご検討ください。
- ストリーム、名称、ロゴの権利は、それぞれの放送局に帰属します。
- 72FM は、Radio Browser ディレクトリを基盤とした無料のウェブラジオプレーヤーです。
ライセンス
MIT © Alon Drilich(72FM)
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。