Skip to main content
Glama
nlevy

Spotify MCP Server

by nlevy

Spotify MCP Server

A Model Context Protocol (MCP) server that provides Spotify integration, allowing AI assistants and applications to interact with Spotify's music streaming service.

Features

Artist Tools

  • Search Artists - Search for artists by name

  • Get Artist - Get detailed information about a specific artist

  • Get Artist Albums - Get all albums for an artist

  • Get Artist Top Tracks - Get an artist's most popular tracks

Album Tools

  • Get Album - Get detailed information about a specific album

  • Get Album Tracks - Get all tracks from an album

  • Get New Releases - Get new album releases

Playlist Tools

  • Create Playlist - Create new playlists

  • Add Tracks to Playlist - Add tracks to existing playlists

  • Get User Playlists - Get current user's playlists

User Tools

  • Get User Top Artists - Get user's most listened to artists

  • Get User Top Tracks - Get user's most listened to tracks

Related MCP server: Vulpes Spotify MCP Server

Installation

The easiest way to use this server with Claude Desktop is via PyPI:

  1. Get your Spotify API credentials (see Spotify API Setup below)

  2. Add to your Claude Desktop config at ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "Spotify": {
      "command": "uvx",
      "args": ["spotify-mcp-server"],
      "env": {
        "SPOTIFY_CLIENT_ID": "your_client_id_here",
        "SPOTIFY_CLIENT_SECRET": "your_client_secret_here",
        "SPOTIFY_REDIRECT_URI": "http://127.0.0.1:8888/callback"
      }
    }
  }
}
  1. Restart Claude Desktop

  2. On first use, authenticate with Spotify when prompted

Development Setup

Prerequisites

  • Python 3.10+

  • Spotify Developer Account

  • MCP Client (like Claude Desktop, Cursor, etc.)

Setup

1. Install Dependencies

# Using uv (recommended)
uv sync

# Or using pip
pip install -r requirements.txt

