Radikoでラジオ局を指定した再生、停止ができるMCPサーバーを作ることができたので、作り方や使い方についてまとめます。PythonのFastMCPというライブラリを使うことにより少ないコード量で作成でき、Linux PCやラズパイ等のシングルボードコンピュータ(SBC)で実行できます。
筆者はRaspberryPi Zero 2Wで実行しています。他のLinux PCと同じように実行できますが、イヤホンジャックが無いためUSBスピーカーをOTGポート(micro-B)に接続する必要があります。
また、タイトルから少し脱線しますが、記事の最後で「スタックチャン」という手のひらサイズのコミュニケーションロボットをAIエージェント(MCPホスト)として音声操作でRadiko MCPサーバを制御する事例も紹介します。
1. 開発環境
- Linux PCまたはSBC (スピーカー搭載)
- Python3
- ライブラリ:FastMCP
2. 作り方
2.1. 必要なソフトウェアをインストール
uvをインストール
こちらの記事等を参考にインストールします。
uv の使い方 @npaka
プロジェクトを作成
uvのプロジェクトを作成します。以降はこのプロジェクトのフォルダ内で作業します。
uv init -p 3.10 project
cd project
Radikoの再生に必要なソフトウェアをインストール
streamlinkとmpvというソフトを使います。
uv add streamlink
sudo apt update
sudo apt install mpv
FastMCPライブラリをインストール
uv add fastmcp
2.2. Linux上でRadikoの再生ができることを確認
プログラムを書く前に、まずはLinuxのコマンドでRadikoを再生できることを確認します。先ほどインストールしたstreamlinkとmpvを使用します。
次のスクリプトをradiko.shというファイル名でプロジェクトフォルダに保存します。
#!/bin/sh
.venv/bin/streamlink -p mpv http://radiko.jp/#!/live/$1 best
次のようにスクリプトを実行してラジオの音声が再生されればOKです(再生されるまでに10秒程度かかります)。引数でラジオ局を指定しています(FMTはTokyo FM)。Ctrl+cで終了できます。
./radiko.sh FMT
2.3. MCPサーバーのプログラミング
次のPythonスクリプトをmain.pyというファイル名でプロジェクトフォルダに保存します(ファイル名は任意で大丈夫です)。
from fastmcp import FastMCP
from subprocess import Popen
mcp = FastMCP("Radiko MCP Server")
# ラジオ局リスト: TOKYO FM, J-WAVE, bayfm78, NACK5, FMヨコハマ
cmd = 'exec .venv/bin/streamlink -p mpv http://radiko.jp/#!/live/'
stations = ['FMT', 'FMJ', 'BAYFM78', 'NACK5', 'YFM']
# グローバル変数としてプロセスを保持
p = None
@mcp.tool()
def play(station: int) -> str:
'''
Play radio.
Args:
station: station id (0:TOKYO FM, 1:J-WAVE, 2:bayfm, 3:NACK5, 4:FM yokohama)"
Returns:
result
'''
global p
if p is not None:
try:
p.kill()
except Exception:
return 'ラジオ局の切り替えに失敗しました'
pass
p = Popen(cmd + stations[station] + ' best', shell=True)
return 'ラジオを再生中'
@mcp.tool()
def stop() -> str:
'''
Stop radio.
Returns:
result
'''
global p
if p is not None:
try:
p.kill()
except Exception:
return 'ラジオの停止に失敗しました'
pass
p = None
return 'ラジオを停止しました'
return 'ラジオは再生されていません'
if __name__ == "__main__":
mcp.run(
transport="sse",
host="0.0.0.0",
port=8010
)
FastMCPのおかげで非常にシンプルなコードになっています。簡単に説明すると、次の2つの機能を定義しています。
- ラジオ再生 (Play radio)
- 先ほど試したstreamlink+mpvによる再生をPopen()で実行する。引数としてラジオ局のIDを受け取る。
- ラジオ停止 (Stop radio)
- ラジオを再生しているプロセスをkill()で停止する。
mcp.run()でMCPサーバーを起動するときに引数を「transport="sse"」とすることで、トランスポートをStreamable HTTPとしています。こうすることで、異なるPCからでもIPアドレスとポートを指定することでこのMCPサーバーを利用することができます。
3. 使い方
3.1. Clineで使用する例
VSCodeの拡張機能ClineでRadiko MCPサーバーを利用する方法です。Cline自体のインストールやLLMのAPIキーの登録等は予め済ませておいてください。
Cursor等他のツールでも利用できるはずです(試してはいません)。注意点として、Claude Desktopは現在Streamable HTTPには対応していないようです。
作成したMCPサーバーを実行しておきます。
cd (プロジェクトフォルダ)
uv run main.py
Clineの「Config MCP Servers」で次のようにRadiko MCPサーバーを追加します。
{
"mcpServers": {
"radio": {
"autoApprove": [],
"disabled": false,
"timeout": 60,
"url": "http://(MCPサーバーPCのIPアドレス):8010/sse",
"type": "sse"
}
}
}
接続できると、次のようにMCPサーバーとして登録されます。作成したplay、stopの機能がToolsとして見えています。
ここまで設定できれば、タスクとして「Tokyo FMを再生して」のように入力すると次のようにMCPサーバーを使用してくれます。
3.2.【番外編】スタックチャンで使用する例
ClineからRadiko MCPサーバーを使用できることを確認しましたが、日常のシーンとしてはあまり実用的ではないかもしれません。そこで、もう少し実用的な例として、コミュニケーションロボット「スタックチャン」を通して音声指示でラジオを再生する例を紹介します。
スタックチャンって何?という方はこちらの私が過去に書いた記事などをご参照願います。
私がGithubで公開しているスタックチャンのファームウェア「AI Stack-chan Ex」は、OpenAI APIを利用した会話機能、及びMCPクライアント機能を実装しています。SDカードのYAMLファイルでMCPサーバーを登録することで、次の動画のように会話を通してMCPサーバーの機能を利用することができます。
ファームウェアのビルド、書き込み、YAMLの設定方法などはREADMEに詳しく記載していますので、ぜひトライしてみてください。もしわかりづらい点があれば、スタックチャンのDiscord等で質問いただければ可能な限りサポートします。
参考文献
-
Radiko Jukebox製作記(Raspberry Pi) @makoto_yamashita
- ラズパイでRadikoを再生する方法について参考にさせていただきました。
- PythonではじめるMCP開発入門(講談社 著者: 李 碩根, からあげ, 渡邊 拓夢)
- MCPの基礎知識からFastMCPによるプログラミングまで体系的に学べます。

