Last.fm MCP Server を Open WebUI / MCPO で使う

今度はLast.fmのMCPを立てる。
 
探したら、あった。
 
Roonは手元にある物理音楽データを管理する。
Spotifyはサブスク上に存在する膨大な音楽データへアクセスする。
そしてLast.fmは、過去に自分が聴いてきた音楽の履歴データを持っている。
 
気付いてみると、
  • Roon = 所有している音楽
  • Spotify = 世界に存在する音楽
  • Last.fm = 自分が聴いてきた音楽
という役割分担になっていた。
 
そしてそれらがすべてLLM経由で扱えるようになった。
「昔よく聴いていたけれど最近忘れていたアーティストは?」
「Jackie Evanchoにハマっていた頃の自分に近い趣味の曲は?」
「最近の再生傾向からすると次に気に入りそうなアーティストは?」
そんな質問が自然言語でできる。もはや音楽ライブラリではない。
個人音楽データ基盤である。
 
私の音楽環境にも三種の神器が揃ってしまった。
  • Roon(ライブラリ)
  • Spotify(推薦)
  • Last.fm(履歴)
である。例えるなら、横溝正史『犬神家の一族』の
「斧、琴、菊」
である。
発音的には「良きこと聞く」だが実際には何の共通点もない。
 
しかし、なぜか全部揃うと強い。
そして気が付けば、音楽を再生するための仕組みだったはずが、
音楽について会話し、音楽を推薦し、過去の自分の趣味まで分析する仕組みに変わっていた。
 
もう単なる音楽プレーヤーではない。
GPU火力をフル活用した逸般の誤家庭向け音楽エージェントである。
 
Roon、Spotify、Last.fmという「斧、琴、菊」が揃った結果、思っていた以上のものが出来上がってしまった。
もはやスケキヨ級の発展である。
 
 

事前準備

  • 前提条件

    • OAuthでブラウザ認証を行うため、MCPホスト上で動作するデスクトップブラウザがあること
    • Last.fmアカウント
    • MCPO環境
Spotfifyと同じ、テンポラリの認証サーバを使うが、ログイン認証だけ突破できるので、APIキーの事前取得などは不要。
実は、このoAUTHの突破方法ななかなかよくできている。MCPOコンテナが動くホストにウィンドウシステムをいれなきゃいけないという手間があるが、Open WebUIだとこの手法は便利だ。
 
  • 確認した環境

    認証後、MCP経由で以下のような個人の音楽履歴へアクセスできた。
    • 最近の再生履歴
    • よく聴くアーティスト
    • よく聴く楽曲
    • 個人のリスニング傾向
そのため、長期間利用しているLast.fmアカウントほど効果が大きい。
ただし、Last.fm Proかどうかによって取得可能な情報が変わる可能性がある
 
  • 以下適宜読み替えてほしい。
      • ここで作成するコンテナはmcpo-adminとして説明する。
      • Dockerホストは192.168.1.20として説明する。

1. 認証用コンテナを起動

cd /opt/containers/open-webui-shared
 
mkdir -p ./mcpo-admin/lastfm/mcp-auth
 
IMAGE=”$(docker inspect mcpo-admin –format ‘{{.Config.Image}}’)”
 
docker rm -f lastfm-auth-tmp >/dev/null 2>&1 || true
 
docker run -it \
–name lastfm-auth-tmp \
–network host \
-v ./mcpo-admin/lastfm/mcp-auth:/root/.mcp-auth \
–entrypoint sh \
“$IMAGE” \
-lc ‘
npx -y mcp-remote https://lastfm-mcp.com/mcp
 