2. Spotify API Setup {#spotify-api-setup}

  1. Go to Spotify Developer Dashboard

  2. Create a new application

  3. Add http://localhost:8888/callback to your app's Redirect URIs

  4. Copy your Client ID and Client Secret

3. Environment Configuration

Create a .env file in the project root:

SPOTIFY_CLIENT_ID=your_client_id_here
SPOTIFY_CLIENT_SECRET=your_client_secret_here
SPOTIFY_REDIRECT_URI=http://localhost:8888/callback

4. Authentication

On first run, the server will open a browser window for Spotify authentication. Follow the OAuth flow to authorize the application.

Usage

Running the Server

# Development mode with inspector
mcp dev spotify_mcp_server.py

# Or run directly
python spotify_mcp_server.py

Available Tools

Artist Management

# Search for artists
search_artists(query="The Beatles", limit=10)

# Get artist details
get_artist(artist_id="3WrFJ7ztbogyGnTHbHJFl2")

# Get artist albums
get_artist_albums(artist_id="3WrFJ7ztbogyGnTHbHJFl2", include_groups="album,single")

# Get artist top tracks
get_artist_top_tracks(artist_id="3WrFJ7ztbogyGnTHbHJFl2", market="US")

Album Management

# Get album details
get_album(album_id="4aawyAB9vmqN3uQ7FjRGTy", market="US")

# Get album tracks
get_album_tracks(album_id="4aawyAB9vmqN3uQ7FjRGTy", limit=20)

# Get new releases
get_new_releases(country="US", limit=20)

Playlist Management

# Create a new playlist
create_playlist(name="My New Playlist", description="A great playlist", public=False)

# Add tracks to playlist
add_tracks_to_playlist(playlist_id="playlist_id", track_uris=["spotify:track:track_id"])

# Get user playlists
get_user_playlists()

User Data

# Get user's top artists
get_user_top_artists(time_range="medium_term", limit=20)

# Get user's top tracks
get_user_top_tracks(time_range="short_term", limit=10)

Project Structure

spotify-mcp/
├── spotify_mcp_server.py    # Main MCP server
├── mcp_tools/              # Tool modules
│   ├── __init__.py
│   ├── artist_tools.py     # Artist-related tools
│   ├── playlist_tools.py   # Playlist-related tools
│   ├── albums.py          # Album-related tools
│   └── user_tools.py      # User-related tools
├── .env                    # Environment variables
├── .spotify_cache         # Spotify OAuth cache
├── requirements.txt        # Python dependencies
└── README.md             # This file

API Reference

Artist Tools

search_artists

Search for artists on Spotify.

Parameters:

  • query (str): Search query for artist name

  • limit (int, optional): Maximum number of results (default: 10, max: 50)

Returns:

  • List of artists with ID, name, popularity, followers, genres, and Spotify URL

get_artist

Get detailed information about an artist.

Parameters:

  • artist_id (str): Spotify artist ID

Returns:

  • Detailed artist information including images, genres, and popularity

get_artist_albums

Get albums for an artist.

Parameters:

  • artist_id (str): Spotify artist ID

  • include_groups (str, optional): Album types to include (default: "album,single")

  • limit (int, optional): Maximum albums to return (default: 20, max: 50)

Returns:

  • List of albums with details including release date, track count, and cover images

get_artist_top_tracks

Get top tracks for an artist.

Parameters:

  • artist_id (str): Spotify artist ID

  • market (str, optional): Market/country code (default: "US")

Returns:

  • List of top tracks with popularity, duration, and album information

Album Tools

get_album

Get detailed information about an album.

Parameters:

  • album_id (str): Spotify album ID

  • market (str, optional): Market/country code (default: "US")

Returns:

  • Detailed album information including artists, images, and genres

get_album_tracks

Get tracks from an album.

Parameters:

  • album_id (str): Spotify album ID

  • market (str, optional): Market/country code (default: "US")

  • limit (int, optional): Maximum tracks to return (default: 20, max: 50)

  • offset (int, optional): Starting index (default: 0)

Returns:

  • List of tracks with track number, duration, and artist information

get_new_releases

Get new album releases.

Parameters:

  • country (str, optional): Country code (default: "US")

  • limit (int, optional): Maximum albums to return (default: 20, max: 50)

  • offset (int, optional): Starting index (default: 0)

Returns:

  • List of new release albums with artist and image information

Playlist Tools

create_playlist

Create a new Spotify playlist.

Parameters:

  • name (str): Name of the playlist

  • description (str, optional): Description of the playlist

  • public (bool, optional): Whether the playlist is public (default: False)

  • collaborative (bool, optional): Whether the playlist is collaborative (default: False)

Returns:

  • Playlist information including ID, name, and Spotify URL

add_tracks_to_playlist

Add tracks to an existing playlist.

Parameters:

  • playlist_id (str): Spotify playlist ID

  • track_uris (List[str]): List of Spotify track URIs

Returns:

  • Success status and number of tracks added

get_user_playlists

Get current user's playlists.

Parameters:

  • None

Returns:

  • List of user's playlists with details including track count and privacy settings

User Tools

get_user_top_artists

Get user's most listened to artists from Spotify.

Parameters:

  • time_range (str, optional): Time period for top artists (default: "medium_term")

    • "short_term": Last 4 weeks

    • "medium_term": Last 6 months

    • "long_term": Several years

  • limit (int, optional): Maximum number of artists to return (default: 20, max: 50)

  • offset (int, optional): Index of the first artist to return (default: 0)

Returns:

  • List of top artists with ID, name, popularity, followers, genres, and Spotify URL

get_user_top_tracks

Get user's most listened to tracks from Spotify.

Parameters:

  • time_range (str, optional): Time period for top tracks (default: "medium_term")

    • "short_term": Last 4 weeks

    • "medium_term": Last 6 months

    • "long_term": Several years

  • limit (int, optional): Maximum number of tracks to return (default: 20, max: 50)

  • offset (int, optional): Index of the first track to return (default: 0)

Returns:

  • List of top tracks with ID, name, album info, artists, popularity, duration, and Spotify URL

Development

Adding New Tools

  1. Create a new function in the appropriate tool module (artist_tools.py, playlist_tools.py, albums.py, or user_tools.py)

  2. Add the function to the __init__.py exports

  3. Create a wrapper function in spotify_mcp_server.py

  4. Copy the docstring and register the tool

Testing

# Run the server in development mode
mcp dev spotify_mcp_server.py

# The MCP Inspector will open at http://localhost:6274
# Use it to test your tools interactively

Troubleshooting

Authentication Issues

  • Ensure your .env file has the correct Spotify credentials

  • Check that your redirect URI matches exactly: http://localhost:8888/callback

  • Clear the .spotify_cache file if you encounter token issues

API Rate Limits

  • Spotify has rate limits on API calls

  • The server includes error handling for rate limit responses

  • Consider implementing caching for frequently accessed data

Available Tools

12 tools
add_tracks_to_playlistA

Add tracks to an existing playlist

Arguments: request (AddTracksRequest): - playlist_id (str): Spotify playlist ID to add tracks to - track_uris (List[str]): List of Spotify track URIs to add

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - playlist_id (str): ID of the playlist - tracks_added (int): Number of tracks added - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/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 full burden. It only states the operation and returns, but does not disclose behavioral traits such as whether tracks are appended or overwritten, permission requirements, rate limits, or error conditions beyond a basic message.

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

Conciseness3/5

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

The description includes a clear main sentence followed by detailed arguments and returns sections, which adds structure but is somewhat verbose. It could be trimmed for conciseness without losing essential information.

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 the description covers the basic operation and return values, but it lacks context on edge cases like duplicate tracks, ordering, or specific error scenarios. The presence of an output schema reduces the need to explain returns, but more behavioral context would improve completeness.

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 input schema has 0% description coverage, but the description adds meaning by explaining that 'playlist_id' is the Spotify playlist ID and 'track_uris' is a list of Spotify track URIs. This compensates for the lack of schema descriptions.

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 'Add tracks to an existing playlist', specifying the verb and resource. It distinguishes from siblings like 'create_playlist' which creates a new playlist rather than adding to an existing one.

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 one wants to add tracks to a playlist but does not explicitly state when to use this tool vs alternatives, nor does it mention prerequisites like requiring the playlist to exist or authentication needs.

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

create_playlistA

Create a new Spotify playlist

Arguments: request (PlaylistCreateRequest): - name (str): Name of the playlist to create - description (str, optional): Description of the playlist (default: "") - public (bool, optional): Whether the playlist is public (default: False) - collaborative (bool, optional): Whether the playlist is collaborative (default: False)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - playlist_id (str): ID of the created playlist - playlist_name (str): Name of the created playlist - playlist_url (str): Spotify URL of the playlist - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 bears full responsibility for behavioral disclosure. It mentions the operation and return values but fails to disclose side effects such as required permissions (OAuth), rate limits, or that it modifies user data. This is a significant gap 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.

Conciseness4/5

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

The description is well-structured with separate sections for arguments and returns. It is clear and easy to read, though it could be slightly more concise without losing 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 parameter object, clear purpose), the description is fairly complete. It covers parameters, returns, and basic functionality, but lacks usage guidelines and behavioral transparency, which are minor gaps.

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

Parameters5/5

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

The description fully documents all parameters (name, description, public, collaborative) with types, optionality, and defaults. This adds value beyond the raw schema, which only provides titles and types. The return values are also clearly 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 'Create a new Spotify playlist' with a specific verb and resource. It distinguishes itself from sibling tools like add_tracks_to_playlist, get_user_playlists, etc.

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 does not explicitly state when to use this tool vs alternatives, nor does it mention prerequisites like authentication. The usage is implied by the verb 'create', but no exclusions or alternatives are provided.

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

get_albumA

Get detailed information about an album

Arguments: album_id (str): Spotify album ID to get information for market (str, optional): Market/country code for album availability (default: "US")

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - album (Dict): Detailed album information containing: - id (str): Spotify album ID - name (str): Album name - album_type (str): Type of album (album, single, compilation) - release_date (str): Release date - total_tracks (int): Number of tracks - popularity (int): Album popularity score (0-100) - spotify_url (str): Spotify album URL - artists (List[Dict]): List of artists with: - id (str): Artist ID - name (str): Artist name - images (List[Dict]): Album cover images - genres (List[str]): List of genres - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes
marketNoUS

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description bears full responsibility. It fully discloses the return structure including success, album dict, message, and error. It is a read operation with no side effects mentioned, which is appropriate.

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 well-structured with a one-line purpose followed by detailed arguments and return format. It is front-loaded and every part serves a purpose, though slightly verbose but not excessive.

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?

