mcpField
H
hum

hum

ローカル
hum.anzalabidi.devゲーム・エンタメ03 週間前に更新

hum について

humは、コーディングエージェントがMCP経由で操作できるブラウザ音楽プレーヤーで、再生はhumのブラウザータブで行います。曲検索、ムード別ステーション、Spotifyリンクの取り込み、同期歌詞に加え、アカウント不要のライブラリと任意の暗号化同期を備えています。

主な機能

  1. 01曲検索とSpotifyリンクの取り込み
  2. 02ムード別ステーションと自動再生ミックス
  3. 03同期歌詞とお気に入り曲
  4. 04アカウント不要のライブラリ同期とバックアップ
  5. 05エージェントによる再生・音量操作

活用シーン

  1. 01コーディング中の音楽再生
  2. 02気分に合わせた作業用ステーションの再生
  3. 03コーディングエージェントからの再生操作
  4. 04デバイス間での音楽ライブラリ共有

MCP 対応

MCPサーバーにより、対応エージェントはブラウザータブで動作中のhumプレーヤーを操作できます。曲やステーションの再生、Spotifyリンクの取り込み、曲送り、音量設定のほか、再生中の曲や歌詞の行を取得できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
mcpbhum.mcpb

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

hum

これまでに作られたすべての曲を、無料で。アルバムカバーに照らされた部屋のように感じられるプレーヤーで楽しめます。

  • 曲を検索するか、Spotify のプレイリスト、アルバム、または曲のリンクを貼り付けます(またはどこでも ⌘V を押します)。
  • ステーションをタップすると、そのムードに合った音楽がずっと再生されます。
  • 歌詞の時間同期、終わりのない自動再生ミックス、お気に入りの曲、共有可能な曲のリンク。
  • アカウントもキーも不要です。ライブラリはブラウザーに保存され、同期すればアカウントなしでデバイス間に引き継げます。

再生には YouTube の公式埋め込みプレーヤーを使用するため、広告とロイヤリティは通常どおり機能し、アーティストにも引き続き報酬が支払われます。

実行する

1 つのコマンド(Node 18+)。hum を起動し、ブラウザーで開きます。

npx github:anzal1/hum

クローンから実行:

node server.js

Docker(ホームサーバー、VPS、NAS):

docker build -t hum . && docker run -p 3737:3737 hum

無料でオンラインに公開する

hum は静的ファイル一式と小さな関数 1 つで構成されているため、Cloudflare Workers の無料枠に適しています。静的ファイルは無制限で、1 日あたり 100,000 件の検索が含まれます。

  • ワンクリック: /developers.html の Cloudflare にデプロイボタン、または https://deploy.workers.cloudflare.com/?url=https://github.com/anzal1/hum
  • このフォルダーから: npx wrangler deploy

Vercel も利用できます(api/ と vercel.json は準備済み)が、無料プランは非商用利用が対象です。

テスト済みの環境:node server.js、パック済み tarball からの npx、Docker、Cloudflare 独自のローカルランタイム(npx wrangler dev)。4 つすべてで全ルートが応答しました。

ライブラリを同期する

「いいね」、プレイリスト、履歴は通常、1つのブラウザーに保存されるため、サイトデータを消去すると失われ、2台目のデバイスでは空の状態から始まります。同期を使えば、アカウントもメールアドレスもログインも不要です。

使い方。 ホームページを開き、ライブラリを見つけて、同期、続いて同期をオンにするを押します。W6R1-BA1V-1BME-RGNM-GRTQ-X2PG-J8EGのようなコードと、コピー用ボタンが表示されます。別のデバイス(またはローカル hum)で同期、同期コードを使用の順に押し、コードを入力します。入力ミスは、処理が始まる前にチェックサムで検出されます。同期をオフにすると、そのデバイスでの同期が停止し、ライブラリはそのデバイスに残ります。同じパネルのライブラリをエクスポートとインポートを使うと、どこでも復元できるJSONバックアップを作成できます。インポートでは既存のデータに追加され、置き換えられることはありません。

