Spotify MCP Server
Controls Spotify playback, retrieves current track and playback state, manages queue, searches for tracks/albums/artists/playlists, and manages playlists and saved tracks. Also includes local favorites feature not requiring Spotify API permissions.
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 ServerPause the music"
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
Control Spotify playback through Claude using the Model Context Protocol (MCP).
Uses PKCE authentication - just install and authorize your Spotify account.
Quick Start
1. Install
git clone https://github.com/panuhen/spotify-mcp.git ~/spotify-mcp
cd ~/spotify-mcp
python -m venv .venv
.venv/bin/pip install -e .2. First Run - Authenticate
Run once in a terminal to authorize with your Spotify account:
~/spotify-mcp/.venv/bin/spotify-mcp --loginThis opens your browser for Spotify login. After authorizing, the token is cached at ~/.spotify-mcp-token
and refreshed automatically from then on. The server itself never opens a browser: if a tool call
finds no usable token it returns an auth error that tells you to run --login.
3. Add to Claude Code
Add to ~/.mcp.json:
{
"mcpServers": {
"spotify": {
"command": "/home/YOUR_USER/spotify-mcp/.venv/bin/spotify-mcp"
}
}
}Then enable in ~/.claude/settings.local.json:
{
"enabledMcpjsonServers": ["spotify"]
}Restart Claude Code and you're ready!
Related MCP server: Spotify MCP Server
Available Tools
Playback Control
play- Resume, or play a track (uri), an album/playlist/artist (context_uri), or one of your playlists by name (playlist)play_liked- Play your Liked Songs, shuffled unlessshuffle: false(see below)pause- Pause playbacknext- Skip to next trackprevious- Go to previous trackseek- Seek to position in trackset_volume- Set volume (0-100)shuffle- Toggle shuffle moderepeat- Set repeat mode (off/track/context)
Information
get_current_track- Get currently playing track infoget_playback_state- Get full playback stateget_queue- Get upcoming tracksget_devices- List available devices
Search & Library
search- Search for tracks, albums, artists, playlists (at most 10 per type; Spotify rejects more)add_to_queue- Add track to queueget_playlists- List your playlistsget_playlist_tracks- Get tracks from a playlist (Spotify refuses some playlists the user does not own:forbidden)add_to_playlist- Add tracks to a playlist by IDsave_tracks- Save tracks to Liked Songsremove_saved_tracks- Remove tracks from Liked Songsget_saved_tracks- Get your liked tracks
Library & Playlists by Name
Made for voice and small models: one call, the server finds the playing track and the playlist.
like_current- Save the playing track to Liked Songs (already_likedif it was there)add_current_to_playlist- Add the playing track to one of your playlists (playlist: name, ID, URI or link). Reads the playlist first and skips the add if the track is already there.create_if_missing: truecreates a private playlist when no name matches.find_playlist- Your 1-5 best matching playlists for a name: name, id, uri, owned, track countremove_from_playlist- Remove a track ("current", a URI or a link) from one of your playlistscreate_playlist- Create a playlist, private unlesspublic: true. Refuses a name you already own unlessforce: true.
The write tools (like_current, add_current_to_playlist, remove_from_playlist,
create_playlist) say so in their descriptions and carry MCP annotations
(remove_from_playlist is marked destructive).
Results are short, e.g. {"liked": "Blue Monday – New Order"},
{"added": "Blue Monday – New Order", "playlist": "Running"}, {"already_there": …},
{"removed": …}, {"not_in_playlist": …}, {"created": "Gym", "id": …, "uri": …}.
Spotify moved playlist contents to /playlists/{id}/items, library writes to /me/library and
playlist creation to /me/playlists in 2026; the old endpoints answer 403. The server uses the
new ones and falls back to the old ones only when the new one is missing (404).
Favourites are Liked Songs
"Favourites" are Liked Songs: like_current adds the playing track, play_liked plays them,
get_saved_tracks lists them. (An earlier local favorites file, ~/.spotify-mcp-favorites.json,
and its five tools were removed; the server no longer reads that file.)
play_liked starts up to 50 Liked Songs as a track list: by default a random page of 50, shuffled;
with shuffle: false the 50 newest in order. Spotify documents only albums, artists and playlists
as playback contexts, and has refused Liked Songs' own URI (spotify:user:<id>:collection) with
"Non supported context uri" and PLAYER_COMMAND_REJECTED, so the server reads the saved tracks
and plays them by URI. It is one play call: nothing is added to the queue.
Playlist names
add_current_to_playlist, remove_from_playlist, find_playlist and play's playlist take a
name and find the playlist in your library. The first rule that matches anything decides:
the same name, ignoring case;
the same after removing accents, punctuation, extra spaces and filler words ("my", "playlist");
every word you said starts a word of the name ("run" finds "Running Mix"), or every word of the name is in what you said;
a fuzzy match (Python's
difflibratio of at least 0.8, on the text and on a rough sound-alike spelling), so speech-to-text errors still land: "shrance" finds "Schranz".
If one rule finds several playlists, the call fails with bad_request and lists up to five names
so the model can ask which one. Nothing found gives not_found with the closest names.
The write tools only look at playlists you own or that are collaborative; a name that only
matches someone else's playlist gives forbidden. Your playlist list is cached for 60 seconds
and re-read after every write.
URIs and links
Every argument that takes a Spotify URI also takes an open.spotify.com link (with or without
https://, an intl-xx/ prefix or a ?si= query) and the old spotify:user:<name>:playlist:<id>
form. Playlist and track ID arguments also take a bare ID.
play puts each URI where Spotify needs it, whichever argument it came in:
You pass | Sent to Spotify |
a track or episode, in |
|
an album, playlist, artist or show, in |
|
a track in | the album/playlist, starting at that track |
nothing | resume |
So a track passed as context_uri no longer fails with 400 "Non supported context uri".
add_to_queue takes tracks and episodes only and says so if given an album.
Errors
Every failed call returns one JSON object, with the MCP isError flag set:
{"error": "No Spotify device is active. Open Spotify on a computer or phone, or name a device_id from get_devices.",
"code": "no_active_device", "status": 404, "details": "Player command failed: No active device found"}error: one plain sentence, fit to show or speak. Never a traceback, URL or token.code: a stable category to branch on (below).status: the HTTP status, when Spotify answered with one.details: Spotify's own message without the URL, when there is one.
The keys are always a subset of error, code, status, details, message.
code | Meaning |
| Nothing is playing anywhere and no device was given. |
| No such track/playlist/etc., no playlist matches the name, nothing is playing ( |
| Spotify sent 429 with a longer wait than the server will sit through; the message says when to retry. |
| Spotify could not be reached, or did not answer within the call's time budget. |
| Not signed in, or the sign-in expired or was revoked. Run |
| The command needs Spotify Premium. |
| Spotify refused a player command ("Restriction violated"): usually already playing/paused, or the device does not allow it. |
| Spotify does not let this app do that (403), or a write to a playlist the user does not own. |
| A missing or invalid argument, several playlists match a name, or Spotify rejected the request (400). |
| Spotify answered with a 5xx. |
| A bug in this server; details go to its stderr log. |
Arguments are checked by the server rather than by the MCP SDK, so a missing argument comes back
in this shape too ("Missing argument: position_ms."). Near misses are accepted: "50" or "50%"
for a number, "on"/"off" for a boolean, "all"/"one" for repeat, a single string for a list.
Reliability
Stale connections. Spotify's edge closes an idle keep-alive connection after about ten minutes, and a request sent on it at that moment fails at once with
RemoteDisconnected. The server closes pooled connections that have been idle for 120 seconds (time asleep counts), so the next call opens a fresh one, and if a connection still fails it retries:before anything was sent (refused, DNS, connect timeout): any request, up to twice;
after the request may have been sent (reset, closed without answer, read timeout): only GET, PUT and DELETE, which set state and are safe to repeat (play, pause, volume, shuffle, repeat, seek, transfer, play_liked, save/remove tracks, remove from a playlist). POST is not repeated, because
next,previous,add_to_queue,add_to_playlist,add_current_to_playlistandcreate_playlistwould act twice;the token refresh (a POST) is retried, because the next call would retry it anyway.
IPv4 first. New connections try IPv4 addresses first and give each address 1.5 seconds, so a broken IPv6 route costs nothing instead of a full timeout per connection.
Rate limits. A 429 with
Retry-Afterof up to 5 seconds is waited out and retried (twice at most). A longer wait returnsrate_limitedat once. A 5xx on GET/PUT/DELETE is retried up to twice.Bounded calls. Every tool call has a 15-second budget shared by all of its requests; connect timeout 3 s and read timeout 8 s per attempt, never past the budget. The token refresh has the same limits (spotipy's own has no timeout).
401. A 401 on a token that should still be valid forces one refresh and one retry.
Shared token cache. Several server processes (for example one per client) can share
~/.spotify-mcp-token: it is written atomically in spotipy's format, and a read that catches another process mid-write is retried.
Settings
Environment variables, all optional:
Variable | Default | Effect |
|
|
|
| off |
|
|
| Seconds one tool call may take in total. |
|
| Connect timeout per attempt, seconds. |
|
| Read timeout per attempt, seconds. |
|
| Seconds idle after which pooled connections are dropped. |
|
| Longest |
Results are compact JSON (no indentation) in every mode.
Usage Examples
Once configured, you can ask Claude:
"What song is currently playing?"
"Pause the music"
"Play the next track"
"Search for 'Bohemian Rhapsody' and add it to the queue"
"Set the volume to 50%"
"Turn on shuffle"
"Show my playlists"
"I like this song" or "add this to my favourites" (
like_current)"Play my favourites" (
play_liked)"Add this to my running playlist" (
add_current_to_playlist)"Play my Schranz playlist" (
playwithplaylist)
Setup Your Own Spotify App
Optional. Every tool, writes included, works with the bundled client ID. To use your own app instead:
Create an app at https://developer.spotify.com/dashboard
In your app settings, add redirect URI:
http://127.0.0.1:8888/callbackCopy your Client ID and add to
~/spotify-mcp/.env:SPOTIPY_CLIENT_ID=your_client_id_hereDelete the cached token and sign in again:
rm ~/.spotify-mcp-token ~/spotify-mcp/.venv/bin/spotify-mcp --loginRestart the MCP server
Troubleshooting
"No active device" error
Make sure Spotify is open on at least one device (phone, desktop app, web player), or set
SPOTIFY_MCP_AUTO_DEVICE=auto to let play start on the only available device.
Authentication issues ("code": "auth")
Run spotify-mcp --login in a terminal. If that does not help, delete ~/.spotify-mcp-token first.
Token expired
The token auto-refreshes. If Spotify revokes it, calls return an auth error; run spotify-mcp --login.
Logs
The server logs one line per failed call and per retry to stderr, never tokens or request bodies.
Development
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytestThe tests run offline: a throwaway HOME, no DNS for anything but localhost, and Spotify's
answers scripted at the HTTP adapter or served by a local keep-alive server.
Available Tools
26 toolsadd_current_to_playlistA
Add the playing track to one of the user's playlists. Needs playlist. Skipped if already there. Changes the user's library.
| Name | Required | Description | Default |
|---|---|---|---|
| playlist | Yes | Playlist name, ID or link. | |
| create_if_missing | No | Create it (private) if no playlist matches. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is partly covered. The description adds genuinely useful behavioral context beyond that: 'Skipped if already there' discloses idempotency and 'Changes the user's library' discloses a persistent side effect.
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?
Four short, front-loaded fragments with virtually no waste. The negation that supports idempotency is stated explicitly and the essential information leads.
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 mutation tool with no output schema and annotations covering safety, the description supplies the key missing facts: what track is added, that it is idempotent, and that the library changes. Details like which playlist scope (owned vs followed) are left implicit.
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 parameters (playlist and create_if_missing) are already documented in the schema. The description's 'Needs playlist' merely restates the required field and adds no format or behavior 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?
States a specific verb and resource: 'Add the playing track to one of the user's playlists.' The phrase 'the playing track' implicitly distinguishes it from the sibling add_to_playlist, which takes an explicit track argument, but no sibling is named outright.
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 only implied by 'the playing track' — the agent can infer this is for the currently playing item rather than a specified track. There is no explicit statement of when to prefer this over add_to_playlist, add_to_queue, or save_tracks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_to_playlistC
Add tracks to a playlist. Needs playlist_id and uris.
| Name | Required | Description | Default |
|---|---|---|---|
| uris | Yes | Track URIs. | |
| playlist_id | Yes | Playlist ID, URI or link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and falls short: it doesn't disclose that this is a write/mutation requiring user authorization, whether duplicates are allowed, whether tracks are appended or replace existing entries, or what the response contains (e.g. a snapshot id). Only the bare action is stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action front-loaded with the requirement following, and no wasted words. It is efficient, though the terseness borders on under-specification rather than genuine 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?
For a simple two-parameter tool with a fully described schema and no output schema, the description is minimally adequate. However, as a mutation with no annotations, it should have covered authorization requirements and duplicate/append behavior to be complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('Track URIs', 'Playlist ID, URI or link'), establishing the baseline of 3. The description adds nothing beyond repeating that the two parameters are required, but no compensation is needed given the complete 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?
States a specific verb and resource ('Add tracks to a playlist'), so the agent knows exactly what it does. It doesn't explicitly distinguish itself from the close siblings add_current_to_playlist and add_to_queue, but the plural 'tracks' plus the required 'uris' param implies arbitrary track selection rather than the currently playing 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?
There is no guidance on when to use this versus add_current_to_playlist, add_to_queue, or create_playlist. 'Needs playlist_id and uris' merely restates the required parameters rather than giving situational context or prerequisites such as authentication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_to_queueC
Add a track to the queue. Needs uri.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Track URI. | |
| device_id | No | Optional device ID from get_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It says only 'Needs uri' and reveals nothing about authentication, device context, mutation side effects, or what happens when a track is added to the queue.
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 very short and front-loads the action. The second sentence, 'Needs uri,' is redundant with the schema's required field, so it does not fully earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and schema coverage is complete, so the purpose is minimally covered. However, with no annotations and no output schema, an agent gets no behavioral context about device targeting or queue semantics.
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%, so the schema already documents both uri and device_id. The description's 'Needs uri' merely repeats the required field and adds no semantic 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?
States a specific verb and resource: 'Add a track to the queue.' This clearly separates it from siblings like add_to_playlist and play, but it does not explicitly name or contrast those 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 on when to use this tool versus alternatives such as add_to_playlist, play, or play_liked. The description only states the basic action and the required parameter, leaving selection entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_playlistA
Create a playlist. Needs name. Private unless public=true. Changes the user's library.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Playlist name. | |
| force | No | Create even if one by that name exists. Default false. | |
| public | No | Default false. | |
| description | No | Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark this as non-read-only and non-destructive. The description goes beyond them by disclosing the side effect ('Changes the user's library') and the visibility default, both real behavioral facts an agent needs. It stops short of stating auth requirements or error/duplicate handling.
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?
Four terse sentences, each carrying a distinct fact (action, required input, visibility default, side effect), with the core action front-loaded and zero filler.
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 4-parameter write tool with full schema coverage and no output schema, this covers action, required input, default state, and library side effect. It omits duplicate/'force' semantics (partly in schema) and any failure modes, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters; per the rubric that sets a baseline of 3. The description reinforces name as required and public's default, but adds no syntax or format 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?
States a specific verb and resource ('Create a playlist'), which is unambiguous against read siblings like get_playlists or find_playlist. It does not explicitly distinguish itself from the nearby write siblings add_to_playlist or add_current_to_playlist, but the create-a-new-entity sense is clear.
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?
It conveys the required parameter ('Needs name') and the default visibility ('Private unless public=true'), which is implied usage guidance. However, it never says when to prefer this over add_to_playlist or find_playlist, nor any prerequisites or duplicate-name behavior routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_playlistARead-only
Find the user's playlists by name. Needs query. Returns id and uri.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Playlist name; spelling may be rough. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's added value is the return payload ('Returns id and uri'), which matters because there is no output schema. It does not cover result limits or behavior when no playlist matches, but for a read-only lookup this is solid disclosure.
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?
Three short, front-loaded sentences with no filler; purpose, input requirement, and return shape each get one clause. 'Needs query' is mildly redundant with the schema's required list but costs almost 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?
For a single-parameter read-only lookup with no output schema, the description supplies the essentials: what it searches, that it requires input, and what it returns. Only matching behavior and the empty-result case are unaddressed.
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 schema's own description ('Playlist name; spelling may be rough') is actually richer than the description's 'Needs query'. The description restates that the parameter is required rather than adding syntax or matching semantics.
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 and resource with scope: finding the user's own playlists by name. It is clear on its own, but it never distinguishes itself from siblings like get_playlists (list all) or search, which an agent could easily pick instead.
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 name-based scope implies when to reach for it (you have a rough playlist name), and 'Needs query' signals the required input. However, no sibling alternative is named and no when-not condition is given, so the agent must infer the choice between this, get_playlists, and search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_trackB
The track playing now.
| 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 the full burden. It does not disclose any behavioral traits such as error handling when no track is playing, read-only nature, or authentication needs.
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, front-loaded sentence fragment with no filler. It is appropriately sized for a simple getter, though it could be slightly more 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?
With no annotations and no output schema, the description states the return value but omits edge cases (e.g., what happens if nothing is playing) and any additional context. It is adequate for the simplest invocation but has 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?
The tool takes zero parameters, so there are no parameter semantics to document. The schema is empty, and a baseline of 4 is appropriate for this dimension.
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 what the tool returns: the track currently playing. It does not name alternatives like get_playback_state or get_queue, but the purpose is precise and understandable.
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 mention of alternatives, and no exclusions. The agent must infer usage solely from the name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_devicesA
List Spotify devices: id, name, active, volume.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the return fields, which is genuinely useful given there is no output schema. However, it says nothing about authorization requirements, whether the list can be empty, or rate-limit behavior, so significant behavioral gaps remain.
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 the verb and resource, with the return fields packed in efficiently. Every word earns its place and nothing is padded.
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 0-param read tool with no output schema, the field enumeration (id, name, active, volume) covers the essential return shape. It is nearly complete, with only the missing when-to-use context holding it back from a 5.
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 takes zero parameters, so there is nothing for the description to disambiguate; this meets the baseline of 4 for a 0-param tool.
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 gives a specific verb ('List') and resource ('Spotify devices') and even enumerates the returned fields (id, name, active, volume). It is clearly distinguishable from siblings like get_playback_state or get_current_track, though it does not explicitly contrast itself against them.
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 call this tool versus alternatives. It never mentions the common use case of discovering an available device_id before calling play, nor any prerequisites such as requiring an active authenticated session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playback_stateB
Player state: device, volume, shuffle, repeat, 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 the full burden. It does disclose the shape of the returned state (device, volume, shuffle, repeat, track), which is real behavioral value given there is no output schema, but it says nothing about read-only nature, side effects, or whether playback must be active.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single terse line with no waste; every token carries information. It is slightly under-specified rather than padded, and the front-loaded resource name is easy to scan.
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 params and no output schema, the field list usefully stands in for a return-value description, which is a genuine contribution. However, it leaves gaps for a state-reader in a crowded sibling set: no mention of read-only semantics, no routing guidance against the many overlapping state tools, and no clarity on the nested 'track' object.
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 takes zero parameters, so the baseline is 4. The description's enumerated fields are outputs rather than inputs, but no parameter documentation is required here.
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 names the resource ('Player state') and enumerates the fields it exposes, so the intent is inferable, but it is a fragment with no verb and no differentiation from siblings like get_current_track or get_devices/volume-setter siblings. It reads as a field label list rather than a statement of what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all. The agent is not told when to call this versus get_current_track, get_devices, or the individual setters (set_volume, shuffle, repeat), which cover overlapping state. Usage must be inferred 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_playlistsC
List the user's playlists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 50. |
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 discloses nothing about pagination, ordering, auth requirements, or what a returned playlist contains. Only the verb 'list' weakly implies a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste, front-loaded on the core purpose. It is efficient, though the brevity borders on under-specification rather than disciplined 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?
For a simple one-parameter read tool with no output schema, the description is minimally viable. It omits return shape and pagination behavior, but the low complexity keeps the gap modest.
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% and the single limit parameter is documented with its default and bounds in the schema. The description adds no parameter meaning at all, 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 (list) and resource (the user's playlists), which is immediately understandable. However, it does nothing to distinguish itself from sibling find_playlist or get_playlist_tracks, leaving the agent to guess which retrieval tool applies.
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 and no mention of alternatives such as find_playlist for searching or get_playlist_tracks for contents. The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playlist_tracksC
List a playlist's tracks. Needs playlist_id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 100. | |
| playlist_id | Yes | Playlist ID, URI or link. |
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. 'List' weakly implies a safe read, but nothing is said about authentication needs, rate limits, ordering of returned tracks, or how the limit interacts with pagination. For a tool with zero annotation coverage this is a substantial gap.
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?
Two short sentences, front-loaded with the core action. The second sentence is largely redundant with the schema's required-field marker, which is a minor waste, but there is no padding or verbosity.
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?
There is no output schema or annotations, yet the description does not describe the return shape (track fields) or pagination behavior. For a simple two-parameter read tool it is minimally sufficient to call, but it leaves the agent guessing about result format and paging.
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 limit ('Default 100', min/max bounds) and playlist_id ('Playlist ID, URI or link') documented in the schema itself. The description only echoes the required parameter, adding no syntax or format meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List a playlist's tracks'), which cleanly separates it from write-oriented siblings like add_to_playlist, remove_from_playlist, and create_playlist. It does not explicitly name a competing sibling (e.g., get_playlists or find_playlist), so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Needs playlist_id.' is a prerequisite restatement, not usage guidance — the schema already marks playlist_id as required. There is no indication of when to use this versus get_playlists, find_playlist, or get_queue, and no exclusions or context for choosing it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queueC
The next tracks in the queue.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full behavioral burden and provides none of it. It does not state that this is a read-only operation, how many tracks are returned, whether pagination applies, or how it relates to playback 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 single sentence is short but under-specified rather than concise; it delivers almost no information and is not structured to front-load scope or purpose. Brevity here reflects missing content, not efficiency.
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 zero-parameter read tool, the definition still fails to explain what 'next tracks' means (whole queue vs. upcoming items) or how it differs from adjacent playback-state tools. With no annotations and no output schema, the description should do more than this fragment.
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 takes zero parameters and the schema is empty, so there is nothing for the description to clarify. Baseline 4 applies for a parameterless tool.
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 is a bare noun phrase that largely restates the tool name ('get_queue' → 'the next tracks in the queue'). It signals the resource (queue) but supplies no verb and leaves ambiguous whether it returns the entire queue or only upcoming tracks, so an agent cannot clearly separate it from get_current_track or get_playback_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus siblings such as get_current_track, get_playback_state, or add_to_queue. 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_saved_tracksB
List Liked Songs, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose sort order ("newest first"), which is genuinely useful, but says nothing about return size, the 50-item ceiling, or that there is no pagination offset — an agent cannot tell whether it can page past the first page of results.
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 six-word sentence with the resource and the ordering front-loaded; no filler. It is appropriately sized for a one-parameter read tool, though it leaves room for a short clause about result size.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with 100% schema coverage and no output schema, the description tells the agent what is returned (saved tracks, newest first), which is sufficient to call it correctly. Only the paging/limit interaction is left implicit.
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% ("Default 20." plus min/max bounds), so the schema already documents the single parameter. The description adds no extra meaning about limit, which is the baseline-3 case 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 ("List") and a specific resource ("Liked Songs"), which is the saved-tracks collection rather than a user playlist. An agent can distinguish it from get_playlists or get_playlist_tracks by the resource name alone, though the description never explicitly contrasts them.
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 (e.g., authentication/user context), and no mention of the sibling pair save_tracks/remove_saved_tracks that share this resource. The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
like_currentA
Save the playing track to Liked Songs. Changes the user's library.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation safety profile is covered. The description adds that the effect is on the user's library (persistent, account-level), but says nothing about idempotency, required playback state, or auth - mild added value only.
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?
Two short sentences, action front-loaded with the effect following. The second sentence partially restates the mutation already implied by annotations, but it is not wasteful enough to penalize heavily.
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 zero-param, no-output-schema action with annotations covering safety, the description supplies what changes (library) and on what input (the playing track). Only the precondition of active playback is implicit rather than stated.
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 takes zero parameters, so there is no parameter semantics for the description to carry; the baseline for a 0-param schema 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?
Specific verb+resource: it saves the currently playing track to Liked Songs, which implicitly distinguishes it from save_tracks (arbitrary tracks) and play_liked (playback). It never names those siblings, so an agent must infer the boundary rather than being told it.
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 only implied: the operation presupposes an active, playing track, and no alternative (save_tracks, add_current_to_playlist) or when-not-to-use condition is stated. Adequate for a trivial 0-param action, but no explicit routing guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nextB
Skip to the next track.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | No | Optional device ID from get_devices. |
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, yet it discloses nothing beyond the action itself: it does not say whether this mutates playback state, what happens at the end of the queue, or whether a device must be targeted. For a state-changing playback tool with zero annotation coverage, this is a real gap.
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 waste, and the action is front-loaded. Nothing redundant or filler.
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, output-schema-less playback control the description is minimally viable, but with no annotations it should mention at least that this changes the current track and how device targeting applies. It leaves the agent to infer all behavioral 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?
Schema coverage is 100% and the single optional device_id is documented in the schema as coming from get_devices, so the schema does the work. The description adds no parameter meaning, which is the expected baseline here.
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 and resource ('Skip to the next track'), which an agent can distinguish from the 'previous' sibling by the word 'next'. It is clear but adds no explicit contrast with siblings such as play, pause, or previous.
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 (previous, seek, play) or whether playback must be active first. The description is purely a restatement of the action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pauseC
Pause playback.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | No | Optional device ID from get_devices. |
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, yet it discloses nothing beyond the name: it does not say whether pause is a toggle, what happens if nothing is currently playing, whether it targets the active device by default, or whether the paused session is resumable. For an annotation-free mutation of playback state, this is a substantial gap.
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?
Two words, front-loaded, zero waste. It is arguably under-specified rather than merely concise, which keeps it off a 5, but there is no filler or burying of key 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?
For a trivial single-optional-parameter control with no output schema, the description is minimally viable but omits the one thing actually worth stating: the default target when device_id is omitted. An agent can call it correctly by luck, not by documentation.
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 single parameter reaches 100% schema description coverage ('Optional device ID from get_devices'), so the schema already carries the semantics. The description adds nothing about what omitting device_id does, but baseline 3 applies 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 ('Pause') and resource ('playback'), which is unambiguous and immediately distinguishable from siblings like play, next, previous, and seek. It does not explicitly name or contrast with a sibling, but the action is self-evident for a playback-control tool.
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 play (resume) or get_playback_state. The agent must infer entirely from common sense that this halts current playback rather than, say, pausing a queue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playA
Play or resume music. No arguments: resume. A track: give uri. An album, playlist or artist: give context_uri. One of the user's playlists: give playlist. Use URIs from search.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | Track URI, e.g. spotify:track:<id>. | |
| playlist | No | The user's playlist by name, ID or link. | |
| device_id | No | Optional device ID from get_devices. | |
| context_uri | No | Album, playlist or artist URI. |
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 discloses the resume-vs-play mode distinction, which is real behavioral information, but says nothing about prerequisites (e.g., Spotify Premium), what happens with no active device, whether starting playback interrupts current audio, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, zero filler, and the primary behavior ('Play or resume') is front-loaded ahead of the per-argument branches. Every clause maps to a distinct callable mode.
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 covers the core question of which argument to pass for which content. It leaves gaps around device targeting rules and error/edge conditions (no active device, non-Premium account), but is sufficient for an agent to invoke correctly in the common case.
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 already 100% (baseline 3), but the description adds routing value the schema does not: it maps each URI-style parameter to the content type it accepts (track vs. album/playlist/artist vs. user playlist). It omits device_id entirely, though the schema documents it as optional.
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 concrete verb+resource ('Play or resume music') and then enumerates the four invocation modes, each keyed to a different argument. The no-argument-resumes case is a distinguishing behavior that separates it from siblings like pause and play_liked without needing their schemas.
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?
Effectively a routing guide: no args = resume, a track = uri, an album/playlist/artist = context_uri, user playlist = playlist, and a pointer to search for URI sourcing. It gives clear context for choosing parameters but names no exclusions or alternatives (e.g., play_liked, add_to_queue, pause).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_likedB
Play the user's Liked Songs (their favourites), shuffled unless shuffle=false.
| Name | Required | Description | Default |
|---|---|---|---|
| shuffle | No | Default true. | |
| device_id | No | Optional device ID from get_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the shuffle-by-default behavior, but says nothing about device requirements, whether playback starts immediately, or what happens when no active device exists.
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 tight sentence with the resource named first and the default behavior appended. Nothing is wasted and no sentence needs reordering.
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?
Adequate for a two-boolean/string playback tool with no output schema, but for a mutation-like action with zero annotations the definition should say more about device targeting and precondition failures.
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 parameters are already documented; baseline is 3. The description restates the shuffle default rather than adding new semantics, and device_id is not addressed at all.
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 (Play) and resource (the user's Liked Songs, glossed as 'favourites'), which cleanly separates it from the generic `play` and from listing tools like `get_saved_tracks`. It does not explicitly name a sibling, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of when to prefer this over `play` with an explicit context, and no prerequisites such as needing an active device. The reader must infer all routing 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.
previousC
Go back to the previous track.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | No | Optional device ID from get_devices. |
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 does not disclose whether this restarts the current track when history is empty, whether it resumes playback if paused, or whether device_id is required to target a specific player.
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 zero filler, and the action is front-loaded. Nothing is wasted, though it is too terse to earn a 5 given the gaps elsewhere.
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-optional-parameter transport control with no output schema, the minimal description is arguably adequate. However, with no annotations and no disclosure of edge-case behavior, an agent cannot fully predict the call's effect.
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 optional device_id parameter is documented in the schema ('Optional device ID from get_devices'). The description adds nothing further about targeting, so 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+resource ('go back to the previous track'), which an agent can map cleanly to a transport-control action. It is implicitly the counterpart of the sibling 'next', though it never names or contrasts with it explicitly.
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 prerequisites, and no mention of alternatives such as 'next' or 'seek'. The usage is only inferable from the tool name and the word 'previous'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_playlistADestructive
Remove a track from one of the user's playlists. Needs playlist and track. Destructive: changes the user's library.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | "current" for the playing track, or a track URI or link. | |
| playlist | Yes | Playlist name, ID or link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description redundantly restates 'Destructive' and adds 'changes the user's library', which offers only a little context beyond the annotation, but nothing on reversibility or auth requirements.
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?
Two short, front-loaded sentences with zero waste; the core action and prerequisites come first, the destructive note last.
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-param destructive mutation with no output schema, the description covers the action and required inputs but omits any handling signals like missing-track behavior or undo, leaving a modest but real gap.
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%, with both parameters fully documented including the 'current' special value and URI/link formats. The description adds no syntax or format detail beyond the schema, so 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?
Specific verb+resource ('Remove a track from one of the user's playlists') that clearly distinguishes it from siblings like add_to_playlist or remove_saved_tracks.
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?
Implies usage context by stating prerequisites ('Needs playlist and track'), but gives no explicit when-to-use vs alternatives such as add_to_playlist or like_current.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_saved_tracksB
Remove tracks from Liked Songs. Needs track_ids.
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes | Track URIs or IDs. |
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 signals a mutation but says nothing about required auth scopes, whether removal is reversible (re-save via save_tracks), or what happens when a track ID isn't currently in Liked Songs.
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?
Two short, front-loaded sentences with no filler; the action and scope come first. The trailing 'Needs track_ids' is mildly redundant against the schema's required marker but costs almost 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?
For a one-parameter, no-output-schema mutation this is roughly adequate, but with zero annotation coverage the description should say more about side effects and failure modes. It leaves the agent to infer everything beyond the action itself.
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% and the single parameter is documented as accepting track URIs or IDs. 'Needs track_ids' merely restates the required field the schema already marks, adding no format or batching semantics.
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 (Remove) and resource (tracks from Liked Songs), which is enough to distinguish it from remove_from_playlist. However, it never names the sibling it differs from, so the differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Liked Songs' scopes the operation to the user's saved library, implicitly steering the agent away from remove_from_playlist. There is no explicit when-to-use statement, no mention of the inverse save_tracks, and no guidance on prerequisites or error cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repeatC
Set repeat mode. Needs state.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | track = repeat one song, context = repeat the album or playlist. | |
| device_id | No | Optional device ID from get_devices. |
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 almost nothing: it does not say whether the mode persists, whether it targets the active device by default, or what happens if device_id is omitted. 'Needs state' is the only behavioral hint and it merely echoes 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?
Two short fragments, front-loaded with the action. 'Needs state' is largely redundant with the schema's required array, so it is not perfectly economical, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple two-parameter tool with full schema coverage and no output schema, so the schema does most of the work. The description is adequate but leaves device-targeting and persistence behavior unstated, which for a stateful playback control would be useful.
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 enum values (off/track/context) are already fully explained in the schema, so the baseline of 3 applies. The description adds no format, default, or device-targeting nuance beyond what the schema documents.
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 concrete verb+resource ('Set repeat mode'), which clearly distinguishes it from playback siblings like shuffle, seek, or set_volume. It does not, however, explicitly disambiguate from shuffle (the closest sibling) beyond the word 'repeat'.
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?
'Needs state' only restates the schema's required field; there is no when-to-use context, no note about whether the setting applies to the current device, and no mention of the shuffle sibling that a user might confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_tracksC
Add tracks to Liked Songs. Needs track_ids.
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes | Track URIs or IDs. |
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 discloses the mutation action but omits auth requirements, duplicate handling, idempotency, and any rate-limit or error behavior, leaving significant 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?
Two short sentences with the purpose front-loaded. The second sentence ('Needs track_ids.') is somewhat redundant with the required schema field but is brief enough not to waste much space.
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 1-parameter mutation with no output schema, the description gives enough to invoke the tool but lacks any usage guidance or behavioral context. It is minimally adequate but would benefit from distinguishing alternatives and noting duplicate 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?
Schema description coverage is 100% and the schema already documents track_ids as 'Track URIs or IDs.' The description adds only a redundant reminder that the parameter is required, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Add') and resource ('Liked Songs'), which distinguishes it from siblings like add_to_playlist and like_current. However, it does not explicitly name or contrast those alternatives, 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?
The description says only 'Needs track_ids', which restates the required parameter rather than offering when-to-use guidance. It does not explain when to use this tool versus add_to_playlist, like_current, or add_to_queue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search Spotify. Needs query. Returns URIs for play and add_to_queue.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Per type, 1-10. Default 10. | |
| query | Yes | Search words. | |
| types | No | Default ['track']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full disclosure burden. It usefully discloses the return type (URIs) and the required input, but says nothing about ranking, pagination (the limit-per-type behavior), or result grouping by type, which the agent must infer from 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?
Three compact sentences with zero waste: purpose, prerequisite, and return value are front-loaded in that order. Nothing is padded or repeated from the schema.
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 three-parameter search with full schema coverage, the description covers enough to invoke it, and it compensates for the missing output schema by stating that URIs are returned. It omits any note on result ordering, per-type result separation, or empty-result behavior, leaving gaps an agent would hit 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 limit, query and types are already documented, including the per-type default of 10 and the default type list. The description only restates that query is required, adding no format or semantics beyond the schema — the baseline 3 for full 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?
States a specific verb+resource ('Search Spotify') and even names the downstream consumers of its output (play, add_to_queue), which lets an agent place it in a workflow without opening a schema. It stops short of naming what content types are searched or differentiating itself from playlist-lookup siblings like find_playlist or get_playlist_tracks.
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 clause 'Returns URIs for play and add_to_queue' implies the intended usage pattern and prerequisite, and 'Needs query' flags the required input. There is no explicit when-to-use/when-not guidance or statement of how this relates to the playlist-lookup alternatives in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seekC
Jump to a position in the current track. Needs position_ms.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | No | Optional device ID from get_devices. | |
| position_ms | Yes | Milliseconds; 60000 = 1 minute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. 'Current track' implies a track must already be loaded, but nothing is said about error behavior when nothing is playing, whether playback resumes after the seek, or what the response looks like. This leaves meaningful gaps for a playback-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?
Two short, front-loaded sentences with no wasted prose. The second sentence is largely redundant with the schema's required-field marker, costing a little value.
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-parameter playback tool this is adequate but thin: no annotations and no output schema mean the description should at least clarify preconditions and post-seek behavior. It covers the core action but omits the operational context an agent needs.
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 parameters are already documented (device_id from get_devices, position_ms in milliseconds). The description adds no format or boundary detail 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 and target: jump to a position within the current track. This is clearly distinct from siblings like next, previous, and play. It stops short of naming alternatives, but the action is 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 only guidance is 'Needs position_ms,' which merely restates that the parameter is required (already enforced by the schema). There is no indication of when to use seek versus play/next/previous, nor any precondition such as playback needing an active track.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_volumeC
Set the volume. Needs volume, 0 to 100.
| Name | Required | Description | Default |
|---|---|---|---|
| volume | Yes | Percent, 0-100. | |
| device_id | No | Optional device ID from get_devices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, yet it discloses only that the operation is an absolute set with a 0-100 range. It says nothing about whether the volume applies to the current playback target, all devices, or the device referenced by device_id, and nothing about permissions or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two very short sentences, front-loaded with the action. The second sentence is largely redundant with the schema's own bounds description, which keeps it from 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 mutation tool with no annotations and no output schema, the description omits the most consequential detail: what device_id does and what happens when it is absent. An agent cannot tell whether this changes one device or the whole session.
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 parameters are already documented with type, bounds, and the cross-reference to get_devices. The description only restates the volume range, adding no meaning beyond the schema; 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 and resource ('Set the volume'), which is unambiguous and unique among the sibling playback-control tools. It stops short of 5 because it names no scope (global vs. current device) even though the schema exposes a device_id.
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 siblings, no mention of prerequisites or playback state requirements. The only usage cue is the value range, which is not a usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shuffleC
Turn shuffle on or off. Needs state.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | true = on, false = off. | |
| device_id | No | Optional device ID from get_devices. |
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 says 'Needs state' which hints at a required parameter but doesn't explain effects on the current queue, whether it persists, or returns. With no annotations and no output schema, the description is thin on behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: it states the action then the requirement. It's appropriately brief for a simple toggle, though 'Needs state' is slightly awkward phrasing.
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 toggle tool with no annotations and no output schema, the description should clarify scope (which playback/device), default behavior, and return. It leaves key operational context unspecified.
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 state parameter is fully described (true=on, false=off), and device_id is documented as optional from get_devices. The description adds nothing beyond the schema, so baseline 3 is appropriate.
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 and resource: turning shuffle on or off. However, it gives no indication of scope (playback device?) despite a sibling play/pause toolset and a device_id parameter. It's understandable but vague about what exactly is being shuffled.
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, no mention of alternatives or state requirements beyond 'Needs state.' It doesn't clarify how shuffle interacts with play, get_playback_state, or which device it applies to.
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.
26 tool updates
v0.1.0- First observed
add_current_to_playlist - First observed
add_to_playlist - First observed
add_to_queue - First observed
create_playlist - First observed
find_playlist - First observed
get_current_track - First observed
get_devices - First observed
get_playback_state - First observed
get_playlist_tracks - First observed
get_playlists - First observed
get_queue - First observed
get_saved_tracks - First observed
like_current - First observed
next - First observed
pause - First observed
play - First observed
play_liked - First observed
previous - First observed
remove_from_playlist - First observed
remove_saved_tracks - First observed
repeat - First observed
save_tracks - First observed
search - First observed
seek - First observed
set_volume - First observed
shuffle
TDQS
Scored across 26 tools
Most tools target a distinct resource or action, and descriptions specify required inputs (uri, track_ids, playlist_id). The main overlap is get_current_track vs get_playback_state, plus several convenience wrappers (like_current, add_current_to_playlist) that duplicate broader tools, but inputs make them distinguishable.
All names use snake_case and are readable. Playback controls use bare verbs (play, pause, next, seek) while most others follow verb_noun (get_devices, add_to_queue), a minor deviation that does not impair predictability.
26 tools is borderline heavy for a Spotify integration. Playback, queue, search, playlist, and library operations are broad, but several convenience wrappers (like_current, add_current_to_playlist) duplicate functionality of more general tools, so the set could be trimmed.
Core playback, queue, search, Liked Songs, and playlist creation/addition/removal are well covered. Gaps include playlist update/delete and explicit device transfer, but the main workflows are supported without dead ends.
Maintenance
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
Generate full songs with vocals, instrumentals and sound effects from text. One server for Suno, Google Lyria, Mureka, MiniMax, ACE-Step, YuE and ElevenLabs. Your agent can quote the credit cost before generating, start a song, wait for it to finish and return download links. Sign in with OAuth; optional daily credit caps; retries never charge twice.
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
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-
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI assistants like Claude Desktop to interact with Spotify's music streaming service, supporting playback control, playlist management, music search, and user profile access.412MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to control Spotify features including playback control, playlist management, search, and accessing user's listening history and preferences through the Spotify API.1ISC