Spotify MCP Server を Open WebUI / MCPO で使う

MCPサーバは、実は個人用として使うことにした。ある意味、これは運用として正しい気がしている。
というのも、MCPサーバにはサーバ用途を意識したものもあるが、実際には Claude Desktop や Cursor など、デスクトップアプリ向けに作られているものが多い。
そこで結構な頻度で問題になるのが OAuth 認証である。
 
多くのMCPサーバは、初回認証時にローカルブラウザで
http://127.0.0.1:xxxx/callback
 
を受ける前提になっている。
これをDocker上やヘッドレス環境でやろうとすると、全くうまく行かない。最後、だいたいこうなる。
 
パトラッシュ、疲れたろう。
僕も疲れたんだ。
なんだか、とても眠いんだ……
 
ところが、すっかり忘れていた。MCPサーバを動かしている EVO-X2 は、DGX Sparkもどきとして使うために Ubuntu Desktop を入れていた。つまり、ローカルブラウザが使える。
これができるなら話はかなり楽になる。できなければ、またOAuth魔境に戻るところだった。
 
前回のRoonに続き、今回はSpotifyのMCPサーバを動かした。
 
 
ひとつ残念なお知らせがある。 Spotifyの既成プレイリストは再生できても、トラック一覧の取得には制限がかかる場合がある。プレイリストの中身が抜ければ、そのままRoonで再生させる、ということができたのだが、そこは思ったほど甘くなかった。つまり、自分に本当に必要だったのはSpotify MCPだけではなく、ヒットチャートやキュレーション済みリストを取得するMCPサーバだった、ということが分かった。
 

事前準備

前提条件

  • OAuthでブラウザ認証を行うため、MCPホスト上で動作するデスクトップブラウザがあること
  • Spotify Premiumアカウント
  • Spotify Developer App
  • MCPO環境
 
以下適宜読み替えてほしい。
    • ここで作成するコンテナはmcpo-adminとして説明する。
    • Dockerホストは192.168.1.20として説明する。
 

Spotify Developer App作成

Spotify Developer Dashboardでアプリを作成する。
 
https://developer.spotify.com/dashboard
 
取得するものは以下。
  • Client ID
  • Client Secret
 
Redirect URIには以下を登録あるいは追加する。
http://127.0.0.1:8888/callback
 

mcpo-adminイメージへ Spotify MCP を組み込む

MCPO用Dockerfileに以下を追加する。
# Install Spotify MCP
RUN git clone https://github.com/marcelmarais/spotify-mcp-server.git /opt/spotify-mcp-server && \
cd /opt/spotify-mcp-server && \
npm install && \
npm run build
イメージを再ビルドする。
docker compose build mcpo-admin
docker compose up -d
 

認証用コンテナを作成する

認証専用コンテナを起動する。
cat <<‘EOF’ >/tmp/create-spotify-auth-container.sh
#!/usr/bin/env bash
 
IMAGE=”$(docker inspect mcpo-admin –format ‘{{.Config.Image}}’)”
 
docker rm -f spotify-auth-tmp >/dev/null 2>&1 || true
 
docker run -it \
–name spotify-auth-tmp \
–network host \
–entrypoint sh \
“$IMAGE” \
-lc ‘
cd /opt/spotify-mcp-server || exit 1
 
cat > spotify-config.json <<JSON
{
“clientId”: “YOUR_CLIENT_ID”,
“clientSecret”: “YOUR_CLIENT_SECRET”,
“redirectUri”: “http://127.0.0.1:8888/callback”,
“accessToken”: “”,
“refreshToken”: “”,
“expiresAt”: “”
}
JSON
 
npm run auth
EOF
 
bash /tmp/create-spotify-auth-container.sh
ここで重要なのは --network host である。
 
Spotify認証後のcallback先は
http://127.0.0.1:8888/callback
になる。 --network host を使うことで、認証用コンテナの 127.0.0.1:8888 を、Ubuntu Desktop上のFirefoxから扱えるようになる。
 

Spotify認証

以下のようなURLが表示される。
If no browser opens, visit this URL manually:
https://accounts.spotify.com/authorize?…
Ubuntu Desktopへログインし、FirefoxでURLを開く。 Spotifyへログインし、「許可」を押す。
認証に成功すると以下のように表示される。
Authentication successful! Access token has been saved.
Authentication completed successfully!
 

認証情報の回収

認証ファイルをホストへコピーする。
cd /opt/containers/open-webui-shared
 
mkdir -p ./mcpo-admin/spotify
 
docker cp \
spotify-auth-tmp:/opt/spotify-mcp-server/spotify-config.json \
./mcpo-admin/spotify/spotify-config.json
確認する。
grep -E ‘”accessToken”|”refreshToken”|”expiresAt”‘ \
./mcpo-admin/spotify/spotify-config.json
accessTokenrefreshTokenexpiresAt が入っていれば成功。
このファイルは非常に重要である。 実質的にはSpotify MCP用の認証情報なので、扱いには注意する。

mcpo-adminへ永続マウント