同期されるもの。 liked、playlists、recent、および存在する場合はtasteとvariantsの値です。音量、シャッフル、現在のキュー、レイアウトはデバイスごとに保持されます。

仕組み。

  • コードはブラウザーで生成される、128ビットのランダムデータ(および8ビットのチェックサム)です。
  • WebCryptoはHKDFを使って、互いに無関係な2つの値、レコードIDとAES-256-GCMキーを生成します。キーがページの外に出ることはありません。
  • ライブラリは圧縮、暗号化され、1つのblobとして送信されます。サーバーに見えるのはID、暗号文、そのサイズ、変更日時です。コード、キー、曲名は一切見えません。また、blobはIDにも紐付けられているため、別のIDに差し替えることはできません。
  • 取得時は上書きではなくマージが行われます。「いいね」とプレイリストは統合され、プレイリストは最新の編集内容が優先されます。削除はtombstoneとして伝播するため、古いコピーをまだ持つデバイスによって元に戻ることはありません。履歴は再生時刻を基準にマージされ(30件を保持)、tasteはすべてのカウンターとタイムスタンプの最大値を採用します。リモートデータのためにローカルデータが削除されることはありません。
  • 変更から約5秒後にプッシュが行われ、30秒に1回を超えることはありません。humは読み込み時、フォーカス時、および表示中は毎分データを取得しますが、1分に1回を超えることはありません。各書き込みには、基準となったバージョンが記録されます。別のデバイスが先に更新していた場合、humはデータを取得してマージし、再試行します。

プライバシーと制限。

  • コードを知っている人は誰でもライブラリを読み取り、変更できます。また、紛失したコードを復元する方法はありません。パスワードマネージャーに保管してください。
  • 同期を実行するため、コードはブラウザーのlocalStorage(キーhum:sync)に保存されます。そのため、ブラウザープロファイルにアクセスできる人は誰でもコードを確認できます。同期をオフにするとコードは削除されます。
  • 同期をオフにしても、サーバー上の暗号化されたコピーは削除されません。コードがなければ、解読できないデータです。
  • サーバーは、IDが存在することと、書き込まれた日時を確認できます。サービスを拒否したり、古い暗号文を提供したりすることはできますが、データを読み取ったり偽造したりすることはできません。
  • blobの上限は512 KBです(圧縮されるため、「いいね」を付けた曲なら約5,000曲分)。サーバーが受け付ける書き込みは、IDごとに10秒あたり1回です。

ローカル humとウェブサイトは、1つのライブラリを共有します。 オリジンが異なるため、ブラウザーのストレージを共有できませんが、ローカルサーバー(node server.js、npx github:anzal1/hum)は、デフォルトで/api/syncをhttps://hum.anzalabidi.dev/api/syncに転送します。両方に同じコードを入力すると、同期が保たれます。プロキシを通過するのは暗号文だけです。

変数説明
HUM_SYNC_URL転送先の同期サーバーです。たとえば、独自のWorkerを使う場合はhttps://hum.you.workers.dev/api/syncを指定します。
HUM_SYNC=offこのローカルサーバーでは同期しません。この場合、パネルにはエクスポートとインポートのみが表示されます。

Cloudflare D1で同期をセルフホストする。 同期には、SYNCとしてバインドされたD1データベースが必要です。データベースがない場合、ルートは501を返し、ページにはエクスポートとインポートのみが表示されます。それ以外の機能はこれまでどおり動作します。

npx wrangler d1 create hum-sync                      # copy the database_id it prints
# add to wrangler.jsonc, at the top level:
#   "d1_databases": [{ "binding": "SYNC", "database_name": "hum-sync", "database_id": "<yours>", "migrations_dir": "migrations" }]
npx wrangler d1 migrations apply hum-sync --remote
npx wrangler deploy

env.productionの下にあるブロックは公式サイトのデータベースです。変更せずに残すか、自分のものに置き換えてください。ローカルで試すには、npx wrangler d1 migrations apply hum-sync --local && npx wrangler dev --localを実行します。テーブルはライブラリごとに1行で、migrations/0001_blobs.sqlにあるblobs(id, data, version, updated)です。

アプリに hum を組み込む

