musicbrainz-mcp-server について
MusicBrainzの音楽メタデータとCover Art Archiveの画像を検索するMCPサーバーです。エンティティ検索、識別子の解決、関連データの閲覧、カバー画像の取得に対応します。
主な機能
- 01アーティスト、リリース、録音、作品、レーベルの検索
- 02MBIDによるエンティティ参照
- 03ISRC、ISWC、バーコードの解決
- 04関連エンティティとディスコグラフィーの閲覧
- 05リリースとリリースグループのカバー取得
活用シーン
- 01アーティストのリリースや共演関係の確認
- 02ISRCから録音を特定
- 03リリースのトラックやレーベル情報の確認
- 04アルバムカバー画像の取得
MCP 対応
MCPクライアントに10個のツールとMusicBrainzエンティティのJSONリソースを提供します。STDIOとStreamable HTTPに対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://musicbrainz.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-musicbrainz https://musicbrainz.caseyjhand.com/mcp{"mcpServers":{"cyanheads-musicbrainz":{"type":"http","url":"https://musicbrainz.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-musicbrainz":{"type":"http","url":"https://musicbrainz.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-musicbrainz":{"type":"http","url":"https://musicbrainz.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-musicbrainz":{"serverUrl":"https://musicbrainz.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
10| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 返す結果の最大数(1~100)。 |
| query | string | はい | Lucene クエリ文字列。空白以外の文字を含める必要があります。プレーンテキストは名前/タイトルに一致し、フィールド指定(例:`artist:`、`country:`、`tag:`)もサポートされます。指定どおりの内容を MusicBrainz に送信します。 |
| offset | integer | いいえ | ページネーション用の結果オフセット(0始まり)。 |
| entityType | enum | はい | 検索するエンティティタイプ。artist | release-group | release | recording | work | label |
詳細
@cyanheads/musicbrainz-mcp-server
MCP 経由で、アーティスト、リリース、録音、作品、レーベルを検索し、関連性をたどり、ISRC/ISWC/バーコードを解決し、カバーアートを取得します。STDIO または Streamable HTTP に対応しています。
公開ホストサーバー: https://musicbrainz.caseyjhand.com/mcp
概要
MusicBrainz と Cover Art Archive のオープンな音楽メタデータを扱います。アーティスト、リリース、録音、作品、レーベルが対象です。名前で検索したり、MBID、ISRC、ISWC、バーコードで検索したり、ディスコグラフィー全体をページごとに取得したり、カバーアートを取得したりできます。
ツール
| ツール | 説明 |
|---|---|
musicbrainz_search_entities | 1 種類のエンティティを Lucene 検索し、関連度スコア付きの MBID をランキング順に返します |
musicbrainz_get_artist | アーティストのプロフィール:種類、生涯、ディスコグラフィー、関連情報、外部リンク |
musicbrainz_get_release_group | リリースグループ(各エディションにまたがるアルバム):種類、初回リリース日、エディション、カバーアートの有無 |
musicbrainz_get_release | 1 つのエディション:トラックリスト、レーベルとカタログ番号、バーコード、パッケージ |
musicbrainz_get_recording | 録音(1 回の演奏):長さ、ISRC、収録されているリリース、演奏者および制作のクレジット |
musicbrainz_get_work | 作品(楽曲):種類、ISWC、作詞・作曲者、楽章、編曲、録音 |
musicbrainz_get_label | レーベル:種類、生涯、レーベルコード、外部リンク |
musicbrainz_lookup_identifier | ISRC、ISWC、またはバーコードを録音、作品、リリースに対応付けます |
musicbrainz_browse_entities | 親 MBID にリンクされたすべてのエンティティをページごとに取得します |
musicbrainz_get_cover_art | リリースまたはリリースグループの Cover Art Archive 画像 |
リソース
| リソース | 説明 |
|---|---|
musicbrainz://{entity_type}/{mbid} | エンティティを MusicBrainz の生 JSON 形式で返します。対応する get_* ツールのリンクデータも含まれます |
すべてのエンティティは get_* ツールからも取得できるため、ツールのみを使うクライアントでも機能に不足はありません。このリソースにはリストがありません。MBID は musicbrainz_search_entities で検索してください。
機能リファレンス
musicbrainz_search_entities ツール
- 呼び出しごとに指定できる
entityTypeは1つです(artist、release-group、release、recording、work、label)。フィールドを指定した Lucenequery(artist:radiohead AND country:GBなど)と、正の整数のlimit(デフォルトは25。100を超える値は通知とともに100に制限されます)、ページング用のoffsetを指定します - 有効な
offsetと上流のtotalCountを返します。続きの取得には、ページが短い場合も含め、offset + rows returnedを使用します。正の合計件数以上の位置でページが空の場合は取得完了を報告します。合計件数より前で予期せずページが空になった場合は、次に進まないoffsetを提示せず、不一致を報告します - 各ヒットには、MusicBrainz の順序に従った
mbid、name、生の0〜100のscoreと、artistCredit、isrcs、iswcs、lengthなど、種類固有のフィールドが含まれます。リリース行ではstatus(Official、Bootleg、…)を使用します。アーティスト、リリースグループ、作品、レーベルのサブタイプではtypeを使用します。空白文字のみのクエリはblank_queryとして失敗します
musicbrainz_get_artist ツール
mbidと、重いサブリソースを除外するためのinc_release_groupsおよびinc_relationships(どちらもデフォルトはtrue)- 種類、性別、国、地域、
lifeSpan、別名、タグに加え、releaseGroups(1ページ)、relationships(バンドへの参加、コラボレーション)、externalLinks(Wikidata、Discogs、公式サイト)を返します
musicbrainz_get_release_group ツール
mbidのみを指定します。primaryType、secondaryTypes、firstReleaseDate、artistCreditStringを含むartistCredit、タグ、1ページ分のreleases(エディション)を返しますcoverArt(exists、count、front、back)は、Cover Art Archive へのライブ確認の結果です。確認に失敗した場合、このフィールドは通知とともに省略され、「アートなし」と報告されることはありません
musicbrainz_get_release ツール
mbid、media_offset(デフォルトは0)、media_limit(デフォルトは20、上限なし)を指定します。順序付けされたmediaと、各メディアの全トラック(position、title、m:ss形式のlength、recordingId)、labelInfo(レーベルとcatalogNumber)、barcode、status、date、country、packaging、language/script、releaseGroupIdを返しますmediaTotalとtrackTotalは、正規化されたすべてのメディアとトラックの出現数を数えます。上流のメディアごとのtrackCountは保持されます。mediaOffsetは取得範囲を示します。メディアが残っている場合は、truncated、shown、capと通知で次のmedia_offsetを示します。末尾の空ページでは取得完了を報告します。release リソースには完全な生のトラックリストが保持されますcoverArtはリリースレコードに含まれる利用可能性の概要です。画像 URL を取得するにはmusicbrainz_get_cover_artを呼び出してください
musicbrainz_get_recording ツール
mbidと、演奏者、プロデューサー、エンジニアのクレジット、作品へのリンク、外部リンクを取得するためのinc_relationships(デフォルトはtrue)length、isrcs、artistCredit、firstReleaseDate、上流の1ページ分のreleases(最大25件)、relationships、externalLinksを返しますreleaseAppearanceSummaryにはshown、cap: 25、completenessが含まれます。ページが存在し、25件未満の場合はcomplete、正確な件数がわからないままページが満杯、またはページが存在しない場合はunknown、上流の正確な件数が返されたページ数を超える場合はtruncatedとなります。件数が不明な場合、totalCountは省略され、件数を取得するリクエストは追加されません。出現を列挙するには、埋め込みの順序と参照順序が異なる場合があるため、musicbrainz_browse_entities(target_type=release、link.recording=<mbid>、offset=0)を使用してください
musicbrainz_get_work tool
- ライター、作曲家、作詞家のクレジット、楽章と編曲、その作品を演奏した録音、外部リンクを取得するには、
mbidとinc_relationships(デフォルトはtrue)を指定します type、languages、iswcs、別名、タグを返します。録音との関連は最初の25件のみ保持されます(その他の関連とリンクはすべて保持されます)。全件数はtotalCountで示され、一部が省略された場合はtruncated、shown、capが表示されます- 作品の全録音を列挙するには、
workでrecordingをブラウズし、録音ごとの関連属性と日付を取得するためにmusicbrainz_get_recordingを呼び出します targetType: "work"を持つrelationshipsエントリーをたどるには、そのtargetIdを別のmusicbrainz_get_work呼び出しで使用します。directionは親子リンクを区別します。任意のorderingKeyは、上流のシーケンスキー(ゼロを含む)を保持し、targetDisambiguationは編曲を区別します。関連は上流の配列順を保持しますが、楽章の順序とは一致しない場合があります
musicbrainz_get_label tool
mbidのみを指定します。タイプ、国、地域、lifeSpan、labelCode(接頭辞を除いた LC 番号)、別名、タグ、externalLinksを返します- リリースは埋め込まれません。
musicbrainz_browse_entities(target_type=release、link.label)で列挙してください
musicbrainz_lookup_identifier tool
id_typeがisrcの場合は録音、iswcの場合は作品、barcodeの場合はリリースを検索します。バーコードは UPC/EAN の数字で、スコア順に最大25件の候補を返します。各候補にはscoreが含まれます- ISRC は
GBAYE9701274のような区切りのない形式、またはGB-AYE-97-01274のような印字形式を受け付けます。大文字と小文字、および前後の空白は無視されます。ISWC はT-010.140.236-1またはT0101402361を受け付け、任意のグループ区切り記号を使用できます。空白と大文字・小文字は無視されます。結果には、正規化された区切りなしの ISRC、またはT-DDD.DDD.DDD-C形式の ISWC が返されます。不正なコードはリクエスト前にエラーになります result.kind(recordings|works|releases)は、返された結果の種類を示します。失敗時はinvalid_identifierまたはidentifier_not_foundになります
musicbrainz_browse_entities tool
target_typeと、link内の親 MBID をちょうど1つ指定します。releaseGroup/release_groupはrelease-groupの別名です。正の整数であるlimitのデフォルトは25です。100を超える値は100に制限され、その旨が通知されます。検索とブラウズの両方で最大100を適用するには、MUSICBRAINZ_CLAMP_OVERSIZED_LIMITS=offを設定します- 上流の
totalCountを報告します。残りがある場合はtruncatedが設定され、空でないページには実際に返された行数に基づく次のoffsetが示されます。空のページでは、リンクされたエンティティがゼロ件である場合、結果をすべて取得済みの場合、または総数に達する前に予期せず空のページが返された場合を区別します。上限とページングに関する案内は、同じ通知にまとめられます。リリースの行ではstatusを使用し、その他のエンティティではtypeを使用します linkが欠落している、余分なリンクがある、または形式が不正な場合はinvalid_link、親が不明な場合はentity_not_foundになります。エディションのトラックを順番どおりに取得するには、musicbrainz_get_releaseを使用してください
| ターゲット | 受け付ける親キー |
|---|---|
artist | area、recording、release、release-group、work |
label | area、release |
release-group | artist、release |
release | area、artist、label、recording、release-group |
recording | artist、release、work |
work | artist |
musicbrainz_get_cover_art ツール
mbidとentity_type:release(デフォルト)またはrelease-group。後者はrepresentativeReleaseに解決されます。limitのデフォルトは 25 で、100 を超える値は 100 に制限されます。offsetのデフォルトは 0 です。これらのウィンドウはアーカイブインデックスがキャッシュされた後に適用され、検索/ブラウズの上限設定とは独立していますimagesはアーカイブ内の順序を維持し、front/back、types、imageUrl、250/500/1200px のサムネイルを含みます。totalCountは正確な件数で、offsetはウィンドウを示し、hasArtは最終ページが空の場合でもアーカイブ全体を対象とします。上限、続き、末尾到達、またはアートなしに関する案内は、1つの通知にまとめられます。画像がさらに残っている場合は、truncated、shown、capが表示されます- 不明な MBID は
entity_not_foundエラーになります。MusicBrainz が MBID の存在を確認できない場合は、その旨を示す通知とともに空の結果が返されます
musicbrainz://{entity_type}/{mbid} リソース
entity_typeはartist、release-group、release、recording、work、またはlabelです。MusicBrainz の生レコードをapplication/jsonとして返します- 対応する
get_*ツールと同じデフォルトの関連データを取得します。失敗時のエラーはinvalid_mbidとentity_not_foundです - Work の JSON には、生の作品間リレーションシップが含まれ、最初の 25 件の録音リレーションシップが保持されます。
recordingRelationshipSummaryは録音の正確な件数と、件数が打ち切られているかどうかを示します - Recording の JSON には、キャッシュ済みの生データを変更せずに、録音ツールと同じ
releaseAppearanceSummaryが含まれます。Release の JSON にはすべてのメディアとトラックが保持されます。ツールのメディアウィンドウはリソースには適用されません
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、プラグイン可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを提供します。
MusicBrainz 固有の機能:
- MusicBrainz Web Service v2 および Cover Art Archive 用のキー不要のクライアントです。すべてのリクエストには、MusicBrainz が要求する説明的な
User-Agentmusicbrainz-mcp-server/<version> ( <contact> )が付与されます。連絡先にはMUSICBRAINZ_CONTACTが使われます - エンティティは MBID(ハイフン区切りの UUID)で指定します。大文字と前後の空白は正規化されます。不正な形式またはすべてゼロの ID は
invalid_mbid(ブラウズの場合はinvalid_link)となり、形式が正しくても不明な ID はentity_not_foundになります - インスタンス内のすべてのクライアントを対象に、MusicBrainz への呼び出しは約 1 リクエスト/秒に制限されるため、長時間のブラウズには時間がかかります
- 1回のリクエストでディスコグラフィー、リレーションシップ、トラックリスト、外部リンクをまとめて取得します。レスポンスはデフォルトで 24 時間キャッシュされ、一時的な上流エラーはバックオフ付きで再試行されます
エージェントに適した出力:
- Artist のリリースグループ、リリースグループのエディション、Recording のリリースへの収録情報は、1ページ分(25件)を埋め込みます。ブラウズでは全件が列挙されます。Recording の収録情報は、件数を取得するリクエストなしで完全性を示します。Work の録音リレーションシップは 25 件を上限とし、正確な件数が報告されます。Label にはリリースが埋め込まれません
- 検索結果には有効なクエリが含まれ、検索とブラウズでは上流の正確な合計件数が報告されます。合計件数が欠落または無効な場合、件数を作り出すのではなく、不正な上流レスポンスとしてエラーになります
- 判別可能な出力:
musicbrainz_lookup_identifierはkindタグ付きのユニオン型を返すため、呼び出し側は文字列解析ではなくデータに基づいて分岐できます - 導出した信頼度ではなく、上流の生の関連度
scoreを使用します。上流にないフィールドは、作り出さずに省略されます
はじめに
公開ホストインスタンス
公開インスタンスは https://musicbrainz.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP を介して、任意の MCP クライアントから接続してください。
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "streamable-http",
"url": "https://musicbrainz.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/musicbrainz-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"MUSICBRAINZ_CONTACT": "[email protected]"
}
}
}
}
または npx を使用します(Bun は不要です)。
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/musicbrainz-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"MUSICBRAINZ_CONTACT": "[email protected]"
}
}
}
}
または Docker を使用します。
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "[email protected]",
"ghcr.io/cyanheads/musicbrainz-mcp-server:latest"
]
}
}
}
Streamable HTTP の場合は、トランスポートを設定してサーバーを起動してください。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 [email protected] bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以上(または Node.js v24 以上)。
- API キーやアカウントは不要です。サーバーにはデフォルトの連絡先が設定されていますが、共有環境またはホスト環境にデプロイする場合は、
MUSICBRAINZ_CONTACTにご自身のメールアドレスまたは URL を設定してください。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/musicbrainz-mcp-server.git
- ディレクトリに移動します:
cd musicbrainz-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env and set MUSICBRAINZ_CONTACT (optional but recommended)
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
MUSICBRAINZ_CONTACT | User-Agent に含めて送信するメールアドレスまたは URL です。共有インスタンスまたはホストインスタンスでは、ご自身のものを設定してください。 | リポジトリ URL |
MUSICBRAINZ_BASE_URL | MusicBrainz Web Service v2 のベース URL(例:プライベートミラー)。 | https://musicbrainz.org/ws/2 |
MUSICBRAINZ_RATE_LIMIT_RPS | クライアント側のリクエスト毎秒数の上限(0.1~50)。 | 1 |
MUSICBRAINZ_CACHE_TTL | レスポンスキャッシュの TTL(秒)。0 にするとキャッシュが無効になります。 | 86400 |
MUSICBRAINZ_TIMEOUT_MS | リクエストごとの HTTP タイムアウト(ミリ秒)。 | 30000 |
MUSICBRAINZ_MAX_RETRIES | 上流側で一時的な障害が発生した場合の再試行回数。 | 3 |
MUSICBRAINZ_CLAMP_OVERSIZED_LIMITS | 検索/ブラウズの上限が 100 を超えた場合に、通知を表示して 100 に制限します。off にすると、上限 100 のスキーマ検証が復元されます。厳密なブール値(true/false、on/off、1/0、yes/no)。 | true |
COVER_ART_BASE_URL | Cover Art Archive のベース URL。 | https://coverartarchive.org |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_AUTH_MODE | 認証:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、warning、error など)。 | info |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
省略可能なオーバーライドの一覧については、.env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行:
bun run devcheck # Lint, format, typecheck, security, packaging bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against the linter rules
Docker
docker build -t musicbrainz-mcp-server .
docker run --rm -e [email protected] -p 3010:3010 musicbrainz-mcp-server
Dockerfile は、デフォルトで HTTP トランスポート、ステートレスセッションモードを使用し、ログを /var/log/musicbrainz-mcp-server に出力します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() エントリーポイント。ツールとリソースを登録し、両方のサービスを初期化します。 |
src/config | サーバー固有の環境変数を解析し、Zod で検証します。 |
src/services/musicbrainz | MusicBrainz WS/2 クライアント。User-Agent、レートリミッター、レスポンスキャッシュ、再試行、ドメイン型を扱います。 |
src/services/cover-art | Cover Art Archive クライアント。404 を空の画像セットにマッピングし、リリースグループのリダイレクトに追従します。 |
src/mcp-server/tools | ツール定義(*.tool.ts)。検索、参照、ブラウズ、カバーアートに対応する 10 個の読み取り専用ツールです。 |
src/mcp-server/resources | リソース定義。エンティティミラー musicbrainz://{entity_type}/{mbid}。 |
tests/ | src/ に対応する単体テストと統合テスト。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md/AGENTS.md を参照してください。要点は次のとおりです:
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで
try/catchを使用しないでください - リクエスト単位のログには
ctx.log、テナント単位のストレージにはctx.stateを使用してください - 新しいツールとリソースは、
src/mcp-server/*/definitions/index.tsのバレル経由で登録してください - 上流へのすべての呼び出しはサービス経由で行い、直接
fetch()を呼び出さないでください。これにより、User-Agent、レートリミッター、キャッシュが適用されます - 外部 API のデータはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマを返してください。不足しているフィールドを決して捏造しないでください
貢献
Issue を歓迎します。提出前にチェックとテストを実行してください:
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細はLICENSEをご覧ください。
MusicBrainz のコアエンティティデータはCC0です。サーバーが読み取るのはこのコアメタデータのみで、異なるライセンスが適用される注釈テキストは取得しません。カバーアートは、MusicBrainz と Internet Archive の共同プロジェクトであるCover Art Archiveから取得します。画像 URL はリンクするだけで、画像を再ホストすることはありません。また、各画像の著作権はそれぞれの権利者に帰属します。派生物の利用時には、MusicBrainz と Cover Art Archive を出典として明記してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。