Skip to main content
Glama
jamiew

Spotify MCP Server

by jamiew

spotify-mcp MCP server

mcp-name: io.github.jamiew/spotify-mcp

MCP server connecting Claude with Spotify. This fork of varunneal/spotify-mcp adds smart-batching tools and advanced playlist features that optimize API usage.

This one runs locally over stdio. If you want a remote MCP server instead — hosted, OAuth in the browser, no local install for the people connecting to it — see jamiew/spotify-mcp-cloudflare: a sibling Spotify MCP on Cloudflare Workers that you can deploy yourself in a few minutes, and a decent worked example of remote-MCP auth on Workers generally.

Features

Core Functionality

  • Playback Control: Start, pause, skip tracks, manage queue

  • Search & Discovery: Find tracks, albums, artists, playlists with pagination

  • Real-time State: Live user profile and playback status

  • Resources: Read user, playback, track, playlist, artist, and album state by URI

Modern MCP Protocol

  • Server instructions: whole-surface guidance ships once per session instead of per tool

  • Structured output: every tool returns a typed schema, not a bare dict

  • Tool annotations & icons: read-only/destructive hints, titles, and a Spotify glyph

  • Progress notifications: live updates while paginating large playlists

  • Elicitation: destructive playlist removals ask for confirmation on clients that support it

Enhanced Playlist Tools (New in this fork)

  • Smart Batch Operations: Add/remove up to 100 tracks in single API calls

  • Large Playlist Support: Efficiently handle playlists with 1000+ tracks using pagination

  • Advanced Playlist Management: Create, modify details, reorder tracks, bulk track operations

  • API-Optimized Workflows: Intelligent batching reduces API calls by 60-80%

Tools

Tool

Does

get_me

The signed-in user's profile

search_music

Search tracks, albums, artists or playlists, with filters

get_track_info

Track details, batched up to 50 per call

get_artist_info

Artist details plus their top tracks

get_album_info

Album details plus its track list

get_playback_state

What's playing now: track, device, progress, shuffle, repeat

control_playback

Play, pause, next, previous, seek, volume, shuffle, repeat

list_devices

Available Spotify Connect devices

transfer_playback

Move playback to another device

get_queue

Now playing plus the upcoming queue

add_to_queue

Queue a track

get_user_playlists

The user's playlists, paginated

get_playlist_info

Playlist metadata without its tracks

get_playlist_tracks

Playlist tracks, paginated to any size

create_playlist

Create a playlist

modify_playlist_details

Rename a playlist or change its description/visibility

add_tracks_to_playlist

Add up to 100 tracks in one call

remove_tracks_from_playlist

Remove tracks (confirms first where the client supports it)

reorder_playlist_tracks

Move a block of tracks to a new position

unfollow_playlist

Unfollow a playlist — how Spotify deletes your own

get_saved_tracks

Liked Songs, paginated

save_tracks

Like tracks

remove_saved_tracks

Unlike tracks

get_top_items

Top artists or tracks over a time range

get_recently_played

Recently played tracks with timestamps

tests/test_tool_metadata.py fails if this table drifts from the code, or if a tool ships without a title, icon and behaviour annotations.

Related MCP server: Spotify MCP Server

Installation

Requires a Spotify Premium account and uv >= 0.54.

1. Get Spotify API keys

  1. Create an app at developer.spotify.com/dashboard.

  2. Add redirect URI http://127.0.0.1:8888 — it must match exactly what you set below.

  3. Copy the Client ID and Client Secret.

2. Add the server to your MCP client

Every client runs the same command — uvx spotify-mcp-jamiew — with your three Spotify env vars. No clone, no local path.

Standard config (works in most clients):

{
  "mcpServers": {
    "spotify": {
      "command": "uvx",
      "args": ["spotify-mcp-jamiew"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:8888"
      }
    }
  }
}
claude mcp add spotify \
  -e SPOTIFY_CLIENT_ID=your_client_id \
  -e SPOTIFY_CLIENT_SECRET=your_client_secret \
  -e SPOTIFY_REDIRECT_URI=http://127.0.0.1:8888 \
  -- uvx spotify-mcp-jamiew

