Skip to main content
Glama
jamiew

Spotify MCP Server

by jamiew

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
SPOTIFY_CLIENT_IDYesYour Spotify Client ID from developer.spotify.com
SPOTIFY_REDIRECT_URINoThe redirect URI configured in your Spotify apphttp://localhost:8888
SPOTIFY_CLIENT_SECRETYesYour Spotify Client Secret from developer.spotify.com

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_meA

Get the signed-in user's Spotify profile.

Returns:
    UserProfile. email/country/product are unavailable on newer Spotify apps
    and come back empty rather than erroring.
get_playback_stateA

Get the current playback state: track, device, progress, shuffle and repeat.

Returns:
    PlaybackState (is_playing is False when nothing is playing)
control_playbackA

Control Spotify playback. Requires Premium and an active device.

Args:
    action: 'play', 'pause', 'next', 'previous', 'seek', 'volume', 'shuffle' or 'repeat'
    track_ids: Tracks to play (action='play'; ignored when context_uri is set)
    context_uri: Album/playlist/artist URI to play (action='play')
    position_ms: Position in milliseconds (required for action='seek')
    volume_percent: Volume 0-100 (required for action='volume')
    state: 'on'/'off' for shuffle; 'track'/'context'/'off' for repeat
    device_id: Target device (default: the currently active one)

Returns:
    Last observed PlaybackState, possibly unconfirmed.

Confirmation is best effort: at most five post-action reads with brief waits.
Stale state or a later read failure returns the last observation. Checks do not
verify every requested track, context or device transition.
list_devicesA

List the user's available Spotify devices.

Returns:
    DeviceList; use transfer_playback with a device id to make one active
transfer_playbackA

Move playback to a different device (see list_devices).

Args:
    device_id: Target device ID
    play: Start playing after the transfer (default True)
search_musicA

Search Spotify for tracks, albums, artists, or playlists.

Args:
    query: Search query
    qtype: Type ('track', 'album', 'artist', 'playlist')
    limit: Max results per page (1-50, default 10). Spotify caps search at 10
        per page for restricted apps and rejects anything larger; a larger
        limit is retried at the cap rather than failing. Check the returned
        `limit` for what was actually served, and use `offset` to go deeper.
    offset: Number of results to skip for pagination (default 0)
    year: Filter by year (e.g., '2024')
    year_range: Filter by year range (e.g., '2020-2024')
    genre: Filter by genre (e.g., 'electronic', 'hip-hop')
    artist: Filter by artist name
    album: Filter by album name

Returns:
    SearchResults with 'items' (list of tracks) and pagination info ('total', 'limit', 'offset')

Note: Filters use Spotify's search syntax. For large result sets, use offset to paginate.
Example: query='love', year='2024', genre='pop' searches for 'love year:2024 genre:pop'
add_to_queueA

Add a track to the playback queue.

Args:
    track_id: Track ID, spotify:track: URI or open.spotify.com URL
Returns:
    Status and message
get_queueA

Get the current playback queue. Returns: Currently playing track and queue of upcoming tracks

get_tracksA

Get detailed information about one or more Spotify tracks.

Args:
    track_ids: Single track ID or list of track IDs (up to 50)

Returns:
    TrackList with 'tracks' containing track metadata including release_date.
    For single ID, returns {'tracks': [track]}.

Note: Batch lookup is much more efficient where it is available - 50 tracks
in 1 API call instead of 50. Spotify withholds the batch endpoint from some
apps, in which case this transparently falls back to one request per track,
so the result is the same either way.
get_artistA

Get details for one or more Spotify artists, batched into a single request.

Args:
    artist_ids: One artist ID/URI, or a list of up to 50. A list costs one
        Spotify request rather than one per artist.
Returns:
    ArtistInfo whose `artists` follows the order requested. `top_tracks` is
    filled only when a single artist was requested, and is empty rather than
    an error when Spotify withholds that endpoint.
get_playlistA

Get basic information about a Spotify playlist.

Args:
    playlist_id: Spotify playlist ID

Returns:
    Playlist metadata (no tracks - use get_playlist_tracks for tracks)

Note: This returns playlist info only. For tracks, use get_playlist_tracks
which supports full pagination for large playlists.
create_playlistA

Create a new Spotify playlist.

Args:
    name: Playlist name
    description: Playlist description (default: empty)
    public: Whether playlist is public (default: False)

Returns:
    The created Playlist
add_tracks_to_playlistC

Add tracks to a playlist.

Args:
    playlist_id: Playlist ID
    track_uris: List of track URIs (up to 100)
list_playlistsA

Get current user's playlists with pagination support.

Args:
    limit: Max playlists to return per page (1-50, default 20)
    offset: Number of playlists to skip for pagination (default 0)

Returns:
    PlaylistList with 'items' (list of playlists) and pagination info ('total', 'limit', 'offset')

Note: For users with many playlists, use offset to paginate through results.
Example: offset=0 gets playlists 1-20, offset=20 gets playlists 21-40, etc.
get_playlist_tracksA

Get tracks from a playlist with full pagination support.

Args:
    playlist_id: Playlist ID
    limit: Max tracks to return (None for all tracks, up to 10,000 safety limit)
    offset: Number of tracks to skip for pagination (default 0)

Returns:
    PlaylistTracks with 'items' (list of tracks), 'total', 'limit', 'offset'

Note: Large playlists require pagination. Use limit/offset to get specific ranges:
- Get first 100: limit=100, offset=0
- Get next 100: limit=100, offset=100
- Get all tracks: limit=None (use with caution on very large playlists)
remove_tracks_from_playlistB

Remove tracks from a playlist.

Args:
    playlist_id: Playlist ID
    track_uris: List of track URIs to remove
update_playlist_detailsC

Modify playlist details.

Args:
    playlist_id: Playlist ID
    name: New playlist name (optional)
    description: New playlist description (optional)
    public: Whether playlist should be public (optional)
reorder_playlistA

Move a contiguous block of tracks to a new position within a playlist.

Args:
    playlist_id: Playlist ID
    range_start: Zero-based position of the first track to move
    insert_before: Zero-based position to insert the moved block before.
        Pass the playlist's total track count to move the block to the end.
    range_length: Number of consecutive tracks to move (default 1)
    snapshot_id: Optional playlist snapshot ID to guard against concurrent edits

Returns:
    ActionResult with the new snapshot_id

Note: Positions are zero-based. Example: move the first 3 tracks to just
before position 10 with range_start=0, range_length=3, insert_before=10.
get_albumA

Get details for one or more Spotify albums, batched into a single request.

Args:
    album_ids: One album ID/URI, or a list of up to 20 — Spotify's own cap
        for album batches, which is lower than the 50 for tracks and artists.

Returns:
    AlbumInfo whose `albums` follows the order requested. `tracks` holds the
    album's track list only when a single album was requested.
get_saved_tracksA

Get user's saved/liked tracks (Liked Songs library).

Args:
    limit: Max tracks to return per page (1-50, default 20)
    offset: Number of tracks to skip for pagination (default 0)

Returns:
    SavedTracks with 'items' (tracks with added_at timestamp) and pagination info
save_tracksA

Save (like) tracks to the user's library.

Args:
    track_ids: Track IDs or URIs (up to 50)
remove_saved_tracksA

Remove tracks from the user's saved (liked) tracks.

Args:
    track_ids: Track IDs or URIs (up to 50)
check_saved_tracksA

Check which tracks are already liked, without paging the whole library.

Up to 50 tracks per tool call, split into upstream chunks of at most 40.
Use this before save_tracks rather than paging through get_saved_tracks.

Args:
    track_ids: Track IDs or URIs (up to 50)
Returns:
    MembershipStatus.results maps each Spotify track id to true if liked
check_saved_albumsA

Check which albums are already saved to the library.

Up to 20 albums per tool call, preserving this tool's existing album cap.

Args:
    album_ids: Album IDs or URIs (up to 20)
Returns:
    MembershipStatus.results maps each Spotify album id to true if saved
check_following_artistsA

Check up to 50 artist follows in upstream chunks of at most 40.

Uses artist URIs on the consolidated library route, with a legacy fallback.
Requires user-follow-read; reauthorize if your existing grant lacks it.

Args:
    artist_ids: Artist IDs or URIs (up to 50)
Returns:
    MembershipStatus.results maps each Spotify artist id to true if followed
unfollow_playlistA

Unfollow a playlist, removing it from the user's library.

For playlists the user owns this is how Spotify deletes them — there is no
separate delete endpoint.

Args:
    playlist_id: Playlist ID or URI
get_recently_playedA

Get recently played tracks, most recent first.

Args:
    limit: Max tracks to return (1-50, default 20)

Returns:
    RecentlyPlayed with each track's played_at timestamp
get_top_itemsA

Get the user's top artists or tracks over a time range.

This remains useful when recommendations or related artists are unavailable
to the app. Spotify's policy also restricts analysis and AI ingestion.

Args:
    item_type: 'tracks' or 'artists' (default 'tracks')
    time_range: 'short_term' (~4 weeks), 'medium_term' (~6 months) or 'long_term'
    limit: Max items to return (1-50, default 20)

Returns:
    TopItems with either 'tracks' or 'artists' populated

Prompts

Interactive templates invoked by user choice

NameDescription
discover_similarFind artists similar to one you name, without a recommendations endpoint.
taste_profileSummarize listening habits from top items and recent plays.
create_mood_playlistCreate a playlist based on mood and preferences.
analyze_large_playlistAnalyze a large playlist efficiently using pagination.
discover_music_systematicallySystematically discover music using search pagination.

Resources

Contextual data attached and managed by the client

NameDescription
current_userCurrent user's profile.
current_playback_resourceCurrent playback state.

TDQS

B3.4/5.0

Scored across 28 tools

Disambiguation4/5

Most tools have clearly distinct purposes, and the descriptions carefully separate near-neighbors like get_saved_tracks vs check_saved_tracks. A few pairs (get_tracks/get_saved_tracks, unfollow_playlist/remove_tracks_from_playlist) are close enough in name to require reading descriptions carefully.

Naming Consistency4/5

Tool names generally follow a clear verb_noun pattern, and sets like check_saved_* and remove_*_from_playlist are internally consistent. There is some inconsistency between get_ and list_ for collections (get_saved_tracks vs list_playlists vs list_devices), but it does not seriously impede readability.

Tool Count3/5

28 tools is on the heavy side for a single MCP server, and the agent must juggle a large surface. Each tool does earn its place, but the count exceeds the range where the tool set feels tightly scoped.

Completeness2/5

The set covers playlists, saved tracks, search, and playback well, but album and artist library handling is one-sided: check_saved_albums and check_following_artists have no corresponding save/remove album or follow/unfollow artist tools. There is also no way to list saved albums, leaving obvious lifecycle gaps that will cause agent failures for those workflows.

Maintenance

ActivityMaintained
ResponsivenessSlow