{"name":"com.freqblog/music-metadata","slug":"freqblog-music-metadata","title":"FreqBlog Music Metadata","description":"Audio features + harmonic set-building for tracks by name/ISRC. Spotify audio-features replacement.","url":"https://mcp.market/server/freqblog-music-metadata","rating":null,"grade":"D","score":44,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":5,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-02T07:25:32.824Z","last_ok_at":"2026-11-02T07:25:32.824Z","latency_ms":498},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":null,"version":"1.1.0","remotes":[{"type":"streamable-http","url":"https://mcp.freqblog.com/mcp"}],"packages":[],"tools":[{"name":"build_setlist","description":"Order a crate of 2-100 catalog tracks into a beat-matched DJ set that follows an energy\n    arc, keeping each consecutive transition harmonically and tempo-smooth. `arc` is one of\n    peak_time (default — builds to a peak then eases), warmup, cooldown, or flat.\n\n    Returns the `arc`, `count`, an overall `flow_score` (0-100), the `tracks` in play order, the\n    per-step `transitions` ({from_index, to_index, score, reason}), and `omitted` (ids not found\n    in the catalog). Feed tracks[].itunes_track_id into a Rekordbox/Serato export to drop the set\n    straight into your DJ software. track_ids are catalog itunes_track_ids. Costs 5 quota units.\n    ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"track_ids":{"description":"The crate to order — 2 to 100 catalog itunes_track_ids.","items":{"type":"string"},"maxItems":100,"minItems":2,"title":"Track Ids","type":"array"},"arc":{"default":"peak_time","description":"Energy arc: 'peak_time' (default), 'warmup', 'cooldown', or 'flat'.","title":"Arc","type":"string"},"start_track_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Optional fixed opener — must be one of track_ids.","title":"Start Track Id"}},"required":["track_ids"],"title":"build_setlistArguments"}},{"name":"find_compatible_keys","description":"Given a Camelot key (e.g. \"8A\", \"12B\"), return the harmonically compatible keys for DJ\n    mixing — the same key, the relative major/minor, and the adjacent +/-1 keys on the\n    Camelot wheel. With `extended=true` also returns the +7/-7 energy-boost / energy-drop\n    keys. Pure music theory — no catalog lookup and no quota cost. Pair with find_tracks_by_key\n    to then pull actual tracks in each compatible key.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"camelot":{"description":"Camelot key, e.g. '8A' or '12B'.","maxLength":3,"minLength":2,"title":"Camelot","type":"string"},"extended":{"default":false,"description":"Also return the +7/-7 energy-boost / energy-drop keys.","title":"Extended","type":"boolean"}},"required":["camelot"],"title":"find_compatible_keysArguments"}},{"name":"find_tracks_by_bpm","description":"Find catalog tracks near a target tempo. Returns tracks whose BPM is within\n    +/-`tolerance` of `bpm`, ordered by closeness then by an internal catalogue ordering key (not an audience metric) — useful for DJ set\n    planning, workout playlists, or tempo-matching. Each returned track carries full audio\n    features. To also constrain by musical key, combine with find_tracks_by_key.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"bpm":{"description":"Target tempo in BPM.","maximum":300,"minimum":20,"title":"Bpm","type":"number"},"tolerance":{"default":2,"description":"Plus/minus BPM window (default 2).","maximum":10,"minimum":0.5,"title":"Tolerance","type":"number"},"limit":{"default":10,"description":"Max tracks (default 10).","maximum":50,"minimum":1,"title":"Limit","type":"integer"}},"required":["bpm"],"title":"find_tracks_by_bpmArguments"}},{"name":"find_tracks_by_key","description":"Find catalog tracks in a given musical key — for harmonic mixing and key-locked\n    playlists. `key` accepts Camelot (\"8A\"), Open Key (\"1m\"), or a key name (\"A-Minor\",\n    \"F#-Major\"). Returns tracks ordered by an internal catalogue ordering key (not an audience metric), each with full audio features. To\n    discover which keys mix well with a given key first, use find_compatible_keys.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"description":"Camelot ('8A'), Open Key ('1m'), or key name ('A-Minor', 'F#-Major').","maxLength":20,"minLength":1,"title":"Key","type":"string"},"limit":{"default":10,"description":"Max tracks (default 10).","maximum":50,"minimum":1,"title":"Limit","type":"integer"}},"required":["key"],"title":"find_tracks_by_keyArguments"}},{"name":"get_audio_features","description":"Get audio features for ONE track — BPM, musical key (name + Camelot + Open Key),\n    energy, danceability, valence, acousticness, instrumentalness, liveness, speechiness,\n    loudness, mood, mood_vector, genre, time signature, duration and more.\n\n    This is the drop-in replacement for Spotify's deprecated /audio-features endpoint.\n    Provide AT LEAST ONE identifier — if you know several, send them all rather than\n    choosing; they resolve by precedence (`track` > `isrc` > `mbid` > `spotify_id`) and\n    the rest are ignored:\n      - `track` (optionally with `artist`) — e.g. track=\"Blinding Lights\", artist=\"The Weeknd\".\n      - `isrc` — e.g. \"USUM71900001\".\n      - `mbid` — a MusicBrainz recording UUID.\n      - `spotify_id` — a Spotify track ID, URI, or URL (resolved from our ID map or by\n        matching the track's title; ambiguous titles miss rather than guess — prefer\n        `track`/`isrc` for full coverage).\n\n    Returns a JSON object of features. Some feature fields may be null for tracks resolved\n    via the fallback catalogs (only audio-derived values are present for fully analysed\n    tracks). If a track name is not yet in the catalog, the API holds the request during the\n    on-demand ingest and usually returns the fully analysed track inline in this same call;\n    only if the ingest runs long does it fall back to a queued response you can re-poll\n    shortly (~15s). If the track turns out not to be on any streaming source we can analyse,\n    you get a definitive not-found instead — that verdict is terminal for ~7 days, so don't\n    retry it. If you only have a fuzzy or partial name, call search_catalog first to\n    find the exact track.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"track":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"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.","title":"Track"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Artist name. Only used with `track`; required when the title is <=2 characters.","title":"Artist"},"isrc":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISRC, e.g. 'USUM71900001'.","title":"Isrc"},"mbid":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"MusicBrainz recording ID (UUID). The precise key when there is no ISRC, e.g. pre-1986 recordings.","title":"Mbid"},"spotify_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"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.","title":"Spotify Id"}},"title":"get_audio_featuresArguments"}},{"name":"get_audio_features_batch","description":"Get audio features for MANY tracks in one call (up to 50 processed) — ideal for\n    analysing a whole playlist at once. Identify each item by name (`track`/`artist`), by\n    `isrc` (matched exactly first — best for CJK / K-pop / niche tracks whose fuzzy\n    name-match misses), or both (ISRC first, name as the fallback).\n\n    One bad entry never fails the batch. Items beyond the 50-per-call cap come back with\n    `found: false` and `backfill_status: \"over_limit\"`; an item missing BOTH `track` and\n    `isrc` comes back `\"invalid_no_query\"`. Neither is processed or charged — the response's\n    `skipped` field counts them, so split a long list into calls of <=50 and resubmit any\n    skipped rows.\n\n    Returns counts (`found` / `not_found` / `skipped`) plus a per-track `results` array, where\n    each entry's `result` is the same feature object as get_audio_features (or null when not\n    found), and `isrc` is echoed back. An item is billed only when it returns features or\n    queues an on-demand ingest; an ISRC/name with no match anywhere is free. A track you\n    queue and then collect costs ONE unit, not two — the call that collects it is free.\n    For a single track, use get_audio_features.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tracks":{"description":"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`.","items":{"$ref":"#/$defs/TrackQuery"},"maxItems":200,"minItems":1,"title":"Tracks","type":"array"}},"required":["tracks"],"$defs":{"TrackQuery":{"description":"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.","properties":{"track":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Track title. Supply this OR `isrc` (or both — ISRC is matched exactly first, the name is the fallback).","title":"Track"},"artist":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Artist name (optional, improves name-match accuracy)","title":"Artist"},"isrc":{"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"}},"title":"TrackQuery","type":"object"}},"title":"get_audio_features_batchArguments"}},{"name":"get_recommendations","description":"Recommended tracks for one or more seed tracks — the drop-in for Spotify's removed\n    GET /v1/recommendations. Blends up to 5 catalog seed tracks into a single point in\n    audio-feature space and returns the nearest catalogue tracks, RE-RANKED by genre affinity\n    (so a feature-close cross-genre track doesn't outrank same-genre picks).\n\n    Returns `seeds` (each {id, found}), `count`, and `tracks` (each {track, score,\n    genre_relation}; each track carries its `genre`). `genre_relation` is \"same\", \"compatible\"\n    (different but mixable family), \"cross\" (unrelated), or \"unknown\" (either side has no mapped\n    genre), measured against the PRIMARY seed — the first of your seed_tracks we could actually\n    use, so reordering seed_tracks changes it and a skipped seed never becomes the reference.\n    With a SINGLE seed the field is the ranking's own verdict, so it explains the order (same as\n    suggest_next_track). With SEVERAL seeds the ranking considers ALL of them while the label stays\n    relative to your primary seed, so a \"cross\" label on a multi-seed call does NOT mean the track\n    was pushed down — it may share a family with another of your seeds. `score` is the raw\n    audio-feature cosine similarity in [0,1]; genre affinity influences the ORDER, not the score,\n    so the list is NOT strictly score-descending.\n    Use cross_genre=strict to return same-genre-family tracks ONLY (off-genre dropped\n    server-side), or allow to disable the genre ranking. seed_tracks are catalog itunes_track_ids\n    from search_catalog or the itunes_track_id field of a get_audio_features result.\n\n    NO id? Pass `track` (+ optional `artist`) instead and we resolve the name to the best catalog\n    match and seed on it — the resolved track is echoed back as `seed_query`; seed_tracks wins if\n    both are given.\n\n    TUNING: `min`/`max` are HARD filters and `target` is a preference (nearer ranks higher,\n    nothing removed), over acousticness, danceability, duration_ms, energy, instrumentalness,\n    liveness, loudness, speechiness, tempo and valence. NOTE: `popularity` was RETIRED as a\n    tunable on 2026-08-27 and now returns a 400 — it recorded how a track entered our\n    catalogue, not audience size. The field is still returned. e.g. min={\"tempo\": 100},\n    max={\"tempo\": 130}, target={\"energy\": 0.8} for energetic 100-130 BPM tracks. When you tune,\n    the response adds a `filters` block saying what applied, how many tracks each bound removed\n    (`dropped_by`) and whether the bounds ran out of catalogue before `limit` (`limit_reached`)\n    — if the list comes back short, read that BEFORE assuming the catalogue is thin.\n    Costs 2 quota units.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"seed_tracks":{"anyOf":[{"items":{"type":"string"},"maxItems":5,"type":"array"},{"type":"null"}],"default":null,"description":"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.","title":"Seed Tracks"},"track":{"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"},"artist":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Artist name narrowing the track seed (case-insensitive).","title":"Artist"},"limit":{"default":20,"description":"Number of recommendations to return (default 20).","maximum":100,"minimum":1,"title":"Limit","type":"integer"},"exclude_seed_artists":{"default":false,"description":"Drop tracks by any of the seed artists (default false).","title":"Exclude Seed Artists","type":"boolean"},"cross_genre":{"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"},"min":{"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, speechiness, tempo, valence.","title":"Min"},"max":{"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"},"target":{"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"}},"title":"get_recommendationsArguments"}},{"name":"get_related_artists","description":"Artists related to a seed artist — the drop-in for Spotify's removed\n    GET /v1/artists/{id}/related-artists. No artist graph exists, so we derive one: build the\n    seed artist's track-vector centroid, take its nearest catalogue tracks, aggregate by artist\n    (each scored on its top-3 track similarities so a prolific artist can't dominate) plus a\n    same-genre lift and a cross-genre penalty.\n\n    Returns `artist`, `count`, and `related` (each {artist_name, score, match_count,\n    sample_track_id}). Pass a sample_track_id straight to get_audio_features or\n    suggest_next_track. Costs 2 quota units.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"artist":{"description":"Seed artist name (as it appears in the catalog; case-insensitive).","maxLength":200,"minLength":1,"title":"Artist","type":"string"},"limit":{"default":20,"description":"Number of related artists to return (default 20).","maximum":50,"minimum":1,"title":"Limit","type":"integer"}},"required":["artist"],"title":"get_related_artistsArguments"}},{"name":"score_transition","description":"Score how well one catalog track mixes into another (0-100) — the pairwise DJ transition\n    score no raw key/BPM API gives you. Combines Camelot-wheel key compatibility, octave-aware\n    BPM proximity (half/double-time counts as a match), and energy smoothness.\n\n    Returns the overall `score`, per-component scores (`harmonic`/`tempo`/`energy`), a `detail`\n    block (key_relation, both Camelot keys, both BPMs, bpm_delta, bpm_octave_matched, both\n    energies, energy_delta), and a one-line human `reason` (e.g. \"8A->9A adjacent (+1), 126->128\n    BPM (+2), energy +0.04 — clean uplifting mix\"). Both ids are catalog itunes_track_ids — get\n    them from search_catalog or the itunes_track_id field of a get_audio_features result. Costs\n    1 quota unit.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from_track_id":{"description":"The track you're mixing FROM — a catalog itunes_track_id, e.g. 'apple_ad1829eeccb70f9a'.","maxLength":80,"minLength":1,"title":"From Track Id","type":"string"},"to_track_id":{"description":"The candidate track you're mixing INTO — a catalog itunes_track_id.","maxLength":80,"minLength":1,"title":"To Track Id","type":"string"}},"required":["from_track_id","to_track_id"],"title":"score_transitionArguments"}},{"name":"search_catalog","description":"Full-text search the catalog by any mix of track / artist / album tokens. Use this to\n    resolve a fuzzy, partial, or misspelled name into concrete tracks BEFORE calling\n    get_audio_features.\n\n    Each hit carries `chart_peak`: the best chart position we hold, 1-100 with 100 = a\n    number-one. `null` means no placement we hold — treat that as UNKNOWN, not unpopular,\n    and note it is NOT an audience-size figure. Coverage is Billboard year-end only so far.\n\n    Returns lightweight stubs (itunes_track_id, track_name, artist_name, album, etc.) ranked\n    by relevance — NOT audio features. Take the best match's track_name + artist_name and\n    pass them to get_audio_features, or reuse its itunes_track_id as a `track_id` seed for\n    discovery tools.\n\n    ⚠ Each hit carries a `seedable` boolean. Only a hit with `seedable: true` can be used as\n    a seed for get_recommendations / suggest_next_track / build_setlist / score_transition —\n    those work off the similarity index, which holds only tracks we have analysed, and about\n    a quarter of the catalogue is not analysed yet. **Prefer the highest-ranked hit with\n    `seedable: true`.** Seeding with a `seedable: false` id returns a 404; if that track is\n    the one you want, call get_audio_features on it first to queue analysis, then retry.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"description":"Search query — any mix of artist / track / album tokens.","maxLength":200,"minLength":1,"title":"Q","type":"string"},"limit":{"default":10,"description":"Max results (default 10).","maximum":50,"minimum":1,"title":"Limit","type":"integer"}},"required":["q"],"title":"search_catalogArguments"}},{"name":"suggest_next_track","description":"Given a seed track, return the top-N catalog tracks to play NEXT, ranked by transition\n    score. Each suggestion carries the same `score`, per-component scores and human `reason` as\n    score_transition (e.g. \"11B->11B same key, 118->117 BPM (-0.29), energy +0.12\"), plus its\n    `genre` and `genre_relation` to the seed. GENRE-AWARE by default (cross_genre=auto): off-genre\n    picks that only coincidentally share the seed's key/BPM sink to the bottom — use\n    cross_genre=strict for same-genre-family only, or allow for the old harmonic-only ranking. It\n    is the seed's sonic neighbours re-ranked for a clean mix.\n\n    Returns `seed`, `count`, and a `suggestions` array of {track, score, components, reason}.\n    seed_track_id is a catalog itunes_track_id from search_catalog or a get_audio_features\n    result. Pair with build_setlist to order a whole crate. Costs 3 quota units.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"seed_track_id":{"description":"The track currently playing — a catalog itunes_track_id.","maxLength":80,"minLength":1,"title":"Seed Track Id","type":"string"},"n":{"default":10,"description":"How many next-track suggestions to return (default 10).","maximum":50,"minimum":1,"title":"N","type":"integer"},"min_score":{"default":0,"description":"Drop candidates below this overall transition score (default 0).","maximum":100,"minimum":0,"title":"Min Score","type":"integer"},"exclude_same_artist":{"default":false,"description":"Drop tracks by the seed's artist (default false).","title":"Exclude Same Artist","type":"boolean"},"bpm_drift":{"default":12,"description":"Max BPM difference pre-filter before scoring (default 12).","maximum":30,"minimum":0.5,"title":"Bpm Drift","type":"number"},"max_key_distance":{"default":2,"description":"Max Camelot-wheel hops pre-filter before scoring (default 2).","maximum":12,"minimum":0,"title":"Max Key Distance","type":"integer"},"cross_genre":{"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"}},"required":["seed_track_id"],"title":"suggest_next_trackArguments"}},{"name":"tag_track","description":"Get a compact, HONESTLY-LABELLED tag list for a track — energy / danceability / valence /\n    acousticness / instrumentalness, plus a mood tag and a broad genre tag. It is a tag-shaped\n    projection of the same open-data analysis get_audio_features returns (no audio upload, no extra\n    compute), so it costs the same 1 quota unit, charged only on a served result.\n\n    The differentiator vs opaque taggers (e.g. Cyanite) is that EVERY tag carries its own\n    `confidence` and `provenance`:\n      - confidence: measured (our Essentia analysis) | derived (MIREX mood from valence+energy) |\n        model-estimated (AcousticBrainz mood SVM probability — research-grade, raw prob in `value`) |\n        catalog-genre (broad catalogue tag, not fine-grained).\n      - provenance: essentia | valence+energy | acousticbrainz | catalog.\n    `value` is the [0,1] score for numeric tags and null for label-only tags (mood category, genre).\n\n    Provide AT LEAST ONE identifier: `track` (optionally with `artist`), `isrc`, `mbid`,\n    `spotify_id`, or `track_id` (catalog itunes_track_id). If you know several, send them all —\n    they resolve by precedence (`track` > `isrc` > `track_id` > `mbid` > `spotify_id`) and the\n    rest are ignored, so you never have to pick. The broad, reliable coverage is the\n    MEASURED tags from our Essentia analysis over the analysed catalogue (plus on-demand by name);\n    MBID/ISRC additionally reach 7.5M+ AcousticBrainz recordings WHEN you supply that identifier.\n\n    Returns { track, count, tags:[{tag, category, value, confidence, provenance}], disclaimer }.\n    For the full numeric feature set use get_audio_features; for nearest tracks use a discovery tool.\n    ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"track":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"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).","title":"Track"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Artist name. Only used with `track`; improves accuracy.","title":"Artist"},"isrc":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISRC, e.g. 'USUM71900001'.","title":"Isrc"},"mbid":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"MusicBrainz recording ID (UUID). Tags come from AcousticBrainz for that exact recording.","title":"Mbid"},"spotify_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"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.","title":"Spotify Id"},"track_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Catalog itunes_track_id from a search_catalog or get_audio_features result.","title":"Track Id"}},"title":"tag_trackArguments"}}],"scan":{"score":44,"grade":"D","scanned_at":"2026-09-25T21:46:12.704Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T21:46:12.671Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":12,"max":20,"notes":["remote reachable in 5625ms"]},"poisoning":{"score":13,"max":15,"notes":["12 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool get_recommendations: …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. …"},{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://mcp.freqblog.com/mcp","reachable":true,"authRequired":false,"latencyMs":5625,"serverInfo":{"name":"freqblog-music","version":"1.27.2"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://freqblog.com/favicon.svg","source":"site"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":5}}}},"grade_history":[],"reviews":[]}