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.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@musicbrainz-mcp-serversearch for the artist 'Radiohead'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://musicbrainz.caseyjhand.com/mcp
Overview
Open music metadata from the live MusicBrainz Web Service v2 and the Cover Art Archive. Search by name, look up entities by MBID or by ISRC, ISWC, or barcode, page through complete linked sets, and fetch cover art. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Lucene search over one entity type, returning ranked MBIDs with relevance scores |
| Artist profile: type, life span, discography, relationships, external links |
| Release-group (the album across its editions): types, first-release date, editions, cover-art availability |
| One edition: tracklist, label and catalog number, barcode, packaging |
| Recording (one performance): length, ISRCs, releases it appears on, performer and production credits |
| Work (a composition): type, ISWCs, writers, and the recordings that perform it |
| Label: type, life span, label code, 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 |
Every entity is also reachable through the get_* tools, so tool-only clients lose nothing. The resource has no list; find MBIDs with musicbrainz_search_entities.
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);limit1–100 (default 25),offsetfor pagingEach 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_query
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)
musicbrainz_get_release_group tool
mbidonly; returnsprimaryType,secondaryTypes,firstReleaseDate,artistCreditwithartistCreditString, tags, and one page ofreleases(editions)coverArt(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
mbidonly; returnsmediawith tracks (position,title,lengthas m:ss,recordingId),labelInfo(label andcatalogNumber),barcode,status,date,country,packaging,language/script, andreleaseGroupIdcoverArtis the availability stub from the release record; callmusicbrainz_get_cover_artfor image URLs
musicbrainz_get_recording tool
mbid, plusinc_relationships(defaulttrue) for performer, producer, and engineer credits, work links to the composition, and external linksReturns
length,isrcs,artistCredit,firstReleaseDate, thereleasesit appears on,relationships, andexternalLinks
musicbrainz_get_work tool
mbid, plusinc_relationships(defaulttrue) for writer, composer, and lyricist credits, the recordings that perform it, and external linksReturns
type,languages,iswcs, aliases, and tags; this server keeps the first 25 recording relationships and every other relationship/link.totalCountis the exact recording-relationship count; actual omission addstruncated,shown,cap, and retrieval guidanceBrowse
recordingbyworkto enumerate recording entities, then callmusicbrainz_get_recordingfor their work relationship attributes and dates; browse does not reconstruct those details
musicbrainz_get_label tool
mbidonly; returns type, country, area,lifeSpan,labelCode(the LC number without its prefix), aliases, tags, 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 ascoreresult.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(artist,label,release-group,release,recording,work, orarea);releaseGroup/release_groupaliasrelease-group. Unknown keys and alias collisions fail by name.limit1–100 (default 25),offsetto any depthBrowse
recordingbyreleasefor recording entities in an edition;musicbrainz_get_releasesupplies ordered tracks, medium positions, and repeated recording occurrences. Release rows usestatus; subtype fields for other entities usetypeReports the upstream
totalCount; while entities remain,truncatedis set and the notice gives the nextoffset. A missing, extra, or malformed link fails asinvalid_link, an unknown parent asentity_not_found
musicbrainz_get_cover_art tool
mbidandentity_type:release(default) orrelease-group, which resolves to arepresentativeReleaseimageswithfront/back,types,imageUrl, and 250/500/1200px thumbnails; an entity with no art returns an empty set andhasArt: false, not an errorAn archive 404 is checked against MusicBrainz, so an unknown MBID fails as
entity_not_found; if the check itself fails, the empty set stands with a notice that existence is unconfirmed
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 retains the first 25 recording-target relationships and all other relations/URLs, with exact count and actual truncation in
recordingRelationshipSummary
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 hexadecimal UUID, with any version/variant groups); uppercase and surrounding whitespace normalize to lowercase. Malformed/all-zero IDs fail before fetch as
invalid_mbid(invalid_linkfor browse), while a well-shaped unknown ID remainsentity_not_foundOne process-wide limiter holds MusicBrainz calls to ~1 request/second, shared by every client of an instance, so long browse runs pace accordingly
Lookups fold discography, relationships, tracklists, and external links into one request; responses are cached (24 h by default), with retry and backoff on transient 5xx and HTML error pages
Agent-friendly output:
Artist release-groups and release-group editions embed one upstream page (25); browse enumerates the full entity set. Work recording relationships have a separate server-side cap of 25 with exact relationship counts and truthful disclosure. Artist/recording relationships and release tracklists are not subject to that slice; labels embed no releases
Provenance on search and browse: the effective query is echoed and the upstream total reported, so a partial window never reads as complete
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
Public Hosted Instance
A public instance is available at https://musicbrainz.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "streamable-http",
"url": "https://musicbrainz.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/musicbrainz-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"MUSICBRAINZ_CONTACT": "you@example.com"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/musicbrainz-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"MUSICBRAINZ_CONTACT": "you@example.com"
}
}
}
}Or with Docker:
{
"mcpServers": {
"musicbrainz-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "MUSICBRAINZ_CONTACT=you@example.com",
"ghcr.io/cyanheads/musicbrainz-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 MUSICBRAINZ_CONTACT=you@example.com bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API key or account. The server ships a default contact, but set
MUSICBRAINZ_CONTACTto your own email or URL for any shared or hosted deployment.
Installation
Clone the repository:
git clone https://github.com/cyanheads/musicbrainz-mcp-server.gitNavigate into the directory:
cd musicbrainz-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set MUSICBRAINZ_CONTACT (optional but recommended)Configuration
Variable | Description | Default |
| Contact (email or URL) sent in the | repo URL |
| MusicBrainz Web Service v2 base URL; override for a private mirror or beta. |
|
| 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. |
|
| 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
Build 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 |
| 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.9638 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 gradedqualityBmaintenanceEnables searching music artists and releases, and retrieving artist biographies, discographies, release track listings, credits, and metadata through the MusicBrainz API.14 npmMIT