スクリプトタグを 1 つ追加するだけで、あらゆるページにフローティングプレーヤーを追加できます。

<script src="https://YOUR-HUM-HOST/embed.js" data-station="lofi beats"></script>

その後、コードから操作できます。hum.play('Blinding Lights')、hum.station('deep focus')、hum.playlist(spotifyUrl)、hum.pause()、hum.next()、hum.volume(60)、hum.on('state', fn) を使えます。または iframe を直接使い、widget.html?station=lofi を指定して postMessage({ hum: 'play', query }) を送信します。ライブデモは /developers.html にあります。

コーディングエージェントで使う

hum は MCP に対応するあらゆるエージェントで使えます。エージェントがリモコンとなり、音楽は hum のブラウザータブで再生されます。曲の再生、ステーションの開始、Spotify リンクのインポート、曲のスキップ、音量の設定、再生中の曲の確認ができ、歌詞のどの行が歌われているかまでわかります。Node 18 以上が必要です。

claude mcp add --scope user hum -- npx -y -p github:anzal1/hum hum-mcp

VS Code:

code --add-mcp '{"name":"hum","type":"stdio","command":"npx","args":["-y","-p","github:anzal1/hum","hum-mcp"]}'

Claude Desktop(ワンクリック拡張機能)、Cursor(インストールリンク)、Codex、Gemini CLI、Windsurf、Zed、Copilot CLI、opencode、Cline、Kiro、Amp、Goose、Continue については、すべて docs/agents.md をご覧ください。

ターミナルから使う

一度インストールすれば、必要なときにコマンドから hum を起動して開けます。

npm i -g github:anzal1/hum

hum play blinding lights       # a song or artist
hum station lofi beats         # an endless mix
hum playlist <spotify link>
hum pause | resume | toggle | next | prev
hum vol 40
hum duck                       # lower the music; hum unduck brings it back
hum now                        # title, artist, progress and the line being sung

hum now --line は、ステータスバー向けの短い 1 行を出力します。hum が起動していない場合は何も出力しません。♪ Amazing Grace · Judy Collins · I once was lost, but now I am found のような形式です。hum を起動することはなく、約 30 ms で戻ります。スクリプトでは hum now --json を使います。

tmux の場合(~/.tmux.conf):

set -g status-right '#(hum now --line)'
set -g status-interval 2

Claude Code の場合(~/.claude/settings.json):

"statusLine": { "type": "command", "command": "hum now --line" }

それ以外のものからはローカルのリモートに POST できます。このリモートは 127.0.0.1 でのみ待ち受け、JSON のみ受け付けます。

curl -X POST localhost:3737/api/remote -H 'content-type: application/json' -d '{"cmd":"station","mood":"lofi"}'

再生は常に hum ウィンドウ内で YouTube 独自のプレーヤーを通じて行われるため、ウィンドウを開いたままにしてください。ターミナルはリモコン兼ディスプレイです。HUM_PORT で別のポートを指定でき、HUM_NO_OPEN=1 を設定するとブラウザーが自動で開かなくなります。

仕組み

要素ソース
検索、曲のメタデータ、自動再生ミックスYouTube Music の公開 Web API。api/_core.js から呼び出します
再生YouTube IFrame Player API。ルールで求められているとおり、常に表示されます
歌詞LRCLIB。ブラウザーから直接呼び出します
Spotify のインポートプレイリスト用の Spotify 公開埋め込みページ
色ブラウザーでカバーアートから抽出し、WebGL シェーダーで描画します

曲のメインアップロードが YouTube 以外での再生を拒否した場合、hum は静かに次に適したアップロードを試します。

ライブノッチ対応のデスクトップアプリ

desktop/ は小さな Electron アプリです。独立したウィンドウで動く hum と、MacBook のノッチの上に表示されるアイランドで構成されています。コンパクトなアイランドはノッチを囲み(左にカバー、右にバー)、カーソルを合わせると、歌われている歌詞、再生位置、操作ボタンを備えたミニプレーヤーに展開します。Windows やノッチのない Mac では、画面上部中央にフローティング表示されます。アイランドは BroadcastChannel を介してプレーヤーと通信するため、同じサイトのどのウィンドウからでも操作できます。

