Skip to main content
Glama

Read a song

read_song
Read-only

A song's lyrics, its context (the story and theology behind it), or its full info (lyrics, context, style and where to listen).

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "slug": "<slug>"
    },
    "name": "read_song"
  }
}

Input Schema

NameRequiredDescriptionDefault
partNolyrics, context, or info for both and where to listen.lyrics
slugYesA song slug, such as current.slug from attend, or one from browse.

Output Schema

NameRequiredDescriptionDefault
apiNoThe song's API links.
slugYesThe song's slug: send it as songSlug when you reflect, or to read_song.
linksNo/api/attend only (current song): its original music video (youtube), when it has one. suno is always null since 2026-10-24.
styleNo/api/attend only (current song): the musical style.
titleYesThe song's title.
lyricsNoThe lyrics, for lyrics or info.
contextNoThe context, for context or info.
durationNoIts length in seconds, or null where it is not known.
recordingNoThe song's audio on this site (audio/mpeg), or null for a song whose audio is not made yet.
next_stepsYesSuggested next actions, present in every response, errors included. A step with a "tool" field can be taken with that tool.
durationFormattedNoIts length as minutes and seconds, e.g. 4:10.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / api / properties / rhythm
      Added value: +{
      +  "description": "Its whole rhythm: GET /api/rhythm?piece={slug}.",
      +  "format": "uri",
      +  "type": "string"
      +}
  2. Changed24 schema fields changed
    • addedInput schema / properties / part / description
      Added value: +"lyrics, context, or info for both and where to listen."
    • removedInput schema / properties / slug / maxLength
      Removed value: -100
    • removedInput schema / properties / slug / minLength
      Removed value: -1
    • addedOutput schema / properties / api
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "The song's API links.",
      +  "properties": {
      +    "context": {
      +      "description": "Its context, when it has one: GET /api/music/{slug}/context.",
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    "info": {
      +      "description": "The song in full: GET /api/music/{slug}.",
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    "lyrics": {
      +      "description": "Its lyrics: GET /api/music/{slug}/lyrics.",
      +      "format": "uri",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "info",
      +    "lyrics"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / context / description
      Added value: +"The context, for context or info."
    • addedOutput schema / properties / duration
      Added value: +{
      +  "description": "Its length in seconds, or null where it is not known.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / durationFormatted
      Added value: +{
      +  "description": "Its length as minutes and seconds, e.g. 4:10.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / links
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "/api/attend only (current song): its original music video (youtube), when it has one. suno is always null since 2026-10-24.",
      +  "properties": {
      +    "suno": {
      +      "description": "Always null since 2026-10-24, kept as a field.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "youtube": {
      +      "description": "The song's original music video, where it has one.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / lyrics / description
      Added value: +"The lyrics, for lyrics or info."
    • changedOutput schema / properties / next_steps / description
      Previous value: -"What to do next. A step with a \"tool\" field can be taken with that tool."New value: +"Suggested next actions, present in every response, errors included. A step with a \"tool\" field can be taken with that tool."
    • addedOutput schema / properties / next_steps / items / description
      Added value: +"A natural follow-up the agent might take. `tool` names the MCP tool for the same step. A step may group several `steps`."
    • addedOutput schema / properties / next_steps / items / properties / action
      Added value: +{
      +  "description": "A short name for the step.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_steps / items / properties / body
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "A request body to send, for POST steps.",
      +  "properties": {},
      +  "type": "object"
      +}
    • addedOutput schema / properties / next_steps / items / properties / description / description
      Added value: +"What the step is and why an agent might take it."
    • addedOutput schema / properties / next_steps / items / properties / hint
      Added value: +{
      +  "description": "How to fill in the step, where it needs filling in.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_steps / items / properties / method
      Added value: +{
      +  "description": "HTTP method for url.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_steps / items / properties / note
      Added value: +{
      +  "description": "Something to know before taking the step.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_steps / items / properties / steps
      Added value: +{
      +  "description": "Steps grouped under this one, each the same shape, a description where it needs one.",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "action": {
      +        "description": "A short name for the step.",
      +        "type": "string"
      +      },
      +      "body": {
      +        "additionalProperties": {},
      +        "description": "A request body to send, for POST steps.",
      +        "properties": {},
      +        "type": "object"
      +      },
      +      "description": {
      +        "description": "What the step is and why an agent might take it.",
      +        "type": "string"
      +      },
      +      "hint": {
      +        "description": "How to fill in the step, where it needs filling in.",
      +        "type": "string"
      +      },
      +      "method": {
      +        "description": "HTTP method for url.",
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "Something to know before taking the step.",
      +        "type": "string"
      +      },
      +      "tool": {
      +        "description": "The MCP tool that takes this step, when one does.",
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Where to go.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / next_steps / items / properties / tool
      Added value: +{
      +  "description": "The MCP tool that takes this step, when one does.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_steps / items / properties / url
      Added value: +{
      +  "description": "Where to go.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / recording
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The song's audio on this site (audio/mpeg), or null for a song whose audio is not made yet."
      +}
    • addedOutput schema / properties / slug / description
      Added value: +"The song's slug: send it as songSlug when you reflect, or to read_song."
    • addedOutput schema / properties / style
      Added value: +{
      +  "description": "/api/attend only (current song): the musical style.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / title / description
      Added value: +"The song's title."
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "context": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "lyrics": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "next_steps": {
      +      "description": "What to do next. A step with a \"tool\" field can be taken with that tool.",
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "description": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "description"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "slug": {
      +      "type": "string"
      +    },
      +    "title": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "slug",
      +    "title",
      +    "next_steps"
      +  ],
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  5. First observed

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds the useful detail that 'info' bundles lyrics, context, style, and listening locations, but says nothing about error behavior for a bad slug or how much content is returned. With annotations doing the heavy lifting, a 3 is appropriate.

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?

A single tight sentence with no filler, and the resource is front-loaded ahead of the mode list. It is a noun fragment with no explicit verb, a minor readability cost, but nothing is redundant.

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 read-only tool with a two-parameter schema at full coverage, an output schema, and complete annotations, the description covers all three content modes adequately. The only gap is the absence of any note on invalid-slug behavior, which the schema's 'current.slug from attend, or one from browse' hint partly offsets.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description meaningfully enriches the `part` enum: 'context' is glossed as 'the story and theology behind it' and 'info' is expanded to include 'style and where to listen,' which the schema's shorter enum description omits. It adds real semantic value for the one non-obvious parameter.

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?

Names the resource (a song) and precisely enumerates the three content variants it returns: lyrics, context, and full info. An agent can tell what it gets, including the extra 'style and where to listen' in info mode. It does not differentiate itself from siblings like read_doc or read_rhythm, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: nothing says when to pick read_song over read_doc, search, or browse, and no prerequisites or exclusions are stated. The only implied selection guidance is which `part` value yields which content, and that is already carried by the enum.

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.