Add -s user to install it globally across all projects. Verify with claude mcp list.

Add the standard config above to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows), then fully restart Claude Desktop.

codex mcp add spotify \
  --env SPOTIFY_CLIENT_ID=your_client_id \
  --env SPOTIFY_CLIENT_SECRET=your_client_secret \
  --env SPOTIFY_REDIRECT_URI=http://127.0.0.1:8888 \
  -- uvx spotify-mcp-jamiew

Or add to ~/.codex/config.toml:

[mcp_servers.spotify]
command = "uvx"
args = ["spotify-mcp-jamiew"]

[mcp_servers.spotify.env]
SPOTIFY_CLIENT_ID = "your_client_id"
SPOTIFY_CLIENT_SECRET = "your_client_secret"
SPOTIFY_REDIRECT_URI = "http://127.0.0.1:8888"

Add to ~/.hermes/config.yaml, then run /reload-mcp (or restart Hermes):

mcp_servers:
  spotify:
    command: uvx
    args: [spotify-mcp-jamiew]
    env:
      SPOTIFY_CLIENT_ID: your_client_id
      SPOTIFY_CLIENT_SECRET: your_client_secret
      SPOTIFY_REDIRECT_URI: http://127.0.0.1:8888

Add the standard config above to ~/.openclaw/openclaw.json (under mcpServers), then openclaw gateway restart.

Most MCP clients read a JSON file with an mcpServers block — drop the standard config above into it.

Using something else? Paste this to your agent:

Install the spotify-mcp MCP server from https://github.com/jamiew/spotify-mcp — it's on PyPI as spotify-mcp-jamiew, run it with uvx spotify-mcp-jamiew, and set env vars SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, and SPOTIFY_REDIRECT_URI=http://127.0.0.1:8888.

git clone https://github.com/jamiew/spotify-mcp.git
cd spotify-mcp
uv sync

Then point your client at the checkout:

{
  "mcpServers": {
    "spotify": {
      "command": "uv",
      "args": ["--directory", "/path/to/spotify-mcp", "run", "spotify-mcp"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:8888"
      }
    }
  }
}

To run the latest unpublished commit without cloning: uvx --from git+https://github.com/jamiew/spotify-mcp.git spotify-mcp.

On first use the server opens a browser for Spotify OAuth; the token is cached locally for later runs.

Usage Examples

  • "Create a chill study playlist with 20 tracks" → Search + playlist creation + bulk track addition

  • "Show me the first 50 tracks from my 'Liked Songs'" → Pagination for large playlists

  • "Find similar artists to Radiohead and add their top tracks to my queue" → Search + artist info + queue management

Development

Built with the FastMCP framework — focused single-purpose tools spanning playback, search, queue, and playlist management, with type-safe APIs and comprehensive test coverage.

Debug with MCP Inspector:

npx @modelcontextprotocol/inspector uv --directory /path/to/spotify_mcp run spotify-mcp

Available Tools

16 tools
add_to_queueAdd to QueueA

Add a track to the playback queue.

Args:
    track_id: Spotify track ID to add to queue
Returns:
    Status and message
ParametersJSON Schema
NameRequiredDescriptionDefault
track_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
messageYes
snapshot_idNo

TDQS

A3.5/5.0
Behavior2/5

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

Annotations are neutral (readOnlyHint=false, destructiveHint=false), but the description only states the operation and parameter, missing behavioral details like prerequisites (e.g., active Spotify device), side effects, or whether it appends to the queue end.

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?

The description is extremely concise: one sentence for purpose and minimal parameter/return details, with no wasted words.

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

Completeness3/5

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

Given low complexity (1 param, no enums) and existing output schema, the description is adequate but omits usage context like requiring an active device or how the queue is modified.

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?

