Skip to main content
Glama
walter-kai

Spotify MCP Server

by walter-kai

Spotify MCP Server

Static Checks npm version npm downloads license

A Model Context Protocol (MCP) server that provides seamless integration with Spotify's API, enabling AI assistants to control and interact with Spotify playback, manage playlists, search for music, and retrieve user listening data.

Table of Contents

Related MCP server: Spotify MCP Server

Overview

The Spotify MCP Server bridges the gap between AI assistants and Spotify, allowing natural language interactions with your music library and playback. Whether you want to play specific songs, create playlists, discover new music, or analyze your listening habits, this server provides the tools to make it happen.

Features

Current Features

  • Authentication & Authorization: OAuth 2.0 Authorization Code flow for secure Spotify API access

  • Playback Control: Play, pause, skip, adjust volume, and control playback across devices

  • Search: Find tracks, albums, artists, and playlists

  • Library Management: Access and manage saved tracks, albums, and playlists

  • User Data: Retrieve user profile information and listening statistics

Planned Features

See ROADMAP.md for detailed feature timeline and future enhancements.

Quick Start

The fastest and easiest way to get started is using the interactive setup wizard:

# Run the setup wizard (no installation required!)
npx @darrenjaws/spotify-mcp setup

The wizard will:

  • ✅ Guide you through creating a Spotify Developer app

  • ✅ Open your browser to the right pages automatically

  • ✅ Validate your credentials as you enter them

  • ✅ Generate the correct configuration for your environment

  • ✅ Give you copy-paste ready configs for Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, or OpenCode

That's it! The whole setup takes about 2 minutes.

Installation

Interactive Setup (Easiest):

# No installation required - run the setup wizard
npx @darrenjaws/spotify-mcp setup

Or install globally first:

npm install -g @darrenjaws/spotify-mcp

# Then run setup
spotify-mcp setup

Using npx without setup wizard:

# Skip to manual configuration (see Configuration section below)
npx -y @darrenjaws/spotify-mcp

Option 2: From Source

For development or contributing:

# Clone the repository
git clone https://github.com/darrenjaworski/spotify-mcp.git
cd spotify-mcp

# Install dependencies
npm install

# Build the project
npm run build

# Run the setup wizard
npm run build && node build/bin.js setup

Configuration

Use the interactive setup wizard for the easiest configuration experience:

npx @darrenjaws/spotify-mcp setup

The wizard walks you through:

  1. Creating a Spotify Developer app

  2. Getting your Client ID and Secret

  3. Choosing your AI tool (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, OpenCode)

  4. Generating the correct config file

Manual Setup

If you prefer to configure manually or need to update credentials:

Spotify App Setup

  1. Go to the Spotify Developer Dashboard

  2. Create a new application

  3. Note your Client ID and Client Secret

  4. Add http://127.0.0.1:3000/callback to your app's Redirect URIs (note: use 127.0.0.1, not localhost)

Environment Variables

For NPM/npx users: Configure environment variables in your Claude Desktop config (see MCP Configuration above).

For development from source: Create a .env file in the project root:

SPOTIFY_CLIENT_ID=your_client_id_here
SPOTIFY_CLIENT_SECRET=your_client_secret_here
SPOTIFY_REDIRECT_URI=http://127.0.0.1:3000/callback

MCP Configuration

Claude Desktop

Add to your Claude Desktop config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "spotify": {
      "command": "npx",
      "args": ["-y", "@darrenjaws/spotify-mcp"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
      }
    }
  }
}

Restart Claude Desktop after saving.

Claude Code (CLI)

The easiest way is the claude mcp add command:

claude mcp add spotify \
  -e SPOTIFY_CLIENT_ID=your_client_id_here \
  -e SPOTIFY_CLIENT_SECRET=your_client_secret_here \
  -e SPOTIFY_REDIRECT_URI=http://127.0.0.1:3000/callback \
  -- npx -y @darrenjaws/spotify-mcp

Or add it manually to ~/.claude.json (global) or .claude/settings.json (project):

{
  "mcpServers": {
    "spotify": {
      "command": "npx",
      "args": ["-y", "@darrenjaws/spotify-mcp"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
      }
    }
  }
}

Verify with claude mcp list — you should see spotify in the list.

Cursor

Add to .cursor/mcp.json in your project (or ~/.cursor/mcp.json for global):

{
  "mcpServers": {
    "spotify": {
      "command": "npx",
      "args": ["-y", "@darrenjaws/spotify-mcp"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
      }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "spotify": {
      "command": "npx",
      "args": ["-y", "@darrenjaws/spotify-mcp"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
      }
    }
  }
}

VS Code (GitHub Copilot)

Add to .vscode/mcp.json in your project (or VS Code User Settings for global):

{
  "servers": {
    "spotify": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@darrenjaws/spotify-mcp"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
      }
    }
  }
}

OpenCode

{
  "$schema": "https://opencode.ai/config.json",
  "spotify": {
    "command": ["npx", "-y", "@darrenjaws/spotify-mcp@latest"],
    "environment": {
      "SPOTIFY_CLIENT_ID": "your_client_id_here",
      "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
      "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
    },
    "type": "local"
  }
}

From Source (Development)

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["/absolute/path/to/spotify-mcp/build/bin.js"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback"
      }
    }
  }
}

Note: When using npx or global install, environment variables must be specified in the MCP config (not in a .env file).

Usage

Once configured, you can interact with Spotify through natural language:

  • "Play my Discover Weekly playlist"

  • "Play the album Thriller by Michael Jackson"

  • "What song is currently playing?"

  • "Create a playlist called 'Workout Mix' with these songs..."

  • "Skip to the next track"

  • "Turn on shuffle"

  • "Set repeat to track"

  • "Show me my top artists from the last month"

  • "Search for songs by The Beatles"

  • "Add this song to my liked songs"

Available Tools (32 total)

Playback & Device Control (10 tools)

  • spotify_play - Start or resume playback of tracks, albums, playlists, or artists

  • spotify_pause - Pause playback

  • spotify_next - Skip to next track

  • spotify_previous - Skip to previous track

  • spotify_set_volume - Adjust volume level (0-100)

  • spotify_get_playback_state - Get current playback information (includes shuffle/repeat status)

  • spotify_get_devices - List available Spotify Connect devices

  • spotify_transfer_playback - Transfer playback to a different device

  • spotify_shuffle - Enable or disable shuffle mode

  • spotify_repeat - Set repeat mode (track, context, or off)

Search & Discovery (1 tool)

  • spotify_search - Search for tracks, albums, artists, or playlists with optional field filters (artist, album, genre, year, tag)

