Skip to main content
Glama

Spotify MCP

A minimal FastMCP server for Spotify with Authorization Code + PKCE auth.

Features

  • Search Spotify tracks with search_song

  • Control playback with play, pause, skip_forward, and skip_backwards

  • Read currently playing content with get_currently_playing

  • Create playlists with create_playlist

  • Add songs to playlists with add_songs_to_playlist

  • Build vibe playlists with create_vibe_playlist

  • PKCE login flow with local loopback callback

  • Tokens stored in the OS keyring

  • Automatic access-token refresh

Related MCP server: Spotify MCP Server

Prerequisites

Spotify App Setup

  1. Create an app in the Spotify Developer Dashboard.

  2. Add this redirect URI:

    • http://127.0.0.1:8888/callback

  3. Do not use http://localhost.

  4. Copy your Client ID.

Local Setup

python -m venv .venv
.venv\Scripts\activate
pip install -e .
copy .env.example .env

Edit .env:

SPOTIFY_CLIENT_ID=your_client_id_here
SPOTIFY_REDIRECT_URI=http://127.0.0.1:8888/callback

Login (PKCE)

Run once before using the MCP tools:

python -m spotify_mcp.auth login

This opens your browser, completes Spotify authorization, and stores tokens in your OS keyring.

By default, login requests the minimum scopes needed by the current tools:

  • user-read-currently-playing

  • user-modify-playback-state

  • playlist-modify-private

  • playlist-modify-public

If you logged in before playback or playlist tools were added, run login again so Spotify grants the new scopes.

If login times out waiting for the callback:

  • Make sure the Spotify Developer Dashboard has the exact redirect URI http://127.0.0.1:8888/callback.

  • Complete the authorization page in the browser before the timeout.

  • Keep the terminal running until Spotify redirects back to 127.0.0.1.

  • If you need more time, run python -m spotify_mcp.auth login --timeout 600.

To remove stored tokens:

python -m spotify_mcp.auth logout

Run the MCP Server

python -m spotify_mcp.server

Or:

spotify-mcp

Cursor MCP Config

Add this to your Cursor MCP settings (.cursor/mcp.json or Cursor Settings > MCP):

{
  "mcpServers": {
    "spotify": {
      "command": "C:\\Users\\vihoh\\Coding Projects\\Spotify-MCP\\.venv\\Scripts\\python.exe",
      "args": ["-m", "spotify_mcp.server"],
      "cwd": "C:\\Users\\vihoh\\Coding Projects\\Spotify-MCP"
    }
  }
}

Adjust the Python path if your virtual environment lives elsewhere.

Tool: search_song

Searches Spotify tracks via GET /v1/search with type=track.

Parameters:

  • query (required): search text

  • limit (optional, default 5, range 0-10)

  • market (optional): ISO country code

  • offset (optional, default 0, range 0-1000)

Example prompt in Cursor:

Use search_song to find "Blinding Lights" by The Weeknd.

Playback Tools

Playback endpoints require a Spotify Premium account and an active Spotify device.

  • play(device_id: str | None = None): resume playback.

  • pause(device_id: str | None = None): pause playback.

  • skip_forward(device_id: str | None = None): skip to the next track.

  • skip_backwards(device_id: str | None = None): skip to the previous track.

  • get_currently_playing(market: str | None = None, additional_types: str | None = None): get the current track or episode.

Example prompts in Cursor:

Use get_currently_playing to tell me what's playing.
Pause Spotify.

Playlist Tools

Playlist endpoints use:

  • POST /v1/me/playlists to create playlists

  • POST /v1/playlists/{playlist_id}/items to add tracks

  • GET /v1/search with type=track to resolve song queries

Tools:

  • create_playlist(name, description=None, public=False, collaborative=False): create an empty playlist.

  • add_songs_to_playlist(playlist_id, song_queries, market=None): search for each query and add the best match.

  • create_vibe_playlist(name, vibe, song_queries, description=None, public=False, market=None): create a playlist and add matched songs for a vibe.

