A lightweight Model Context Protocol (MCP) server that enables AI assistants like Cursor & Claude to control Spotify playback and manage playlists.
A lightweight Model Context Protocol (MCP) server that enables AI assistants like Cursor & Claude to control Spotify playback and manage playlists.
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")
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()
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"] })
git clone https://github.com/marcelmarais/spotify-mcp-server.git
cd spotify-mcp-server
npm install
npm run build
http://localhost: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://localhost: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
}
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