3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Radiko MCPサーバーの作り方

Last updated at Posted at 2025-11-22

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というファイル名でプロジェクトフォルダに保存します。

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というファイル名でプロジェクトフォルダに保存します(ファイル名は任意で大丈夫です)。

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として見えています。

image.png

ここまで設定できれば、タスクとして「Tokyo FMを再生して」のように入力すると次のようにMCPサーバーを使用してくれます。

image.png

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によるプログラミングまで体系的に学べます。
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?