MCP Claude Spotify
This server lets Claude authenticate with Spotify, search music, control playback, manage playlists, get recommendations, and view top tracks.
Authenticate with Spotify.
Search for tracks, albums, artists, or playlists.
Get current playback state and control playback (play, pause, next, previous).
List user playlists and create new playlists.
Add tracks to playlists.
Get track recommendations based on seed genres, tracks, or artists.
Get user's top played tracks over short, medium, or long term.
Allows interaction with Spotify, providing tools for music playback control, searching for tracks/albums/artists/playlists, creating and managing playlists, and getting personalized music recommendations.
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., "@MCP Claude Spotifyplay my Discover Weekly playlist"
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.
MCP Claude Spotify
Removed in 0.6.0 —
get-recommendations. Spotify deprecated/v1/recommendationson 27 November 2024, along with related-artists, audio-features, audio-analysis, featured-playlists and 30-second preview URLs. Apps created after that date get403 Forbidden, and apps still in development mode lost access too, so the tool could not work for essentially anyone. Usesearch-spotifyandget-top-tracksinstead. See Spotify's announcement.
Features
Spotify authentication
Search for tracks, albums, artists, and playlists
Playback control (play, pause, next, previous)
Full playlist management (create, update, delete, reorder tracks, manage cover images)
Read your top tracks and listening history
Access user's top played tracks over different time periods
View recently played tracks
Related MCP server: Spotify MCP Server
Demo
Requirements
Node.js 20 or higher
Spotify account
Claude Desktop
Spotify API credentials (Client ID and Client Secret)
Installation
Installing via Smithery
To install MCP Claude Spotify for Claude Desktop automatically via Smithery:
npx -y @smithery/cli@latest mcp add imprvhub/mcp-claude-spotify --client claudeInstalling Manually
Clone or download this repository:
git clone https://github.com/imprvhub/mcp-claude-spotify
cd claude-spotify-mcpInstall dependencies:
npm installBuild the project (if you want to modify the source code):
npm run buildThe repository already includes pre-built files in the build directory, so you can skip step 3 if you don't plan to modify the source code.
Setting up Spotify Credentials
To use this MCP, you need to obtain Spotify API credentials:
Log in with your Spotify account
Click "Create App"
Fill in your app information:
App name: "MCP Claude Spotify" (or whatever you prefer)
App description: "Spotify integration for Claude Desktop"
Website: You can leave this blank or put any URL
Redirect URI: Important - Add
http://127.0.0.1:8888/callback
Accept the terms and conditions and click "Create"
In your app dashboard, you'll see the "Client ID"
Click "Show Client Secret" to reveal your "Client Secret"
Save these credentials as you'll need them for configuration.
Running the MCP Server
There are two ways to run the MCP server:
Option 1: Authorize once from a terminal (first-time setup)
Claude Desktop starts its own copy of the server, so a server left running in a terminal is
not the one Claude talks to. What a terminal run is useful for is authorizing once: with
SPOTIFY_AUTO_AUTH=true and no stored tokens, the server opens the Spotify login in your
browser as soon as it starts.
SPOTIFY_CLIENT_ID=your_client_id \
SPOTIFY_CLIENT_SECRET=your_client_secret \
SPOTIFY_AUTO_AUTH=true \
node build/index.jsApprove the request in the browser. Once the terminal prints "Authorization complete",
stop the process with Ctrl+C. The token is saved to ~/.spotify-mcp/tokens.json, and the
copy Claude Desktop starts will pick it up.
You can skip this step entirely and ask Claude to "authenticate with Spotify" instead, which
runs the auth-spotify tool and opens the same login page.
Option 2: Auto-starting with Claude Desktop (recommended for regular use)
The Claude Desktop can automatically start the MCP server when needed. To set this up:
Configuration
The Claude Desktop configuration file is located at:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Edit this file to add the Spotify MCP configuration. If the file doesn't exist, create it:
{
"mcpServers": {
"spotify": {
"command": "node",
"args": ["ABSOLUTE_PATH_TO_DIRECTORY/mcp-claude-spotify/build/index.js"],
"env": {
"SPOTIFY_CLIENT_ID": "your_client_id_here",
"SPOTIFY_CLIENT_SECRET": "your_client_secret_here"
}
}
}
}Important: Replace:
ABSOLUTE_PATH_TO_DIRECTORYwith the complete absolute path where you installed the MCPmacOS/Linux example:
/Users/username/mcp-claude-spotifyWindows example:
C:\\Users\\username\\mcp-claude-spotify
your_client_id_herewith the Client ID you obtained from Spotifyyour_client_secret_herewith the Client Secret you obtained from Spotify
If you already have other MCPs configured, simply add the "spotify" section inside the "mcpServers" object.
Setting up auto-start scripts (Optional)
For a more reliable experience, you can set up auto-start scripts:
Create a file named
start-spotify-mcp.batin the project directory with the following content:
@echo off
cd %~dp0
node build/index.jsCreate a shortcut to this BAT file
Press
Win+R, typeshell:startupand press EnterMove the shortcut to this folder to have it start with Windows
Create a file named
com.spotify.mcp.plistin~/Library/LaunchAgents/with the following content:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.spotify.mcp</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>ABSOLUTE_PATH_TO_DIRECTORY/mcp-claude-spotify/build/index.js</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/spotify-mcp.err</string>
<key>StandardOutPath</key>
<string>/tmp/spotify-mcp.out</string>
<key>EnvironmentVariables</key>
<dict>
<key>SPOTIFY_CLIENT_ID</key>
<string>your_client_id_here</string>
<key>SPOTIFY_CLIENT_SECRET</key>
<string>your_client_secret_here</string>
</dict>
</dict>
</plist>Replace the path and credentials with your actual values
Load the agent with:
launchctl load ~/Library/LaunchAgents/com.spotify.mcp.plist
Create a file named
spotify-mcp.servicein~/.config/systemd/user/(create the directory if it doesn't exist):
[Unit]
Description=Spotify MCP Server for Claude Desktop
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/node ABSOLUTE_PATH_TO_DIRECTORY/mcp-claude-spotify/build/index.js
Restart=on-failure
Environment="SPOTIFY_CLIENT_ID=your_client_id_here"
Environment="SPOTIFY_CLIENT_SECRET=your_client_secret_here"
[Install]
WantedBy=default.targetReplace the path and credentials with your actual values
Enable and start the service:
systemctl --user enable spotify-mcp.service
systemctl --user start spotify-mcp.serviceCheck status with:
systemctl --user status spotify-mcp.serviceDevelopment
npm install
npm run build
npm testUsage
Restart Claude Desktop after modifying the configuration
In Claude, use the
auth-spotifycommand to start the authentication processA browser window will open for you to authorize the application
Log in with your Spotify account and authorize the application
Important: After successful authentication, restart Claude Desktop to properly initialize the MCP's tool registry and WebSocket session token cache
After restarting, all Spotify MCP tools will be properly registered and available for use
The MCP server runs as a child process managed by Claude Desktop. When Claude is running, it automatically starts and manages the Node.js server process based on the configuration in claude_desktop_config.json.
Security notes
Authorization is CSRF-protected. The login URL carries a random
statevalue that the callback verifies before exchanging a code. Versions before 0.6.0 sent nostate, so any page open in your browser could hit the loopback callback and bind a different Spotify account.The token file is owner-only.
~/.spotify-mcp/tokens.jsonholds a long-lived refresh token and is now written mode600in a700directory. It was previously created with the default mode, leaving it readable by every account on the machine.Nothing is killed to free the port. If port 8888 is busy the server reports it and stops. Earlier versions ran
lsof -i:8888 -t | xargs kill -9(and ataskkillequivalent on Windows), SIGKILLing whatever unrelated process held that very common development port.IDs in tool arguments are validated. Track, playlist and device IDs go into API paths and query strings, so only plain Spotify IDs are accepted; anything else is rejected before a request is built.
The callback listens on loopback only (
127.0.0.1). The previous express listener bound every network interface, so anyone on the same network could reach/loginand/callback. Containers can widen it withAUTH_BIND_HOST=0.0.0.0.The callback server shuts down once authorization completes, rather than staying bound for the rest of the session.
Available Tools
Authentication
auth-spotify
Initiates the Spotify authentication process.
Search
search-spotify
Searches for tracks, albums, artists, or playlists.
Parameters:
query: Search texttype: Type of search (track, album, artist, playlist)limit: Number of results (1-10, default: 5)
Playback Control
get-current-playback
Gets information about the current playback state.
play-track
Plays a specific track on an active device.
Parameters:
trackId: Spotify track IDdeviceId: (Optional) Spotify device ID to play on
pause-playback
Pauses the current playback.
next-track
Skips to the next track.
previous-track
Returns to the previous track.
Playlist Management
get-user-playlists
Gets a list of the user's playlists.
Parameters:
limit: (Optional) Number of playlists to return (1-50, default: 20)offset: (Optional) Index of the first playlist to return (default: 0)
create-playlist
Creates a new playlist for the current user.
Parameters:
name: Playlist namedescription: (Optional) Descriptionpublic: (Optional) Whether it's public or private
update-playlist
Updates a playlist's name, description, public/private status, or collaborative setting.
Parameters:
playlistId: Spotify ID of the playlistname: (Optional) New name for the playlistdescription: (Optional) New description for the playlistpublic: (Optional) Whether the playlist should be publiccollaborative: (Optional) Whether the playlist should be collaborative (must set public to false first)
delete-playlist
Unfollows (removes) a playlist from your library. The playlist still exists on Spotify but is no longer in your library.
Parameters:
playlistId: Spotify ID of the playlist
get-playlist-tracks
Gets the tracks in a playlist with pagination support.
Parameters:
playlistId: Spotify ID of the playlistlimit: (Optional) Number of tracks to return (1-50, default: 20)offset: (Optional) Index of the first track to return (default: 0)
add-tracks-to-playlist
Adds tracks to a playlist.
Parameters:
playlistId: Playlist IDtrackIds: Array of track IDs
remove-tracks-from-playlist
Removes tracks from a playlist.
Parameters:
playlistId: Spotify ID of the playlisttrackIds: Array of Spotify track IDs to remove
reorder-playlist-tracks
Reorders tracks in a playlist by moving a range of tracks to a new position.
Parameters:
playlistId: Spotify ID of the playlistrangeStart: Position of the first track to moveinsertBefore: Position where the tracks should be insertedrangeLength: (Optional) Number of tracks to move (default: 1)
get-playlist-cover
Gets the cover image of a playlist.
Parameters:
playlistId: Spotify ID of the playlist
upload-playlist-cover
Uploads a custom cover image for a playlist (base64 encoded JPEG, max 256KB).
Parameters:
playlistId: Spotify ID of the playlistimageBase64: Base64 encoded JPEG image
Discovery & History
get-top-tracks
Gets the user's most played tracks over a specified time range.
Parameters:
limit: (Optional) Number of tracks to return (1-50, default: 20)offset: (Optional) Index of the first track to return (default: 0)time_range: (Optional) Time frame for calculating affinity:short_term: Approximately last 4 weeksmedium_term: Approximately last 6 months (default)long_term: Several years of data
get-recently-played
Gets the user's recently played tracks.
Parameters:
limit: (Optional) Maximum number of tracks to return (1-50, default: 20)before: (Optional) Unix timestamp in milliseconds. Returns tracks played before this timeafter: (Optional) Unix timestamp in milliseconds. Returns tracks played after this time
Troubleshooting
"Server disconnected" error
If you see the error "MCP Spotify: Server disconnected" in Claude Desktop:
Verify the server is running:
Open a terminal and manually run
node build/index.jsfrom the project directoryIf the server starts successfully, use Claude while keeping this terminal open
Check your configuration:
Ensure the absolute path in
claude_desktop_config.jsonis correct for your systemDouble-check that you've used double backslashes (
\\) for Windows pathsVerify you're using the complete path from the root of your filesystem
Try the auto-start option:
Set up the auto-start script for your operating system as described in the "Setting up auto-start scripts" section
This ensures the server is always running when you need it
Browser doesn't open automatically
If the browser doesn't open automatically during authentication, manually visit:
http://127.0.0.1:8888/login
Authentication error
Make sure you've correctly configured the redirect URI in your Spotify Developer dashboard:
http://127.0.0.1:8888/callback
Server startup error
Verify that:
Environment variables are correctly configured in your
claude_desktop_config.jsonor launch scriptNode.js is installed and compatible (v16+)
Required ports (8888) are available and not blocked by firewall
You have permission to run the script in the specified location
Tools not appearing in Claude
If the Spotify tools don't appear in Claude after authentication:
Make sure you've restarted Claude Desktop after successful authentication
Check the Claude Desktop logs for any MCP communication errors
Ensure the MCP server process is running (run it manually to confirm)
Verify that the MCP server is correctly registered in the Claude Desktop MCP registry
Checking if the server is running
To check if the server is running:
Windows: Open Task Manager, go to the "Details" tab, and look for "node.exe"
macOS/Linux: Open Terminal and run
ps aux | grep node
If you don't see the server running, start it manually or use the auto-start method.
Testing
This project includes automated tests to ensure code quality and functionality. The test suite uses Jest with TypeScript support and covers:
Zod schema validation - verifies all input schemas correctly validate data
Spotify API interactions - tests API request handling and error handling
MCP server functionality - ensures proper registration and execution of tools
Running Tests
First, make sure all development dependencies are installed:
npm installTo run all tests:
npm testTo run a specific test file:
npm test -- --testMatch="**/tests/schemas.test.ts"If you encounter issues with ESM modules, make sure you're using Node.js v16 or higher and that the NODE_OPTIONS environment variable includes the --experimental-vm-modules flag as configured in the package.json.
Test Structure
tests/schemas.test.ts: Tests for input validation schemastests/spotify-api.test.ts: Tests for Spotify API interactionstests/server.test.ts: Tests for MCP server functionality
Adding New Tests
When adding new functionality, please include corresponding tests:
For new schemas, add validation tests in
schemas.test.tsFor Spotify API functions, add tests in
spotify-api.test.tsFor MCP tools, add tests in
server.test.ts
All tests should be written using Jest and the ESM module format with TypeScript.
Security Notes
Never share your Client ID and Client Secret
Access token is now stored in the user's home directory at
~/.spotify-mcp/tokens.jsonto enable persistence between sessions and multiple instancesNo user data is stored on disk
Revoking Application Access
For security reasons, you may want to revoke the application's access to your Spotify account when:
You no longer use this integration
You suspect unauthorized access
You're troubleshooting authentication issues
To revoke access:
Go to your Spotify Account page
Navigate to "Apps" in the menu
Find "MCP Claude Spotify" (or the name you chose for your app)
Click "REMOVE ACCESS"
This immediately invalidates all access and refresh tokens. The next time you use the auth-spotify command, you'll need to authorize the application again.
Contributing
Contributions are welcome! Here are some guidelines to follow:
Development Workflow
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes
Run tests to ensure they pass (
npm test)Commit your changes (
git commit -m 'Add some amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
Code Style Guidelines
This project follows these coding standards:
Use TypeScript with strict type checking
Follow ESM module format
Use 2 spaces for indentation
Use camelCase for variables and functions
Use PascalCase for classes and interfaces
Document functions with JSDoc comments
Keep line length under 100 characters
Project Structure
The project follows this structure:
mcp-claude-spotify/
├── src/ # Source code
├── build/ # Compiled JavaScript
├── tests/ # Test files
├── public/ # Public assets
└── ...Pull Request Process
Ensure your code follows the style guidelines
Update documentation if needed
Add tests for new functionality
Make sure all tests pass
Your PR will be reviewed by maintainers
Related Links
License
This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.
Available Tools
19 toolsadd-tracks-to-playlistC
Add tracks to a playlist
| Name | Required | Description | Default |
|---|---|---|---|
| trackIds | Yes | Array of Spotify track IDs to add | |
| playlistId | Yes | Spotify ID of the playlist |
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 action. It doesn't mention whether this requires specific permissions (e.g., user authorization), rate limits, how duplicates are handled, or what happens on failure, which are critical 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 extremely concise with a single, direct sentence that front-loads the core action. There is no wasted language, making it efficient and easy to parse, though this brevity contributes to gaps in other dimensions.
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 or output schema, the description is insufficient. It lacks details on behavioral traits, error handling, return values, and integration with sibling tools, leaving significant gaps for 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?
The schema description coverage is 100%, with clear documentation for both parameters (playlistId and trackIds). The description adds no additional meaning beyond what the schema already provides, such as format examples or constraints, so it meets the baseline for adequate but unenhanced parameter 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 ('Add') and resource ('tracks to a playlist'), making the tool's function immediately understandable. However, it doesn't differentiate from potential sibling operations like 'create-playlist' or 'play-track', which would require more specificity for 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 like 'create-playlist' for new playlists or 'play-track' for immediate playback. It lacks context about prerequisites (e.g., needing an existing playlist) or exclusions, leaving usage unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth-spotifyC
Authenticate with Spotify
| 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. 'Authenticate with Spotify' implies a state-changing operation (likely obtaining or refreshing tokens), but it doesn't disclose behavioral traits like whether it's interactive, requires user input, stores credentials, has side effects, or handles errors. This leaves critical gaps for an agent to understand how to invoke it safely.
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 with just three words, front-loading the core action ('Authenticate') and target ('Spotify'). There's zero waste or redundancy, 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 authentication (often involving tokens, scopes, or user interaction), no annotations, no output schema, and sibling tools that likely depend on auth, the description is incomplete. It doesn't explain what authentication entails, what it returns, or how it integrates with other tools, leaving significant 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 input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add parameter details, which is appropriate here. A baseline of 4 is given since the schema fully covers the absence of parameters, and the description doesn't need to compensate.
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 'Authenticate with Spotify' states the general purpose (authentication) and target service (Spotify), but it's vague about what authentication means in this context. It doesn't specify whether this initiates OAuth flow, validates existing tokens, or manages credentials, nor does it distinguish from other authentication-related operations that might exist.
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 authentication before using other Spotify tools), timing considerations, or whether it's required for sibling tools like 'add-tracks-to-playlist' or 'search-spotify'. Without this, an agent might misuse it.
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 for the current user
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the playlist | |
| public | No | Whether the playlist should be public (default: false) | |
| description | No | Description of the playlist (optional) |
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 creates a playlist but doesn't cover critical aspects like authentication requirements, rate limits, whether it returns the created playlist ID, or error conditions. 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 that directly states the tool's purpose without unnecessary words. It's front-loaded with the core action and resource, 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 complexity (a write operation with no annotations and no output schema), the description is insufficient. It doesn't explain what happens after creation (e.g., returns a playlist ID), authentication needs, or how it fits into workflows with sibling tools. For a mutation tool in this context, more completeness 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?
The schema description coverage is 100%, with clear descriptions for all parameters (name, description, public). The description adds no additional parameter semantics beyond what's in the schema, such as explaining format constraints or default behaviors. Baseline 3 is appropriate since the schema adequately documents parameters.
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 resource ('new playlist for the current user'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'get-user-playlists' or 'add-tracks-to-playlist', which would require mentioning this is specifically for creation rather than retrieval or modification.
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 via 'auth-spotify'), when not to use it (e.g., for updating existing playlists), or how it relates to siblings like 'add-tracks-to-playlist' for populating playlists after creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-playlistA
Unfollow a playlist (removes it from your library, but the playlist still exists on Spotify)
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | Spotify ID of the playlist to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key non-obvious trait: this is a non-destructive unfollow, not a true deletion, so the playlist survives on Spotify. It does not mention idempotency, auth requirements, or what happens when the playlist is already unfollowed.
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?
One sentence, front-loaded with the actual operation, with the parenthetical immediately defusing the destructive connotation of the tool name. Nothing is wasted.
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 one-parameter, no-output-schema mutation tool, the behavioral clarification is the main thing an agent needs, and it is present. Missing only auth/prerequisite context, which is minor given a dedicated auth-spotify sibling.
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 coverage is 100% and the single parameter playlistId is already documented in the schema, so the description adds no parameter-level meaning. Baseline 3 is appropriate when the schema does this work.
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 states a specific verb (unfollow) and resource (playlist), and crucially corrects the misleading 'delete' in the tool name by clarifying the playlist is not destroyed. An agent can distinguish this from update-playlist, create-playlist, and remove-tracks-from-playlist without opening any schema.
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?
Usage is implied: use this to remove a playlist from the user's library while leaving it on Spotify. There is no explicit when-to-use, prerequisite (e.g. authentication via auth-spotify), or statement of alternatives such as update-playlist for renaming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-current-playbackB
Get information about the user's current playback state
| 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 it retrieves information (implying read-only), but doesn't specify what data is returned (e.g., track details, device info, playback status), potential errors (e.g., no active playback), or authentication requirements (implied by 'user's' but not explicit). This is inadequate for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
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 front-loaded with the core purpose, 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 no annotations and no output schema, the description is incomplete. It doesn't explain what 'information' is returned (e.g., JSON structure, fields like track name or progress), behavioral aspects like error handling, or how it integrates with sibling tools. For a tool that likely returns complex playback state data, this leaves significant gaps.
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 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, earning a baseline high score since it doesn't need to compensate for 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 tool's purpose with a specific verb ('Get') and resource ('information about the user's current playback state'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'pause-playback' or 'play-track', which are related to playback control rather than state retrieval.
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, or how it differs from other playback-related tools in the sibling list, 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.
get-playlist-coverC
Get the cover image of a playlist
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | Spotify ID of the playlist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does not say what is actually returned (image URL, binary bytes, base64, size variants), whether authentication is required, or how a missing cover is handled — significant gaps for a tool whose whole purpose is retrieving an asset.
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 short sentence with no filler, and the core purpose is front-loaded. It is efficient, though perhaps too terse to earn a top score given the missing return-value information.
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 should clarify the return shape for an image-fetching tool, but it does not. An agent cannot tell whether it receives a URL, raw image data, or metadata, nor what happens if no cover is set.
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 'playlistId' documented as the Spotify ID of the playlist. The description adds no format, ID-source, or validity information beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (playlist cover image), so the agent knows exactly what is fetched. However, it does not distinguish itself from the sibling 'upload-playlist-cover', which operates on the same resource in the opposite direction.
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?
There is no guidance on when to use this versus alternatives such as 'get-playlist-tracks' or 'upload-playlist-cover'. The read-only nature is only implied by the verb 'get', and no preconditions (e.g., playlist must exist or be public) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-playlist-tracksC
Get the tracks in a playlist
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tracks to return (1-50, default: 20) | |
| offset | No | The index of the first track to return (default: 0) | |
| playlistId | Yes | Spotify ID of the playlist |
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. 'Get' implies a read, but nothing is said about pagination behavior, authentication requirements (Spotify endpoints require auth), or what happens when the playlist is empty or the ID is invalid.
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 front-loaded sentence with zero filler, which is appropriate for the operation. It is efficient but arguably too terse given the tool's pagination surface.
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 3-parameter tool with no annotations and no output schema, the description is thin. It omits any mention of paginated returns or auth needs, leaving gaps that structured fields do not cover.
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 limit, offset, and playlistId all documented in the schema itself, so the baseline of 3 applies. The description adds no syntax, format, or ordering detail beyond what the schema already conveys.
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?
States a clear verb ('Get') and resource ('tracks in a playlist'), so an agent immediately knows the operation. However, it offers no differentiation from siblings like get-user-playlists, get-top-tracks, or search-spotify, which all retrieve track-like resources.
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 on when to use this tool versus alternatives such as get-user-playlists or search-spotify, and no mention of prerequisites (e.g., that a playlist ID must be known beforehand). The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-recently-playedC
Get the user's recently played tracks
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Unix timestamp in ms. Returns tracks played after this time (optional) | |
| limit | No | Maximum number of tracks to return (1-50, default: 20) | |
| before | No | Unix timestamp in ms. Returns tracks played before this time (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and it does not deliver: it never says this is a read-only operation, that it requires user authorization, that it reflects a rolling time window, or what the response contains. This is a significant gap for a user-data read 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?
A single short sentence, front-loaded with no filler or repetition of the schema. It is efficient, though its brevity shades into under-specification rather than tightness.
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 annotations and no output schema, the description is the only place behavioral and return-value context could live, and it supplies neither. An agent cannot tell from this definition what it receives back or under what auth/rate conditions the call succeeds.
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 after/before/limit fully documented in the schema, so the baseline of 3 applies. The description adds no syntax, defaults, or interaction detail (e.g., that after/before and limit combine) beyond what the schema already states.
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 states a specific verb ('Get') and resource ('recently played tracks') scoped to the user, which is clear on its own. However, it offers no differentiation from near-neighbor siblings such as get-current-playback or get-top-tracks, leaving the agent to infer the 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?
There is no statement of when to use this tool versus alternatives, nor any prerequisites such as needing an authenticated user session. The agent gets a purpose but no routing guidance among the many playback/playlist siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-top-tracksB
Get the user's top played tracks over a specified time range
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The number of tracks to return (1-50, default: 20) | |
| offset | No | The index of the first track to return (default: 0) | |
| time_range | No | Over what time frame the affinities are computed. short_term = ~4 weeks, medium_term = ~6 months, long_term = several years (default: medium_term) |
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 it indicates this is a read operation ('Get'), it doesn't mention authentication requirements (implied by sibling 'auth-spotify'), rate limits, data freshness, or what happens when parameters are out of bounds. For a tool accessing personal data with 3 parameters, this leaves significant behavioral gaps unaddressed.
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 element ('Get', 'user's top played tracks', 'over a specified time range') contributes directly to understanding the tool's function with zero waste or 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 3 parameters with full schema coverage but no annotations and no output schema, the description is minimally adequate. It covers the basic purpose but lacks important context about authentication, rate limits, return format, and how this tool fits within the broader Spotify API ecosystem represented by the sibling tools. For a personal data retrieval tool, more behavioral context would be beneficial.
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%, providing complete documentation for all 3 parameters. The description adds minimal value beyond the schema by mentioning 'time range' generally, but doesn't provide additional context about parameter interactions, typical values, or semantic meaning beyond what's already in the parameter descriptions. 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') and resource ('user's top played tracks') with a specific scope ('over a specified time range'). It distinguishes from siblings like 'search-spotify' or 'get-recommendations' by focusing on personal listening history rather than general search or algorithmic recommendations. However, it doesn't explicitly differentiate from all siblings (e.g., 'get-current-playback' also retrieves track data).
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 needing personal listening statistics over time, but provides no explicit guidance on when to use this versus alternatives like 'search-spotify' for general track discovery or 'get-recommendations' for algorithmic suggestions. It mentions the time range parameter but doesn't explain typical use cases for different time ranges or when this tool is preferred over other track-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-user-playlistsC
Get a list of the user's playlists
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of playlists to return (1-50, default: 20) | |
| offset | No | The index of the first playlist to return (default: 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read (no mutation verbs), but discloses nothing about auth requirements, whether it returns only the current user's playlists, pagination behavior, or how results are ordered.
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 short sentence with no filler, front-loaded with the verb and resource. It is efficient, though it is arguably too terse to earn a 5.
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 two-optional-parameter read tool with a fully documented schema and no output schema, the description is minimally adequate. It is missing ownership scope and auth context, but nothing in the schema is left unexplained.
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% (limit with range/default, offset with default), so the schema already documents both parameters fully. The description adds no syntax or format detail beyond that, which is the baseline 3 case.
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 states a specific verb ('Get') and resource ('a list of the user's playlists'), which is unambiguous against siblings like get-playlist-tracks or get-top-tracks. It does not explicitly name or differentiate itself from those nearby siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as get-playlist-tracks or get-top-tracks, nor any stated preconditions (e.g. authentication, whose playlists). Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next-trackB
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 only states the action without behavioral details. It doesn't disclose if this requires authentication, affects playback state, has rate limits, or what happens on success/failure (e.g., skips in current queue or playlist). 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 waste—'Skip to the next track' is front-loaded and perfectly concise. Every word earns its place, 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 (a mutation tool with no annotations or output schema), the description is incomplete. It lacks context on authentication needs, playback requirements, error conditions, or return values. For a tool that likely interacts with active playback, this leaves critical gaps for an AI agent to use it correctly.
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 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add param info, which is appropriate here. Baseline is 4 for zero parameters, as there's nothing to compensate for and no 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 'Skip to the next track' clearly states the action (skip) and resource (track), making the purpose immediately understandable. It distinguishes from siblings like 'previous-track' by directionality, though not explicitly named. However, it doesn't specify if this applies to current playback or a playlist context, leaving some ambiguity compared to more specific alternatives.
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., requires active playback), exclusions (e.g., not usable without a queue), or sibling tools like 'play-track' or 'get-current-playback' for context. The agent must infer usage from the tool name alone.
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 user's 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 mention side effects (e.g., whether playback can be resumed, if it requires specific permissions, or error conditions like no active playback). 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 no wasted words. It's appropriately sized for a simple tool and front-loads the essential action, 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 mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens after pausing, potential errors, or return values, leaving the agent with incomplete operational 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 zero parameters with 100% schema description coverage, so the schema already fully documents the lack of inputs. The description appropriately doesn't add unnecessary parameter information, maintaining a clean baseline for parameterless tools.
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 target ('the user's playback'), providing a specific verb+resource combination. However, it doesn't differentiate from sibling tools like 'play-track' or 'get-current-playback' beyond the obvious pause vs play distinction, 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?
No guidance is provided on when to use this tool versus alternatives like 'play-track' or 'next-track', nor does it mention prerequisites such as requiring active playback. The description only states what it does without contextual usage information.
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 on an active device
| Name | Required | Description | Default |
|---|---|---|---|
| trackId | Yes | Spotify ID of the track to play | |
| deviceId | No | Spotify ID of the device to play on (optional) |
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 playing on an 'active device' but doesn't explain what happens if no device is active, whether this requires specific permissions (e.g., Spotify Premium), if it interrupts current playback, 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 that directly states the tool's function without unnecessary words. It's front-loaded with the core action ('Play a specific track'), making it easy to grasp quickly. Every part of the sentence earns its place by specifying the resource and context.
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 (a mutation operation with no annotations and no output schema), the description is incomplete. It doesn't address key contextual aspects like error conditions (e.g., invalid track ID, no active device), behavioral outcomes (e.g., playback state changes), or integration with sibling tools (e.g., using 'get-current-playback' first). For a tool that modifies system state, more detail is needed to guide 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?
The description adds no parameter-specific information beyond what the input schema provides, which has 100% coverage with clear descriptions for both 'deviceId' (optional Spotify ID) and 'trackId' (required Spotify ID). Since the schema fully documents parameters, the baseline score of 3 is appropriate, as the description doesn't enhance or clarify semantics further.
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 resource ('a specific track on an active device'), making the tool's purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'next-track' or 'previous-track', which also control playback, nor does it clarify what constitutes an 'active device' versus using 'get-current-playback' to check status.
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 minimal guidance, stating only that it plays a track on an active device. It doesn't specify when to use this tool versus alternatives like 'next-track' for sequential playback, 'search-spotify' to find tracks first, or 'get-current-playback' to verify device status. No exclusions or prerequisites are mentioned, leaving usage context vague.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
previous-trackB
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 the full burden of behavioral disclosure. It implies a mutation action ('skip') but doesn't specify whether this requires specific permissions, affects playback state, or has side effects like changing the current track index. For a mutation tool with zero annotation coverage, this is insufficient.
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, making it highly efficient and front-loaded. It immediately conveys the core functionality 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?
Given the tool's complexity (a mutation with no annotations and no output schema), the description is incomplete. It lacks information on behavioral traits like authentication needs, error conditions, or what happens if no previous track exists. For a tool that likely interacts with playback state, 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?
The tool has zero parameters, and schema description coverage is 100%, so no parameter documentation is needed. The description appropriately doesn't mention parameters, which aligns with the schema. A baseline of 4 is applied since there are no parameters to document.
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 'Skip to the previous track' clearly states the action (skip) and target resource (previous track), making the purpose immediately understandable. However, it doesn't explicitly differentiate from its sibling 'next-track' beyond the directional 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 like 'next-track' or 'play-track', nor does it mention prerequisites such as requiring active playback or authentication. It simply states what the tool does without contextual usage information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove-tracks-from-playlistC
Remove tracks from a playlist
| Name | Required | Description | Default |
|---|---|---|---|
| trackIds | Yes | Array of Spotify track IDs to remove | |
| playlistId | Yes | Spotify ID of the playlist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing. For a mutation tool it does not say whether removals are permanent, whether the track IDs must already exist in the playlist, what happens with invalid IDs, or what authorization is needed.
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 single five-word sentence is front-loaded and contains no filler. It is arguably too terse for a mutation tool, but it is structurally clean and wastes nothing.
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 annotations, no output schema, and a mutation operation, the description should cover reversibility, error behavior, and relationship to sibling playlist tools. It covers none of these, leaving significant gaps for an agent to guess at.
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 both playlistId and trackIds are already documented in the schema. The description adds no format, ordering, batch-size, or constraint detail beyond what the schema provides, 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 states a clear verb and resource ('Remove tracks from a playlist'), so the purpose is unambiguous. However, it is essentially a plain-English restatement of the tool name and offers no differentiation from siblings like add-tracks-to-playlist, reorder-playlist-tracks, or delete-playlist.
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?
There is no when-to-use guidance, no stated prerequisites, and no mention of alternatives such as reorder-playlist-tracks or delete-playlist. The agent must infer when this is the right call from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder-playlist-tracksB
Reorder tracks in a playlist by moving a range of tracks to a new position
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | Spotify ID of the playlist | |
| rangeStart | Yes | Position of the first track to move (0-based index) | |
| rangeLength | No | Number of tracks to move (default: 1) | |
| insertBefore | Yes | Position where the tracks should be inserted (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 behavioral burden. It conveys the move semantics but omits required authorization scope, whether collaborative playlists are supported, and how unspecified indices behave — meaningful gaps 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?
A single front-loaded sentence with no filler, stating the operation and its mechanism efficiently. It is appropriately sized, though extremely terse given the tool is a mutation.
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 four-parameter mutation with fully documented params and no output schema, the description is minimally adequate. It still leaves behavioral questions unanswered (auth scope, index shift effects, error conditions) that matter for correct 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%, so playlistId, rangeStart, rangeLength, and insertBefore are all documented in the schema itself. The description's mention of a 'range of tracks' and 'new position' loosely maps to these parameters but adds no syntax or index-handling detail 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 states a specific verb (reorder), resource (playlist tracks), and mechanism (move a range to a new position). It is clearly distinct from sibling mutations like add-tracks-to-playlist or remove-tracks-from-playlist, though it does not explicitly name the boundary with update-playlist.
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?
Usage is implied by the operation itself — an agent can tell this is for repositioning existing tracks rather than adding or removing them. However, there is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as remove + add for cross-position moves.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-spotifyB
Search for tracks, albums, artists, or playlists on Spotify
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Type of item to search for (default: track) | |
| limit | No | Maximum number of results to return (1-10, default: 5) | |
| query | Yes | Search query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about authentication requirements, rate limits, pagination, or result ordering. The only implicit signal is that a search is a read-only operation, which is minimal disclosure for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no redundancy or filler. Every word maps to the tool's 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?
The schema is fully described and there is no output schema to require return-value documentation, so the essentials are present. However, the absence of behavior and usage context leaves the definition only minimally viable for an agent choosing among many Spotify siblings.
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 meaning of query, type, and limit is already fully documented in the schema, and the description adds no extra syntax or formatting guidance. This is the expected baseline 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?
States a specific verb (Search) and enumerates the resources (tracks, albums, artists, playlists) plus the service (Spotify). An agent can distinguish it from playback and playlist-management siblings, though it does not explicitly name or contrast those siblings.
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 gives no when-to-use context, no prerequisites, and no guidance on distinguishing it from related lookups like get-top-tracks or get-playlist-tracks. Usage is only implied by the verb 'search'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-playlistC
Update a playlist's name, description, public/private status, or collaborative setting
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the playlist (optional) | |
| public | No | Whether the playlist should be public (optional) | |
| playlistId | Yes | Spotify ID of the playlist | |
| description | No | New description for the playlist (optional) | |
| collaborative | No | Whether the playlist should be collaborative. Must set public to false first (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does not state whether ownership/permissions are required, that unspecified fields are left unchanged, or that changes are reversible. It also omits that collaborative requires public=false, a constraint that only appears in the schema.
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 front-loaded sentence that lists the update targets with zero filler. Slightly terse given the mutation risk, but appropriately sized for the information conveyed.
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 plus the fully-covered schema give the agent enough to call it, but omit ownership requirements, side effects, and the public/collaborative interaction detail. Adequate but with clear gaps.
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 every parameter is already documented, including the collaborative/public ordering constraint. The description echoes the same four field names without adding format or value semantics, so the 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?
States a specific verb ('Update') and resource ('playlist') and enumerates the mutable fields (name, description, public/private, collaborative), so an agent can tell it apart from create-playlist and delete-playlist. It does not explicitly name a sibling or contrast scope, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as create-playlist for new playlists. The agent is left to infer that this only applies to existing playlists it owns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-playlist-coverA
Upload a custom cover image for a playlist (base64 encoded JPEG, max 256KB)
| Name | Required | Description | Default |
|---|---|---|---|
| playlistId | Yes | Spotify ID of the playlist | |
| imageBase64 | Yes | Base64 encoded JPEG image (max 256KB) |
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. The only behavioral detail it gives (base64 JPEG, max 256KB) merely restates the schema, and it omits key traits: that this overwrites any existing cover, what permission/scope is required, and how failures (oversize/invalid format) are reported.
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 front-loaded sentence with the action first and the constraints parenthetically appended; no filler or 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?
For a two-parameter tool with no output schema and no annotations, the description is adequate but shallow: it does not cover the destructive overwrite behavior, authentication requirements, or error conditions that an agent would need before calling a mutation.
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?
Both parameters are required and schema description coverage is 100%, so the schema already documents playlistId and imageBase64 fully. The description adds no format syntax, encoding caveats, or examples beyond what the schema states — baseline 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?
States a specific verb (Upload) plus resource (cover image for a playlist) and even the accepted format and size cap. It is trivially distinguishable from the sibling get-playlist-cover, which retrieves rather than sets the image.
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 intent is implied — call this when you want to set a playlist's cover art — but there is no explicit when/when-not guidance, no mention of the prerequisites (ownership, required auth scope), and no reference to the sibling get-playlist-cover for the read side.
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.
11 tool updates
v0.7.0- Added
delete-playlist - Added
get-playlist-cover - Added
get-playlist-tracks - Added
get-recently-played - Removed
get-recommendations - Changed
get-user-playlists2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum number of playlists to return (1-50, default: 20)", + "type": "number" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "The index of the first playlist to return (default: 0)", + "type": "number" +}
- Added
remove-tracks-from-playlist - Added
reorder-playlist-tracks - Changed
search-spotify1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return (1-50, default: 10)"New value: +"Maximum number of results to return (1-10, default: 5)"
- Added
update-playlist - Added
upload-playlist-cover
12 tool updates
v1.0.0- First observed
add-tracks-to-playlist - First observed
auth-spotify - First observed
create-playlist - First observed
get-current-playback - First observed
get-recommendations - First observed
get-top-tracks - First observed
get-user-playlists - First observed
next-track - First observed
pause-playback - First observed
play-track - First observed
previous-track - First observed
search-spotify
TDQS
Scored across 19 tools
Each tool targets a distinct resource and action (playlist management, playback control, search, user data, auth). No two tools overlap in purpose; descriptions clearly differentiate similar-sounding operations like delete-playlist (unfollow) and remove-tracks-from-playlist.
Nearly all tools use kebab-case with an action-first pattern (get-, create-, add-, remove-, update-, upload-, reorder-). Minor deviations exist in next-track and previous-track, which are not verb_noun, and auth-spotify uses an abbreviation, but overall the convention is predictable.
19 tools is slightly above the ideal 3–15 range but remains reasonable for a Spotify controller covering playlists, playback, search, and user data. Each tool appears to earn its place, though a few could potentially be consolidated.
Playlist lifecycle is well covered (create, read, update, unfollow, track add/remove/reorder, cover management). Playback control is basic but missing common operations like volume, seek, shuffle, repeat, queue, and device transfer; these are notable gaps but agents can still perform core tasks.
Maintenance
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
One workspace of tools for Claude and ChatGPT: connect 600+ apps, generate media, build tools.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceConnects Claude with Spotify to control playback, search music, get track information, and manage the queue through conversation.1-
- FlicenseAqualityDmaintenanceConnects Claude with Spotify, allowing users to control playback, search for music, get track/artist information, and manage the queue via the Spotify API.51-
- FlicenseDqualityDmaintenanceEnables Claude to interact with Spotify by searching songs, creating playlists, getting recommendations, and managing your music through your Spotify account.73-
- 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-