Skip to main content
Glama

Plan, check and analyze a song

song
Read-onlyIdempotent

Plans and analyzes a song (render checks too); returns a share link that plays it in the browser (90 days, no render). Stages: plan, write, light analysis loop, one deep analysis, fix; then the share link to listen, or one render to embed. analyze:true: light; deep:true: measured. Schema eb59845f.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "song"
  }
}

Input Schema

NameRequiredDescriptionDefault
lenNoTarget seconds
mtlNoSong in MTL text (describe topic=mtl). Kept 2 hours as a working copy: later calls can send ref (the songId) instead.
refNoInstead of mtl: a songId from an earlier reply (kept 2 hours), a render asset id, or a share link
altsNoOther MTL versions to rank by score
deepNoWith analyze: deep analysis, a measured analysis-only render. Suited to once or twice when the song is nearly done
loopNoShould loop
planNoAlone: {bpm, meter, key, peak, sections:[{id, bars, energy 1-5, role}], mix?} gives a skeleton, timing, checks
checkNoSame as analyze
genreNoGenre or alias, see describe(topic="genres")
rangeNoWith analyze: one section, e.g. "2" or "2-3" (order entries)
styleNoVoice palette; default chip
energyNoPlanned 1-5 per order entry, for check:true
intentNoDeliberate choices, not scored
layersNoWith mtl: batch edits {add:["A: 3 i3 v40: C4 . . ."], replace, remove:["A:3"], instruments, mix, notes}; returns the edited song
returnNomtl echoes the song back
voicesNoList these instruments' settings
analyzeNoLight analysis: no audio, instant, free. Suited to every edit
compareNoWith analyze: A/B against an earlier songId, asset id or share link
composeNoInstead of mtl: {bpm, form, chords, parts:[{id,gen}]}. describe(topic="generators")

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • changedInput schema / description
      Previous value: -"Schema 3b8fe45c"New value: +"Schema eb59845f"
    • addedInput schema / properties / analyze
      Added value: +{
      +  "description": "Light analysis: no audio, instant, free. Suited to every edit",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / check / description
      Previous value: -"Score only: no summary, no render, free"New value: +"Same as analyze"
    • addedInput schema / properties / compare
      Added value: +{
      +  "description": "With analyze: A/B against an earlier songId, asset id or share link",
      +  "type": "string"
      +}
    • addedInput schema / properties / deep
      Added value: +{
      +  "description": "With analyze: deep analysis, a measured analysis-only render. Suited to once or twice when the song is nearly done",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / layers / description
      Previous value: -"With mtl: batch edits {add:[\"A: 3 i3 v40: C4 . . .\"], replace, remove:[\"A:3\"], instruments, mix}; returns the edited song"New value: +"With mtl: batch edits {add:[\"A: 3 i3 v40: C4 . . .\"], replace, remove:[\"A:3\"], instruments, mix, notes}; returns the edited song"
    • addedInput schema / properties / layers / properties / notes
      Added value: +{
      +  "description": "Polyphony: [{ch, ins, section?, notes:[[pitch, startBeat, beats, vel]]}]; placed on sub-channels",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "ch": {
      +        "type": "integer"
      +      },
      +      "ins": {
      +        "type": [
      +          "integer",
      +          "string"
      +        ]
      +      },
      +      "notes": {
      +        "items": {},
      +        "type": "array"
      +      },
      +      "section": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "ch",
      +      "ins",
      +      "notes"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / mtl / description
      Previous value: -"Song in MTL text (describe topic=mtl). Send it whole each time; we keep none."New value: +"Song in MTL text (describe topic=mtl). Kept 2 hours as a working copy: later calls can send ref (the songId) instead."
    • addedInput schema / properties / range
      Added value: +{
      +  "description": "With analyze: one section, e.g. \"2\" or \"2-3\" (order entries)",
      +  "type": "string"
      +}
    • addedInput schema / properties / ref
      Added value: +{
      +  "description": "Instead of mtl: a songId from an earlier reply (kept 2 hours), a render asset id, or a share link",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedInput schema / description
      Previous value: -"Schema 9b20e675"New value: +"Schema 3b8fe45c"
  3. Changed4 schema fields changed
    • changedInput schema / description
      Previous value: -"Schema 415a8741"New value: +"Schema 9b20e675"
    • addedInput schema / properties / energy
      Added value: +{
      +  "description": "Planned 1-5 per order entry, for check:true",
      +  "items": {
      +    "type": "number"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / layers
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "With mtl: batch edits {add:[\"A: 3 i3 v40: C4 . . .\"], replace, remove:[\"A:3\"], instruments, mix}; returns the edited song",
      +  "properties": {
      +    "add": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "instruments": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "mix": {
      +      "additionalProperties": false,
      +      "description": "dB; \"-inf\" silences, 0 resets. Faders balance (first choice), gain sets one sound, level is overall loudness",
      +      "properties": {
      +        "faders": {
      +          "additionalProperties": {
      +            "anyOf": [
      +              {
      +                "maximum": 6,
      +                "minimum": -60,
      +                "type": "number"
      +              },
      +              {
      +                "enum": [
      +                  "-inf",
      +                  "off"
      +                ],
      +                "type": "string"
      +              }
      +            ],
      +            "default": 0
      +          },
      +          "description": "{\"2\": -6}",
      +          "propertyNames": {
      +            "pattern": "^([1-9]|1[0-6])$"
      +          },
      +          "type": "object"
      +        },
      +        "gain": {
      +          "additionalProperties": {
      +            "anyOf": [
      +              {
      +                "maximum": 12,
      +                "minimum": -60,
      +                "type": "number"
      +              },
      +              {
      +                "enum": [
      +                  "-inf",
      +                  "off"
      +                ],
      +                "type": "string"
      +              }
      +            ],
      +            "default": 0
      +          },
      +          "description": "{\"i3\": -3}",
      +          "propertyNames": {
      +            "pattern": "^i?\\d{1,2}$"
      +          },
      +          "type": "object"
      +        },
      +        "level": {
      +          "anyOf": [
      +            {
      +              "maximum": 6,
      +              "minimum": -60,
      +              "type": "number"
      +            },
      +            {
      +              "enum": [
      +                "-inf",
      +                "off"
      +              ],
      +              "type": "string"
      +            }
      +          ],
      +          "default": 0
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "remove": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "replace": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / plan
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Alone: {bpm, meter, key, peak, sections:[{id, bars, energy 1-5, role}], mix?} gives a skeleton, timing, checks",
      +  "type": "object"
      +}
  4. Changed3 schema fields changed
    • changedInput schema / description
      Previous value: -"Schema d568427c"New value: +"Schema 415a8741"
    • addedInput schema / properties / intent
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Deliberate choices, not scored",
      +  "properties": {
      +    "fixed": {
      +      "items": {
      +        "enum": [
      +          "tempo",
      +          "swing",
      +          "meter",
      +          "length",
      +          "form",
      +          "loop"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "loop": {
      +      "type": "boolean"
      +    },
      +    "unpitched": {
      +      "description": "Drum tracks",
      +      "items": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / voices
      Added value: +{
      +  "description": "List these instruments' settings",
      +  "items": {
      +    "maximum": 99,
      +    "minimum": 1,
      +    "type": "integer"
      +  },
      +  "maxItems": 16,
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • changedInput schema / description
      Previous value: -"Schema 90ddc268"New value: +"Schema d568427c"
  6. Changed1 schema field changed
    • addedInput schema / description
      Added value: +"Schema 90ddc268"
  7. First observed

TDQS

B3.1/5.0
Behavior1/5

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

The annotations declare readOnlyHint=true and destructiveHint=false, but the description describes a write/fix workflow, layer batch edits that return the edited song, and one render to embed. That directly contradicts the read-only annotation, so the description cannot be treated as behaviorally consistent even though it contains useful details like the 90-day share link and 2-hour working copy.

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 short and front-loads the overall purpose before listing stages and flags, which is appropriate for a complex tool. It is somewhat cryptic and includes the unhelpful opaque token 'Schema eb59845f', but it contains little outright filler.

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

Completeness4/5

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

For a complex 19-parameter tool with nested objects and no output schema, the description covers the major workflow stages, analysis modes, share-link lifetime, andrender outcome. The input schema carries detailed parameter documentation, so most remaining gaps are about error conditions and permission behavior rather than core calling semantics.

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

Parameters3/5

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, and the description adds only limited meaning beyond the schema. It restates analyze/deep behavior and mode interactions, but it does not add much syntax or constraint detail for the 19 parameters beyond what the schema already documents.

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

Purpose4/5

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

The description names specific verbs and a resource: plans, analyzes, writes, checks, and fixes a song, and it describes the share-link and render outcomes. It distinguishes some sibling behavior indirectly by referencing describe(topic=...) and by saying the share link involves no render, but the broad multi-mode scope makes the tool less crisply differentiated from render and feedback.

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

Usage Guidelines3/5

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

It gives in-tool mode guidance such as analyze:true for light analysis, deep:true for measured analysis, and plan alone for a skeleton. However, it does not explicitly say when to choose this tool over render, assets, convert, or feedback, and the exclusions are only implied by the render/no-render wording.

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