Skip to main content
Glama

spotify-llm-mcp

Control Spotify and build LLM-reasoned playlists from any MCP client (Claude Code, Claude Desktop, Cursor, …).

It wraps the spotify_player CLI as the control plane, so it needs no Spotify Developer app and no OAuth of its own — it reuses the session you already logged into. The recommendation engine is the calling LLM itself: it reasons over your real playlist tracks and the server resolves its picks to Spotify tracks via search. (Spotify removed its audio-features/recommendations endpoints for new apps in Nov 2024 — this design sidesteps that entirely.)

Why this design

  • Zero new credentials. spotify_player already holds your session; this server just shells out to it.

  • Immune to Spotify Web-API deprecations. Control flows through librespot, not api.spotify.com.

  • The LLM is the recsys. Its music knowledge replaces Spotify's dead recommendation endpoints; the server turns song names into playable Spotify tracks.

  • Portable. One MCP server, usable by every MCP-speaking client.

Related MCP server: Spotify MCP Server

Requirements

  • spotify_player installed, authenticated once, and running as an active device. Spotify Premium is required for playback control.

  • Python ≥ 3.10.

Install

git clone https://github.com/rachittshah/spotify-llm-mcp
cd spotify-llm-mcp
uv pip install -e .

Register with Claude Code:

claude mcp add spotify -- spotify-llm-mcp

Or in settings.json / claude_desktop_config.json:

{ "mcpServers": { "spotify": { "command": "spotify-llm-mcp" } } }

Tools

Control: now_playing · control (play/pause/next/previous/shuffle/repeat/volume/seek) · play · search · list_devices · switch_device · get_queue

Recsys inputs & delivery: list_playlists · get_playlist_tracks · taste_profile · resolve_tracks · create_playlist_from_tracks · append_to_playlist

Features (MCP prompts / slash-commands)

  • /recommend-from-playlist <name> — read a playlist, let the LLM extend it in-vibe, build & play the result.

  • /vibe-playlist <description> — "late-night coding, downtempo instrumental" → a fresh playlist.

  • /more-like-this — recommendations seeded from what's playing now.

  • /my-taste — a summary of your listening profile.

How the recsys works

LLM client ──► get_playlist_tracks("On Repeat")      # real tracks, via spotify_player
   │  (LLM reasons over them using its music knowledge)
   └─► create_playlist_from_tracks(name, [{title, artist}, ...])
          │  server resolves each name → Spotify track via search
          └─► play(new_playlist_uri)                 # on your spotify_player device

Claude Code skill

This repo also ships a Claude Code skill (skill/spotify-dj/) that teaches Claude the recsys workflows on top of the MCP tools. Install it:

cp -r skill/spotify-dj ~/.claude/skills/spotify-dj

Then in Claude Code: "recommend music like my On Repeat playlist" or /spotify-dj.

Known limitations

  • Playback control needs Spotify Premium. Free accounts can read state but not control it.

  • spotify_player's search errors on some queries (an upstream JSON-deserialization bug — exit 0 but non-JSON output). The recsys is resilient to this: an unresolvable pick is skipped and reported under unresolved, never aborting the batch.

  • Delivery is a playlist, not an ephemeral queuespotify_player's CLI has no "add to queue" verb, so recommendations are delivered as a (revisitable) playlist.

Development

uv pip install -e ".[dev]"
.venv/bin/python -m pytest            # unit tests (no Spotify needed)
.venv/bin/python scripts/smoke_live.py  # end-to-end against a live spotify_player
.venv/bin/python scripts/smoke_mcp.py    # MCP-protocol smoke over stdio

License

MIT © Rachitt Shah

Available Tools

14 tools
append_to_playlistA

