Skip to content

io.github.cyanheads/musicbrainz-mcp-server

by cyanheads · remote · local (npm) · no sign-in to list tools · v0.2.0 · published by GitHub user cyanheads

Search MusicBrainz artists, releases, works, labels; resolve ISRC/ISWC/barcode; fetch cover art.

Changes · 1

10 tools: 1 change things and 9 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http musicbrainz https://musicbrainz.caseyjhand.com/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "musicbrainz_get_label" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The name "musicbrainz_get_label" says "get": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

10 tools

Changes things 1Claude Code: ask
  • musicbrainz_get_labelLabel by MBID: type (Original Production, Reissue, Imprint, …), country, life span, label code (the LC number), area, aliases, tags, and external links (url-rels — Wikidata, Discog…1 finding

    Why it is in this group

    • The name "musicbrainz_get_label" says "get": a word for reading.
    • The description's first verb is "label": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "musicbrainz_get_label" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The name "musicbrainz_get_label" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Label by MBID: type (Original Production, Reissue, Imprint, …), country, life span, label code (the LC number), area, aliases, tags, and external links (url-rels — Wikidata, Discogs, official site). 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).

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
Only reads 9Claude Code: allow
  • musicbrainz_browse_entitiesPaginate entities linked to one parent MBID: release-groups by artist; releases by artist, label, release-group, or recording; recordings by artist, work, or release; works by arti…No findings

    Why it is in this group

    • The name "musicbrainz_browse_entities" says "browse": a word for reading.
    Description, as the server wrote it
    Paginate entities linked to one parent MBID: release-groups by artist; releases by artist, label, release-group, or recording; recordings by artist, work, or release; works by artist; artists/labels by area. 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 upstream entity total. Release rows carry status, other entity subtypes use type.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_get_artistArtist profile by MBID: type, country, life span, gender, area, aliases, tags/genres, release-groups, band-membership / collaboration relationships, and external links.No findings

    Why it is in this group

    • The name "musicbrainz_get_artist" says "get": a word for reading.
    Description, as the server wrote it
    Artist profile by MBID: type, country, life span, gender, area, aliases, tags/genres, release-groups, band-membership / collaboration relationships, and external links. 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.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_get_cover_artCover Art Archive images for a release or release-group MBID: front/back flags, image types, full-resolution URLs, and 250/500/1200px thumbnail URLs.No findings

    Why it is in this group

    • The name "musicbrainz_get_cover_art" says "get": a word for reading.
    Description, as the server wrote it
    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. Returns an empty image set (NOT an error) when the entity has no art — absence of art is information. An MBID that matches no release or release-group of the given entity_type fails with entity_not_found instead of an empty set. Art is served at the release level; a release-group MBID resolves to a representative release's art automatically. URLs are linked, never rehosted — image copyright stays with the rights holders (only MusicBrainz core metadata is CC0).

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_get_recordingRecording (a specific performance, distinct from the abstract work) by MBID: length, artist credits, ISRCs, release appearances, work relationships, and performer/production credit…No findings

    Why it is in this group

    • The name "musicbrainz_get_recording" says "get": a word for reading.
    Description, as the server wrote it
    Recording (a specific performance, distinct from the abstract work) by MBID: length, artist credits, ISRCs, release appearances, work relationships, and performer/production credits with attributes and dates. Relationships are not capped. Browse release appearances with musicbrainz_browse_entities (target_type=release, link.recording). Browse recording by work enumerates recording entities; this tool supplies their work relationship details.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_get_releaseOne edition's full detail by MBID: the tracklist (media → tracks → recordings with lengths and recording MBIDs), label + catalog number, barcode, country, release date, format, pac…No findings

    Why it is in this group

    • The name "musicbrainz_get_release" says "get": a word for reading.
    Description, as the server wrote it
    One edition's full detail by MBID: the tracklist (media → tracks → recordings with lengths and recording MBIDs), label + catalog number, barcode, country, release date, format, packaging, text representation (language/script), and a cover-art availability stub. Track lengths are rendered m:ss (stored as milliseconds upstream). For the actual cover image URLs, call musicbrainz_get_cover_art with this release MBID.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_get_release_groupRelease-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 …No findings

    Why it is in this group

    • The name "musicbrainz_get_release_group" says "get": a word for reading.
    Description, as the server wrote it
    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, 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.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_get_workWork (a composition, distinct from a recording) by MBID: type, languages, ISWCs, writers/composers/lyricists, aliases, tags, and external links.No findings

    Why it is in this group

    • The name "musicbrainz_get_work" says "get": a word for reading.
    Description, as the server wrote it
    Work (a composition, distinct from a recording) by MBID: type, languages, ISWCs, writers/composers/lyricists, aliases, tags, and external links. 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.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_lookup_identifierResolve a standard identifier to MusicBrainz entities without a name search — the deterministic path when you already hold an ID.No findings

    Why it is in this group

    • The name "musicbrainz_lookup_identifier" says "lookup": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • musicbrainz_search_entitiesFull-text search across a MusicBrainz entity type (artist, release-group, release, recording, work, label) using a Lucene query string.No findings

    Why it is in this group

    • The name "musicbrainz_search_entities" says "search": a word for reading.
    Description, as the server wrote it
    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, 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`).

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.2.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http musicbrainz https://musicbrainz.caseyjhand.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__musicbrainz__musicbrainz_search_entities",
      "mcp__musicbrainz__musicbrainz_get_artist",
      "mcp__musicbrainz__musicbrainz_get_release_group",
      "mcp__musicbrainz__musicbrainz_get_release",
      "mcp__musicbrainz__musicbrainz_get_recording",
      "mcp__musicbrainz__musicbrainz_get_work",
      "mcp__musicbrainz__musicbrainz_lookup_identifier",
      "mcp__musicbrainz__musicbrainz_browse_entities",
      "mcp__musicbrainz__musicbrainz_get_cover_art"
    ],
    "ask": [
      "mcp__musicbrainz__musicbrainz_get_label"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as musicbrainz. Review it before you use it.