Spotify MCP Server A lightweight Model Context Protocol (MCP) server that enables AI assistants like Cursor & Claude to control Spotify playback and manage playlists. - Example Interactions - Read Operations - Album Operations - Play / Create Operations - Prerequisites - Installation - Creating a Spotify Developer Application - Spotify API Configuration - Authentication Process - Integrating with
Add this skill
npx mdskills install marcelmarais/spotify-mcp-serverComprehensive Spotify control with 20+ well-documented tools for playback, playlists, and library management
Spotify MCP Server
A lightweight Model Context Protocol (MCP) server that enables AI assistants like Cursor & Claude to control Spotify playback and manage playlists.
Contents
searchSpotify
query (string): The search termtype (string): Type of item to search for (track, album, artist, playlist)limit (number, optional): Maximum number of results to return (10-50)searchSpotify("bohemian rhapsody", "track", 20)getNowPlaying
getNowPlaying()getMyPlaylists
limit (number, optional): Maximum number of playlists to return (default: 20)offset (number, optional): Index of the first playlist to return (default: 0)getMyPlaylists(10, 0)getPlaylistTracks
playlistId (string): The Spotify ID of the playlistlimit (number, optional): Maximum number of tracks to return (default: 100)offset (number, optional): Index of the first track to return (default: 0)getPlaylistTracks("37i9dQZEVXcJZyENOWUFo7")getRecentlyPlayed
limit (number, optional): A number specifying the maximum number of tracks to return.getRecentlyPlayed({ limit: 10 })getUsersSavedTracks
limit (number, optional): Maximum number of tracks to return (1-50, default: 50)offset (number, optional): Offset for pagination (0-based index, default: 0)getUsersSavedTracks({ limit: 20, offset: 0 })getQueue
limit (number, optional): Maximum number of upcoming items to show (1-50, default: 10)getQueue({ limit: 20 })getAvailableDevices
getAvailableDevices()playMusic
uri (string, optional): Spotify URI of the item to play (overrides type and id)type (string, optional): Type of item to play (track, album, artist, playlist)id (string, optional): Spotify ID of the item to playdeviceId (string, optional): ID of the device to play onplayMusic({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })playMusic({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })pausePlayback
deviceId (string, optional): ID of the device to pausepausePlayback()resumePlayback
deviceId (string, optional): ID of the device to resume playback onresumePlayback()skipToNext
deviceId (string, optional): ID of the deviceskipToNext()skipToPrevious
deviceId (string, optional): ID of the deviceskipToPrevious()createPlaylist
name (string): Name for the new playlistdescription (string, optional): Description for the playlistpublic (boolean, optional): Whether the playlist should be public (default: false)createPlaylist({ name: "Workout Mix", description: "Songs to get pumped up", public: false })addTracksToPlaylist
playlistId (string): ID of the playlisttrackUris (array): Array of track URIs or IDs to addposition (number, optional): Position to insert tracksaddTracksToPlaylist({ playlistId: "3cEYpjA9oz9GiPac4AsH4n", trackUris: ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh"] })addToQueue
uri (string, optional): Spotify URI of the item to add to queue (overrides type and id)type (string, optional): Type of item to queue (track, album, artist, playlist)id (string, optional): Spotify ID of the item to queuedeviceId (string, optional): ID of the device to queue onaddToQueue({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })addToQueue({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })setVolume
volumePercent (number): The volume to set (0-100)deviceId (string, optional): ID of the device to set volume onsetVolume({ volumePercent: 50 })adjustVolume
adjustment (number): The amount to adjust volume by (-100 to 100). Positive values increase volume, negative values decrease it.deviceId (string, optional): ID of the device to adjust volume onadjustVolume({ adjustment: 10 }) (increase by 10%)adjustVolume({ adjustment: -20 }) (decrease by 20%)getAlbums
albumIds (string|array): A single album ID or array of album IDs (max 20)getAlbums("4aawyAB9vmqN3uQ7FjRGTy") or getAlbums(["4aawyAB9vmqN3uQ7FjRGTy", "1DFixLWuPkv3KT3TnV35m3"])getAlbumTracks
albumId (string): The Spotify ID of the albumlimit (number, optional): Maximum number of tracks to return (1-50)offset (number, optional): Offset for pagination (0-based index)getAlbumTracks("4aawyAB9vmqN3uQ7FjRGTy", 10, 0)saveOrRemoveAlbumForUser
albumIds (array): Array of Spotify album IDs (max 20)action (string): Action to perform: "save" or "remove"saveOrRemoveAlbumForUser(["4aawyAB9vmqN3uQ7FjRGTy"], "save")checkUsersSavedAlbums
albumIds (array): Array of Spotify album IDs to check (max 20)checkUsersSavedAlbums(["4aawyAB9vmqN3uQ7FjRGTy", "1DFixLWuPkv3KT3TnV35m3"])git clone https://github.com/marcelmarais/spotify-mcp-server.git
cd spotify-mcp-server
npm install
npm run build
http://127.0.0.1:8888/callback)Create a spotify-config.json file in the project root (you can copy and modify the provided example):
# Copy the example config file
cp spotify-config.example.json spotify-config.json
Then edit the file with your credentials:
{
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"redirectUri": "http://127.0.0.1:8888/callback"
}
The Spotify API uses OAuth 2.0 for authentication. Follow these steps to authenticate your application:
npm run auth
The script will generate an authorization URL. Open this URL in your web browser.
You'll be prompted to log in to Spotify and authorize your application.
After authorization, Spotify will redirect you to your specified redirect URI with a code parameter in the URL.
The authentication script will automatically exchange this code for access and refresh tokens.
These tokens will be saved to your spotify-config.json file, which will now look something like:
{
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"redirectUri": "http://localhost:8888/callback",
"accessToken": "BQAi9Pn...kKQ",
"refreshToken": "AQDQcj...7w",
"expiresAt": 1677889354671
}
Note: The expiresAt field is a Unix timestamp (in milliseconds) indicating when the access token expires.
refreshToken, so you don't need to re-authenticate manually. If the refresh fails, you'll need to run npm run auth again to re-authenticate.To use your MCP server with Claude Desktop, add it to your Claude configuration:
{
"mcpServers": {
"spotify": {
"command": "node",
"args": ["spotify-mcp-server/build/index.js"]
}
}
}
For Cursor, go to the MCP tab in Cursor Settings (command + shift + J). Add a server with this command:
node path/to/spotify-mcp-server/build/index.js
To set up your MCP correctly with Cline ensure you have the following file configuration set cline_mcp_settings.json:
{
"mcpServers": {
"spotify": {
"command": "node",
"args": ["~/../spotify-mcp-server/build/index.js"],
"autoApprove": ["getListeningHistory", "getNowPlaying"]
}
}
}
You can add additional tools to the auto approval array to run the tools without intervention.
Install via CLI
npx mdskills install marcelmarais/spotify-mcp-serverSpotify MCP Server is a free, open-source AI agent skill. Spotify MCP Server A lightweight Model Context Protocol (MCP) server that enables AI assistants like Cursor & Claude to control Spotify playback and manage playlists. - Example Interactions - Read Operations - Album Operations - Play / Create Operations - Prerequisites - Installation - Creating a Spotify Developer Application - Spotify API Configuration - Authentication Process - Integrating with
Install Spotify MCP Server with a single command:
npx mdskills install marcelmarais/spotify-mcp-serverThis downloads the skill files into your project and your AI agent picks them up automatically.
Spotify MCP Server works with Claude Code, Claude Desktop, Cursor, Vscode Copilot, Windsurf, Continue Dev, Gemini Cli, Amp, Roo Code, Goose. Skills use the open SKILL.md format which is compatible with any AI coding agent that reads markdown instructions.