Vibe playlist workflow

The LLM should turn your vibe prompt into a list of song_queries, then call create_vibe_playlist.

Example prompt in Cursor:

Create a late-night rainy drive playlist with create_vibe_playlist.
Use a name like "Rainy Night Drive" and pick about 15 songs that fit the vibe.

The LLM might call:

create_vibe_playlist(
  name="Rainy Night Drive",
  vibe="late-night rainy drive, mellow and atmospheric",
  song_queries=[
    "The Weeknd Blinding Lights",
    "Frank Ocean Pink + White",
    "Tame Impala The Less I Know The Better"
  ],
  public=false
)

If some queries do not match, the tool returns unresolved_queries for the ones it could not find.

Notes

  • Search uses PKCE user auth even though catalog search is public data. This keeps auth ready for playlist and library tools.

  • Playback uses Spotify's documented Player endpoints.

  • Playlist tools request playlist-modify-private and playlist-modify-public.

  • This project does not use deprecated Spotify recommendation or audio-features endpoints for vibe playlists.

  • If auth expires or is revoked, run python -m spotify_mcp.auth login again.

  • Spotify content is attributed in tool responses and not cached beyond immediate use.

Project Layout

src/spotify_mcp/
  auth.py           # PKCE login, token storage, refresh helpers
  spotify_client.py # Spotify API requests and error handling
  server.py         # FastMCP server and tools

License

Use in compliance with the Spotify Developer Terms.

Available Tools

9 tools
add_songs_to_playlistA

Search for songs and add the best match for each query to a playlist.

ParametersJSON Schema
NameRequiredDescriptionDefault
marketNo
playlist_idYes
song_queriesYes

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 provided, the description carries the full burden of behavioral disclosure. It mentions that the tool selects the 'best match' per query, which is a useful behavioral detail, but it does not disclose side effects (e.g., whether songs are appended), failure modes (e.g., no match found), or any permissions needed. As a mutation tool, this lacks essential transparency.

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 that is front-loaded with the core action. Every word earns its place, with no redundant or vague content. It is highly efficient and easy to parse.

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 simple tool with an output schema, the description covers the core action but leaves gaps: no mention of market behavior, duplicate handling, error cases, or when to use this versus searching first. Given no annotations and sparse parameter details, 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?

The schema has no parameter descriptions, so the description must compensate. 'for each query' implies song_queries is an array of search strings, which adds meaning. However, playlist_id and market are not explained; market in particular is completely absent from the description. Thus the description provides moderate but incomplete parameter semantics.

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 tool's function: it searches for songs and adds the best match for each query to a playlist. This uses a specific verb ('add') and resource ('songs to a playlist'), distinguishing it from sibling tools like search_song (which only searches) and play/pause (playback controls).

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 usage—when you have a playlist and a list of song queries to add—but it does not explicitly state when to use this tool versus alternatives such as search_song or create_playlist. There are no exclusion or prerequisite details, so it falls short of clear contextual guidance.

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

create_playlistB

Create an empty playlist for the current Spotify user.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
publicNo
descriptionNo
collaborativeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.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 that the playlist is empty and created for the current user, but does not explain side effects of parameters (public, collaborative, description), permissions required, or return value. This is minimal but adequate for a simple create action.

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 sentence that immediately states the action and scope. Every word earns its place, with no wasted text.

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 is simple and an output schema exists, so the description does not need to explain return values. However, it lacks differentiation from sibling 'create_vibe_playlist' and does not mention preconditions or the effect of optional parameters. It is complete enough for an obvious create operation but with gaps.

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

Parameters1/5

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

Schema description coverage is 0%. The description does not mention any of the four parameters or their effects. The parameter names and defaults in the schema offer some hint, but the description adds no value in explaining what 'public', 'collaborative', or 'description' mean for a playlist.

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 'Create an empty playlist for the current Spotify user' uses a specific verb and resource, and clearly scopes to the current user. It distinguishes from sibling tools like 'add_songs_to_playlist' and 'create_vibe_playlist' by emphasizing 'empty'.

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 gives no guidance on when to use this tool versus alternatives. It only states what the tool does, without mentioning scenarios, exclusions, or that other playlist-creation tools exist.

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

create_vibe_playlistA

Create a playlist from a vibe prompt by searching and adding matched songs.

The LLM should provide song_queries that fit the requested vibe. This tool creates the playlist, resolves each query to a Spotify track, and adds them.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
vibeYes
marketNo
publicNo
descriptionNo
song_queriesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/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. It discloses the main multi-step behavior (creates playlist, resolves queries, adds tracks) and imposes a constraint on song_queries. However, it does not cover failure handling, behavior on unmatched queries, or side effects on existing playlists.

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

Conciseness4/5

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

The description is concise and front-loaded, with the core action in the first sentence. There is minor redundancy between 'searching and adding matched songs' and the later 'resolves each query to a Spotify track, and adds them,' but each sentence adds useful clarity.

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 output schema covers return values, so the description focuses on behavior. It explains the full workflow and the LLM's responsibility for song_queries, but doesn't mention edge cases like missing query results or explicitly position this tool as a combined alternative to create_playlist and add_songs_to_playlist.

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%, but the description compensates by clarifying the role of song_queries (search queries resolved to tracks) and vibe (the prompt). It doesn't detail 'market', 'public', or 'description', but those are standard for playlist creation and the core parameters are explained.

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 a specific verb and resource: 'Create a playlist from a vibe prompt by searching and adding matched songs.' It distinguishes itself from sibling tools like create_playlist (which likely creates an empty playlist) and add_songs_to_playlist by describing the combined search-and-add behavior.

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 provides clear context for use: the LLM should supply song_queries that fit the vibe, and the tool handles the rest. It doesn't explicitly list alternatives or exclusion cases, but the implied workflow is understandable.

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

get_currently_playingB

Get the track or episode currently playing on the user's Spotify account.

ParametersJSON Schema
NameRequiredDescriptionDefault
marketNo
additional_typesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/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 does not mention any side effects, prerequisites, authentication requirements, or edge cases such as returning null or no content when nothing is playing. The description only states the action without sufficient context.

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, clear sentence that front-loads the primary purpose. There is no redundancy, fluff, or unnecessary detail.

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

Completeness2/5

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

Despite having an output schema, the tool has two optional parameters and no annotations. The description is too minimal to fully equip an agent to use the tool correctly, especially regarding parameter semantics and edge cases like no active playback. The description does not compensate for the lack of schema documentation.

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

Parameters1/5

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

The input schema has two optional parameters (market and additional_types) with no descriptions, and schema description coverage is 0%. The description does not explain these parameters, leaving the agent without any guidance on their meaning or usage.

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 it gets the currently playing track or episode on the user's Spotify account, using a specific verb and resource. This distinguishes it from sibling tools like play, pause, and search_song, which serve 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 Guidelines3/5

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

The description implies usage when current playback information is needed, but it does not explicitly state when to use this tool versus alternatives or provide any exclusion criteria. Since no sibling tool retrieves currently playing content, the lack of explicit alternatives is acceptable, but the guidance is still minimal.

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 active Spotify device or an optional device ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavioral traits. It reveals that the tool targets the active device or a given device ID, but it does not mention what happens if no active device exists, whether the operation is reversible, or any required permissions. For a mutation tool, this is a significant 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?

