Roon MCP Server を Open WebUI / MCPO で使う

 
新しいテクノロジーに飛びつくのは楽しいが、自分の経験と視点によっては、「とっつきやすさ」にかなり依存する。
 
例えば、仮想環境はとっつきやすい。理由は単純で、誰もが知っているOSが立ち上がるからだ。
一方でDockerやKubernetesになると話は変わる。OSが起動するわけではなく、アプリケーションが起動する。コンテナの中で何が動いているのか、どのような役割を持っているのかがイメージできなければ理解しにくい。
さらにAPIになると、画面すら存在しない。データのやり取りや処理の手順を理解する必要がある。「なぜJSONなのか?」という疑問が、「JSON便利だよね」という感覚に変わるあたりからようやく面白くなってくる。
 
データの世界も似ている。
ファイルサーバであれば、ファイルサイズや転送速度を見ればOSやツールの出力の数字だけをみていればある程度理解できる。しかしオブジェクトストレージになると話は違う。IOPSやMB/sだけではなく、レイテンシやパーセンタイルの考え方が出てくる。理解のハードルは一気に上がる。
 
AIやビッグデータになるとさらに難しい。
システムを構築しただけでは何も起きない。どんなデータがあり、それをどう処理し、その結果何が得られるのかという流れを理解して初めて価値が生まれる。
さらに入力出力も、キーボード、ファイルI/Oだけではなく、WebHookという概念も出てくる。
 
こういったことに日々ついていく必要がある。新卒の頃は周囲に教えてくれる人もいる。しかし経験を積むにつれて、教わる機会は減っていく。気付けば、自分で見つけ、自分で学び、自分で試すしかなくなる。とはいえ、それが簡単にできるわけでもない。
 
世間では、テクノロジーが進化する一方で、自分が慣れ親しんだレイヤーばかりを見てしまい、隣接レイヤーに注意を払わなくなりがちである。それで、この悩みが起きる。私はこれを勝手に「Technology Slipstream からの脱落」と呼んでいる。テクノロジーのトラックの後ろにしがみついて走っているつもりなのだが、気付くと加速についていけず振り落とされる。今までの知識や経験が無意味になるわけではない。しかし、新しいレイヤーへ移動するための視点を持たないと、ある日突然、自分が何も分からない場所に立っていることに気付く。これは今の仕事に集中しすぎたり、今の立場に満足しすぎたりすると起きやすい。例えばITに限らず、製品ベンダーの人は自社製品について知っていれば仕事には困らない。いわば「誰がいったんですが?どこに書いてあるんですか?サポートされるんですか?」で済んでしまう世界。しかし、その製品が解決している問題や周辺技術に興味を持たなければ、外に出た瞬間に何も分からなくなる。自分も全く人のことは言えないのだが。
 
そしてAIやデータ活用の領域になると、新しく立ちはだかるのは、個人は処理すべきデータを持っているのだろうか、という問題である。
企業なら販売データ、顧客データ、在庫データ、アクセスログなど、分析対象はいくらでもある。
しかし個人となると意外と難しい。
連絡先くらいしか思い浮かばない。その連絡先を活用となると思いつかない。
少なくとも私はそう思っていた。
 
ところが、よく考えてみると、実は手元に大量のデータが存在していた。
しかも、長年蓄積されていて、継続的に増え続けており、人によって内容が大きく異なるデータである。
 
それが音楽データだ。
 
音楽ファイルは単なる「曲」ではない。
 
 
アーティスト、アルバム、曲名だけではなく、発売年、作曲者、演奏者、参加ミュージシャン、ジャンル、レーベル、さらには関連アーティストまで、実に多くの情報を持たせることができる。
しかし、それらを自力で整理し、メタデータとして管理するのは現実的ではない。
 
そこで登場するのがRoonである。
 
Roonは音楽ファイルを解析し、自動的に豊富なメタデータを付与してくれる。これが俗に言う「Roonの魔法」だ。
アルバムを開けば、関連アーティストが表示される。参加ミュージシャンをたどれば別の作品へ辿り着く。単なる音楽ファイルが巨大な知識グラフへと変化する。
逆に言えば、Roonを解約した瞬間、その魔法は無惨、木っ端微塵に解ける。
残るのはMP3やFLACといった音楽ファイルだけだ。一度この体験をしてしまうと、なかなか元には戻れない。
 
そして今回試したのは、そのRoonをMCPサーバ経由でLLMに接続することである。
 
音楽データ → Roonによるメタデータ付与 → MCPサーバ → LLM → 音楽再生
 
という流れになる。
 
Roonだけでも音楽体験は大きく変わる。しかしLLMが加わるとさらに面白い。
 
もはや音楽プレイヤーを操作している感覚ではない。
 