With 0% schema coverage, the description adds value by explaining track_id as a 'Spotify track ID to add to queue', clarifying the parameter's purpose beyond the schema's plain string type.

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 states 'Add a track to the playback queue' with a clear verb and resource, distinguishing it from sibling tools like add_tracks_to_playlist (adds to a playlist) and get_queue (retrieves queue).

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?

No guidance on when to use this tool versus alternatives, such as when an active device is required or when to use add_tracks_to_playlist instead.

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

add_tracks_to_playlistAdd Tracks to PlaylistC

Add tracks to a playlist.

Args:
    playlist_id: Playlist ID
    track_uris: List of track URIs (up to 100)
ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes
track_urisYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
messageYes
snapshot_idNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already indicate this is not read-only and not destructive. The description adds minimal behavioral context beyond 'add'; it does not specify whether tracks are appended, duplicates handled, or errors reported. No contradiction with annotations.

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

Conciseness3/5

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

The description is very short and front-loaded with a clear purpose. However, it is somewhat under-specified for a two-parameter tool, and the Args section is minimal.

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

Completeness2/5

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

Given the tool has an output schema and annotations, the description still lacks important contextual information such as error handling, authentication requirements, and differentiation from sibling tools. It is adequate for basic invocation but incomplete for robust usage.

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?

The description adds meaning beyond the schema by stating 'playlist_id: Playlist ID' and 'track_uris: List of track URIs (up to 100)'. This compensates for the 0% schema description coverage, clarifying the URI limit.

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 clearly states 'Add tracks to a playlist,' which is a specific verb and resource. It distinguishes the tool from siblings like 'remove_tracks_from_playlist' and 'reorder_playlist_tracks', though it could be more explicit about the operation's scope.

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 guidance on when to use this tool versus alternatives like 'modify_playlist_details' or 'reorder_playlist_tracks'. No context on prerequisites or restrictions is provided.

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

create_playlistCreate PlaylistA

Create a new Spotify playlist.

Args:
    name: Playlist name
    description: Playlist description (default: empty)
    public: Whether playlist is public (default: True)

Returns:
    The created Playlist
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
descriptionNo
publicNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
idYes
ownerNo
descriptionNo
tracksNo
total_tracksNo
publicNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate non-read, non-destructive, non-idempotent behavior. The description adds a return value statement but no further behavioral details, such as side effects or rate limits. No contradiction with 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 concise and includes a clear list of parameters and return value. However, it could be slightly more structured (e.g., separating parameter descriptions from the main text).

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

Completeness3/5

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

While the description covers basic creation, it lacks details about required scopes, Spotify API constraints, or how the returned Playlist object looks. Given multiple sibling tools, more context on use cases would help.

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?

With 0% schema description coverage, the description provides meaningful text for each parameter (name, description, public) including defaults, compensating for the lack of schema descriptions.

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 explicitly states the action ('Create') and the resource ('new Spotify playlist'). It is specific and distinguishes from sibling tools like 'add_tracks_to_playlist' or 'modify_playlist_details'.

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?

No guidance on when to use this tool vs. alternatives. There is no mention of prerequisites (e.g., authentication) or context for choosing this over similar tools.

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

get_album_infoGet Album InfoA
Read-onlyIdempotent

Get detailed information about a Spotify album.

Args:
    album_id: Spotify album ID

Returns:
    AlbumInfo with album metadata (release_date, label) and its tracks
ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
albumYes
tracksYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description adds that it returns AlbumInfo with release_date, label, and tracks, providing useful context beyond 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?

The description is very concise, with clear 'Args' and 'Returns' sections. Every sentence adds value, no unnecessary words.

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?

Given the presence of an output schema (not provided but mentioned), the description need not detail return values further. It adequately covers metadata and tracks, making it complete for a simple retrieval tool.

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 0%, so the description must add meaning. It documents album_id as 'Spotify album ID,' which adds minimal detail beyond the schema. Acceptable for a single parameter.

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 clearly states 'Get detailed information about a Spotify album,' specifying the verb (Get) and resource (album). It distinguishes from siblings like get_artist_info, get_playlist_info, and get_track_info.

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?

The description does not explicitly provide when-to-use or when-not-to-use guidance. However, the purpose is clear enough to imply usage context among siblings.

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

get_artist_infoGet Artist InfoA
Read-onlyIdempotent

Get detailed information about a Spotify artist.

Args:
    artist_id: Spotify artist ID
Returns:
    ArtistInfo with the artist and their top tracks
ParametersJSON Schema
NameRequiredDescriptionDefault
artist_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
artistYes
top_tracksYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, idempotentHint, openWorldHint. Description adds return value detail (artist and top tracks), which is consistent and provides useful behavioral context beyond 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?

Description is brief with clear Args/Returns structure. Slightly verbose for a simple tool, but no wasted words. Could be tightened.

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?

Given low complexity (1 param, output schema present), description covers purpose, input, and return content. Mentions top tracks inclusion. Sufficient for effective invocation.

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 has 0% coverage but description documents the single parameter as 'Spotify artist ID' in the Args line, adding clarity beyond the schema's basic title and type. With one simple parameter, this is adequate.

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?

Description clearly states the tool gets detailed information about a Spotify artist and returns artist and top tracks. Title 'Get Artist Info' matches. Distinguishes from siblings like get_album_info, get_track_info.

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?

No guidance on when to use vs alternatives. Description does not provide context for when to choose this tool over others like get_album_info or search_tracks.

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

get_playlist_infoGet Playlist InfoA
Read-onlyIdempotent

Get basic information about a Spotify playlist.

Args:
    playlist_id: Spotify playlist ID

Returns:
    Playlist metadata (no tracks - use get_playlist_tracks for tracks)

Note: This returns playlist info only. For tracks, use get_playlist_tracks
which supports full pagination for large playlists.
ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
idYes
ownerNo
descriptionNo
tracksNo
total_tracksNo
publicNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that the tool returns 'playlist metadata' and explicitly excludes tracks, providing behavioral context beyond annotations. However, 'basic information' is somewhat vague; output schema could fill gaps.

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?

The description is brief and well-structured: a clear title line, Args/Returns sections, and a note about alternative tool. Every sentence adds value, and key information is front-loaded.

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?

Given the tool's simplicity (one parameter, rich annotations, output schema present), the description covers purpose, usage, and return scope. The only gap is parameter semantics, but overall completeness is high for decision-making.

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

Parameters1/5

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

With 0% schema description coverage, the description should compensate but only restates 'playlist_id: Spotify playlist ID', adding no new meaning beyond the schema's title and type. No constraints or format hints are provided.

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 clearly states 'Get basic information about a Spotify playlist', specifying both verb and resource. It explicitly distinguishes from sibling tool get_playlist_tracks by stating it returns 'no tracks' and directing users to that tool for track data.

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 provides explicit guidance on when to use this tool (for playlist info) and when not (for tracks, use get_playlist_tracks). It also notes that get_playlist_tracks supports full pagination for large playlists, helping agents decide between tools.

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

get_playlist_tracksGet Playlist TracksA
Read-onlyIdempotent

Get tracks from a playlist with full pagination support.

Args:
    playlist_id: Playlist ID
    limit: Max tracks to return (None for all tracks, up to 10,000 safety limit)
    offset: Number of tracks to skip for pagination (default 0)

Returns:
    PlaylistTracks with 'items' (list of tracks), 'total', 'limit', 'offset'

Note: Large playlists require pagination. Use limit/offset to get specific ranges:
- Get first 100: limit=100, offset=0
- Get next 100: limit=100, offset=100
- Get all tracks: limit=None (use with caution on very large playlists)
ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes
limitNo
offsetYes
returnedYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate read-only and idempotent behavior. The description adds important behavioral details: a safety limit of 10,000 tracks, the effect of limit=None, and pagination mechanics. These go beyond the annotations and prevent misuse.

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?

The description is well-organized with Args, Returns, and Note sections. Each sentence provides necessary information without redundancy. The examples are concise and illustrative, earning their place.

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?

