关于 Spotify MCP
Spotify MCP 将 Spotify Web API 封装为面向音乐听众与自动化流程的 MCP 服务,涵盖播放、搜索、曲库、播放列表和播客。工具集可按需裁剪,并提供只读模式、写入预览和变更凭据等控制。
主要功能
- 01播放控制与设备感知
- 02搜索曲目、专辑和播客
- 03管理曲库与播放列表
- 04可选 stats.fm 工具集
- 05只读模式与写入安全控制
适用场景
- 01按喜好创建播放列表
- 02整理播放列表中的重复曲目
- 03查找播客新节目
- 04检查播放数据与授权状态
MCP 相关
该服务向 MCP 客户端公开 Spotify Web API 工具,以及资源、资源模板和提示词。默认注册精选工具集,也可配置为完整工具集或启用 stats.fm 工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
131收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 每种类型的结果数,1–10。默认值:5 |
| query | string | 是 | 搜索查询 |
| types | array | 否 | 要搜索的内容类型,使用数组表示。默认值:["track","artist","album"]。例如,传入 ["artist"] 可仅搜索艺人。"audiobook" 仅在美国、英国、加拿大、爱尔兰、新西兰和澳大利亚市场提供。 |
| market | string | 否 | ISO 3166-1 alpha-2 国家/地区代码,例如 'US'——会自动转换为大写 |
| offset | integer | 否 | 要返回的第一条结果的索引,0–1000。与 limit 配合使用可分页浏览结果 |
| max_results | integer | 否 | 要返回的最大条目数(默认值:SPOTIFY_MCP_MAX_ITEMS 环境变量或 50) |
| response_format | enum | 否 | 'concise' = 面向用户的简明文本,'detailed' = 包含更多字段的文本,'json' = 原始 API 对象concise | detailed | json |
| include_external | enum | 否 | 传入 "audio",以包含标记为可播放的外部托管音频条目audio |
详细介绍
SpotifyMCP
Spotify Web API MCP:播放、资料库、播放列表、搜索、播客。与 Spotify 无关联。
提供广泛的 Spotify Web API 工具,另有大多数服务端都没有的额外功能。需要注册才能使用的封装器会有说明,而非隐藏;请参阅需要注册的端点,查看生成的列表。
默认提供的内容,以及如何获取其余内容。 在未设置任何环境变量的情况下启动服务,会注册一组精心挑选的功能——搜索、播放、播放列表、资料库、关注——其规模经过控制,确保在你输入任何内容之前,工具列表不会占据过多上下文窗口。设置 SPOTIFY_MCP_TOOLSETS=all 可注册整个注册表;stats.fm 工具则需通过 SPOTIFY_MCP_STATSFM=1 启用。两项设置都只需在 docs/configuration.md 中添加一行。
在未设置 SPOTIFY_MCP_TOOLSETS 的情况下启动服务,会注册 131 个工具(150,111 字节的架构)——精选的默认功能集(#889)。设置 SPOTIFY_MCP_TOOLSETS=all 可注册全部 562 个工具,以及 17 个固定资源、28 个资源模板和 14 个提示词。工具集和生产环境门控还可以进一步精简已配置的主机;这两个数字均反映了最终处理器执行后,真实生产环境中的 tools/list 结果。
3.0 及更高版本
3.0 发布时,未解决的问题列表清零了——每个史诗、其下的每个问题,以及我们在自查时发现的每一处矛盾,都已解决。大多数积压问题并非会导致崩溃的“错误”,而是此服务报告了未经实际核实的值;这才是真正危险的错误。
由于 Spotify 于 2026 年 2 月删除了相关端点,我们还移除了一些工具——包括艺人关注功能,它完全没有可迁移的目标。
🤖 将以下内容粘贴给你的 Agent
将下面的代码块复制到 Claude Code、Cursor、OpenClaw 或任何编码 Agent 中,即可由它为你设置 SpotifyMCP。
⚠️ 切勿在聊天中粘贴 Spotify 凭据。 Spotify 的开发者条款将 Client ID 视为凭据:§VI.1.1 将“ID、客户端 ID、密钥、密码、安全码或令牌”统称为安全码,§VI.1.3 禁止向任何其他方披露这些信息,§VI.1.4 则规定你有责任为其保密。你在对话中输入的任何内容都会被模型提供商保留、写入 shell 历史记录,并保留在 Agent 的上下文窗口中。此服务只需要 Client ID 这一项凭据,而它属于安全码,并非公开标识符——请像对待密码一样妥善保管。
从 https://github.com/NovaLux12/spotify-mcp-server 设置 Spotify MCP 服务。 1. 引导我在 https://developer.spotify.com/dashboard 创建 Spotify 应用, 并将重定向 URI 设为 http://127.0.0.1:8888/callback。告诉我在控制面板的 哪个位置可以找到 Client ID,然后就停下——我会自行复制。 2. 克隆并构建: git clone https://github.com/NovaLux12/spotify-mcp-server.git cd spotify-mcp-server && npm ci && npm run build 3. 告诉我 MCP 宿主从哪个文件读取服务环境变量。宿主的服务配置始终有效; 只有通过此仓库的 npm run dev 或 npm start 启动时,才会读取本地 .env, 因为这两个命令会在 Node >=22.9 上传入 --env-file-if-exists——已发布的 二进制文件不会读取该文件。打印需要添加的确切代码行。我会自行输入 Client ID。不要向我要 Client ID,也绝不要复述它。 4. 启动服务并自行运行身份验证命令,然后在浏览器打开后完成登录。此服务 使用 PKCE,因此没有客户端密钥;除了 Client ID 外,无需获取其他凭据。 5. 使用只读的 spotify_doctor 工具进行验证,并报告其返回的各行内容。
为什么选择它
| 功能全面 | 播放、搜索、曲库、音乐库、播放列表、关注功能,以及重复项清理、M3U/CSV 导入导出、播客收听会话、快照差异比较、收听分析、市场检查、stats.fm 品味分析,以及品味综合简报、播放列表和报告等额外功能。 |
| 安全 | 写入操作支持 dry_run 预览,提供证明操作已生效的回执,批量删除需人工确认,并可通过 READONLY 隐藏具有写入能力的模块。 |
| 如实说明功能范围 | 将收听历史转化为衍生指标的工具——例如按小时统计、每周收听偏好和探索比例——默认关闭。只有在设置 SPOTIFY_MCP_EXPERIMENTAL_ANALYTICS=1 后才会启用,因为 Spotify Developer Policy Sec. III.13 禁止构建衍生收听指标。其余重新呈现你本人数据的分析功能始终开启。请参阅 docs/compliance.md。 |
| 诚实可靠 | 工具无法运行时绝不会声称可以运行。受限端点会保留其封装;如果存在读取替代方案,就提供替代方案,并用通俗易懂的语言解释 403 错误,而不会直接崩溃——请参阅根据 src/gating.ts 生成的注册受限端点。 |
| 精心打磨 | 支持分页(最多 500 项)、将播客视为一等内容、感知设备的播放控制、spotify_doctor 自我诊断,以及真正的测试套件。 |
快速开始
1. 创建 Spotify 应用
打开 Spotify Developer Dashboard → 创建应用 → 添加以下 Redirect URI,内容必须完全一致:
http://127.0.0.1:8888/callback
复制 Client ID。
2. 身份验证
SPOTIFY_CLIENT_ID=your_client_id_here npx -y @novalux12/spotify-mcp@latest auth
此操作会打开浏览器,将令牌保存到 ~/.spotify-mcp/tokens.json,并在之后自动刷新。
Windows 和无头环境
Windows(命令提示符):
set SPOTIFY_CLIENT_ID=your_client_id_here && npx -y @novalux12/spotify-mcp@latest auth
Windows(PowerShell):
$env:SPOTIFY_CLIENT_ID="your_client_id_here"; npx -y @novalux12/spotify-mcp@latest auth
支持在 Windows 上安装和日常使用,但 CI 不覆盖 Windows。 上述命令是受支持的操作方式,但测试套件仅在 Linux 上运行, 因此 Windows 特有的回归问题可能无法在发布前被发现。 有关 Windows 上具体验证和未验证的内容,以及已知缺口,请参阅 docs/platform-support.md。
无头环境 / 远程主机:
SPOTIFY_HEADLESS=1 SPOTIFY_CLIENT_ID=your_client_id_here npx -y @novalux12/spotify-mcp@latest auth
# prints a URL → open it on any machine → paste the redirect back
检查:npx -y @novalux12/spotify-mcp@latest doctor — 退出代码为 0 即表示一切正常。
3. 添加到 MCP 主机
{
"mcpServers": {
"spotify": {
"command": "npx",
"args": ["-y", "@novalux12/spotify-mcp@latest"],
"env": { "SPOTIFY_CLIENT_ID": "your_client_id_here" }
}
}
}
重启主机。聊天输入框中出现锤子图标,即表示已连接。
Claude Code · OpenClaw · 其他主机
Claude Code(无需编辑 JSON):
claude mcp add spotify -- npx -y @novalux12/spotify-mcp@latest
export SPOTIFY_CLIENT_ID=your_client_id_here
OpenClaw — ~/.openclaw/openclaw.json → mcp.servers:
"spotify": {
"command": "node",
"args": ["/path/to/spotify-mcp-server/dist/index.js"],
"cwd": "/path/to/spotify-mcp-server",
"env": { "SPOTIFY_CLIENT_ID": "your_client_id_here" }
}
任何符合规范的主机都可以使用——在 mcpServers 或 servers 下采用相同的 command/args/env 结构。如果主机无法传递环境变量,请提前完成一次身份验证;令牌缓存会持续保留。
你可以这样提问
- “我这个月最常听的曲目有哪些?”
- “帮我制作一个深夜驾车播放列表”
- “把 Blinding Lights 添加到我的健身播放列表”
- “有哪些播客更新了新单集?”
- “清理我所有播放列表中的重复曲目”
- “我的音乐品味是什么样的?根据它制作一个播放列表”
- “我的 stats.fm 终身流派统计和我这个月听过的流派相符吗?”
配置
全部通过环境变量配置,无需配置文件。只有 SPOTIFY_CLIENT_ID 是必需的。
| 变量 | 示例 | 用途 |
|---|---|---|
SPOTIFY_MCP_TOOLSETS | 未设置 | 按组精简工具集,以适应对工具数量有限制的宿主。未设置时注册精选的默认工具集;设为 all 时注册全部工具。每种配置的工具数量见上方生成的统计表。 |
SPOTIFY_MCP_STATSFM | 1 | 注册由 stats.fm 提供支持的 50 个工具,分属四个注册键:statsfm、taste、tastecomposites 和 tastejukebox。默认关闭:这些工具需要单独的 stats.fm 用户名。其中两个工具会写入 Spotify(taste_to_playlist 和 statsfm_jukebox);其余工具均为只读。spotify-mcp tools 会统计你当前环境实际注册的工具。 |
SPOTIFY_MCP_READONLY | 1 | 隐藏可写模块;只读资源和提示词仍可用。 |
SPOTIFY_MCP_HISTORY | 1 | 将变更记录为 JSONL,以便撤销和审计。 |
SPOTIFY_MCP_RECEIPTS | 1 | 持久化变更回执,以便在重启后仍可使用 verify_receipt/undo_mutation。 |
SPOTIFY_MCP_ATTRIBUTION | 0 | 关闭“Music data supplied by Spotify”页脚及每行的 open.spotify.com 链接。除非设为 0/false/no/off,否则默认开启;该披露为必需内容,因此只有显式设为假值时才会移除。 |
spotify_doctor(CLI + 服务内工具)无需额外设置,即可诊断令牌状态、权限范围缺失、Premium 限制、速率限制冷却时间、请求/配额用量(累计和滚动窗口计数,#904),以及读取缓存压力(保留的条目数、保留的字节数、因响应过大而无法缓存的响应,#894)。
升级到 2.0
2.0 是一个契约版本。一个工具名称已移除,四项内容已调整,另有一项保证已收紧:
-
已移除
get_show_episodes。 请使用list_show_episodes(相同的端点、 相同的参数,只是去掉了漂移的别名)。这是唯一更改名称的项目; 其余所有接口名称均保持不变。准确的注册表总数会在本文件顶部 自动生成,因此这里特意不列出数量,以免日后出现差异。 -
破坏性写入会在无法确认时失败关闭。 现在,任何需要确认的大批量写入 在客户端无法征求确认时都会拒绝执行,而不是未经提示就继续。
archive_played_episodes的confirm: true不再授权删除操作 (该参数仍会被接受,但每条结果都会说明它已被忽略)。对于无头 自动化,请有意设置SPOTIFY_MCP_CONFIRM=never。 -
播放列表集合运算的输入采用规范名称。 A/B 对使用
playlist_a/playlist_b;有序列表使用playlists;playlist_subtract使用base_playlist_id表示基准播放列表。这是 2.0 的契约;此前允许与其并存的旧名称已在 3.0 (#1287) 中撤回。它们不再 出现在任何工具的架构中,仍发送旧名称的调用会在发出任何 Spotify 请求前 被拒绝,并返回validation错误,其reason为retired_input,同时 指明实际发送的名称以及应改用的名称。每个工具都只声明了一对别名或一个 别名列表,因此下表是各工具的迁移对照表,而不是一组可同时使用的名称:系列 规范名称 该工具以前声明的名称 A/B 对 playlist_a、playlist_ba/b,或playlist_id_a/playlist_id_b,或playlist_a_id/playlist_b_id——每个工具只使用其中一种有序列表 playlistsplaylist_ids,或source_playlist_ids,或sources——每个工具只使用其中一种相减 base_playlist_id+playlistssubtract_playlist_ids,或位置参数形式playlists: [base, ...sources]——每个工具只使用其中一种base_playlist_id再次成为必填项:位置参数形式已移除,因此调用方 不再有可省略基准播放列表的情况。工具未声明且并非已撤回名称的参数, 会导致unknown_param错误——这与retired_input表示的情况不同; 后者表示服务端曾将该名称发布到 3.0。 -
数值上限采用规范名称。
max_results限制返回的数量;limit和scan_cap限制每个来源的读取量。 -
拒绝未知参数,并返回带类型的
unknown_param错误,而不是忽略它们, 因此重命名后的参数会明确报错,而非悄无声息地不起作用。
升级后运行 spotify_doctor:它会在一次调用中报告已注册的接口、
隐藏模块的门控条件,以及已授权的权限范围。
文档
- docs/v3-roadmap.md — 3.0 即将推出的内容,以及贯穿其中的那个 bug
- docs/migration-v3.md — 3.0 中所有废弃的名称及其替代项,包括一个没有替代项的操作
- SPEC.md — 所有工具、资源和提示词
- ARCHITECTURE.md — 构建方式
- docs/configuration.md — 所有环境变量
- docs/cli.md —
tools、call、watch、export、init:作为 MCP 客户端的 CLI - docs/schema-budgets.md — 每个模块的 schema 预算和注册顺序
- docs/statsfm.md — 第二个数据源 stats.fm:设置、工具速查表、注意事项
- docs/cookbook.md — 可直接复制粘贴的 Agent 配方
- docs/non-goals.md — v2 不会做什么、原因,以及它提供的替代方案
- docs/taste.md — 匿名化的品味展示,用于驱动播放列表
- docs/wave2-composites.md — 只读品味组合
- docs/distribution.md — 分发和发行说明
- docs/faq.md — 身份验证、Premium、403、无头模式、令牌
- docs/compliance.md — 品牌标识、署名和出站
User-Agent - CONTRIBUTING.md — 开发环境设置和约定
- CHANGELOG.md — 发行历史
要求
- 播放控制(播放/暂停/跳过/定位/音量/队列)需要 Premium。免费账户仍可使用搜索、曲库和播放列表。
- Node 22.9+,Spotify 应用须处于开发模式(扩展配额前最多支持 5 位用户)。
- Spotify 将有声书功能限制在美国、英国、加拿大、爱尔兰、新西兰和澳大利亚。
- 部分端点受注册限制——无论作用域或 Premium 状态如何,当前应用注册均会收到 403。已获豁免的注册是否仍会返回
200,尚未验证(#1338)。这是应用注册的属性,而非工具的属性。请参阅受注册限制的端点。
受注册限制的端点
部分 Web API 端点在应用注册级别受到拒绝:对于当前的 Spotify 应用注册,无论授予哪些 OAuth 作用域,也无论账户是否为 Premium,都会返回 403 Forbidden。这是 Spotify 端的限制,并非你的配置错误。
这里没有任何内容是简单地“已移除”。 有三种来源描述了这一类端点,但它们并不一致,因此下表说明的是运行时行为,而非给出定论:
- Spotify 的2026 年 2 月变更日志将一批操作标记为
[REMOVED]。 - 实时 OpenAPI schema仍列出其中大多数相同路径,并标注
deprecated: true,而非将其删除——包括/artists/{id}/top-tracks和全部七个Get Several批量路径。 - 运行时的实际情况不由这两份文档决定,而取决于你的应用注册获准读取哪些内容。没有相应授权的注册会返回
403/404/410。已获豁免的注册是否仍会返回200,尚未验证(#1338):此代码库中没有探测记录能够证明这一点,且唯一曾被引用的探测产物记录的这些路径全部返回403。
因此,这里的 403 是注册的属性,而非工具的属性。工具不会因为受到限制而隐藏,也没有受限工具是僵尸:每个工具要么读取有文档记录的替代项并返回结果,要么发出调用并用通俗易懂的语言解释 403。权威列表是 src/gating.ts 中的 GATED_FAMILIES 数组——GATED_PATH_PATTERNS 根据它生成,因此分类器与此表不会出现偏差。
| 端点系列 | 已发布的调用该端点的工具 | 在当前注册中的状态 |
|---|---|---|
browse-categories — /browse/categories*(列表、{id}、{id}/playlists) | get_category、browse_category_deepdive、category_resolver | 已说明 403 |
browse-new-releases — /browse/new-releases | (无——没有已发布的工具读取此路径) | 已替换;无调用点 |
markets — /markets | get_available_markets、market_validate | 已说明 403 |
artist-top-tracks — /artists/{id}/top-tracks | get_artist_top_tracks、queue_playlist、artist_collab_network、artist_completeness_score、batch_add_to_playlist、copy_playlist、move_items_between_playlists | 已说明 403 |
user-profile — /users/{id} 和 /users/{id}/playlists | get_user_profile、get_user_playlists_by_id、get_playlist_followers | 已说明 403 |
me-type-contains — 文档中列出的 /me/{type}/contains 检查(曲目、专辑、节目、单集、有声读物、关注) | (无——已迁移至 GET /me/library/contains) | 已替换;无调用点 |
playlist-followers-contains — /playlists/{id}/followers/contains | (无——已迁移至 GET /me/library/contains) | 已替换;无调用点 |
batch-several — 多 ID 的 ?ids= 批量端点(/tracks、/albums、/artists、/episodes、/shows、/audiobooks、/chapters) | get_several_tracks、get_several_albums、get_several_artists、get_several_episodes、get_several_shows、get_several_audiobooks、get_several_chapters、catalog_batch_lookup | 已替换为逐 ID 读取 |
Spotify 2026 年 2 月的变更日志将上述全部 8 个系列标记为 [REMOVED] 操作。
请根据权威来源自行确认列表:
grep -n "id: '" src/gating.ts # the families, with tools and fallback per row
说明:
- 列表中的系列是运行时分类器,并不意味着某个工具一定会调用它。三个系列(
browse-new-releases、me-type-contains、playlist-followers-contains)已没有有效调用点——原先使用它们的工具已迁移到替代方案——保留这些模式是为了确保未来的调用者仍受 403 合约保护,而不会在无提示的情况下失去保护。 GET /me/library/contains不受限制(在同一次探测中返回了 200),它为check_playlist_following、restore_library_snapshot和收据验证背后的已保存状态读取提供支持。上述contains系列是变更日志标记为已移除、并由该端点取代的文档中列出的各类型检查。(播放列表重复项清理工具不在此范围内——它们会对/playlists/{id}/items进行分页读取。)- 批量回退(#725)。 当
Get Several批量端点返回 403 时,fetchSeveral会通过客户端现有的队列和退避机制,重试逐 ID 调用GET /<kind>/{id}。逐 ID 路径不属于受限制类别,因此读取仍可成功。响应会携带degraded: true,并在文本中附带[degraded: batch endpoint returned 403; … fetched individually]页脚,同时在structuredContent中包含degraded_reason,这样调用者就能区分逐项往返和正常的批量读取。 - Spotify 列为已移除、但此服务完全没有封装的端点(没有已发布的工具,因此无需说明):
/recommendations、/recommendations/available-genre-seeds、/me/apps、/me/chapters、/artists/{id}/related-artists、/audio-features、/audio-analysis和/browse/featured-playlists读取,以及/playlists/{id}/tracks系列(已由/playlists/{id}/items取代)。这些端点未列在上表中,因为没有对应工具才是准确的说明——它们没有需要解释的 403。
故障排除
- **“未通过身份验证”** → 重新运行 `auth`;检查 `~/.spotify-mcp/tokens.json` 是否存在,以及重定向 URI 是否完全匹配(末尾不能有斜杠)。 - **身份验证循环 / S256 错误** → 打开无痕窗口,先登录 spotify.com,然后在该窗口中重试身份验证 URL。 - **端口已被占用(8888)** → 释放该端口,将 `SPOTIFY_REDIRECT_URI` 设置为其他端口,或使用 `SPOTIFY_HEADLESS=1`。消息会指出 `EADDRINUSE` 和端口,因为通常是之前运行的 `auth` 仍占用该端口。 - **等待浏览器回调超时** → 不是端口冲突;监听器已成功绑定,现已关闭。请重试,并检查注册的重定向 URI 是否完全匹配。使用 `SPOTIFY_AUTH_TIMEOUT_MS` 设置绑定等待时间(默认 5 分钟)。 - 播放时出现 **“需要 Premium”** → Free 账户会出现此情况;没有变通方法。 - **查询工具返回 `Forbidden`**(类别、市场、热门曲目、用户资料,以及按类型执行的 `contains` 检查)→ 这些端点受 Spotify 注册门槛限制;请参阅[受注册门槛限制的端点](#registration-gated-endpoints)。(`GET /me/library/contains` 不属于其中,因此该端点返回 403 是实际问题,而非注册门槛限制。) - **仍然无法解决?** 运行 `npx -y @novalux12/spotify-mcp@latest doctor`,或让你的 Agent 运行 [spotify-mcp-doctor skill](skills/spotify-mcp-doctor/SKILL.md)。此服务不提供什么
v2 列出了明确的非目标,因此遇到超出范围的请求时会给出明确答复,而不是含糊其词。以下每项的依据见 SPEC §1,而 docs/non-goals.md 记录了这些说明:每项排除的内容、所依据的来源,以及服务提供的替代方案。
- 音频流、音频分析和离线播放
- Web UI、仪表板或 MCP UI 界面
- 多租户或托管式运行
- 在不同用户之间共享某个用户的凭据
- 歌词
- Spotify Connect SDK 和原生客户端集成
- 语音控制
- 使用 Spotify 数据训练模型,或导出衍生资料
- 第二个第三方上游、广告技术或商业化数据出口
- 绕过 Spotify 自身的控制措施
开发
git clone https://github.com/NovaLux12/spotify-mcp-server.git && cd spotify-mcp-server
npm ci && npm run build
cp .env.example .env # add your Client ID
npm run auth # one-time login
npm run dev # run from source
npm test # unit + MCP smoke tests
与 Spotify 无关联。请遵守 Spotify Developer Terms。
MIT © Carme99 和 NovaLux12 贡献者 · 感谢 calebWei/SpotifyMCP 和 varunneal/spotify-mcp。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。