Skip to main content
Glama
igorgarbuz

Spotify MCP Node Server

by igorgarbuz

A Model Context Protocol (MCP) Node server that enables AI assistants like Claude Desktop, or IDEs like Cursor and Windsurf to control Spotify playback and manage playlists. Great for music discovery and creative playlist curation. Try asking Claude for some less-known tracks in a genre or similar to an artist. You can start by asking to create a new playlist or update an existing playlist.

For an easiest quickstart, as of May 2025 the Claude Desktop is the recommended way to use this software. Install Claude Desktop for your platform and follow the integration guide below.

To comply with Spotify’s Developer Terms, you must have a Spotify Premium account to use this server. Additionally, if you’re using MCP-enabled AI assistants (such as Claude) with this server, you must opt out of data sharing for model training.

Example Interactions

  • "Play The Beatles less known bootlegs"

  • "Make a fusion playlist of The Beatles and Metallica"

  • "What are the audio features of the track 'Bohemian Rhapsody' by Queen?"

  • "Create my marathon playlist and add tracks from my workout playlists"

Related MCP server: Spotify MCP Server

Tools

  1. searchSpotify

    • Description: Search for tracks, albums, artists, or playlists on Spotify

    • Parameters:

      • query (string): The search term

      • type (string): Type of item to search for (track, album, artist, playlist)

      • limit (number, optional): Maximum number of results to return (10-50)

    • Returns: List of matching items with their IDs, names, and additional details

    • Example: searchSpotify("bohemian rhapsody", "track", 20)

  2. getNowPlaying

    • Description: Get information about the currently playing track on Spotify

    • Parameters: None

    • Returns: Object containing track name, artist, album, playback progress, duration, and playback state

    • Example: getNowPlaying()

  3. getUserPlaylists

    • Description: Get a list of the current user's playlists on Spotify

    • Parameters:

      • limit (number, optional): Maximum number of playlists to return (default: 20)

      • offset (number, optional): Index of the first playlist to return (default: 0)

    • Returns: Array of playlists with their IDs, names, track counts, and public status

    • Example: getUserPlaylists(10, 0)

  4. getPlaylistTracks

    • Description: Get a list of tracks in a specific Spotify playlist

    • Parameters:

      • playlistId (string): The Spotify ID of the playlist

      • limit (number, optional): Maximum number of tracks to return (default: 100)

      • offset (number, optional): Index of the first track to return (default: 0)

    • Returns: Array of tracks with their IDs, names, artists, album, duration, and added date

    • Example: getPlaylistTracks("37i9dQZEVXcJZyENOWUFo7")

  5. getRecentlyPlayed

    • Description: Retrieves a list of recently played tracks from Spotify.

    • Parameters:

      • limit (number, optional): A number specifying the maximum number of tracks to return.

    • Returns: If tracks are found it returns a formatted list of recently played tracks else a message stating: "You don't have any recently played tracks on Spotify".

    • Example: getRecentlyPlayed({ limit: 10 })

  6. getRecentlyPlayed

    • Description: Retrieves a list of recently played tracks from Spotify.

    • Parameters:

      • limit (number, optional): A number specifying the maximum number of tracks to return.

    • Returns: If tracks are found it returns a formatted list of recently played tracks else a message stating: "You don't have any recently played tracks on Spotify".

    • Example: getRecentlyPlayed({ limit: 10 })

  7. getFollowedArtists

    • Description: Retrieves a list of artists the user is following on Spotify.

    • Parameters:

      • after (string, optional): The last artist ID from the previous request. Cursor for pagination.

      • limit (number, optional): Maximum number of artists to return (1-50).

    • Returns: If artists are found it returns a formatted list of followed artists else a message stating: "You don't follow any artists on Spotify".

    • Example: getFollowedArtists({ limit: 10 })

  8. getUserTopItems

    • Description: Retrieves a list of the user's top artists or tracks.

    • Parameters:

      • type (string): The type of items to get top for. Must be "artists" or "tracks".

      • time_range (string): The time range for the top items. Must be "short_term", "medium_term", or "long_term".

      • limit (number, optional): Maximum number of items to return (1-50).

      • offset (number, optional): Index of the first item to return. Defaults to 0.

    • Returns: If items are found it returns a formatted list of top items else a message stating: "You don't have any top items on Spotify".

    • Example: getUserTopItems({ type: "artists", time_range: "short_term", limit: 10 })

  1. playMusic

    • Description: Start playing a track, album, artist, or playlist on Spotify

    • Parameters:

      • uri (string, optional): Spotify URI of the item to play (overrides type and id)

      • type (string, optional): Type of item to play (track, album, artist, playlist)

      • id (string, optional): Spotify ID of the item to play

      • deviceId (string, optional): ID of the device to play on

    • Returns: Success status

    • Example: playMusic({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })

    • Alternative: playMusic({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })

  2. pausePlayback

    • Description: Pause the currently playing track on Spotify

    • Parameters:

      • deviceId (string, optional): ID of the device to pause

    • Returns: Success status

    • Example: pausePlayback()

  3. skipToNext

    • Description: Skip to the next track in the current playback queue

    • Parameters:

      • deviceId (string, optional): ID of the device

    • Returns: Success status

    • Example: skipToNext()

  4. skipToPrevious

    • Description: Skip to the previous track in the current playback queue

    • Parameters:

      • deviceId (string, optional): ID of the device

    • Returns: Success status

    • Example: skipToPrevious()

  5. createPlaylist

    • Description: Create a new playlist on Spotify

    • Parameters:

      • name (string): Name for the new playlist

      • description (string, optional): Description for the playlist

      • public (boolean, optional): Whether the playlist should be public (default: false)

    • Returns: Object with the new playlist's ID and URL

    • Example: createPlaylist({ name: "Workout Mix", description: "Songs to get pumped up", public: false })

  6. addTracksToPlaylist

    • Description: Add tracks to an existing Spotify playlist

    • Parameters:

      • playlistId (string): ID of the playlist

      • trackUris (array): Array of track URIs or IDs to add

      • position (number, optional): Position to insert tracks

    • Returns: Success status and snapshot ID

    • Example: addTracksToPlaylist({ playlistId: "3cEYpjA9oz9GiPac4AsH4n", trackUris: ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh"] })

  7. addToQueue

    • Description: Adds a track, album, artist or playlist to the current playback queue

      • Parameters:

      • uri (string, optional): Spotify URI of the item to add to queue (overrides type and id)

      • type (string, optional): Type of item to queue (track, album, artist, playlist)

      • id (string, optional): Spotify ID of the item to queue

      • deviceId (string, optional): ID of the device to queue on

    • Returns: Success status

    • Example: addToQueue({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })

    • Alternative: addToQueue({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })

Setup

Prerequisites

MCP Server Installation

git clone https://github.com/igorgarbuz/spotify-mcp.git
cd spotify-mcp
npm install
npm run build

Node.js Installation

  1. Go to Node.js download page

  2. Download an install a recent Node.js version for your platform

Creating a Spotify Developer Application

  1. Go to the Spotify Developer Dashboard

  2. Log in with your Spotify account

  3. Click the "Create an App" button

  4. Fill in the app name and description

  5. Accept the Terms of Service and click "Create"

  6. In your new app's dashboard, you'll see your Client ID

  7. Click "Edit Settings" and add a Redirect URI (e.g., http://127.0.0.1:8888/callback)

  8. Save your changes

Spotify API Configuration

Create a spotify-config.json file in the project root:

# Copy the example config file
cp spotify-config.example.json spotify-config.json

Then edit the file by adding your client id only. The accessToken, refreshToken and accessTokenExpiresAt will be managed automatically. The redirectUri should be the same as the one you added in the Spotify Developer Dashboard. 127.0.0.1 is the simplest option for the local MCP server.

{
  "clientId": "you-must-add-your-client-id-here",
  "redirectUri": "http://127.0.0.1:8888/callback",
  "accessToken": "your-access-token-filled-automatically",
  "refreshToken": "your-refresh-token-filled-automatically",
  "accessTokenExpiresAt": 0
}

Authentication Process

The Spotify API uses OAuth 2.0 with the PKCE extension for secure authentication. You do NOT need a client secret for this app.

  1. Run the authentication script in the directory of the cloned repository:

npm run auth
  1. The script will open your browser to the Spotify authorization page.

  2. Log in to Spotify and authorize your application.

  3. After authorization, Spotify will redirect you to your specified redirect URI. The app will automatically handle the code exchange and save your tokens.

  4. The authentication script will automatically exchange this code for the access and refresh tokens.

  5. These tokens will be saved to your spotify-config.json file.

{
  "clientId": "your-client-id",
  "redirectUri": "http://127.0.0.1:8888/callback",
  "accessToken": "your-access-token-filled-automatically",
  "refreshToken": "your-refresh-token-filled-automatically",
  "accessTokenExpiresAt": 0
}
  1. The server will automatically refresh the access token when needed, so you don't need to re-authenticate.

Integrating with AI assistants

Claude Desktop

The easiest way to use the Spotify MCP server is with Claude Desktop. Start Claude Desktop installation and then locate the Claude configuration file, go to Claude Settings,click on Developer and then Edit Config. Add the following to the configuration with an absolute path to the server:

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["absolute/path/to/spotify-mcp/build/index.js"]
    }
  }
}

Cursor

For Cursor, go to the MCP tab in Cursor Settings (command + shift + J). Add a server with this command:

node absolute/path/to/spotify-mcp/build/index.js

VsCode (via Cline)

To set up your MCP correctly with Cline ensure you have the following file configuration set cline_mcp_settings.json:

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["/absolute/path/to/spotify-mcp/build/index.js"],
      "autoApprove": ["getListeningHistory", "getNowPlaying"]
    }
  }
}

You can add additional tools to the auto approval array to run the tools without intervention.

Windsurf

In Settings then Windsurf Settings type MCP in the search bar. In the results MCP section click add server and then add custom server. Add the following configuration:

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["absolute/path/to/spotify-mcp/build/index.js"],
    }
  }
}

You can add additional tools to the auto approval array to run the tools without intervention.

Credits

This project was inspired by spotify-mcp-server by Marcel Marais. Main modifications:

  1. The authentication process was refactored to use the Spotify API’s PKCE extension, eliminating the need for local client secret storage and repeated re-authentication.

  2. Added new tools to understand user's taste.

Available Tools

13 tools
addToQueueA

Adds a track, album, artist or playlist to the playback queue

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoThe Spotify URI to play (overrides type and id)
typeNoThe type of item to play
idNoThe Spotify ID of the item to play
deviceIdNoThe Spotify device ID to add the track to

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It states the action ('adds') but does not clarify whether items are appended to the queue, whether an active device is required, what occurs if the item is unavailable, or any side effects. This lack of detail is a significant gap 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.

Conciseness5/5

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

The description is a single concise sentence that front-loads the verb and resource. Every word contributes meaning; there is zero waste or repetition.

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 tool's simplicity, the description is adequate for basic understanding. However, with no output schema or annotations, it lacks important operational context such as prerequisites (active device), whether the operation replaces or appends to the queue, and error behavior. This leaves room for ambiguity in real-world usage.

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 schema provides complete descriptions for all four parameters (100% coverage), so the baseline is 3. The description adds no extra semantics beyond referencing the item types, which aligns with the 'type' enum. It does not clarify the relationship between id, uri, and type, but the schema already handles that adequately.

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

Purpose5/5

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

The description uses a specific verb 'Adds' and identifies the exact resource 'playback queue', while also enumerating the accepted item types (track, album, artist, playlist). This clearly distinguishes it from sibling tools like addTracksToPlaylist (which targets a playlist) and playMusic (which initiates 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 description implies the use case: when you want to place an item into the playback queue rather than playing it immediately or adding to a playlist. However, it does not explicitly state when to prefer this tool over siblings like playMusic or addTracksToPlaylist, nor does it mention any prerequisites such as an active device.

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

addTracksToPlaylistC

Add tracks to a Spotify playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
playlistIdYesThe Spotify ID of the playlist
trackIdsYesArray of Spotify track IDs to add
positionNoPosition to insert the tracks (0-based index)

TDQS

C2.8/5.0
Behavior1/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. The text merely paraphrases the tool name without revealing side effects, authentication requirements, or post-conditions (e.g., whether tracks are appended or replaced). It does not add value beyond what the name already implies.

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 sentence with no filler or redundant text. It is front-loaded with the core action, making it efficient and easy to parse for an AI agent.

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?

This is a mutation tool with no annotations, no output schema, and a minimal description. It fails to communicate important contextual details such as whether the operation is idempotent, duplicate handling, limits on track count, or required permissions. The description is under-specified for reliable tool selection and 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%, with each parameter (playlistId, trackIds, position) having a clear description. The tool description adds nothing extra about parameter usage, but the schema already provides sufficient 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.

Purpose5/5

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

The description clearly states the tool's action ('Add tracks') and resource ('a Spotify playlist'), using a specific verb+resource structure. It is distinct from sibling tools like addToQueue or createPlaylist, which target different operations.

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

Usage Guidelines1/5

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

No guidance is provided on when to use this tool versus alternatives such as addToQueue or createPlaylist. The description lacks any context about prerequisites, sequencing, or preferred scenarios, offering zero actionable usage advice.

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

createPlaylistB

Create a new playlist on Spotify

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the playlist
descriptionNoThe description of the playlist
publicNoWhether the playlist should be public

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 is the sole source of behavioral information. It only says 'Create a new playlist', which implies mutation but does not disclose side effects, permission requirements, or behavior on duplicate names. No additional context is provided.

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, direct sentence that immediately conveys the tool's function. It is appropriately sized and front-loaded, containing no unnecessary words or repetitions.

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 create operation with fully documented parameters, the description is minimally adequate. However, it lacks any reference to return values or usage context, and the absence of an output schema increases the burden on the description to explain the outcome.

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 input schema provides 100% coverage for all three parameters (name, public, description) with clear descriptions. The tool description adds no extra semantic value beyond the schema, so it earns the baseline score.

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

Purpose4/5

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

The description clearly states the action ('Create') and the resource ('a new playlist on Spotify'), which distinguishes it from sibling tools like updatePlaylist. However, it does not enumerate the configurable fields, so it's not as detailed as it could be.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives such as updatePlaylist or addTracksToPlaylist. It also omits any prerequisites or exclusions, leaving the usage context entirely implicit.

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

getFollowedArtistsB

Get a list of artists the user is following on Spotify

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoThe last artist ID from the previous request. Cursor for pagination.
limitNoMaximum number of artists to return (1-50)

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 full burden but only states the basic action without behavioral details. It doesn't disclose authentication requirements, rate limits, pagination behavior (implied by 'after' parameter but not explained), or response format, which are critical for a read operation.

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, efficient sentence that front-loads the core purpose without unnecessary words. Every part earns its place, making it highly concise and well-structured for quick understanding.

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 no annotations and no output schema, the description is incomplete for a tool with parameters and complexity. It lacks details on authentication, pagination behavior, response structure, and error handling, leaving significant gaps for the agent to operate effectively.

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 fully documents both parameters ('after' for pagination cursor, 'limit' with range). The description adds no additional meaning beyond the schema, such as default values or usage examples, meeting the baseline for high coverage.

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

Purpose5/5

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

The description clearly states the verb ('Get') and resource ('list of artists the user is following on Spotify'), making the purpose specific and unambiguous. It distinguishes this tool from siblings like 'getUserTopItems' or 'getRecentlyPlayed' by focusing exclusively on followed artists.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., user authentication), exclusions, or comparisons to sibling tools like 'getUserTopItems' for top artists, leaving the agent to infer usage context.

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

getNowPlayingA

Get information about the currently playing track on Spotify

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It implies a read-only operation via 'Get', but does not explicitly state that it has no side effects, requires active playback, or what happens if nothing is playing. The description adds minimal behavioral context beyond the tool's basic function.

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, concise sentence that conveys the essential purpose without any fluff or redundancy. Every word earns its place, and the information density is high.

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?

The tool is simple (no parameters, no output schema), but the description is somewhat thin. It does not specify what 'information' is returned (e.g., track name, artist, album) or address edge cases like no active playback. For a simple read tool, this is moderately complete but leaves room for ambiguity.

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 input schema has zero parameters, and the description correctly avoids inventing any. With no parameters, the schema coverage is effectively 100%, and the baseline of 4 applies. The description does not need to add parameter-level detail.

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

Purpose5/5

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

The description clearly states the verb 'Get' and the resource 'currently playing track on Spotify', which directly and unambiguously describes the tool's purpose. It is distinct from sibling tools like getRecentlyPlayed or searchSpotify, as it specifically targets the current playback state.

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

Usage Guidelines4/5

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

The phrase 'currently playing' provides clear context that this tool is for retrieving live playback information, implicitly distinguishing it from search or playlist retrieval. However, it does not explicitly mention when not to use it or reference alternative tools, falling short of a full 5.

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

getPlaylistTracksC

Get a list of tracks in a Spotify playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
playlistIdYesThe Spotify ID of the playlist
limitNoMaximum number of tracks to return (1-50)
offsetNoThe index of the first item to return. Defaults to 0

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 full burden but offers minimal behavioral insight. It doesn't disclose whether this is a read-only operation, if it requires specific permissions, rate limits, pagination behavior beyond the 'limit' and 'offset' parameters, or what the response format looks like.

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, clear sentence with no wasted words. It's front-loaded with the core purpose and efficiently communicates the essential action without unnecessary elaboration.

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 tool with 3 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain return values, error conditions, authentication requirements, or behavioral constraints. The schema handles parameters well, but the description fails to provide necessary context for effective use.

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 fully documents all three parameters. The description adds no additional parameter semantics beyond what's in the schema, such as explaining playlist ID format or typical use cases for limit/offset. This meets the baseline for high schema coverage.

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

Purpose4/5

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

The description clearly states the action ('Get a list') and resource ('tracks in a Spotify playlist'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'getUserPlaylists' or 'getRecentlyPlayed' beyond the obvious resource difference, missing explicit sibling 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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., authentication), compare to similar tools like 'getUserPlaylists' for finding playlists first, or specify use cases beyond the basic action.

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

getRecentlyPlayedB

Get a list of recently played tracks on Spotify

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of tracks to return (1-50)

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations provided, the description must disclose behavioral traits, but it only states 'Get a list' without covering authorization needs, return format, pagination, or whether this is limited to the user's own listening history. This is minimal and does not fully convey the tool's 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?

The description is a single sentence with no filler, front-loading the verb and resource. It is concise and efficiently conveys the core purpose.

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 read tool with one optional parameter, the description is adequate but not complete. It omits context about response structure, required Spotify scopes, and the fact that this returns the user's playback history. The lack of an output schema and annotations makes this more significant, but the simplicity of the operation keeps it at a minimum viable level.

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 only parameter 'limit' is fully described in the schema with minimum/maximum values (1-50) and a clear description. Since schema coverage is 100%, the description need not add parameter details; 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?

The description uses the specific verb 'Get' with resource 'recently played tracks' and context 'on Spotify', clearly distinguishing from sibling tools like getNowPlaying (current track) and getTopTracks (top tracks over time). It states exactly what the tool does.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description does not mention any exclusions, prerequisites, or use cases beyond the basic action, so the agent must infer usage from the name and context.

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

getUserPlaylistsC

Get a list of the current user's playlists on Spotify

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of playlists to return (1-50)

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 full burden for behavioral disclosure. While 'Get a list' implies a read-only operation, it doesn't specify authentication requirements, rate limits, pagination behavior, or what data is returned. For a tool that accesses user data, this represents significant gaps in behavioral transparency.

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, clear sentence that efficiently communicates the core purpose without any wasted words. It's appropriately sized for a simple retrieval tool and gets straight to the point.

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 tool with no annotations and no output schema, the description is insufficiently complete. It doesn't explain what information is returned about each playlist, whether authentication is required, how results are structured, or any limitations. Given the lack of structured metadata, the description should provide more contextual information.

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 schema description coverage is 100%, with the single parameter 'limit' fully documented in the schema. The description adds no parameter information beyond what's already in the structured schema, so it meets the baseline expectation but doesn't provide additional semantic context.

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

Purpose4/5

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

The description clearly states the action ('Get a list') and resource ('current user's playlists on Spotify'), making the purpose immediately understandable. However, it doesn't distinguish this tool from similar playlist-related tools like 'getPlaylistTracks' or 'createPlaylist', which would require explicit differentiation to earn a perfect score.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'getPlaylistTracks' (for specific playlist details) and 'createPlaylist' (for creating new playlists), there's no indication of when this general playlist listing tool is appropriate versus those more specialized options.

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

getUserTopItemsC

Get a list of the user's top artists or tracks

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesThe type of items to get top for. Must be "artists" or "tracks"
time_rangeYesThe time range for the top items. Must be "short_term", "medium_term", or "long_term"
limitNoMaximum number of items to return (1-50)
offsetNoThe index of the first item to return. Defaults to 0

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 burden of behavioral disclosure. It mentions 'top artists or tracks' but doesn't explain what 'top' means (e.g., based on listening frequency, popularity, or other metrics), nor does it cover authentication needs, rate limits, or response format. This is inadequate for a tool that likely requires user authentication and returns personal data.

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, efficient sentence that directly states the tool's purpose without any fluff. It's front-loaded with the core action and resource, making it easy to parse quickly. Every word earns its place, achieving optimal conciseness.

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

Completeness2/5

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

Given the lack of annotations and output schema, the description is insufficiently complete. It doesn't explain the behavioral aspects (e.g., authentication, what 'top' means), usage context, or return values. For a tool that likely accesses user-specific data and has multiple parameters, more detail is needed to guide effective agent use.

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 fully documents all parameters (type, time_range, limit, offset). The description adds no additional parameter semantics beyond implying 'top items' relates to the parameters, but it doesn't explain how they interact (e.g., how time_range affects 'top' calculation). This meets the baseline for high schema coverage.

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

Purpose4/5

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

The description clearly states the verb ('Get') and resource ('list of the user's top artists or tracks'), making the purpose immediately understandable. However, it doesn't differentiate this tool from similar sibling tools like 'getRecentlyPlayed' or 'getFollowedArtists' beyond the 'top items' concept, which is why it doesn't reach the highest score.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'getRecentlyPlayed' for recent activity or 'getFollowedArtists' for followed artists, nor does it specify use cases like personalization or analytics. This leaves the agent with minimal context for tool selection.

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

playbackActionC

Perform a playback action (pause, resume, skip to next, skip to previous)

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesThe playback action to perform
deviceIdNoThe Spotify device ID to perform the action on

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 full burden. It states what the tool does (perform actions) but lacks behavioral details: doesn't specify if it requires authentication, affects playback state globally, has rate limits, or what happens on success/failure. 'Perform' implies mutation, but no safety or side-effect information is given.

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, efficient sentence that front-loads the purpose and lists actions. Every word earns its place with no redundancy or fluff. Structure is straightforward and easy to parse.

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 incomplete. It doesn't cover behavioral aspects (auth, side effects), success/failure responses, or usage context. While concise, it lacks necessary context for safe and effective use by an agent.

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 clear parameter descriptions in the schema. The description adds minimal value beyond schema: it lists action options (already in enum) and implies device targeting but doesn't explain parameter interactions or semantics (e.g., deviceId optionality, action effects). Baseline 3 is appropriate as schema does heavy lifting.

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

Purpose4/5

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

The description clearly states the verb ('perform') and resource ('playback action'), listing specific actions (pause, resume, skip to next, skip to previous). It distinguishes from siblings by focusing on playback control rather than queue management, playlist operations, or music playback initiation. However, it doesn't explicitly differentiate from 'playMusic' which might overlap in controlling playback.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'playMusic' (which might start playback) or 'addToQueue' (which modifies queue). It doesn't mention prerequisites (e.g., requires active playback, device selection) or exclusions. Usage is implied through action names but not explicitly stated.

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

playMusicB

Start playing a Spotify track, album, artist, or playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoThe Spotify URI to play (overrides type and id)
typeNoThe type of item to play
idNoThe Spotify ID of the item to play
deviceIdNoThe Spotify 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 must disclose side effects, requirements (like active device), and behavior such as replacing current queue. It only states the action, leaving the agent to guess about deviceId handling, error conditions, or return values.

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, to-the-point sentence. It's efficient but lacks additional context that could aid selection; still, it doesn't waste words.

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 output schema and no annotations, the description fails to convey essential behavioral details such as whether playback starts immediately, what happens without a deviceId, or the response format. Incomplete for a 4-param tool with optional interactions.

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?

All four parameters are fully described in the schema, so the description adds no additional parameter semantics. It doesn't explain how id, uri, and type interrelate or which takes precedence.

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

Purpose5/5

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

The description uses a specific verb ('Start playing') and resource ('Spotify track, album, artist, or playlist'), clearly distinguishing from sibling playback controls like pause and skip. It accurately reflects the tool's function.

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?

No explicit when-to-use or alternative guidance is provided. While the function is intuitive, it doesn't mention exclusions (e.g., when to use resume vs play) or prerequisites.

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

removeTracksFromPlaylistC

Remove tracks from a Spotify playlist

ParametersJSON Schema
NameRequiredDescriptionDefault
playlistIdYesThe Spotify ID of the playlist
trackIdsYesArray 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?

With no annotations provided, the description carries full burden for behavioral disclosure. It states the action ('remove') but doesn't clarify whether this is destructive (permanent removal), requires specific authentication, has rate limits, or what happens on success/failure. For a mutation tool with zero annotation coverage, this is inadequate.

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, efficient sentence that directly states the tool's function without unnecessary words. It's appropriately sized and front-loaded with the core action.

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 insufficient. It doesn't explain what happens after removal (e.g., confirmation, error handling), authentication requirements, or how it differs from related tools. Given the complexity of modifying user data, more context is needed.

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 clear descriptions for both parameters (playlistId and trackIds). The description adds no additional parameter context beyond what the schema already provides, so it meets the baseline score of 3 for high schema coverage.

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

Purpose4/5

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

The description clearly states the action ('remove') and target ('tracks from a Spotify playlist'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'addTracksToPlaylist' or 'playbackAction', which could also involve track manipulation in different contexts.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., user must own or have edit permissions for the playlist), nor does it contrast with sibling tools like 'addTracksToPlaylist' or 'playMusic' that involve track operations.

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

searchSpotifyB

Search Spotify by keyword and field filters (e.g. artist, track, playlist, tag:new, tag:hipster) and return items of the given type

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesFull Spotify search string combining: - free-text keywords (e.g. “remaster”), - field filters: artist:<name>, track:<name>, album:<name>, year:<YYYY> or <YYYY-YYYY>, genre:<name>. The album, artist and year filters can be used for album and track types. The genre filter can only be used for track type. Special filter tag:hipster (bottom 10% popularity) can be used with track and album types. All separated by spaces. Example: "tag:hipster artist:Queen remaster".
typeYesWhich item type to return: track, album or playlist
limitNoMax number of results to return (1-50)
offsetNoThe index of the first item to return. Defaults to 0

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 full burden for behavioral disclosure. It mentions returning items but doesn't describe the response format, pagination behavior, rate limits, authentication requirements, or error conditions. For a search tool with no annotation coverage, this leaves significant gaps in understanding how the tool behaves beyond basic functionality.

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, efficient sentence that communicates the core functionality without unnecessary words. It's appropriately sized for the tool's complexity and front-loads the essential information about searching with filters and returning typed results.

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 tool's moderate complexity (4 parameters, 100% schema coverage, no output schema, no annotations), the description provides basic context but lacks details about response format, error handling, and behavioral constraints. It's adequate as a minimum viable description but has clear gaps in completeness for a search tool that likely returns structured data.

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 parameters thoroughly. The description adds minimal value beyond the schema, mentioning 'keyword and field filters' and 'return items of the given type' which are already covered in the schema's parameter descriptions. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

The description clearly states the tool searches Spotify using keyword and field filters and returns items of a specified type. It specifies the verb 'search' and resource 'Spotify', but doesn't explicitly differentiate from sibling tools like 'getUserPlaylists' or 'getRecentlyPlayed' which also retrieve Spotify content. The purpose is clear but lacks sibling differentiation.

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

Usage Guidelines3/5

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

The description implies usage for searching across multiple content types (tracks, albums, playlists) with flexible filtering, suggesting it's for general discovery rather than retrieving specific user data like 'getUserPlaylists'. However, it doesn't explicitly state when to use this tool versus alternatives or mention any exclusions, leaving some ambiguity about its specific use cases.

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. 13 tool updates
    • First observedaddToQueue
    • First observedaddTracksToPlaylist
    • First observedcreatePlaylist
    • First observedgetFollowedArtists
    • First observedgetNowPlaying
    • First observedgetPlaylistTracks
    • First observedgetRecentlyPlayed
    • First observedgetUserPlaylists
    • First observedgetUserTopItems
    • First observedplaybackAction
    • First observedplayMusic
    • First observedremoveTracksFromPlaylist
    • First observedsearchSpotify

TDQS

B3.4/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have distinct purposes, but 'addToQueue' and 'playMusic' could cause confusion as both involve initiating playback. 'addToQueue' adds to the queue while 'playMusic' starts playback immediately, but an agent might misinterpret their overlap in handling tracks/albums/artists/playlists. Other tools are clearly differentiated by resource and action.

Naming Consistency5/5

All tool names follow a consistent verb_noun or verbNoun pattern, such as 'addToQueue', 'createPlaylist', 'getNowPlaying', and 'searchSpotify'. The naming is uniform across all 13 tools, with no mixing of conventions like camelCase and snake_case, making it predictable and readable.

Tool Count5/5

With 13 tools, this server is well-scoped for Spotify integration, covering core functionalities like playback control, playlist management, user data retrieval, and search. Each tool serves a clear purpose without redundancy, fitting within the typical 3-15 tool range for such a domain.

Completeness4/5

The tool set provides comprehensive coverage for Spotify operations, including CRUD for playlists (create, add/remove tracks, get tracks), playback control (play, queue, actions), and user data (playlists, top items, followed artists, recently played). Minor gaps include no update/delete for playlists or explicit volume control, but agents can work around these with available tools.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers