Spotify音乐控制服务

一个基于Model Context Protocol (MCP)的Node服务器,允许AI助手和IDE控制Spotify播放和管理播放列表,适用于音乐发现和创意播放列表管理。

  • by igorgarbuz
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 igorgarbuz/spotify-mcp

使用说明

Spotify MCP Node Server

A. 模型上下文协议(MCP) 节点服务器支持AI助手,如 克劳德桌面,或IDE,如 光标 和 帆板运动 控制Spotify播放和管理播放列表。非常适合音乐发现和创意播放列表管理。试着问克劳德一些不太知名的流派或类似艺术家的曲目。您可以首先要求创建新的播放列表或更新现有的播放列表。

为了快速入门,截至2025年5月 克劳德桌面 是使用此软件的推荐方式。为您的平台安装Claude Desktop,并按照以下步骤操作 集成指南 在......下面

要遵守Spotify的开发者条款,您必须拥有Spotify Premium帐户才能使用此服务器。此外,如果您在此服务器上使用启用MCP的AI助手(如Claude),则必须选择退出模型训练的数据共享。

Contents

交互示例

  • “播放披头士乐队鲜为人知的盗版歌曲”
  • “制作披头士和金属乐队的融合播放列表”
  • “皇后乐队的《波西米亚狂想曲》有什么音频特征?”
  • “创建我的马拉松播放列表,并添加我的锻炼播放列表中的曲目”

工具

Read Operations
  1. 搜索Spotify

    • 描述:在Spotify上搜索曲目、专辑、艺术家或播放列表
    • 参数:
      • query (string):搜索词
      • type (string):要搜索的项目类型(曲目、专辑、艺术家、播放列表)
      • limit (number,可选):返回的最大结果数(10-50)
    • 退货:匹配项目及其ID、名称和其他详细信息的列表
    • 示例: searchSpotify("bohemian rhapsody", "track", 20)
  2. 立即开始播放

    • 描述:获取有关Spotify上当前播放曲目的信息
    • 参数:无
    • 退货:包含曲目名称、艺术家、专辑、播放进度、持续时间和播放状态的对象
    • 示例: getNowPlaying()
  3. 获取我的播放列表

    • 描述:获取当前用户在Spotify上的播放列表列表
    • 参数:
      • limit (数字,可选):要返回的播放列表的最大数量(默认值:20)
      • offset (数字,可选):要返回的第一个播放列表的索引(默认值:0)
    • 退货:一系列包含ID、名称、曲目计数和公开状态的播放列表
    • 示例: getMyPlaylists(10, 0)
  4. 获取播放列表曲目

    • 描述:获取特定Spotify播放列表中的曲目列表
    • 参数:
      • playlistId (string):播放列表的Spotify ID
      • limit (数字,可选):要返回的最大曲目数(默认值:100)
      • offset (数字,可选):要返回的第一个曲目的索引(默认值:0)
    • 退货:包含ID、姓名、艺术家、专辑、持续时间和添加日期的曲目数组
    • 示例: getPlaylistTracks("37i9dQZEVXcJZyENOWUFo7")
  5. 最近播放

    • 描述:从Spotify检索最近播放的曲目列表。
    • 参数:
      • limit (number,可选):指定要返回的最大曲目数的数字。
    • 退货:如果找到曲目,它会返回最近播放的曲目的格式化列表,否则会显示一条消息:“您在Spotify上没有最近播放的任何曲目”。
    • 示例: getRecentlyPlayed({ limit: 10 })
  6. 最近播放

    • 描述:从Spotify检索最近播放的曲目列表。
    • 参数:
      • limit (number,可选):指定要返回的最大曲目数的数字。
    • 退货:如果找到曲目,它会返回最近播放的曲目的格式化列表,否则会显示一条消息:“您在Spotify上没有最近播放的任何曲目”。
    • 示例: getRecentlyPlayed({ limit: 10 })
  7. 获得关注的艺术家

    • 描述:检索用户在Spotify上关注的艺术家列表。
    • 参数:
      • after (string,可选):上一个请求中的最后一个艺术家ID。分页光标。
      • limit (数量,可选):返回的艺术家的最大数量(1-50)。
    • 退货:如果找到艺术家,它会返回一个已关注艺术家的格式化列表,否则会显示一条消息:“您在Spotify上没有关注任何艺术家”。
    • 示例: getFollowedArtists({ limit: 10 })
  8. getUserTopItems

    • 描述:检索用户的顶级艺术家或曲目列表。
    • 参数:
      • type (string):要获得顶部的项目类型。必须是“艺术家”或“曲目”。
      • time_range (string):顶部项目的时间范围。必须是“短期”、“中期”或“长期”。
      • limit (数字,可选):要返回的最大项目数(1-50)。
      • offset (数字,可选):要返回的第一个项目的索引。默认为0。
    • 退货:如果找到项目,它会返回一个格式化的顶级项目列表,否则会显示一条消息:“您在Spotify上没有任何顶级项目”。
    • 示例: getUserTopItems({ type: "artists", time_range: "short_term", limit: 10 })