表示されたURLを MCPOサーバが動いているホストののFirefox で開いて認証。
以下はテストで起動したときのログだが、以下のようにURLが表示されるはずである。
mcpo-admin | [1304] Using automatically selected callback port: 12752
mcpo-admin | [1304] Discovering OAuth server configuration…
mcpo-admin | [1304] Discovered authorization server: https://lastfm-mcp.com
mcpo-admin | [1304] [1304] Connecting to remote server: https://lastfm-mcp.com/mcp
mcpo-admin | [1304] Using transport strategy: http-first
mcpo-admin | [1304]
mcpo-admin | Please authorize this client by visiting:
mcpo-admin | https://lastfm-mcp.com/authorize?response_type=code&client_id=4Zwa3mBqboF2grzq&code_challenge=f_T86xQ1sCz3VsinZM7Mj16DHMYhvsfkQrH6ErSssfA&code_challenge_method=S256&redirect_uri=http%3A%2F%2Flocalhost%3A12752%2Foauth%2Fcallback&state=07cd5503-7ea9-4852-9f8b-37fe25ec0e62&scope=openid+email+profile&resource=https%3A%2F%2Flastfm-mcp.com%2F
mcpo-admin |
mcpo-admin | [1304] Browser opened automatically.
mcpo-admin | [1304] Authentication required. Initializing auth…
mcpo-admin | [1304] Initializing auth coordination on-demand
mcpo-admin | [1304] OAuth callback server running at http://127.0.0.1:12752
mcpo-admin | [1304] Creating lockfile for server d7c1fceedee2be85e2f38f1616845f2e with process 1304 on port 12752
mcpo-admin | [1304] Authentication required. Waiting for authorization…
 
URLを開き、ユーザ名、パスワードでログインをすると以下の認証画面になる。
 
Yesをクリックして、認証が成功したというページへ遷移すればOK
 

2. 認証キャッシュ確認

echo “===== Last.fm MCP auth cache =====”
find ./mcpo-admin/lastfm/mcp-auth -type f -maxdepth 3 -print
 
echo
echo “===== Recently updated =====”
find ./mcpo-admin/lastfm/mcp-auth -type f -mmin -10 -print
 
 

3. mcpo-admin に永続マウント

compose.ymlmcpo-admin に追加。
volumes:
– ./mcpo-admin/lastfm/mcp-auth:/root/.mcp-auth
 

4. mcpo-admin/config.json

{
  “mcpServers”: {
    “lastfm”: {
      “command”: “npx”,
      “args”: [“-y”, “mcp-remote”, “https://lastfm-mcp.com/mcp”]
      }
   }
}
 

5. mcpo-adminを再起動

cd /opt/containers/open-webui-shared
docker compose up -d
docker logs -f mcpo-admin
成功すれば lastfm が接続済みになる。
 
動作確認
同じように、MCPOのページで動作確認をする。
 
 
/server_infoなどをクリックして動作が確認できればOK。
 
あとはMCPとして登録すれば利用可能になる。
認証用コンテナは不要
docker rm -f lastfm-auth-tmp

機能の一覧

LLMに聞いてみた。
Last.fm MCP Server v1.0.0 の機能一覧です。認証済み(tmase)のため、すべての機能が利用可能です。

📡 コネクション系

機能
説明
ping()
サーバー接続テスト
server_info()
サーバー情報・バージョン確認
lastfm_auth_status()
認証ステータス確認

👤 ユーザープロファイル

機能
説明
get_user_info()
プロフィール情報・リスニング統計概要

🎵 リスニング履歴

機能
説明
get_recent_tracks()
最近のプレイ履歴(直近〜特定日の聴いた曲)
get_top_artists(period?)
トップアーティスト(7day / 1month / 6month / overall)
get_top_albums(period?)
トップアルバム(同上)
get_top_tracks(period?)
トップトラック(同上)
get_loved_tracks()
お気に入り(❤️マーク付き)トラック一覧

📊 統計・分析

機能
説明
get_listening_stats(period?)
詳細リスニング統計&アナリティクス
get_weekly_chart_list()
聴取履歴がある週範囲一覧
get_weekly_artist_chart(from, to)
特定期間のアーティスト聴取データ
get_weekly_track_chart(from, to)
特定期間のトラック聴取データ

🔍 アーティスト・アルバム・トラック情報

機能
説明
get_artist_info(artist)
概要・バイオ・タグ・類似アーティスト・トップトラック
get_album_info(artist, album)
トラックリスト・タグ・プレイカウント
get_track_info(artist, track)
詳細情報・タグ・類似曲

📈 グローバルチャート

機能
説明
get_artist_top_tracks(artist)
そのアーティストの全世界トップトラック
get_artist_top_albums(artist)
そのアーティストの全世界トップアルバム

🔗 類似・発見

機能
説明
get_similar_artists(artist)
類似アーティスト検索
get_similar_tracks(artist, track)
類似曲検索

💡 おすすめ

機能
説明
get_music_recommendations()
リスニング履歴に基づくパーソナルおすすめ

全体で約18個のツールが利用可能です。何か試してみたい機能はありますか?
 
 
ここまでくると試したくなるのが、Last.fmの検索結果からの再生。
 
10年前の今頃のヘビロテの曲をLast.fmから発掘して、Roonで再生。
もちろん、その頃はRoonを使ってない。
結果もすごいが、この単体プロンプトだけで57kも使っている。VRAMは24GBも消費している。Agent AIはVRAMがふんだんにないと動かない。
なので、もうdGPUのVRAMだとコストが合わなくなっている。最速ではないが、UMAで大量にVRAMを確保できる環境でないと辛い。
よくみると、10年の今頃の再生は0なので、直近2週間と融通をきかせている。普通なら無いで終わるのに。ほんとできる人間みたいだ。
 
 
 
それにしてもこれもすごい!
 
企業で言えば、SFDCから10年前のデータを引っ張ってきて処理させているようなものだ。
 
 
過去に、とある大企業の技術系役員の方が、AIをやるならMCPサーバが重要になると言っていた。その話を聞いた当時は正直ピンと来なかった。
MCPサーバは単なるコネクタである。外部システムと接続し、APIを呼び出し、データを取得したり更新したりするための仕組みだ。
それだけ聞くと、
API Gatewayの一種?
くらいの印象しかない。
しかし実際に使い始めてみると、考え方が少し違うことに気付く。
MCPサーバは単なるデータ取得の仕組みではない。
LLMがアクションを起こすための手足である。
例えば、GitHub MCPがあれば、
  • Issueを確認する
  • PRを作る
  • コードをレビューする
ことができる。
Spotify MCPがあれば、
  • 曲を探す
  • プレイリストを作る
  • 再生する
ことができる。
Last.fm MCPがあれば、
  • 過去の音楽履歴を分析する
  • 趣味の変遷を調べる
  • 推薦の材料にする
ことができる。
重要なのは、MCPサーバそのものではない。
重要なのは、
そのMCPサーバを使って何をさせたいのか
である。
アクションをする目的がなければ、MCPサーバは単なる接続先に過ぎない。
極端な話、100個のMCPサーバを持っていても、
何をしたいのか
が無ければ何も起きない。
MCPサーバは目的ではなく手段でしかない。
逆に、こういうことをしたいという目的が見つかった瞬間、MCPサーバは化ける。
今回の音楽環境がまさにそうだった。
最初はRoon MCPを入れて、「面白そうだな」程度だった。
そこへSpotify MCPが加わり、
さらにLast.fm MCPが加わった。
すると突然、
  • 所有している音楽
  • 世界に存在する音楽
  • 自分が聴いてきた音楽
をLLMが横断的に扱えるようになった。
MCPサーバの数が増えたから価値が出たのではない。
音楽エージェントという利用目的が見つかったから価値が出たのである。
今ならあの役員の言葉が分かる。
AI時代に重要なのは、モデルそのものではない。
もちろんモデルも重要だ。
しかし実際に価値を生み出すのは、
LLMがどんなアクションを起こせるか
である。
そしてそのアクションを実現するのがMCPサーバなのだと思う。

コメントする