The description is a single sentence of twelve words, front-loaded with the verb 'Pause'. It conveys the action and optional target without any redundant information, making it optimally concise.

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 tool is simple with one optional parameter and an output schema present. The description covers the action and target sufficiently. While it omits edge cases, given the low complexity, the description is complete enough 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.

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 by stating that the parameter is an optional device ID and clarifies that it targets that device. However, it does not explain the format or how to obtain the ID, leaving the parameter only partially defined.

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 (pause) and the target resource (playback on a Spotify device). It distinguishes itself from sibling tools like play, skip_forward, and skip_backwards by explicitly naming the pause operation and specifying the active device or an optional device ID.

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 clearly indicates when to use this tool: to pause playback on the active device or a specified device. It provides context but does not explicitly mention alternatives or exclusions, though the action is unambiguous given the tool name and sibling context.

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

playA

Resume playback on the active Spotify device or an optional device ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

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

With no annotations, the description carries full responsibility for disclosing behavioral traits. It only mentions resuming playback and targeting a device, but does not state what happens if no active device exists, whether it errors, or if it requires an active session. This is insufficient for a mutation tool without annotation support.

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 that front-loads the primary action ('Resume playback') and then notes the optional device targeting. There is no wasted content, and it is appropriately sized for a simple tool.

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 simple tool with one parameter and an output schema, the description is minimally viable but lacks critical contextual details such as error handling when no active device is available. It does not explain whether the tool resumes from the current position or starts anew, but given the presence of an output schema, return values may be documented elsewhere. This leaves a clear 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 schema has one parameter, device_id, which is optional and nullable. The description explicitly mentions 'optional device ID', adding meaning by indicating that this parameter specifies the target device. Since schema coverage is 0%, the description partially compensates by clarifying the parameter's purpose, though it could detail how to specify the ID (e.g., Spotify URI).

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 tool resumes playback on a Spotify device, which is a specific action on a specific resource. It distinguishes itself from sibling tools like pause, skip_forward, and skip_backwards by focusing on resuming rather than stopping or skipping. The optional device ID is also mentioned, providing scope.

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 usage when the user wants to resume playback after a pause or start playing on a selected device. It gives clear context about targeting the active device or a specified device ID, though it does not explicitly mention alternatives or when not to use it. This is more than mere implication but lacks explicit exclusions.

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

search_songA

Search Spotify for tracks matching a query string.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of track results to return (0-10).
queryYesSearch text, such as a song title, artist, or combined phrase.
marketNoOptional ISO 3166-1 alpha-2 country code.
offsetNoResult offset for pagination (0-1000).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/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 of behavioral disclosure. It only states 'search' without explicitly mentioning that the operation is read-only, what the return format looks like, or any rate limits/pagination behavior. The word 'search' implies a read-only action, but that is implicit rather than disclosed.

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

Conciseness4/5

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

The description is a single, front-loaded sentence with no wasted words. It is appropriately concise, though it could benefit from a bit more behavioral context without becoming verbose.

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?

Given the detailed input schema and existing output schema, the description is sufficient to convey the core search function. It lacks explicit usage guidance, but the context and schema fill most gaps, making it adequate for a straightforward search tool.

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 100%, with detailed descriptions for query, limit, market, and offset. The description adds no additional parameter meaning beyond restating the 'query string' concept, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'Search' and the resource 'Spotify tracks' with a qualifier 'matching a query string'. This distinguishes it from playback control siblings like play, pause, and skip, which have entirely different functions.

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 the tool is for finding tracks, which is clear in context with the sibling tools. However, it does not explicitly state when not to use it or mention alternatives, but the purpose is unambiguous enough that no exclusions are needed.

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

skip_backwardsA

Skip to the previous track on the active Spotify device or an optional device ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/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 of behavioral disclosure. It indicates that the action occurs on the active device or a specified device, but does not disclose what happens if no active device exists, if the device_id is invalid, or any prerequisites (e.g., premium). It is not misleading, but lacks depth 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.

Conciseness5/5

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

The description is a single, well-structured sentence that directly communicates the tool's purpose and key parameter. No unnecessary words or redundant information.

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?

