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
accessToken、refreshToken、expiresAt が入っていれば成功。このファイルは非常に重要である。 実質的には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 になっていると失敗することがある。 たとえば getQueue は limit に 1 以上を指定する必要がある。ここまで動けば、Spotify MCPとしては動作確認完了。
その後、Open WebUIへ登録する。
後片付け
認証用コンテナは不要なので削除する。
docker rm -f spotify-auth-tmp
再認証が必要になった場合
以下を実施すればよい。
-
spotify-auth-tmpを作成 -
npm run auth -
Firefoxで認証
-
spotify-config.jsonを回収 -
./mcpo-admin/spotify/spotify-config.jsonを置き換え -
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