musicbrainz-mcp-server

v0.3.0 pre-1.0

Search artists, releases, recordings, works, and labels; traverse relationships; resolve ISRC/ISWC/barcode; fetch cover art via MCP. STDIO or Streamable HTTP.

musicbrainz.caseyjhand.com/mcp
claude mcp add --transport http musicbrainz-mcp-server https://musicbrainz.caseyjhand.com/mcp
codex mcp add musicbrainz-mcp-server --url https://musicbrainz.caseyjhand.com/mcp
{
  "mcpServers": {
    "musicbrainz-mcp-server": {
      "url": "https://musicbrainz.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http musicbrainz-mcp-server https://musicbrainz.caseyjhand.com/mcp
{
  "mcpServers": {
    "musicbrainz-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://musicbrainz.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "musicbrainz-mcp-server": {
      "type": "http",
      "url": "https://musicbrainz.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://musicbrainz.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

10

musicbrainz_search_entities

open-world

Full-text search across a MusicBrainz entity type (artist, release-group, release, recording, work, label) using a Lucene query string. Returns ranked matches with MBID, name/title, disambiguation, subtype where applicable, release status, release-group secondary types, recording first-release dates, and a 0–100 relevance score (100 = exact). Release rows use status; other entity subtypes use type. Starting point when resolving a name to an MBID — chain the returned MBID into the matching musicbrainz_get_* tool. Results are in MusicBrainz score-descending order. Supports field-scoped Lucene syntax (e.g. `artist:radiohead AND country:GB`). Only the first 500 matches are accessible; narrow the query or use musicbrainz_browse_entities for complete linked sets.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_search_entities",
    "arguments": {
      "entityType": "<entityType>",
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "enum": [
        "artist",
        "release-group",
        "release",
        "recording",
        "work",
        "label"
      ],
      "description": "Which entity type to search."
    },
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Lucene query string; must contain non-whitespace text. Plain text matches names/titles; field scoping (e.g. `artist:`, `country:`, `tag:`) is supported. Sent to MusicBrainz exactly as given."
    },
    "limit": {
      "default": 25,
      "description": "Positive integer page size (default 25); values above 100 are clamped to 100 with a notice. With MUSICBRAINZ_CLAMP_OVERSIZED_LIMITS=off, maximum 100 is enforced.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "offset": {
      "default": 0,
      "description": "Result offset for pagination (0-based, below 500). A page crossing the 500-match ceiling is reduced to the remaining window.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "entityType",
    "query",
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_artist

open-world

Artist profile by MBID: type, country, life span, gender, area with areaId, birth/formation and death/dissolution areas, IPI/ISNI identifiers, aliases, tags/genres, release-groups, band-membership / collaboration relationships, and external links. Chain areaId into musicbrainz_browse_entities link.area. Release-groups embed one upstream page (25); relationships are not capped. For the complete release-group list, call musicbrainz_browse_entities with target_type=release-group and link.artist.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_artist",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Artist MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    },
    "inc_release_groups": {
      "default": true,
      "description": "Include the discography (release-groups). Capped at one page; use browse for the full set.",
      "type": "boolean"
    },
    "inc_relationships": {
      "default": true,
      "description": "Include band-membership / collaboration relationships and external links (url-rels).",
      "type": "boolean"
    }
  },
  "required": [
    "mbid",
    "inc_release_groups",
    "inc_relationships"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_release_group

open-world

Release-group ("the album" above specific pressings) by MBID: primary type (Album/Single/EP) and secondary types (Live/Compilation), first-release date, artist credit, the list of releases (editions), tags/genres, external album links, and cover-art availability from the Cover Art Archive (image count and front/back flags for the release-group's representative release — the art musicbrainz_get_cover_art returns; use that tool for the image URLs). The embedded releases list is capped at one page (25); for the complete set of editions, call musicbrainz_browse_entities with target_type=release and link.release-group. For a specific edition's tracklist, take a release MBID from the releases list and call musicbrainz_get_release.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_release_group",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Release-group MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    }
  },
  "required": [
    "mbid"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_release

open-world

One edition by MBID: ordered media with tracks, track-specific artist credits when supplied, lengths and recording MBIDs, label + catalog number, barcode, country, release date, packaging, text representation, external links, and a cover-art availability stub. media_offset (default 0) and media_limit (default 20, no maximum) select whole media after normalization; mediaTotal and trackTotal describe the full release. Follow the notice to retrieve remaining media. The release resource retains the complete raw tracklist. Track lengths are m:ss. For image URLs, call musicbrainz_get_cover_art.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_release",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Release MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    },
    "media_offset": {
      "default": 0,
      "description": "Zero-based medium offset in release order (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "media_limit": {
      "default": 20,
      "description": "Maximum whole media returned (default 20; no upper bound).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "mbid",
    "media_offset",
    "media_limit"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_recording

open-world

Recording (a specific performance, distinct from the abstract work) by MBID: length, artist credits, ISRCs, one upstream page of release appearances with completeness metadata, work relationships, and performer/production credits with attributes and dates. Relationships are not capped. Enumerate releases with musicbrainz_browse_entities (target_type=release, link.recording, offset=0); embedded and browse order may differ. Browse recording by work enumerates recording entities; this tool supplies their work relationship details.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_recording",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Recording MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    },
    "inc_relationships": {
      "default": true,
      "description": "Include performance/production, work and recording relationships (samples, mashups, music videos, DJ mixes), and external links.",
      "type": "boolean"
    }
  },
  "required": [
    "mbid",
    "inc_relationships"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_work

open-world

Work (a composition, distinct from a recording) by MBID: type, languages, ISWCs, ordered work attributes (rights-society registrations, musical key and other metadata), writers/composers/lyricists, movements, arrangements, aliases, tags, and external links. Attributes remain available when relationships are disabled. Follow work target MBIDs with this tool; direction, orderingKey, and targetDisambiguation distinguish parts and arrangements without reordering relationships. This server returns the first 25 recording relationships with their exact total and actual truncation disclosure, preserving all other relationships. Browse recording entities with musicbrainz_browse_entities (target_type=recording, link.work), then use musicbrainz_get_recording for work relationship attributes and dates; browse alone does not return those details.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_work",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Work MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    },
    "inc_relationships": {
      "default": true,
      "description": "Include writer/composer, movement/arrangement and recording relationships, and external links.",
      "type": "boolean"
    }
  },
  "required": [
    "mbid",
    "inc_relationships"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_label

open-world

Label by MBID: type (Original Production, Reissue, Imprint, …), country, life span, label code (the LC number), area and areaId, IPI/ISNI identifiers, aliases, tags, ownership/imprint/distribution relationships, and external links (url-rels — Wikidata, Discogs, official site). Chain areaId into musicbrainz_browse_entities link.area. A label's releases are a potentially huge linked set (a major label can have tens of thousands), so they are NOT embedded here — enumerate them with musicbrainz_browse_entities (target_type=release, link.label).

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_label",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Label MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    }
  },
  "required": [
    "mbid"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_lookup_identifier

open-world

Resolve a standard identifier to MusicBrainz entities without a name search — the deterministic path when you already hold an ID. id_type=isrc → recordings (a recording-level code, often shared by several recordings); id_type=iswc → works (a composition-level code); id_type=barcode → releases (UPC/EAN digits; spaces and hyphens are ignored). ISRC and ISWC hit dedicated exact endpoints; barcode is a Lucene search filter so results are ranked (exact match scores 100). The output kind field tells you which entity type came back.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_lookup_identifier",
    "arguments": {
      "id_type": "<id_type>",
      "value": "<value>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id_type": {
      "type": "string",
      "enum": [
        "isrc",
        "iswc",
        "barcode"
      ],
      "description": "Which standard identifier: isrc (recording), iswc (work), or barcode (release)."
    },
    "value": {
      "type": "string",
      "minLength": 1,
      "description": "ISRC: compact CCXXXYYNNNNN or grouped CC-XXX-YY-NNNNN (e.g. GBAYE9701274 or GB-AYE-97-01274), case-insensitive with surrounding whitespace. ISWC: T plus ten digits, optional hyphen after T, optional dots between three-digit groups, optional hyphen/dot before the check digit (e.g. T-010.140.236-1 or T0101402361); whitespace and case are ignored. Echoes canonical uppercase ISRC or T-DDD.DDD.DDD-C ISWC. Barcode: UPC/EAN digits, e.g. 075678164125; spaces and hyphens are ignored, other characters rejected.",
      "examples": [
        "GBAYE9701274",
        "GB-AYE-97-01274",
        "T-010.140.236-1",
        "T0101402361",
        "075678164125"
      ]
    }
  },
  "required": [
    "id_type",
    "value"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_browse_entities

open-world

Paginate entities linked to one parent MBID. Accepted parents by target: artist → area, recording, release, release-group, work; label → area, release; release-group → artist, release; release → area, artist, label, recording, release-group, track_artist; recording → artist, release, work; work → artist. track_artist enumerates releases crediting an artist on tracks but not at release level. Artist release-groups and release-group editions embed one upstream page in get_* lookups; use this tool for the complete entity set. Recording browse returns identities, not performance attributes/dates or ordered release tracks: use musicbrainz_get_recording for work relationships and musicbrainz_get_release for tracks. Provide exactly one valid parent link. offset pages to any depth; totalCount is the exact filtered upstream entity total. Optional type/status filters apply only on supported parent pairs; preserve applied filters on continuation. Release rows carry status, other entity subtypes use type; release-groups include secondaryTypes and recordings include firstReleaseDate when available.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_browse_entities",
    "arguments": {
      "target_type": "<target_type>",
      "link": "<link>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "target_type": {
      "type": "string",
      "enum": [
        "artist",
        "release-group",
        "release",
        "recording",
        "work",
        "label"
      ],
      "description": "The entity type to enumerate (the children)."
    },
    "link": {
      "type": "object",
      "properties": {
        "artist": {
          "description": "Parent artist MBID (e.g. release-groups/recordings/releases by this artist).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "track_artist": {
          "description": "Artist MBID for release-only browse: releases crediting the artist on tracks but not at release level.",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "label": {
          "description": "Parent label MBID (releases on this label).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "release-group": {
          "description": "Parent release-group MBID (releases in this group).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "release": {
          "description": "Parent release MBID (artists, labels, release-groups, or recording entities in this edition; recordings are not ordered tracks).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "releaseGroup": {
          "description": "Alias for release-group; use only one spelling.",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "release_group": {
          "description": "Alias for release-group; use only one spelling.",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "recording": {
          "description": "Parent recording MBID (artists or releases linked to this recording).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "work": {
          "description": "Parent work MBID (artists or recordings linked to this work).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        },
        "area": {
          "description": "Parent area MBID (artists, labels, or releases in this area).",
          "type": "string",
          "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$"
        }
      },
      "additionalProperties": {},
      "description": "Exactly one parent MBID. The valid key depends on target_type (see the description)."
    },
    "type": {
      "description": "Pipe-separated release types: album, single, ep, broadcast, other, audio drama, audiobook, compilation, demo, dj-mix, field recording, interview, live, mixtape/street, remix, soundtrack, spokenword. Supported for release-group by artist and release by artist/label/recording/track_artist. Primary types union; primary and secondary categories intersect; release-group by artist requires all secondary types. Tokens are trimmed/lowercased; blank means absent.",
      "type": "string"
    },
    "status": {
      "description": "Pipe-separated statuses for release by artist/label/recording/release-group/track_artist: official, promotion, bootleg, pseudo-release, withdrawn, cancelled. Tokens are trimmed/lowercased and unioned; blank means absent.",
      "type": "string"
    },
    "limit": {
      "default": 25,
      "description": "Positive integer page size (default 25); values above 100 are clamped to 100 with a notice. With MUSICBRAINZ_CLAMP_OVERSIZED_LIMITS=off, maximum 100 is enforced.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "offset": {
      "default": 0,
      "description": "Result offset for deep pagination (0-based).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "target_type",
    "link",
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_cover_art

open-world

Cover Art Archive images for a release or release-group MBID: front/back flags, image types, full-resolution URLs, and 250/500/1200px thumbnail URLs. limit defaults to 25 and clamps above 100; offset defaults to 0. Pages retain archive order, totalCount counts all images, and hasArt describes the full archive even on an empty page. Follow the notice for the next offset. No art is a successful empty result; an unknown MBID fails with entity_not_found after a bounded MusicBrainz check. A release-group resolves to a representative release's art. URLs are linked, never rehosted; image copyright stays with rights holders.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "musicbrainz_get_cover_art",
    "arguments": {
      "mbid": "<mbid>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mbid": {
      "type": "string",
      "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$",
      "description": "Release or release-group MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)."
    },
    "entity_type": {
      "default": "release",
      "description": "Whether the MBID is a release (default) or a release-group.",
      "type": "string",
      "enum": [
        "release",
        "release-group"
      ]
    },
    "limit": {
      "default": 25,
      "description": "Maximum images returned (default 25; values above 100 clamp to 100 with a notice).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "offset": {
      "default": 0,
      "description": "Zero-based image offset in archive order (default 0).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "mbid",
    "entity_type",
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

Resources

1

A MusicBrainz entity by type and MBID with default linked data, including release/release-group URL links, recording-to-recording and label relationships. entity_type: artist, release-group, release, recording, work, label. Artist release-groups, release-group editions and recording release appearances embed one upstream page; labels embed no releases. Recording JSON includes releaseAppearanceSummary (shown, cap, completeness, optional exact totalCount and browse guidance from offset 0). Work JSON includes raw movement/arrangement relationships with direction, ordering-key and target disambiguation when supplied. Work recording relationships are sliced to 25 with recordingRelationshipSummary (exact relationship total and actual truncation). All other relationships and complete release tracklists are preserved; release-tool media windows do not apply here. Browse recording by work enumerates identities; musicbrainz_get_recording supplies work relationship attributes and dates.

uri musicbrainz://{entity_type}/{mbid} mime application/json

Extensions

1

io.modelcontextprotocol/skills

{
  "directoryRead": true
}