Given the complexity of pagination and the presence of an output schema (not shown), the description fully covers usage: parameter semantics, return structure, safety limits, and common usage patterns. No gaps are apparent.

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?

Schema coverage is 0%, so the description carries full responsibility. It explains playlist_id as 'Playlist ID', limit as 'Max tracks to return (None for all tracks, up to 10,000 safety limit)', and offset as 'Number of tracks to skip for pagination (default 0)'. This adds complete meaning beyond the schema.

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 explicitly states 'Get tracks from a playlist with full pagination support', which clearly defines the action and resource. It distinguishes itself from sibling tools like 'get_playlist_info' (which retrieves playlist metadata) by focusing on tracks and pagination.

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

Usage Guidelines4/5

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

The description provides examples of usage patterns (limit/offset combinations) and notes when to use pagination. However, it does not explicitly contrast with sibling tools or state when not to use it, which would improve clarity for an agent selecting among many options.

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

get_queueGet QueueA
Read-onlyIdempotent

Get the current playback queue. Returns: Currently playing track and queue of upcoming tracks

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
currently_playingNo
queueYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds minimal behavioral detail (returns current and upcoming tracks) but does not contradict annotations. Adequate but not enhanced.

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?

Extremely concise: two sentences, front-loaded with the main action, and no wasted words.

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?

Given zero parameters, informative annotations, and an output schema, the description is sufficient for a simple read operation. It explicitly states the return content, fulfilling basic needs.

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?

No parameters exist (0 params, 100% schema coverage). The description is not required to add parameter info, and it correctly omits irrelevant details.

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 clearly states the tool retrieves the current playback queue and specifies the return content (currently playing and upcoming tracks). It distinguishes itself from sibling tools like add_to_queue or playback_control.

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?

No guidance on when to use this tool versus alternatives like get_playlist_tracks or search_tracks. The description lacks context for selective invocation.

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

get_saved_tracksGet Liked SongsA
Read-onlyIdempotent

Get user's saved/liked tracks (Liked Songs library).

Args:
    limit: Max tracks to return per page (1-50, default 20)
    offset: Number of tracks to skip for pagination (default 0)

Returns:
    SavedTracks with 'items' (tracks with added_at timestamp) and pagination info
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes
limitYes
offsetYes
nextNo
previousNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, openWorldHint. The description adds return structure details (SavedTracks with items and added_at timestamp, pagination via limit/offset), which is valuable context beyond 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.

Conciseness5/5

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

The description is concise: one opening line, Args section for two parameters, Returns section. No wasted words, well-structured and front-loaded.

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?

Given the low complexity, simple schema with two optional params, rich annotations, and existing output schema, the description covers all essential aspects: function, parameters, return shape, and pagination. No gaps.

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?

Schema description coverage is 0%, so the description fully compensates. It explains limit as 'Max tracks to return per page (1-50, default 20)' and offset as 'Number of tracks to skip for pagination (default 0)', adding constraints and semantics not in the schema.

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 clearly states 'Get user's saved/liked tracks (Liked Songs library)', using a specific verb 'Get' and resource 'saved/liked tracks'. The title 'Get Liked Songs' further clarifies. This distinguishes it from siblings like get_playlist_tracks or get_track_info.

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?

The description implies usage for retrieving saved tracks but does not explicitly state when not to use or mention alternatives. No guidance on conflicts with siblings like add_tracks_to_playlist or search_tracks.

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

get_track_infoGet Track InfoA
Read-onlyIdempotent

Get detailed information about one or more Spotify tracks.

Args:
    track_ids: Single track ID or list of track IDs (up to 50)

Returns:
    TrackList with 'tracks' containing track metadata including release_date.
    For single ID, returns {'tracks': [track]}.

Note: Batch lookup is much more efficient - 50 tracks = 1 API call instead of 50.
ParametersJSON Schema
NameRequiredDescriptionDefault
track_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
tracksYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, and openWorldHint. The description adds context beyond these: it specifies the return format (TrackList with 'tracks' containing metadata including release_date) and the behavior difference for single vs list input.

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?