Append LLM-proposed {title, artist} picks to an existing playlist by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
tracksYes
playlist_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

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 discloses the core mutation (append modifies an existing playlist in place), but says nothing about prerequisite track resolution, duplicate handling, failure behavior for unresolvable picks, or required authorization scope. For a write operation with zero annotation coverage, this is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 13-word sentence that leads with the verb and packs in the target resource, content shape, and identifier. No wasted sentences or redundant restating of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with an output schema present, the description covers the essentials: what is appended and where. But it leaves unaddressed the pipeline relationship suggested by sibling resolve_tracks — whether picks must be resolved or validated before appending — and what happens when a pick cannot be found. Adequate core, but with gaps an agent would reasonably encounter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. 'existing playlist by id' gives meaning to playlist_id, and '{title, artist} picks' gives meaning to the tracks items. However, the schema allows additionalProperties of any string key, and the description does not clarify whether only title/artist are allowed or whether extra keys are ignored, leaving partial ambiguity about the tracks structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Append), resource (existing playlist), and scope (by id), with content shape qualified as {title, artist} picks. This implicitly distinguishes it from siblings: it modifies an existing playlist rather than creating one (create_playlist_from_tracks), playing one (play_playlist), or reading one (get_playlist_tracks). The 'LLM-proposed' qualifier is slightly odd but does not obscure the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied: you need an existing playlist ID and picks to append, so it naturally follows creating or finding a playlist. However, no explicit when/when-not guidance is provided — it does not name alternatives such as create_playlist_from_tracks for new playlists or resolve_tracks for preparing picks, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

controlB

Control playback. action ∈ {play, pause, play_pause, next, previous, shuffle, repeat, volume, seek}. For 'volume' pass 0-100; for 'seek' pass milliseconds.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNo
actionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, yet it only lists operations and value ranges. It does not explain the effect on current playback, whether shuffle/repeat are toggles or absolute settings, or what happens on invalid input.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler: the first scopes the tool and lists actions, the second covers the special parameter cases. It is compact, well-ordered, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema covers return values, and the action list plus value formats enable basic invocation. Still, with no annotations and overlapping sibling tools, the description lacks material guidance about value semantics for some actions, behavioral side effects, and when to prefer alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no descriptions or enums, and the description compensates by enumerating allowed action values and giving specific formats for 'volume' and 'seek'. However, it leaves the value semantics for 'shuffle' and 'repeat' unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's resource ('playback') and the set of valid actions, so an agent can tell what the tool does. It does not explicitly differentiate this from sibling tools like 'play' or 'now_playing', but the action list gives enough scope to separate it from most alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action enumeration implies when the tool should be used, but there is no explicit guidance about choosing this over sibling tools such as 'play' or 'get_queue'. No exclusions, prerequisites, or alternative conditions are mentioned, so the selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_playlist_from_tracksA

Create a playlist from LLM-proposed {title, artist} picks. The server searches each on Spotify, adds the confident matches, and reports any it couldn't find under 'unresolved'. Returns the new playlist_id + uri.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
publicNo
tracksYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explains that the server searches, adds only confident matches, reports unresolved items, and returns playlist_id + uri. This is materially useful, though it leaves details like auth requirements and the definition of 'confident' unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences: what it does, how it behaves, and what it returns. Every sentence adds information and the most important purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create-style tool with no annotations and four parameters, the description covers the core workflow, the partial-resolution behavior, and the return value. It lacks details about optional parameters and edge cases, but the main agent decision path is well supported.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It adds meaning for 'tracks' by specifying each entry is a {title, artist} pair, and 'name' is implied by 'Create a playlist'. However, the 'public' and 'description' parameters are not mentioned, leaving some semantics uncovered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Create'), the resource ('playlist'), and the distinguishing input ('LLM-proposed {title, artist} picks'). It also reveals the search-and-add workflow, which separates it from siblings like append_to_playlist or resolve_tracks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a clear use case: when you have title/artist pairs and want a new playlist created from them. It does not explicitly contrast with siblings like resolve_tracks or append_to_playlist, but the described behavior is distinctive enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_playlist_tracksA

Get a playlist's tracks by name (case-insensitive) or by Spotify id. Use this to read a playlist before recommending music in its vibe.

ParametersJSON Schema
NameRequiredDescriptionDefault
playlistYes

TDQS

A4.2/5.0
Behavior3/5

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 useful behavioral traits: case-insensitive name matching and support for Spotify id. It does not explain error behavior, return format, or pagination, but for a simple read-style tool this partial disclosure is adequate 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant phrasing. The core purpose is front-loaded, and the usage hint follows naturally. Every word contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no annotations and no output schema, the description gives the essential input semantics and a usage scenario. It doesn't specify the return value shape, but the tool name and phrasing 'get a playlist's tracks' imply the result sufficiently for this simplicity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 the 'playlist' parameter. It does so by explaining the parameter accepts either a playlist name (case-insensitive) or a Spotify id. This goes well beyond the bare schema field title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get a playlist's tracks') and clearly distinguishes the tool from siblings like list_playlists and play_playlist. It also states the two input forms (name or Spotify id), making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit use case: 'Use this to read a playlist before recommending music in its vibe.' It doesn't name alternatives or exclusion conditions, but the context is clear enough for an agent to choose this tool appropriately among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_queueB

Get the current playback queue.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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. The verb 'Get' implies a read-only operation, but the description does not specify whether the queue includes the currently playing item, how it is ordered, or any response-shape details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no filler or redundant phrasing. 'Get the current playback queue' front-loads the core purpose and nothing else is needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read operation, the description is mostly sufficient: an agent can select the tool and understand its function. However, there is no output schema, and the description does not clarify what the returned queue contains, which leaves a minor but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is effectively 100%, so there is no parameter information the description needed to add. The baseline of 4 applies because no parameter documentation burden exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Get' and names a concrete resource, 'the current playback queue,' which clearly sets it apart from the sibling tool now_playing. However, it does not explicitly contrast it with any sibling, so the differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance about when to use this tool versus alternatives such as now_playing or play_playlist. It only states what the tool does, leaving the agent to infer the appropriate calling context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesA

List available Spotify Connect devices.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the burden of behavioral disclosure. It implies a safe, read-only operation, but does not explain what 'available' means, whether the list includes all devices or only active ones, or what the response format is. This is acceptable 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, short sentence that states exactly what the tool does with no filler or redundancy. It is perfectly sized for the simplicity of the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool, the description is mostly complete, but the lack of an output schema means the agent is not told what the returned data will contain. Mentioning that a list of device IDs and names is returned would make it fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description correctly adds no parameter details because there are none to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (list) and resource (available Spotify Connect devices), making its function immediately clear. This distinguishes it from sibling tools like switch_device and control, which imply different operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as switch_device or now_playing. It doesn't state that listing devices is a prerequisite for switching to one, nor does it mention any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_playlistsA

List the user's playlists (id, name, description, owner).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. 'List' clearly indicates a read-only operation, and the field list communicates return expectations. Pagination or ordering are not mentioned, but for a zero-parameter read-only list this is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. The parenthetical field list adds useful information without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description communicates the resource scope and return fields despite no output schema. It could mention pagination or explicitly reference get_playlist_tracks for fuller context, but invocation is trivial with no parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics for the description to clarify. This is the baseline for parameterless tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List', the resource 'the user's playlists', and enumerates the returned fields. It is readily distinguishable from siblings like get_playlist_tracks or create_playlist_from_tracks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not state when to prefer this tool over related siblings such as get_playlist_tracks or search. There is no explicit context, exclusions, or alternative routing guidance.

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 current playback state: track, artist, device, progress, shuffle/repeat.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It clearly indicates a non-mutating read operation ('Get') and specifies the observable fields included in the state. It doesn't mention edge cases like no active device, but for a zero-parameter read-only tool this is acceptable and the output schema likely covers response details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the action and the specific state fields. No filler or repetition of schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema present, the description is complete. It tells an agent exactly what to expect from the tool and no further context is needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts no parameters, so parameter semantics are trivial. The schema coverage is 100% with an empty properties object, and the description adds no parameter details because none exist. Per rubric, a zero-parameter tool gets a baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb ('Get') with a clear resource ('current playback state') and enumerates the exact fields returned (track, artist, device, progress, shuffle/repeat). This clearly distinguishes it from control-oriented siblings like play and control and from list tools like get_queue 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states precisely when to use the tool: to retrieve the current playback state. It doesn't explicitly name alternatives or exclusions, but sibling overlap is minimal since it is the only getter for live playback status. Context is clear even without explicit '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.

