musicbrainz-mcp-server
Surfaces Discogs external links within MusicBrainz entity data, enabling chaining to Discogs services for additional discography or marketplace information.
Provides tools for searching and retrieving detailed metadata from MusicBrainz, including artists, releases, recordings, works, and labels, along with cover art and identifier resolution (ISRC, ISWC, barcode).
Includes Wikidata QID links in MusicBrainz entity data, allowing integration with wikidata-mcp-server for further knowledge graph queries.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Public Hosted Server: https://musicbrainz.caseyjhand.com/mcp
Overview
Open music metadata from MusicBrainz and the Cover Art Archive: artists, releases, recordings, works, and labels. Search by name, look up by MBID, ISRC, ISWC, or barcode, page through complete discographies, and fetch cover art.
Tools
Tool | Description |
| Lucene search over one entity type, returning ranked MBIDs with relevance scores |
| Artist profile: areas, IPI/ISNI, life span, discography, relationships, external links |
| Release-group (the album across its editions): types, first-release date, editions, cover-art availability |
| One edition: tracklist with artist credits, label and catalog number, barcode, packaging, external links |
| Recording (one performance): length, ISRCs, releases it appears on, performer and production credits |
| Work (a composition): type, ISWCs, writers, movements, arrangements, and recordings |
| Label: area, IPI/ISNI, life span, label code, label relationships, external links |
| Resolve an ISRC, ISWC, or barcode to recordings, works, or releases |
| Page through every entity linked to a parent MBID |
| Cover Art Archive images for a release or release-group |
Resources
Resource | Description |
| One entity as raw MusicBrainz JSON, with the matching |
The get_* tools provide normalized lookup views for tool-only clients. The entity resource has no list; find MBIDs with musicbrainz_search_entities.
Agent skill
musicbrainz-guide covers identity checks, edition selection, discographies, credits, artwork, and Lucene queries. It ships with npm, Docker, MCPB, and plugin installs, and is available through the MCP Skills extension and skill:// resources.
Related MCP server: musicbrainz-mcp
Capability reference
musicbrainz_search_entities tool
One
entityTypeper call (artist,release-group,release,recording,work,label) and a Lucenequerywith field scoping (artist:radiohead AND country:GB); positive integerlimit(default 25, values above 100 clamp to 100 with a notice),offsetfor pagingReturns the effective
offsetand upstreamtotalCount. Continuation usesoffset + rows returned, including short pages. An empty page at or beyond a positive total reports exhaustion; an unexpectedly empty page before the total reports the discrepancy without suggesting a nonadvancing offsetSearch exposes only the first 500 matches. A page crossing that boundary is shortened with a notice; offsets of 500 or more fail as
search_window_exceeded. Narrow the query or browse a linked set to reach further matches;totalCountremains the full upstream countEach hit carries
mbid,name, and the raw 0–100scorein MusicBrainz order, plus type-specific fields such asartistCredit,isrcs,iswcs, andlength. Release rows usestatus(Official, Bootleg, …); artist, release-group, work, and label subtypes usetype. A whitespace-only query fails asblank_queryRelease-group hits also carry available
secondaryTypes; recording hits carry availablefirstReleaseDate, including partial dates
musicbrainz_get_artist tool
mbid, plusinc_release_groupsandinc_relationships(both defaulttrue) to drop the heavier sub-resourcesType, gender, country, area,
lifeSpan, aliases, and tags, plusreleaseGroups(one page),relationships(band membership, collaborations), andexternalLinks(Wikidata, Discogs, official site)areaIdcan be passed to browselink.area;beginAreaandendArearetain available MBID/name members.ipisandisnispreserve the catalog's identifier strings, including leading zeros
musicbrainz_get_release_group tool
mbidonly; returnsprimaryType,secondaryTypes,firstReleaseDate,artistCreditwithartistCreditString, tags, and one page ofreleases(editions)externalLinkscarries album-level identities such as Wikidata and Discogs masterscoverArt(exists,count,front,back) comes from a live Cover Art Archive check; when that check fails the field is omitted with a notice, never reported as "no art"
musicbrainz_get_release tool
mbid,media_offset(default 0), andmedia_limit(default 20, no maximum); returns orderedmediawith complete tracks per medium (position,title,lengthas m:ss,recordingId),labelInfo(label andcatalogNumber),barcode,status,date,country,packaging,language/script, andreleaseGroupIdmediaTotalandtrackTotalcount all normalized media and track occurrences; upstream per-mediumtrackCountis preserved.mediaOffsetidentifies the window. When more media remain,truncated,shown,cap, and a notice give the nextmedia_offset; empty end pages report exhaustion. The release resource retains the complete raw tracklistcoverArtis the availability stub from the release record; callmusicbrainz_get_cover_artfor image URLsTracks retain their own available
artistCreditandartistCreditString, independently of release or recording credits.externalLinksbelongs to the selected edition
musicbrainz_get_recording tool
mbid, plusinc_relationships(defaulttrue) for performer, producer, and engineer credits, work links, recording-to-recording relationships such as samples and remixes, and external linksReturns
length,isrcs,artistCredit,firstReleaseDate, one upstream page ofreleases(up to 25),relationships, andexternalLinksreleaseAppearanceSummaryreportsshown,cap: 25, andcompleteness: a short present page iscomplete, a full or absent page without an exact count isunknown, and an exact upstream count exceeding the returned page provestruncated.totalCountis omitted when unknown; no count request is added. Enumerate appearances withmusicbrainz_browse_entities(target_type=release,link.recording=<mbid>,offset=0), because embedded and browse order may differ
musicbrainz_get_work tool
mbid, plusinc_relationships(defaulttrue) for writer, composer, and lyricist credits, movements and arrangements, the recordings that perform it, and external linksReturns
type,languages,iswcs, aliases, and tags. Only the first 25 recording relationships are kept (other relationships and links are all kept);totalCountgives the full count, andtruncated,shown, andcapappear when some were cutattributespreserves ordered type/value rows, including musical key, catalogue metadata and society work IDs. Repeated types and exact string values are retained, even with relationships disabledTo list every recording of a work, browse
recordingbywork, then callmusicbrainz_get_recordingfor relationship attributes and datesFollow a
relationshipsentry withtargetType: "work"using itstargetIdin anothermusicbrainz_get_workcall.directiondistinguishes parent/child links; optionalorderingKeypreserves the upstream sequence key (including zero), andtargetDisambiguationdistinguishes arrangements. Relationships retain upstream array order, which need not match movement order
musicbrainz_get_label tool
mbidonly; returns type, country, area andareaId,ipis,isnis,lifeSpan,labelCode(the LC number without its prefix), aliases, tags, labelrelationships, andexternalLinksReleases are not embedded; list them with
musicbrainz_browse_entities(target_type=release,link.label)
musicbrainz_lookup_identifier tool
id_typeisrc→ recordings,iswc→ works,barcode→ releases; a barcode is UPC/EAN digits and returns up to 25 ranked matches, each with ascoreISRC accepts compact
GBAYE9701274or printedGB-AYE-97-01274, ignoring case and surrounding whitespace. ISWC acceptsT-010.140.236-1orT0101402361, with optional group punctuation, ignoring whitespace and case. Results echo the canonical compact ISRC orT-DDD.DDD.DDD-CISWC; malformed codes fail before a requestresult.kind(recordings|works|releases) names the arm that came back; failures areinvalid_identifieroridentifier_not_found
musicbrainz_browse_entities tool
target_typeplus exactly one parent MBID inlink;releaseGroup/release_groupaliasrelease-group. Positive integerlimitdefaults to 25; values above 100 clamp to 100 with a notice. SetMUSICBRAINZ_CLAMP_OVERSIZED_LIMITS=offto enforce maximum 100 for both search and browseReports upstream
totalCount; while more remain,truncatedis set and a nonempty page gives the nextoffsetusing actual rows returned. Empty pages distinguish zero linked entities, exhaustion, and an unexpected empty page before the total. Clamp and paging guidance share one notice. Release rows usestatus; other entities usetypeA missing, extra, or malformed link fails as
invalid_link, an unknown parent asentity_not_found. For ordered tracks of an edition usemusicbrainz_get_releaseRows retain available release-group
secondaryTypesand recordingfirstReleaseDate.Albumalone does not distinguish studio albums from live albums or compilationsOptional
typeandstatusfilters accept pipe-separated values with case and surrounding token whitespace normalized, echoed astype/status. Primary types union; primary and secondary categories intersect. Release-group-by-artist requires every supplied secondary type. Empty optional filters are ignored; unsupported target/parent combinations and invalid tokens fail asinvalid_filterbefore fetchingtypeis supported for release-groups by artist, and releases by artist, label, recording, ortrack_artist.statusis supported for those release parents plus release-group. Area browse supports neither filter. Preserve applied filters when paginglink.track_artistfinds releases crediting an artist on tracks but not in the release credit. Obtain area MBIDs fromget_artistorget_labelareaId; those tools do not resolve arbitrary area MBIDs
Target | Accepted parent keys |
|
|
|
|
|
|
|
|
|
|
|
|
musicbrainz_get_cover_art tool
mbidandentity_type:release(default) orrelease-group, which resolves to arepresentativeRelease;limitdefaults to 25 and clamps above 100, andoffsetdefaults to 0. These windows apply after the archive index is cached and are independent of the search/browse clamp settingimagesretain archive order withfront/back,types,imageUrl, and 250/500/1200px thumbnails.totalCountis exact,offsetidentifies the window, andhasArtreflects the full archive even on an empty end page. A single notice combines any clamp, continuation, exhaustion, or no-art guidance;truncated,shown, andcapappear when more images remainAn unknown MBID fails as
entity_not_found; if MusicBrainz can't confirm the MBID exists, the empty set comes back with a notice saying so
musicbrainz://{entity_type}/{mbid} resource
entity_typeisartist,release-group,release,recording,work, orlabel; returns the raw MusicBrainz record asapplication/jsonFetches the same default linked data as the matching
get_*tool; failures areinvalid_mbidandentity_not_foundWork JSON includes raw work-to-work relationships and keeps the first 25 recording relationships;
recordingRelationshipSummarygives the exact recording count and whether any were cutRecording JSON carries the same
releaseAppearanceSummaryas the recording tool without changing cached raw data. Release JSON retains every medium and track; the tool's media window does not apply to resources
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
MusicBrainz-specific:
Keyless client for the MusicBrainz Web Service v2 and the Cover Art Archive. Every request carries the descriptive
User-AgentMusicBrainz requires,musicbrainz-mcp-server/<version> ( <contact> ), withMUSICBRAINZ_CONTACTas the contactEntities are addressed by MBID (a hyphenated UUID); uppercase and surrounding whitespace are normalized. Malformed or all-zero IDs fail as
invalid_mbid(invalid_linkfor browse); a well-formed unknown ID fails asentity_not_foundMusicBrainz calls are held to ~1 request/second across all clients of an instance, so long browse runs take a while
Lookups fold discography, relationships, tracklists, and external links into one request; responses are cached (24 h by default) and transient upstream errors are retried with backoff
Agent-friendly output:
Artist release-groups, release-group editions, and recording release appearances embed one page (25); browse enumerates the full set. Recording appearances disclose completeness without a count request. Work recording relationships are capped at 25 with the exact count reported; labels embed no releases
Search echoes the effective query; search and browse report the exact upstream total. Missing or invalid totals fail as malformed upstream responses instead of inventing a count
Discriminated outputs:
musicbrainz_lookup_identifierreturns akind-tagged union, so callers branch on data, not string parsingRaw upstream relevance
score, not a derived confidence; missing upstream fields stay absent rather than invented
Getting started
Connect to the hosted instance:
claude mcp add --transport http musicbrainz-mcp-server https://musicbrainz.caseyjhand.com/mcpOr run it locally:
claude mcp add musicbrainz-mcp-server -- npx -y @cyanheads/musicbrainz-mcp-serverFor other clients, add this to the MCP config file:
{
"mcpServers": {
"musicbrainz-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/musicbrainz-mcp-server"]
}
}
}No API key or account is required. Set MUSICBRAINZ_CONTACT to your own email or URL for shared or hosted deployments. For Docker or a source build, see Running the server.
Configuration
Variable | Description | Default |
| Email or URL sent in the | repo URL |
| MusicBrainz Web Service v2 base URL (e.g. a private mirror). |
|
| Client-side requests-per-second ceiling (0.1–50). |
|
| Response cache TTL in seconds; |
|
| Per-request HTTP timeout, in ms. |
|
| Retry attempts for transient upstream failures. |
|
| Clamp search/browse limits above 100 with a notice; |
|
| Cover Art Archive base URL. |
|
| Transport: |
|
| HTTP server port. |
|
| Authentication: |
|
| Log level ( |
|
| Enable OpenTelemetry. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Requires Bun v1.4.0 or higher (or Node.js v24+).
git clone https://github.com/cyanheads/musicbrainz-mcp-server.git
cd musicbrainz-mcp-server
bun install
cp .env.example .envBuild and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
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 MUSICBRAINZ_CONTACT=you@example.com -p 3010:3010 musicbrainz-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/musicbrainz-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| MusicBrainz WS/2 client — User-Agent, rate limiter, response cache, retry, domain types. |
| Cover Art Archive client — maps a 404 to an empty image set, follows the release-group redirect. |
| Tool definitions ( |
| Resource definitions. The |
| Published agent guide and query reference, also served through MCP skill resources. |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources via the barrels in
src/mcp-server/*/definitions/index.tsRoute every upstream call through the services, never a direct
fetch(), so the User-Agent, rate limiter, and cache applyWrap external API data: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
MusicBrainz core entity data is CC0. The server reads only that core metadata and never fetches annotation text, which carries a different license. Cover art comes from the Cover Art Archive, a joint project of MusicBrainz and the Internet Archive; image URLs are linked, never rehosted, and each image's copyright stays with its rights holders. Cite MusicBrainz and the Cover Art Archive in downstream use.
This server cannot be deployed
Maintenance
Related MCP Connectors
MusicBrainz MCP — wraps MusicBrainz Web Service v2 (free, no auth)
Search events, conference weeks, cities, venues and artist schedules via remote MCP.
Search events, conference weeks, cities, venues and artist schedules via remote MCP.
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for querying the MusicBrainz database, providing tools to search for artists, releases, recordings, and browse music metadata.4MIT
- AlicenseAqualityAmaintenanceAn MCP server that provides live access to MusicBrainz metadata and Cover Art Archive images, with optional OAuth-based submission of tags, ratings, and collection edits.9243 npmMIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server for the Last.fm API, exposing artist, album, track, chart, and user data as read-only tools. Supports optional writes, auth, and experimental methods over stdio or HTTP.MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching music artists and releases, and retrieving artist biographies, discographies, release track listings, credits, and metadata through the MusicBrainz API.469 npmMIT