Given the simplicity of the tool (one optional parameter) and the presence of an output schema, the description is fairly complete. It covers the main context: targeting the active device or a specific device_id. However, it omits edge cases like error handling or behavior when no device is active, which would make it fully complete.

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

Parameters2/5

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

The input schema covers device_id as optional with a null default, but the description only reiterates that it is optional without adding meaningful detail (e.g., how to obtain a device ID, valid formats, or behavior when omitted). With 0% schema description coverage, the description does not adequately compensate for the lack of parameter semantics.

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 ('skip to the previous track') and the target resource ('active Spotify device or an optional device ID'). It is specific and distinguishes from the sibling tool skip_forward, which moves to the next track.

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 provides clear context on when to use the tool: to go to the previous track. It mentions the optional device_id targeting, implying that without it the active device is used. However, it does not explicitly contrast with alternatives or state exclusions, so it misses a 5.

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

skip_forwardA

Skip to the next track on the active Spotify device or an optional device ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNo

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?

With no annotations, the description carries the behavioral burden. It states the core behavior and the device selection logic, but does not disclose what happens if no active device exists, whether the operation is reversible, or any side effects. Some transparency is present, but gaps remain.

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

Conciseness5/5

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

A single sentence with no redundant words. It front-loads the action and includes the optional parameter nuance without excess. Perfectly concise for the tool's simplicity.

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 tool with one optional parameter and an output schema, the description covers the essential usage. It explains the main action and device targeting. Missing details like error behavior when no device is active are minor given the low complexity and presence of an output schema that may document returns.

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 coverage is 0%, so the description is the only source of parameter meaning. It explains 'optional device ID' and ties it to the behavior: if not provided, the active device is used. This fully clarifies the single parameter's role, though it does not detail ID formats or lookup methods.

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 ('Skip to the next track') and the target resource ('active Spotify device or an optional device ID'). It distinguishes from sibling tools like 'skip_backwards' by specifying forward direction, and from play/pause by the skip action.

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 provides clear context: it skips forward on the active device or a specified device. It implies when to use this tool (when advancing to the next track is desired) without explicitly naming alternatives, but the context is sufficient for a simple media control operation.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv0.1.0
    • First observedadd_songs_to_playlist
    • First observedcreate_playlist
    • First observedcreate_vibe_playlist
    • First observedget_currently_playing
    • First observedpause
    • First observedplay
    • First observedsearch_song
    • First observedskip_backwards
    • First observedskip_forward

TDQS

A3.6/5.0
Disambiguation4/5

Most tools have distinct purposes, such as search_song vs. play, and the playback controls are clearly separate actions. However, add_songs_to_playlist and create_vibe_playlist overlap in that both add songs to a playlist, but the descriptions clarify that one adds to an existing playlist while the other creates a new one.

Naming Consistency3/5

Names mix styles: verb_noun (search_song, create_playlist), bare verb (play, pause), and verb_adverb (skip_forward, skip_backwards). While intuitive, the lack of a uniform pattern makes the naming less predictable.

Tool Count5/5

With 9 tools covering playback control and playlist creation, the scope is well-sized for a Spotify-focused MCP server. Each tool addresses a distinct need without excessive fragmentation.

Completeness3/5

Core playback and playlist creation are covered, but there is no way to list or retrieve existing playlists, which creates a gap when adding songs to an existing playlist. Additional playback controls like shuffle/repeat are also missing.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    An MCP server that enables users to control Spotify playback, search for music, and manage playlists through MCP-compatible clients. It supports features like track recommendations and playback management using secure OAuth authentication.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A FastMCP server that exposes Spotify's catalog and user context as tools for Claude, enabling track search, audio features, artist discography, recommendations, currently playing, and playlist creation.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    A remote MCP server for Spotify with brokered OAuth and server-side intelligence, enabling search, playlist management, playback control, library analysis, and listening trends via natural language.
    38
    4
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/HUANGV1/Spotify-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server