Play / Create Operations
  1. play音乐

    • 描述:开始在Spotify上播放曲目、专辑、艺术家或播放列表
    • 参数:
      • uri (字符串,可选):要播放的项目的Spotify URI(覆盖类型和id)
      • type (字符串,可选):要播放的项目类型(曲目、专辑、艺术家、播放列表)
      • id (字符串,可选):要播放的项目的Spotify ID
      • deviceId (字符串,可选):要播放的设备的ID
    • 退货:成功状态
    • 示例: playMusic({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })
    • 替代: playMusic({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })
  2. pause播放

    • 描述:暂停Spotify上当前播放的曲目
    • 参数:
      • deviceId (字符串,可选):要暂停的设备的ID
    • 退货:成功状态
    • 示例: pausePlayback()
  3. 跳转到下一步

    • 描述:跳到当前播放队列中的下一首曲目
    • 参数:
      • deviceId (字符串,可选):设备的ID
    • 退货:成功状态
    • 示例: skipToNext()
  4. 跳转到上一个

    • 描述:跳到当前播放队列中的上一首曲目
    • 参数:
      • deviceId (字符串,可选):设备的ID
    • 退货:成功状态
    • 示例: skipToPrevious()
  5. 创建播放列表

    • 描述:在Spotify上创建新的播放列表
    • 参数:
      • name (string):新播放列表的名称
      • description (字符串,可选):播放列表的描述
      • public (布尔值,可选):播放列表是否应公开(默认值:false)
    • 退货:具有新播放列表ID和URL的对象
    • 示例: createPlaylist({ name: "Workout Mix", description: "Songs to get pumped up", public: false })
  6. addTracksToPlaylist

    • 描述:将曲目添加到现有的Spotify播放列表
    • 参数:
      • playlistId (string):播放列表的ID
      • trackUris (array):要添加的跟踪URI或ID的数组
      • position (数字,可选):插入轨迹的位置
    • 退货:成功状态和快照ID
    • 示例: addTracksToPlaylist({ playlistId: "3cEYpjA9oz9GiPac4AsH4n", trackUris: ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh"] })
  7. addToQueue

    • 描述:将曲目、专辑、艺术家或播放列表添加到当前播放队列
      • 参数:
      • uri (字符串,可选):要添加到队列中的项目的Spotify URI(覆盖类型和id)
      • type (字符串,可选):要排队的项目类型(曲目、专辑、艺术家、播放列表)
      • id (字符串,可选):要排队的项目的Spotify ID
      • deviceId (string,可选):要排队的设备的ID
    • 退货:成功状态
    • 示例: addToQueue({ uri: "spotify:track:6rqhFgbbKwnb9MLmUQDhG6" })
    • 替代: addToQueue({ type: "track", id: "6rqhFgbbKwnb9MLmUQDhG6" })

设置

先决条件

MCP服务器安装

git clone https://github.com/igorgarbuz/spotify-mcp.git
cd spotify-mcp
npm install
npm run build

Node.js安装

  1. 首选 Node.js下载页面
  2. 下载并安装适用于您平台的最新Node.js版本

创建Spotify开发者应用程序

  1. 转到 Spotify开发者仪表板
  2. 使用您的Spotify帐户登录
  3. 点击“创建应用程序”按钮
  4. 填写应用程序名称和描述
  5. 接受服务条款并点击“创建”
  6. 在新应用程序的仪表板中,您将看到 客户端ID
  7. 点击“编辑设置”并添加重定向URI(例如。, http://127.0.0.1:8888/callback)
  8. 保存您的更改

Spotify API配置

创建一个 spotify-config.json 项目根目录中的文件:

# Copy the example config file
cp spotify-config.example.json spotify-config.json

然后只添加您的客户端id来编辑文件。这 accessToken, refreshToken 和 accessTokenExpiresAt 将自动管理。这 redirectUri 应该与您在Spotify开发者仪表板中添加的相同。 127.0.0.1 是本地MCP服务器最简单的选择。

{
  "clientId": "you-must-add-your-client-id-here",
  "redirectUri": "http://127.0.0.1:8888/callback",
  "accessToken": "your-access-token-filled-automatically",
  "refreshToken": "your-refresh-token-filled-automatically",
  "accessTokenExpiresAt": 0
}

验证过程

Spotify API将OAuth 2.0与 PKCE 扩展 用于安全身份验证。您不需要此应用程序的客户端密码。

  1. 在克隆的存储库目录中运行身份验证脚本:
npm run auth
  1. 该脚本将打开您的浏览器,进入Spotify授权页面。

  2. 登录Spotify并授权您的应用程序。

  3. 授权后,Spotify会将您重定向到指定的重定向URI。该应用程序将自动处理代码交换并保存您的令牌。

  4. 身份验证脚本将自动将此代码交换为访问和刷新令牌。

  5. 这些令牌将保存到您的 spotify-config.json 文件。

{
  "clientId": "your-client-id",
  "redirectUri": "http://127.0.0.1:8888/callback",
  "accessToken": "your-access-token-filled-automatically",
  "refreshToken": "your-refresh-token-filled-automatically",
  "accessTokenExpiresAt": 0
}
  1. 服务器将在需要时自动刷新访问令牌,因此您不需要重新进行身份验证。

与AI助手集成

克劳德桌面

使用Spotify MCP服务器的最简单方法是使用Claude Desktop。开始 Claude桌面安装 然后找到Claude配置文件,转到 Claude Settings,单击 Developer 然后 Edit Config。将以下内容添加到具有服务器绝对路径的配置中:

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["absolute/path/to/spotify-mcp/build/index.js"]
    }
  }
}

