musicbrainz-mcp-server
Server Details
Search MusicBrainz artists, releases, works, labels; resolve ISRC/ISWC/barcode; fetch cover art.
- Status
- Healthy
- Uptime
- 99.9% over 64 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/musicbrainz-mcp-server
- GitHub Stars
- 1
- Server Listing
- musicbrainz-mcp-server
TDQS
Scored across 10 tools
Each tool targets a clearly distinct operation: per-entity get_* lookups, browse_entities for paginated linked sets, search_entities for name resolution, and lookup_identifier for exact ID resolution. The descriptions explicitly delineate boundaries (e.g. browse vs. get for release-groups, get_recording vs. get_work for relationship details), leaving little room for misselection.
All tools share the musicbrainz_ prefix and a consistent verb_noun pattern (get_artist, get_release_group, browse_entities, search_entities, lookup_identifier). Entity names are singular and stem-consistent across get_* variants.
Ten tools is well-scoped for a read-only reference-data server, with each tool covering a distinct entity type or retrieval strategy. No tool appears redundant or padded.
Core music entities (artist, label, release, release-group, recording, work) plus cover art, search, browse, and identifier lookup cover the main workflows thoroughly. Minor gaps exist for secondary entity types like area, event, place, and series that lack dedicated get_* lookups, though these are less central to the apparent scope.
Available Tools
10 toolsmusicbrainz_browse_entitiesmusicbrainz-mcp-server: browse entitiesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| link | Yes | Exactly one parent MBID. The valid key depends on target_type (see the description). | |
| limit | No | Page size (1–100). | |
| offset | No | Result offset for deep pagination (0-based). | |
| target_type | Yes | The entity type to enumerate (the children). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page size that was applied. Absent when not truncated. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of entities returned in this page. Absent when not truncated. |
| notice | No | How to page further when results remain, or guidance when empty. |
| offset | No | The offset used for this page. |
| entities | No | This page of linked entities, in upstream order. |
| linkMbid | No | The parent MBID that was browsed. |
| linkType | No | The parent link type used (artist, label, release-group, release, recording, work, or area). |
| truncated | No | True when more entities remain beyond this page (offset + shown < totalCount). Absent when the page is complete. |
| targetType | No | The entity type that was enumerated. |
| totalCount | No | True total number of linked entities upstream (the {type}-count field). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), so the description earns credit for adding what they don't: pagination semantics ('offset pages to any depth'), the meaning of totalCount, and the shape of returned rows ('release rows carry status, other entity subtypes use type'). It does not discuss error behavior or what happens with an invalid/extra link key, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and the dense middle sentences each carry distinct routing or semantic content. It is information-packed rather than padded, though the target-type/link enumeration is a long comma chain that slightly taxes readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description needn't explain return values, yet it still clarifies totalCount, row status/type fields, and the identity-not-performance distinction for recordings. Combined with annotations and a fully documented schema, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the per-property schema cannot: the mapping from target_type to which link key is valid, plus the warning that recording browse returns identities rather than performance attributes. The schema's own link description merely defers to the description, so this mapping is genuinely load-bearing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource ('Paginate entities linked to one parent MBID') and then enumerates the exact parent→child combinations supported (release-groups by artist, releases by artist/label/release-group/recording, etc.). This lets an agent distinguish it from the get_* and search_entities siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: use this tool for the complete entity set rather than the single upstream page embedded in get_* lookups, and names alternatives with their conditions ('use musicbrainz_get_recording for work relationships and musicbrainz_get_release for tracks'). It also states the input constraint ('Provide exactly one valid parent link'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_artistmusicbrainz-mcp-server: get artistARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Artist MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). | |
| inc_relationships | No | Include band-membership / collaboration relationships and external links (url-rels). | |
| inc_release_groups | No | Include the discography (release-groups). Capped at one page; use browse for the full set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The one-page cap that was applied. Absent when not truncated. |
| area | No | Associated area name. Omitted when unknown. |
| mbid | No | Artist MBID. |
| name | No | Artist name. |
| tags | No | Community tags/genres with vote counts (may be empty). |
| type | No | Artist type (Person, Group, Orchestra, …). Omitted when unknown. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of release-groups returned. Absent when not truncated. |
| gender | No | Gender, for person-type artists. Omitted when unknown/inapplicable. |
| notice | No | How to fetch the complete discography when truncated. |
| aliases | No | Alternate names (may be empty). |
| country | No | ISO country code. Omitted when unknown. |
| lifeSpan | No | Birth/death or formation/dissolution span. Omitted when unknown. |
| sortName | No | Sortable name form. Omitted when absent. |
| truncated | No | True when the discography hit the one-page cap and more release-groups exist. Absent when the full set fit in one page. |
| externalLinks | No | External resource links (url-rels) — Wikidata, Discogs, official site (may be empty). |
| relationships | No | Band membership and collaboration relationships (may be empty). |
| releaseGroups | No | Discography — release-groups (one page; may be empty or capped). |
| disambiguation | No | Short qualifier distinguishing same-named artists. Omitted when absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/openWorld, so the safety profile is covered. The description adds real behavioral context beyond that: release-groups are capped at one upstream page of 25 while relationships are uncapped, which tells the agent when results will be truncated and what the inc_* flags actually gate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core identity and payload, then the cap caveat, then the routing instruction. The enumerated field list is long but each entry maps to a returned section, so it earns its space; minor trimming would not hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers the remaining gaps an agent needs: what is included, the release-group page cap, the uncapped relationships, and where to go for the complete discography.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters and the baseline is 3. The description still earns extra credit by tying the two boolean flags to observable behavior (the 25-item page cap vs. uncapped relationships), which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Artist profile by MBID') and then enumerates the exact payload an agent gets back: type, country, life span, gender, area, aliases, tags/genres, release-groups, relationships, external links. It also distinguishes itself from a sibling by naming musicbrainz_browse_entities as the route for the full release-group set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative and the condition that selects it: 'For the complete release-group list, call musicbrainz_browse_entities with target_type=release-group and link.artist.' No when-not guidance is offered against the other get_* siblings (get_label, get_release_group, etc.), so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_cover_artmusicbrainz-mcp-server: get cover artARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Release or release-group MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). | |
| entity_type | No | Whether the MBID is a release (default) or a release-group. | release |
Output Schema
| Name | Required | Description |
|---|---|---|
| mbid | No | The MBID that was queried. |
| error | No | Present when the call failed. Absent on success. |
| hasArt | No | Whether any cover art exists for this entity. |
| images | No | Cover-art images (empty when the entity has no art). |
| notice | No | Present when the entity has no art: states that no images exist, or — when the MBID could not be checked against MusicBrainz — that its existence is unconfirmed. |
| entityType | No | Whether the MBID was treated as a release or release-group. |
| representativeRelease | No | For a release-group query, the release MBID whose art was returned. Omitted for direct release queries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/idempotent/open-world profile, yet the description adds the critical non-obvious behaviors: no art yields an empty set rather than an error, a non-matching MBID yields entity_not_found, release-group art is proxied from a representative release, and images are linked not rehosted with licensing implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by return contents, error semantics, resolution behavior, and licensing. It is dense rather than padded, though the closing copyright/CC0 sentence is more informational than operationally required.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is unnecessary; the description nonetheless supplies the two failure-mode distinctions and the release-group resolution rule that the schema cannot express. Nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining what entity_type actually changes — that a release-group MBID is transparently resolved to a representative release's art, which is exactly the semantic an agent needs to pick the enum value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Cover Art Archive images for a release or release-group MBID') and enumerates what comes back (front/back flags, image types, full-res and thumbnail URLs). An agent can immediately separate this from metadata siblings like get_release or get_release_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the decision space between empty-set and entity_not_found, and tells the agent that release-group MBIDs are auto-resolved to a representative release. It does not, however, explicitly route an agent away from or toward a sibling tool for the metadata-only case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_labelmusicbrainz-mcp-server: get labelARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Label MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). |
Output Schema
| Name | Required | Description |
|---|---|---|
| area | No | Associated area name. Omitted when unknown. |
| mbid | No | Label MBID. |
| name | No | Label name. |
| tags | No | Community tags/genres (may be empty). |
| type | No | Label type. Omitted when unknown. |
| error | No | Present when the call failed. Absent on success. |
| aliases | No | Alternate names (may be empty). |
| country | No | ISO country code. Omitted when unknown. |
| lifeSpan | No | Founding/dissolution span. Omitted when unknown. |
| sortName | No | Sortable name form. Omitted when absent. |
| labelCode | No | Label code (LC number), without the "LC" prefix. Omitted when absent. |
| externalLinks | No | External resource links (url-rels) (may be empty). |
| disambiguation | No | Short qualifier. Omitted when absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), so the description is not obliged to restate them. It does add genuine behavioral context beyond the structured fields: the release set is deliberately excluded because it can reach tens of thousands of items. It says nothing about rate limits, caching, or auth, so it is helpful rather than complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded: the payload fields come first, then the caveat plus the redirect. Nothing is repeated from the title, schema, or annotations, and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; the description's field inventory and the explicit exclusion of the release set cover the only non-obvious behavior. For a single-MBID lookup with full annotation and schema coverage, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required MBID parameter and schema description coverage is 100%, including the UUID pattern and whitespace/case tolerance, so the schema already carries the meaning. The description adds nothing about the identifier format, which is the correct baseline for a one-parameter tool whose schema is fully documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Label by MBID" gives a specific verb+resource, and the description enumerates what the label record contains (type, country, life span, label code, area, aliases, tags, url-rels). It also distinguishes itself from siblings by naming the exact alternative for the release set, so an agent can route without reading any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-not and an alternative: releases are a potentially huge linked set, so they are not embedded here and should be enumerated with musicbrainz_browse_entities (target_type=release, link.label). That is strong routing guidance, but it does not address the upstream step of obtaining the MBID (e.g. via musicbrainz_search_entities), so it stops short of full when-to-use coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_recordingmusicbrainz-mcp-server: get recordingARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Recording MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). | |
| inc_relationships | No | Include performance/production relationships (performers, producers, engineers) and work-rels. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mbid | No | Recording MBID. |
| error | No | Present when the call failed. Absent on success. |
| isrcs | No | ISRCs assigned to this recording (may be empty). |
| title | No | Recording title. |
| length | No | Recording length as m:ss. Omitted when unknown. |
| releases | No | Releases this recording appears on (may be empty). |
| artistCredit | No | Credited artists (may be empty). |
| externalLinks | No | External resource links (url-rels) (may be empty). |
| relationships | No | Performance/production relationships and work-rels (may be empty). |
| disambiguation | No | Short qualifier. Omitted when absent. |
| firstReleaseDate | No | Earliest release date for this recording. Omitted when absent. |
| artistCreditString | No | Display string of the artist credit with join phrases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds a genuinely non-obvious behavioral trait: 'Relationships are not capped,' warning that the response payload can grow unbounded when inc_relationships is on. It still omits any mention of MusicBrainz rate limits or what happens on an unknown MBID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the entity definition and disambiguation, then field list, then routing guidance - a sensible priority order with no filler. The sentences are long and clause-heavy, but each carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it correctly focuses on scope, entity disambiguation and routing to siblings. Remaining gaps are minor: no error behavior for invalid MBIDs and no note on request rate constraints for this open-world API.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the mbid format/whitespace behavior and what inc_relationships includes are already fully documented in the schema. The description's echo of 'performer/production credits' and its 'not capped' note are the only additions, so the baseline 3 for a schema-driven parameter set is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (get a recording by MBID) and immediately disambiguates it from the abstract work entity, which is the most likely confusion among siblings like musicbrainz_get_work. It then enumerates the payload (length, artist credits, ISRCs, release appearances, work relationships, credits), so an agent knows exactly what it gets back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes two related needs to the right tools: release appearances to musicbrainz_browse_entities (with target_type=release, link.recording) and work-enumeration to the browse-recording-by-work path, positioning this tool as the source of work-relationship detail. It never states when NOT to call this tool (e.g. when only a search hit is needed), so it falls short of the full when/when-not/alternatives rubric.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_releasemusicbrainz-mcp-server: get releaseARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Release MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Release date. Omitted when absent. |
| mbid | No | Release MBID. |
| error | No | Present when the call failed. Absent on success. |
| media | No | Media (discs) with their tracklists (may be empty). |
| title | No | Release title. |
| script | No | Text-representation script code. Omitted when absent. |
| status | No | Release status (Official, Promotion, Bootleg, …). Omitted when absent. |
| barcode | No | Barcode (UPC/EAN). Omitted when absent; empty string upstream means "known to have none". |
| country | No | Release country code. Omitted when absent. |
| coverArt | No | Whether cover art exists (availability stub from WS/2). |
| language | No | Text-representation language code. Omitted when absent. |
| labelInfo | No | Label / catalog-number pairings (may be empty). |
| packaging | No | Packaging type (Jewel Case, Digipak, …). Omitted when absent. |
| artistCredit | No | Credited artists (may be empty). |
| disambiguation | No | Short qualifier. Omitted when absent. |
| releaseGroupId | No | Parent release-group MBID — chain to musicbrainz_get_release_group. Omitted when absent. |
| artistCreditString | No | Display string of the artist credit with join phrases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, openWorld), so the bar is lower. The description adds real behavioral context: track lengths are rendered m:ss though stored as milliseconds upstream, and it returns a cover-art availability stub rather than images. It does not mention pagination or error behavior, but for a read-only lookup this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with what the tool returns, and the sibling call-out lands last where it belongs. It is on the long side for a single-parameter lookup, but each clause maps to a distinct returned field rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still summarizes the payload shape and flags the m:ss rendering quirk and the cover-art stub. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single mbid parameter is fully documented in-schema including the UUID pattern and whitespace tolerance. The description adds only 'by MBID', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get release' / 'One edition's full detail by MBID') and enumerates what the detail contains (tracklist, label, barcode, country, date, format, packaging). The agent can immediately distinguish it from get_release_group, get_recording, and get_cover_art.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to a sibling: 'For the actual cover image URLs, call musicbrainz_get_cover_art with this release MBID.' This is a clear when-to-use-next rule. It lacks guidance on release vs release_group selection, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_release_groupmusicbrainz-mcp-server: get release groupARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Release-group MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The one-page cap that was applied. Absent when not truncated. |
| mbid | No | Release-group MBID. |
| tags | No | Community tags/genres (may be empty). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of releases returned. Absent when not truncated. |
| title | No | Release-group title. |
| notice | No | Present when the releases list was capped (how to fetch the complete set of editions) and/or when cover-art availability could not be checked (why coverArt is omitted). |
| coverArt | No | Cover-art availability from the Cover Art Archive: the images of the release-group's representative release, the same art musicbrainz_get_cover_art returns (exists: false with count 0 when the archive has none). Omitted when the archive lookup could not complete — the notice says so. |
| releases | No | Releases (editions) in this group (one page; may be empty or capped — use browse for all). |
| truncated | No | True when the releases list hit the one-page cap and more editions exist. Absent when the full set fit in one page. |
| primaryType | No | Primary type (Album, Single, EP, Broadcast, Other). Omitted when absent. |
| artistCredit | No | Credited artists (may be empty). |
| disambiguation | No | Short qualifier. Omitted when absent. |
| secondaryTypes | No | Secondary types (Live, Compilation, Soundtrack, …). Omitted when none. |
| firstReleaseDate | No | Earliest release date across all editions. Omitted when absent. |
| artistCreditString | No | Display string of the artist credit with join phrases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld safety, so the description is not burdened with that. It adds genuinely useful behavioral detail: the embedded releases list is capped at one page (25), which warns the agent about truncation. It omits rate limits and auth, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the tool's purpose and return contents before the routing sentences, and every sentence carries information. The opening sentence is dense with enumerated fields, which slightly hurts scannability but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be documented, yet the description still summarizes payload contents and explicitly handles the truncation/routing gap. For a single-param lookup tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, so the schema already documents the MBID format and whitespace tolerance. The description implies identification by MBID but adds no format or edge-case detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Release-group ... by MBID') and immediately disambiguates the domain concept ('the album' above specific pressings). It also clearly sets itself apart from siblings get_release and browse_entities by scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: browse_entities with target_type=release and link.release-group for the full edition set, get_release for a specific edition's tracklist, and get_cover_art for image URLs. Both when-to-use and alternatives are named with concrete parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_get_workmusicbrainz-mcp-server: get workARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mbid | Yes | Work MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted). | |
| inc_relationships | No | Include writer/composer relationships, recording relationships, and external links. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Server-side recording relationship cap, when truncated. |
| mbid | No | Work MBID. |
| tags | No | Community tags/genres (may be empty). |
| type | No | Work type (Song, Symphony, …). Omitted when unknown. |
| error | No | Present when the call failed. Absent on success. |
| iswcs | No | ISWCs assigned to this work (may be empty). |
| shown | No | Number of recording relationships returned when truncated. |
| title | No | Work title. |
| notice | No | Recording enumeration and relationship-detail retrieval guidance when truncated. |
| aliases | No | Alternate titles (may be empty). |
| languages | No | Lyrics languages (ISO codes; may be empty). |
| truncated | No | True only when recording relationships were omitted beyond 25. |
| totalCount | No | Exact number of recording relationships before the server-side slice. Absent when relationships are disabled. |
| externalLinks | No | External resource links (url-rels) (may be empty). |
| relationships | No | All non-recording relationships and the first 25 recording relationships in upstream order (may be empty). |
| disambiguation | No | Short qualifier. Omitted when absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), so the bar is lower. The description adds genuinely useful behavior: it returns the first 25 recording relationships with exact total and explicit truncation disclosure while preserving other relationships — a real disclosure detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and its facets before the cross-tool routing, which is the right ordering. It is somewhat dense and the 'then use ...; browse alone does not return those details' clause is slightly winding, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 100%-documented schema and an output schema present, the description needn't explain return format. It adds relationship-truncation behavior and sibling routing, leaving little for an agent to infer before calling correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (mbid, inc_relationships) are fully documented in the schema; baseline 3 applies. The description implies what relationships may be included but adds no syntax or default-value detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (get a Work by MBID) and immediately disambiguates the resource from the sibling concept 'recording'. It also enumerates the returned facets (type, languages, ISWCs, writers, aliases, tags, external links), so an agent knows exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to siblings: browse_entities (target_type=recording, link.work) for browsing, and get_recording for work-related attributes/dates, noting that browse alone does not return those details. It gives clear context and alternatives but stops short of stating when not to call this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_lookup_identifiermusicbrainz-mcp-server: lookup identifierARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | The identifier value. ISRC e.g. "USRC17607839"; ISWC e.g. "T-010.140.236-1"; barcode = the UPC/EAN digits, e.g. "075678164125" (spaces and hyphens are ignored; any other character, including a wildcard, is rejected). | |
| id_type | Yes | Which standard identifier: isrc (recording), iswc (work), or barcode (release). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| result | No | The resolved entities, discriminated by `kind` (recordings | works | releases). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, and the description adds key behavioral context: ISRC/ISWC hit dedicated exact endpoints, while barcode is a Lucene search filter with ranked results and exact matches scoring 100. It also tells agents to expect a kind field identifying the returned entity type. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, all load-bearing, with the core decision first and mode-specific nuances following. It avoids repeating the schema and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with a full input schema and an output schema, the description covers the workflow decision, endpoint behavior differences, and output shape signal. Nothing an agent needs to correctly invoke or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters completely, and the description enriches them by explaining what each identifier type represents, that ISRC can map to multiple recordings, and that barcode results are ranked with exact matches at 100. This is genuine added meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb-resource pair ('Resolve a standard identifier to MusicBrainz entities') and immediately contrasts it with name search, establishing this as the deterministic ID-based lookup. It maps each id_type to its entity class, which clearly distinguishes it from the musicbrainz_search_entities and musicbrainz_get_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as the deterministic path when an ID is already held, and says 'without a name search', which sets a clear boundary against search_entities. The id_type mapping also tells agents which entity type each mode returns. It does not name sibling tools directly, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
musicbrainz_search_entitiesmusicbrainz-mcp-server: search entitiesARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return (1–100). | |
| query | Yes | Lucene query string; must contain non-whitespace text. Plain text matches names/titles; field scoping (e.g. `artist:`, `country:`, `tag:`) is supported. Sent to MusicBrainz exactly as given. | |
| offset | No | Result offset for pagination (0-based). | |
| entityType | Yes | Which entity type to search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when zero results matched — how to broaden or correct the query. |
| results | No | Ranked matches, in MusicBrainz score-descending order. |
| entityType | No | The entity type that was searched. |
| totalCount | No | Total matches upstream before the limit/offset window. |
| effectiveQuery | No | The query string as sent to MusicBrainz. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, so the safety profile is covered. The description adds real behavioral context beyond them: results are ordered by MusicBrainz score-descending, scores are 0–100 with 100 = exact, and the query is passed through verbatim to Lucene. It stops short of documenting rate limits or pagination caps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the scope, then moves to output shape and the chaining guidance. Dense but almost all sentences carry distinct information; the relevance-score sentence is the only one that borders on restating return detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, 2-required search tool with full schema coverage and an output schema, the description covers purpose, query syntax, result ordering, score semantics, and the follow-up tool. Nothing an agent needs to select and invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by specifying the accepted Lucene field-scoping syntax with a worked example (`artist:radiohead AND country:GB`), which helps an agent construct a valid query string even though the schema only asserts field scoping is supported.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (full-text search) plus the resource (MusicBrainz entity type) and enumerates the entity types searched. The 'Starting point when resolving a name to an MBID' framing cleanly separates it from the musicbrainz_get_* siblings and from browse_entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage context: it is the starting point for name→MBID resolution and the returned MBID should be chained into the matching musicbrainz_get_* tool. It does not explicitly contrast with musicbrainz_browse_entities, the nearest alternative, so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
- Changed
musicbrainz_browse_entities13 fields changed- added
Input schema / properties / link / additionalPropertiesAdded value: +{} - added
Input schema / properties / link / properties / area / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Input schema / properties / link / properties / artist / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Input schema / properties / link / properties / label / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Input schema / properties / link / properties / recording / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Input schema / properties / link / properties / releaseAdded value: +{ + "description": "Parent release MBID (recording entities in this edition, not ordered tracks).", + "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$", + "type": "string" +} - added
Input schema / properties / link / properties / release-group / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Input schema / properties / link / properties / releaseGroupAdded value: +{ + "description": "Alias for release-group; use only one spelling.", + "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$", + "type": "string" +} - added
Input schema / properties / link / properties / release_groupAdded value: +{ + "description": "Alias for release-group; use only one spelling.", + "pattern": "^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$", + "type": "string" +} - added
Input schema / properties / link / properties / work / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Output schema / properties / entities / items / properties / statusAdded value: +{ + "description": "Release status (e.g. Official or Bootleg). Omitted for other entity types or when absent.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_link`: No link MBID was provided, more than one was provided, or the link MBID is malformed (HTTP 400). `entity_not_found`: The link MBID is well-formed but no such parent entity exists (HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_link`: A parent key is unknown, aliases collide, not exactly one nonempty parent is supplied, or the MBID/parent combination is invalid. `entity_not_found`: The link MBID is well-formed but no such parent entity exists (HTTP 404). Other values are possible when a failure originates below the handler." - changed
Output schema / properties / linkType / descriptionPrevious value: -"The parent link type used (artist, label, release-group, recording, work, or area)."New value: +"The parent link type used (artist, label, release-group, release, recording, work, or area)."
- Changed
musicbrainz_get_artist3 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Artist MBID (36-character UUID)."New value: +"Artist MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no artist exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or MusicBrainz rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no artist exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."
- Changed
musicbrainz_get_cover_art3 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Release or release-group MBID (36-character UUID)."New value: +"Release or release-group MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel — a value MusicBrainz rejects outright (HTTP 400). `entity_not_found`: The MBID is well-formed but no entity of the given entity_type exists with it (the archive returns 404 and the MusicBrainz check of the MBID returns 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or an upstream rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no entity of the given entity_type exists with it (the archive returns 404 and the MusicBrainz check of the MBID returns 404). Other values are possible when a failure originates below the handler."
- Changed
musicbrainz_get_label3 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Label MBID (36-character UUID)."New value: +"Label MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no label exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or MusicBrainz rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no label exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."
- Changed
musicbrainz_get_recording3 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Recording MBID (36-character UUID)."New value: +"Recording MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no recording exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or MusicBrainz rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no recording exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."
- Changed
musicbrainz_get_release3 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Release MBID (36-character UUID)."New value: +"Release MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no release exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or MusicBrainz rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no release exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."
- Changed
musicbrainz_get_release_group3 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Release-group MBID (36-character UUID)."New value: +"Release-group MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no release-group exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or MusicBrainz rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no release-group exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."
- Changed
musicbrainz_get_work9 fields changed- changed
Input schema / properties / mbid / descriptionPrevious value: -"Work MBID (36-character UUID)."New value: +"Work MBID (hyphenated hexadecimal UUID; surrounding whitespace and uppercase accepted)." - added
Input schema / properties / mbid / patternAdded value: +"^\\s*[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\s*$" - added
Output schema / properties / capAdded value: +{ + "description": "Server-side recording relationship cap, when truncated.", + "type": "number" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no work exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (rejected before fetch), or MusicBrainz rejects it with HTTP 400. `entity_not_found`: The MBID is well-formed but no work exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler." - added
Output schema / properties / noticeAdded value: +{ + "description": "Recording enumeration and relationship-detail retrieval guidance when truncated.", + "type": "string" +} - changed
Output schema / properties / relationships / descriptionPrevious value: -"Writer/composer/lyricist relationships and recording-rels — the complete set (may be empty)."New value: +"All non-recording relationships and the first 25 recording relationships in upstream order (may be empty)." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of recording relationships returned when truncated.", + "type": "number" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Exact number of recording relationships before the server-side slice. Absent when relationships are disabled.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True only when recording relationships were omitted beyond 25.", + "type": "boolean" +}
- Changed
musicbrainz_search_entities1 field changed- added
Output schema / properties / results / items / properties / statusAdded value: +{ + "description": "Release status (e.g. Official or Bootleg). Omitted for other entity types or when absent.", + "type": "string" +}
4 tool updates
- Changed
musicbrainz_get_cover_art3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (the upstream returns HTTP 400). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel — a value MusicBrainz rejects outright (HTTP 400). `entity_not_found`: The MBID is well-formed but no entity of the given entity_type exists with it (the archive returns 404 and the MusicBrainz check of the MBID returns 404). Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_mbid" -]New value: +[ + "invalid_mbid", + "entity_not_found" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Notice when no art exists for the entity."New value: +"Present when the entity has no art: states that no images exist, or — when the MBID could not be checked against MusicBrainz — that its existence is unconfirmed."
- Changed
musicbrainz_get_release_group3 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "mbid", - "title", - "artistCredit", - "artistCreditString", - "releases", - "tags", - "coverArt" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "title", + "artistCredit", + "artistCreditString", + "releases", + "tags" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / coverArt / descriptionPrevious value: -"Whether cover art exists (availability stub from WS/2)."New value: +"Cover-art availability from the Cover Art Archive: the images of the release-group's representative release, the same art musicbrainz_get_cover_art returns (exists: false with count 0 when the archive has none). Omitted when the archive lookup could not complete — the notice says so." - changed
Output schema / properties / notice / descriptionPrevious value: -"How to fetch the complete list of editions when truncated."New value: +"Present when the releases list was capped (how to fetch the complete set of editions) and/or when cover-art availability could not be checked (why coverArt is omitted)."
- Changed
musicbrainz_lookup_identifier3 fields changed- changed
Input schema / properties / value / descriptionPrevious value: -"The identifier value. ISRC e.g. \"USRC17607839\"; ISWC e.g. \"T-010.140.236-1\"; barcode e.g. \"075678164125\"."New value: +"The identifier value. ISRC e.g. \"USRC17607839\"; ISWC e.g. \"T-010.140.236-1\"; barcode = the UPC/EAN digits, e.g. \"075678164125\" (spaces and hyphens are ignored; any other character, including a wildcard, is rejected)." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `identifier_not_found`: The identifier is well-formed but resolves to zero entities. `invalid_identifier`: The ISRC/ISWC is malformed (the dedicated endpoint returns HTTP 400). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `identifier_not_found`: The identifier is well-formed but resolves to zero entities. `invalid_identifier`: The ISRC/ISWC is malformed (the dedicated endpoint returns HTTP 400), or the barcode contains anything other than digits once spaces and hyphens are removed. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "description": "ISRC result arm: recordings carrying the ISRC.", - "properties": { - "identifier": { - "description": "The looked-up identifier value.", - "type": "string" - }, - "kind": { - "const": "recordings", - "description": "ISRC resolved to recordings.", - "type": "string" - }, - "recordings": { - "description": "Recordings carrying this ISRC.", - "items": { - "additionalProperties": false, - "description": "A recording carrying the looked-up ISRC.", - "properties": { - "artistCredit": { - "description": "Credited artist string; falls back to \"Unknown artist\" when none is recorded.", - "type": "string" - }, - "length": { - "description": "Recording length as m:ss. Omitted when unknown.", - "type": "string" - }, - "mbid": { - "description": "Recording MBID — chain to musicbrainz_get_recording.", - "type": "string" - }, - "title": { - "description": "Recording title.", - "type": "string" - } - }, - "required": [ - "mbid", - "title", - "artistCredit" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "kind", - "identifier", - "recordings" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "ISWC result arm: works carrying the ISWC.", - "properties": { - "identifier": { - "description": "The looked-up identifier value.", - "type": "string" - }, - "kind": { - "const": "works", - "description": "ISWC resolved to works.", - "type": "string" - }, - "works": { - "description": "Works carrying this ISWC.", - "items": { - "additionalProperties": false, - "description": "A work carrying the looked-up ISWC.", - "properties": { - "mbid": { - "description": "Work MBID — chain to musicbrainz_get_work.", - "type": "string" - }, - "title": { - "description": "Work title.", - "type": "string" - }, - "type": { - "description": "Work type. Omitted when absent.", - "type": "string" - } - }, - "required": [ - "mbid", - "title" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "kind", - "identifier", - "works" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Barcode result arm: releases carrying the barcode.", - "properties": { - "identifier": { - "description": "The looked-up identifier value.", - "type": "string" - }, - "kind": { - "const": "releases", - "description": "Barcode resolved to releases.", - "type": "string" - }, - "releases": { - "description": "Releases carrying this barcode (ranked).", - "items": { - "additionalProperties": false, - "description": "A release carrying the looked-up barcode.", - "properties": { - "artistCredit": { - "description": "Credited artist string.", - "type": "string" - }, - "country": { - "description": "Release country code. Omitted when absent.", - "type": "string" - }, - "date": { - "description": "Release date. Omitted when absent.", - "type": "string" - }, - "mbid": { - "description": "Release MBID — chain to musicbrainz_get_release.", - "type": "string" - }, - "score": { - "description": "Lucene relevance score, 0–100 (barcode is a search filter; exact = 100).", - "type": "number" - }, - "title": { - "description": "Release title.", - "type": "string" - } - }, - "required": [ - "mbid", - "title", - "artistCredit", - "score" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "kind", - "identifier", - "releases" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "description": "ISRC result arm: recordings carrying the ISRC.", + "properties": { + "identifier": { + "description": "The looked-up identifier value.", + "type": "string" + }, + "kind": { + "const": "recordings", + "description": "ISRC resolved to recordings.", + "type": "string" + }, + "recordings": { + "description": "Recordings carrying this ISRC.", + "items": { + "additionalProperties": false, + "description": "A recording carrying the looked-up ISRC.", + "properties": { + "artistCredit": { + "description": "Credited artist string; falls back to \"Unknown artist\" when none is recorded.", + "type": "string" + }, + "length": { + "description": "Recording length as m:ss. Omitted when unknown.", + "type": "string" + }, + "mbid": { + "description": "Recording MBID — chain to musicbrainz_get_recording.", + "type": "string" + }, + "title": { + "description": "Recording title.", + "type": "string" + } + }, + "required": [ + "mbid", + "title", + "artistCredit" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "identifier", + "recordings" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "ISWC result arm: works carrying the ISWC.", + "properties": { + "identifier": { + "description": "The looked-up identifier value.", + "type": "string" + }, + "kind": { + "const": "works", + "description": "ISWC resolved to works.", + "type": "string" + }, + "works": { + "description": "Works carrying this ISWC.", + "items": { + "additionalProperties": false, + "description": "A work carrying the looked-up ISWC.", + "properties": { + "mbid": { + "description": "Work MBID — chain to musicbrainz_get_work.", + "type": "string" + }, + "title": { + "description": "Work title.", + "type": "string" + }, + "type": { + "description": "Work type. Omitted when absent.", + "type": "string" + } + }, + "required": [ + "mbid", + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "identifier", + "works" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Barcode result arm: releases carrying the barcode.", + "properties": { + "identifier": { + "description": "The barcode digits that were searched (spaces and hyphens removed).", + "type": "string" + }, + "kind": { + "const": "releases", + "description": "Barcode resolved to releases.", + "type": "string" + }, + "releases": { + "description": "Releases carrying this barcode (ranked).", + "items": { + "additionalProperties": false, + "description": "A release carrying the looked-up barcode.", + "properties": { + "artistCredit": { + "description": "Credited artist string.", + "type": "string" + }, + "country": { + "description": "Release country code. Omitted when absent.", + "type": "string" + }, + "date": { + "description": "Release date. Omitted when absent.", + "type": "string" + }, + "mbid": { + "description": "Release MBID — chain to musicbrainz_get_release.", + "type": "string" + }, + "score": { + "description": "Lucene relevance score, 0–100 (barcode is a search filter; exact = 100).", + "type": "number" + }, + "title": { + "description": "Release title.", + "type": "string" + } + }, + "required": [ + "mbid", + "title", + "artistCredit", + "score" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "identifier", + "releases" + ], + "type": "object" + } +]
- Changed
musicbrainz_search_entities3 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Lucene query string. Plain text matches names/titles; field scoping (e.g. `artist:`, `country:`, `tag:`) is supported."New value: +"Lucene query string; must contain non-whitespace text. Plain text matches names/titles; field scoping (e.g. `artist:`, `country:`, `tag:`) is supported. Sent to MusicBrainz exactly as given." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `blank_query`: The query contains only whitespace (it is blank after trimming). Other values are possible when a failure originates below the handler." - added
Output schema / properties / error / properties / data / properties / reason / examplesAdded value: +[ + "blank_query" +]
10 tool updates
- Changed
musicbrainz_browse_entities6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "targetType", + "linkType", + "linkMbid", + "entities", + "offset", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_link`: No link MBID was provided, more than one was provided, or the link MBID is malformed (HTTP 400). `entity_not_found`: The link MBID is well-formed but no such parent entity exists (HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_link", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "targetType", - "linkType", - "linkMbid", - "entities", - "offset", - "totalCount" -]
- Changed
musicbrainz_get_artist6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "name", + "aliases", + "tags", + "releaseGroups", + "relationships", + "externalLinks" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no artist exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "name", - "aliases", - "tags", - "releaseGroups", - "relationships", - "externalLinks" -]
- Changed
musicbrainz_get_cover_art6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "entityType", + "images", + "hasArt" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (the upstream returns HTTP 400). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "entityType", - "images", - "hasArt" -]
- Changed
musicbrainz_get_label6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "name", + "aliases", + "tags", + "externalLinks" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no label exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "name", - "aliases", - "tags", - "externalLinks" -]
- Changed
musicbrainz_get_recording6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "title", + "artistCredit", + "artistCreditString", + "isrcs", + "releases", + "relationships", + "externalLinks" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no recording exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "title", - "artistCredit", - "artistCreditString", - "isrcs", - "releases", - "relationships", - "externalLinks" -]
- Changed
musicbrainz_get_release6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "title", + "artistCredit", + "artistCreditString", + "labelInfo", + "media", + "coverArt" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no release exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "title", - "artistCredit", - "artistCreditString", - "labelInfo", - "media", - "coverArt" -]
- Changed
musicbrainz_get_release_group6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "title", + "artistCredit", + "artistCreditString", + "releases", + "tags", + "coverArt" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no release-group exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "title", - "artistCredit", - "artistCreditString", - "releases", - "tags", - "coverArt" -]
- Changed
musicbrainz_get_work6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "mbid", + "title", + "languages", + "iswcs", + "aliases", + "tags", + "relationships", + "externalLinks" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_mbid`: The MBID is malformed or the all-zeros sentinel (MusicBrainz returns HTTP 400). `entity_not_found`: The MBID is well-formed but no work exists with it (MusicBrainz returns HTTP 404). Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_mbid", + "entity_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "mbid", - "title", - "languages", - "iswcs", - "aliases", - "tags", - "relationships", - "externalLinks" -]
- Changed
musicbrainz_lookup_identifier6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "result" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `identifier_not_found`: The identifier is well-formed but resolves to zero entities. `invalid_identifier`: The ISRC/ISWC is malformed (the dedicated endpoint returns HTTP 400). Other values are possible when a failure originates below the handler.", + "examples": [ + "identifier_not_found", + "invalid_identifier" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "result" -]
- Changed
musicbrainz_search_entities6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "entityType", + "results", + "effectiveQuery", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "entityType", - "results", - "effectiveQuery", - "totalCount" -]
3 tool updates
- Changed
musicbrainz_get_release_group5 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The one-page cap that was applied. Absent when not truncated.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "How to fetch the complete list of editions when truncated.", + "type": "string" +} - changed
Output schema / properties / releases / descriptionPrevious value: -"Releases (editions) in this group (may be empty)."New value: +"Releases (editions) in this group (one page; may be empty or capped — use browse for all)." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of releases returned. Absent when not truncated.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the releases list hit the one-page cap and more editions exist. Absent when the full set fit in one page.", + "type": "boolean" +}
- Changed
musicbrainz_get_work5 fields changed- removed
Output schema / properties / capRemoved value: -{ - "description": "The one-page cap that was applied. Absent when not truncated.", - "type": "number" -} - removed
Output schema / properties / noticeRemoved value: -{ - "description": "How to fetch the complete list of recordings of this work when truncated.", - "type": "string" -} - changed
Output schema / properties / relationships / descriptionPrevious value: -"Writer/composer/lyricist relationships and recording-rels (may be empty; recording-rels capped at one page)."New value: +"Writer/composer/lyricist relationships and recording-rels — the complete set (may be empty)." - removed
Output schema / properties / shownRemoved value: -{ - "description": "Number of recording relationships returned. Absent when not truncated.", - "type": "number" -} - removed
Output schema / properties / truncatedRemoved value: -{ - "description": "True when the recording relationships hit the one-page cap. Absent when the full set fit in one page.", - "type": "boolean" -}
- Changed
musicbrainz_lookup_identifier2 fields changed- changed
Input schema / properties / value / descriptionPrevious value: -"The identifier value. ISRC e.g. \"USRC17607839\"; ISWC e.g. \"T-345246800-1\"; barcode e.g. \"075678164125\"."New value: +"The identifier value. ISRC e.g. \"USRC17607839\"; ISWC e.g. \"T-010.140.236-1\"; barcode e.g. \"075678164125\"." - changed
Output schema / properties / result / oneOfPrevious value: -[ - { - "additionalProperties": false, - "description": "ISRC result arm: recordings carrying the ISRC.", - "properties": { - "identifier": { - "description": "The looked-up identifier value.", - "type": "string" - }, - "kind": { - "const": "recordings", - "description": "ISRC resolved to recordings.", - "type": "string" - }, - "recordings": { - "description": "Recordings carrying this ISRC.", - "items": { - "additionalProperties": false, - "description": "A recording carrying the looked-up ISRC.", - "properties": { - "artistCredit": { - "description": "Credited artist string.", - "type": "string" - }, - "length": { - "description": "Recording length as m:ss. Omitted when unknown.", - "type": "string" - }, - "mbid": { - "description": "Recording MBID — chain to musicbrainz_get_recording.", - "type": "string" - }, - "title": { - "description": "Recording title.", - "type": "string" - } - }, - "required": [ - "mbid", - "title", - "artistCredit" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "kind", - "identifier", - "recordings" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "ISWC result arm: works carrying the ISWC.", - "properties": { - "identifier": { - "description": "The looked-up identifier value.", - "type": "string" - }, - "kind": { - "const": "works", - "description": "ISWC resolved to works.", - "type": "string" - }, - "works": { - "description": "Works carrying this ISWC.", - "items": { - "additionalProperties": false, - "description": "A work carrying the looked-up ISWC.", - "properties": { - "mbid": { - "description": "Work MBID — chain to musicbrainz_get_work.", - "type": "string" - }, - "title": { - "description": "Work title.", - "type": "string" - }, - "type": { - "description": "Work type. Omitted when absent.", - "type": "string" - } - }, - "required": [ - "mbid", - "title" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "kind", - "identifier", - "works" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Barcode result arm: releases carrying the barcode.", - "properties": { - "identifier": { - "description": "The looked-up identifier value.", - "type": "string" - }, - "kind": { - "const": "releases", - "description": "Barcode resolved to releases.", - "type": "string" - }, - "releases": { - "description": "Releases carrying this barcode (ranked).", - "items": { - "additionalProperties": false, - "description": "A release carrying the looked-up barcode.", - "properties": { - "artistCredit": { - "description": "Credited artist string.", - "type": "string" - }, - "country": { - "description": "Release country code. Omitted when absent.", - "type": "string" - }, - "date": { - "description": "Release date. Omitted when absent.", - "type": "string" - }, - "mbid": { - "description": "Release MBID — chain to musicbrainz_get_release.", - "type": "string" - }, - "score": { - "description": "Lucene relevance score, 0–100 (barcode is a search filter; exact = 100).", - "type": "number" - }, - "title": { - "description": "Release title.", - "type": "string" - } - }, - "required": [ - "mbid", - "title", - "artistCredit", - "score" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "kind", - "identifier", - "releases" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "description": "ISRC result arm: recordings carrying the ISRC.", + "properties": { + "identifier": { + "description": "The looked-up identifier value.", + "type": "string" + }, + "kind": { + "const": "recordings", + "description": "ISRC resolved to recordings.", + "type": "string" + }, + "recordings": { + "description": "Recordings carrying this ISRC.", + "items": { + "additionalProperties": false, + "description": "A recording carrying the looked-up ISRC.", + "properties": { + "artistCredit": { + "description": "Credited artist string; falls back to \"Unknown artist\" when none is recorded.", + "type": "string" + }, + "length": { + "description": "Recording length as m:ss. Omitted when unknown.", + "type": "string" + }, + "mbid": { + "description": "Recording MBID — chain to musicbrainz_get_recording.", + "type": "string" + }, + "title": { + "description": "Recording title.", + "type": "string" + } + }, + "required": [ + "mbid", + "title", + "artistCredit" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "identifier", + "recordings" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "ISWC result arm: works carrying the ISWC.", + "properties": { + "identifier": { + "description": "The looked-up identifier value.", + "type": "string" + }, + "kind": { + "const": "works", + "description": "ISWC resolved to works.", + "type": "string" + }, + "works": { + "description": "Works carrying this ISWC.", + "items": { + "additionalProperties": false, + "description": "A work carrying the looked-up ISWC.", + "properties": { + "mbid": { + "description": "Work MBID — chain to musicbrainz_get_work.", + "type": "string" + }, + "title": { + "description": "Work title.", + "type": "string" + }, + "type": { + "description": "Work type. Omitted when absent.", + "type": "string" + } + }, + "required": [ + "mbid", + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "identifier", + "works" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Barcode result arm: releases carrying the barcode.", + "properties": { + "identifier": { + "description": "The looked-up identifier value.", + "type": "string" + }, + "kind": { + "const": "releases", + "description": "Barcode resolved to releases.", + "type": "string" + }, + "releases": { + "description": "Releases carrying this barcode (ranked).", + "items": { + "additionalProperties": false, + "description": "A release carrying the looked-up barcode.", + "properties": { + "artistCredit": { + "description": "Credited artist string.", + "type": "string" + }, + "country": { + "description": "Release country code. Omitted when absent.", + "type": "string" + }, + "date": { + "description": "Release date. Omitted when absent.", + "type": "string" + }, + "mbid": { + "description": "Release MBID — chain to musicbrainz_get_release.", + "type": "string" + }, + "score": { + "description": "Lucene relevance score, 0–100 (barcode is a search filter; exact = 100).", + "type": "number" + }, + "title": { + "description": "Release title.", + "type": "string" + } + }, + "required": [ + "mbid", + "title", + "artistCredit", + "score" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "kind", + "identifier", + "releases" + ], + "type": "object" + } +]
10 tool updates
- First observed
musicbrainz_browse_entities - First observed
musicbrainz_get_artist - First observed
musicbrainz_get_cover_art - First observed
musicbrainz_get_label - First observed
musicbrainz_get_recording - First observed
musicbrainz_get_release - First observed
musicbrainz_get_release_group - First observed
musicbrainz_get_work - First observed
musicbrainz_lookup_identifier - First observed
musicbrainz_search_entities
Related MCP Connectors
MusicBrainz MCP — wraps MusicBrainz Web Service v2 (free, no auth)
Search books and authors, fetch editions, browse subjects, and resolve cover images.
Search and fetch Wikidata entities, execute SPARQL queries, and resolve external identifiers.
Search, analyze, and discover commercially released music using sonic intelligence.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables searching music artists and releases, and retrieving artist biographies, discographies, release track listings, credits, and metadata through the MusicBrainz API.14 npmMIT
- AlicenseAqualityDmaintenanceEnables AI assistants to query the MusicBrainz music database for artists, albums, recordings, and labels. It provides tools for advanced searches, detailed metadata retrieval, and accessing cover art information.1713GPL 3.0
- 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
- FlicenseNot gradedqualityDmaintenanceEnables music search, metadata retrieval, local audio analysis (tempo, key, energy), recommendations, song recognition, and classical work resolution via Spotify, Last.fm, AudD, MusicBrainz, and Songkick APIs.-
Glama MCP Gateway
Add one secure layer between your agents and this server.