musicbrainz-mcp-server

v0.1.2 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 "MCP-Protocol-Version: 2025-11-25" \
  -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, type, and a 0–100 relevance score (100 = exact). 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`).

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. Plain text matches names/titles; field scoping (e.g. `artist:`, `country:`, `tag:`) is supported."
    },
    "limit": {
      "default": 25,
      "description": "Maximum results to return (1–100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "offset": {
      "default": 0,
      "description": "Result offset for pagination (0-based).",
      "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 (person/group/…), country, life span, gender, area, aliases, tags/genres, plus the discography (release-groups) and band-membership / collaboration relationships and external links (Wikidata QID, Discogs, official site — surfaced as url-rels chainable to those servers). The 80% artist-detail call. Discography and relationships are capped at one page (25); for a prolific artist's complete release-group list, call musicbrainz_browse_entities with target_type=release-group and the artist link.

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",
      "description": "Artist MBID (36-character UUID)."
    },
    "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, and a cover-art availability flag from the WS/2 payload (use musicbrainz_get_cover_art for actual image URLs). 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",
      "description": "Release-group MBID (36-character UUID)."
    }
  },
  "required": [
    "mbid"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_release

open-world

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.

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",
      "description": "Release MBID (36-character UUID)."
    }
  },
  "required": [
    "mbid"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_recording

open-world

Recording (a specific performance/track, distinct from the abstract work) by MBID: length, artist credits, ISRCs, the releases it appears on, the work(s) it performs (work-rels — chain to musicbrainz_get_work), and performance/production relationships (who played, produced, engineered, conducted — each with the role and the credited artist MBID). Relationships are capped at one page; for a heavily-covered recording call musicbrainz_browse_entities with target_type=recording and link.work.

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",
      "description": "Recording MBID (36-character UUID)."
    },
    "inc_relationships": {
      "default": true,
      "description": "Include performance/production relationships (performers, producers, engineers) and work-rels.",
      "type": "boolean"
    }
  },
  "required": [
    "mbid",
    "inc_relationships"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_get_work

open-world

Work (a composition — the song as written, distinct from any specific recording) by MBID: type, language(s), ISWCs (the work-level standard identifier), writer/composer/lyricist relationships (with the credited artist MBID), aliases, tags, and the recordings that perform it. Recording relations are capped at one page; for the complete list of recordings of a work, call musicbrainz_browse_entities with target_type=recording and link.work.

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",
      "description": "Work MBID (36-character UUID)."
    },
    "inc_relationships": {
      "default": true,
      "description": "Include writer/composer relationships, 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, 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).

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",
      "description": "Label MBID (36-character UUID)."
    }
  },
  "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). 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": "The identifier value. ISRC e.g. \"USRC17607839\"; ISWC e.g. \"T-345246800-1\"; barcode e.g. \"075678164125\"."
    }
  },
  "required": [
    "id_type",
    "value"
  ],
  "additionalProperties": false
}
view source ↗

musicbrainz_browse_entities

open-world

Paginate the COMPLETE set of entities linked to a parent MBID — every release-group by an artist, every release on a label, every recording of a work, every release in a release-group. This is the only complete-enumeration path: the get_* tools embed at most one page (25) of any linked list, so use this tool whenever a linked set may exceed a page (a prolific artist, a major label with thousands of releases, a heavily-covered work). Provide exactly ONE link MBID matching a valid parent→child relationship for the target_type. Pages arbitrarily deep via offset; totalCount is the true upstream total.

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"
        },
        "label": {
          "description": "Parent label MBID (releases on this label).",
          "type": "string"
        },
        "release-group": {
          "description": "Parent release-group MBID (releases in this group).",
          "type": "string"
        },
        "recording": {
          "description": "Parent recording MBID (releases containing this recording).",
          "type": "string"
        },
        "work": {
          "description": "Parent work MBID (recordings of this work).",
          "type": "string"
        },
        "area": {
          "description": "Parent area MBID (artists/labels in this area).",
          "type": "string"
        }
      },
      "additionalProperties": false,
      "description": "Exactly one parent MBID. The valid key depends on target_type (see the description)."
    },
    "limit": {
      "default": 25,
      "description": "Page size (1–100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "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. Returns an empty image set (NOT an error) when the entity has no art — absence of art is information. 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).

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",
      "description": "Release or release-group MBID (36-character UUID)."
    },
    "entity_type": {
      "default": "release",
      "description": "Whether the MBID is a release (default) or a release-group.",
      "type": "string",
      "enum": [
        "release",
        "release-group"
      ]
    }
  },
  "required": [
    "mbid",
    "entity_type"
  ],
  "additionalProperties": false
}
view source ↗

Resources

1

A single MusicBrainz entity by type and MBID, with default linked sub-resources folded in (mirrors the matching musicbrainz_get_* tool). entity_type ∈ artist, release-group, release, recording, work, label. Returns the raw MusicBrainz JSON record. For complete linked sets (a prolific artist's discography, a label's releases) use musicbrainz_browse_entities — embedded lists here are capped at one page.

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