Playlist Management (8 tools)

  • spotify_get_playlists - Get user's playlists

  • spotify_get_playlist - Get specific playlist details

  • spotify_create_playlist - Create a new playlist

  • spotify_add_to_playlist - Add tracks to a playlist

  • spotify_remove_from_playlist - Remove tracks from a playlist

  • spotify_reorder_playlist_tracks - Reorder tracks in a playlist

  • spotify_delete_playlist - Delete (unfollow) a playlist

  • spotify_update_playlist - Update playlist details (name, description, public/private, collaborative)

Library Management (9 tools)

  • spotify_get_saved_tracks - Get tracks saved in your library

  • spotify_get_saved_albums - Get albums saved in your library

  • spotify_get_followed_artists - Get artists you follow

  • spotify_save_tracks - Save tracks to your library

  • spotify_remove_saved_tracks - Remove tracks from your library

  • spotify_save_albums - Save albums to your library

  • spotify_remove_saved_albums - Remove albums from your library

  • spotify_follow_artists - Follow artists

  • spotify_unfollow_artists - Unfollow artists

User Data (3 tools)

  • spotify_get_user_profile - Get user profile information

  • spotify_get_top_items - Get user's top artists or tracks

  • spotify_get_recently_played - Get recently played tracks

System (1 tool)

  • spotify_open - Open the Spotify desktop app (supports macOS, Windows, Linux)

Local Development

Prerequisites

  • Node.js >= 18.0.0

  • npm or yarn

  • Spotify Developer account with app credentials

Initial Setup

  1. Clone and install dependencies

git clone https://github.com/darrenjaworski/spotify-mcp.git
cd spotify-mcp
npm install
  1. Configure environment variables

cp .env.example .env
# Edit .env with your Spotify credentials
  1. Build the project

npm run build

Development Workflow

Run TypeScript compiler in watch mode for automatic rebuilds:

npm run dev

This continuously watches for file changes and rebuilds automatically. Keep this running in one terminal while you develop.

Manual Build

npm run build       # Compile TypeScript to build/
npm run clean       # Remove build directory

Testing Your MCP Server

The MCP Inspector is the official interactive testing tool for MCP servers. It provides a browser-based UI to test tools, see protocol messages, and debug your server.

Start the Inspector:

npx @modelcontextprotocol/inspector node build/bin.js

This opens a browser at http://localhost:6274 with:

  • Server Connection Pane: Configure transport and environment variables

  • Tools Tab: See all available tools and test them interactively

  • Resources Tab: View server resources

  • Notifications Pane: See real-time protocol messages

With Environment Variables:

npx @modelcontextprotocol/inspector node build/bin.js -- \
  SPOTIFY_CLIENT_ID=your_id \
  SPOTIFY_CLIENT_SECRET=your_secret \
  SPOTIFY_REDIRECT_URI=http://127.0.0.1:3000/callback

Enable Debug Logging:

DEBUG=true npx @modelcontextprotocol/inspector node build/bin.js

Benefits:

  • ✅ Interactive UI to test all 32 tools

  • ✅ See JSON-RPC messages in real-time

  • ✅ No need to configure Claude Desktop during development

  • ✅ Quickly iterate on tool implementations

Option 2: Test with Claude Desktop

Add to your Claude Desktop config for real-world testing:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "spotify-dev": {
      "command": "node",
      "args": ["/absolute/path/to/spotify-mcp/build/bin.js"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:3000/callback",
        "LOG_LEVEL": "debug"
      }
    }
  }
}

Restart Claude Desktop after config changes.

Option 3: Manual stdio Testing

For low-level debugging, you can send JSON-RPC messages directly:

# Build first
npm run build

# Test list tools
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node build/bin.js

# Test a tool call
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"spotify_get_user_profile","arguments":{}}}' | node build/bin.js

Development Tips

1. Use Watch Mode + Inspector Together

Terminal 1:

npm run dev  # Watch mode - rebuilds on changes

Terminal 2:

npx @modelcontextprotocol/inspector node build/bin.js

Refresh the Inspector after each rebuild to test changes.

2. Enable Debug Logging

Set LOG_LEVEL=debug in your .env file to see detailed logs:

LOG_LEVEL=debug node build/bin.js

3. Test Individual Tools

Use the Inspector's Tools tab to test each tool with different inputs before integrating with Claude.

4. Check stderr for Logs

The server logs to stderr (not stdout) to avoid interfering with stdio transport:

node build/bin.js 2> server.log  # Capture logs to file

Testing

Run the test suite to verify tool registration and functionality:

npm test              # Run all tests
npm run test:watch    # Run tests in watch mode

Test Coverage:

  • ✅ 310 tests across 16 test files

  • ✅ Tool-level unit tests for playback, search, playlists, library, user, and system

  • ✅ Auth tests (credentials, token management, file permissions, refresh, OAuth callback)

  • ✅ Logger tests (sensitive data redaction, log levels)

  • ✅ Error handling tests (all HTTP status codes, security)

  • ✅ Server registration and integration tests

  • ✅ Client tests (token orchestration, retry logic, rate limiting)

  • ✅ Validation tests (URI format, array size, numeric range)

  • ✅ Setup wizard and CLI argument tests

Linting and Code Quality

npm run lint           # Check code style
npm run lint:fix       # Auto-fix linting issues
npm run static-checks  # Run lint, build, and test together

Troubleshooting

Build Errors:

  • Ensure TypeScript is installed: npm install

  • Check Node version: node --version (should be >= 18)

Inspector Not Loading:

  • Check if port 6274 is available

  • Try clearing browser cache

  • Restart the inspector

OAuth Errors:

  • Verify Spotify credentials in .env

  • Check redirect URI matches in Spotify Dashboard

  • Ensure scopes are correct in src/spotify/auth.ts

Server Not Responding:

  • Check logs: LOG_LEVEL=debug node build/bin.js

  • Verify build succeeded: ls -la build/

  • Test with simple tool like spotify_get_user_profile

Authentication Flow

The server uses Spotify's OAuth 2.0 Authorization Code flow:

  1. First request triggers the auth flow

  2. User is redirected to Spotify login with secure state parameter for CSRF protection

  3. After authorization, tokens are exchanged using client_secret

  4. Tokens are stored securely in ~/.spotify-mcp/tokens.json with 0600 permissions

  5. Tokens are automatically refreshed when expired

Security

  • OAuth tokens are stored securely with restricted file permissions (0600) and never logged

  • Cryptographically secure state parameter prevents CSRF attacks

  • Client secrets are kept in environment variables, never in source code

  • All API requests use HTTPS

  • Uses Authorization Code flow appropriate for confidential server applications

Contributing

Contributions are welcome! Please read our contributing guidelines before submitting PRs.

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

License

MIT License - see LICENSE file for details

Acknowledgments

Support

Resources

MCP Development Tools

Spotify API