The description is well-structured into three short paragraphs (purpose, args, returns, note). Every sentence adds value without redundancy.

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?

Given the single parameter, thorough annotations, and existence of an output schema, the description provides sufficient context. It explains the return format for both single and list inputs and offers an efficiency tip.

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?

With 0% schema description coverage, the description compensates by explaining the parameter: 'track_ids: Single track ID or list of track IDs (up to 50)'. This adds type, limit, and usage context not present in the schema.

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 clearly states 'Get detailed information about one or more Spotify tracks,' specifying the verb (Get), resource (track info), and scope (one or more). It distinguishes itself from sibling tools like get_album_info and get_artist_info.

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

Usage Guidelines4/5

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

The description includes an important usage note about batch efficiency: 'Batch lookup is much more efficient - 50 tracks = 1 API call instead of 50.' This guides the agent to prefer batch calls, but does not explicitly state when not to use the tool.

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

get_user_playlistsList My PlaylistsA
Read-onlyIdempotent

Get current user's playlists with pagination support.

Args:
    limit: Max playlists to return per page (1-50, default 20)
    offset: Number of playlists to skip for pagination (default 0)

Returns:
    PlaylistList with 'items' (list of playlists) and pagination info ('total', 'limit', 'offset')

Note: For users with many playlists, use offset to paginate through results.
Example: offset=0 gets playlists 1-20, offset=20 gets playlists 21-40, etc.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes
limitYes
offsetYes
nextNo
previousNo

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and idempotentHint. Description adds pagination behavior and return format, which is useful but not critical beyond 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?

Concise, well-structured: purpose, args, returns, note. Every sentence adds value with no redundancy.

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?

Covers purpose, parameters, returns (including pagination info), and usage note. Output schema exists, so return details are adequately explained.

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?

Despite 0% schema coverage, description fully explains both parameters (limit, offset) with defaults, range, and example usage, compensating for schema gaps.

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?

Clearly states 'Get current user's playlists with pagination support', specifying verb, resource, and a key differentiator (pagination). Distinguishes from siblings like get_playlist_info.

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

Usage Guidelines4/5

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

Provides pagination usage example and note about many playlists, but does not explicitly contrast with alternatives like get_playlist_info or search_tracks.

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

modify_playlist_detailsEdit Playlist DetailsC
Idempotent

Modify playlist details.

Args:
    playlist_id: Playlist ID
    name: New playlist name (optional)
    description: New playlist description (optional)
    public: Whether playlist should be public (optional)
ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes
nameNo
descriptionNo
publicNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
messageYes
snapshot_idNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already indicate idempotentHint=true and destructiveHint=false. The description adds 'Modify playlist details' which aligns with these hints but does not provide additional behavioral context such as permission requirements, side effects, or partial update behavior. With annotations present, the description adds minimal value.

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

Conciseness3/5

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

The description is short and front-loaded with the purpose. However, the Args section redundantly lists parameter names and types that are already in the schema. It could be more concise by omitting the Args list or summarizing the parameters.

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

Completeness3/5

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

For a simple 4-parameter tool with an output schema, the description is minimal but adequate. It lacks context on idempotency (though annotations provide it) and does not mention that only provided fields are updated. With output schema present, return values are acceptable, but the description could still be more thorough.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. However, it only lists parameter names and basic types without any added meaning (e.g., constraints on name length, behavior of null values, or that changes are optional). This barely adds value beyond the schema itself.

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 clearly states 'Modify playlist details' with the verb 'modify' and resource 'playlist details'. It implies updating an existing playlist, which distinguishes it from sibling tools like create_playlist or remove_tracks_from_playlist, though it could be more explicit about the specific fields affected.

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?

No guidance on when to use this tool versus alternatives. It does not mention when not to use it or provide context for choosing between related tools like reorder_playlist_tracks or add_tracks_to_playlist.

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