playA

Search Spotify and play the top matching track. query is free text, e.g. 'redbone childish gambino'.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does state that the tool will search and then begin playback of the top matching track, which is the core behavior. However, it does not mention side effects such as interrupting current playback, requiring an active Spotify device, or failing when no device is available.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the action, and includes a relevant example without any filler. Every sentence earns its place, and the structure is immediately scannable for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple one-parameter tool and the output schema exists, so return-value documentation is not needed. The description covers the core call semantics. However, it omits practical context like whether an active device is required, how playback interacts with current state, and when the agent should choose a sibling tool instead. Given no annotations, this leaves a meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the tool description must add meaning for the parameter. It does: 'query is free text' clarifies the accepted input, and the example 'redbone childish gambino' gives a concrete usage pattern. For a single-parameter tool, this is sufficient practical guidance, though more constraints like length or formatting are not addressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool searches Spotify and plays the top matching track, specifying both the verb ('play') and the resource ('Spotify'). It also implies single-track playback, which helps distinguish it from sibling tools like play_playlist, though it does not explicitly name or contrast sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when the user wants a track played from a free-text search query. It provides an example query and notes the query is free text. However, it does not explicitly say when to prefer alternatives like search, play_playlist, or resolve_tracks, so the agent must infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

play_playlistB

Start playback of a playlist by its Spotify id (optionally shuffled).

ParametersJSON Schema
NameRequiredDescriptionDefault
shuffleNo
playlist_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must carry the behavioral burden. It discloses only the core action (start playback) and the shuffle option; it does not mention side effects, device requirements, error behavior, or whether current playback is replaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence contains the full instruction: start playback, resource type, identifier, and optional shuffle. It is front-loaded and omits redundant detail, making it appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with an output schema, the core call sequence is covered: playlist_id and shuffle. Yet with no annotations and no guidance about playback device or interaction with the sibling 'play' tool, the description leaves contextual gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by identifying playlist_id as the Spotify id and clarifying that shuffle is optional. Both parameters are addressed, though no further format details are given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Start playback') and names the exact resource ('a playlist by its Spotify id'), also mentioning the optional shuffle behavior. It is clearly distinct from the sibling 'play' tool, though it does not explicitly name or contrast alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is implied: call this when you want to begin playing a playlist, identified by its Spotify id. There is no explicit when-to-use/when-not-to-use guidance or comparison with sibling tools such as 'play' or 'control'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_tracksA

Resolve a list of {title, artist} picks to real Spotify tracks. Returns {resolved: [...], unresolved: [...]}. Use to preview before building.

ParametersJSON Schema
NameRequiredDescriptionDefault
tracksYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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 return format and clarifies that matching results are split into resolved and unresolved groups, which is useful. But it does not describe matching tolerances, error behavior, or whether this is strictly a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The main purpose and output shape are front-loaded, and the usage guidance is placed at the end, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 available, the description provides enough context about what to pass and what to expect. It does not include an example or define edge cases, but those are not critical given the provided output schema and the straightforward input structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 specifying each pick is a {title, artist} object, which is materially more specific than the schema's generic 'additionalProperties: string'. It still leaves some ambiguity about whether title and artist are individually required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Resolve') and resource ('real Spotify tracks') and explains the tool's output shape ('{resolved: [...], unresolved: [...]}'). This clearly differentiates it from siblings like search, play, or list_playlists, which address different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use to preview before building' gives clear contextual guidance, implying the tool is intended before playlist construction or mutation. However, it does not explicitly name alternatives or state when not to use it, though the sibling list and phrasing make the intended workflow reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

