FreqBlog Music Metadata
Server Details
Audio features + harmonic set-building for tracks by name/ISRC. Spotify audio-features replacement.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes (search, analyze, recommend, order), but there is notable overlap between tag_track and get_audio_features (tag_track is a subset of the full features) and between get_recommendations and suggest_next_track (both recommend tracks from seeds). The descriptions are thorough enough to differentiate them, but the boundaries are not always immediately obvious.
All tool names follow a consistent snake_case verb_noun pattern (build_setlist, find_tracks_by_key, score_transition, tag_track). The verbs are uniform (find_, get_, build_, etc.), and even compound names like get_audio_features_batch are clear extensions rather than style breaks.
With 12 tools, the set is well within the ideal 3-15 range. Each tool covers a distinct function in the music-metadata/DJ-planning domain, and none feel redundant or superfluous.
The tool surface provides complete coverage of the domain: search, single/batch analysis, tagging, recommendations, related artists, transition scoring, setlist construction, and key/BPM lookup. No obvious gaps exist for a read-only metadata and DJ-planning service; the workflow from discovery to setlist planning is fully supported.
Available Tools
12 toolsbuild_setlistBuild SetlistARead-onlyInspect
Order a crate of 2-100 catalog tracks into a beat-matched DJ set that follows an energy
arc, keeping each consecutive transition harmonically and tempo-smooth. arc is one of
peak_time (default — builds to a peak then eases), warmup, cooldown, or flat.
Returns the `arc`, `count`, an overall `flow_score` (0-100), the `tracks` in play order, the
per-step `transitions` ({from_index, to_index, score, reason}), and `omitted` (ids not found
in the catalog). Feed tracks[].itunes_track_id into a Rekordbox/Serato export to drop the set
straight into your DJ software. track_ids are catalog itunes_track_ids. Costs 5 quota units.
| Name | Required | Description | Default |
|---|---|---|---|
| arc | No | Energy arc: 'peak_time' (default), 'warmup', 'cooldown', or 'flat'. | peak_time |
| track_ids | Yes | The crate to order — 2 to 100 catalog itunes_track_ids. | |
| start_track_id | No | Optional fixed opener — must be one of track_ids. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations: it reveals the tool returns data (not mutates), costs 5 quota units, and details the output structure. Annotations already declare readOnlyHint=true and openWorldHint=true; the description reinforces non-destructive behavior and adds cost and output specifics.
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?
The description is efficient at 4-5 sentences, starting with the main action and then detailing arc, output, usage, and cost. It is front-loaded with the core purpose. Slightly dense but no wasted words.
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?
The description is comprehensive: covers input limits (2-100 tracks), arc options, output structure (flow_score, transitions, omitted ids), and even a usage hint (feed into DJ software). Given the tool's complexity and the presence of an output schema, the description adds ample context and covers all key aspects.
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 baseline is 3. The description repeats schema info for 'arc' options and 'track_ids' meaning, but adds minimal extra context: start_track_id constraint 'must be one of track_ids'. No significant new meaning beyond schema definitions.
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?
The description clearly states the tool's action: 'Order a crate of 2-100 catalog tracks into a beat-matched DJ set that follows an energy arc.' It specifies the resources (catalog tracks) and the output (setlist with transitions, score, etc.). This distinguishes it from siblings like suggest_next_track or score_transition, which focus on individual aspects.
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?
The description implies usage: when you have a crate of tracks and want a harmonically and tempo-smooth DJ set. It does not explicitly exclude alternatives or mention when not to use it, but the context is clear and no sibling differentiation is provided. The mention of cost provides a constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_compatible_keysFind Harmonically Compatible KeysARead-onlyInspect
Given a Camelot key (e.g. "8A", "12B"), return the harmonically compatible keys for DJ
mixing — the same key, the relative major/minor, and the adjacent +/-1 keys on the
Camelot wheel. With extended=true also returns the +7/-7 energy-boost / energy-drop
keys. Pure music theory — no catalog lookup and no quota cost. Pair with find_tracks_by_key
to then pull actual tracks in each compatible key.
| Name | Required | Description | Default |
|---|---|---|---|
| camelot | Yes | Camelot key, e.g. '8A' or '12B'. | |
| extended | No | Also return the +7/-7 energy-boost / energy-drop keys. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given annotations (readOnlyHint=true, openWorldHint=false), the description adds context about no catalog lookup and no quota cost, which aligns with the read-only nature. It does not contradict annotations and provides additional behavioral details.
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 concise sentences that front-load the purpose and immediately convey core functionality. Every sentence adds value without redundancy.
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 the tool's simplicity and presence of an output schema, the description is complete. It explains what the tool returns, what it does not (no catalog lookup), and how to use it in context with other tools.
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 has 100% description coverage, but the description adds meaning by explaining the harmonic logic (same key, relative major/minor, adjacent +/-1, extended +7/-7). This goes beyond the schema's simple parameter description.
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?
The description clearly states the tool returns harmonically compatible keys for DJ mixing given a Camelot key, specifying the types of keys (same, relative, adjacent +/-1, and optionally +7/-7). It distinguishes from the sibling 'find_tracks_by_key' by emphasizing that this is pure music theory with no catalog lookup.
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 describes when to use (to get harmonic compatibility for DJ mixing) and when not to (no catalog lookup). Suggests pairing with 'find_tracks_by_key' for actual track retrieval, providing a clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_tracks_by_bpmFind Tracks by BPMARead-onlyInspect
Find catalog tracks near a target tempo. Returns tracks whose BPM is within
+/-tolerance of bpm, ordered by closeness then by an internal catalogue ordering key (not an audience metric) — useful for DJ set
planning, workout playlists, or tempo-matching. Each returned track carries full audio
features. To also constrain by musical key, combine with find_tracks_by_key.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | Yes | Target tempo in BPM. | |
| limit | No | Max tracks (default 10). | |
| tolerance | No | Plus/minus BPM window (default 2). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint. The description adds valuable behavior beyond that: it explains the ordering ('by closeness then by an internal catalogue ordering key (not an audience metric)') and the output richness ('Each returned track carries full audio features'). This is context an agent needs to interpret results and decide on downstream steps, so it adds meaningful transparency.
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?
The description is two substantive sentences plus a final combination hint. The core purpose is front-loaded in the first sentence, and every subsequent clause adds useful context (ordering, use cases, audio features, key combination). There is no fluff or redundancy, and it stays compact.
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 doesn't need to detail return fields. It covers the matching rule, ordering, use cases, and how to extend with find_tracks_by_key. The safety profile is handled by annotations (readOnlyHint). Nothing an agent needs to invoke and interpret the 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 all three parameters (bpm, limit, tolerance) are already documented with descriptions. The description reiterates the tolerance concept ('within +/- tolerance of bpm') and ties it to ordering, but it doesn't add new syntax or format details. The baseline for high schema coverage is 3, and the description adds only marginal value, so 3 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?
The description opens with a specific verb and resource: 'Find catalog tracks near a target tempo.' It clearly states the matching rule (BPM within +/- tolerance) and the ordering, and it explicitly references the sibling tool find_tracks_by_key for key-based filtering, which distinguishes it from that alternative. The purpose is unambiguous and distinct.
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 provides clear usage context: 'useful for DJ set planning, workout playlists, or tempo-matching.' It also gives an explicit alternative condition: 'To also constrain by musical key, combine with find_tracks_by_key.' It lacks a direct 'when not to use' for other siblings like search_catalog or get_recommendations, but the combination hint and the tempo-specific focus give sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_tracks_by_keyFind Tracks by Musical KeyARead-onlyInspect
Find catalog tracks in a given musical key — for harmonic mixing and key-locked
playlists. key accepts Camelot ("8A"), Open Key ("1m"), or a key name ("A-Minor",
"F#-Major"). Returns tracks ordered by an internal catalogue ordering key (not an audience metric), each with full audio features. To
discover which keys mix well with a given key first, use find_compatible_keys.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Camelot ('8A'), Open Key ('1m'), or key name ('A-Minor', 'F#-Major'). | |
| limit | No | Max tracks (default 10). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already provide readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe read operation. The description adds valuable context: it reveals that the result ordering is by an internal catalogue key, explicitly stating it is NOT an audience metric (e.g., popularity). It also mentions that each result includes full audio features, which sets expectations about the response richness. This goes beyond what annotations alone would convey.
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?
The description is three sentences, compact and comprehensive. The first sentence immediately states the purpose and use case, making it front-loaded. The second sentence details the key parameter format and return ordering behavior, and the third sentence provides a clear alternative. No fluff, every sentence earns its place.
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 this is a read-only query tool with only 2 parameters, the description covers everything: the filtering capability, the parameter formats, the output characteristics (full audio features, ordering), and the workflow with siblings. The output schema exists, so return structure is presumably documented elsewhere. The description is fully sufficient for an agent 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 description coverage is 100%, and the 'key' parameter description in the schema already lists the accepted formats (Camelot, Open Key, key name). The description reaffirms these formats and adds that it accepts formats like '8A', '1m', 'A-Minor', giving concrete examples. For the 'limit' parameter, the default and max are clear from schema. The minimal additional info beyond schema earns a baseline 3.
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?
The description clearly states the action (find catalog tracks), the resource (tracks), and the specific filter (musical key). It explicitly mentions the use cases (harmonic mixing, key-locked playlists) and differentiates from sibling find_tracks_by_bpm (which filters by BPM not key) and find_compatible_keys (which finds key compatibility, not tracks). This is a specific and unambiguous purpose.
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?
The description explicitly tells the agent when to use this tool (when you need tracks in a specific key) and when to use find_compatible_keys first (to discover which keys mix well). This clear routing to the sibling reduces ambiguity and provides practical workflow guidance, which is exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audio_featuresGet Audio FeaturesARead-onlyInspect
Get audio features for ONE track — BPM, musical key (name + Camelot + Open Key), energy, danceability, valence, acousticness, instrumentalness, liveness, speechiness, loudness, mood, mood_vector, genre, time signature, duration and more.
This is the drop-in replacement for Spotify's deprecated /audio-features endpoint.
Provide AT LEAST ONE identifier — if you know several, send them all rather than
choosing; they resolve by precedence (`track` > `isrc` > `mbid` > `spotify_id`) and
the rest are ignored:
- `track` (optionally with `artist`) — e.g. track="Blinding Lights", artist="The Weeknd".
- `isrc` — e.g. "USUM71900001".
- `mbid` — a MusicBrainz recording UUID.
- `spotify_id` — a Spotify track ID, URI, or URL (resolved from our ID map or by
matching the track's title; ambiguous titles miss rather than guess — prefer
`track`/`isrc` for full coverage).
Returns a JSON object of features. Some feature fields may be null for tracks resolved
via the fallback catalogs (only audio-derived values are present for fully analysed
tracks). If a track name is not yet in the catalog, the API holds the request during the
on-demand ingest and usually returns the fully analysed track inline in this same call;
only if the ingest runs long does it fall back to a queued response you can re-poll
shortly (~15s). If the track turns out not to be on any streaming source we can analyse,
you get a definitive not-found instead — that verdict is terminal for ~7 days, so don't
retry it. If you only have a fuzzy or partial name, call search_catalog first to
find the exact track.
| Name | Required | Description | Default |
|---|---|---|---|
| isrc | No | ISRC, e.g. 'USUM71900001'. | |
| mbid | No | MusicBrainz recording ID (UUID). The precise key when there is no ISRC, e.g. pre-1986 recordings. | |
| track | No | Track title. Use with `artist` when known. Supply AT LEAST ONE of track/isrc/mbid/spotify_id. Sending several is fine — they resolve by precedence (track > isrc > mbid > spotify_id) and the rest are ignored. | |
| artist | No | Artist name. Only used with `track`; required when the title is <=2 characters. | |
| spotify_id | No | Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolved from our Spotify-ID map or, on a miss, by matching the track's title — a title several artists share is ambiguous and misses rather than guessing; prefer track (+artist) or isrc. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses substantial behavioral traits: identifier precedence, null fields for fallback catalogs, on-demand ingest that may hold the request, a queued response fallback after ~15s, and a terminal 7-day not-found verdict. This gives the agent accurate expectations about latency and retry behavior.
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?
The description is longer than average, but every sentence earns its place: purpose is front-loaded, identifier guidance is bulleted, and edge-case behaviors are clearly separated. The detail is justified by the tool's complex resolution and ingest behavior.
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 the output schema is provided and annotations cover read-only/open-world behavior, the description completes the picture: return shape, null handling, fallback catalogs, ingest latency, poll timing, and definitive not-found semantics. Nothing needed to invoke the 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 adds real value beyond the schema: it explains the full precedence order (track > isrc > mbid > spotify_id), advises sending several identifiers instead of choosing, and gives realistic examples. It largely reinforces rather than replaces the schema, so slightly above baseline.
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?
The description opens with a specific verb and resource: 'Get audio features for ONE track', followed by a concrete list of returned features. It clearly distinguishes this single-track tool from the batch sibling and from search_catalog.
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?
The description gives explicit guidance on identifier selection, precedence, and tells users to 'call search_catalog first' when they only have a fuzzy name. However, it never explicitly routes multi-track requests to the get_audio_features_batch sibling; it only implies that through 'ONE track'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audio_features_batchGet Audio Features (Batch)ARead-onlyInspect
Get audio features for MANY tracks in one call (up to 50 processed) — ideal for
analysing a whole playlist at once. Identify each item by name (track/artist), by
isrc (matched exactly first — best for CJK / K-pop / niche tracks whose fuzzy
name-match misses), or both (ISRC first, name as the fallback).
One bad entry never fails the batch. Items beyond the 50-per-call cap come back with
`found: false` and `backfill_status: "over_limit"`; an item missing BOTH `track` and
`isrc` comes back `"invalid_no_query"`. Neither is processed or charged — the response's
`skipped` field counts them, so split a long list into calls of <=50 and resubmit any
skipped rows.
Returns counts (`found` / `not_found` / `skipped`) plus a per-track `results` array, where
each entry's `result` is the same feature object as get_audio_features (or null when not
found), and `isrc` is echoed back. An item is billed only when it returns features or
queues an on-demand ingest; an ISRC/name with no match anywhere is free. A track you
queue and then collect costs ONE unit, not two — the call that collects it is free.
For a single track, use get_audio_features.
| Name | Required | Description | Default |
|---|---|---|---|
| tracks | Yes | List of {track?, artist?, isrc?} objects. Up to 50 are processed per call; any extra (up to 200 accepted) come back skipped. Each item should carry `track` or `isrc`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint and openWorldHint annotations, the description adds substantial behavioral context: 'One bad entry never fails the batch,' items over the cap return `found: false` and `backfill_status: "over_limit"`, missing both identifiers yields `"invalid_no_query"`, and the billing rules ('An item is billed only when it returns features or queues an on-demand ingest...') are disclosed. This fully informs the agent of success/failure and cost behavior without contradicting 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?
The description is longer than many, but every paragraph earns its place: purpose and scope, failure modes, return structure, billing, and the pointer to the single-track sibling. It is front-loaded with the primary use case and the 'up to 50' constraint, then organizes edge cases logically. A slight condensation of the billing paragraph could help, but the complexity justifies the length.
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?
The description is complete for a tool with this complexity: it covers the parameter structure, batch limit, invalid-entry behavior, response contents (`counts`, `results`, `skipped`), billing implications, and differentiation from get_audio_features. The output schema exists, so detailed return formatting is not required, but the description still summarizes it sufficiently. No critical information for correct invocation 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?
Although schema coverage is 100%, the description adds significant meaning beyond the schema: it clarifies the batch processing limit (50 of up to 200 accepted), explains the matching precedence ('ISRC first, name as the fallback'), and defines what `invalid_no_query` means for the `tracks` array. It also explains how the `skipped` field relates to parameter usage, which the schema alone does not convey.
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?
The description opens with a specific verb and resource ('Get audio features for MANY tracks in one call') and clearly differentiates itself from its sibling get_audio_features by stating 'For a single track, use get_audio_features.' It also states the ideal use case ('analysing a whole playlist at once'), leaving no ambiguity about what the tool does.
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?
The description explicitly gives when-to-use guidance: batch playlist analysis vs. single-track lookup, and names the alternative tool. It also provides operational instructions for handling the 50-per-call cap ('split a long list into calls of <=50 and resubmit any skipped rows') and explains when to prefer ISRC over name matching. This goes far beyond implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendationsGet RecommendationsARead-onlyInspect
Recommended tracks for one or more seed tracks — the drop-in for Spotify's removed GET /v1/recommendations. Blends up to 5 catalog seed tracks into a single point in audio-feature space and returns the nearest catalogue tracks, RE-RANKED by genre affinity (so a feature-close cross-genre track doesn't outrank same-genre picks).
Returns `seeds` (each {id, found}), `count`, and `tracks` (each {track, score,
genre_relation}; each track carries its `genre`). `genre_relation` is "same", "compatible"
(different but mixable family), "cross" (unrelated), or "unknown" (either side has no mapped
genre), measured against the PRIMARY seed — the first of your seed_tracks we could actually
use, so reordering seed_tracks changes it and a skipped seed never becomes the reference.
With a SINGLE seed the field is the ranking's own verdict, so it explains the order (same as
suggest_next_track). With SEVERAL seeds the ranking considers ALL of them while the label stays
relative to your primary seed, so a "cross" label on a multi-seed call does NOT mean the track
was pushed down — it may share a family with another of your seeds. `score` is the raw
audio-feature cosine similarity in [0,1]; genre affinity influences the ORDER, not the score,
so the list is NOT strictly score-descending.
Use cross_genre=strict to return same-genre-family tracks ONLY (off-genre dropped
server-side), or allow to disable the genre ranking. seed_tracks are catalog itunes_track_ids
from search_catalog or the itunes_track_id field of a get_audio_features result.
NO id? Pass `track` (+ optional `artist`) instead and we resolve the name to the best catalog
match and seed on it — the resolved track is echoed back as `seed_query`; seed_tracks wins if
both are given.
TUNING: `min`/`max` are HARD filters and `target` is a preference (nearer ranks higher,
nothing removed), over acousticness, danceability, duration_ms, energy, instrumentalness,
liveness, loudness, speechiness, tempo and valence. NOTE: `popularity` was RETIRED as a
tunable on 2026-08-27 and now returns a 400 — it recorded how a track entered our
catalogue, not audience size. The field is still returned. e.g. min={"tempo": 100},
max={"tempo": 130}, target={"energy": 0.8} for energetic 100-130 BPM tracks. When you tune,
the response adds a `filters` block saying what applied, how many tracks each bound removed
(`dropped_by`) and whether the bounds ran out of catalogue before `limit` (`limit_reached`)
— if the list comes back short, read that BEFORE assuming the catalogue is thin.
Costs 2 quota units.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | HARD upper bounds, e.g. {'tempo': 130}. Same attributes as `min`. Combine the two for a range. | |
| min | No | HARD lower bounds, e.g. {'tempo': 100, 'energy': 0.5}. Tracks below the bound — and tracks we hold no analysed value for — are dropped. Attributes: acousticness, danceability, duration_ms, energy, instrumentalness, liveness, loudness, speechiness, tempo, valence. | |
| limit | No | Number of recommendations to return (default 20). | |
| track | No | Seed by track NAME instead of an id — resolved to the best catalog match (echoed back as seed_query). Pair with artist to disambiguate. Ignored when seed_tracks is given. | |
| artist | No | Artist name narrowing the track seed (case-insensitive). | |
| target | No | PREFERRED values, e.g. {'energy': 0.8}. Tracks nearer the value rank higher; unlike min/max nothing is removed. Same attributes as `min`. | |
| cross_genre | No | Genre handling (mirrors suggest_next_track): 'auto' (default) re-ranks by genre affinity so a feature-close cross-genre track can't outrank same-genre picks; 'strict' = same genre-family only (off-genre dropped server-side); 'allow' = genre-blind (pure audio-feature cosine). | auto |
| seed_tracks | No | 1-5 catalog itunes_track_ids to base recommendations on, e.g. ['apple_ad1829eeccb70f9a'] (blended into a feature-space centroid). Omit and use track(+artist) to seed by name instead. | |
| exclude_seed_artists | No | Drop tracks by any of the seed artists (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=true; the description carries the full behavioral burden and excels. It discloses that the list is NOT strictly score-descending, explains the multi-seed 'cross' label caveat, the primary-seed reference semantics, the filters block when tuning, the 400 error on popularity, and the 2-quota-unit cost. No contradiction with 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?
Long but densely packed; every sentence earns its place given the 9-parameter complexity and subtle ranking semantics. It is front-loaded with purpose and alternatives. Could be tightened slightly (e.g., trimming the tuning example), but the density justifies the length.
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 covers return values, yet the description still details response structure (seeds/count/tracks), edge cases (skipped seeds, short lists via filters block), multi-seed semantics, error behavior (400 on popularity), quota cost, and how to source seed ids from sibling tools search_catalog and get_audio_features. Nothing an agent needs 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% with already-rich parameter descriptions, so the baseline is 3. The description adds genuine value on top: the hard-filter (min/max) vs preference (target) distinction, the seed_tracks-wins-if-both-given interaction, the seed_query echo, and the popularity retirement warning — all beyond what the schema states.
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 precise verb and resource ('Recommended tracks for one or more seed tracks') and explicitly positions itself as the drop-in for Spotify's removed GET /v1/recommendations. It distinguishes its unique re-ranking-by-genre-affinity behavior and names suggest_next_track as a related sibling, making its scope unambiguous.
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 when-to-use guidance: how to choose between seed_tracks vs track/artist, when to set cross_genre to strict/allow, and explicitly references suggest_next_track as the cross_genre mirror. Includes concrete tuning examples and warns about the retired popularity parameter, so an agent knows exactly when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_transitionScore TransitionARead-onlyInspect
Score how well one catalog track mixes into another (0-100) — the pairwise DJ transition score no raw key/BPM API gives you. Combines Camelot-wheel key compatibility, octave-aware BPM proximity (half/double-time counts as a match), and energy smoothness.
Returns the overall `score`, per-component scores (`harmonic`/`tempo`/`energy`), a `detail`
block (key_relation, both Camelot keys, both BPMs, bpm_delta, bpm_octave_matched, both
energies, energy_delta), and a one-line human `reason` (e.g. "8A->9A adjacent (+1), 126->128
BPM (+2), energy +0.04 — clean uplifting mix"). Both ids are catalog itunes_track_ids — get
them from search_catalog or the itunes_track_id field of a get_audio_features result. Costs
1 quota unit.
| Name | Required | Description | Default |
|---|---|---|---|
| to_track_id | Yes | The candidate track you're mixing INTO — a catalog itunes_track_id. | |
| from_track_id | Yes | The track you're mixing FROM — a catalog itunes_track_id, e.g. 'apple_ad1829eeccb70f9a'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description details exact return structure (overall score, per-component scores, detail block with key/BPM/energy info, human reason) and explains mixing components (Camelot compatibility, BPM proximity, energy smoothness). Aligns with readOnlyHint annotation.
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?
Description is efficient with 4 sentences, front-loaded with purpose, and structured logically. Minor redundancy but overall concise.
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?
Covers all aspects: purpose, input sources, return fields, cost, and complements annotations (readOnlyHint, openWorldHint). No gaps given output schema existence.
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 covers both required parameters with descriptions. Description reinforces they are catalog itunes_track_ids and provides an example, adding value beyond 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?
Description clearly states it scores DJ transition compatibility between two tracks (0-100) and distinguishes from sibling tools like get_audio_features (individual track features) and suggest_next_track (track suggestion).
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?
Description provides context for when to use (pairwise scoring not available elsewhere) and where to obtain track IDs (search_catalog or get_audio_features). Lacks explicit when-not-to-use, but sibling list compensates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogSearch Music CatalogARead-onlyInspect
Full-text search the catalog by any mix of track / artist / album tokens. Use this to resolve a fuzzy, partial, or misspelled name into concrete tracks BEFORE calling get_audio_features.
Each hit carries `chart_peak`: the best chart position we hold, 1-100 with 100 = a
number-one. `null` means no placement we hold — treat that as UNKNOWN, not unpopular,
and note it is NOT an audience-size figure. Coverage is Billboard year-end only so far.
Returns lightweight stubs (itunes_track_id, track_name, artist_name, album, etc.) ranked
by relevance — NOT audio features. Take the best match's track_name + artist_name and
pass them to get_audio_features, or reuse its itunes_track_id as a `track_id` seed for
discovery tools.
⚠ Each hit carries a `seedable` boolean. Only a hit with `seedable: true` can be used as
a seed for get_recommendations / suggest_next_track / build_setlist / score_transition —
those work off the similarity index, which holds only tracks we have analysed, and about
a quarter of the catalogue is not analysed yet. **Prefer the highest-ranked hit with
`seedable: true`.** Seeding with a `seedable: false` id returns a 404; if that track is
the one you want, call get_audio_features on it first to queue analysis, then retry.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query — any mix of artist / track / album tokens. | |
| limit | No | Max results (default 10). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds crucial behavioral details: returns lightweight stubs ranked by relevance, explains chart_peak semantics (100 = number-one, null = UNKNOWN not unpopular, Billboard year-end only), and explains the seedable boolean with its implications (404, queue analysis). This is rich context beyond 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?
The description is long but every section serves a purpose: purpose, usage, result interpretation, and seeding rules. It is front-loaded with the main purpose and then layers detail logically. No filler; each sentence earns its place.
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 the complexity (chart_peak interpretation, seedable flag, 404 behavior, routing to other tools), the description covers all necessary behavioral aspects for correct invocation. The output schema exists but the description adds the semantic nuances that schema cannot convey. Nothing an agent needs 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% with both q and limit having descriptions. The description doesn't add new input semantics beyond schema, but it does clarify usage of q in context (any mix of tokens). Since schema already covers parameters, baseline 3 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?
The description opens with a specific verb and resource ('Full-text search the catalog by any mix of track / artist / album tokens') and immediately differentiates from siblings by stating it resolves fuzzy names before calling get_audio_features, and by noting it returns stubs not audio features. This gives an agent a clear, distinct purpose.
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 states when to use it ('BEFORE calling get_audio_features') and provides detailed follow-up instructions: take best match and pass to get_audio_features or reuse itunes_track_id as seed, plus guidance on seedable flag and 404 handling. This is far beyond typical guidance and routes the agent to the correct next steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_next_trackSuggest Next TrackARead-onlyInspect
Given a seed track, return the top-N catalog tracks to play NEXT, ranked by transition
score. Each suggestion carries the same score, per-component scores and human reason as
score_transition (e.g. "11B->11B same key, 118->117 BPM (-0.29), energy +0.12"), plus its
genre and genre_relation to the seed. GENRE-AWARE by default (cross_genre=auto): off-genre
picks that only coincidentally share the seed's key/BPM sink to the bottom — use
cross_genre=strict for same-genre-family only, or allow for the old harmonic-only ranking. It
is the seed's sonic neighbours re-ranked for a clean mix.
Returns `seed`, `count`, and a `suggestions` array of {track, score, components, reason}.
seed_track_id is a catalog itunes_track_id from search_catalog or a get_audio_features
result. Pair with build_setlist to order a whole crate. Costs 3 quota units.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many next-track suggestions to return (default 10). | |
| bpm_drift | No | Max BPM difference pre-filter before scoring (default 12). | |
| min_score | No | Drop candidates below this overall transition score (default 0). | |
| cross_genre | No | Genre handling: 'auto' (default) keeps picks in a mixable genre lane so an off-genre track that only shares key/BPM sinks to the bottom; 'strict' = same genre-family only; 'allow' = genre-blind (harmonic+tempo+energy only). | auto |
| seed_track_id | Yes | The track currently playing — a catalog itunes_track_id. | |
| max_key_distance | No | Max Camelot-wheel hops pre-filter before scoring (default 2). | |
| exclude_same_artist | No | Drop tracks by the seed's artist (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, which align with a read-only suggestion tool. Description adds value by stating cost (3 quota units), explaining genre-awareness defaults, and detailing output format. 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?
Reasonably concise given the information volume. Organized with clear purpose first, then output details, genre modes, and usage context. A few sentences could be tightened (e.g., 'It is the seed's sonic neighbours re-ranked for a clean mix'), but overall economical.
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 7 parameters, full schema coverage, and existing output schema, the description sufficiently explains output format (seed, count, suggestions array with details). Mentions pairing with build_setlist for workflows. Minor gap: no handling of invalid seed_track_id or error cases, but acceptable for a suggestion tool.
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 covers 100% of parameters with descriptions. Description adds context for seed_track_id (acceptable sources) and cross_genre (behavior explanation), enhancing clarity beyond the schema's basic descriptions.
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?
Clearly states verb (return, suggest), resource (catalog tracks to play NEXT), and scope (ranked by transition score). Distinguishes from siblings like score_transition by specifying it returns suggestions based on a seed, not a pair score. Mentions output includes score, components, reason, genre.
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?
Describes when to use (given a seed track), explains cross_genre modes, and suggests pairing with build_setlist. Lacks explicit when-not-to-use alternatives like score_transition or find_compatible_keys, but the purpose implies the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_trackTag TrackARead-onlyInspect
Get a compact, HONESTLY-LABELLED tag list for a track — energy / danceability / valence / acousticness / instrumentalness, plus a mood tag and a broad genre tag. It is a tag-shaped projection of the same open-data analysis get_audio_features returns (no audio upload, no extra compute), so it costs the same 1 quota unit, charged only on a served result.
The differentiator vs opaque taggers (e.g. Cyanite) is that EVERY tag carries its own
`confidence` and `provenance`:
- confidence: measured (our Essentia analysis) | derived (MIREX mood from valence+energy) |
model-estimated (AcousticBrainz mood SVM probability — research-grade, raw prob in `value`) |
catalog-genre (broad catalogue tag, not fine-grained).
- provenance: essentia | valence+energy | acousticbrainz | catalog.
`value` is the [0,1] score for numeric tags and null for label-only tags (mood category, genre).
Provide AT LEAST ONE identifier: `track` (optionally with `artist`), `isrc`, `mbid`,
`spotify_id`, or `track_id` (catalog itunes_track_id). If you know several, send them all —
they resolve by precedence (`track` > `isrc` > `track_id` > `mbid` > `spotify_id`) and the
rest are ignored, so you never have to pick. The broad, reliable coverage is the
MEASURED tags from our Essentia analysis over the analysed catalogue (plus on-demand by name);
MBID/ISRC additionally reach 7.5M+ AcousticBrainz recordings WHEN you supply that identifier.
Returns { track, count, tags:[{tag, category, value, confidence, provenance}], disclaimer }.
For the full numeric feature set use get_audio_features; for nearest tracks use a discovery tool.
| Name | Required | Description | Default |
|---|---|---|---|
| isrc | No | ISRC, e.g. 'USUM71900001'. | |
| mbid | No | MusicBrainz recording ID (UUID). Tags come from AcousticBrainz for that exact recording. | |
| track | No | Track title. Use with `artist` when known. Supply AT LEAST ONE of track/isrc/mbid/spotify_id/track_id. Sending several is fine — they resolve by precedence (track > isrc > track_id > mbid > spotify_id). | |
| artist | No | Artist name. Only used with `track`; improves accuracy. | |
| track_id | No | Catalog itunes_track_id from a search_catalog or get_audio_features result. | |
| spotify_id | No | Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolved from our Spotify-ID map or, on a miss, by matching the track's title — a title several artists share is ambiguous and misses rather than guessing; prefer track (+artist) or isrc. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations readOnlyHint=true and openWorldHint=true are corroborated and extended: the description adds quota cost, resolution precedence, 'misses rather than guessing' on ambiguous Spotify-ID title matches, and the provenance/confidence semantics of each tag. It explains coverage differences between Essentia and AcousticBrainz data without contradicting 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?
The description is long, but every section earns its place: purpose, differentiation, provenance semantics, identifier guidance, return shape, and alternatives. It is front-loaded with the core action and uses compact formatting for the confidence/provenance taxonomy.
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 6-parameter tool with an output schema, the description is complete: it states required input combinations, result shape, cost, coverage caveats, and how to get alternative outputs. An agent has everything needed to select identifiers and interpret tags.
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 already 100%, and the description adds meaning beyond it: the precedence hierarchy track > isrc > track_id > mbid > spotify_id, the role of artist as an accuracy booster, the 7.5M+ AcousticBrainz coverage via MBID/ISRC, and the ambiguity behavior of spotify_id. This lets an agent choose identifiers correctly.
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?
Description opens with a precise verb and resource: 'Get a compact, HONESTLY-LABELLED tag list for a track' and enumerates the exact tag categories. It distinguishes itself from get_audio_features ('full numeric feature set') and 'a discovery tool', so an agent can tell it apart.
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?
Explicit routing guidance closes the description: 'For the full numeric feature set use get_audio_features; for nearest tracks use a discovery tool.' It also states the required input condition (AT LEAST ONE identifier), the precedence order, and when MBID/ISRC are advantageous.
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.
1 tool update
- Changed
get_recommendations1 field changed- changed
Input schema / properties / min / descriptionPrevious value: -"HARD lower bounds, e.g. {'tempo': 100, 'energy': 0.5}. Tracks below the bound — and tracks we hold no analysed value for — are dropped. Attributes: acousticness, danceability, duration_ms, energy, instrumentalness, liveness, loudness, popularity, speechiness, tempo, valence."New value: +"HARD lower bounds, e.g. {'tempo': 100, 'energy': 0.5}. Tracks below the bound — and tracks we hold no analysed value for — are dropped. Attributes: acousticness, danceability, duration_ms, energy, instrumentalness, liveness, loudness, speechiness, tempo, valence."
2 tool updates
- Changed
get_audio_features1 field changed- changed
Input schema / properties / spotify_id / descriptionPrevious value: -"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (<1% of the catalog) — prefer track (+artist) or isrc."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolved from our Spotify-ID map or, on a miss, by matching the track's title — a title several artists share is ambiguous and misses rather than guessing; prefer track (+artist) or isrc."
- Changed
tag_track1 field changed- changed
Input schema / properties / spotify_id / descriptionPrevious value: -"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (<1% of the catalog) — prefer track (+artist) or isrc."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolved from our Spotify-ID map or, on a miss, by matching the track's title — a title several artists share is ambiguous and misses rather than guessing; prefer track (+artist) or isrc."
1 tool update
- Changed
get_recommendations3 fields changed- added
Input schema / properties / maxAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "HARD upper bounds, e.g. {'tempo': 130}. Same attributes as `min`. Combine the two for a range.", + "title": "Max" +} - added
Input schema / properties / minAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "HARD lower bounds, e.g. {'tempo': 100, 'energy': 0.5}. Tracks below the bound — and tracks we hold no analysed value for — are dropped. Attributes: acousticness, danceability, duration_ms, energy, instrumentalness, liveness, loudness, popularity, speechiness, tempo, valence.", + "title": "Min" +} - added
Input schema / properties / targetAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "PREFERRED values, e.g. {'energy': 0.8}. Tracks nearer the value rank higher; unlike min/max nothing is removed. Same attributes as `min`.", + "title": "Target" +}
2 tool updates
- Changed
get_audio_features1 field changed- changed
Input schema / properties / track / descriptionPrevious value: -"Track title. Use with `artist` when known. Required field is ONE of track/isrc/mbid/spotify_id."New value: +"Track title. Use with `artist` when known. Supply AT LEAST ONE of track/isrc/mbid/spotify_id. Sending several is fine — they resolve by precedence (track > isrc > mbid > spotify_id) and the rest are ignored."
- Changed
tag_track1 field changed- changed
Input schema / properties / track / descriptionPrevious value: -"Track title. Use with `artist` when known. Required field is ONE of track/isrc/mbid/spotify_id/track_id."New value: +"Track title. Use with `artist` when known. Supply AT LEAST ONE of track/isrc/mbid/spotify_id/track_id. Sending several is fine — they resolve by precedence (track > isrc > track_id > mbid > spotify_id)."
2 tool updates
- Changed
get_audio_features1 field changed- changed
Input schema / properties / spotify_id / descriptionPrevious value: -"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (~2.4% of the catalog) — prefer track (+artist) or isrc."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (<1% of the catalog) — prefer track (+artist) or isrc."
- Changed
tag_track1 field changed- changed
Input schema / properties / spotify_id / descriptionPrevious value: -"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (~2.4% of the catalog) — prefer track (+artist) or isrc."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (<1% of the catalog) — prefer track (+artist) or isrc."
1 tool update
- Changed
get_audio_features1 field changed- changed
Input schema / properties / spotify_id / descriptionPrevious value: -"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolves ONLY tracks already mapped to a Spotify ID (~2.4% of the catalog) — prefer track (+artist) or isrc."
1 tool update
- Changed
get_recommendations10 fields changed- added
Input schema / properties / artistAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Artist name narrowing the track seed (case-insensitive).", + "title": "Artist" +} - added
Input schema / properties / seed_tracks / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "maxItems": 5, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / seed_tracks / defaultAdded value: +null - changed
Input schema / properties / seed_tracks / descriptionPrevious value: -"1-5 catalog itunes_track_ids to base recommendations on, e.g. ['apple_ad1829eeccb70f9a'] (blended into a feature-space centroid)."New value: +"1-5 catalog itunes_track_ids to base recommendations on, e.g. ['apple_ad1829eeccb70f9a'] (blended into a feature-space centroid). Omit and use track(+artist) to seed by name instead." - removed
Input schema / properties / seed_tracks / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / seed_tracks / maxItemsRemoved value: -5 - removed
Input schema / properties / seed_tracks / minItemsRemoved value: -1 - removed
Input schema / properties / seed_tracks / typeRemoved value: -"array" - added
Input schema / properties / trackAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Seed by track NAME instead of an id — resolved to the best catalog match (echoed back as seed_query). Pair with artist to disambiguate. Ignored when seed_tracks is given.", + "title": "Track" +} - removed
Input schema / requiredRemoved value: -[ - "seed_tracks" -]
2 tool updates
- Changed
get_recommendations1 field changed- added
Input schema / properties / cross_genreAdded value: +{ + "default": "auto", + "description": "Genre handling (mirrors suggest_next_track): 'auto' (default) re-ranks by genre affinity so a feature-close cross-genre track can't outrank same-genre picks; 'strict' = same genre-family only (off-genre dropped server-side); 'allow' = genre-blind (pure audio-feature cosine).", + "title": "Cross Genre", + "type": "string" +}
- Changed
suggest_next_track1 field changed- added
Input schema / properties / cross_genreAdded value: +{ + "default": "auto", + "description": "Genre handling: 'auto' (default) keeps picks in a mixable genre lane so an off-genre track that only shares key/BPM sinks to the bottom; 'strict' = same genre-family only; 'allow' = genre-blind (harmonic+tempo+energy only).", + "title": "Cross Genre", + "type": "string" +}
1 tool update
- Changed
get_audio_features_batch3 fields changed- changed
Input schema / $defs / TrackQuery / descriptionPrevious value: -"One track to look up by name and/or ISRC (at least one of track/isrc required)."New value: +"One track to look up by name and/or ISRC. Supply `track` or `isrc` (or both); an item\ncarrying neither is skipped by the batch tool (`invalid_no_query`), not an error." - changed
Input schema / properties / tracks / descriptionPrevious value: -"List of {track?, artist?, isrc?} objects to look up (max 50). Each needs `track` or `isrc`."New value: +"List of {track?, artist?, isrc?} objects. Up to 50 are processed per call; any extra (up to 200 accepted) come back skipped. Each item should carry `track` or `isrc`." - changed
Input schema / properties / tracks / maxItemsPrevious value: -50New value: +200
1 tool update
- Changed
get_audio_features_batch11 fields changed- changed
Input schema / $defs / TrackQuery / descriptionPrevious value: -"One track to look up by name (and optional artist)."New value: +"One track to look up by name and/or ISRC (at least one of track/isrc required)." - changed
Input schema / $defs / TrackQuery / properties / artist / descriptionPrevious value: -"Artist name (optional, improves accuracy)"New value: +"Artist name (optional, improves name-match accuracy)" - added
Input schema / $defs / TrackQuery / properties / isrcAdded value: +{ + "anyOf": [ + { + "maxLength": 15, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ISRC, e.g. 'USUM71900001' (hyphens optional). Matched exactly first — resolves CJK/K-pop/niche tracks whose fuzzy name-match misses. Supply this OR `track`.", + "title": "Isrc" +} - added
Input schema / $defs / TrackQuery / properties / track / anyOfAdded value: +[ + { + "maxLength": 200, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / TrackQuery / properties / track / defaultAdded value: +null - changed
Input schema / $defs / TrackQuery / properties / track / descriptionPrevious value: -"Track title"New value: +"Track title. Supply this OR `isrc` (or both — ISRC is matched exactly first, the name is the fallback)." - removed
Input schema / $defs / TrackQuery / properties / track / maxLengthRemoved value: -200 - removed
Input schema / $defs / TrackQuery / properties / track / minLengthRemoved value: -1 - removed
Input schema / $defs / TrackQuery / properties / track / typeRemoved value: -"string" - removed
Input schema / $defs / TrackQuery / requiredRemoved value: -[ - "track" -] - changed
Input schema / properties / tracks / descriptionPrevious value: -"List of {track, artist?} objects to look up (max 50)."New value: +"List of {track?, artist?, isrc?} objects to look up (max 50). Each needs `track` or `isrc`."
1 tool update
- Added
tag_track
2 tool updates
- Added
get_recommendations - Added
get_related_artists
Related MCP Connectors
Privacy-first audio intelligence: BPM, key, waveform. Audio never stored. Pay per second.
Find independent music by how it sounds: similar tracks and playlists from a track link.
Write lyrics in 100+ styles, score them, generate full songs with 4 engines, split stems. OAuth.
Search MusicBrainz artists, releases, works, labels; resolve ISRC/ISWC/barcode; fetch cover art.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenancePrivacy-first audio intelligence: BPM, key, waveform. Audio never stored. Pay per second.MIT
- FlicenseNot gradedqualityCmaintenanceEnables 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.-
- AlicenseAqualityBmaintenanceEnables building mood-based playlists for Navidrome by joining your library, listen history, and personal playlist labels from Navidrome, ListenBrainz, and Last.fm.1577 npmAGPL 3.0
- AlicenseNot gradedqualityCmaintenanceEnables local, private analysis of YouTube URLs and local audio files to extract BPM, key modulations, vocal presence, transient punch, stereo width, and CLAP vibe embeddings, returning structured sonic signatures for AI agents and CLI users.4MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.