「最近聴いていない80年代女性ボーカルを流して」
「今流れている曲に近い曲を探して」
「金曜の朝に合うプレイリストを作って」
 
そんな曖昧なお願いが成立する。
 
音楽データがコンテンツになり、コンテンツが対話になる。Roonの魔法に、LLMという新しい魔法が加わった瞬間だった。
 
 
rwav-bridgeをインストール
 
 
Linuxの例だがMACとかもあった。
wget https://github.com/calibress/rwav-bridge/releases/download/v1.1.6/rwav-bridge-linux_1.1.6_amd64.deb
dpkg -i rwav-bridge-linux_1.1.6_amd64.deb
rm rwav-bridge-linux_1.1.6_amd64.deb
 
Roon Extensionに表示されるので、Enableにする。(初めてExtensionを使った。)
 
以下、Roon ServerのIPは、192.168.1.25として記載する。
 
動作確認
curl http://192.168.1.25:3002/version | jq
 
curl http://192.168.1.25:3002/capabilities | jq
 
 
Docker イメージの生成
 
MCPOのイメージに以下を追加して、再度ビルド
Dockerの部分は、もう今更感があるのと各人のお作法があるとおもうので必要最低限で記載。
# Install Roon MCP
RUN npm install -g @calibress/rwav-bridge-mcp
 
 
MCPOに登録
 
mcpoのconfig.json
RWAV_BASEにRoon ExtensionのIPを入れておく。
“roon”: {
    “command”: “rwav-bridge-mcp”,
     “env”: {
        “RWAV_DISCOVERY”: “manual”,
        “RWAV_BASE”: “http://192.168.1.25:3002”
      }
    }
 
 
MCPサーバの動作確認
 
以下は自分の例。適宜自身のMCPOサーバに読み替えてほしい
http://192.168.1.2018000/roon/docs
 
List Zoneを実行して動作確認
 
あとは、登録して終わり。
 
使えるツール
APIのページ眺めてもいいのだがLLM経由で聴いてみた。
整理して教えてくれる。ちょっと高機能すぎる。
 
Roon MCPで利用可能なツールは以下の通りです(用途別に分類):

🏠 コア・接続情報

  • tools_bridge_connection_status — RWAV Bridgeの接続状況を確認
  • tools_bridge_version_get — Bridge/MCPサーバーのバージョン
  • tools_capabilities — 利用可能な機能・スコープの一覧
  • tools_instructions_startup — アジェント向け使用ガイド(セッションID再利用、ルール等)

📂 サイド / ブrowsing

  • tools_search_run — タイトル/アーティストで検索
  • tools_track_search_open — トラック検索 → 行動カードを返す
  • tools_album_open — アルバム詳細(トラックリスト+アクション)
  • tools_artist_open — アーティスト概要(作品+トップトラック+アクション)
  • tools_genre_open — ジャンル詳細(アーティスト、アルバム等)
  • tools_library_playlists_list / pick — ライブラリプレイリスト一覧
  • tools_playlist_open / search_open — プレイリスト詳細
  • tools_live_radio_list / play_now / play_by_key — ラジオステーション
  • tools_composer_open / play_now / start_radio — 作曲家・作品
  • tools_work_open — 個別のクラシック作品
  • tools_node_open / list_children / get_actions — ジェネリックノードナビゲーション

▶️ 再生アクション(トラック/アルバム/アーティスト)

トラック
  • tools_track_play_now — 今すぐ再生
  • tools_track_add_next — 次の曲として追加
  • tools_track_queue — キュー末尾に追加
  • tools_track_start_radio — このトラックでラジオ開始
アルバム
  • tools_album_play_now / add_next / queue / start_radio
アーティスト
  • tools_artist_play_now (mode: play/shuffle/radio)
  • tools_artist_add_next / queue / start_radio
ジャンル
  • tools_genre_play_now / play_artists / play_albums / start_radio
プレイリスト
  • tools_playlist_play_now / shuffle / add_next / queue / start_radio
  • tools_playlist_track_* 系 — プレイリスト内の特定トラック操作

🎛️ プレイバックコントロール

  • tools_now_playing_get — 現在再生中の状態取得
  • tools_now_playing_playpause — 再生/一時切り替え
  • tools_now_playing_next / previous — 次へ/戻る
  • tools_now_playing_seek — シーク(位置指定)
  • tools_now_playing_shuffle — シャッフル ON/OFF
  • tools_now_playing_repeat — ループモード (off/one/all)

🔊 ボリューム・ミュート

  • tools_volume_set — 絶対値設定
  • tools_volume_adjust — デルタ調整
  • tools_mute_post / unmute_post — 個別出力ミュート
  • tools_mute_all_post / unmute_all_post — グローバルミュート解除