cd desktop && npm install && npm start          # uses https://hum.anzalabidi.dev
cd desktop && npm run dev                       # uses your local server on :3737

ブラウザーでは N を押すと、ページ内に同じアイランドが表示されます。

ポップアウトミニプレーヤー

P を押すかポップアウトボタンをクリックすると、プレーヤーが常に最前面に表示される小さなウィンドウに移動します(Document Picture-in-Picture を使用。Chrome と Edge に対応)。Chrome では、曲の再生中にタブを切り替えると、ミニプレーヤーを単独で開くこともできます。ミニプレーヤーを閉じると、同じ再生位置からページ内に再生が戻ります。

あなた向け

取り込んだすべてのプレイリストとすべてのステーションには、「Original」/「For you」の切り替えがあります。「For you」では曲はそのままに、最後まで聴いた曲、スキップした曲、「いいね」した曲に基づいて順位を付け直し、プレイリスト外から見つけた曲をいくつか「new for you」とタグ付けして織り込みます。最初は見つけた曲を 3 曲追加し、開くたびに日付が変わっていれば最大 3 曲を追加します。リスト全体の 30%を超えることはありません。見つけた曲を 2 回スキップすると、その曲は以後追加されません。数曲再生すると、ホームページに「Made for you」の行が追加され、よく再生する曲のバリエーションが表示されます。

すべてブラウザー内で、あなた自身の再生履歴に基づいて計算され、localStorage の taste および variants キーに保存されます。好みのデータはデバイス内に保持されます。リクエストが送信されるのは、新しい曲を見つけるために、いくつかの曲について通常のラジオ検索を行う場合のみです。ルールは public/taste.js にあります。

共有リンク

曲のリンクは /s/<id> の形式です。チャットアプリやソーシャルサイトには曲専用のカバー画像とタイトルが表示され、リンクをクリックするとプレーヤーがすぐに開きます。デフォルトのプレビュー画像は public/og.jpg で、og/og.html から作成されています。デプロイ後は、public/index.html の og:image に完全なドメインを設定してください。一部のクローラーは相対パスを無視するためです。

テスト

test/e2e.js は、すべての検索経路、ボタン、スライダー、スイッチ、リスト操作、キーボードショートカット、ウィジェット、共有ページ、リモート、For you の好みルール、同期を網羅する 100 項目のエンドツーエンドテストスイートです(鍵の導出、暗号化と復号、誤ったコードで失敗すること、すべてのマージルール、偽のサーバーを介した 2 台のデバイスの同期を含みます)。Chromium ではすべて合格します。作成時には、最初の 52 項目が Firefox と WebKit(Safari のエンジン)でも合格しました。アプリの隣に配置し(cp test/e2e.js public/__e2e.js)、アプリを起動して一度再生ボタンを押してから、コンソールで次を実行してください。

(await import('/__e2e.js')).run().then((r) => console.table(r))

キー

キー動作
/ または ⌘K検索
Space再生または一時停止
← →5 秒シーク
Shift + ← →前へ、または次へ
L歌詞
Q次に再生
Sシャッフル
Mミュート
Pミニプレーヤーをポップアウト
Nノッチモード

知っておきたい制限事項

  • YouTube の規則では、プレーヤーを表示したままにする必要があり、バックグラウンド再生はできません。そのため、スマートフォンをロックすると音楽が停止します。デスクトップ、タブレット、テレビでは問題ありません。
  • Spotify からのインポートでは、プレイリストの最初の 100 曲が取り込まれます。
  • 検索とミックスには YouTube Music の非公式 Web API を使用しているため、予告なく変更されることがあります。
  • YouTube はプレーヤーに広告を表示することがあります。hum は広告をブロックしません。また、ブロックすべきではありません。同じブラウザーで YouTube Premium にログインしている場合、通常は広告が表示されません。
  • 新しいタブでは、ブラウザーが音声の再生を許可するまでに一度クリックする必要があります。その後は、エージェントとウィジェット API から自由に再生できます。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。