Given the tool has 2 parameters and no output schema, the description provides a complete return structure specification. It covers all necessary information for an agent to use the tool correctly.

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

Parameters5/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 providing clear parameter definitions: 'album_id (str): Spotify album ID to get information for' and 'market (str, optional): Market/country code for album availability (default: "US")'. This adds significant meaning beyond the schema.

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 'Get detailed information about an album', which is a specific verb+resource. It distinguishes itself from siblings like 'get_album_tracks' and 'get_artist' by focusing on album details.

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 does not provide explicit guidance on when to use this tool versus alternatives. Usage is implied through the tool name and purpose, but no exclusions or sibling comparisons are given.

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

get_album_tracksA

Get tracks from an album

Arguments: album_id (str): Spotify album ID to get tracks for market (str, optional): Market/country code for track availability (default: "US") limit (int, optional): Maximum number of tracks to return (default: 20, max: 50) offset (int, optional): Index of the first track to return (default: 0)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - album (Dict): Basic album information: - id (str): Album ID - name (str): Album name - tracks (List[Dict]): List of track objects containing: - id (str): Spotify track ID - name (str): Track name - track_number (int): Track number on the album - duration_ms (int): Track duration in milliseconds - spotify_url (str): Spotify track URL - artists (List[Dict]): List of artists with: - id (str): Artist ID - name (str): Artist name - total_tracks (int): Total number of tracks in the album - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
album_idYes
marketNoUS
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 full burden. It describes the return format in detail, including success/error fields, but does not explicitly state that the tool is read-only or mention any authentication or rate limits. The lack of behavioral disclosure beyond the return schema limits transparency.

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 well-structured with 'Arguments' and 'Returns' sections, and it includes clear parameter details. However, it is somewhat lengthy due to the detailed return type documentation. It is front-loaded with the purpose statement.

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 that an output schema exists (context signals indicate has output schema: true), the description includes a comprehensive return value specification covering success, album info, tracks, and error messages. All input parameters are explained, making it reasonably complete.

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 input schema has 0% description coverage, but the description adds meaningful semantics for all four parameters: explains album_id as a Spotify album ID, market as a country code, and limit/offset with defaults and max value. This compensates well for the schema's lack of descriptions.

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 starts with 'Get tracks from an album', which is a specific verb+resource combination. It clearly distinguishes from sibling tools like 'get_album' (which returns album metadata) and 'get_artist_albums' (which lists albums by an artist).

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 for retrieving tracks from a specific album, but does not explicitly state when to use this tool versus alternatives like 'get_album' or 'get_artist_albums'. No when-not conditions or context are provided.

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

get_artistA

Get detailed information about an artist

Arguments: artist_id (str): Spotify artist ID to get information for

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - artist (Dict): Detailed artist information containing: - id (str): Spotify artist ID - name (str): Artist name - popularity (int): Artist popularity score (0-100) - followers (int): Number of followers - genres (List[str]): List of genres - spotify_url (str): Spotify profile URL - images (List[Dict]): List of artist images with: - url (str): Image URL - height (int): Image height - width (int): Image width - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
artist_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations provided, so description must cover behavioral traits. It implies a safe read operation (no destructive actions) and outlines error handling, but does not explicitly state read-only nature or discuss rate limits or auth requirements.

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

Conciseness4/5

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

Description is well-structured with Arguments and Returns sections. It is slightly verbose due to listing all return fields, but front-loaded with purpose. Could be more concise by referencing a structured output schema if available.

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 simple tool with 1 parameter and a documented return, the description covers purpose, input, output details, and error handling. It is complete and leaves no ambiguity.

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 coverage, the description adds value by explaining the 'artist_id' parameter as 'Spotify artist ID to get information for', which the schema does not provide. It also describes the return 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?

The description clearly states 'Get detailed information about an artist' with a specific verb and resource. It distinguishes from sibling tools like get_album or get_artist_albums by focusing on the artist itself.

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 on when to use this tool versus alternatives such as search_artists or get_artist_top_tracks. The description only states what it does, not when it is appropriate.

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

get_artist_albumsA

Get albums for an artist