playback_controlControl PlaybackB

Control Spotify playback.

Args:
    action: Action ('get', 'start', 'pause', 'skip')
    track_id: Track ID to play (for 'start')
    num_skips: Number of tracks to skip
ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
track_idNo
num_skipsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
is_playingYes
trackNo
deviceNo
volumeNo
shuffleNo
repeatNo
progress_msNo

TDQS

B3.1/5.0
Behavior2/5

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

Annotations indicate the tool is not read-only (readOnlyHint=false), not destructive (destructiveHint=false), not idempotent (idempotentHint=false), and has side effects (openWorldHint=true). The description states 'Control Spotify playback' implying mutations, but it does not disclose rate limits, authentication requirements, or error handling behaviors beyond 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 concise with a clear Args list. Every sentence adds value, but it could be slightly more structured with a brief introductory sentence.

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

Completeness3/5

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

Given the multi-action nature and presence of an output schema, the description covers core functionality but omits details like return value format (e.g., 'get' returns playback state), error conditions, and prerequisites (e.g., active device required). It is minimally adequate but not fully complete.

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?

The schema provides no descriptions (0% coverage). The description compensates by explaining each parameter: 'action' lists valid values, 'track_id' is for 'start', and 'num_skips' specifies number of tracks to skip. This adds meaningful context beyond the schema's type and default information.

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 clearly states it controls Spotify playback and lists concrete actions ('get', 'start', 'pause', 'skip'). However, it does not explicitly differentiate from sibling tools like 'add_to_queue' or 'get_queue', which are queue-related rather than playback control.

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?

The description provides no guidance on when to use this tool versus alternatives. For example, it does not mention that 'get' retrieves current playback state, nor does it specify prerequisites like needing an active device.

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

remove_tracks_from_playlistRemove Tracks from PlaylistB
Destructive

Remove tracks from a playlist.

Args:
    playlist_id: Playlist ID
    track_uris: List of track URIs to remove
ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes
track_urisYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
messageYes
snapshot_idNo

TDQS

B3/5.0
Behavior2/5

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

The description merely restates what the tool does, adding no behavioral details beyond the annotations (destructiveHint=true, readOnlyHint=false). It does not disclose whether removal is reversible, whether it requires ownership, or what happens to the playlist order. The annotations already convey destructive nature, so the description adds minimal value.

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

Conciseness3/5

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

The description is short but includes unnecessary 'Args:' format that repeats the function name. It is not front-loaded with the most critical information (e.g., that this is destructive). Could be more concise by removing the docstring boilerplate and focusing on usage.

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

Completeness2/5

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

Despite having an output schema (not shown), the description omits side effects (e.g., permanent removal, impact on playlist length), authentication needs, or rate limits. For a destructive action with two required parameters, the description should provide more context to avoid misuse.

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?

The description provides basic meanings for both parameters ('Playlist ID' and 'List of track URIs to remove'), which the schema lacks entirely (0% coverage). However, no format, constraints, or examples are given. For a simple two-parameter tool, this is minimally adequate but not helpful for complex usage.

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 clearly states the action ('Remove tracks') and the resource ('a playlist'), using a specific verb and noun. This distinguishes it from sibling tools such as 'add_tracks_to_playlist' or 'reorder_playlist_tracks'.

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?

No guidance is provided on when to use this tool versus alternatives, such as 'modify_playlist_details' or 'reorder_playlist_tracks'. There are no preconditions, caveats, or context about authorization, making it hard for an AI agent to decide when to invoke this tool.

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

reorder_playlist_tracksReorder Playlist TracksA

Move a contiguous block of tracks to a new position within a playlist.

Args:
    playlist_id: Playlist ID
    range_start: Zero-based position of the first track to move
    insert_before: Zero-based position to insert the moved block before.
        Pass the playlist's total track count to move the block to the end.
    range_length: Number of consecutive tracks to move (default 1)
    snapshot_id: Optional playlist snapshot ID to guard against concurrent edits

