Spotify
MCP server connecting LLMs to Spotify, with smart-batching and large-playlist tools
Connector by jamiew · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/jamiew-spotify-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 17 read · 6 write · 5 delete
- Secrets
- 2 (API keys, tokens or passwords)
- Install scripts
- Not scanned yet
- Runs as
- Python package
Tools by what they do 28
Read from the source code; the running server may list different tools.
Read 17 · Look things up without changing anything.
check_following_artistscheck_saved_albumscheck_saved_tracksget_albumget_artistget_meget_playback_stateget_playlistget_playlist_tracksget_queueget_recently_playedget_saved_tracks
Show 5 more tools
get_top_itemsget_trackslist_deviceslist_playlistssearch_music
Write 6 · Create, change, send or run things.
add_to_queueadd_tracks_to_playlistcontrol_playbackcreate_playlistsave_trackstransfer_playback
Delete 5 · Delete, drop, revoke or wipe things.
remove_saved_tracksremove_tracks_from_playlistreorder_playlistunfollow_playlistupdate_playlist_details
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
SPOTIFY_CLIENT_IDSPOTIFY_CLIENT_SECRET
Other settings (environment variables or headers).
SPOTIFY_REDIRECT_URI
Tools (28)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_to_queueAdd to QueueAdd a track to the playback queue. Args: track_id: Track ID, spotify:track: URI or open.spotify.com URL Returns: Status and message
add_tracks_to_playlistAdd Tracks to PlaylistAdd tracks to a playlist. Args: playlist_id: Playlist ID track_uris: List of track URIs (up to 100)
check_following_artistsCheck Followed Artistsread-onlyCheck 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
check_saved_albumsCheck Saved Albumsread-onlyCheck 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_saved_tracksCheck Liked Songsread-onlyCheck 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
control_playbackControl PlaybackControl 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 obse…
create_playlistCreate PlaylistCreate a new Spotify playlist. Args: name: Playlist name description: Playlist description (default: empty) public: Whether playlist is public (default: False) Returns: The created Playlist
get_albumGet Albumread-onlyGet 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_artistGet Artistread-onlyGet 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_meSpotify Profileread-onlyGet 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_stateNow Playingread-onlyGet the current playback state: track, device, progress, shuffle and repeat. Returns: PlaybackState (is_playing is False when nothing is playing)
get_playlistGet Playlistread-onlyGet 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.
get_playlist_tracksGet Playlist Tracksread-onlyGet 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)
get_queueGet Queueread-onlyGet the current playback queue. Returns: Currently playing track and queue of upcoming tracks
get_recently_playedRecently Playedread-onlyGet 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
Show 13 more tools
get_saved_tracksGet Liked Songsread-onlyGet 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
get_top_itemsTop Artists and Tracksread-onlyGet 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
get_tracksGet Tracksread-onlyGet 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.
list_devicesAvailable Devicesread-onlyList the user's available Spotify devices. Returns: DeviceList; use transfer_playback with a device id to make one active
list_playlistsList My Playlistsread-onlyGet 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.
remove_saved_tracksUnlike Trackscan change or delete dataRemove tracks from the user's saved (liked) tracks. Args: track_ids: Track IDs or URIs (up to 50)
remove_tracks_from_playlistRemove Tracks from Playlistcan change or delete dataRemove tracks from a playlist. Args: playlist_id: Playlist ID track_uris: List of track URIs to remove
reorder_playlistReorder Playlistcan change or delete dataMove 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…
save_tracksLike TracksSave (like) tracks to the user's library. Args: track_ids: Track IDs or URIs (up to 50)
search_musicSearch Spotifyread-onlySearch 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.,…
transfer_playbackSwitch DeviceMove playback to a different device (see list_devices). Args: device_id: Target device ID play: Start playing after the transfer (default True)
unfollow_playlistUnfollow Playlistcan change or delete dataUnfollow 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
update_playlist_detailsEdit Playlist Detailscan change or delete dataModify playlist details. Args: playlist_id: Playlist ID name: New playlist name (optional) description: New playlist description (optional) public: Whether playlist should be public (optional)
Signals
- Stars
- 12
- Forks
- 3
- Open issues
- 0
- Weekly downloads
- 126
- Last commit
- Sep 20, 2026 (1 month ago)
- Last release
- Sep 20, 2026 (1 month ago)
- Last package publish
- Sep 20, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.jamiew/spotify-mcp- Version
- 0.7.0
- Auth
- API key
- Packages
- pypi spotify-mcp-jamiew
- License
- MIT
- Repository
- github.com/jamiew/spotify-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from jamiew
Cite this page
Spotify MCP server. Agent Mart. https://agentmart.dev/connectors/jamiew-spotify-mcp (last updated 2026-10-24)