Arguments: artist_id (str): Spotify artist ID to get albums for include_groups (str, optional): Album types to include (default: "album,single") - "album": Full albums - "single": Singles - "appears_on": Appearances on other albums - "compilation": Compilation albums limit (int, optional): Maximum number of albums to return (default: 20, max: 50)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - artist (Dict): Basic artist information: - id (str): Artist ID - name (str): Artist name - albums (List[Dict]): List of album objects containing: - id (str): Spotify album ID - name (str): Album name - album_type (str): Type of album (album, single, compilation) - release_date (str): Release date - total_tracks (int): Number of tracks - spotify_url (str): Spotify album URL - images (List[Dict]): Album cover images - total_albums (int): Number of albums found - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
artist_idYes
include_groupsNoalbum,single
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

No annotations provided, so the description fully bears the burden. It explains input constraints (artist_id required, optional include_groups with allowed values, limit with max=50), return structure with fields, and error handling ('error' field). No contradictions or omissions.

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 long but well-organized with sections 'Arguments' and 'Returns'. While every sentence adds value, some redundancy (e.g., repeating 'album' types) could be trimmed. Still reasonably concise for the detail provided.

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?

The description is fully self-contained: it explains input, output (including nested structures like artist and album objects), optional parameters, defaults, and error handling. Given 3 params and a complex return type, it addresses all necessary information. The output schema is described in detail, so no gaps remain.

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

Parameters5/5

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

Schema coverage is 0% (no descriptions on schema props), but the description thoroughly explains each parameter: artist_id (Spotify ID), include_groups (allowed values and default), and limit (default 20, max 50). This adds critical meaning beyond schema names and types.

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 opens with 'Get albums for an artist', a specific verb-resource pair. It distinctly differs from sibling tools like get_artist (artist info), get_artist_top_tracks (top tracks), and search_artists (search). The return type and parameters reinforce the clear purpose.

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: provide an artist_id and optionally filter by album type or limit results. However, it does not explicitly state when to use this over alternatives like get_artist_top_tracks (for top songs) or get_new_releases (for new albums). A brief note on when not to use it would improve clarity.

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

get_artist_top_tracksA

Get top tracks for an artist

Arguments: artist_id (str): Spotify artist ID to get top tracks for market (str, optional): Market/country code for track availability (default: "US")

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - artist (Dict): Information about the artist: - id (str): Artist ID - name (str): Artist name - tracks (List[Dict]): List of track objects containing: - id (str): Spotify track ID - name (str): Track name - album (str): Album name - popularity (int): Track popularity score (0-100) - duration_ms (int): Track duration in milliseconds - spotify_url (str): Spotify track URL - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
artist_idYes
marketNoUS

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the full burden. It details the return structure and parameters but does not mention rate limits, auth requirements, or how 'top tracks' are determined. It is moderately transparent.

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 well-structured with clear sections for Arguments and Returns. It is front-loaded with the key phrase. Slightly verbose due to the full return type listing, but every sentence adds value.

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 2-parameter tool, the description covers purpose, parameters, return values, and error messages. Does not mention usage guidelines, but otherwise complete. An output schema exists, but the description's return documentation is still useful.

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

Parameters5/5

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

Schema description coverage is 0%, leaving the description to explain both parameters. It does so thoroughly: artist_id is required, market is optional with default 'US', and the types are clear. This fully compensates for the schema's lack of descriptions.

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 'Get top tracks for an artist', using a specific verb and resource. It distinguishes from siblings like get_artist and get_album_tracks, which cover different data.

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 on when to use this tool versus alternatives such as get_user_top_tracks or search_artists. It lacks any explicit when-to-use or when-not-to-use information.

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

get_new_releasesA

Get new album releases

Arguments: country (str, optional): Country code to get new releases for (default: "US") limit (int, optional): Maximum number of albums to return (default: 20, max: 50) offset (int, optional): Index of the first album to return (default: 0)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - albums (List[Dict]): List of new release albums containing: - id (str): Spotify album ID - name (str): Album name - album_type (str): Type of album (album, single, compilation) - release_date (str): Release date - total_tracks (int): Number of tracks - spotify_url (str): Spotify album URL - artists (List[Dict]): List of artists with: - id (str): Artist ID - name (str): Artist name - images (List[Dict]): Album cover images - total_albums (int): Number of albums found - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
countryNoUS
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations provided, but the description details the return structure and parameter defaults/limits, implying a read-only operation. It does not disclose potential rate limits or side effects, but the return schema adds transparency.

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 well-structured with clear sections for Arguments, Returns, and nested lists. It is slightly long but all parts are informative and earned their place.

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?