Returns:
    ActionResult with the new snapshot_id

Note: Positions are zero-based. Example: move the first 3 tracks to just
before position 10 with range_start=0, range_length=3, insert_before=10.
ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYes
range_startYes
insert_beforeYes
range_lengthNo
snapshot_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
messageYes
snapshot_idNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate non-read-only and non-destructive. Description discloses concurrency guard via snapshot_id and positional semantics, adding behavioral context beyond 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?

Well-structured with Args block, Returns, Note, and Example. Slightly lengthy due to detailed example, but all content is relevant and aids understanding.

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?

Complete description for a 5-parameter reorder tool: explains all params, return value, concurrency guard, and provides a helpful example. Output schema exists, so return details are covered.

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?

Schema description coverage is 0%, but the description explains all parameters (playlist_id, range_start, insert_before, range_length, snapshot_id) with clear semantics, default behavior, and usage note.

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?

Clear verb+resource: 'Move a contiguous block of tracks to a new position within a playlist.' Distinct from sibling tools like add_tracks_to_playlist or remove_tracks_from_playlist.

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

Usage Guidelines4/5

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

Provides example and explains zero-based positions, but does not explicitly state when to use this tool versus alternatives (e.g., when reordering vs. adding/removing).

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

search_tracksSearch SpotifyA
Read-onlyIdempotent

Search Spotify for tracks, albums, artists, or playlists.

Args:
    query: Search query
    qtype: Type ('track', 'album', 'artist', 'playlist')
    limit: Max results per page (1-50, default 10)
    offset: Number of results to skip for pagination (default 0)
    year: Filter by year (e.g., '2024')
    year_range: Filter by year range (e.g., '2020-2024')
    genre: Filter by genre (e.g., 'electronic', 'hip-hop')
    artist: Filter by artist name
    album: Filter by album name

Returns:
    SearchResults with 'items' (list of tracks) and pagination info ('total', 'limit', 'offset')

Note: Filters use Spotify's search syntax. For large result sets, use offset to paginate.
Example: query='love', year='2024', genre='pop' searches for 'love year:2024 genre:pop'
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
qtypeNotrack
limitNo
offsetNo
yearNo
year_rangeNo
genreNo
artistNo
albumNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes
limitYes
offsetYes
nextNo
previousNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds value by detailing the return format (SearchResults with items and pagination) and search syntax behavior, complementing the annotations without contradiction.

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 structured as a docstring with clear sections (Args, Returns, Note). It is fairly detailed but not overly verbose; each sentence contributes to understanding or usage guidance.

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?

Given the tool's complexity (9 parameters, 15 siblings, existing output schema), the description covers purpose, all parameters, return format, and usage notes. It lacks error handling or rate limit info, but annotations and output schema partially cover gaps.

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?

With 0% schema description coverage, the description fully compensates by listing all 9 parameters with concise explanations and an example showing their combination. This enables correct invocation without relying on the schema.

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 explicitly states 'Search Spotify for tracks, albums, artists, or playlists', with a clear verb and resource. It distinguishes from sibling tools that target specific entities (e.g., get_album_info), making its purpose unambiguous.

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

Usage Guidelines4/5

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

The description includes a note about Spotify's search syntax and an example, implying its use for general discovery. It lacks explicit when-not-to-use or alternative references, but the context of siblings with specific ID-based queries provides indirect guidance.

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

TDQS

A3.7/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose. Playlist info and tracks are separated, and search covers multiple types via parameter. No ambiguity between tools.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case, e.g., get_album_info, create_playlist, remove_tracks_from_playlist. Even 'playback_control' is a slight deviation but still clear.

Tool Count4/5

16 tools cover the core aspects of Spotify (search, playlist management, playback control). Slightly above the typical well-scoped range but still reasonable and not excessive.

Completeness3/5

Covers most essential workflows: playlist CRUD (missing delete), search, playback control, and info retrieval. Notable gaps include playlist deletion and volume control, but the surface is functional.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jamiew/spotify-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server