Spotify MCP Server
Enables music playback control, playlist management, library organization, and personalized music recommendations while providing tools to search for tracks and analyze listening habits.
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 ServerWhat are my top 10 tracks this month?"
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.
๐ต Spotify MCP Server
A Model Context Protocol (MCP) server that integrates Spotify with Claude, enabling voice-controlled music playback, playlist management, and personalized music recommendations directly through conversational AI.
โจ Features
๐ต Playback Control
Get currently playing track with full details
Play specific tracks by name or ID
Pause/resume playback
Skip to next/previous tracks
Adjust volume levels
Toggle shuffle mode
โค๏ธ Library Management
Like/unlike songs
Add tracks to Liked Songs
Remove tracks from Liked Songs
๐ Playlist Operations
Create new playlists
Add tracks to existing playlists
Search and discover music
๐ Discovery & Search
Search for tracks, artists, albums, and playlists
Get personalized recommendations
View top tracks and artists (customizable time ranges)
๐ Analytics
View your most played tracks
See your top artists
Analyze listening habits over different time periods
Related MCP server: Spotify MCP Server
๐ Prerequisites
Node.js v18 or higher
Claude Desktop
Spotify Premium account (required for playback control)
Spotify Developer account
๐ฆ Installation
1. Create Spotify Developer App
Log in with your Spotify account
Click "Create app"
Fill in:
App name:
Claude MCP IntegrationApp description:
MCP server for Claude AIRedirect URI:
http://localhost:3000/callbackโ ๏ธ CRITICAL
Save and note your Client ID and Client Secret
2. Clone and Setup
# Clone the repository
git clone https://github.com/MadhurToshniwal/Spotify-MCP-Server.git
cd Spotify-MCP-Server
# Install dependencies
npm install
# Build the project
npm run build3. Configure Environment Variables
Create a .env file in the project root:
SPOTIFY_CLIENT_ID=your_client_id_here
SPOTIFY_CLIENT_SECRET=your_client_secret_here
SPOTIFY_REFRESH_TOKEN=will_get_this_next4. Authorize Your Spotify Account
Run the OAuth helper script:
npm run authThis will:
Start a local server on port 3000
Open your browser to Spotify's authorization page
After you authorize, display your refresh token
Copy the refresh token and add it to your
.envfile
5. Configure Claude Desktop
Edit your Claude Desktop configuration file:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Add this configuration:
{
"mcpServers": {
"spotify": {
"command": "node",
"args": [
"/absolute/path/to/spotify-mcp-server/dist/index.js"
],
"env": {
"SPOTIFY_CLIENT_ID": "your_client_id",
"SPOTIFY_CLIENT_SECRET": "your_client_secret",
"SPOTIFY_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}Important for Windows users: Use double backslashes in paths:
"args": ["C:\\Users\\YourName\\Desktop\\spotify-mcp-server\\dist\\index.js"]6. Restart Claude Desktop
Completely quit and restart Claude Desktop for changes to take effect.
๐ฎ Usage Examples
Once configured, you can ask Claude:
Playback Control
"What song am I listening to?"
"Pause the music"
"Play the next song"
"Set volume to 70%"
"Turn shuffle on"
Search & Discovery
"Search for songs by The Weeknd"
"Find some jazz playlists"
"Search for the album 'Abbey Road'"
Library Management
"Add this song to my liked songs"
"Unlike this track"
"Create a playlist called 'Workout Mix'"
"Add these 3 songs to my playlist"
Analytics
"What are my top 10 songs this month?"
"Show me my most played artists"
"What have I been listening to recently?"
Advanced
"Search for 'Bohemian Rhapsody' and play it"
"Create a playlist called 'Study Music' and add 5 calm songs"
"Find electronic music playlists and play the most popular one"
๐ ๏ธ Available Tools
Tool | Description |
| Search for tracks, artists, albums, or playlists |
| Get the currently playing track |
| Play a specific track by URI or ID |
| Pause current playback |
| Resume playback |
| Skip to next track |
| Skip to previous track |
| Add track to Liked Songs |
| Remove track from Liked Songs |
| Create a new playlist |
| Add tracks to a playlist |
| Get your top tracks |
| Get your top artists |
| Set playback volume (0-100) |
| Enable/disable shuffle |
๐ Security Notes
Never commit your
.envfile to version controlKeep your Client Secret secure
Refresh tokens are long-lived - store them safely
The server uses OAuth 2.0 with automatic token refresh
๐ API Limits
Spotify Web API rate limits:
Web API calls are rate-limited by Spotify
Most endpoints allow several requests per second
The server handles token refresh automatically
๐ Troubleshooting
"No active device found"
Solution: Open Spotify on your device and play any song to activate a device.
"Invalid refresh token"
Solution: Run npm run auth again to get a new refresh token.
Tools not appearing in Claude
Solution:
Verify the path in
claude_desktop_config.jsonis correctEnsure all environment variables are set
Restart Claude Desktop completely
"Premium required" errors
Solution: Some features (playback control) require Spotify Premium.
๐ Project Structure
spotify-mcp-server/
โโโ src/
โ โโโ index.ts # Main MCP server
โ โโโ get-refresh-token.ts # OAuth helper script
โโโ dist/ # Compiled JavaScript
โโโ .env # Environment variables (not in repo)
โโโ package.json
โโโ tsconfig.json
โโโ README.md๐ Development
# Build the project
npm run build
# Run the OAuth helper
npm run auth
# Run in development
npm start๐งช Technologies Used
TypeScript: Type-safe development
Model Context Protocol (MCP): Claude integration standard
Spotify Web API: Music streaming service API
OAuth 2.0: Secure authentication protocol
Express.js: Web server for OAuth flow
Axios: HTTP client for API requests
๐ License
MIT
๐ค Author
Madhur Toshniwal
๐ง Email: madhurtoshniwal03@gmail.com
๐ Acknowledgments
Spotify for their comprehensive Web API
Anthropic for the Model Context Protocol
Claude Desktop for AI integration
Built to showcase API integration, OAuth implementation, and modern development practices for campus placement interviews.
๐ Learning Outcomes
This project demonstrates:
OAuth 2.0 authentication flow implementation
RESTful API integration and error handling
Secure credential management
Real-time data synchronization
TypeScript for type-safe development
MCP protocol implementation
Asynchronous programming patterns
Available Tools
15 toolsadd_to_playlistC
Add tracks to a playlist
| Name | Required | Description | Default |
|---|---|---|---|
| playlist_id | Yes | Spotify playlist ID | |
| track_uris | Yes | Array of Spotify track URIs to add |
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 states the action ('Add tracks') but doesn't cover critical aspects like required permissions (e.g., user authorization), rate limits, whether the operation is idempotent, or what happens on failure (e.g., partial adds). This leaves significant gaps for safe and effective use.
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 or redundancy. It's front-loaded with the core action, making it easy to parse quickly, which is ideal for 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 complexity of a write operation (adding tracks to a playlist) with no annotations and no output schema, the description is insufficient. It lacks details on behavioral traits (e.g., error handling, side effects), usage context, and expected outcomes, making it incomplete for reliable agent 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 both parameters ('playlist_id' and 'track_uris') clearly documented in the schema. The description adds no additional semantic context beyond implying the parameters are used for adding tracks, so it meets the baseline of 3 without compensating for any schema gaps.
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 ('Add tracks') and the target resource ('to a playlist'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'like_track' or 'play_track' which also involve track manipulation, leaving room for confusion about when to use each.
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., needing a playlist ID from 'create_playlist'), exclusions (e.g., not for removing tracks), or comparisons to siblings like 'like_track' for favoriting versus adding to playlists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_playlistC
Create a new playlist
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Playlist name | |
| description | No | Playlist description (optional) | |
| public | No | Whether the playlist should be public (default: true) |
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. 'Create a new playlist' implies a write operation, but it doesn't disclose any behavioral traits such as permissions required, whether creation is idempotent, rate limits, or what happens on failure. For a mutation tool with zero annotation coverage, this is a significant gap in 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, efficient sentence that directly states the tool's purpose without any fluff. It's front-loaded and appropriately sized for a simple creation tool, with every word earning its place. No unnecessary details or redundancy are present.
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 complexity as a mutation operation with no annotations and no output schema, the description is incomplete. It lacks information on behavioral aspects (e.g., permissions, side effects), usage context, and what to expect upon success or failure. For a tool that creates resources, this leaves critical gaps for an 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 input schema already documents all parameters (name, description, public) with their types, optionality, and default values. The description adds no additional meaning beyond what the schema provides, such as constraints or examples. Baseline score of 3 is appropriate as the schema does the heavy lifting, but the description doesn't compensate or enhance understanding.
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 ('Create') and resource ('a new playlist'), making the purpose immediately understandable. It distinguishes from siblings like 'add_to_playlist' or 'search_music' by focusing on playlist creation rather than modification or querying. However, it doesn't explicitly mention what distinguishes it from all siblings, such as 'like_track' or 'set_volume', though the distinction is implicit through the resource type.
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), when not to use it (e.g., if a playlist already exists), or direct alternatives among siblings. This leaves the agent to infer usage based on the tool name alone, which is insufficient for optimal selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_trackB
Get the currently playing track
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 but lacks behavioral details such as error conditions (e.g., if nothing is playing), authentication requirements, rate limits, or response format. This is a significant gap for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero waste. It's front-loaded and efficiently conveys the core purpose without any extraneous details, making it highly concise and well-structured.
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. It doesn't explain what information is returned (e.g., track details, playback status) or handle edge cases like no active playback. For a tool in a music playback context, this leaves gaps in understanding its full behavior.
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 tool has 0 parameters, and schema description coverage is 100%, so no parameter documentation is needed. The description appropriately doesn't mention parameters, making a baseline score of 4 justified as it doesn't add unnecessary information.
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', making the purpose immediately understandable. It doesn't specifically differentiate from siblings like 'play_track' or 'pause_playback', but the action is distinct enough to avoid confusion.
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. For example, it doesn't clarify if this should be used for checking playback status versus other tools like 'play_track' or 'skip_to_next', leaving the agent to infer usage from context alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_artistsB
Get your top artists
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of artists to return (1-50, default: 10) | |
| time_range | No | Time range (short_term: 4 weeks, medium_term: 6 months, long_term: all time) | medium_term |
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. 'Get your top artists' implies a read-only operation but doesn't specify authentication requirements, rate limits, data freshness, or what 'top' means (e.g., based on listening history). For a tool with no annotation coverage, this leaves significant gaps in understanding its behavior and constraints.
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 with no wasted words. It's front-loaded with the core purpose and appropriately sized for a simple retrieval tool, making it easy to parse quickly.
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 low complexity (2 parameters, no output schema, no annotations), the description is minimally adequate. It states what the tool does but lacks context on usage, behavioral details, or output format. With no output schema, the description doesn't explain return values, leaving the agent to infer or discover them through 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?
The input schema has 100% description coverage, with clear documentation for both parameters (limit and time_range), including defaults and enum values. The description adds no additional parameter semantics beyond what the schema provides, so it meets the baseline of 3 for high schema coverage without compensating value.
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 'Get your top artists' clearly states the verb ('Get') and resource ('your top artists'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_top_tracks' or 'get_current_track', which would require more specific language about what distinguishes 'top artists' from other retrieval 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?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., authentication, user context), compare it to similar tools like 'get_top_tracks' or 'search_music', or indicate scenarios where it's appropriate versus when other tools might be better suited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_tracksC
Get your top tracks
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of tracks to return (1-50, default: 10) | |
| time_range | No | Time range (short_term: 4 weeks, medium_term: 6 months, long_term: all time) | medium_term |
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 states it 'gets' data, implying a read-only operation, but doesn't cover critical aspects like authentication requirements, rate limits, error handling, or what 'top' means (e.g., based on listening history, popularity, or other metrics). This leaves significant gaps for an agent to understand how to invoke it safely and effectively.
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 with no wasted words. It's front-loaded with the core purpose ('Get your top tracks'), making it easy to parse quickly. Every word earns its place by conveying essential information without redundancy.
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 incomplete for a tool that likely involves user-specific data and time-based filtering. It doesn't explain what 'top' means, authentication needs, or the structure of returned data (e.g., track objects with metadata), leaving the agent with insufficient context for reliable 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?
The input schema has 100% description coverage, with clear documentation for both parameters (limit and time_range), including defaults and enum values. The description adds no parameter-specific information beyond what the schema provides, so it meets the baseline for high schema coverage without compensating value.
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 'Get your top tracks' clearly states the verb ('Get') and resource ('your top tracks'), making the basic purpose understandable. However, it doesn't differentiate from sibling tools like 'get_top_artists' or 'get_current_track' beyond the resource name, and 'top tracks' could refer to popularity, personal listening history, or other metrics without clarification.
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 'get_top_artists' for similar data or 'search_music' for broader queries, nor does it specify prerequisites (e.g., user authentication) or exclusions. Usage is implied only by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
like_trackA
Add the current or specified track to your Liked Songs
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | No | Spotify track ID (optional, uses current track if not provided) |
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 states the action ('Add') but doesn't mention whether this requires authentication, if there are rate limits, what happens if the track is already liked, or what the response looks like (e.g., success/failure). For a mutation tool with zero annotation coverage, this leaves significant behavioral gaps.
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 gets straight to the point with no wasted words. It's appropriately sized for a simple tool and front-loads the essential information about what the tool does.
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 (a mutation with one optional parameter), no annotations, and no output schema, the description is minimally adequate. It covers the basic purpose and parameter behavior but lacks details on authentication requirements, error handling, or response format, which would be needed for full completeness in this context.
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 description adds some meaning by explaining that the track_id parameter is optional and defaults to the current track if not provided. However, with 100% schema description coverage (the schema already documents the parameter as optional with the same explanation), this doesn't provide additional value beyond what's in the structured data. The baseline of 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 action ('Add') and resource ('current or specified track to your Liked Songs'), distinguishing it from sibling tools like 'add_to_playlist' (which adds to a specific playlist) and 'unlike_track' (which removes from Liked Songs). It specifies the exact destination ('Liked Songs'), making the purpose unambiguous.
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 clear context for when to use this tool: to add tracks to the Liked Songs collection. It distinguishes from 'add_to_playlist' by specifying the destination, but doesn't explicitly state when NOT to use it or mention alternatives like 'unlike_track' for removal, which would be helpful for complete guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_playbackB
Pause the current playback
| 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 full burden of behavioral disclosure. It states the action ('Pause') but doesn't describe what happens (e.g., stops audio, retains playback position), whether it requires specific permissions, or what the response looks like. For a mutation tool with zero annotation coverage, this is a significant gap in 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, efficient sentence with zero wasted words. It is front-loaded with the core action and target, making it immediately clear. Every word earns its place, and there's no 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?
Given the tool's low complexity (0 parameters, no output schema) and lack of annotations, the description is minimally adequate. It states what the tool does but misses behavioral details like effects, error conditions, or return values. For a simple mutation tool, it meets basic needs but leaves gaps in understanding how it behaves in practice.
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 tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description appropriately doesn't mention parameters, which is correct for this case. A baseline of 4 is applied since no parameter information is needed or expected.
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 ('Pause') and the target ('current playback'), making the purpose immediately understandable. It distinguishes itself from sibling tools like 'resume_playback' by specifying the opposite action. However, it doesn't explicitly mention what 'playback' refers to (e.g., music, video), which prevents 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. It doesn't mention prerequisites (e.g., requires active playback), exclusions (e.g., cannot pause if already paused), or relationships with siblings like 'resume_playback' or 'play_track'. Usage is implied 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.
play_trackC
Play a specific track by its URI or ID
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Spotify URI or ID of the track (e.g., spotify:track:... or just the ID) |
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. It states the action ('Play') but lacks critical behavioral details: it does not specify if this requires an active device, what happens if playback is already ongoing, whether it affects shuffle/queue settings, or what the response looks like. This leaves significant gaps 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, efficient sentence with zero waste. It is front-loaded with the core purpose and appropriately sized for a simple tool, making it easy to parse quickly.
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 complexity of a playback mutation tool with no annotations and no output schema, the description is incomplete. It lacks behavioral context (e.g., device requirements, effects on playback state) and does not compensate for the absence of structured fields, making it inadequate for safe and 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 the 'uri' parameter with examples. The description adds no additional meaning beyond what the schema provides, such as format nuances or edge cases, but the high schema coverage justifies the baseline score of 3.
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 ('Play') and the target resource ('a specific track'), using a specific verb and resource. However, it does not explicitly differentiate from siblings like 'resume_playback' or 'skip_to_next', which also involve playback control, leaving some ambiguity about when this exact tool is preferred.
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 does not mention prerequisites (e.g., needing an active device), exclusions, or comparisons to sibling tools like 'resume_playback' for general playback or 'search_music' for finding tracks first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_playbackB
Resume the current playback
| 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 full burden for behavioral disclosure. It states the action but doesn't reveal any behavioral traits such as whether this requires specific permissions, affects other playback controls, or has side effects like resetting shuffle/volume settings. This is inadequate for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core action and appropriately sized for a simple tool with no parameters, making it perfectly concise and well-structured.
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 (0 params, no output schema) but lack of annotations, the description is incomplete. It doesn't address behavioral aspects like what 'resume' entails (e.g., from pause vs. stop), potential errors, or interaction with sibling tools, leaving gaps for an agent to understand full context.
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 tool has 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description doesn't need to add parameter details, and it correctly implies no parameters are needed, earning a high baseline score for this 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 'Resume the current playback' clearly states the action (resume) and target (current playback), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'pause_playback' or 'play_track' beyond the obvious semantic difference, which keeps it from 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. It doesn't mention prerequisites (e.g., that playback must be paused first) or contrast with similar tools like 'play_track' for starting new playback, leaving 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.
search_musicB
Search for songs, artists, albums, or playlists on Spotify
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query (song name, artist, album, etc.) | |
| type | Yes | Type of item to search for | |
| limit | No | Number of results to return (1-50, default: 10) |
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 but only states the basic function without details on rate limits, authentication needs, response format, or error handling. It mentions searching 'on Spotify', implying external API use, but lacks specifics on constraints or performance traits.
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 ('Search for songs, artists, albums, or playlists on Spotify') directly contributes to understanding the tool's function, making it highly concise and well-structured.
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 (3 parameters, no output schema, no annotations), the description is adequate as a starting point but incomplete. It covers the basic purpose but lacks details on behavioral traits, usage context, and output expectations, which are needed for effective agent operation without structured support.
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 input schema fully documents parameters like 'query', 'type', and 'limit'. The description adds minimal value by listing searchable items ('songs, artists, albums, or playlists'), which loosely maps to the 'type' enum, but doesn't provide additional syntax or format details beyond the schema.
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 ('Search for') and resources ('songs, artists, albums, or playlists') with the platform ('on Spotify'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_top_tracks' or 'play_track', which also involve music retrieval but through different mechanisms.
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. For example, it doesn't mention that this is for general searches, while 'get_top_tracks' might be for personalized recommendations or 'play_track' for immediate playback, leaving the agent to infer usage from context alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_volumeC
Set playback volume
| Name | Required | Description | Default |
|---|---|---|---|
| volume | Yes | Volume level (0-100) |
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 action without disclosing behavioral traits. It doesn't mention effects (e.g., immediate volume change, persistence), permissions needed, rate limits, or error conditions, which are critical for a mutation tool like this.
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 extremely concise at three words, front-loading the core action without any wasted text. Every word earns its place by directly conveying the tool's function, making it efficient 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?
Given this is a mutation tool with no annotations and no output schema, the description is incomplete. It lacks information on what happens after setting volume (e.g., success confirmation, error handling), behavioral context, or integration with sibling tools, leaving significant gaps for agent understanding.
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 100% description coverage, detailing the 'volume' parameter with range and type. The description adds no additional meaning beyond the schema, such as units interpretation or default behavior, so it meets the baseline of 3 where 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 'Set playback volume' clearly states the action (set) and target resource (playback volume), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'pause_playback' or 'resume_playback' in terms of audio control context, though the specific function is distinct.
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. It doesn't mention prerequisites (e.g., active playback), exclusions, or related tools like 'play_track' for starting playback before adjusting volume, leaving usage context implied but unspecified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_to_nextB
Skip to the next track
| 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 full burden but offers minimal behavioral insight. It implies a mutation (skipping changes playback state) but doesn't disclose side effects, permissions needed, or what happens if no track is playing. This leaves significant gaps for a tool that likely modifies system state.
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 with zero wasted words. It's front-loaded with the core action and resource, making it immediately scannable and efficient for an agent 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 insufficient. It doesn't explain behavioral traits like side effects, error conditions, or response format, leaving the agent with critical unknowns about how to properly invoke and interpret results.
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 tool has zero parameters with 100% schema description coverage, so no parameter documentation is needed. The description appropriately doesn't mention parameters, maintaining focus on the tool's action without unnecessary 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 action ('skip to') and target resource ('the next track'), making the purpose immediately understandable. It distinguishes from sibling tools like 'skip_to_previous' by specifying direction, though it doesn't explicitly contrast with other playback controls like 'pause_playback' or 'play_track'.
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 about when to use this tool versus alternatives like 'skip_to_previous' or 'play_track', nor about prerequisites such as requiring active playback. The description only states what it does, not when it's appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_to_previousB
Skip to the previous track
| 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 full burden for behavioral disclosure. It states the action but doesn't mention what happens after skipping (e.g., playback starts automatically, returns to previous track in queue), whether it requires active playback, or any side effects like affecting shuffle/repeat modes.
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 with no wasted words. It's front-loaded with the core action and completely efficient for a zero-parameter tool, making it easy to parse quickly.
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 playback control tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens after skipping, whether it returns confirmation or error states, or how it interacts with other playback controls like 'pause_playback' or 'resume_playback'.
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 tool has zero parameters with 100% schema description coverage, so the schema already fully documents the empty input. The description appropriately doesn't add parameter information, maintaining focus on the tool's purpose without redundancy.
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 ('skip to') and target ('previous track'), making the purpose immediately understandable. It doesn't differentiate from sibling tools like 'skip_to_next' or 'play_track', but the verb+resource combination is specific enough for basic understanding.
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 about when to use this tool versus alternatives like 'skip_to_next', 'play_track', or 'get_current_track'. The description states what it does but offers no context about appropriate scenarios or prerequisites for skipping tracks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle_shuffleC
Turn shuffle on or off
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | True to enable shuffle, false to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only states the basic action without behavioral details. It doesn't disclose if this affects current playback, requires specific permissions, has side effects (e.g., changing queue order), or provides feedback on success/failure, which is inadequate 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, efficient sentence with zero wasted words. It's front-loaded with the core action and states exactly what the tool does, making it highly scannable and appropriate for a simple toggle function.
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 lacks context about effects on playback, error conditions, or return values, leaving significant gaps in understanding how to use it effectively in practice.
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 the single parameter 'state'. The description adds no additional meaning beyond implying a boolean toggle, matching the schema's 'True to enable, false to disable'. 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 ('Turn') and resource ('shuffle') with specific states ('on or off'), making the purpose immediately understandable. It doesn't distinguish from sibling tools like 'play_track' or 'pause_playback', but the verb+resource combination is unambiguous for its domain.
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 about when to use this tool versus alternatives. The description doesn't mention prerequisites (e.g., requires active playback), exclusions, or related tools like 'play_track' that might affect shuffle behavior, leaving usage context implied at best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlike_trackA
Remove the current or specified track from your Liked Songs
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | No | Spotify track ID (optional, uses current track if not provided) |
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 states the action ('Remove') but does not mention permissions needed, whether the change is reversible, error conditions, or rate limits. This is a significant gap for a mutation tool without annotation support.
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 action and resource. There is no wasted language, making it easy to parse and understand immediately.
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 (a mutation with one optional parameter) and lack of annotations or output schema, the description is minimally adequate. It covers the purpose and parameter default but misses behavioral details like error handling or response format, leaving gaps for 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?
The schema description coverage is 100%, so the schema already documents the optional 'track_id' parameter. The description adds value by clarifying the default behavior ('uses current track if not provided'), which enhances understanding beyond the schema's basic description.
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 specific action ('Remove') and resource ('track from your Liked Songs'), distinguishing it from siblings like 'like_track' (which adds) and 'get_current_track' (which reads). It precisely defines the tool's function without redundancy.
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 when removing a liked track, but provides no explicit guidance on when to use it versus alternatives (e.g., 'like_track' for adding, or other playback tools). It lacks context on prerequisites or exclusions, leaving usage inferred rather than stated.
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.
15 tool updates
v1.0.0- First observed
add_to_playlist - First observed
create_playlist - First observed
get_current_track - First observed
get_top_artists - First observed
get_top_tracks - First observed
like_track - First observed
pause_playback - First observed
play_track - First observed
resume_playback - First observed
search_music - First observed
set_volume - First observed
skip_to_next - First observed
skip_to_previous - First observed
toggle_shuffle - First observed
unlike_track
TDQS
Scored across 15 tools
Each tool has a clearly distinct purpose targeting specific Spotify actions like playback control, playlist management, or user data retrieval. No tools overlap in functionality, making it easy for an agent to select the right one without confusion.
All tool names follow a consistent verb_noun pattern using snake_case, such as 'add_to_playlist', 'get_current_track', and 'toggle_shuffle'. This uniformity enhances readability and predictability across the toolset.
With 15 tools, the server is well-scoped for managing Spotify's core features like playback, search, playlists, and user preferences. Each tool serves a clear purpose, and the count aligns with the domain's complexity without being excessive or insufficient.
The toolset covers essential Spotify operations including playback control, search, playlist management, and user interactions like liking tracks. Minor gaps exist, such as missing album-specific actions or detailed playlist editing, but core workflows are well-supported.
Maintenance
Related MCP Connectors
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.
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
Spotify: Spotify Data API for Millions of songs & podcasts, artists, albums, playlists and more.
One workspace of tools for Claude and ChatGPT: connect 600+ apps, generate media, build tools.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceConnects Claude with Spotify to control playback, search music, get track information, and manage the queue through conversation.1-
- FlicenseDqualityDmaintenanceEnables Claude to interact with Spotify by searching songs, creating playlists, getting recommendations, and managing your music through your Spotify account.73-
- AlicenseNot gradedqualityNot gradedmaintenanceConnects Claude to Spotify for music discovery, playlist creation, and collection analysis through natural language. Enables searching songs, analyzing music diversity, creating playlists, and getting recommendations using Spotify's API.-
- FlicenseNot gradedqualityDmaintenanceEnables Claude to control Spotify features including playback control, playlist management, search, and accessing user's listening history and preferences through the Spotify API.1-