Spotify Streamable MCP Server
Provides comprehensive Spotify integration with tools for searching the music catalog, reading player status, controlling playback and devices, managing playlists, and managing saved songs. Supports fuzzy search queries, voice control, and mood-based playlist creation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Spotify Streamable MCP Serverplay some relaxing jazz music"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Spotify MCP Server
This server is a remote Model Context Protocol (MCP) server for Spotify. A model can use it to search music, to read and control playback, and to manage playlists and saved songs. The server runs on Cloudflare Workers and on Bun. It uses the MCP server template 2.1 and the official MCP TypeScript SDK 2.3.0.
The server URL is the deployed Worker's MCP_PUBLIC_URL, for example https://spotify-mcp.<subdomain>.workers.dev/mcp.
The server uses protocol version 2026-07-28. It also accepts clients that use the 2025 protocol versions.
Author: overment
You connect this server to your MCP client at your own risk. A model can make mistakes. The server can change your playlists and saved songs, and it can control playback on your devices.

Alice, a desktop AI assistant

Claude Desktop
Tools
The tools do not copy Spotify's API one to one. Each tool takes a batch (queries[], operations[]), and each result has a sentence for the model (_msg) and structured data.
Tool | Function |
| Shows the player state, the devices with their |
| Finds tracks, albums, artists and playlists, for one or more queries. It uses the server's own Spotify app, not the user's account. |
| Runs a batch of playback operations: |
| Lists, reads, creates and changes playlists: |
| Lists, adds, removes and checks saved songs: |
Tracks, albums, artists and playlists in the results carry image, a thumbnail URL about 300 px wide. For a track, it is the album cover.
spotify_control reports a play or transfer as successful only after Spotify's player state confirms it. When play names no device, the tool prefers the active desktop app to a Web Player. For the details, refer to docs/playback.md.
A device_id is a long identifier from player_status, not a device name such as "MacBook Pro".
Related MCP server: Spotify MCP Server
Connect a client
Use the server URL and the Streamable HTTP transport. The client signs you in with Spotify the first time.
Client | Procedure |
Claude | In Settings → Connectors, add a custom connector with the server URL. |
Claude Code | Run |
MCP Inspector | Run |
Alice and Wonderlands use the same URL.
Authentication
The server is its own OAuth authorization server, in front of Spotify's OAuth. MCP clients do not receive Spotify tokens.
The client registers at
/registerand signs the user in at/authorize. The client must use PKCE S256.The server sends the user to Spotify. Spotify asks for the nine scopes of the server.
Spotify returns the user to the server's
/oauth/callback. The server keeps the Spotify tokens, encrypted.The client gets a code, and exchanges the code at
/tokenfor an access token and a refresh token. These tokens are opaque and have meaning only for this server.On each MCP request, the server finds the Spotify token for the access token. If the Spotify token expires in less than one minute, the server refreshes it first. The tools use the Spotify token. They do not see the client's token.
For the complete flow, the storage and the redirect rules, refer to docs/oauth.md.
Configuration
The deployment settings are in wrangler.production.jsonc (Workers; gitignored, with wrangler.production.example.jsonc as its shape) or .env (Bun). .env.example describes all variables.
Variable | Production value | Function |
|
| The public URL of the MCP endpoint. It is also the resource that tokens are issued for. |
|
| The |
| The server host, | The browser origins that the server accepts. |
|
| The server checks the tokens that it issued. |
| This server's origin, | The authorization server that clients use. The server does not start if they name another server. |
| Alice, Claude, Wonderlands and overment callbacks | The client redirect URIs that the proxy accepts, in addition to native loopback URIs. |
|
| The largest MCP request body. |
|
| The server also accepts 2025-era clients. |
| unset ( | When |
Secrets:
Secret | Function |
| The client ID of the server's Spotify app. |
| The client secret of the server's Spotify app. |
| 32 random bytes, base64url. The key encrypts the stored tokens. If you change it, all users must sign in again. |
| The older name of the key. The server uses it only when |
The Spotify accounts endpoints and the scopes are constants in src/services/spotify-oauth.ts. For the setup at Spotify and at Cloudflare, refer to docs/deploy.md.
Development
Requirements: Bun 1.4 or later, and Node.js 22.18 or later.
Install the dependencies:
bun installCopy
.env.exampleto.env. SetSPOTIFY_CLIENT_ID,SPOTIFY_CLIENT_SECRETandRS_TOKENS_ENC_KEY. In the Spotify dashboard, add the redirect URIhttp://127.0.0.1:3000/oauth/callback.Start the server:
bun run devThe server URL is
http://127.0.0.1:3000/mcp. To use the Cloudflare local runtime, runbun run dev:worker(port 8787). Put its secrets in.dev.vars.Before you commit, run the checks:
bun run check bun run test:smoke
bun run check does the type check, the lint check and the tests. bun run test:smoke starts the real server on Bun and on workerd. It signs in through a Spotify stand-in on loopback and calls the tools. No test uses the network.
Script | Function |
| Starts the server on Bun. |
| Starts the server in the Cloudflare local runtime. |
| Type check, lint check, tests, and the check of the generated Worker types. |
| Smoke tests on Bun and on workerd. |
| Deploys with the gitignored |
| Makes the Worker types again after a change to |
Project structure
src/
server.ts Identity, Runtime, Deps, and the hooks that connect the OAuth proxy
settings.ts The Spotify app, the encryption keys, the redirect allowlist
tools/ One file for each tool; shared/ has the schemas, playback checks and helpers
services/ Spotify Web API clients, and spotify-oauth.ts: Spotify as the OAuth provider
oauth/ The OAuth proxy. It is the same as in gmail-mcp (docs/oauth.md)
platform/ Template code. Do not change it
bun.ts Entry point for Bun: file storage
worker.ts Entry point for Workers: KV and the NativeOAuthAuthority Durable Object
tests/ Tests for the tools, the proxy and the platform; fixtures from before 1.1.0
scripts/ Smoke tests and the Spotify stand-inFor the template's concepts (the request path, defineTool, the error policy, the configuration checks), refer to the template documentation.
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Full Spotify Web API coverage - albums, artists, playlists, player controls, and more.
Spotify: Spotify Data API for Millions of songs & podcasts, artists, albums, playlists and more.
Spotify MCP — Web API via client_credentials OAuth
Search speech in podcasts, government meetings, and your own audio: speakers, entities, timestamps.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables control of Spotify playback, music search, and playlist management through natural language commands. Available in both Python and Vercel implementations with comprehensive OAuth2 authentication and device management.-
- FlicenseAqualityDmaintenanceEnables control of Spotify playback through OAuth authentication, including play/pause, track navigation, volume control, device management, and searching/playing songs by artist or track name.111-
- AlicenseAqualityDmaintenanceEnables searching and managing Spotify playlists, tracks, and user information through the Spotify Web API.10MIT
- AlicenseNot gradedqualityDmaintenanceA remote MCP server for Spotify with brokered OAuth and server-side intelligence, enabling search, playlist management, playback control, library analysis, and listening trends via natural language.85 npm4MIT