Skip to main content
Glama

Get lyrics

get_lyrics
Read-onlyIdempotent

Fetch song lyrics by LRCLIB track ID or exact artist and title, returning plain, time-synced, or both formats and supporting pagination for long lyrics.

Instructions

Fetch the lyrics of one track from LRCLIB, given the id returned by search_tracks, or an exact artist and title. Set 'format' to "synced" for karaoke-style lyrics with a timestamp on every line, "plain" for the text alone, or "both". Check 'has_synced_lyrics' in the search results first: not every track has timed lyrics. Lyrics can be long, so the text is truncated by default: check 'truncated' and call again with 'offset' set to 'next_offset' to continue reading. Instrumental tracks come back with status "instrumental" and no text, which is a valid answer, so do not retry them. Always cite 'attribution' when showing lyrics to a user.

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": "get_lyrics"
  }
}

Input Schema

NameRequiredDescriptionDefault
idNoLRCLIB track id, as returned by search_tracks. Preferred over the name fields.
formatNo'plain' returns the text only. 'synced' returns LRC text plus a parsed list of timestamped lines. 'both' returns each of them.plain
offsetNoCharacter offset to resume from, for lyrics longer than max_chars.
max_charsNoMaximum characters of lyrics text to return in this call.
album_nameNoAlbum name, to pick between releases.
track_nameNoSong title, matched exactly by LRCLIB. Required when 'id' is absent.
artist_nameNoArtist name, matched exactly by LRCLIB. Required when 'id' is absent.
duration_secondsNoTrack duration, to pick between versions of differing length.

Output Schema

NameRequiredDescriptionDefault
notesYes
trackYes
offsetYes
sourceYes
statusYes
truncatedYes
attributionYes
next_offsetYes
total_charsYes
plain_lyricsYes
synced_linesYesParsed timestamped lines.
synced_lyricsYesRaw LRC text, one timestamp per line.
paginated_formYesWhich body the character counts and the offset describe. Timed text carries its timestamps, so it is longer than the words alone.
returned_charsYes
synced_lines_truncatedYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv2.1.0
    • removedOutput schema / properties / plain_lyrics / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / plain_lyrics / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / synced_lyrics / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / synced_lyrics / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / track / properties / album_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / track / properties / album_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / track / properties / duration_seconds / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / track / properties / duration_seconds / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. Changed19 schema fields changedv2.0.0
    • addedInput schema / properties / id / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / offset / maximum
      Added value: +9007199254740991
    • changedOutput schema / properties / next_offset / anyOf
      Previous value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": -9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / offset / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / offset / minimum
      Added value: +-9007199254740991
    • addedOutput schema / properties / plain_lyrics / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / plain_lyrics / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / returned_chars / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / returned_chars / minimum
      Added value: +-9007199254740991
    • addedOutput schema / properties / synced_lyrics / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / synced_lyrics / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / total_chars / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / total_chars / minimum
      Added value: +-9007199254740991
    • addedOutput schema / properties / track / properties / album_name / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / track / properties / album_name / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / track / properties / duration_seconds / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / track / properties / duration_seconds / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / track / properties / id / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / track / properties / id / minimum
      Added value: +-9007199254740991
  3. Changed2 schema fields changedv1.4.0
    • addedOutput schema / properties / paginated_form
      Added value: +{
      +  "description": "Which body the character counts and the offset describe. Timed text carries its timestamps, so it is longer than the words alone.",
      +  "enum": [
      +    "plain",
      +    "synced"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "status",
      -  "track",
      -  "plain_lyrics",
      -  "synced_lyrics",
      -  "synced_lines",
      -  "synced_lines_truncated",
      -  "total_chars",
      -  "returned_chars",
      -  "offset",
      -  "next_offset",
      -  "truncated",
      -  "attribution",
      -  "source",
      -  "notes"
      -]New value: +[
      +  "status",
      +  "track",
      +  "plain_lyrics",
      +  "synced_lyrics",
      +  "synced_lines",
      +  "synced_lines_truncated",
      +  "paginated_form",
      +  "total_chars",
      +  "returned_chars",
      +  "offset",
      +  "next_offset",
      +  "truncated",
      +  "attribution",
      +  "source",
      +  "notes"
      +]
  4. First observedv1.0.0

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare safety traits (readOnly, idempotent, openWorld); the description adds behavioral facts they cannot carry: output is truncated by default with a resume mechanism, instrumental results are a valid terminal answer, and an attribution obligation exists when displaying lyrics. No contradiction with the read-only annotations.

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

Conciseness5/5

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

Purpose is front-loaded in the first clause, then each subsequent sentence delivers a distinct operational rule (format choice, availability pre-check, pagination, instrumentals, attribution). No filler or repetition of names.

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?

For an 8-parameter, fully-described, output-schema-bearing tool, the description covers the non-obvious runtime behaviors an agent could otherwise get wrong: partial results, resumption, and the instrumental edge case. Return-value shape is delegated to the output schema.

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 baseline is 3; the description still adds operational meaning, explaining that 'synced' yields a timestamp per line for karaoke use and how 'offset' pairs with 'next_offset' and 'truncated'. It leaves the album/duration disambiguation params to the schema, which is acceptable given full coverage.

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?

States a specific verb and resource ('Fetch the lyrics of one track from LRCLIB') plus the two valid lookup modes (id from search_tracks, or exact artist+title). This clearly separates it from search_tracks (which produces ids) and get_track (track metadata).

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?

Gives explicit selection guidance: prefer the id from search_tracks, check 'has_synced_lyrics' first, do not retry instrumental tracks, and cite 'attribution'. It also documents the continuation protocol (read 'truncated', call again with 'offset' = 'next_offset'), which is exactly the when/how detail an agent needs.

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

Deploy Server

Other Tools