mcp-spotify-free
Enables playback control and device switching to Chromecast through Spotify Connect, including sending audio to the Chromecast and performing play, resume, pause, next, and previous actions.
Provides tools for interacting with a free Spotify account: reading the Liked Songs library, searching the full Spotify catalog, inspecting playback and devices, and controlling playback (play, pause, resume, skip, volume) across Spotify Connect devices.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-spotify-freeplay my liked songs on the living room Chromecast"
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.
Why this exists
Spotify's public Web API hides the Liked Songs playlist behind Premium:
GET /v1/me/tracks answers 403 on a free account, and so does every
library-read endpoint built on it. Almost every "Spotify liked songs exporter"
on GitHub uses spotipy.current_user_saved_tracks() — Premium only.
The Spotify web player has no such restriction: it serves the full library to free users. This server speaks the same internal protocol the web player uses, so a free account gets:
its complete Liked Songs playlist (591 tracks on the reference account)
catalog search — the same search box as the web player (tracks, artists, albums, playlists, profiles), so any song can be played, not only the liked ones
real playback control — play, pause, skip, volume
device switching — send the sound to the Chromecast instead of the laptop
Every other Spotify MCP server needs Premium (checked October 2026)
A sweep of the MCP registries and PyPI/GitHub found no other Spotify MCP server that works on a plain free account. They all go through the official Spotify Web API, which means a registered developer app + OAuth, and playback is Premium-only — before Spotify tightened the API in February 2026, where the app owner must now hold Premium and Dev Mode apps are capped at 5 authorized users. For example, quoting their own docs:
marcelmarais/spotify-mcp-server— prerequisites: "A Spotify Premium account" + "A registered Spotify Developer application"mcp-spotify(PyPI) — "A Spotify Premium account (required by Spotify for Web API access)"jamiew/spotify-mcp— "Requires a Spotify Premium account"mcp-server-spotify(PyPI) /leoalord/spotify-mcp-server/iceener/spotify-streamable-mcp-server— bring your own developer app (client ID + secret + OAuth), Premium required for playback since Feb 2026
This server needs none of that: no developer app, no OAuth callback, no client secret, no Premium. It reads the session cookies of a browser where you are already logged in and speaks the web player's own protocol.
Related MCP server: Spotify MCP Server
Quick Start
npx (recommended)
npx mcp-spotify-freenpm install (global)
npm install -g mcp-spotify-free
mcp-spotify-freeFrom source
cd ~/Documents/mcp-spotify-free
python3 -m pip install -r requirements.txt
python3 server.py loginHow it works
1. Session (no password, no OAuth app, no Premium)
The server reads the Spotify cookies of a browser where you are already logged
in (open.spotify.com), decrypts them locally with the macOS keychain
(PBKDF2-HMAC-SHA1 + AES-128-CBC, the standard Chromium scheme), and
exchanges them for a short-lived user access token.
Two sources are tried, in order:
~/.config/mcp-spotify-free/cookies.json— the captured session (works with the browser closed)the browser profile itself (Edge by default) — read straight from the Chromium cookie database, nothing is dumped or copied out
spotify_session_status() tells you which one is in use and whether Spotify
still accepts it.
2. TOTP guard
open.spotify.com/api/token is protected by a 6-digit TOTP
(HMAC-SHA1, 30 s period) whose secret is XOR-obfuscated inside the web-player
bundle. spotify_free/totp.py de-obfuscates it, re-reads the live bundle on
every run (the file name changes with every Spotify release — the current one
is looked up in the open.spotify.com HTML), and keeps a hardcoded fallback
so a network hiccup never breaks the server.
3. Library
POST api-partner.spotify.com/pathfinder/v2/query — the same GraphQL-ish
gateway the web player uses — with the fetchPlaylistContents operation and
the Liked Songs playlist alias spotify:playlist:37i9dQZF1F5p3rmiWPIYgZ
(also hardcoded in the web player, not account specific).
4. Catalog search
Same gateway, searchTopResultsList operation — the endpoint behind the
web player's search box. It works on a free account.
5. Playback The Spotify Connect "harmony" command protocol:
POST connect-state/v1/player/command/from/{source}/to/{target}
PUT connect-state/v1/connect/volume/from/{source}/to/{target}Addressing the command to the Chromecast's device id is the "play on" — the audio moves from the laptop to the TV.
Device policy — the server leaves no trace
The command protocol needs a source device. Registering one would add a
permanent entry ("MCP Spotify Free") to the account's device list, and every
crashed run would leave another ghost behind. Instead the server reuses the
account's own web-player device (Web Player (Microsoft Edge)) as the
source: the commands are accepted exactly the same way, and nothing is added
to the device list. Only if no web-player device exists does the server
register one — with a stable, persisted device id, so even then the list
never grows beyond a single entry.
cleanup_devices() removes the entries left by earlier versions. It uses
DELETE /connect-state/v1/devices/{id}, which drops the entry from the
account's device list immediately (the hobs_ variant only drops the
subscription and leaves a visible ghost for hours).
IDE Integration
Cursor / Windsurf / VS Code
{
"mcpServers": {
"spotify-free": {
"command": "npx",
"args": ["mcp-spotify-free"]
}
}
}Claude Desktop
{
"mcpServers": {
"spotify-free": {
"command": "npx",
"args": ["mcp-spotify-free"]
}
}
}OpenCode / Claude Code
claude mcp add spotify-free --scope user -- npx mcp-spotify-freeThrough mcp-cli (this machine)
The server is registered in ~/.config/mcp/mcp_servers.json under
spotify-free, so it is reachable through the mcp-cli wrapper:
mcp-cli info spotify-free # list the tools
mcp-cli call spotify-free spotify_status '{}' # account + devices
mcp-cli call spotify-free play_song '{"query":"one more time","device":"Chromecast"}'
mcp-cli call spotify-free cleanup_devices '{}' # drop leftover devicesTools
get_docs()— the full usage guide, returned as one big text. Start here.spotify_status()— account, token state, liked-song count, now playing, every Connect device.list_liked_songs(limit, offset, query)— the Liked Songs playlist, newest first. Withquerythe whole library is scanned.search_liked_songs(query, limit)— only the matches, whole library.search_spotify(query, limit)— the whole catalog: tracks, artists, albums, playlists, profiles.play_song(query, device, index)— the main one: looks the title up in the Liked Songs, falls back to the catalog, and plays the best match.sourcein the answer tells you where the match came from.play_liked_song(query, device, index)— Liked Songs only.play_track(uri, device)— play a rawspotify:track:...URI.chromecast_sent(track_query, action)— the shortcut: always the Chromecast.action=play/resume/pause/next/previous.pause_playback(device)/resume_playback(device)skip_next(device)/skip_previous(device)set_volume(level, device)— 0-100.list_devices()— every Connect device with its volume and active flag.now_playing()— current track, playing/paused, position, active device.cleanup_devices()— remove the leftoverMCP Spotify FreeConnect devices of the earlier versions.spotify_session_status()— diagnose the session.spotify_login()/spotify_logout()— capture / forget the session.
Every tool returns a structured payload: ok, action, plus the relevant
data — and on failure error with a human-readable cause. When the failure is
the session (bad or expired browser cookies, 401 / 403 from the token
endpoints), the payload also carries a remedy block with paste-ready
commands for the agent: show a macOS popup explaining the login is needed,
open https://open.spotify.com in the default browser, run
spotify_login(), then retry the original call.
Typical agent flow
get_docs()
-> list_devices() # find the Chromecast
-> play_song("one more time", "Chromecast") # library first, catalog fallback
-> pause_playback()Direct use from Python
from spotify_free import SpotifyFreeClient
client = SpotifyFreeClient()
for track in client.liked_songs(limit=5):
print(track["name"], "-", ", ".join(track["artists"]), "|", track["added_at"])
hits = client.search_catalog("le songe") # the whole catalog
client.play_track(hits["tracks"][0]["uri"], device="Chromecast")
client.pause()Or run the bundled demo:
python3 examples/quickstart.pyRequirements
Item | Detail |
OS | macOS (cookie decryption uses the login keychain) |
Browser | Edge by default; Chrome, Brave, Vivaldi, Opera supported — must have an active |
Python | 3.10+ |
Environment variables:
SPOTIFY_BROWSER—edge(default),chrome,brave,vivaldi,operaSPOTIFY_COOKIES_FILE— path to a JSON file of cookies (bypasses the browser)SPOTIFY_USE_PROXY— set to1to send traffic through the system proxy (off by default: the localproxy-localplugin only carries LLM traffic)
Architecture
mcp-spotify-free/
├── server.py FastMCP server + all tool definitions
├── spotify_free/
│ ├── client.py token, library, catalog search, devices, playback
│ ├── cookies.py Chromium cookie decryption (macOS keychain)
│ ├── session.py session capture / storage / validation
│ └── totp.py web-player TOTP (de-obfuscation + auto-discovery)
├── examples/quickstart.py dependency-free demo
├── requirements.txt
└── pyproject.tomlPrivacy & terms
Cookies are read from your own machine and decrypted locally. They are never written to disk (except the captured copy in
~/.config/mcp-spotify-free/cookies.json, mode 0600) and never sent anywhere but Spotify.No password is ever handled, and no Spotify developer app / client secret is involved.
The access token lives in memory for the lifetime of the process.
Spotify's Developer Terms do not allow third-party use of the web-player token endpoint. This is a personal tool for your own account — do not ship it as a product or redistribute it.
Troubleshooting
Any session/cookie failure (
401,403,no spotify cookies found) — the failing tool returns aremedyfield instead of a dead error: it tells the calling agent to show the user a macOS popup ("log in so music can play"), to openopen.spotify.comin the default browser, tospotify_login()and retry. Nothing else to do by hand.no spotify cookies found— log in toopen.spotify.comin the browser named bySPOTIFY_BROWSER, then retry.token request failed (400)— the TOTP version moved on; the server re-reads the bundle automatically, but check thatopen.spotify.comis reachable.no active Spotify device— start the Spotify app (or any Connect device) so the account has an active player.no device matching 'x'— calllist_devices()for the exact names.A "MCP Spotify Free" entry shows up in the Spotify app — run
cleanup_devices(); it removes the entry from the account's device list.Keychain prompt on first run — macOS asks once to let
securityread the browser's Safe Storage item.
Contributing
PRs welcome. Open an issue first for non-trivial changes.
License
MIT — see LICENSE.
Available Tools
20 toolschromecast_sentChromecast SentC
Shortcut: drive the Chromecast.
Always targets the device named "Chromecast" (falls back to a Google / Chromecast device if the name differs).
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | "play" (default), "resume", "pause", "next" or "previous". | play |
| track_query | No | title / artist of a liked song to play. Leave empty to keep the current track (used with action="resume"). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does carry real behavioral weight: it discloses the hard-coded device target and the fallback to any Google/Chromecast device if the exact name is absent. It says nothing about preconditions (e.g., an active cast session), failure behavior, or side effects on the currently playing track.
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 purpose and followed by the device-targeting caveat. No filler, though the leading "Shortcut:" label is slightly redundant with the intent.
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 2-optional-param tool with full schema coverage and an output schema, the remaining gap is routing: nothing explains how this aggregate tool relates to the overlapping single-action siblings. Device targeting is the one behavioral detail it does supply.
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 both parameters are documented in-schema, including the action enumeration and the empty-track_query semantics. The description adds nothing about parameters, 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?
"Shortcut: drive the Chromecast" names the resource and frames the tool as a convenience wrapper, but "drive" is a vague verb that only becomes concrete via the schema's play/pause/next/previous actions. It draws no boundary against siblings with near-identical effects (pause_playback, resume_playback, skip_next, play_song).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to prefer this shortcut over the many sibling tools that perform the same individual actions. The agent must infer that this is a catch-all media remote, and gets no guidance on whether it supersedes or complements pause_playback/skip_next/play_song.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanup_devicesCleanup DevicesA
Remove the leftover "MCP Spotify Free" Connect devices of this server.
The server does not register a device of its own any more (it reuses the account's web-player device to send the commands), but earlier versions did - those entries are removed here, right away.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the whole burden. It does disclose the most important behavioral trait for a mutation: removal happens immediately ("removed here, right away"), implying no confirmation step and no undo. It is silent on permissions/auth requirements, idempotency (what happens when there are no leftovers), and whether the operation can affect the device the server currently reuses.
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 sentences, front-loaded with the action and target before the rationale. The parenthetical about reusing the web-player device is slightly more backstory than an agent strictly needs, but it earns its place by explaining why the leftovers exist.
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?
An output schema exists, so return values need not be described. For a destructive, unannotated, no-argument tool, though, the description should say more about safety and side effects: whether deletion is scoped strictly to this server's stale entries, whether the currently-used device is protected, and whether the call is safe to repeat. What is present is accurate, but the risk surface is only partially covered.
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 description does not pretend otherwise, so there is nothing to mis-specify. The 100% schema coverage reflects an empty properties object, so the baseline of 4 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 a precisely-scoped resource: removes leftover "MCP Spotify Free" Connect devices belonging to this server. The explanation that the server now reuses the account's web-player device makes clear this is a legacy artifact cleanup, which distinguishes it from the adjacent list_devices (read) tool. It stops short of an explicit contrast with any sibling, but the scope 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 description supplies the implied trigger (entries left behind by earlier versions of this server that no longer register their own device), so an agent can infer when the tool is relevant. However, it never states when NOT to call it, whether currently active devices could be caught in the sweep, or points to list_devices as a way to inspect first. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docsGet DocsA
Full usage guide for every tool of this server (one big text).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully warns that the return is 'one big text', hinting at payload size, but says nothing about whether the call is read-only/side-effect free or whether the content is static or server-version dependent.
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 that front-loads what the tool returns and adds the one caveat that matters ('one big text'). Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema already present, the description covers what the agent needs: what comes back and that it is large. A note that it should be consulted before first use of the other tools would make it 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?
The tool takes zero parameters, so there is nothing to document and the baseline is 4. The description correctly implies no inputs are needed.
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 a specific resource ('usage guide for every tool of this server') and states its form ('one big text'), which is unambiguous and clearly distinct from the music-playback siblings. It doesn't explicitly contrast with siblings, but the purpose is obvious from the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'usage guide for every tool' implies the agent should call it to learn how to use the server's tools, but it never says when to call it (e.g., first, or when unsure) or that alternatives exist. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesList DevicesB
List every Spotify Connect device (Chromecast, MacBook, phones, TVs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 behavioral burden. It says the tool lists 'every' device, implying enumerations are complete, but says nothing about authentication requirements, behavior when no sessions are active, or whether the list reflects idle vs. active devices — notable given the spotify_login/logout siblings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the verb and scope front-loaded, and the parenthetical examples earn their place by clarifying device coverage. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the tool is parameterless, which covers a lot. The remaining gap is operational context: whether a logged-in session is required and how the list relates to playback targets, both of which an agent needs to call this correctly at the right moment.
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. 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?
States a specific verb+resource (list Spotify Connect devices) and enriches it with concrete examples of device types. It does not, however, distinguish itself from the sibling cleanup_devices, which also operates on the device list.
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 versus cleanup_devices, nor any mention of prerequisites (e.g., needing an authenticated session before the device list is populated). The agent must infer the use case from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_liked_songsList Liked SongsC
Read the Liked Songs playlist (free accounts included).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | how many tracks to return (1-100). | |
| query | No | optional filter on title / artist / album. When set, the whole library is scanned (not only the current page). | |
| offset | No | pagination offset (0 = most recently liked first). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 behavioral burden. It implies a read operation and notes free-account support, but does not mention authentication/session requirements, pagination behavior, ordering, or what the output represents.
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 with no wasted text. It is almost too terse for a tool with multiple optional filters, but it is structurally efficient.
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 output schema and fully documented parameters reduce what the description must explain. However, it still lacks sibling differentiation and usage context, leaving the agent to infer when list_liked_songs is preferred over search_liked_songs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents limit, query, and offset thoroughly. The description adds no parameter semantics of its own, which is acceptable under the high-coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource, the Liked Songs playlist, and clarifies that free accounts are supported. It is clear what is read, but it does not differentiate this from the sibling search_liked_songs or explain scope beyond the playlist name.
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 explicit guidance on when to use this tool versus search_liked_songs, play_liked_song, or now_playing. The free-account note is an eligibility detail, not a usage condition or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
now_playingNow PlayingB
Current track, play/pause state and the active device.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 of behavioral disclosure. It implies a read-only query by describing 'current' state, but it does not explicitly state that it is read-only, whether authentication/session is required, or what happens when no track or device is 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?
The description is a single compact sentence that front-loads the key information and contains no redundant or filler content. It is appropriately sized for a simple, zero-parameter state-query tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, zero parameters, and the presence of an output schema, the description is largely complete: it names the key data points the tool exposes. It could be strengthened with an explicit read-only/session-requirement note, but the output schema covers return-value details and no parameters need explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. Per the rubric, a zero-parameter tool receives a baseline of 4.
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 identifies the resource and fields returned: current track, play/pause state, and active device. It distinguishes this from playback-control siblings and device-listing siblings by focusing on the current playback snapshot, though it lacks an explicit verb such as 'Get' or 'Retrieve'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as spotify_status, list_devices, or playback controls. The intended usage is implied by the name and field list, but no explicit context or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_playbackPause PlaybackC
Pause playback ("" = the device that is currently playing).
| Name | Required | Description | Default |
|---|---|---|---|
| device | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden, yet it discloses only that an empty device string targets the currently-playing device. It says nothing about required auth, what happens when nothing is playing, whether pausing is reversible/stateful, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, but its brevity comes at the cost of the missing information noted elsewhere rather than through tight editing of rich content.
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?
An output schema exists, so return values need not be explained, and the tool is simple with a single optional parameter. Still, for a tool with zero annotations and zero schema coverage, the description leaves device-value syntax and failure behavior undocumented.
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 0%, so the schema itself documents nothing about 'device'; the description only partially compensates by explaining the empty-string default. It never says what a non-empty value should look like (device name, ID) or that the parameter is 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?
The description states a specific verb ('Pause') and resource ('playback'), so an agent immediately knows the operation. It does not name the sibling resume_playback or otherwise explain how it differs from adjacent transport controls, so the sibling differentiation is left to the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus resume_playback, skip_next, or play_song, and no preconditions (e.g. playback must be active) are given. The only guidance offered is the parenthetical about the default device, which is about parameters rather than usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_liked_songPlay Liked SongC
Play a liked song, optionally on a specific Spotify Connect device.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | which match to use when several songs match. | |
| query | Yes | title / artist of the liked song, e.g. "one more time". | |
| device | No | device name to play on ("Chromecast", "MacBook Pro"...). Empty = the currently active device. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 behavioral burden. It mentions optional device targeting, but does not disclose authentication requirements, whether playback replaces the current queue, what happens if the query matches multiple songs, or other side effects of a playback mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. It states the action and the optional device target immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists and parameter descriptions are complete, this is a playback mutation with no annotations. The description should disclose auth prerequisites, state effects, and how it differs from sibling playback tools; those gaps make it incomplete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema. The description adds only the optional device behavior, which is already covered by the schema's device description; 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?
The description states a specific verb and resource: 'Play a liked song', with the optional Spotify Connect device target. It is clear what the tool does, but it does not explicitly distinguish itself from siblings like play_song, play_track, or search_liked_songs.
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 word 'liked' – the description does not say when to use this instead of play_song or play_track, nor does it state prerequisites such as being logged in. No exclusions or alternative-selection guidance are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_songPlay SongA
Play a song by name - Liked Songs first, then the whole catalog.
This is the tool to use when the user says "play ": it looks the title/artist up in the Liked Songs and, if nothing matches, falls back to the Spotify catalog search.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | which match to use when several match (0 = best match). | |
| query | Yes | title and/or artist, e.g. "one more time daft punk". | |
| device | No | device name to play on ("" = the device that is active). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the lookup order and fallback path, which is real behavioral context. It omits side effects an agent needs: whether calling it interrupts current playback, what happens if no device is active, and what occurs when nothing matches in the catalog.
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?
Front-loaded first sentence states the action and lookup order, followed by a short trigger paragraph. Slight redundancy between the title line and the second paragraph, but nothing extraneous.
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?
Output schema exists, so return values need no explanation, and the search-then-play mechanic is covered. For a playback-mutating tool with zero annotations, it should still say whether playback starts immediately, what device state is required, and how failures are signaled.
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 query, index, and device are already documented in the schema. The description only echoes 'by name' (title/artist), adding no disambiguation for index selection or device behavior beyond the schema text. 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 ("Play a song by name") and adds the distinguishing mechanic: Liked Songs first, then catalog fallback. That mechanic separates it from play_liked_song and play_track, but the siblings are never named, leaving the agent to infer the contrast.
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?
Explicit trigger condition: "This is the tool to use when the user says 'play <something>'." It gives a clear when-to-use but no exclusions, e.g. when to prefer play_track with a known ID or play_liked_song directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_trackPlay TrackB
Play a raw Spotify track URI on a device.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | "spotify:track:xxxxx" or a bare track id. | |
| device | No | device name ("" = active device). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 of behavioral disclosure. It does not mention authentication requirements, what happens if no device is active, whether current playback is interrupted, or error behavior for invalid URIs.
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 with no wasted text. It is concise, though its brevity contributes to gaps in behavioral and usage guidance rather than being a pure strength.
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, has full schema coverage, and has an output schema, reducing what the description must explain. However, with no annotations, it should at least mention Spotify session requirements or active-device fallback behavior to be fully 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 both the uri and device parameters are already documented in the schema. The description adds no parameter-level meaning beyond those definitions, making the baseline score 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?
The description states a specific verb and resource: 'Play a raw Spotify track URI on a device.' This clearly identifies the operation, but it does not explicitly differentiate this tool from siblings such as play_song or play_liked_song.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'raw Spotify track URI' implies this tool is for callers that already have a track URI, but it never explicitly states when to use it instead of play_song or play_liked_song. Usage is inferable but not directly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_playbackResume PlaybackC
Resume playback ("" = the device that is currently playing).
| Name | Required | Description | Default |
|---|---|---|---|
| device | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full disclosure burden, yet it says nothing about authentication, whether it fails when nothing is paused, or what happens with no active session. The only behavioral hint is the default-device note, which is really parameter semantics rather than 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?
A single short sentence with no waste and the key verb front-loaded. The parenthetical starting with an empty-string literal reads awkwardly, which slightly hurts scannability.
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?
An output schema exists, so return values needn't be explained, and there is only one optional parameter. Still, for a no-annotation tool the description should mention at least the auth/session prerequisite and the failure mode when nothing is paused.
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 0%, so the description must compensate; it does explain that an empty string means 'the device that is currently playing', which is genuinely useful. However, that is the only parameter and the explanation is terse, leaving device-name format/validity unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Resume playback'), which an agent can distinguish from siblings like pause_playback and play_song by name alone. It stops short of explicitly contrasting itself with those siblings, so it doesn't reach a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool vs alternatives such as play_song or play_track, and no preconditions (e.g. must be paused, must have an active session). Usage is only implied by the verb 'resume'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_liked_songsSearch Liked SongsA
Search the whole Liked Songs library for a title / artist / album.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | maximum number of matches to return. | |
| query | Yes | text to look for, e.g. "daft punk", "one more time". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden. It contributes the meaningful scope fact that the search covers the entire library (not a filtered subset), and 'search' strongly implies a read-only operation, but it never explicitly confirms non-mutation, result ranking, or behavior when matches exceed the limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scope constraint arrives before the field list, and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully documented two-parameter schema and an output schema covering return values, the description is nearly sufficient. The only real gap is routing guidance among the many siblings (search_spotify, list_liked_songs, play_liked_song) for a library that could be large.
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%, establishing a baseline of 3, but the description goes further by specifying that the query matches against title, artist, and album — a detail the schema's generic 'text to look for' does not convey. The limit parameter is left entirely to 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 concrete verb (Search) and a concrete resource scope (the whole Liked Songs library) and names the fields matched (title / artist / album). This distinguishes it implicitly from list_liked_songs (enumeration) and search_spotify (catalog-wide), though it never names those siblings 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?
The phrase 'the whole Liked Songs library' gives an implied routing rule — use this when the target is the user's saved library rather than all of Spotify — but the description never states when to prefer list_liked_songs or search_spotify, and offers no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_spotifySearch SpotifyA
Search the whole Spotify catalog (not only your library).
Same search box as the web player: tracks, artists, albums, playlists and profiles. Use it when the song is not in the Liked Songs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | maximum number of results per category (1-50). | |
| query | Yes | title, artist, album or playlist to look for. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 usefully discloses that results span tracks, artists, albums, playlists and profiles, and that the search covers the whole catalog rather than the user's library. However, it says nothing about authentication expectations (a spotify_login sibling exists), rate limits, or result ordering, leaving meaningful behavioral gaps for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope statement is front-loaded in the first sentence and each following sentence adds new information (result categories, usage condition). The 'same search box as the web player' analogy is a bit of filler but does convey matching behavior, so it mostly earns 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?
With a 100%-covered schema, only two parameters, and an output schema present, return values and parameters need no further explanation. The remaining gap is behavioral context such as auth requirements, which matters less for an obviously read-only search but is still unstated.
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 'query' and 'limit' documented in the schema itself, so the baseline of 3 applies. The description's mention of the categories searchable adds marginal framing but 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?
The description states a specific verb and resource ('Search the whole Spotify catalog') and adds scope contrast ('not only your library'), which differentiates it from the search_liked_songs sibling. It stops short of naming the sibling explicitly, but the resource boundary is clear enough for an agent to choose correctly.
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 gives an explicit selection condition: 'Use it when the song is not in the Liked Songs,' which effectively routes the agent away from the library-scoped search tools. There is no explicit when-not guidance or named alternative, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_volumeSet VolumeB
Set the volume of a device (0-100).
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | 0 = mute, 100 = max. | |
| device | No | device name ("" = active device). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 behavioral burden and mostly fails: it does not say whether the change persists, whether level 0 doubles as mute, what happens if the named device is missing/offline, or what errors may surface. Only the mutation intent is conveyed.
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 the operation and range front-loaded and zero filler. Nothing in it is wasted, though the terseness leaves gaps addressed in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the two-parameter surface is simple. Still, with no annotations a real description should mention device/connection prerequisites and failure modes for a mutation targeting external hardware.
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% — the schema already documents `level` (0 = mute, 100 = max) and `device` ("" = active device). The description's '(0-100)' restates the schema rather than adding new meaning, 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 and resource (set the volume of a device) plus the accepted range, so an agent knows exactly what the call does. It does not name or differentiate against any sibling, though none of the listed siblings overlap with volume control.
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, no prerequisites (e.g. whether an active/host device or Chromecast session is required), and no statement about behavior when no device is specified beyond the schema's default.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_nextSkip NextC
Skip to the next track.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it says nothing about required auth/session state, what happens at the end of a queue, or that it mutates playback state. 'Skip' implies a state change, but the operational preconditions are undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. It is efficient, though its brevity is also the source of the missing detail rather than a deliberate trade-off.
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 an output schema covers return values, so grand detail isn't needed. However, the undocumented 'device' parameter and unstated session/playback preconditions leave real gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'device' parameter (an untyped free string with an empty default) is never mentioned in the description. The agent cannot tell whether it expects a device ID, name, or whether omitting it targets the active device.
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.' Combined with the name, an agent can tell it apart from siblings like skip_previous and play_track without opening the schema. It stops short of explicitly differentiating, 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?
No guidance on when to use this versus play_track, resume_playback, or skip_previous, and no prerequisites such as an active Spotify session or playing device. The agent must infer that playback is already underway.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_previousSkip PreviousC
Go back to the previous track.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior, but it only says it navigates backward. It does not explain active-device targeting, session/auth requirements, behavior at the start of a queue, or whether it restarts the current track.
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 with no filler or repetition. Its brevity is efficient, even though other dimensions reveal missing 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 simple playback-control tool with an output schema, the core action is understandable. However, with no annotations and an undocumented device parameter, the description omits relevant calling context such as which device is affected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter is optional 'device', and schema description coverage is 0%. The description never mentions the parameter or how to use it, so it adds no semantics beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific playback action ('go back to the previous track'), so the action and target are clear. It does not explicitly contrast with siblings such as skip_next or play_track, so it is clear but not fully differentiated.
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 explicit when-to-use guidance, no prerequisites, and no alternative named. The only usage signal is the implied meaning of 'previous track'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_loginSpotify LoginA
Capture a working Spotify session (free account is enough).
Tries, in order: the stored session, then the browser profile. If the browser keeps the session cookie in memory, the user is asked to quit the browser (Cmd+Q) so Chromium flushes it to disk - the tool keeps polling until the session is captured, then stores it on the filesystem so later runs work without the browser.
| Name | Required | Description | Default |
|---|---|---|---|
| browser | No | "edge" (default), "chrome", "brave", "vivaldi" or "opera". | |
| timeout | No | how long to wait for the user, in seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 does substantial work: it discloses that the tool is interactive (asks the user to quit the browser with Cmd+Q), that it blocks and polls until capture, and that it writes the session to the filesystem so later runs skip the browser. That persistence side effect and the user-interruption requirement are exactly the traits an agent needs. It stops short of saying what happens if the timeout elapses or the capture fails, and doesn't state that the user must already be logged in to Spotify in the browser.
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 core purpose is front-loaded in a single short sentence, with mechanics following. The second sentence is long and clause-heavy but each clause (fallback order, Cmd+Q flush, polling, persistence) conveys distinct operational information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an interactive, filesystem-writing tool with no annotations and an output schema already present, the description covers the important unknowns: interactivity, blocking/polling, and persistent storage. The notable remaining gap is failure behavior on timeout and the precondition that the browser must be logged into Spotify.
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 browser and timeout parameters are already documented in the schema. The description only implicitly touches timeout ('keeps polling until the session is captured') and adds nothing about the browser values or what happens when the wait expires, so it does not meaningfully exceed the schema baseline.
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 ('Capture a working Spotify session') and immediately scopes the prerequisite ('free account is enough'). The described fallback chain (stored session, then browser profile) makes it unmistakably distinct from sibling tools like spotify_session_status or spotify_logout, which inspect or destroy rather than capture a session.
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 explains the internal order of attempts and the interactive escalation path, which implies when this tool is needed (no usable stored session yet). However, it never states when to call this versus spotify_session_status or what to do if a session already exists, leaving the selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_logoutSpotify LogoutA
Forget the stored session (does not log the account out of Spotify).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 that this only forgets the stored session and does not log the account out of Spotify, which is the key behavioral distinction an agent needs. However, it does not mention whether re-login is required afterward, whether this affects current playback, or any auth/confirmation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that immediately states the action and its key limitation. Every part of the sentence earns 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?
For a zero-parameter tool with an output schema, the description is largely complete: it explains the action and the critical non-effect. It could be improved by naming the related login/session tools as alternatives, but no essential calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to explain. The baseline for zero params is 4, and the description does not need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Forget the stored session.' It also clarifies the important distinction that this does not log the account out of Spotify, which helps separate it from a full account logout. It does not explicitly distinguish itself from siblings such as spotify_login or spotify_session_status, keeping it from 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?
Usage is implied by 'Forget the stored session,' suggesting it should be used when clearing the local session. The clarification that it does not log the account out provides a useful boundary, but there is no explicit guidance on when to use this versus spotify_login or spotify_session_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_session_statusSpotify Session StatusB
Diagnose the session: where the cookies come from and if they work.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 that the tool inspects cookie origin and validity — meaningful behavioral context beyond the name. It stops short of saying whether this is strictly read-only, whether it exposes credential material, or how it behaves when no session 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 front-loaded sentence with no filler, and the diagnostic target is stated before the detail. It is arguably compressed to the point of using jargon ('where the cookies come from') that an agent must interpret.
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?
An output schema exists, so return values need not be explained, and zero parameters means no input complexity. Still, for an unannotated diagnostic tool, the description omits failure modes and the login precondition, which are the main things an agent needs to interpret the result.
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; no parameter information is missing.
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 verb 'Diagnose' and resource 'session' are specific, and the description clarifies the diagnostic focus is cookie provenance and validity, which separates it from a plain status read. It does not, however, name or contrast with the sibling 'spotify_status', so an agent must infer the boundary between the two.
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 explicit statement of when to call this versus 'spotify_status', 'spotify_login', or 'spotify_logout', and no prerequisites such as needing prior login. The troubleshooting intent is only implied by the word 'Diagnose'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spotify_statusSpotify StatusB
Account, token, library size, now playing and every Connect device.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden; it does enumerate the scope of what is gathered (including token state, implying auth/diagnostic context), which helps. However it never states this is a read-only aggregate, how many upstream calls it makes, or what happens when unauthenticated — the most decision-relevant facts for an agent.
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 clause with no filler, and the informational payoff is front-loaded. It is a fragment without a verb, which costs a bit of clarity but keeps it efficient.
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?
An output schema exists, so return shape is covered and the description needn't explain it. But given heavy sibling overlap (spotify_session_status, now_playing, list_devices) and no annotations, the description should have clarified the selection boundary; that omission leaves an agent able to call the wrong tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly does not waste words on nonexistent inputs.
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 noun list of returned data (account, token, library size, now playing, devices) rather than a verb+resource statement of what the tool does. It conveys the aggregate/status nature but never distinguishes this from siblings like spotify_session_status, now_playing, and list_devices, which appear to return subsets of the same data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this aggregate status call versus spotify_session_status, now_playing, or list_devices, all of which overlap significantly. An agent must guess whether this is a diagnostic/dashboard call or a substitute for the narrower tools.
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.
20 tool updates
v1.1.1- First observed
chromecast_sent - First observed
cleanup_devices - First observed
get_docs - First observed
list_devices - First observed
list_liked_songs - First observed
now_playing - First observed
pause_playback - First observed
play_liked_song - First observed
play_song - First observed
play_track - First observed
resume_playback - First observed
search_liked_songs - First observed
search_spotify - First observed
set_volume - First observed
skip_next - First observed
skip_previous - First observed
spotify_login - First observed
spotify_logout - First observed
spotify_session_status - First observed
spotify_status
TDQS
Scored across 20 tools
The playback trio play_song / play_liked_song / play_track all ultimately start playback of a track, and an agent could easily misselect between them (play_song already falls back to catalog search and can target devices, so play_liked_song's niche is thin). Similarly search_liked_songs vs list_liked_songs vs search_spotify borders on overlapping, though descriptions do help distinguish library vs catalog. The rest (pause/resume/skip/volume/devices/session) are clearly distinct.
Most tools follow a snake_case verb_noun pattern (play_song, list_devices, set_volume, search_spotify), with a consistent spotify_ prefix on session tools. Outliers are chromecast_sent (a noun/past-tense name that doesn't describe an action) and now_playing (noun phrase), but overall the convention is readable and predictable.
At 20 tools this sits at the heavy end of the recommended 3-15 range for what is essentially a single-domain playback controller. Some of that weight comes from near-duplicate playback entries and a bulky get_docs tool that could be folded into status output.
Core lifecycle is covered: session login/logout/status, device listing and cleanup, play/pause/resume/skip forward-back, volume, search, library listing and now-playing. Minor gaps remain (no seek/position, no shuffle or repeat, no queue management, no playlist creation), but an agent can work around these for the stated free-account playback purpose.
Maintenance
Related MCP Connectors
Read-only access to your bank, investment, and crypto accounts: balances, transactions, holdings.
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
Read your Savee saves, boards and home feed, and search its public library. Read-only.
Personal context and preferences for AI via OAuth-approved profile sections and taste data.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI assistants to control Spotify playback, search for music, manage playlists, and interact with your Spotify library through natural language commands.19-
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Spotify playback, search music, manage playlists and library, and access user listening insights via the Spotify Web API.-
- AlicenseAqualityDmaintenanceEnables searching and managing Spotify playlists, tracks, and user information through the Spotify Web API.10MIT
- AlicenseNot gradedqualityCmaintenanceEnables control of Spotify playback via the official Web API, including search/play, pause, skip, volume, queue, and device management.31 npm1MIT