Available Tools

32 tools
spotify_add_to_playlistC

Add tracks to a playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
urisYesArray of Spotify track URIs to add
positionNoPosition to insert tracks (default: end of playlist)
playlist_idYesSpotify playlist ID

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden and does not meet it. It says nothing about required OAuth scopes, whether duplicate URIs are added twice, rate limits, or whether the operation is reversible — all relevant for a mutation tool that alters user data.

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 short, front-loaded sentence with no filler, appropriate for a simple three-parameter operation. It is not padded, though it is arguably under-specified rather than optimally concise.

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?

For a state-mutating tool with no annotations and no output schema, the description should cover at least authentication expectations, duplicate handling, and the effect of the position parameter. None of that is present, leaving significant gaps an agent would need in order to call it correctly.

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 playlist_id, uris, and position are all documented in the schema itself. The description adds no extra meaning beyond the schema, which is the baseline-3 case.

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?

States a specific verb (add) and resource (tracks to a playlist), which is clear enough to distinguish it from siblings like spotify_remove_from_playlist and spotify_create_playlist. It does not explicitly name or contrast those siblings, so it falls 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 guidance on when to use this tool versus alternatives such as spotify_reorder_playlist_tracks or spotify_create_playlist, nor any prerequisites (authentication, playlist ownership). The agent must infer usage entirely from the name.

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

spotify_create_playlistC

Create a new playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPlaylist name
publicNoWhether the playlist should be public (default: true)
descriptionNoPlaylist description

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only restates the mutation and never mentions authentication requirements, that the playlist is added to the user's library, or any side effects, leaving the mutation semantics largely unexplained.

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 single sentence is front-loaded and free of waste, but its brevity reflects under-specification rather than efficient conciseness given the gaps elsewhere.

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?

For a mutation tool with no annotations and no output schema, the description should cover permissions, defaults, and return behavior. It covers none of these, leaving an agent under-informed.

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% (name, public, description all documented), so the baseline of 3 applies. The description adds no meaning beyond the schema's parameter documentation.

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 states a specific verb and resource (create a playlist), so the operation is unambiguous. It does not, however, differentiate itself from siblings such as spotify_update_playlist or spotify_delete_playlist, which act on the same resource.

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, nor any preconditions mentioned. An agent must infer everything from the name alone.

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

spotify_delete_playlistA

Delete (unfollow) a playlist. You can only delete playlists you own.

ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYesSpotify playlist ID to delete

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses the ownership requirement and clarifies that 'delete' means 'unfollow', but it does not state whether the action is irreversible, what permissions or scopes are needed, or what side effects occur for other users.

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?

Two short sentences with no filler. The core operation is front-loaded, and the ownership constraint follows immediately as necessary context.

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 simple one-parameter tool with full schema coverage and no output schema, the description gives enough to call it correctly: what it does and who can do it. Minor gaps remain around irreversibility and side effects, but these are not strictly required for a low-complexity mutation.

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 single 'playlist_id' parameter is already fully documented. The description adds no additional syntax, format, or scoping detail beyond the schema, making the baseline score appropriate.

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 ('Delete') and resource ('playlist'), and clarifies that this is equivalent to unfollowing. The operation is clearly distinct from sibling playlist tools such as create, update, and remove-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 Guidelines3/5

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

Provides one important precondition ('You can only delete playlists you own'), which tells the agent when this tool will succeed. However, it does not name or compare against alternatives, so usage is only implied from the operation itself.

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

spotify_follow_artistsC

Follow one or more artists

ParametersJSON Schema
NameRequiredDescriptionDefault
artist_idsYesArray of Spotify artist IDs to follow

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It says nothing about required auth/scopes, idempotency (following an already-followed artist), rate limits, or side effects on the user's profile — all relevant for a mutation tool.

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 front-loaded sentence with zero filler. It is appropriately terse for the tool's simplicity, though the same brevity leaves gaps that a slightly longer description could close.

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?

For a mutation tool with no annotations and no output schema, the description is too thin: it omits auth requirements, effect on existing follows, and any indication of what is returned or how to verify success.

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 single parameter is fully documented in the schema (array of artist IDs, 1-50 items), and the description's 'one or more' aligns with the minItems/maxItems bounds. With 100% schema coverage the baseline of 3 is appropriate; the description adds no format or sourcing detail beyond the schema.

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?

States a specific verb and resource ('Follow ... artists'), which is unambiguous. However it does no sibling differentiation: it never contrasts with spotify_unfollow_artists or spotify_get_followed_artists, leaving the agent to infer the follow/unfollow distinction.

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 when-to-use guidance and no alternatives named, despite two closely related siblings (spotify_unfollow_artists, spotify_get_followed_artists). Usage is only vaguely implied by the verb.

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

spotify_get_devicesB

List available Spotify Connect devices

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It does not disclose authentication requirements, whether it returns active device status, rate limits, or any read-only assurance. It implies a safe list operation but leaves key behavioral context unstated.

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 a single, front-loaded sentence with no wasted words. It is appropriately sized for a zero-parameter listing tool.

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 zero-parameter list tool with no output schema and no annotations, the description is minimally adequate but lacks usage context and return-value details. It tells the agent what is listed but not why or when to call it.

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 tool takes zero parameters, so there are no parameter semantics to explain. Per the rubric, a zero-parameter tool receives a baseline of 4, and the schema coverage is vacuously complete.

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 states a clear verb ('List') and a specific resource ('Spotify Connect devices'), making its purpose immediately understandable. It does not explicitly differentiate from siblings like spotify_get_playback_state or spotify_transfer_playback, though the device-listing scope is distinct.

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, what prerequisites exist, or how it relates to alternatives such as spotify_transfer_playback or spotify_open. The agent must infer that this is for discovering playback targets before transferring playback.

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

spotify_get_followed_artistsB

Get artists followed by the current user

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoLast artist ID from previous page for cursor pagination
limitNoNumber of artists to return (default: 20)

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden and delivers almost none: it does not state pagination/ordering behaviour, whether authentication as the 'current user' is required, or what happens at the end of a cursor chain. The only disclosure is that results are scoped to the current user.

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 front-loaded sentence with no filler or redundancy. It is as short as it can be while still naming verb and resource, though it is arguably too thin to earn more than a 4.

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 zero-required-parameter, flat-structure read tool whose params are 100% documented in the schema, this is largely sufficient. No output schema exists, so return values need not be explained, but the description omits any note that results are paginated via the cursor.

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 both 'after' (cursor) and 'limit' (max 50, default 20) are already fully documented in the schema. The description adds no parameter-level meaning, which is the expected baseline when the schema does the work.

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?