光标

对于光标,请转到中的MCP选项卡 Cursor Settings (命令+换档+J)。使用以下命令添加服务器:

node absolute/path/to/spotify-mcp/build/index.js

VsCode(通过Cline)

要使用Cline正确设置MCP,请确保您已设置以下文件配置 cline_mcp_settings.json:

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["/absolute/path/to/spotify-mcp/build/index.js"],
      "autoApprove": ["getListeningHistory", "getNowPlaying"]
    }
  }
}

您可以将其他工具添加到自动审批数组中,以便在不进行干预的情况下运行这些工具。

帆板运动

在……里面 Settings 然后 Windsurf Settings 类型 MCP 在搜索栏中。在结果MCP部分中,单击 add server 然后 add custom server.添加以下配置:

{
  "mcpServers": {
    "spotify": {
      "command": "node",
      "args": ["absolute/path/to/spotify-mcp/build/index.js"],
    }
  }
}

您可以将其他工具添加到自动审批数组中,以便在不进行干预的情况下运行这些工具。

鸣谢

这个项目的灵感来自 spotify mcp服务器 Marcel Marais。主要修改:

  1. 身份验证过程被重构为使用Spotify API的PKCE扩展,消除了对本地客户端秘密存储和重复重新身份验证的需要。
  2. 添加了新的工具来了解用户的口味。