FreqBlog Music Metadata
Server Details
Audio features + harmonic set-building for tracks by name/ISRC. Spotify audio-features replacement.
- Status
- Healthy
- Uptime
- 99.9% over 74 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes (search vs. features vs. key/BPM lookup vs. set building). The main risk is overlap between get_recommendations and suggest_next_track, plus get_audio_features vs. tag_track, though the descriptions explicitly differentiate them (multi-seed feature-space vs. single-seed transition ranking; numeric vs. tagged projection).
Every tool follows a consistent snake_case verb_noun pattern (build_setlist, find_tracks_by_bpm, get_audio_features, score_transition, search_catalog, tag_track). The single variant get_audio_features_batch is a natural suffix extension, not a convention break.
12 tools is well-scoped for a rich music-metadata/DJ domain, with each tool earning its place across search, analysis, discovery, and set composition. No redundant filler and no missing core capability forcing a bloated surface.
The surface covers the full workflow: search/resolve, features (single and batch), discovery (recommendations, related artists, next-track, transition scoring), harmonic/tempo lookups, tagging, and set building. Minor gaps exist for direct artist/album entity browse tools, but agents can work around these via search_catalog and get_related_artists.
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, or with no audio features on file yet). 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?
Annotations only declare readOnlyHint and openWorldHint; the description adds real behavioral context beyond them: the 5 quota-unit cost, and the 'omitted' behavior explaining that ids not in the catalog or lacking audio features are silently dropped rather than erroring. It does not cover auth or rate limits, but the quota and partial-failure disclosure is substantive.
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 scope in the first sentence, followed by the arc vocabulary, then behavior. It is slightly padded by enumerating return fields (arc, count, flow_score, tracks, transitions, omitted) that the output schema already defines, but the list is compact and each item is short.
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 tool with an output schema, the description is close to complete: it gives purpose, arc semantics, quota cost, and partial-result behavior. The only redundancy is restating return fields already in the output schema, and the only gap is that start_track_id's fixed-opener role lives solely in the schema.
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 adds genuine meaning for `arc` by explaining the shape of each curve ('peak_time builds to a peak then eases'), which the schema's flat enum list does not convey. It does not mention start_track_id at all, but that parameter is fully documented in 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?
States a specific verb+resource+scope: 'Order a crate of 2-100 catalog tracks into a beat-matched DJ set that follows an energy arc.' This is clearly distinguishable from siblings like suggest_next_track or score_transition, which operate per-step rather than over a whole crate.
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?
Usage is implied by the batch nature of the tool ('order a crate'), and the export hint shows the downstream workflow, but there is no explicit when-to-use-this vs. suggest_next_track/score_transition guidance or any exclusion. The agent must infer that this is the whole-set counterpart to the per-transition tools.
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, 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 per request by reading
the track's title from Spotify's public embed page and matching it against our
catalogue — no Spotify IDs are stored; 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).
VALUES are FreqBlog's own analysis, NOT on Spotify's scale: energy and valence are
models of how energetic / positive the preview sounds, both on our own scales (derive thresholds from our values, don't copy Spotify-tuned ones);
danceability and acousticness are on AcousticBrainz's scale -- its classifier where
available, else a model that listens to the preview, built on PANNs embeddings
(Kong et al. 2020, CC BY 4.0); instrumentalness is a vocal-detection model's score for
the 30-second preview (not the whole track); speechiness and liveness are currently
null for catalogue tracks; time_signature is ASSUMED 4 (4/4) on every track, not
measured.
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 per request by reading the track's title from Spotify's public embed page and matching it against our catalogue (no Spotify IDs are stored) — 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 only declare readOnlyHint and openWorldHint; the description goes far beyond by disclosing on-demand ingest holding behavior, queued fallback with ~15s re-poll, terminal not-found caching, spotify_id embed-page resolution that misses rather than guesses, and per-field null behavior. It also documents that values are on non-Spotify scales, which prevents downstream misuse.
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 purpose and identifiers before the longer caveat paragraphs, and the bulleted identifier list is scannable. It is on the long side and restates some spotify_id resolution detail already present in the schema, but nearly every sentence carries operational value.
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 shape, and it correctly focuses on the things structured fields cannot convey: value scales, null semantics, ingest/polling behavior, and terminal error caching. 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema: the precedence ordering, the rationale for sending multiple identifiers, and the caveat that spotify_id is a lossy fallback preferred against track/isrc. It also explains the artist dependency for short titles.
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+resource ('Get audio features for ONE track') and enumerates the returned fields, which immediately separates it from the sibling get_audio_features_batch. The 'drop-in replacement for Spotify's deprecated /audio-features endpoint' framing further anchors the 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 the identifier requirement ('AT LEAST ONE'), the resolution precedence (track > isrc > mbid > spotify_id), and the advice to send all identifiers rather than choose. It also routes fuzzy/partial names to search_catalog first and warns the not-found verdict is terminal for ~7 days.
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 `found: false` item, `backfill_status` `queued` / `processing` / `deferred` means
retry later; `unavailable` is terminal (carries `terminal`, `reason`, `retry_after_days` —
treat it as a miss until then); null means no match anywhere.
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?
Annotations only declare readOnlyHint and openWorldHint, so the safety profile is covered but nothing operational. The description adds substantial behavior: cap handling (over_limit), invalid_no_query, partial-failure tolerance ('One bad entry never fails the batch'), billing rules (no match is free, queued+collected costs one unit), and the backfill_status state machine including which states are terminal.
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 purpose and the routing alternative, then operationally important failure and billing details. It is long and a few clauses restate points already made in the schema (ISRC-first precedence appears twice), so it stops short of perfectly tight, but nearly every sentence carries decision-relevant 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?
Given an output schema exists, the description still supplies the return semantics an agent needs to act (counts, per-item result/isrc echo, null-when-not-found, retry vs terminal backfill_status). Combined with annotations and a documented schema, nothing needed to invoke or interpret results 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 semantics the schema cannot express: the <=50 processed vs 200-accepted distinction that explains why an in-schema-valid array still yields skipped rows, and the precedence rule (ISRC matched exactly first, name as fallback) that governs multi-field interaction.
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 with scope: 'Get audio features for MANY tracks in one call (up to 50 processed)'. It explicitly distinguishes itself from the single-track sibling by naming get_audio_features at the end, so an agent can route without opening either 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?
Gives explicit when-to-use ('ideal for analysing a whole playlist at once') and when-not ('For a single track, use get_audio_features'). It also gives per-item selection guidance: prefer `isrc` for CJK/K-pop/niche tracks whose fuzzy name match misses, or supply both with ISRC first and name as fallback.
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,
loudness, tempo and valence. NOTE: `popularity` (2026-08-27), `liveness`, `speechiness`
(2026-09-26) and `instrumentalness` (2026-09-27) are RETIRED as tunables and return a 400 —
popularity recorded how a track entered our catalogue, not audience size; the other three
are returned as null for catalogue tracks. Values are FreqBlog's own (not Spotify's):
energy and valence (models of how energetic / positive the preview sounds) on our own scales, danceability/acousticness on AcousticBrainz's scale —
derive thresholds from our values rather than reusing Spotify-tuned ones. 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, loudness, 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 and openWorldHint; the description adds materially more: quota cost (2 units), server-side dropping in strict mode, the fact that ordering is not score-descending, 400 outcomes for retired tunables, value-scale provenance (own scales vs AcousticBrainz vs Spotify-tuned), and the filters/dropped_by/limit_reached diagnostic block. That is far beyond what annotations convey and directly shapes how an agent interprets a short list.
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 and organized under implicit headings (seeding, return shape, TUNING), with no filler sentences. It is long, and the multi-seed genre_relation paragraph is dense enough to slow reading, though the ambiguity it resolves (a 'cross' label not implying demotion on multi-seed calls) is genuinely non-obvious. Slightly overlength for its purpose, but nearly 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?
For a 9-parameter tool with zero required params, an output schema, and a non-obvious ranking algorithm, this covers what an agent needs: seeding fallbacks, genre-mode behavior, filter semantics, cost, error cases, and how to read the response when results are short. Nothing material is left to inference.
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%, but the description still adds meaning the schema cannot: min/max are HARD filters that also drop unanalysed tracks while target is a non-removing preference, the retired attributes and why (popularity measured catalogue entry, others null for catalogue tracks), and the instruction to derive thresholds from FreqBlog's scales rather than Spotify's, with a concrete min/max/target example.
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 and scope ('Recommended tracks for one or more seed tracks'), then immediately positions itself against the removed Spotify endpoint and against siblings like suggest_next_track and search_catalog, which are named as the source of seed ids. An agent can distinguish this from build_setlist, suggest_next_track or find_tracks_by_bpm 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?
Explicitly states the two seeding routes (seed_tracks ids vs track(+artist) name resolution), the precedence rule when both are given, the three cross_genre modes with when to pick each, and where the ids come from (search_catalog, get_audio_features). It also names the exclusion condition (retired tunables -> 400) and the sibling whose genre semantics it mirrors (suggest_next_track).
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. Placements come from the Apple Music and
Deezer charts we track (since Aug 2026) and Billboard year-end charts (1960-2025).
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?
Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses the semantics of chart_peak (1-100, null = unknown, not popularity, and the exact source charts with date ranges), the lightweight stub return shape, the meaning of the `seedable` flag, the failure mode (seeding a non-seedable id returns 404), and the recovery path (run get_audio_features first, then retry). That is unusually rich operational context.
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 purpose, then usage, then edge cases, so an agent gets the essentials in the first two sentences. It is on the long side and the chart_peak paragraph, while useful, is somewhat tangential to selecting/calling the tool and could be trimmed.
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 search tool with an output schema, an open-world flag, and only two params, this covers everything an agent needs: query intent, downstream routing, the seedable precondition, and the 404 recovery loop. Return-value detail is extra given the output schema but not redundant enough to penalize.
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 both parameters are already documented there (q as 'artist / track / album tokens', limit as max results). The description echoes the q semantics without adding syntax or format detail beyond the schema, 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?
Starts with a specific verb+resource: 'Full-text search the catalog by any mix of track / artist / album tokens.' It immediately distinguishes itself from retrieval siblings (get_audio_features, find_tracks_by_bpm, find_tracks_by_key) by declaring that it returns ranked name-matches, not audio data.
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 when to use it ('resolve a fuzzy, partial, or misspelled name') and sequences it in a workflow ('BEFORE calling get_audio_features'), then repeats the routing at the end ('pass them to get_audio_features, or reuse its itunes_track_id as a track_id seed'). When-not guidance is also given via the seedable constraint, which warns against seeding with unanalysed tracks.
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 (instrumental vs vocal, judged on the 30-second preview), 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 (a numeric audio feature, source in provenance) | 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: librosa | panns | 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 own analysis (librosa + a PANNs-based model) 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 per request by reading the track's title from Spotify's public embed page and matching it against our catalogue (no Spotify IDs are stored) — 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 only cover readOnlyHint and openWorldHint; the description adds substantial behavior beyond them: cost model ('same 1 quota unit, charged only on a served result'), no audio upload/no extra compute, and a full taxonomy of tag confidence/provenance semantics (measured vs derived vs model-estimated vs catalog-genre) plus which sources are reached per identifier type (7.5M+ AcousticBrainz recordings only when MBID/ISRC is supplied). This is well beyond annotation coverage.
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 purpose, then structured into the confidence/provenance bullets and identifier guidance, so the important material comes first. It is dense and leans on ALL-CAPS emphasis and a long single flowing paragraph in places, which costs a little readability, but nearly every sentence carries information an agent needs.
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, output-schema-backed lookup tool, the description covers the gaps that matter: cost/quota, confidence semantics, identifier precedence, ambiguous-spotify_id failure mode, and coverage limits of each identifier path. Nothing an agent needs in order to call it correctly and interpret the labels 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%, so the baseline is 3. The description consolidates the resolution precedence chain and the 'send them all, we ignore the rest' behavior in one place, and flags that `artist` is only meaningful with `track`. This adds usable invocation guidance, though much of the precedence detail is already duplicated in the schema descriptions, keeping it short of a 5.
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 a compact, honestly-labelled tag list for a track') and enumerates exactly which tags come back (energy/danceability/valence/acousticness/instrumentalness + mood + genre). It explicitly positions itself against siblings: 'It is a tag-shaped projection of the same open-data analysis get_audio_features returns' and names get_audio_features and a discovery tool as the alternatives. An agent can distinguish it from get_audio_features without opening either 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?
Gives explicit routing: 'For the full numeric feature set use get_audio_features; for nearest tracks use a discovery tool.' It also spells out the identifier strategy with precedence (track > isrc > track_id > mbid > spotify_id) and tells the agent to send several rather than choose. Both when-to-use and when-to-use-something-else are covered.
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.
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. 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."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolved per request by reading the track's title from Spotify's public embed page and matching it against our catalogue (no Spotify IDs are stored) — 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. 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."New value: +"Spotify track ID, 'spotify:track:...' URI, or open.spotify.com URL. Resolved per request by reading the track's title from Spotify's public embed page and matching it against our catalogue (no Spotify IDs are stored) — a title several artists share is ambiguous and misses rather than guessing; prefer track (+artist) or isrc."
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, loudness, 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, loudness, tempo, valence."
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, loudness, 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, loudness, tempo, valence."
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, 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, loudness, speechiness, tempo, valence."
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)."
Related MCP Connectors
Search, analyze, and discover commercially released music using sonic intelligence.
Music search over 185M+ tracks: describe a sound, find similar songs, ISRC/ISWC lookup, beat grids.
Free ISRC lookup and public titles for Reels, TikTok, Shorts, and X links.
Find independent music by how it sounds: similar tracks and playlists from a track link.
Related MCP Servers
- AlicenseAqualityCmaintenanceAutonomous music intelligence & A&R qualification engine. Extracts acoustic metadata (BPM, key, mood), scores real-time Spotify streaming traction, and detects AI-generated audio (Suno/Udio).566 npmMIT
- AlicenseNot gradedqualityAmaintenancePrivacy-first audio intelligence: BPM, key, waveform. Audio never stored. Pay per second.MIT
- AlicenseNot gradedqualityAmaintenanceEnables local, evidence-led analysis of a master recording into inspectable stems, timing, beats, harmony, lyrics, MIDI and sonic evidence, then finds complete-bar loopable sections for Shorts and other short-form video. Results stay traceable through source hashes, manifests, JSON/TSV/NPZ artifacts and portable Sonic Visualiser sessions, and it can run as a CLI, Python library, web service, container or MCP plugin.212 PyPIMIT
- 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.