States a specific verb (Get) and resource (artists followed by the current user), which is unambiguous on its own. It does not, however, explicitly distinguish itself from adjacent siblings such as spotify_get_saved_albums or spotify_follow_artists, so the agent must infer the read-vs-write boundary.

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 when-to-use or when-not-to-use guidance is given, no mention of alternatives, and no hint that this is a paginated listing. The agent is left to infer that this is a read-only retrieval of the user's followed artists.

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

spotify_get_playback_stateB

Get current playback state including track, artist, album, and playback status

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It signals read-only behavior via 'Get' and names some returned fields, but omits the behaviors that matter for this Spotify endpoint: that it returns an empty/null state when no device is active, whether authentication of the caller is required, and rate-limit considerations.

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?

A single front-loaded sentence that states the action and the payload with no filler. Nothing could be trimmed without losing information.

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 zero-parameter read tool with no annotations and no output schema, the description gives a useful but partial sketch of the return payload (it never mentions is_playing, progress, device, or shuffle/repeat state, nor the no-active-device case). Adequate, but it leaves real gaps an agent would want covered.

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 tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The schema is empty and consistent with the description.

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?

Specific verb ('Get') plus resource ('current playback state') with an enumeration of the returned content (track, artist, album, playback status). It is clearly distinguishable from action siblings like spotify_play/spotify_pause, though it does not explicitly contrast itself with the closest reader alternative, spotify_get_devices.

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 statement of when to use this tool versus alternatives, no prerequisites (e.g. requires an active device or Premium account), and no indication of what happens when nothing is playing. Usage must be inferred entirely from the name and the sibling list.

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

spotify_get_playlistC

Get details of a specific playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYesSpotify playlist ID

TDQS

C2.9/5.0
Behavior2/5

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

No annotations and no output schema are provided, so the description carries the full behavioral burden. 'Get details' implies a read, but the description says nothing about what details are returned, pagination, auth requirements, or error behavior (e.g., invalid ID). This is a significant gap for a tool with zero structured behavioral coverage.

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 front-loaded sentence with no wasted words. It is appropriately sized, though its brevity reflects under-specification rather than optimal economy.

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 single-parameter read tool with no output schema, the description is minimally adequate. But with no annotations to cover safety and no return-value context, an agent lacks enough to call it confidently in edge cases.

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?

There is one parameter (playlist_id) with 100% schema description coverage, so the schema already documents it fully. The description adds no format, ID syntax, or example beyond the schema, making the baseline 3 appropriate.

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?

States a specific verb (get) and resource (details of a specific playlist), which is clear enough for an agent to understand the operation. However, it does not differentiate itself from the sibling spotify_get_playlists (plural) beyond the singular wording, leaving the read-one vs read-all distinction implicit.

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 spotify_get_playlists or spotify_get_playback_state, and no mention of prerequisites (e.g., needing a valid playlist ID or auth scope). The agent must infer usage entirely.

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

spotify_get_playlistsC

Get current user's playlists

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of playlists to return (default: 20)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It does not disclose that this requires an authenticated user token (and the playlist-read-private scope to see private playlists), whether followed-but-not-owned playlists are included, or how pagination behaves. Only the implicit read-only nature of 'Get' is conveyed.

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 short sentence with zero waste and the resource front-loaded. It is appropriately sized, though it is so terse that it barely does more than the name.

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 one-optional-parameter read tool with no output schema, the description is minimally viable. However, it omits the auth/scope requirement and the ambiguity about whether the list covers owned vs. followed playlists, which an agent would need for correct invocation.

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% and the single optional 'limit' parameter is fully documented in the schema (including default 20 and max 50). The description adds no parameter meaning, so the baseline of 3 applies.

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?

States a specific verb and resource ('Get current user's playlists'), which is clear on its own and implicitly distinguishes it from the singular spotify_get_playlist and from spotify_get_saved_tracks/albums. It stops short of explicitly naming the sibling it is not, so it does not reach 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?

The description gives no when-to-use context, no prerequisites, and no pointer to alternatives such as spotify_get_playlist for a single playlist. An agent must infer usage purely from the name.

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

spotify_get_recently_playedC

Get user's recently played tracks

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of tracks to return (default: 20)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. 'Get' implies a read operation, but the description says nothing about the user-scoped auth requirement (user-read-recently-played scope), ordering of results, or whether it is paginated. For a tool with zero annotation coverage, this leaves key behavior undisclosed.

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 short, front-loaded sentence with zero waste. It is perhaps too terse to be maximally useful, but nothing is redundant or padded.

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 one-optional-param read tool this is adequate, but with no output schema and no annotations, the description could reasonably mention what a 'recently played track' entry contains (track plus played-at timestamp) and the auth scope. It covers the core purpose and nothing more.

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%, and the single optional 'limit' param is fully documented with default and bounds in the schema. The description adds nothing beyond the schema, so the baseline of 3 applies.

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?

States a specific verb and resource: 'Get user's recently played tracks'. The intent is unambiguous and distinguishable from siblings like spotify_get_saved_tracks and spotify_get_top_items, though it does not explicitly name them.

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 versus alternatives (e.g. get_saved_tracks, get_top_items), no mention of required OAuth scope, and no exclusions. The agent must infer usage entirely from the name.

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

spotify_get_saved_albumsB

Get albums saved in the current user's library

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of albums to return (default: 20)
offsetNoIndex of first album to return (default: 0)

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It implies a read-only retrieval via 'Get' but discloses no behavioral traits such as authentication requirements, pagination behavior, rate limits, or response format.

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?

A single, front-loaded sentence that states the purpose without filler. Every word earns its place.

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 getter with zero required parameters and a fully documented schema, the description is adequate but not complete. It omits any mention of return format (no output schema exists) and behavioral context like auth requirements, leaving the agent with only the basic purpose.

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 schema already documents both limit and offset parameters. The description adds no parameter-level information, so the baseline of 3 is appropriate.

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 states a specific verb ('Get') and resource ('albums saved in the current user's library'), which distinguishes it from sibling spotify_get_saved_tracks. However, it provides no explicit sibling differentiation or scope boundaries beyond the noun, so it falls 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?

No when-to-use guidance, no alternatives named, and no prerequisites. The description only states what the tool does, not when to choose it over other saved-item tools.

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

spotify_get_saved_tracksC

Get tracks saved in the current user's library

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of tracks to return (default: 20)
offsetNoIndex of first track to return (default: 0)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only library fetch via 'saved' and 'current user', but says nothing about pagination, ordering, return shape, or auth requirements. For a no-annotation tool this is a notable gap.

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 scope is front-loaded. It is efficient, though the extreme brevity is what leaves the other dimensions thin.

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 two-optional-param read tool with full schema coverage and no output schema, the description is minimally adequate. But with zero annotations, it should have noted the read-only nature and pagination behavior.

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%, with limit and offset both documented in the schema including defaults and bounds. The description adds nothing beyond the schema, so the baseline 3 applies.

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?

States a specific verb ('Get') and resource ('tracks saved in the current user's library'), which clearly distinguishes it from spotify_get_saved_albums and spotify_get_playlists by resource type. However, it never explicitly names or contrasts a sibling, so it falls short of the 5 bar.

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 gives no when-to-use context, no prerequisites (e.g. user auth), and no alternatives or exclusions. An agent must infer usage from the name alone, which is minimal guidance.

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

spotify_get_top_itemsC

Get user's top artists or tracks

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesType of items to get
limitNoNumber of items to return (default: 20)
time_rangeNoTime range: short_term (4 weeks), medium_term (6 months), long_term (all time)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It only implies a read via 'Get' and says nothing about required user authorization, which time-range default applies, or how results are ordered/limited. Significant gaps for a tool with zero annotation coverage.

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, front-loaded sentence with zero filler. It is appropriately sized for the surface, though its terseness contributes to the behavioral gaps rather than being a flaw in structure itself.

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?

With no annotations and no output schema, the description should disclose auth requirements and return nature, but it does neither. The schema covers inputs fully, yet the definition leaves the agent guessing about permissions and result format.

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 schema already documents type, limit, and time_range with enums and defaults. The description adds no parameter detail beyond restating the artists/tracks choice, so the baseline 3 is appropriate.

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?

States a specific verb ('Get') and resource ('user's top artists or tracks'), with the artists/tracks duality matching the required enum. It's clear what the tool does, though it never names or contrasts with related siblings like spotify_get_recently_played or spotify_get_saved_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 when-to-use guidance, no conditions, and no alternatives named. The word 'top' implicitly distinguishes it from saved/recently-played siblings, but nothing tells the agent when to prefer this tool over them.

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

spotify_get_user_profileB

Get current user's profile information

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries the full behavioral burden but only states that it gets profile information. It does not disclose authentication requirements, rate limits, or any other behavioral trait beyond the implied read-only nature of 'Get'.

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 one short, front-loaded sentence with no redundant or filler content. It is appropriately sized for a simple, parameterless getter.

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 low complexity (zero parameters, no output schema, no annotations), the description is minimally adequate for selection and invocation. However, it could specify what profile information is returned, which would help an agent understand the tool's output without an 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?

There are zero parameters, so the baseline score is 4 per the rules. The schema and description are consistent, and no parameter semantics need to be described.

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 states a specific verb ('Get') and resource ('current user's profile information'), making the tool's purpose clear. It does not explicitly differentiate from sibling tools, but the resource is unique among the listed siblings, so an agent can still identify it.

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, nor any mention of prerequisites or context. The implied usage is only that it retrieves the current user's profile, which is minimal.

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

spotify_nextB

Skip to next track

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoOptional: Device ID

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It doesn't say what happens with no active playback, whether skipping requires an active device, or how device_id affects targeting (active-device default vs. explicit device). For a playback-control mutation, this is a thin disclosure.

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?

Four words, front-loaded, zero waste. For a single-action tool the description is appropriately sized and reads instantly.

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?

A simple one-optional-param tool with no output schema needs little, but the description omits device targeting semantics and failure conditions. Adequate minimum viable coverage, with clear gaps around the optional parameter's effect.

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 single device_id parameter (Optional: Device ID) is already documented in the schema, establishing a baseline of 3. The description adds nothing about how device_id changes behavior or what the default is.

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?

States a specific verb+resource action ('skip to next track') that is immediately distinguishable from siblings like spotify_pause, spotify_play, and spotify_previous. However, it never explicitly names or contrasts against those siblings, so it earns a 4 rather than 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?

No guidance on when to use this versus spotify_previous or spotify_transfer_playback, nor any prerequisite such as an active playback session. The agent must infer all usage context from the name alone.

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

spotify_openB

Open the Spotify desktop app on this machine

ParametersJSON Schema
NameRequiredDescriptionDefault
wait_secondsNoSeconds to wait after opening for Spotify to initialize (0-30)

TDQS

B3.4/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden, yet it omits key traits: what happens if the app is already open (idempotency), the OS requirements (it assumes a desktop platform), error behavior if Spotify isn't installed, and what is returned. Only the local-machine scoping is disclosed.

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?

A single front-loaded sentence with the verb first and zero filler. Nothing can be trimmed without losing meaning.

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 one-parameter, output-less launcher this is nearly sufficient, and the schema covers the only parameter. The remaining gap is behavioral: OS prerequisites and behavior when the app is already running are unstated.

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%, and the single wait_seconds parameter is fully documented with its 0-30 range in the schema. The description adds nothing about the parameter, so the baseline 3 applies.

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?

States a specific verb (Open) and resource (the Spotify desktop app) and scopes it to the local machine, which distinguishes it from the API-based playback siblings. However, it never names or contrasts itself with an alternative tool, so the differentiation is implicit rather than explicit.

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 action is self-evidently a launch step, so usage is implied, but the description gives no explicit guidance such as calling this before playback tools when the app isn't running. No when-not-to-use conditions are stated.

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

spotify_pauseC

Pause current playback

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoOptional: Device ID

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full behavioral burden and discloses almost nothing: it does not say whether the call is idempotent, what happens when nothing is playing, whether it targets a specific device, or whether playback state is preserved for resumption. For a playback-mutating tool this is a meaningful gap.

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?

Three words, front-loaded with the verb and free of filler. It is appropriately terse for a simple command, though the brevity borders on under-specification rather than pure economy.

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?

This is a low-complexity, zero-required-parameter tool with a fully documented schema and no output schema, so the description is minimally adequate. It nonetheless omits device-targeting behavior and no-active-playback handling, which an agent would need for correct invocation.

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 single optional device_id is already documented in the schema. The description adds no device-targeting context, so the baseline of 3 applies.

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?

States a specific verb ('pause') and resource ('current playback'), which is unambiguous and clearly distinct from siblings like spotify_play, spotify_next, and spotify_transfer_playback. It stops short of explicitly naming an alternative, but the action is self-evident.

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 when-to-use guidance, no prerequisites, and no mention of alternatives such as spotify_transfer_playback for moving playback elsewhere. Usage is only implied by the verb itself.

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

spotify_playB

Start or resume playback of a track, album, artist, or playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoSpotify URI to play (e.g., spotify:track:xxx, spotify:album:xxx, spotify:playlist:xxx, spotify:artist:xxx). Use search tool to get URIs.
device_idNoOptional: Device ID to play on

TDQS

B3.3/5.0
Behavior2/5

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

No annotations exist, so the description carries full behavioral burden. It conveys only that playback starts or resumes; it omits the Spotify-specific requirement of an active device (which device_id addresses), any authentication/premium implications, and what happens when playback is already active.

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 short sentence with the action front-loaded and zero filler. It is efficient, though the brevity leaves room that could have been spent on device/usage context.

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?

For a playback-mutating tool with no annotations and no output schema, the description should at least note the active-device prerequisite and typical failure modes. Instead it provides only the surface action, leaving meaningful operational gaps.

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%: the uri field already documents supported URI formats and even points to the search tool, and device_id is labeled optional. The description adds nothing beyond that, so the baseline 3 applies.

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 ('Start or resume playback') plus the resource kinds accepted (track, album, artist, playlist). An agent can immediately distinguish this from siblings like spotify_pause, spotify_next, and spotify_transfer_playback.

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 phrase 'start or resume' implies the tool is used to initiate or continue playback, but there is no explicit when-to-use guidance, no mention of the need for an active device, and no routing to alternatives such as spotify_transfer_playback when no device is active.

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

spotify_previousB

Skip to previous track

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoOptional: Device ID

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden, yet it only restates the action. It says nothing about auth requirements, error behavior when no previous track exists, or whether an optional device must be active.

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?

A single four-word sentence, front-loaded with the action, with no wasted tokens. Appropriate size for a trivial playback control.

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 one-parameter, no-output action tool the description is close to adequate, but with zero annotations it should say something about prerequisites or failure modes to be fully self-contained.

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% for the single optional device_id parameter, so the schema already documents it fully. The description adds no parameter meaning beyond that, matching the baseline for high-coverage schemas.

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?

States a specific verb ('Skip') and resource ('previous track'), making the action immediately unambiguous. It does not explicitly differentiate from the sibling spotify_next, though the naming pair is self-evident.

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?

Usage is only implied by the verb; there is no guidance on when this applies versus alternatives like spotify_next or spotify_transfer_playback, nor any note about playback needing to be active or what happens at the start of a queue.

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

spotify_remove_from_playlistC

Remove tracks from a playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
urisYesArray of Spotify track URIs to remove
playlist_idYesSpotify playlist ID
snapshot_idNoPlaylist snapshot ID for concurrent modification safety

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It doesn't disclose that this is a destructive mutation, whether removal is reversible, whether it requires user auth/scopes, or how the optional snapshot_id concurrency guard behaves. It adds essentially nothing beyond the name.

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?

A single short sentence with no waste, but it is sparse rather than efficiently structured — there is nothing to front-load and no additional context, so it lands at the minimum viable level.

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?

For a destructive mutation with no annotations and no output schema, the description should at minimum mention mutation effects or the snapshot_id safety mechanism. It leaves key behavioral context entirely to the schema, which is inadequate here.

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 all three parameters (uris, playlist_id, snapshot_id) are already documented in the schema. The description adds no syntax, limit, or format detail beyond that, so the baseline 3 applies.

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?

States a specific verb (Remove) and resource (tracks from a playlist), which distinguishes it from spotify_add_to_playlist. However, it doesn't clarify how it differs from the similarly named sibling spotify_remove_saved_tracks, leaving scope ambiguity about playlist tracks vs. library 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 when-to-use guidance, no prerequisites, and no mention of alternatives such as spotify_remove_saved_tracks. The agent must infer everything from the name.

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

spotify_remove_saved_albumsB

Remove albums from the current user's library

ParametersJSON Schema
NameRequiredDescriptionDefault
album_idsYesArray of Spotify album IDs to remove

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It omits that this is a destructive, irreversible library mutation, whether authentication/scope is required, and how it handles invalid or already-unsaved album IDs. 'Remove' signals mutation but nothing beyond that.

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 efficient sentence with the action and target front-loaded and zero filler. It is appropriately sized for a one-parameter tool, though it is sparse rather than richly structured.

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 one-parameter tool with full schema coverage, the definition is minimally viable. But with no annotations and no output schema, the destructive nature, auth prerequisites, and result behavior are left completely undocumented.

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% — album_ids is fully documented in the schema as an array of Spotify album IDs. The description adds no format, batching (max 50), or failure semantics beyond what the schema already provides, so the baseline 3 applies.

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?

States a specific verb ('remove') and resource ('albums from the current user's library'), which is clear and distinguishable from spotify_remove_saved_tracks and spotify_remove_from_playlist by name. It does not, however, explicitly differentiate itself from siblings in the text.

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 purpose makes usage reasonably inferable — remove albums the user previously saved — but there is no explicit when-to-use, prerequisite, or alternative guidance (e.g., how it differs from spotify_remove_saved_tracks or unfollowing an artist).

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

spotify_remove_saved_tracksC

Remove tracks from the current user's library

ParametersJSON Schema
NameRequiredDescriptionDefault
track_idsYesArray of Spotify track IDs to remove

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It says 'remove' but does not disclose that this is destructive/irreversible, whether it requires user auth with a modification scope, or whether removing an already-unsaved track is an error or a no-op.

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 efficient sentence with no wasted words, correctly front-loaded. It is terse to the point of under-specification for a mutation tool, but structurally clean.

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 one-parameter mutation with no annotations and no output schema, the description is minimally adequate but omits the behavioral context an agent needs (irreversibility, auth scope, idempotency). The schema covers the input fully, so the gap is moderate rather than severe.

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% and the single parameter (track_ids) is fully documented in the schema, including the 1-50 item bounds. The description adds nothing beyond the schema, so the baseline of 3 applies.

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?

States a specific verb (remove) and resource (tracks from the current user's library), which is clearly distinguishable from spotify_remove_from_playlist and spotify_remove_saved_albums. It does not explicitly name or contrast those siblings, but the 'library' scoping is precise enough to route correctly.

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 when-to-use guidance, no prerequisites, and no mention of alternatives despite several similarly named removal tools in the sibling list. The agent must infer context entirely from the name and description.

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

spotify_reorder_playlist_tracksC

Reorder tracks in a playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
playlist_idYesSpotify playlist ID
range_startYesPosition of the first track to move
snapshot_idNoPlaylist snapshot ID for concurrent modification safety
range_lengthNoNumber of tracks to move (default: 1)
insert_beforeYesPosition where tracks should be inserted

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full behavioral burden. It does not disclose that this is a mutation that changes playlist order, requires playlist modification permissions, or uses snapshot_id for concurrency safety. Only the core action is stated.

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 a single, front-loaded sentence with no wasted words. It is concise and easy to parse, though very minimal. It earns its place without redundancy.

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 five parameters, no annotations, no output schema, and a mutation operation, the description is incomplete. It does not explain side effects, required auth, or how the reorder interacts with snapshot_id. The schema helps with parameters, but behavior and usage context are largely missing.

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 schema already documents all five parameters thoroughly. The description adds no additional parameter meaning or usage notes. When the schema does the heavy lifting, a baseline of 3 is appropriate.

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 states a specific verb and resource: 'Reorder tracks in a playlist.' This clearly identifies the tool's action. However, it does not explicitly distinguish it from sibling playlist-mutation tools like add, remove, or update, 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?

The description offers no guidance on when to use this tool versus alternatives. It simply states what it does, leaving the agent to infer appropriate contexts from the name alone. No prerequisites, exclusions, or alternative tools are mentioned.

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

spotify_repeatB

Set repeat mode: 'track' repeats current track, 'context' repeats album/playlist, 'off' disables repeat

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesRepeat mode: 'track', 'context' (album/playlist), or 'off'
device_idNoOptional: Device ID

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does explain the observable effect of each mode value (repeat track, repeat album/playlist, disable), which is genuine behavioral disclosure for a state-mutating tool, but it omits permissions/auth needs, whether an active device or playback session is required, and how device_id changes targeting.

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?

A single front-loaded sentence that maps each enum value to its effect with zero filler. Every clause earns its place.

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 2-parameter mutation with no output schema, the core semantics are covered, but the absence of annotations and of any note on session/device prerequisites or failure modes leaves meaningful context gaps.

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 schema already documents both parameters and the enum values. The description's restatement of the three modes adds no meaning beyond the schema, so the baseline 3 applies; device_id receives no added explanation.

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?

States a specific verb (Set) plus resource (repeat mode) and enumerates each mode's behavior, so the agent knows exactly what the tool does. It does not differentiate itself from the adjacent spotify_shuffle sibling, which also toggles a playback mode, so it falls 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, no mention of prerequisites such as an active playback session, and no routing to or away from siblings like spotify_shuffle or spotify_transfer_playback. Usage is only implied by the action itself.

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

spotify_save_albumsC

Save albums to the current user's library

ParametersJSON Schema
NameRequiredDescriptionDefault
album_idsYesArray of Spotify album IDs to save

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. 'Save' implies a mutation, but it doesn't disclose idempotency (what happens if an album is already saved), auth requirements, or whether it is additive. The 50-item batch limit lives only in the schema, not the prose.

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 short sentence with no filler and the verb front-loaded. It is efficient, though the brevity edges toward under-specification rather than pure concision.

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 one-parameter tool with a fully documented schema and no output schema, the description is minimally adequate. However, with no annotations it omits mutation semantics (idempotency, auth scope) that an agent would benefit from before invoking a library-writing operation.

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 coverage is 100% for the single album_ids parameter, so the schema already documents its meaning, type, and min/max bounds. The description adds nothing beyond confirming the resource is albums, so the baseline 3 applies.

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?

States a specific verb ('Save') and resource ('albums') scoped to the current user's library, which is enough to distinguish it from spotify_save_tracks and spotify_get_saved_albums. It does not explicitly name those siblings, so differentiation relies partly on the name.

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 when-to-use guidance, no mention of the complementary spotify_remove_saved_albums or spotify_get_saved_albums siblings, and no prerequisites (e.g., auth or user-library scopes) are stated. The agent must infer context entirely from the name.

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

spotify_save_tracksB

Save tracks to the current user's library

ParametersJSON Schema
NameRequiredDescriptionDefault
track_idsYesArray of Spotify track IDs to save

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden, and it only says 'Save'. It does not disclose that saving is idempotent/additive (already-saved tracks are unaffected), that it requires the user-library-modify scope, that it is a mutation the user can later undo via spotify_remove_saved_tracks, or what a successful response contains.

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?

A single front-loaded sentence with zero filler, appropriately sized for a one-parameter tool.

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 one-parameter mutation with complete schema coverage and no output schema, the minimum needed to call the tool is present. However, with no annotations and no batching or idempotency note, an agent cannot predict the effect of re-saving existing tracks or the 50-item cap's implications.

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% and the single parameter is documented there, including the 1-50 item bounds. The description adds no meaning beyond the schema, so the baseline of 3 applies.

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?

Specific verb ('Save') plus resource ('tracks') and destination ('the current user's library'), so the core action is unambiguous. It does not, however, differentiate itself from close siblings such as spotify_remove_saved_tracks or spotify_add_to_playlist, which an agent must choose between.

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 statement of when to use this tool versus alternatives, no preconditions, and no mention of the add-vs-remove distinction. The agent is left to infer that this is the additive counterpart to spotify_remove_saved_tracks.

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

spotify_set_volumeC

Set playback volume (0-100)

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoOptional: Device ID
volume_percentYesVolume level (0-100)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, and it adds nothing beyond stating the range. It doesn't disclose that this mutates live playback, what happens with no active device, whether an invalid device_id errors, or permission/auth requirements. 'Set' implies mutation but no consequences are described.

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 phrase that is front-loaded with the action. The parenthetical range is redundant with the schema, so it is not perfectly waste-free, but it is not bloated.

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 setter with no output schema and complete schema coverage, the description is minimally adequate. It still omits the meaningful unknowns: device defaulting behavior, failure modes when nothing is playing, and whether this affects only the active session.

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 coverage is 100% and the schema already documents both volume_percent (with min/max 0-100) and device_id. The description's '(0-100)' merely repeats the schema constraint, adding no syntax, default, or targeting semantics for device_id.

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?

States a specific verb and resource (set + playback volume) with the valid range, so an agent can distinguish it from siblings like spotify_play or spotify_transfer_playback. It stops short of naming any sibling or clarifying how it interacts with the currently active device.

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 about when to use this versus alternatives or what preconditions apply (an active playback session, whether device_id must be supplied or defaults to the active device). Usage is only implied by the tool name.

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

spotify_shuffleB

Enable or disable shuffle mode

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYestrue to enable shuffle, false to disable
device_idNoOptional: Device ID

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states a mutation action but omits whether an active device/session is required, whether the change applies globally or to a specific device, permission/Premium constraints, and any rate limits or response behavior.

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?

A single, front-loaded sentence with zero wasted words. The action and target are immediately clear.

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 low-complexity, 2-parameter toggle with full schema coverage and no output schema, the description is minimally adequate. However, with no annotations and no device/prerequisite context, an agent could still call it in an invalid playback state without warning.

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%: the schema already explains that 'state' toggles shuffle and that 'device_id' is optional. The description adds no extra meaning to either parameter, so the baseline score of 3 is appropriate.

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 gives a clear verb pair ('Enable or disable') and a specific resource ('shuffle mode'), so the agent knows exactly what the tool manipulates. It does not explicitly differentiate itself from adjacent playback-state siblings like spotify_repeat, but the resource is unambiguous enough to stand apart.

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, no mention of prerequisites such as an active playback session or a required device, and no alternatives. The only implied usage is tautological with the tool name.

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

spotify_transfer_playbackA

Transfer playback to a different device (use spotify_get_devices to find device IDs)

ParametersJSON Schema
NameRequiredDescriptionDefault
playNoWhether to start playback on the new device (default: true)
device_idYesDevice ID to transfer playback to

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations, the description carries full behavioral burden but says nothing about prerequisites, side effects, or error conditions. It does not disclose whether playback must already be active or what happens to current playback.

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?

A single front-loaded sentence with a helpful parenthetical for the required parameter. Every element earns its place and nothing is wasted.

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 simple two-parameter transfer tool with full schema coverage and no output schema, the description covers the core action and how to supply the required device ID. It is nearly complete, though it omits behavioral context already penalized under transparency.

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 adds useful meaning by directing the agent to spotify_get_devices to obtain required device IDs, going beyond the schema's terse 'Device ID to transfer playback to'.

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 ('transfer playback') and resource ('different device') that clearly distinguishes it from siblings like spotify_play or spotify_pause. The action of moving existing playback to another device is unambiguous.

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?

Provides no guidance on when to choose this tool over spotify_play or other playback controls. The parenthetical only tells how to find device IDs, not when this tool is appropriate versus starting playback elsewhere.

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

spotify_unfollow_artistsC

Unfollow one or more artists

ParametersJSON Schema
NameRequiredDescriptionDefault
artist_idsYesArray of Spotify artist IDs to unfollow

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It conveys only the high-level effect ('unfollow'), omitting whether the change is reversible, what authorization/scope is required, whether a response body is returned, and what happens with invalid or non-followed IDs. The maxItems=50 cap is present only in the schema, not surfaced behaviorally.

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 short sentence with zero filler and the core action front-loaded. It is appropriately sized for a one-parameter tool, though it is terse to the point of omitting useful context.

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 one-parameter mutation with a fully documented schema and no output schema, the definition is minimally sufficient to call the tool. However, with no annotations on a write operation, additional context on reversibility or auth would materially improve completeness.

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% with a single well-described parameter (artist_ids, array of Spotify artist IDs), so the schema already does the semantic heavy lifting. The description adds nothing beyond what the schema provides, which matches the baseline 3 for high-coverage schemas.

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?

States a specific verb (Unfollow) and resource (artists), and the plural 'one or more' correctly signals batch operation, which distinguishes it from a hypothetical single-artist tool. It does not explicitly name spotify_follow_artists as the counterpart, but the antonym in the name is unambiguous.

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 when-to-use, when-not-to-use, prerequisites, or alternative tools are mentioned. The agent must infer everything from the tool name; no guidance on how this relates to spotify_get_followed_artists or spotify_follow_artists is provided.

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

spotify_update_playlistC

Update playlist details (name, description, public/private, collaborative)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew playlist name
publicNoWhether the playlist should be public
descriptionNoNew playlist description
playlist_idYesSpotify playlist ID
collaborativeNoWhether the playlist should be collaborative (must be non-public)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It names the mutable fields but says nothing about permission requirements, ownership restrictions, whether omitted fields are preserved (partial update), or reversibility of changes like flipping a playlist to private.

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 compact sentence fragment with the resource and field list front-loaded and no filler. It is efficient, though it is terse to the point of omitting context an agent may need.

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?

For a mutation tool with no annotations and no output schema, the description omits key operational facts: required OAuth scopes/ownership, partial-update semantics for omitted fields, and side effects of public/collaborative toggling. It is incomplete for the tool's complexity.

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 schema already documents all five parameters including the collaborative-must-be-non-public constraint. The description's field list is redundant with the schema and adds no format or syntax detail, so the baseline 3 applies.

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?

States a specific verb (update) and resource (playlist details) plus the affected fields (name, description, public/private, collaborative). It is clearly distinguishable from spotify_create_playlist and spotify_delete_playlist, though it doesn't explicitly name the sibling it differs from.

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, no mention of prerequisites (e.g., ownership or scopes), and no alternatives referenced. Usage is only implied by the verb 'update' and the sibling list context.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 32 tool updatesv1.2.4
    • First observedspotify_add_to_playlist
    • First observedspotify_create_playlist
    • First observedspotify_delete_playlist
    • First observedspotify_follow_artists
    • First observedspotify_get_devices
    • First observedspotify_get_followed_artists
    • First observedspotify_get_playback_state
    • First observedspotify_get_playlist
    • First observedspotify_get_playlists
    • First observedspotify_get_recently_played
    • First observedspotify_get_saved_albums
    • First observedspotify_get_saved_tracks
    • First observedspotify_get_top_items
    • First observedspotify_get_user_profile
    • First observedspotify_next
    • First observedspotify_open
    • First observedspotify_pause
    • First observedspotify_play
    • First observedspotify_previous
    • First observedspotify_remove_from_playlist
    • First observedspotify_remove_saved_albums
    • First observedspotify_remove_saved_tracks
    • First observedspotify_reorder_playlist_tracks
    • First observedspotify_repeat
    • First observedspotify_save_albums
    • First observedspotify_save_tracks
    • First observedspotify_search
    • First observedspotify_set_volume
    • First observedspotify_shuffle
    • First observedspotify_transfer_playback
    • First observedspotify_unfollow_artists
    • First observedspotify_update_playlist

TDQS

B3.3/5.0

Scored across 32 tools

Disambiguation4/5

Most tools target a distinct resource and action, making the set easy to navigate. A few have minor boundary risk (spotify_play vs spotify_transfer_playback vs spotify_open, and singular spotify_get_playlist vs plural spotify_get_playlists), but descriptions clearly differentiate them.

Naming Consistency5/5

Every tool uses the same spotify_ prefix with consistent snake_case, mostly verb_noun (spotify_create_playlist, spotify_remove_saved_tracks) and clean verb-only playback controls (spotify_play, spotify_pause). The pattern is predictable throughout.

Tool Count3/5

At 32 tools the surface is heavy and sits just past the range where a set becomes unwieldy for an agent to select from. Each tool does earn its place given Spotify's breadth, so it's borderline rather than bloated.

Completeness4/5

The set covers playback control, full playlist CRUD, library save/remove, follow/unfollow, search, and user data retrieval rather thoroughly. Minor gaps exist (queue management, podcast/episode tools, album/artist detail retrieval), but core workflows are fully supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to control Spotify playback, search for music, manage playlists, and access library information through the Spotify API. Requires Spotify Premium for playback control features.
    4
    -
  • A
    license
    C
    quality
    A
    maintenance
    Enables AI assistants to control Spotify playback, search the full catalog including podcasts and audiobooks, manage libraries and playlists, and understand listening taste.
    500
    185 npm
    1
    MIT