compose.ymlへ以下を追加する。
volumes:
– ./mcpo-admin/spotify/spotify-config.json:/opt/spotify-mcp-server/spotify-config.json
 

MCP登録

mcpo-admin/config.json に以下を追加する。
{
  “spotify”: {
     “command”: “node”,
      “args”: [
       “/opt/spotify-mcp-server/build/index.js”
       ]
     }
}
 

mcpo-admin再起動

docker compose up -d
または
docker restart mcpo-admin
ログに以下が出れば成功。
Successfully connected to ‘spotify’
 

動作確認

MCPOのAPIドキュメントへアクセスする。
http://192.168.1.20:18000/spotify/docs
 
 
 
APIを実行して動作確認する。
一部のAPIはデフォルト値が 0 になっていると失敗することがある。 たとえば getQueuelimit1 以上を指定する必要がある。
ここまで動けば、Spotify MCPとしては動作確認完了。
その後、Open WebUIへ登録する。

後片付け

認証用コンテナは不要なので削除する。
docker rm -f spotify-auth-tmp

再認証が必要になった場合

以下を実施すればよい。
  1. spotify-auth-tmp を作成
  2. npm run auth
  3. Firefoxで認証
  4. spotify-config.json を回収
  5. ./mcpo-admin/spotify/spotify-config.json を置き換え
  6. mcpo-admin を再起動

利用時の注意

Spotifyを再生させるには、Spotifyアプリを起動しておく必要がある。
また、Spotify公式や既成プレイリストの中には、検索では見えてもトラック一覧取得で 403 Forbidden になるものがある。 これはMCPの失敗ではなく、Spotify API側の制限と考えた方がよい。

Spotify MCPで利用できる主な機能

LLMに聞いてみた
Spotify MCPで利用可能な機能の一覧です:

検索系

  • track/album/artist の検索 (tool_searchSpotify_post)
  • アルバム詳細 (tool_getAlbums_post)
  • アルバムのトラック一覧 (tool_getAlbumTracks_post)

再生制御系

  • 音楽の再生・一時停止・スキップ (tool_playMusic_post, tool_pausePlayback_post, tool_skipToNext_post, tool_skipToPrevious_post, tool_resumePlayback_post)
  • キューに追加 (tool_addToQueue_post)
  • キュー確認 (tool_getQueue_post)
  • 音量設定/調整 (tool_setVolume_post, tool_adjustVolume_post)

ライブラリ系

  • お気に入り曲の取得/削除 (tool_getUsersSavedTracks_post, tool_removeUsersSavedTracks_post)
  • アルバムの保存/解除 (tool_saveOrRemoveAlbumForUser_post, tool_checkUsersSavedAlbums_post)

プレイリスト系

  • ユーザーのプレイリスト一覧 (tool_getMyPlaylists_post)
  • プレイリストの詳細・トラック一覧 (tool_getPlaylist_post, tool_getPlaylistTracks_post)
  • プレイリスト作成/更新 (tool_createPlaylist_post, tool_updatePlaylist_post)
  • トラックの追加/削除 (tool_addTracksToPlaylist_post, tool_removeTracksFromPlaylist_post)
  • プレイリストの並び替え (tool_reorderPlaylistItems_post)
  • プレイリストの解除 (tool_unfollowPlaylist_post)

統計系

  • お気に入りのトラック/アーティスト (tool_getTopTracks_post, tool_getTopArtists_post)
  • 最近の再生履歴 (tool_getRecentlyPlayed_post)
  • 現在再生中の情報 (tool_getNowPlaying_post)

デバイス

  • 利用可能なデバイス一覧 (tool_getAvailableDevices_post)

まとめ

今回の一番重要なポイントは、--network host とローカルブラウザである。
OAuth対応MCPサーバは、デスクトップアプリ向けに作られているものが多い。そのため、ローカルブラウザで 127.0.0.1 のcallbackを受ける前提になっていることが多い。
ヘッドレスサーバやDocker環境だけで何とかしようとすると、OAuthの設定でかなり苦労する。
しかし、MCPホストがUbuntu Desktopで、Firefoxが使えるなら話は一気に楽になる。
Docker DesktopのMacやWindowsよりも、Ubuntu Desktopサーバの方が、この手のOAuth MCP運用には向いているかもしれない。
そして、またMCPサーバが増えてしまった。Roonの感動がちょっと凄すぎて自分的にはふーんなんだが、Roonと違うのは、あくまでもサブスクの音源なので、ローカルにデータが不要。
 
Roonと違って、手持ちの音源に限定されない世界中の音源vsLLM活用が実現する。
よく考えたらこれはすごい。単なるリスニングから体験に変化する。
 
 
 
最後に、メディア系といえば、最後にJellyginのMCPサーバも足したが、検索機能しかない。
大した工数もなく、作れるのであえて紹介しない。というか、作ってみて感じた。
 
地面師たちのピーエル瀧が「もうええでしょう」と言ってる気がしてならないので、ブログにしないことにしたw

コメントする