Given the output schema embedded in the description, all return values are documented. Parameters are fully explained. Sibling tools provide differentiation context. The tool is self-contained and complete for its purpose.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description adds full meaning: explaining country as a country code, limit as max number (20, max 50), offset as index. This significantly compensates for the schema's lack of descriptions.

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 clear verb+resource pattern ('Get new album releases') which distinguishes it from sibling tools like get_album or get_artist. It immediately conveys the tool's function.

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?

While no explicit when-to-use vs alternatives is given, the context of 'new releases' is clear and the sibling tools list helps the agent differentiate. A brief exclusion statement could improve, but it's not necessary.

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

get_user_playlistsA

Get current user's playlists

Arguments: None (no parameters required)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - playlists (List[Dict]): List of playlist objects containing: - id (str): Spotify playlist ID - name (str): Playlist name - description (str): Playlist description - public (bool): Whether the playlist is public - tracks_count (int): Number of tracks in the playlist - spotify_url (str): Spotify playlist URL - total_playlists (int): Total number of playlists - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

No annotations are provided, so the description must carry the burden. It comprehensively describes the return structure including success, playlist list with fields, total count, message, and error. However, it lacks disclosure of authentication needs or rate limits, which would improve 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 concise and well-organized with sections for 'Arguments' and 'Returns'. Every sentence provides value, with no redundancy or fluff.

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?

Given that the tool has no parameters and a detailed output schema expressed in the description, the description is fully complete. It covers all necessary information for an AI agent to select and invoke the tool correctly.

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

Parameters5/5

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

There are no parameters, and the input schema is empty. The description explicitly states 'Arguments: None (no parameters required)', which adds clarity beyond the schema. Schema coverage is 100% (trivially).

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: 'Get current user's playlists'. It specifies the resource (playlists) and the subject (current user), distinguishing it from sibling tools like 'create_playlist' or 'add_tracks_to_playlist'.

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 explicitly notes that there are no parameters required, making usage clear. It does not provide when-not-to-use advice or mention alternatives, but for a zero-parameter reading tool, this is sufficient context.

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

get_user_top_artistsA

Get user's top artists from Spotify

Arguments: time_range (str, optional): Time period for top artists (default: "medium_term") - "short_term": Last 4 weeks - "medium_term": Last 6 months
- "long_term": Several years limit (int, optional): Maximum number of artists to return (default: 20, max: 50) offset (int, optional): Index of the first artist to return (default: 0)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - artists (List[Dict]): List of artist objects containing: - id (str): Spotify artist ID - name (str): Artist name - popularity (int): Artist popularity score (0-100) - followers (int): Number of followers - genres (List[str]): List of genres - spotify_url (str): Spotify profile URL - images (List[Dict]): Artist images with url, height, width - time_range (str): Time range used for the query - total_artists (int): Number of artists returned - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
time_rangeNomedium_term
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It discloses return format and parameter effects but does not mention authentication requirements or that it uses the current user's listening history. This is a significant gap for a user-specific endpoint.

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?

Description is well-structured with clear sections for arguments and returns. Information is front-loaded and concise, with no extraneous content.

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?

The description covers all three optional parameters and details the return structure comprehensively. Given the low complexity and presence of an output schema, this description is fully adequate for using the tool correctly.

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

Parameters5/5

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

Schema coverage is 0%, but description comprehensively explains all three parameters: time_range with its three enum-like values, limit with default and max, offset with default. This adds necessary meaning beyond the schema.

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?

Description clearly states 'Get user's top artists from Spotify' with specific verb and resource. It is easily distinguished from sibling tools like get_user_top_tracks and search_artists.

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?

Description explains what the tool does but does not provide explicit guidance on when to use it vs alternatives. It relies on the context of sibling tool names, but no direct comparison or when-not-to-use instructions are given.

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

get_user_top_tracksA

Get user's top tracks from Spotify

