spotify-mcp
Provides tools and resources for interacting with a user's Spotify account, including searching tracks, managing playlists, controlling playback, and retrieving listening history and top items.
Allows importing a YouTube video's tracklist (from chapters or description) into a new or existing Spotify playlist.
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-mcpSearch for 'Blinding Lights' and add it to my Chill playlist"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
spotify-mcp
An MCP (Model Context Protocol) server for interacting with the Spotify Web API, built with Python and FastAPI. Runs locally — an MCP host (Claude Desktop, Claude Code, etc.) launches it as a subprocess on your own machine.
This is a portfolio project by Paco Molina. The reasoning behind every architecture decision — and why — is logged in journal/, one entry per decision, in the order they were made.
Example
A real exchange with import_youtube_playlist, pulling new tracks from a YouTube mix's chapter list into an existing Spotify playlist (see journal entry 24 for the full story):
You: Pull any new songs from this YouTube mix into my "Chill" playlist: youtube.com/watch?v=...
Claude: (calls
import_youtube_playlist) Found 14 tracklist entries in the video's chapters. 7 matched confidently on Spotify and were added; 7 were skipped — 4 pointed at the same wrong song (likely unreleased tracks not on Spotify), 2 didn't match any plausible artist, and 1 was a non-track marker ("LOOP"). Your playlist went from 3 to 10 tracks.
Related MCP server: Spotify MCP Server
How it works
MCP is an open protocol that lets an AI client (like Claude) talk to external tools and data sources through a standard interface, instead of custom one-off integrations. A client connects to a server, and the server exposes three kinds of things: tools — functions the model actively decides to call, with a name, description, and typed schema generated from the function's signature and docstring; resources — read-only, URI-addressed data (e.g. spotify://me/now-playing) meant to be listed and attached to context more like a referenced document than an invoked action; and prompts — reusable prompt templates the host can surface directly to the user (often as a quick-access menu) that kick off a specific workflow with a pre-written message.
This project is two small, single-purpose local programs:
The MCP server itself (
spotify_mcp.cli, thespotify-mcpcommand), talking to its host over stdio — the host process launches it and communicates over stdin/stdout, no network involved. This is what an MCP-compatible client actually connects to.A local login helper (
spotify_mcp.main, a small FastAPI app), run separately, that handles the Spotify OAuth2 (Authorization Code + PKCE) flow at/auth/loginand/auth/callback. Spotify data (like "what's currently playing") is user-specific, so a logged-in user's access token is needed to call the Spotify API on their behalf. The login step needs a browser and an HTTP redirect regardless of how the MCP server itself talks to its host — that's a property of OAuth, not of MCP transport — so it's kept as its own small process rather than folded into the stdio one.
Once logged in, the access/refresh token pair is stored in a small SQLite database, shared by both processes, and transparently refreshed when it's close to expiring.
graph TD
Host["MCP Host<br/>(e.g. Claude Desktop / Claude Code)"]
Browser["User's Browser"]
subgraph Stdio["MCP server process (stdio)"]
MCPServer["mcp_server.run()<br/>stdio transport"]
Tools["MCP tools<br/>search, now_playing, top_tracks, ..."]
Resources["MCP resources<br/>spotify://me/now-playing, ..."]
Prompts["MCP prompts<br/>build_playlist, listening_recap, ..."]
end
subgraph LoginApp["Login helper (FastAPI, run separately)"]
AuthRoutes["/auth/login, /auth/callback<br/>(OAuth2 + PKCE)"]
end
SpotifyClient["Spotify client (httpx)"]
DB[("SQLite<br/>spotify_mcp.db")]
SpotifyAPI["api.spotify.com"]
SpotifyAuth["accounts.spotify.com"]
Host -->|"spawns as subprocess, stdin/stdout"| MCPServer
MCPServer --> Tools
MCPServer --> Resources
MCPServer --> Prompts
Tools --> SpotifyClient
Resources --> SpotifyClient
Prompts -.->|"guides toward"| Tools
Browser --> AuthRoutes
AuthRoutes -->|"redirect + code"| SpotifyAuth
SpotifyAuth -->|"redirect back"| AuthRoutes
AuthRoutes -->|"store token"| DB
SpotifyClient -->|"read / refresh token"| DB
SpotifyClient -->|"Authorization: Bearer access_token"| SpotifyAPIAvailable tools
Tool | Description |
| Health check — confirms the MCP server is reachable. |
| Search Spotify's catalog for tracks matching a query. |
| Get the track currently playing on the logged-in user's account, if any. |
| Get the user's most-listened-to tracks (short/medium/long term). |
| Get the user's most-listened-to artists (short/medium/long term). |
| Get the user's most recently played tracks. |
| List the logged-in user's playlists. |
| List the tracks in a playlist. |
| Create a new playlist. ⚠️ |
| Add one or more tracks to a playlist. |
| Remove one or more tracks from a playlist. |
| Discover existing curated Spotify playlists matching a query (name/owner/description only — can't read tracks of playlists you don't own). |
| Build a new Spotify playlist from a YouTube video's tracklist (chapters/description — no audio recognition). ⚠️ Same |
| Turn shuffle mode on or off. |
| Set repeat mode (track/context/off). |
| Seek to a position in the currently playing track. |
| List the user's saved ("Liked Songs") tracks. |
| Save tracks to Liked Songs. ⚠️ requires Spotify's Extended Quota Mode — fails with a permissions error on apps without it (like this one, by default). |
| Remove tracks from Liked Songs. Same restriction as |
| List Spotify devices already open (phone, desktop, web player, ...) and which is active. |
| Switch playback to a specific device. Can't launch Spotify itself — only controls devices already running somewhere. |
| Pause playback on the active device. |
| Resume/start playback on the active device. |
| Skip to the next track. |
| Skip to the previous track. |
| Set playback volume (0-100). |
| Add a track to the playback queue. |
Available resources
Read-only, returned as JSON.
Resource | Description |
| The track currently playing, if any. |
| The logged-in user's playlists. |
| The tracks in a specific playlist. |
| Basic profile: id, display name, followers, URL/image. |
| One-shot snapshot: now playing, devices, top tracks, recently played. |
Available prompts
Quick-access templates a host can surface to kick off a workflow.
Prompt | Description |
| Build a themed playlist using the model's own music knowledge (not generic search phrases). |
| A friendly summary of current listening, via the dashboard resource. |
| Import a YouTube video's tracklist into a new playlist. |
| Get music playing — check what's active, or help pick a device if nothing is. |
| Build a new playlist from a themed subset of the user's Liked Songs. |
Setup
Requires Python 3.14+ and a Spotify account.
1. Install dependencies — pick one:
uv sync # with uv (recommended)pip install -r requirements.txt # or with plain pip — kept in sync with pyproject.toml via `uv export`2. Configure and log in:
cp .env.example .env # then set SPOTIFY_CLIENT_ID in .env — see below
uv run spotify-mcp login # opens your browser, log in once(Installed with plain pip? Drop the uv run prefix — just spotify-mcp login.)
loginopens a real browser window on the machine it runs on and waits for the OAuth redirect to reach127.0.0.1. Run it on your own local machine — it won't work over SSH or in a remote/headless sandbox with no browser to open.
SPOTIFY_CLIENT_ID: create a Spotify app → add http://127.0.0.1:8000/auth/callback as a Redirect URI → check Web API → copy the Client ID (no secret needed, this uses PKCE) → paste into .env.
Register it with your MCP host:
Claude Code — from the repo root:
claude mcp add spotify-mcp -- uv run --directory "$(pwd)" spotify-mcpOther hosts (Claude Desktop, etc.) — add to the host's MCP config:
{
"mcpServers": {
"spotify-mcp": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/spotify-mcp", "spotify-mcp"]
}
}
}Testing
uv run pytestTests run against an isolated, throwaway SQLite database and mocked Spotify API responses — they never touch a real Spotify account or the local spotify_mcp.db. See journal entry 11 for details.
Linting and formatting
uv run ruff check . # lint
uv run ruff format . # format
uv run mypy # type checkBoth run in CI (see the badge above). To run them automatically before each commit:
uv run pre-commit installLicense
MIT — see the license file for details.
Author
Built by Paco Molina.
Available Tools
27 toolsactivate_deviceA
Switch playback to a specific device (from list_devices) and optionally start playing on it.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes | ||
| start_playing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description is the only behavioral disclosure. It states the two main effects—switching playback target and optionally starting playback—but does not mention prerequisites or failure behavior. This is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, and no filler. The parenthetical source and the optional behavior are both useful and earned.
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 low-complexity two-parameter tool with an output schema, the description covers the required workflow and both parameter intents. Missing edge cases like inactive sessions or unavailable devices are minor for this simple command.
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 description must supply meaning for the parameters. It does: 'specific device (from list_devices)' explains device_id, and 'optionally start playing' explains start_playing. The schema still carries the default value and requirement details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Switch') and a clear resource ('playback to a specific device'), and explicitly references list_devices, which distinguishes it from the listing tool and other playback controls among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(from list_devices)' tells the agent where to get the device_id, establishing a clear call sequence. It does not provide explicit exclusions, but the usage context is unambiguous enough for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tracksA
Add one or more tracks to a playlist. playlist_id and track_ids come from create_user_playlist / list_user_playlists and search_track.
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes | ||
| playlist_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 basic add operation but does not mention whether tracks are appended, duplicates are allowed, authorization is required, or whether existing playlist contents are affected. For a mutating tool, this is a notable 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 sentences, no filler, and the core purpose is front-loaded. The ID provenance sentence earns its place and is directly actionable.
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 an output schema, the description is largely complete: purpose, parameter sources, and required fields are covered. It falls slightly short only on behavioral side effects and explicit alternative routing, which are secondary for a basic add operation.
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 description must compensate. It adds helpful provenance by telling the agent that playlist_id and track_ids come from specific tools, which is meaningful beyond bare parameter names. It does not fully elaborate value formats or constraints, but the source guidance is useful.
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: 'Add one or more tracks to a playlist.' This clearly distinguishes the tool from siblings like remove_tracks and playlist_tracks, and even sets it apart from search_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?
The description implies usage by saying the IDs come from creation/list/search tools, which prevents an agent from inventing IDs. However, it does not explicitly state when to use this tool versus alternatives like remove_tracks, nor does it provide when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_user_playlistA
Create a new playlist in the logged-in user's Spotify account.
⚠️ public=False is currently ignored by Spotify's API — playlists are
created public regardless (confirmed bug on Spotify's side, not this
server; see journal entry 30).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| public | No | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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. It explicitly discloses that the `public` parameter is ignored by Spotify's API, a valuable behavioral quirk that affects usage. It does not cover other potential behaviors like authentication or side effects, but for a creation operation, the disclosed bug is significant and helpful.
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 two sentences, with the purpose front-loaded and the warning presented clearly. Every word earns its place, and the use of a warning symbol draws attention to the critical behavioral note without unnecessary 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?
Given the tool's simplicity and the presence of an output schema, the description adequately covers the core purpose and a known caveat. It does not mention prerequisites like authentication, but that is implicitly expected for a Spotify API tool. Overall, it provides sufficient context for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning to parameters. It directly addresses the `public` parameter, clarifying its effective behavior despite the default. The `name` and `description` parameters are self-explanatory from their names and types, so no further explanation is critical, but the description could have added more details about them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Create') and resource ('new playlist in the logged-in user's Spotify account'), which precisely distinguishes it from sibling tools like list_user_playlists and find_playlists. It leaves no ambiguity about the tool's primary function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose is evident from the name and description, making the appropriate usage context clear (creating a playlist). However, it does not explicitly mention when to avoid this tool or list alternatives, but given the sibling set, the distinction is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_playlistsA
Search Spotify for existing curated playlists matching a query (e.g. 'lofi coding beats'). Use this to recommend/discover an existing playlist. Note: tracks inside a playlist you don't own can't be read via this API (only its name/description/owner) — playlist_tracks only works on your own playlists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
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 takes on the full disclosure burden and adds a genuinely important limitation: non-owned playlist searches return only name/description/owner, and playlist_tracks only works on owned playlists. It stops short of covering auth or search matching behavior, but it goes well beyond a bare 'search playlists' statement.
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 sentences, each earning its place: the search action, the intended use case, and the key API limitation. The caveat is placed at the end so the core purpose is front-loaded.
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 search tool with an output schema available, the description covers purpose, use case, and the critical limitation. It could be slightly richer on how results are scoped (e.g., own vs. public playlists), but nothing essential is missing for a correct call.
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 description must compensate. It clarifies the query parameter with a concrete example ('lofi coding beats'), but it does not explain the limit parameter's behavior, maximum value, or pagination, leaving some semantics implicit.
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 opening phrase 'Search Spotify for existing curated playlists matching a query' names a specific verb, resource, and scope. The added use case 'recommend/discover an existing playlist' plus the contrast with playlist_tracks makes it easy to distinguish from sibling tools like list_user_playlists.
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 explicitly states when to use this tool ('Use this to recommend/discover an existing playlist') and gives a clarifying limitation about reading tracks. It does not explicitly enumerate alternatives or when-not-to-use conditions, but the context is clear enough for an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_youtube_playlistA
Extract a tracklist from a YouTube video's chapters or description (for videos that list their songs — mixes, compilations, study/focus playlists, etc.), look each one up on Spotify, and add whatever matches to a new playlist. Best-effort: only works for videos with a written tracklist (no audio recognition); entries are skipped rather than guessed when the Spotify result's artist doesn't match the tracklist entry's artist (common for "unreleased"/"coming soon" tracks that aren't on Spotify at all).
⚠️ public=False is currently ignored by Spotify's API — playlists are
created public regardless (confirmed bug on Spotify's side, not this
server; see journal entry 30).
| Name | Required | Description | Default |
|---|---|---|---|
| public | No | ||
| description | No | ||
| youtube_url | Yes | ||
| playlist_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It goes well beyond the schema by explaining best-effort behavior, skip rules when Spotify artist matches fail, handling of unreleased/coming-soon tracks, and the important public=False bug with a reference to a journal entry.
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 well-structured: the core purpose is front-loaded, followed by the best-effort caveat and the critical public flag warning. Every sentence earns its place and the content is scannable compact prose rather than verbose 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 multi-step import tool with no annotations, the description covers input expectations, success conditions, failure/skip behavior, and a known API bug. It is largely complete for invocation, though a bit more detail on the description parameter would make it fully self-contained. The presence of an output schema reduces the need to explain return values.
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 description must compensate for missing parameter docs. It adds meaningful context for public (ignored by Spotify) and implicitly references playlist_name via 'new playlist', but it does not explain the description parameter at all, and youtube_url format is only inferred from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific composite workflow: extract a tracklist from a YouTube video's chapters or description, look each track up on Spotify, and add matches to a new playlist. This distinguishes it from sibling tools like search_track, add_tracks, and create_user_playlist, which only handle portions of this flow.
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 explicitly specifies when to use the tool: for videos that list their songs, such as mixes, compilations, and study/focus playlists, and only when a written tracklist is available. It also states that audio recognition is not performed. It does not name alternative sibling tools for different situations, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
liked_songsA
List the user's saved ("Liked Songs") tracks. limit is capped at 50 by Spotify — pass a higher offset in a follow-up call to page through more (the user may have hundreds or thousands of saved tracks).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. It usefully discloses that Spotify caps limit at 50 and instructs callers to use a higher offset for pagination. This is meaningful behavioral information beyond the bare 'List' operation, though it doesn't discuss authentication or response shape.
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 tight sentences with no filler. The primary action is front-loaded, and the important pagination constraint follows immediately. Every word 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 simple two-parameter list operation, the description covers the tool's purpose, the parameter constraints, and the pagination behavior. An output schema exists, so return-value details are already available. Nothing essential is missing for an agent to invoke this 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 schema has no descriptions for limit or offset, so the description must compensate. It explains limit's cap at 50 and implies offset's role in pagination with 'pass a higher offset in a follow-up call.' This is adequate for both parameters, though offset could be defined more explicitly as a skip count.
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 opens with a specific verb+resource: 'List the user's saved ("Liked Songs") tracks.' It clearly identifies the exact data being returned and distinguishes it from playlists or top tracks. The parenthetical 'Liked Songs' removes ambiguity about what 'saved' means.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case — retrieving a user's liked/saved tracks — but it does not explicitly compare against sibling tools like playlist_tracks or list_user_playlists. It gives no 'use this instead of X' guidance, though the resource name itself makes the intended scenario fairly clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
like_tracksA
Save one or more tracks to the user's Liked Songs. track_ids come from search_track / playlist_tracks / top_tracks. Note: Spotify restricts this endpoint to apps with "Extended Quota Mode" approval — it may fail with a permissions error on apps that don't have it.
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes |
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 discloses the mutation (saving) and a critical behavioral trait: the endpoint may fail with a permissions error for apps without Extended Quota Mode. However, it does not mention side effects like idempotency, partial success handling, rate limits, or the need for authentication. The disclosure is useful but not comprehensive.
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 three sentences with no wasted words. The action is front-loaded, the source of IDs is given in the second sentence, and a critical permission warning is included last. Every sentence contributes meaningful 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?
Given the tool's simplicity (one parameter, no nested objects) and the existence of an output schema, the description covers the essential points: what it does, where parameters come from, and a key operational caveat. It does not explain the return value (covered by output schema) or mention authentication, but for a single-action tool this is reasonably complete. Missing details like error handling on invalid IDs are minor.
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 description must compensate. It adds meaning by stating track_ids come from specific tools (search_track, playlist_tracks, top_tracks), which clarifies the expected format (Spotify track IDs). However, it does not specify constraints like maximum array length, whether duplicate IDs are allowed, or whether an empty array is valid. It adds some value but leaves gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Save one or more tracks to the user's Liked Songs'), identifying the verb and resource. It distinguishes from sibling tools like unlike_tracks (removing) and add_tracks (adding to a playlist) by naming the target as Liked Songs. It also specifies the source of track_ids, which further clarifies the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context by indicating where track_ids come from (search_track / playlist_tracks / top_tracks), which implicitly tells the agent when to use this tool. However, it does not explicitly compare to alternatives like add_tracks or unlike_tracks, nor does it state when not to use it. The permission caveat adds a practical constraint but does not replace clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesA
List the Spotify devices currently known to the user's account (phone, desktop app, web player, speakers, ...), including which one (if any) is active. Use this to see what's available before calling activate_device — the Spotify API can only control a device that's already open somewhere, it can't launch Spotify from nothing.
| 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?
Since no annotations are provided, the description must carry the full behavioral burden. It does disclose a key API limitation (cannot launch Spotify) and implies a read-only listing operation. However, it omits details like pagination, empty-list behavior, or authentication requirements. While these are not critical for a simple list tool, the description does not explicitly state that it is read-only or describe any error conditions, leaving some behavioral ambiguity.
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 composed of two succinct sentences. The first sentence states the core function, and the second adds essential usage context. There is no redundant phrasing, and the most important information (what it lists) appears first. It is appropriately sized and front-loaded.
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 no-parameter read-only tool with an output schema (as indicated by context signals), the description is complete. It specifies what is returned (devices, including active one), gives usage context, and notes an important API constraint. The output schema can handle return structure details, so no additional explanation is needed. Nothing critical is missing 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?
The tool takes no parameters, so there is nothing for the description to elaborate. The input schema is empty and schema coverage is 100% (trivially). Baseline for a zero-parameter tool is 4, and the description adds no unnecessary parameter information. It is accurate and does not create confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: listing all Spotify devices known to the user's account, including which is active. It uses a specific verb ('list') and resource ('devices'), and the detail about including the active device differentiates it from other list tools like list_user_playlists. The phrasing is unambiguous and immediately conveys the tool's scope.
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 explicitly instructs to use this tool before calling activate_device, and explains why: the Spotify API can only control a device that is already open and cannot launch Spotify from nothing. This provides a clear when-to-use directive and the underlying rationale, which is highly actionable for an agent deciding between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_playlistsA
List the logged-in user's Spotify playlists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It clearly implies a read-only listing operation scoped to the authenticated user, but it does not mention pagination, limit behavior, whether followed playlists are included, or authentication requirements. This is minimal but not misleading.
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 sentence that is front-loaded with the action and resource, containing no filler or redundant detail. It is appropriately concise for the tool's simplicity.
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 list operation with an output schema, the description captures the core behavior and user scope. It omits pagination and limit details, but the schema's default and title partly compensate, making this adequate though not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one optional parameter, limit, with 0% description coverage, and the description does not mention limit or pagination at all. The parameter's title and default provide some meaning, but the description adds no additional semantic value for this parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a specific resource ('the logged-in user's Spotify playlists'), making the tool's purpose immediately clear. The 'logged-in user' qualifier distinguishes it from sibling tools like find_playlists or create_user_playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as find_playlists or create_user_playlist. The 'logged-in user' phrasing implies current-user scope, but there are no explicit conditions, exclusions, or references to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
now_playingA
Get the track currently playing on the user's Spotify account, if any.
| 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 provided, the description carries the disclosure burden. It communicates that this is a read/get operation and that the result may be empty ('if any'), but it does not explicitly state that it is non-mutating or describe behavior when nothing is playing beyond the implication. This is adequate for a simple getter but not rich.
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 clear, front-loaded sentence states the verb and resource immediately with no filler, repetition, or unnecessary detail.
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 read operation with an output schema present, the description is essentially complete: it gives scope ('user's Spotify account'), resource ('currently playing'), and the empty case ('if any'). Nothing else is required for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the input schema has no parameter semantics for the description to augment. Per the baseline for no-parameter tools, the description appropriately does not need to explain arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and a precise resource ('the track currently playing on the user's Spotify account'). The phrase 'if any' also clarifies the no-track case, and the purpose is easily distinguished from siblings like recently_played or 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?
The description clearly implies the use case — checking active playback — but it does not explicitly say when to prefer this tool over related siblings such as recently_played, nor does it mention any exclusions. An agent must infer the boundary from 'currently playing' alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pauseA
Pause playback on the user's active Spotify device.
| 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 provided, the description carries the full burden of behavioral disclosure. It does specify that the action applies to the user's active device, which is a real behavioral constraint, but it does not disclose edge cases such as behavior when nothing is playing, whether the command is idempotent, or what happens if no active device exists. This is a moderate gap for a state-changing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to understanding the tool's action and target, achieving maximum 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 no-parameter playback control with an output schema, this description is nearly complete. It identifies the action, the target device, and the user context. It lacks explicit error-handling expectations or idempotency notes, but these are lesser concerns given the tool's simplicity and the presence of an output schema to describe results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds nothing about parameters because none exist, and no parameter-specific guidance is 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 uses a specific verb ('Pause') and names the exact resource ('playback on the user's active Spotify device'), making it unambiguous and distinct from sibling tools like resume or skip_next. Even without opening schemas, an agent knows exactly what this 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?
The description clearly implies when to use it (when playback should be halted) and names the target condition ('active Spotify device'), which is a clear usage context. It does not explicitly exclude alternatives like stop or toggle, but for a simple control this is an acceptable level of guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Health-check tool: confirms the MCP server is reachable and tools can be called.
| 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?
No annotations are provided, so the description carries the full behavioral burden. It discloses the core behavior (confirms reachability and callability) but does not mention potential side effects, response format, or that it does not authenticate or perform any state-changing operations.
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 conveys purpose immediately. No wasted words; it earns its place and does not repeat structural information already present in 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 zero-parameter tool with an output schema, the description is complete. It explains what the tool does (health check) and relies on the output schema for return details. Nothing essential is missing given the tool's simplicity.
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 the schema is fully covered and semantic additions are unnecessary. The description correctly focuses on behavior rather than parameters, aligning with the baseline of 4 for parameter-less tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific language: 'Health-check tool: confirms the MCP server is reachable and tools can be called.' It is distinct from all sibling music-related tools, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives, but the usage is implied through the term 'Health-check tool' and its unique position among siblings. It would benefit from stating that it should be used for connectivity diagnostics before other calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playlist_tracksA
List the tracks in a playlist, including each track's id (needed by add_tracks / remove_tracks_from_playlist). playlist_id comes from list_user_playlists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| playlist_id | Yes |
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 burden. It adds useful dependency information, but it never mentions pagination or that the limit parameter defaults to 50 and likely caps the returned tracks, nor whether the full playlist is returned. The read-only nature is implied by 'List,' but not 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 concise, front-loaded sentences carry purpose and dependency context without fluff. Every clause 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?
Simple two-parameter tool with an output schema, but the description omits limit semantics, leaving an agent unsure whether 'list the tracks' includes all tracks or just the default 50. The dependency notes are helpful, so it is not incomplete enough for a 2.
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 description must compensate. It gives playlist_id provenance (comes from list_user_playlists), but says nothing about limit other than what the schema's default value implies. Partial compensation only.
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 ('List the tracks in a playlist') and adds the key output element (track id) plus its relationship to add_tracks / remove_tracks_from_playlist. This clearly separates it from the playlist-management siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by saying playlist_id comes from list_user_playlists and that track ids are needed by add_tracks / remove_tracks_from_playlist. It does not explicitly state when not to use it, but no close alternative exists among the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_trackA
Add a track to the playback queue. track_id comes from search_track.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 states the core action, but does not mention side effects, idempotency, device requirements, or other behavioral details. This is a thin description for a mutating 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?
Two short sentences with no unnecessary wording. The primary action is front-loaded and the parameter provenance is a valuable addition that 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 single required parameter, a clear source for that parameter, and an output schema present, the definition is mostly complete for an agent to invoke it correctly. The main missing piece is behavioral context around queueing, but this is minor given the tool's simplicity.
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%, but the description compensates by explaining that track_id comes from search_track, giving the agent a clear source for the parameter. It does not elaborate on format or constraints, but for a single simple parameter this is reasonably sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add') and a specific resource ('track to the playback queue'), making the tool's function immediately clear. It also distinguishes itself from sibling tools like add_tracks by specifying the playback queue rather than a playlist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies usage after search_track by stating that track_id comes from search_track. It gives helpful context for when to use this tool, though it does not explicitly state when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recently_playedA
Get the user's most recently played tracks, most recent first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
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 must disclose behavioral traits. It mentions 'most recent first' ordering, which is a useful behavioral detail, but it does not disclose the default limit behavior (though this is in the schema) or any rate limits, authentication requirements, or what happens if no tracks exist. Since there are no annotations, the description carries the full burden and falls short of providing comprehensive behavioral context.
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, short sentence that is front-loaded with the action and resource. It is concise and has no extraneous words, making it efficient. Every word contributes to the core meaning.
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 has a simple schema (one optional parameter) and an output schema, but with no annotations, the description must provide sufficient context. It covers the basic purpose and ordering, but lacks details on default behavior (e.g., default limit of 10), authentication requirements, or error conditions. Given the tool's simplicity, the description is partially complete but could be enhanced with a note about the 'limit' parameter and potential use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the 'limit' parameter, providing only a type and default. The description itself doesn't explain 'limit' either, but the default value of 10 is clear and the parameter is optional. However, since the schema is minimal, the description would need to explain that 'limit' controls the number of tracks returned; it does not. Given 0% coverage, the description should compensate, but it doesn't mention the parameter at all. Score 3 would be generous; with 0% coverage, this is a significant gap, so 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 clear verb (get) and resource (recently played tracks), with a temporal ordering ('most recent first'). It is distinct from sibling tools like 'now_playing' (current track) and 'top_tracks' (all-time), but does not explicitly name these alternatives. It provides sufficient clarity for an agent to understand the tool's function, though it could more explicitly differentiate from similar list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving recent listening history, but gives no explicit context on when to prefer this over 'top_tracks' or 'now_playing'. It does not state exclusions (e.g., 'not for current track'), leaving the agent to infer appropriateness. This is adequate but lacks the explicit guidance that would help distinguish it from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_tracksA
Remove one or more tracks from a playlist. playlist_id and track_ids come from list_user_playlists and playlist_tracks.
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes | ||
| playlist_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 only states the mutation action without disclosing side effects, permission requirements, error handling, or reversibility. For a destructive operation, this is insufficient detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that states the action first and then adds the sourcing hint with zero filler. Efficient and clear.
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 with two parameters and an output schema exists, so return value coverage is not required. However, behavioral details like error handling, partial success, and idempotency are missing, making it adequate but not fully complete for a mutation tool.
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 description must compensate. It adds the context that parameter values come from specific sibling tools, which is useful, but it does not explain formats or constraints beyond the schema titles. This provides some value but not deep semantic meaning.
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 a specific action ('Remove one or more tracks from a playlist') with a clear verb and resource, distinguishing it from siblings like add_tracks and unlike_tracks. It also identifies the source of required IDs, reinforcing purpose.
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 explicitly instructs that playlist_id and track_ids come from list_user_playlists and playlist_tracks, giving a concrete workflow context. However, it does not explicitly contrast with alternatives or state when not to use it, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repeat_modeA
Set repeat mode on the user's active Spotify device. mode: "track" (repeat the current track), "context" (repeat the current playlist/album), or "off".
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full behavioral burden. It does disclose the core behavior and meaningful mode semantics, but it does not disclose what happens without an active device, whether authorization/premium is required, or error 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?
One tightly worded sentence front-loads the purpose, and the parameter details are compactly structured as a short inline list. Every 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 single-parameter setter with an output schema present, the description is mostly complete. It could more explicitly require an active device or note prerequisites, but the mention of 'active Spotify device' plus the full mode semantics covers the essential information 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 0%, so the description fully compensates by explaining the only parameter, mode, and defining each allowed value ('track', 'context', 'off') with its behavioral meaning. This is excellent parameter-level guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Set'), names the resource ('the user's active Spotify device'), and precisely defines the operation (repeat mode). The three valid modes are enumerated, so an agent knows exactly what this tool does and can distinguish it from playback siblings like shuffle, pause, resume, or skip_next.
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 clearly sets the usage context: set repeat mode on the active Spotify device. It assumes an active device is already active, which is implied context, and no exclusion is needed since no sibling tool competes for this exact action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resumeA
Resume/start playback on the user's active Spotify device.
| 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 provided, the description carries the full burden of behavioral disclosure. It reveals the core state change (starting/resuming playback) but does not mention failure modes, idempotency, what happens with no active device, or other side effects. More detail would be needed for a playback-control 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?
A single, front-loaded sentence communicates the action and target with no filler. Every word adds meaning, and the structure does not bury important 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 zero-parameter tool with an output schema, the description states the essential action, but it omits practical context around device availability and error conditions. The sibling tools suggest that activate_device may need to be called first, but the description itself does not guide the agent through that sequencing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is complete, so there are no parameter meanings for the description to clarify. The baseline of 4 applies because nothing is omitted; the only context it adds is the target device, which is part of the action description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb pair, 'Resume/start', and names the exact resource: playback on the user's active Spotify device. This clearly differentiates it from sibling tools like pause, skip_next, or activate_device.
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 'on the user's active Spotify device' implies the precondition that an active device must exist and that the tool is for starting/resuming playback. However, it does not explicitly tell the agent when to prefer this over pause or how to handle the absence of an active device, leaving the usage context implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_trackA
Search Spotify's catalog for tracks matching a query (song name, artist, etc.). Each result includes its id, for use with add_tracks / queue_track.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that results include ids and that the search is against Spotify's catalog, which is useful. However, it doesn't mention pagination, result ordering, or what happens with no results. The description is honest and non-contradictory, but lacks deeper behavioral detail.
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 sentences, no filler. The core action is front-loaded, and the downstream use case is stated efficiently. Every 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?
The tool is a simple search with an output schema present, so the description doesn't need to explain return values. It covers the query semantics and the purpose of the id in results. It could mention limit behavior, but the output schema and simplicity keep this from being a major 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 0%, so the description must compensate. It explains the 'query' parameter's purpose (song name, artist, etc.) and mentions the 'limit' implicitly by saying 'each result' but doesn't explain the limit parameter's behavior or default. The description adds some meaning beyond the schema but doesn't fully document both parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a specific resource ('Spotify's catalog'), and the object of the search ('tracks matching a query'). It also clarifies the query can be a song name, artist, etc., and distinguishes the tool's purpose by noting results include ids for use with add_tracks/queue_track. This clearly differentiates it from sibling tools like find_playlists or list_user_playlists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to find tracks by query and obtain their ids for later use with add_tracks or queue_track. It doesn't explicitly state when not to use it or name alternatives, but the mention of downstream tools gives clear context. A 4 is appropriate because the usage context is clear but exclusions are not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seekA
Seek to a position (in milliseconds) in the currently playing track.
| Name | Required | Description | Default |
|---|---|---|---|
| position_ms | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 conveys the core action but does not mention behavior for out-of-range positions, whether playback continues after seeking, or if the seek fails when no track is playing. This is a meaningful gap for a state-changing playback control.
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, tight sentence with no filler. The core verb, target resource, and parameter semantics are all front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: one required parameter, no nested objects, and an output schema is present. The description provides enough for basic invocation, though it omits edge-case behavior and explicit usage guidance. These omissions are minor given the low complexity.
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 description must clarify the parameter. It does add crucial meaning by identifying position_ms as 'a position (in milliseconds)', which maps the parameter to the seek target. It does not provide valid ranges, bounds, or negative-value semantics, but for a simple millisecond integer this is adequate.
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 verb ('seek'), a specific resource ('currently playing track'), and the unit of measurement ('milliseconds'). This clearly distinguishes it from sibling controls like skip_next and skip_previous, which move by track rather than by time position.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently playing track' implies the tool requires active playback and is intended for jumping to a precise time position. However, it does not explicitly state when to choose this over skip_next/skip_previous or mention any prerequisites like having an active playback session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_playback_volumeA
Set playback volume on the user's active Spotify device. volume_percent: 0-100.
| Name | Required | Description | Default |
|---|---|---|---|
| volume_percent | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does reveal the operational scope (only the active device) and the valid range of 0-100, but it does not describe what happens when no device is active, how errors are surfaced, or any side effects beyond changing the volume.
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 contain no filler or redundant restatement. The action, target scope, and parameter range are all delivered efficiently.
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 single-parameter write operation with an output schema present, the description covers the essential invocation details: what it does, where it applies, and the valid parameter range. The only notable omission is explicit guidance for the no-active-device case, but the 'active device' wording partially covers that precondition.
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 only provides the type ('integer') and required flag. The description compensates by explicitly adding the critical 0-100 constraint, which is the main semantic information needed to invoke this single-parameter tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Set') and a specific resource ('playback volume on the user's active Spotify device'), making the tool's purpose immediately clear. This distinguishes it from sibling playback controls like pause, resume, skip, and seek, and from device management tools like activate_device and list_devices.
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 'active Spotify device' implies a precondition that a device must already be active, but the description never explicitly says when to use this tool versus activating a device or listing devices first. No alternatives or exclusion conditions are mentioned, leaving the agent to infer proper sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shuffleA
Turn shuffle mode on or off on the user's active Spotify device.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the behavioral burden. It usefully discloses that shuffle is set on the user's active device and toggles on/off. However, it does not mention failure behavior when no active device exists, permission requirements, or whether the operation returns a confirmation, leaving some ambiguity for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence states the action, target device, and possible states with no filler. Every word 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 one-boolean parameter tool with an output schema present, the description is nearly complete. It covers what the tool does and on what target. The only real gaps are usage prerequisites and failure-mode context, which matter more for complex tools; here simplicity keeps the definition adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no description for the single `enabled` parameter (0% coverage), so the description must compensate. It does map 'on or off' to `enabled`, giving the boolean meaning, but adds no further detail such as default behavior, null handling, or what happens when no device is active.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Turn') plus a clear resource ('shuffle mode') and scope ('active Spotify device'). It is immediately distinguishable from siblings like repeat_mode, skip_next, and set_playback_volume, which target different playback controls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives, and no prerequisites are stated. In particular, it does not mention that a device must already be active or that `activate_device` should be used first, which is important given the sibling tool list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_nextA
Skip to the next track on the user's active Spotify device.
| 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?
No annotations are provided, so the description carries the full burden. It mentions the active-device prerequisite but does not disclose what happens if no device is active, whether playback must already be running, or any error/response 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, focused sentence with no wasted words. It front-loads the action and 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?
For a zero-parameter playback control with an output schema, the description is mostly complete: it names the actionвают target and the active-device prerequisite. It lacks explicit failure-mode context, but the simplicity of the tool lowers the burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is complete, so there are no parameter semantics for the description to add. The baseline for a zero-parameter tool is 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 states the action ('skip'), the target ('the next track'), and the context ('on the user's active Spotify device'). It also implicitly differentiates from the sibling skip_previous by specifying 'next'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear condition: there must be an active Spotify device. It is obvious from 'next track' how this differs from skip_previous, though it does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_previousA
Skip to the previous track on the user's active Spotify device.
| 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?
No annotations are present, so the description carries the full burden of behavioral disclosure. It states the action and scope clearly, but it does not disclose what happens when there is no active device or when already at the start of the queue. These are common failure or no-op conditions for a skip control, and the description leaves them unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is a single, front-loaded sentence that communicates the action, target, and scope without any wasted words. It is optimally concise for the tool's simplicity.
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 parameterless action that returns void (inferred from the output schema), the description gives the essential context: what it does and where it applies. It omits edge-case behavior like no active device or queue boundary conditions, which are minor but could be relevant to an agent. The presence of an output schema means return values need no 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, and the input schema is an empty object with 100% coverage. There is no parameter information to document, and the description correctly avoids inventing any. The baseline of 4 for zero-parameter tools applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Skip to the previous track') and clearly differentiates from the sibling 'skip_next' by direction. It also names the target scope ('active Spotify device'), leaving no ambiguity about the operation.
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 usage is implied by the action itself: use when the user wants to go to the previous track. However, there is no explicit guidance about when not to use it (e.g., when no track is available) or how it compares to alternatives like seek. The 'active device' hint provides minimal context but no direct routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_artistsA
Get the user's most-listened-to artists. time_range: short_term (~4 weeks), medium_term (~6 months, default), or long_term (years).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| time_range | No | medium_term |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of explaining behavior. It clearly explains time_range semantics and defaults, and 'Get' implies a read-only intent. It does not mention limitation, pagination, or response behavior, but for a simple read-only list tool the core behavior is disclosed.
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 compact and front-loaded, delivering the core action in the first sentence and then the most important parameter detail in the second. Every sentence adds value with no repetition or padding.
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 an output schema, and the description provides enough context to call it correctly for the main parameter. The only minor gap is not mentioning limit in prose, but its default is present in the input schema.
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 description must compensate. It fully explains time_range's meaning and valid values, including the default. The limit parameter is left to its schema default, but the tool's core semantics are conveyed by the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('the user's most-listened-to artists') and clearly differentiates it from sibling tools like top_tracks. The time_range semantics strengthen clarity about what kind of result is returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: it returns the user's top listened-to artists across supported periods. It does not explicitly name alternatives or exclusions, but the 'most-listened-to artists' framing makes its use case obvious relative to top_tracks and recently_played.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_tracksA
Get the user's most-listened-to tracks. time_range: short_term (~4 weeks), medium_term (~6 months, default), or long_term (years).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| time_range | No | medium_term |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states the basic function and the time_range values, but does not mention authentication, rate limits, return format, pagination, or any side effects. For a tool that simply retrieves data, this is a minimal disclosure and leaves the agent without important behavioral context.
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 concise and front-loaded: the core purpose is stated first, followed by a compact explanation of the key parameter. There is no fluff, and the time_range details are relevant and necessary. It earns a high score for efficiency, though it could be slightly more structured by separating the parameter explanation.
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 simplicity of the tool and the presence of an output schema (which covers return format), the description covers the main nuance: the time_range values. The limit parameter is standard and self-explanatory. The description is adequate for an agent to call the tool correctly, though it omits any mention of default values or edge cases like empty responses.
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 description must compensate. It explains the time_range parameter with three explicit values and their meanings, which adds value beyond the schema. However, it does not describe the limit parameter at all, although limit is self-explanatory. The description partially covers parameter semantics but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the function: 'Get the user's most-listened-to tracks.' This is a specific verb+resource that distinguishes it from siblings like top_artists or recently_played. The phrase 'most-listened-to' precisely defines the intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives usage context by explaining the time_range parameter, but it does not explicitly mention when to use this tool versus alternatives like top_artists or recently_played. The guidance is implied rather than stated, and no exclusions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlike_tracksA
Remove one or more tracks from the user's Liked Songs. Note: Spotify restricts this endpoint to apps with "Extended Quota Mode" approval — it may fail with a permissions error on apps that don't have it.
| Name | Required | Description | Default |
|---|---|---|---|
| track_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden and provides a concrete, non-obvious caveat: the endpoint requires Spotify 'Extended Quota Mode' approval and may fail with a permissions error. It does not disclose all behavior details like idempotency or auth scopes, but the disclosed warning is genuinely useful beyond the schema and sibling names.
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 two sentences with no filler: the primary action comes first, and the critical permission caveat follows immediately. Every part earns its place and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema, the description covers the operation and a key failure mode. While additional auth-scope details could be added, the permission warning plus the clear target resource makes it sufficiently complete for an agent to decide to call it.
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 description must compensate for the lack of parameter documentation. It only says 'one or more tracks,' adding minimal meaning beyond the already self-evident track_ids array. It does not clarify expected ID format, whether URIs are accepted, or any batch limits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Remove') and a precise resource ('tracks from the user's Liked Songs'), making the operation unmistakable. This also clearly separates it from sibling tools like liked_songs and like_tracks, which serve the opposite purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: whenever tracks need to be removed from Liked Songs. However, it does not explicitly mention when not to use it or compare it to alternative tools such as remove_tracks for playlist removal. The quota note is about permission risks, not usage routing.
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.
27 tool updates
v0.1.0- First observed
activate_device - First observed
add_tracks - First observed
create_user_playlist - First observed
find_playlists - First observed
import_youtube_playlist - First observed
like_tracks - First observed
liked_songs - First observed
list_devices - First observed
list_user_playlists - First observed
now_playing - First observed
pause - First observed
ping - First observed
playlist_tracks - First observed
queue_track - First observed
recently_played - First observed
remove_tracks - First observed
repeat_mode - First observed
resume - First observed
search_track - First observed
seek - First observed
set_playback_volume - First observed
shuffle - First observed
skip_next - First observed
skip_previous - First observed
top_artists - First observed
top_tracks - First observed
unlike_tracks
TDQS
Scored across 27 tools
Most tools clearly target a distinct resource and action: devices, playlists, playback modes, liked songs, and search are easy to tell apart. The only minor overlaps are resume vs activate_device (both can start playback) and add_tracks vs queue_track, but their targets are clearly described.
Snake_case is used consistently and many tools follow a verb_noun pattern such as list_devices, create_user_playlist, and unlike_tracks. However, several tools are noun or state phrases instead of commands (playlist_tracks, liked_songs, top_tracks, repeat_mode), and similar operations use different verbs like list_user_playlists vs find_playlists.
27 tools is heavy and just past the 25 threshold, but Spotify's domain spans playback, playlists, library, and search, so most tools have a distinct purpose. A few tools like ping and the many single-purpose playback controls add bulk and could be consolidated.
Core workflows are covered: searching tracks, creating and editing playlists, controlling playback, and viewing listening history. Obvious gaps include no playlist update/delete/reorder, no ability to play a specific playlist or album context, and no artist/album search, so some lifecycle flows dead-end.
Maintenance
Related MCP Connectors
Spotify: Spotify Data API for Millions of songs & podcasts, artists, albums, playlists and more.
Full Spotify Web API coverage - albums, artists, playlists, player controls, and more.
- mytesla.ioOAuthio.mytesla
Control your Tesla from your AI assistant - climate, charging, access, and security.
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.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI assistants to control Spotify playback, search for music, manage playlists, and interact with your Spotify library through natural language commands.19-
- FlicenseAqualityDmaintenanceEnables AI assistants to control Spotify playback, search for music, manage playlists, and access library information through the Spotify API. Requires Spotify Premium for playback control features.4-
- AlicenseBqualityDmaintenanceEnables AI assistants to control Spotify playback, manage playlists, search music, and access listening history. Requires Spotify Premium and uses secure OAuth 2.0 with PKCE authentication.1360 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to control Spotify playback, search music, manage playlists and library, and access user listening insights via the Spotify Web API.-