musicbrainz-mcp-server

v0.1.5 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). 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",
      "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. The recording relationships are returned in full (the work lookup does not page them).

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-010.140.236-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