📡 出力・ゾーン管理

  • tools_outputs_list — 出力一覧
  • tools_group_zones / ungroup_zones — 出力グループ化
  • tools_outputs_list_group_candidates — グループ候補確認
  • tools_transfer_playback — 再生を別のゾーンへ移行

📊 キュー操作

  • tools_queue_get — フルキュー取得
  • tools_queue_head_get / tail_get — 先頭/末尾スナップショット
  • tools_queue_play_from_here — キュー内の特定行から再生開始

🖼️ 画像

  • tools_image_resolve — アートワークURL解決
  • tools_artwork_resolve_post / fetch_post — アートワーク取得(バイナリ/データURL)

全部で 60以上のツールがあります。主に「検索 → open → execute → verify_now_playing」の流れで使います。何をやりたいかおっしゃってください!
 
 
こんな感じでプロンプトを入れると
Romeo & Juliet: First Kiss – Abel Korzeniowskiに似た雰囲気の曲をゾーン:System Outputで再生して
応答
まず現在何が変わったか確認し、そのあとラジオを開始します。
 
 
現在再生中の「Romeo & Juliet: First Kiss」は、Abel Korzeniowski作曲の映画『ロミオ&ジュリエット』サウンドトラックで、劇的なロマンスとピアノ中心のクラシカルなオーケストラ曲ですね。
 
似た雰囲気の曲を再生するために、まずラジオまたは類似曲を探してみます:
 
 
現在再生中の「Romeo & Juliet: First Kiss」と同じ雰囲気の曲をゾーン:System Outputでスタートします。「Start Radio」機能を使って類似曲のラジオセッションを開始します。
 
 
ゾーン「System Output」で、Abel Korzeniowskiのラジオセッションを開始しました。
 
現在再生中:
– **Juliet’s Dream** — Abel Korzeniowski(Romeo & Juliet サウンドトラック)
 
似た雰囲気(映画サウンドトラック/ロマンチックなピアノ/クラシカル)の曲が自動的に流れ続けます。
systen promptでラジオ再生
 
 
ちなみに、ゾーン指定しないと、こんな不毛なやり取りをすることになるので、ゾーンは教えてあげよう。
 
 
これは絶対にRoonとLLMを繋げた方が面白い。
 
少なくとも私にとっては、ここ数年試した技術の中でもかなり「おおっ」となった組み合わせだった。
組み合わせは無限大だと思う。例えば、先週の履歴からピックアップして紹介ブログを金曜の朝に作成してなんていうこととかできそう。
 
もっとも、オーディオマニアの方々からすると、
 
「LLMを繋いだら音質が変わった」 「MCPサーバを追加したら音の輪郭が柔らかくなった」 「Open WebUI経由の方が空気感がある」
 
などという新しいオカルト宗派が誕生するのかもしれない。
 
個人的には、オーディオで変化が出るとしたら、電源のトランス、スピーカー、スピーカーケーブルあたりではないかと思っている。
トランスは主にグランドレベルが合っているかどうか。スピーカーケーブルは特性インピーダンスや抵抗値、絶縁体の誘電率などが影響するくらいで、単純にケーブルですら「太ければ正義」という話でもない。
なので、LLMが入ったからといって音そのものが変化するとは思わない。
 
……と、電気回路学がほぼ全てC評価で、全体でたった15分しかなかった就職指導のときに、
「君は電通大の電子工学科の人間としての自覚あるの?」
と教官に半分ネタで言われたことがある自分が言うのもなんだが。
 
生まれるとしたら、音ではなく、音楽に対する体験の変化だと思う。
 
少なくとも今回変化したのは音質ではない。音楽との付き合い方だった。
 
今までは、自分で曲を探して再生していた。
Roonクライアントも優秀だ。アーティストからアルバムへ、アルバムから関連作品へ、メタデータを辿りながら音楽の世界を広げていくことができる。
しかし、それはあくまで人間が探索する世界だった。
 
LLMが入ると少し様子が変わる。
過去の再生履歴、好みの傾向、会話の流れ、その日の気分、そしてAI自身による音楽の解釈。
 
それらを組み合わせながら、
「今日はこんなのどうですか」
と提案してくる。
 
単なるリモコンではない。
単なる検索エンジンでもない。
音楽ライブラリの前に立つ、一種の音楽エージェントになる。
 
今までは曲を探して再生していた。
これからは音楽について会話しながら再生する。
そんな未来が、意外と簡単に手に入ってしまった。
 
もっとも、音楽再生にStrix HaloのGPUまで投入しているので、
 
一般のご家庭用音楽エージェント
 
ではなく、
 
逸般の誤家庭用音楽エージェント
 
なのだが。それでも、めちゃくちゃ便利である。
 
で、このあと、SpotifyのMCPサーバも動かした。それは次回。(一気に作ったから同じタイミングでアップするが。)

コメントする