Arguments: time_range (str, optional): Time period for top tracks (default: "medium_term") - "short_term": Last 4 weeks - "medium_term": Last 6 months - "long_term": Several years limit (int, optional): Maximum number of tracks to return (default: 20, max: 50) offset (int, optional): Index of the first track to return (default: 0)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - tracks (List[Dict]): List of track objects containing: - id (str): Spotify track ID - name (str): Track name - album (Dict): Album info with id, name, images - artists (List[Dict]): List of artists with id, name - popularity (int): Track popularity score (0-100) - duration_ms (int): Track duration in milliseconds - spotify_url (str): Spotify track URL - time_range (str): Time range used for the query - total_tracks (int): Number of tracks returned - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
time_rangeNomedium_term
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

The description clearly details the return structure including success/error handling, but does not mention authentication requirements or rate limits. However, since no annotations are provided, the description carries full burden and is largely transparent.

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 well-structured with clear sections for arguments and returns, but it is somewhat lengthy due to including the full return schema. However, this is justified as there is no output schema in the tool definition.

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 no annotations and no output schema, the description provides a comprehensive picture including return structure. Missing authentication context, but overall completeness is high for a data retrieval tool.

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

Parameters5/5

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

The input schema has 0% description coverage, but the tool description fully compensates by defining each parameter, defaults, options for time_range, and constraints on limit/offset. This adds significant meaning beyond the schema.

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 'Get user's top tracks from Spotify' with a specific verb and resource. It distinguishes from sibling tools like 'get_user_top_artists' (different resource) and 'get_artist_top_tracks' (different scope).

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 does not explicitly guide when to use this tool versus alternatives like 'get_artist_top_tracks' or 'get_user_top_artists'. Usage is implied by the purpose, but no exclusions or context for when-not-to-use are given.

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

search_artistsA

Search for artists on Spotify

Arguments: request (ArtistSearchRequest): - query (str): Search query for artist name - limit (int, optional): Maximum number of results to return (default: 10, max: 50)

Returns: Dict[str, Any]: - success (bool): Whether the operation was successful - artists (List[Dict]): List of artist objects containing: - id (str): Spotify artist ID - name (str): Artist name - popularity (int): Artist popularity score (0-100) - followers (int): Number of followers - genres (List[str]): List of genres - spotify_url (str): Spotify profile URL - total_found (int): Number of artists found - message (str): Success message - error (str, optional): Error message if failed

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Description details return structure and error handling but does not disclose rate limits, authentication needs, or any side effects. With no annotations, additional behavioral context is missing.

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 well-structured with clear sections for arguments and returns. It is moderately concise, though some detail could be trimmed without losing 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?

Given the tool's simplicity (single parameter with output schema present), the description covers input, output, and error handling adequately. Lacks discussion of advanced features like pagination.

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

Parameters5/5

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

The description provides parameter names, types, default values, and constraints (e.g., limit max 50) beyond the schema, and fully explains the output schema.

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 'Search for artists on Spotify' with a specific verb and resource. It distinguishes from sibling tools like 'get_artist' which retrieves a specific artist by ID.

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?

No explicit guidance on when to use this tool versus alternatives. While the purpose is clear, it lacks context for when to prefer search over direct lookups.

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

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct entity or action (album, artist, playlist, user top items, search) with no overlapping functionality. For example, get_album and get_album_tracks are clearly separated, and get_user_top_artists is distinct from get_user_top_tracks.

Naming Consistency4/5

Most tools follow a get_<entity> pattern (e.g., get_album, get_artist), with a few exceptions like create_playlist, add_tracks_to_playlist, and search_artists. While all use snake_case and are descriptive, the verb placement is not uniform.

Tool Count5/5

12 tools is ideal for a Spotify MCP server, covering core functionality (playlists, albums, artists, user preferences, search) without overwhelming the user. Each tool serves a clear purpose.

Completeness4/5

The tool surface covers crucial Spotify interactions, including CRUD-lite for playlists, detailed retrieval of albums/artists/tracks, and user-specific data. Minor gaps exist, such as the lack of a direct get_track tool (only accessible via album) and absence of recommendations or library management, but these are not critical for basic functionality.

Maintenance

ActivityInactive
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

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/nlevy/spotify-mcp-server'

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