switch_deviceB

Transfer playback to the device with the given name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states only the action and target, but does not explain side effects on playback state, behavior when the device name is invalid or unavailable, whether the operation is reversible, or any authentication/device prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler or redundancy. It front-loads the core action and directly references the parameter, making it easy to scan and understand.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool itself is simple with only one parameter and an output schema exists, so the description need not explain return values. However, it leaves out important contextual details such as how to obtain a valid device name, what happens if the target device does not exist, and whether playback must already be running. It is minimally adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 undocumented parameter. It does clarify that the 'name' parameter refers to the target device's name, but it does not specify where valid device names come from, whether the name is case-sensitive, or how to handle multiple devices with the same name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Transfer playback') and a clear target resource ('the device with the given name'), making the tool's function immediately obvious. It also distinguishes this from sibling tools like list_devices or play, since it is about redirecting playback to an existing device rather than listing or starting content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives, nor any mention of prerequisites such as listing available devices first or ensuring playback is active. The description provides no exclusions or conditions, leaving the agent to infer the appropriate context on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

taste_profileA

Get the user's top tracks, to reason about their taste.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It only states 'Get the user's top tracks,' which signals a read operation but does not explain what 'top tracks' means (e.g., time range, count, or listening context) or any other behavioral details like authorization or caching. This adds little beyond the tool name itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly structured sentence that front-loads the action and resource, then appends the purpose. Every word earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero params, output schema present), the description is reasonably complete. However, it lacks any context about whether this refers to the current user, whether 'top tracks' is based on all-time listening or recent activity, and how it relates to sibling tools. An agent might still need additional inference to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so the baseline is 4. The description correctly avoids inventing parameters and needs no parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get'), the resource ('user's top tracks'), and the intended purpose ('reason about their taste'). This distinguishes it from sibling tools focused on playback control or playlist management, and gives an agent a precise idea of what the tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its use for understanding user taste, but provides no explicit guidance on when to choose this tool over alternatives like now_playing or get_playlist_tracks. No exclusions, prerequisites, or context are given, leaving the agent to infer the appropriate usage scenario.

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.

  1. 14 tool updatesv0.1.0
    • First observedappend_to_playlist
    • First observedcontrol
    • First observedcreate_playlist_from_tracks
    • First observedget_playlist_tracks
    • First observedget_queue
    • First observedlist_devices
    • First observedlist_playlists
    • First observednow_playing
    • First observedplay
    • First observedplay_playlist
    • First observedresolve_tracks
    • First observedsearch
    • First observedswitch_device
    • First observedtaste_profile

TDQS

A3.6/5.0

Scored across 14 tools

Disambiguation4/5

Most tools have a clear resource+action distinction, but search, play, and resolve_tracks overlap in their underlying lookup/resolution behavior, and the playlist creation/append tools both resolve track picks. Descriptions are usually enough to pick the right one.

Naming Consistency3/5

Names are mostly readable but inconsistent: verb_noun forms like play_playlist and list_devices coexist with bare verbs like play and control, plus noun phrases like now_playing and taste_profile. The generic name control is particularly vague.

Tool Count4/5

14 tools is a reasonable size for a Spotify assistant covering playback, queue, devices, search, and playlist management. Some search/resolve and playback-control functionality could be consolidated, but the count is not excessive.

Completeness3/5

Core workflows are covered: playback control, queue, devices, search, taste profile, and creating/appending playlists. However, there is no way to remove tracks or delete/replace playlists, nor any queue editing or recommendation tool, leaving notable playlist-lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers