Skip to main content
Glama

FreqBlog Music Metadata

Get Audio Features (Batch)

get_audio_features_batch
Read-only

Get audio features for MANY tracks in one call (up to 50 processed) — ideal for analysing a whole playlist at once. Identify each item by name (track/artist), by isrc (matched exactly first — best for CJK / K-pop / niche tracks whose fuzzy name-match misses), or both (ISRC first, name as the fallback).

One bad entry never fails the batch. Items beyond the 50-per-call cap come back with
`found: false` and `backfill_status: "over_limit"`; an item missing BOTH `track` and
`isrc` comes back `"invalid_no_query"`. Neither is processed or charged — the response's
`skipped` field counts them, so split a long list into calls of <=50 and resubmit any
skipped rows.

Returns counts (`found` / `not_found` / `skipped`) plus a per-track `results` array, where
each entry's `result` is the same feature object as get_audio_features (or null when not
found), and `isrc` is echoed back. An item is billed only when it returns features or
queues an on-demand ingest; an ISRC/name with no match anywhere is free. A track you
queue and then collect costs ONE unit, not two — the call that collects it is free.
For a single track, use get_audio_features.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tracksYesList 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

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / $defs / TrackQuery / description
      Previous value: -"One track to look up by name and/or ISRC (at least one of track/isrc required)."New value: +"One track to look up by name and/or ISRC. Supply `track` or `isrc` (or both); an item\ncarrying neither is skipped by the batch tool (`invalid_no_query`), not an error."
    • changedInput schema / properties / tracks / description
      Previous value: -"List of {track?, artist?, isrc?} objects to look up (max 50). Each needs `track` or `isrc`."New value: +"List of {track?, artist?, isrc?} objects. Up to 50 are processed per call; any extra (up to 200 accepted) come back skipped. Each item should carry `track` or `isrc`."
    • changedInput schema / properties / tracks / maxItems
      Previous value: -50New value: +200
  2. Changed11 schema fields changed
    • changedInput schema / $defs / TrackQuery / description
      Previous value: -"One track to look up by name (and optional artist)."New value: +"One track to look up by name and/or ISRC (at least one of track/isrc required)."
    • changedInput schema / $defs / TrackQuery / properties / artist / description
      Previous value: -"Artist name (optional, improves accuracy)"New value: +"Artist name (optional, improves name-match accuracy)"
    • addedInput schema / $defs / TrackQuery / properties / isrc
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 15,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "ISRC, e.g. 'USUM71900001' (hyphens optional). Matched exactly first — resolves CJK/K-pop/niche tracks whose fuzzy name-match misses. Supply this OR `track`.",
      +  "title": "Isrc"
      +}
    • addedInput schema / $defs / TrackQuery / properties / track / anyOf
      Added value: +[
      +  {
      +    "maxLength": 200,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / $defs / TrackQuery / properties / track / default
      Added value: +null
    • changedInput schema / $defs / TrackQuery / properties / track / description
      Previous value: -"Track title"New value: +"Track title. Supply this OR `isrc` (or both — ISRC is matched exactly first, the name is the fallback)."
    • removedInput schema / $defs / TrackQuery / properties / track / maxLength
      Removed value: -200
    • removedInput schema / $defs / TrackQuery / properties / track / minLength
      Removed value: -1
    • removedInput schema / $defs / TrackQuery / properties / track / type
      Removed value: -"string"
    • removedInput schema / $defs / TrackQuery / required
      Removed value: -[
      -  "track"
      -]
    • changedInput schema / properties / tracks / description
      Previous value: -"List of {track, artist?} objects to look up (max 50)."New value: +"List of {track?, artist?, isrc?} objects to look up (max 50). Each needs `track` or `isrc`."
  3. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with readOnlyHint and openWorldHint annotations, the description adds substantial behavioral context: 'One bad entry never fails the batch,' items over the cap return `found: false` and `backfill_status: "over_limit"`, missing both identifiers yields `"invalid_no_query"`, and the billing rules ('An item is billed only when it returns features or queues an on-demand ingest...') are disclosed. This fully informs the agent of success/failure and cost behavior without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than many, but every paragraph earns its place: purpose and scope, failure modes, return structure, billing, and the pointer to the single-track sibling. It is front-loaded with the primary use case and the 'up to 50' constraint, then organizes edge cases logically. A slight condensation of the billing paragraph could help, but the complexity justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with this complexity: it covers the parameter structure, batch limit, invalid-entry behavior, response contents (`counts`, `results`, `skipped`), billing implications, and differentiation from get_audio_features. The output schema exists, so detailed return formatting is not required, but the description still summarizes it sufficiently. No critical information for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant meaning beyond the schema: it clarifies the batch processing limit (50 of up to 200 accepted), explains the matching precedence ('ISRC first, name as the fallback'), and defines what `invalid_no_query` means for the `tracks` array. It also explains how the `skipped` field relates to parameter usage, which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Get audio features for MANY tracks in one call') and clearly differentiates itself from its sibling get_audio_features by stating 'For a single track, use get_audio_features.' It also states the ideal use case ('analysing a whole playlist at once'), leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly gives when-to-use guidance: batch playlist analysis vs. single-track lookup, and names the alternative tool. It also provides operational instructions for handling the 50-per-call cap ('split a long list into calls of <=50 and resubmit any skipped rows') and explains when to prefer ISRC over name matching. This goes far beyond implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources