Spotify MCP Node Server
Enables control of Spotify playback, playlist management, music search, and retrieval of user listening data including currently playing tracks, recently played songs, followed artists, and top items. Supports creating playlists, adding tracks, and managing playback queue.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Spotify MCP Node Serverplay some upbeat indie rock"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
searchSpotify
Description: Search for tracks, albums, artists, or playlists on Spotify
Parameters:
query(string): The search termtype(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)
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()
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)
getPlaylistTracks
Description: Get a list of tracks in a specific Spotify playlist
Parameters:
playlistId(string): The Spotify ID of the playlistlimit(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")
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 })
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 })
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 })
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 })
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 playdeviceId(string, optional): ID of the device to play on
Returns: Success status
Example:
playMusic({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })Alternative:
playMusic({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })
pausePlayback
Description: Pause the currently playing track on Spotify
Parameters:
deviceId(string, optional): ID of the device to pause
Returns: Success status
Example:
pausePlayback()
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()
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()
createPlaylist
Description: Create a new playlist on Spotify
Parameters:
name(string): Name for the new playlistdescription(string, optional): Description for the playlistpublic(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 })
addTracksToPlaylist
Description: Add tracks to an existing Spotify playlist
Parameters:
playlistId(string): ID of the playlisttrackUris(array): Array of track URIs or IDs to addposition(number, optional): Position to insert tracks
Returns: Success status and snapshot ID
Example:
addTracksToPlaylist({ playlistId: "3cEYpjA9oz9GiPac4AsH4n", trackUris: ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh"] })
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 queuedeviceId(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
Installed Node.js
A Spotify Premium account
A registered Spotify Developer application
MCP Server Installation
git clone https://github.com/igorgarbuz/spotify-mcp.git
cd spotify-mcp
npm install
npm run buildNode.js Installation
Go to Node.js download page
Download an install a recent Node.js version for your platform
Creating a Spotify Developer Application
Go to the Spotify Developer Dashboard
Log in with your Spotify account
Click the "Create an App" button
Fill in the app name and description
Accept the Terms of Service and click "Create"
In your new app's dashboard, you'll see your Client ID
Click "Edit Settings" and add a Redirect URI (e.g.,
http://127.0.0.1:8888/callback)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.jsonThen 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.
Run the authentication script in the directory of the cloned repository:
npm run authThe script will open your browser to the Spotify authorization page.
Log in to Spotify and authorize your application.
After authorization, Spotify will redirect you to your specified redirect URI. The app will automatically handle the code exchange and save your tokens.
The authentication script will automatically exchange this code for the access and refresh tokens.
These tokens will be saved to your
spotify-config.jsonfile.
{
"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
}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.jsVsCode (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:
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.
Added new tools to understand user's taste.
Available Tools
13 toolsaddToQueueA
Adds a track, album, artist or playlist to the playback queue
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | The Spotify URI to play (overrides type and id) | |
| type | No | The type of item to play | |
| id | No | The Spotify ID of the item to play | |
| deviceId | No | The Spotify device ID to add the track to |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | The Spotify ID of the playlist | |
| trackIds | Yes | Array of Spotify track IDs to add | |
| position | No | Position to insert the tracks (0-based index) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the playlist | |
| description | No | The description of the playlist | |
| public | No | Whether the playlist should be public |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | The last artist ID from the previous request. Cursor for pagination. | |
| limit | No | Maximum number of artists to return (1-50) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | The Spotify ID of the playlist | |
| limit | No | Maximum number of tracks to return (1-50) | |
| offset | No | The index of the first item to return. Defaults to 0 |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tracks to return (1-50) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of playlists to return (1-50) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The type of items to get top for. Must be "artists" or "tracks" | |
| time_range | Yes | The time range for the top items. Must be "short_term", "medium_term", or "long_term" | |
| limit | No | Maximum number of items to return (1-50) | |
| offset | No | The index of the first item to return. Defaults to 0 |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The playback action to perform | |
| deviceId | No | The Spotify device ID to perform the action on |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | The Spotify URI to play (overrides type and id) | |
| type | No | The type of item to play | |
| id | No | The Spotify ID of the item to play | |
| deviceId | No | The Spotify device ID to play on |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | The Spotify ID of the playlist | |
| trackIds | Yes | Array of Spotify track IDs to remove |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Full 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". | |
| type | Yes | Which item type to return: track, album or playlist | |
| limit | No | Max number of results to return (1-50) | |
| offset | No | The index of the first item to return. Defaults to 0 |
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
- First observed
addToQueue - First observed
addTracksToPlaylist - First observed
createPlaylist - First observed
getFollowedArtists - First observed
getNowPlaying - First observed
getPlaylistTracks - First observed
getRecentlyPlayed - First observed
getUserPlaylists - First observed
getUserTopItems - First observed
playbackAction - First observed
playMusic - First observed
removeTracksFromPlaylist - First observed
searchSpotify
TDQS
Scored across 13 tools
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.
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.
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.
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
Related MCP Connectors
Full Spotify Web API coverage - albums, artists, playlists, player controls, and more.
Spotify: Spotify Data API for Millions of songs & podcasts, artists, albums, playlists and more.
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
Control your Tesla from your AI assistant - climate, charging, access, and security.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI assistants to control Spotify playback, search for music, manage playlists, and interact with your Spotify library through natural language commands.19-
- FlicenseAqualityDmaintenanceEnables 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-
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Spotify playback, search music, manage playlists and library, and access user listening insights via the Spotify Web API.-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search Spotify, inspect playback state, manage devices, and control music through the official Spotify Web API using OAuth authentication.2MIT