spotify mcp server
A lightweight Model Context Protocol server that enables AI assistants like Cursor & Claude to control Spotify playback and manage playlists.
A lightweight Model Context Protocol 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
Description: Search for tracks, albums, artists, or playlists on Spotify
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)Example: searchSpotify("bohemian rhapsody", "track", 20)
getNowPlaying
Description: Get information about the currently playing track on Spotify
Example: getNowPlaying()
getMyPlaylists
Description: Get a list of the current User is playlists on Spotify
limit
(number, optional): Maximum number of playlists to return (default: 20)offset
(number, optional): Index of the first playlist to return (default: 0)Example: 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
Description: Start playing a track, album, artist, or playlist on Spotify
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" })
Alternative: playMusic({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })
pausePlayback
Description: Pause the currently playing track on Spotify
deviceId
(string, optional): ID of the device to pauseExample: pausePlayback()
skipToNext
Description: Skip to the next track in the current playback queue
deviceId
(string, optional): ID of the deviceExample: skipToNext()
skipToPrevious
Description: Skip to the previous track in the current playback queue
deviceId
(string, optional): ID of the deviceExample: skipToPrevious()
createPlaylist
Description: Create a new playlist on Spotify
name
(string): Name for the new playlistdescription
(string, optional): Description for the playlistpublic
(boolean, optional): Whether the playlist should be public (default: false)Example: 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 tracksExample: addTracksToPlaylist({ 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" })
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
[
{
"description": "Search for tracks, albums, artists, or playlists on Spotify",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of results to return (10-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
},
"query": {
"description": "The search query",
"type": "string"
},
"type": {
"description": "The type of item to search for either track, album, artist, or playlist",
"enum": [
"track",
"album",
"artist",
"playlist"
],
"type": "string"
}
},
"required": [
"query",
"type"
],
"type": "object"
},
"name": "searchSpotify"
},
{
"description": "Get information about the currently playing track on Spotify",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "getNowPlaying"
},
{
"description": "Get a list of the current User is playlists on Spotify",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of playlists to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
}
},
"type": "object"
},
"name": "getMyPlaylists"
},
{
"description": "Get a list of tracks in a Spotify playlist",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"limit": {
"description": "Maximum number of tracks to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
},
"playlistId": {
"description": "The Spotify ID of the playlist",
"type": "string"
}
},
"required": [
"playlistId"
],
"type": "object"
},
"name": "getPlaylistTracks"
},
{
"description": "Start playing a Spotify track, album, artist, or playlist",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deviceId": {
"description": "The Spotify device ID to play on",
"type": "string"
},
"id": {
"description": "The Spotify ID of the item to play",
"type": "string"
},
"type": {
"description": "The type of item to play",
"enum": [
"track",
"album",
"artist",
"playlist"
],
"type": "string"
},
"uri": {
"description": "The Spotify URI to play (overrides type and id)",
"type": "string"
}
},
"type": "object"
},
"name": "playMusic"
},
{
"description": "Pause Spotify playback on the active device",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deviceId": {
"description": "The Spotify device ID to pause playback on",
"type": "string"
}
},
"type": "object"
},
"name": "pausePlayback"
},
{
"description": "Skip to the next track in the current Spotify playback queue",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deviceId": {
"description": "The Spotify device ID to skip on",
"type": "string"
}
},
"type": "object"
},
"name": "skipToNext"
},
{
"description": "Skip to the previous track in the current Spotify playback queue",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deviceId": {
"description": "The Spotify device ID to skip on",
"type": "string"
}
},
"type": "object"
},
"name": "skipToPrevious"
},
{
"description": "Create a new playlist on Spotify",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"description": {
"description": "The description of the playlist",
"type": "string"
},
"name": {
"description": "The name of the playlist",
"type": "string"
},
"public": {
"description": "Whether the playlist should be public",
"type": "boolean"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "createPlaylist"
},
{
"description": "Add tracks to a Spotify playlist",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"playlistId": {
"description": "The Spotify ID of the playlist",
"type": "string"
},
"position": {
"description": "Position to insert the tracks (0-based index)",
"minimum": 0,
"type": "number"
},
"trackIds": {
"description": "Array of Spotify track IDs to add",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"playlistId",
"trackIds"
],
"type": "object"
},
"name": "addTracksToPlaylist"
},
{
"description": "Resume Spotify playback on the active device",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deviceId": {
"description": "The Spotify device ID to resume playback on",
"type": "string"
}
},
"type": "object"
},
"name": "resumePlayback"
},
{
"description": "Adds a track, album, artist or playlist to the playback queue",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"deviceId": {
"description": "The Spotify device ID to add the track to",
"type": "string"
},
"id": {
"description": "The Spotify ID of the item to play",
"type": "string"
},
"type": {
"description": "The type of item to play",
"enum": [
"track",
"album",
"artist",
"playlist"
],
"type": "string"
},
"uri": {
"description": "The Spotify URI to play (overrides type and id)",
"type": "string"
}
},
"type": "object"
},
"name": "addToQueue"
}
]