hum について
humは、コーディングエージェントがMCP経由で操作できるブラウザ音楽プレーヤーで、再生はhumのブラウザータブで行います。曲検索、ムード別ステーション、Spotifyリンクの取り込み、同期歌詞に加え、アカウント不要のライブラリと任意の暗号化同期を備えています。
主な機能
- 01曲検索とSpotifyリンクの取り込み
- 02ムード別ステーションと自動再生ミックス
- 03同期歌詞とお気に入り曲
- 04アカウント不要のライブラリ同期とバックアップ
- 05エージェントによる再生・音量操作
活用シーン
- 01コーディング中の音楽再生
- 02気分に合わせた作業用ステーションの再生
- 03コーディングエージェントからの再生操作
- 04デバイス間での音楽ライブラリ共有
MCP 対応
MCPサーバーにより、対応エージェントはブラウザータブで動作中のhumプレーヤーを操作できます。曲やステーションの再生、Spotifyリンクの取り込み、曲送り、音量設定のほか、再生中の曲や歌詞の行を取得できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
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 から自由に再生できます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。