
Spotify MCP
io.github.NovaLux12Published by GitHub account NovaLux12v3.1.1Updated Oct 24, 2026
Spotify Web API MCP: playback, library, playlists, search, podcasts. Not affiliated with Spotify.
Overview
Local Spotify Web API MCP server that lets an assistant search, control playback, manage playlists and library, and explore podcasts in a user's Spotify…
- What you can do
- Search the Spotify catalog and look up tracks, albums, artists, shows and episodes
- Control playback on devices: play, pause, skip, seek, volume and queue
- Create, edit, merge, subtract and de-duplicate playlists, with dry-run previews and receipts
- Manage the saved library and following, and check what is saved
- Browse podcasts and audiobook content, plus listening analytics and optional stats.fm taste reads
- Diagnose token, scope and rate-limit state with a read-only doctor tool
- When to use it
- Useful when you want an assistant to act on a real Spotify account: building or cleaning playlists, queueing music, checking what is saved, or reviewing listening habits, rather than only answering questions about music.
- Requirements
- Runs locally via npx on Node 22.9 or later. Needs a Spotify developer app with the redirect URI registered, the SPOTIFY_CLIENT_ID environment variable, and a one-time browser login that stores tokens on disk. Playback control requires Spotify Premium; some endpoints are gated at the app-registration level.
Installation
In SourceWeft
- Open Spotify MCP in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
SpotifyMCP
[CI] [npm version] [License: MIT] [Node]
Spotify Web API MCP: playback, library, playlists, search, podcasts. Not affiliated with Spotify.
A broad Spotify Web API tool surface, plus extras most servers skip. Registration-gated wrappers are explained rather than hidden; see Registration-gated endpoints for the generated list.
What you get by default, and what to do about the rest. A server started with no environment registers a curated surface — search, playback, playlists, library, following — sized so the tool list does not dominate the context window before you have typed anything. SPOTIFY_MCP_TOOLSETS=all registers the entire registry instead, and the stats.fm tools are opt-in with SPOTIFY_MCP_STATSFM=1. Both are one line in docs/configuration.md.
A server started with no SPOTIFY_MCP_TOOLSETS registers 131 tools (150,111 bytes of schema) — the curated default surface (#889). SPOTIFY_MCP_TOOLSETS=all registers all 562 tools, along with 17 fixed resources, 28 resource templates, and 14 prompts. Toolsets and production gates can trim a configured host further; both figures describe a real production tools/list after finalizers.
3.0 and later
3.0 was the release where the open issue list went to zero — every epic, every issue under it, every contradiction we turned up auditing ourselves. Most of that backlog was never "bugs" in the crashing sense; it was places where this server reported a value it had not actually checked, which is the only kind of wrong that is genuinely dangerous.
It also removed tools, because Spotify deleted the endpoints underneath them in February 2026 — including artist follows, which have no migration target at all.
🤖 Paste this to your agent
Copy the block below into Claude Code, Cursor, OpenClaw, or any coding agent — it will set SpotifyMCP up for you.
⚠️ Never paste your Spotify credentials into a chat. Spotify's Developer Terms treat the Client ID as a credential: §VI.1.1 groups "I.D.s, client I.D.s, keys, passwords, security codes, or tokens" together as Security Codes, §VI.1.3 forbids disclosing them to any other party, and §VI.1.4 makes you responsible for their confidentiality. Anything you type into a conversation is retained by the model provider, written to shell history, and carried in the agent's context window. The Client ID is the only credential this server needs, and it is a Security Code rather than a public identifier — treat it like a password.
Why this one
Quick start
1. Create a Spotify app
Spotify Developer Dashboard → Create app → add this Redirect URI exactly:
Copy the Client ID.
2. Authenticate
Opens a browser, saves tokens to ~/.spotify-mcp/tokens.json, auto-refreshes after.
Windows & headless
Windows (Command Prompt):
Windows (PowerShell):
Windows is supported for install and everyday use, and is not covered by CI. The commands above are the supported path, but the test suite runs on Linux only, so a Windows-specific regression would not be caught before release. See docs/platform-support.md for exactly what is and is not verified there, and what the known gaps are.
Headless / remote host:
Check: npx -y @novalux12/spotify-mcp@latest doctor — exit 0 means you're good.
3. Add to your MCP host
Restart the host. A hammer icon in the chat input means it's connected.
Claude Code · OpenClaw · other hosts
Claude Code (no JSON editing):
OpenClaw — ~/.openclaw/openclaw.json → mcp.servers:
Any spec-compliant host works — same command/args/env shape under mcpServers or servers. If the host can't pass env vars, authenticate once beforehand; the token cache persists.
What you can ask
- "What are my top tracks this month?"
- "Make a late-night driving playlist"
- "Add Blinding Lights to my workout playlist"
- "What podcasts have new episodes?"
- "Clean duplicates across all my playlists"
- "What does my taste look like? Build a playlist from it"
- "Do my stats.fm lifetime genres match what I've played this month?"
Configuration
All via env vars — no config file. Only SPOTIFY_CLIENT_ID is required.
Full reference: docs/configuration.md
spotify_doctor (CLI + in-server tool) diagnoses token state, scope gaps, Premium gating, rate-limit cooldowns, request/quota usage (cumulative + rolling-window counts, #904), and read-cache pressure (entries held, bytes retained, responses too large to cache, #894) without extra setup.
Upgrading to 2.0
2.0 is a contract release. One tool name is gone, four things moved, and one guarantee tightened:
-
get_show_episodesis removed. Uselist_show_episodes(same endpoint, same arguments, minus the drifted alias). It was the only name that changed; everything else in the surface keeps its name. The exact registry totals are generated at the top of this file, so this sentence deliberately carries no count of its own to fall behind. -
Destructive writes fail closed. Any confirmation-gated bulk write now refuses when the client cannot elicit, instead of proceeding unprompted.
archive_played_episodes'sconfirm: trueno longer authorises the delete (it is still accepted, and every result says it was ignored). For headless automation, setSPOTIFY_MCP_CONFIRM=neverdeliberately. -
Playlist set-operation inputs are canonical. A/B pairs are
playlist_a/playlist_b; ordered lists areplaylists;playlist_subtracttakes the base asbase_playlist_id. This was the 2.0 contract; the old spellings it was allowed to keep alongside it were withdrawn in 3.0 (#1287). They are no longer in any tool's schema, and a call that still sends one is refused before any Spotify request with avalidationerror whosereasonisretired_input, naming both what was sent and what to send instead. Each tool declared exactly one alias pair or one alias list, so the table below is a per-tool migration map rather than a bundle:base_playlist_idis required again: with the positional form gone there is no longer a base for a caller to omit. A name the tool does not declare, and is not a retired spelling, is anunknown_paramerror — a different claim fromretired_input, which says the server published that name until 3.0. -
Numeric caps have canonical names.
max_resultscaps what is returned;limitandscan_capcap how much of each source is read. -
Unknown arguments are rejected with a typed
unknown_paramerror rather than ignored, so a renamed parameter fails loudly instead of silently doing nothing.
Run spotify_doctor after upgrading: it reports the registered surface, the
gates that hid modules, and the granted scopes in one call.
Docs
- docs/v3-roadmap.md — what's coming in 3.0, and the one bug underneath all of it
- docs/migration-v3.md — every retired name in 3.0 and what replaced it, including the one operation with no replacement
- SPEC.md — every tool, resource & prompt
- ARCHITECTURE.md — how it's built
- docs/configuration.md — all env vars
- docs/cli.md —
tools,call,watch,export,init: the CLI as an MCP client - docs/schema-budgets.md — per-module schema budgets and registration order
- docs/statsfm.md — stats.fm second source: setup, tool cheat sheet, gotchas
- docs/cookbook.md — copy-paste agent recipes
- docs/non-goals.md — what v2 will not do, why, and what it offers instead
- docs/taste.md — anonymized taste showcase driving a playlist
- docs/wave2-composites.md — read-only taste composites
- docs/distribution.md — distribution and release notes
- docs/faq.md — auth, Premium, 403s, headless, tokens
- docs/compliance.md — brand marks, attribution & the outbound
User-Agent - CONTRIBUTING.md — dev setup & conventions
- CHANGELOG.md — release history
Requirements
- Premium for playback control (play/pause/skip/seek/volume/queue). Free accounts can still use search, library & playlists.
- Node 22.9+, Spotify app in dev mode (5 users until extended quota).
- Audiobooks gated by Spotify to US/UK/CA/IE/NZ/AU.
- A subset of endpoints is registration-gated — 403 on current app registrations regardless of scopes or Premium. Whether a grandfathered registration still answers
200is unverified (#1338). This is a property of your app registration, not of the tool. See Registration-gated endpoints.
Registration-gated endpoints
Some Web API endpoints are denied at the app-registration level: on current Spotify app registrations they return 403 Forbidden no matter which OAuth scopes you grant or whether the account is Premium. This is Spotify-side gating, not a misconfiguration on your end.
Nothing here is simply "removed". Three sources describe this class and they do not agree, which is why the table below states the runtime behaviour instead of a verdict:
- Spotify's February 2026 changelog marks a batch of operations
[REMOVED]. - The live OpenAPI schema still publishes most of those same paths, carrying
deprecated: truerather than deleting them —/artists/{id}/top-tracksand all sevenGet Severalbatch paths among them. - The runtime truth is neither document: it is what your app registration is allowed to read. A registration without the grant answers
403/404/410. Whether a grandfathered registration still answers200is unverified (#1338): no probe in this repository shows it, and the one probe artefact that was once cited for it records403on every such path.
So a 403 here is a property of the registration, not of the tool. No tool is hidden for being gated, no gated tool is a zombie: each one either reads a documented replacement and answers, or makes the call and explains the 403 in plain English. The authoritative list is the GATED_FAMILIES array in src/gating.ts — GATED_PATH_PATTERNS is derived from it, so the classifier and this table cannot drift apart.
All 8 families above are operations Spotify's February 2026 changelog marks [REMOVED].
Confirm the list yourself against the source of truth:
Notes:
- A family in that list is a runtime classifier, not a promise that a tool calls it. Three families (
browse-new-releases,me-type-contains,playlist-followers-contains) have no live call site left — the tools that used them were migrated onto replacements — and their patterns are retained so a future caller is still covered by the 403 contract rather than silently losing it. GET /me/library/containsis not gated (it returned 200 on the same probe) and backs the saved-state reads behindcheck_playlist_following,restore_library_snapshotand receipt verification. Thecontainsfamilies above are the documented per-type checks, which the changelog marks removed in favour of this one. (The playlist duplicate-cleanup tools are not in that set — they page/playlists/{id}/items.)- Batch fallback (#725). When a
Get Severalbatch endpoint answers 403,fetchSeveralretries through per-idGET /<kind>/{id}calls on the client's existing queue/backoff. Per-id paths are not in the gated class, so the read still succeeds. The response carriesdegraded: trueand a[degraded: batch endpoint returned 403; … fetched individually]footer in prose, plusdegraded_reasoninstructuredContent, so a caller can tell a per-item round-trip from a clean batch read. - Endpoints Spotify lists as removed that this server does not wrap at all (no shipped tool, so nothing to explain):
/recommendations,/recommendations/available-genre-seeds,/me/apps,/me/chapters, the/artists/{id}/related-artists,/audio-features,/audio-analysisand/browse/featured-playlistsreads, and the/playlists/{id}/tracksfamily (superseded by/playlists/{id}/items). These are absent from the table above because absence of a tool is the honest answer for them — there is no 403 to explain.
Troubleshooting
- "Not authenticated" → re-run
auth; check~/.spotify-mcp/tokens.jsonexists and the redirect URI matches exactly (no trailing slash). - Auth loop / S256 error → open a private window, log into spotify.com first, then retry the auth URL there.
- Port in use (8888) → free the port, set
SPOTIFY_REDIRECT_URIto another port, or useSPOTIFY_HEADLESS=1. The message namesEADDRINUSEand the port because the usual cause is a previousauthstill holding it. - Timed out waiting for the browser callback → not a port conflict; the listener bound and has been closed. Retry, and check the redirect URI is registered exactly. Bound it with
SPOTIFY_AUTH_TIMEOUT_MS(default 5 min). - "Premium required" on playback → expected on Free accounts; no workaround.
Forbiddenon lookup tools (categories, markets, top-tracks, user profiles, the per-typecontainschecks) → these endpoints are registration-gated by Spotify; see Registration-gated endpoints. (GET /me/library/containsis not one of them, so a 403 there is a real problem, not a gated registration.)- Still stuck?
npx -y @novalux12/spotify-mcp@latest doctoror ask your agent to run the spotify-mcp-doctor skill.
What this server is not
v2 has a written non-goals list, so a request for something outside it gets an answer rather than a maybe. Each entry below carries its reasoning in SPEC §1, and docs/non-goals.md is the record behind both: what each one rules out, the source it rests on, and what the server offers instead.
- Audio streaming, audio analysis, and offline playback
- A web UI, a dashboard, or an MCP UI surface
- Multi-tenant or hosted operation
- Sharing one user's credentials across users
- Lyrics
- The Spotify Connect SDK and native client integration
- Voice control
- Training a model on Spotify data, or exporting derived profiles
- A second third-party upstream, ad-tech, or monetization egress
- Working around Spotify's own controls
Development
Not affiliated with Spotify. Use per the Spotify Developer Terms.
MIT © Carme99 and NovaLux12 contributors · Acknowledges calebWei/SpotifyMCP and varunneal/spotify-mcp.
Source: README.md at commit 7b634c7
Tools
0Version history
9- v3.1.1LatestOct 18, 2026
- v3.1.0Oct 9, 2026
- v3.0.1Oct 2, 2026
- v3.0.0Oct 1, 2026
- v2.1.2Sep 26, 2026
- v2.1.1Sep 26, 2026
- v2.0.0Sep 25, 2026
- v1.31.0Sep 25, 2026
- v1.30.0Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts