mcpField
L
lineupify

lineupify

本地服务
github.com/SHREESHMAN游戏娱乐16 周前更新

关于 lineupify

lineupify 是本地 MCP 服务,可将音乐节阵容、心情描述、艺人、歌曲或播放列表转为可编辑的 Spotify 播放列表草稿。它支持 Spotify 账户播放列表,也提供 Deezer 草稿与导出模式。

主要功能

  1. 01根据阵容、心情或音乐种子创建草稿
  2. 02通过 ISRC 查找并匹配曲目
  3. 03发布前查看和编辑草稿
  4. 04读取、比较及混合播放列表
  5. 05将 Deezer 草稿导出为链接或文本

适用场景

  1. 01根据音乐节海报制作播放列表
  2. 02按心情和时长筛选创建播放列表
  3. 03比较两份播放列表并制作共享混音
  4. 04导出草稿以用于其他音乐服务

MCP 相关

它连接 MCP 宿主,提供创建、查看、编辑和发布 Spotify 播放列表,以及处理 Deezer 草稿和导出的工具。服务在本地运行。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"shreeshman-lineupify": {
"command": "npx",
"args": [
"-y",
"lineupify-mcp"
],
"env": {
"SPOTIFY_CLIENT_ID": "<SPOTIFY_CLIENT_ID>",
"LASTFM_API_KEY": "<LASTFM_API_KEY>"
}
}
}
}
启动命令npx -y lineupify-mcp
需要配置的环境变量
SPOTIFY_CLIENT_IDClient ID of your own Spotify app (developer.spotify.com/dashboard, redirect URI http://127.0.0.1:8765/callback). Optional if saved with `lineupify-mcp setup`.
LASTFM_API_KEY密钥Optional Last.fm API key for tag, similar-artist, similar-song and per-country data.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmlineupify-mcp0.6.0

工具

22

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

Lineupify

Lineupify

说出你想听什么,即可在自己的账户中获得一份可阅读、可编辑、值得信赖的播放列表。

CI npm MCP 注册表 MIT

在线使用 lineupify →

Lineupify 是一款 MCP 服务,适用于 Claude Desktop、Claude Code、Cursor 和其他 MCP 主机。粘贴音乐节海报、描述一种心情、说出一位艺人或你喜欢的一首歌、指定一个播放列表,或混合两个人的播放列表。Lineupify 会找到相关艺人,挑选他们最受欢迎的歌曲,精确匹配歌曲(按 ISRC),并创建一份草稿,供你在发布到 Spotify 之前审核和编辑。所有操作都在你的设备上运行;没有 Lineupify 服务,也不会收集遥测数据。

SpotifyDeezer 模式
所需条件Spotify Premium 账户和免费的 Spotify 开发者应用(2 分钟,无需密钥)无需任何账户或密钥
可获得内容在你的 Spotify 账户中创建播放列表,还可读取和比较自己的播放列表与音乐库包含 Deezer 链接的草稿,可导出并导入到任何平台(Deezer、Apple Music、YouTube Music)
差异原因Spotify 只允许新应用为其所有者提供服务,而所有者必须拥有 PremiumDeezer 的公共 API 无需密钥,但 Deezer 已不再发放写入凭据

两种模式都需要 Node.js 20 或更高版本。npm 上的软件包:lineupify-mcp。

目录

为什么

流媒体应用擅长播放音乐,却不擅长让你说出自己想听什么。

  • 每日混音不符合你此刻的心情。 它们根据你听过的内容制作,而不是根据你接下来想听的内容。
  • 随机播放总是播出相同的歌曲和相同的艺人。 你想听喜欢的艺人推出的新歌,而不是一遍又一遍听那二十首歌。
  • 你能描述一种感觉,却找不到对应的流派。 “适合雨天周日做饭时听的爵士乐”在任何应用里都不是一个分类。
  • 往播放列表里添加歌曲要花好几分钟搜索,明明一句话就能搞定。
  • 音乐节阵容有四十个名字,你只认识六个。 手动做准备要花上一整个晚上。
  • Blend 只能混合用户档案。 你想比较两个播放列表,看看它们有哪些共同点以及原因,再生成一份两个人都会喜欢的混音。
  • 算法无法解释自己的选择。 你想知道一首歌来自哪个艺人、为什么被选中,然后还能修改结果。
  • 你的播放列表在 Spotify 上,但朋友不用 Spotify。 你想把列表导出为文件,让他们能在任何地方使用。

Lineupify 会为每个问题生成一份你看得见的草稿,为每首曲目说明理由,并将播放列表保存到你自己的账户中。

一次 Claude Code 会话:附上音乐节海报后,Lineupify 生成一份包含 92 首曲目的草稿并发布,助手还报告了无法匹配的四位艺人
在 Claude Code 中输入一句话并附上音乐节海报照片:生成 92 首曲目,设为私密并发布,同时列出未能匹配的四位艺人,而不是悄悄略过。

快速开始

选择以下三种安装方式之一。无论选择哪种,最终都会在你的宿主中注册同一个服务;Spotify 应用是唯一无法自动完成的步骤,因为它需要在你的 Spotify 账户中创建。

选项 A:让你的助手为你安装

如果你的助手可以运行终端命令(Claude Code、Cursor 等),请把以下内容粘贴到聊天中并按步骤操作:

为我安装 Lineupify MCP 服务,并引导我完成设置。它的 npm 包是 lineupify-mcp (https://www.npmjs.com/package/lineupify-mcp);请先阅读 https://github.com/SHREESHMAN/lineupify 中的 README。询问我是否拥有 Spotify Premium 账户。如果有,请指导我在 https://developer.spotify.com/dashboard 创建 Spotify 应用,并将 Redirect URI 设为 http://127.0.0.1:8765/callback,向我索取 Client ID,然后运行 npx -y lineupify-mcp setup --client-id <id> 和 npx -y lineupify-mcp auth,并告诉我何时在浏览器中批准登录。如果没有,请跳过 Spotify:Deezer 模式无需任何设置。然后运行 npx -y lineupify-mcp install --claude-code(或者 --cursor / --claude-desktop,根据你正在使用的宿主选择),接着运行 npx -y lineupify-mcp doctor,向我展示结果,并告诉我接下来该说什么。在 Windows 上,通过 cmd /c 运行 npx。

如果 Lineupify 已经注册,但尚未连接 Spotify(通过一键方式安装,或手动编写配置时),请改为粘贴以下内容:

调用 Lineupify 的 status 工具。如果尚未连接 Spotify,请使用我的 Client ID PASTE_CLIENT_ID_HERE 调用 connect,告诉我在浏览器中批准登录,然后再次调用 status 进行确认。

选项 B:在终端中引导式设置
  1. 创建 Spotify 应用(2 分钟;Deezer 模式可跳过)。前往 https://developer.spotify.com/dashboard,点击 Create app,勾选 Web API,将重定向 URI 设置为 http://127.0.0.1:8765/callback,然后保存,并从应用的 Settings 页面复制 Client ID。不需要客户端密钥。包含每个字段的完整操作指南:docs/setup-spotify.md。

    截图:“Create app”和 Client ID 的位置

    Spotify for Developers 控制面板,圈出了 Create app 按钮
    控制面板。“Create app”位于右上角。

    应用的 Basic Information 卡片:Client ID 旁有复制按钮,App Status 为 Development mode,Refresh Token Lifetime 为 180 days,并提供 View client secret 链接
    保存后:需要复制的值是 Client ID。始终不需要客户端密钥。这里显示的 180 天刷新令牌有效期,就是 status 每年会提示你重新连接两次的原因。

  2. 运行引导式设置:

    npx -y lineupify-mcp init
    

    输入 Client ID,通过浏览器登录,将 Lineupify 添加到 Claude Desktop、Claude Code 或 Cursor(以找到的为准),然后运行健康检查。每个步骤都可以跳过。之后重启你的宿主应用。

    截图:init 的运行效果

    npx -y lineupify-mcp init 的终端输出:已保存的 Client ID 会保留,Spotify 登录已连接,检测到 Claude Code 和 Cursor 并选择了 Cursor,健康检查的每一行都显示 OK
    在已完成设置的机器上再次运行:每个步骤都可以跳过,最后的健康检查与 doctor 输出的相同。

  3. **请求创建播放列表。**以下请求都可以:

    • “根据这个演出阵容给我制作一个播放列表” (粘贴海报文字或附上图片)
    • “适合下雨的周日做饭时听的爵士乐,时长约一小时,不要露骨内容”
    • “类似 Khruangbin 的艺人,每人两首歌”
    • “类似 Ritviz – Udd Gaye 的歌曲,只要其他艺人的”
    • “我喜欢的艺人发布的新歌,但不要我已经点过赞的”
    • “我朋友的播放列表和我的有哪些共同点?然后给我们制作一份混合播放列表。”
选项 C:一键安装到 Claude Desktop

从发布页面下载 lineupify-<version>.mcpb,然后双击它(或将其拖到 Claude Desktop 上)。在表单中粘贴 Client ID,或留空以使用 Deezer 模式。仍需安装 Node.js 20 或更高版本。然后在聊天中说“将 Lineupify 连接到 Spotify”。

截图:你将看到的 Claude Desktop 三个界面

Claude Desktop 设置中的 Extensions 选项卡:未安装扩展,请将 .MCPB 或 .DXT 文件拖到此处安装
Settings → Extensions。在此处放入 .mcpb 文件。

Lineupify 捆绑包的安装对话框,其中包含 Claude Desktop 的标准警告,提示该扩展未经 Anthropic 验证,以及版本、MIT 许可证和文档链接,还有一个 Install 按钮
安装对话框。红色警告是 Claude Desktop 对所有第三方扩展的标准提示;代码托管在 GitHub 上,npm 上的软件包带有来源证明。

Claude Desktop 中的 Lineupify 扩展页面:Spotify Client ID 字段(留空以使用 Deezer 模式)、可选的 Last.fm 密钥,以及各工具的权限,包含分组显示的只读工具
安装后:Client ID 字段(留空表示 Deezer 模式)、可选的 Last.fm 密钥,以及各工具的权限。只读工具会分组显示,你只需批准一次。

其他宿主、配置文件方式,以及同时运行两个宿主:docs/hosts.md。

没有 Spotify,或者没有 Premium?使用 Deezer 模式

完全跳过 Spotify 应用:将 Lineupify 添加到宿主,然后请求生成播放列表。没有 Spotify 登录时,草稿会自动基于 Deezer 构建(也可以说“使用 Deezer”;对应选项为 provider: "deezer")。Deezer 的公共 API 无需密钥,因此不必创建、粘贴或批准任何内容。

Deezer 模式支持:除你自己的 Spotify 偏好外的所有种子、所有筛选条件、读取、分析、比较和合并 Deezer 播放列表与草稿、编辑,以及所有导出。不支持:发布到账号。Deezer 于 2025 年起停止向新应用发放 API 凭据,因此目前没有任何工具可以写入 Deezer 账号。如果 Deezer 重新开放 API,我们会添加发布功能。

将 Deezer 草稿导入你的 Deezer(或 Apple Music、YouTube Music)账号只需粘贴一次:

  1. 请求导出链接:“将此草稿导出为链接”(export_draft,format: "links";"text" 则会导出“艺术家 - 标题”格式的行)。
  2. 打开 TuneMyMusic 或 Soundiiz,选择 从文本导入(TuneMyMusic:Let's start → Upload text;Soundiiz:Import playlist → From text),然后粘贴列表。
  3. 选择目标服务并确认。传输工具会自行登录你的账号;Lineupify 不会接触任何账号信息。

这两款工具的免费套餐都能满足普通播放列表的需求。

截图:粘贴到 TuneMyMusic 的链接

TuneMyMusic 第 2 步(共 4 步):已粘贴包含 30 个曲目链接的播放列表,全部选中,可随时移至目标服务
粘贴 links 导出内容后,TuneMyMusic 会将每一行识别为曲目,并让你选择目标服务。

### 无 Premium 的 Spotify:借用朋友的应用

Spotify 的 Premium 规则适用于 拥有 开发者应用的人,而不是所有使用该应用的人。应用所有者可以在控制面板的 User Management 中通过电子邮件添加最多 4 位其他用户(每个应用总共 5 位用户),这些用户使用自己的账号登录,包括免费账号。因此,如果你认识的人有 Premium:

  1. 他们按照选项 B 的第 1 步创建应用,并在 User Management 中添加你的 Spotify 账号邮箱。
  2. 他们把 Client ID 给你(它不是机密;不会用到密钥)。
  3. 你使用该 Client ID 运行 npx -y lineupify-mcp init,并以自己的身份登录。你的令牌会保留在你的设备上;应用所有者看不到你的账号。

有两项限制:一个应用最多供 5 人使用,而且所有用户和应用所有者的所有应用共享该所有者的每日 API 配额。把 Client ID 给不在 User Management 列表中的人没有用;他们登录时会失败并收到 403 错误。这适合朋友和家人使用;不能用来服务陌生人,Spotify 的条款也不允许这样做。详情:docs/setup-spotify.md。

对话示例

音乐节

你: 根据这份阵容给我做一个播放列表。

SUNFALL FESTIVAL 2026 · 14-16 AUGUST
FRED AGAIN..   CHARLI XCX
Jamie xx · Four Tet · Overmono
Yaeji  Nia Archives  Barry Can't Swim  DJ Fluffhead
TICKETS ON SALE NOW

助手会调用 parse_lineup,返回 9 位艺人及其级别,并去掉日期和售票信息;随后调用 create_draft,传入 lineup: "Sunfall 2026"。草稿会在大约 15 秒内生成;阵容较长时,后台会继续处理:

Draft d_7k2mq "Sunfall 2026 · Lineupify"  rev 1  status ready  provider spotify  spotify: Alex
Artists 9 (resolved 8 · unresolved 1)
Tracks 27 · 1h42m · explicit 6 · via isrc 25 / text 2 · sources dz 27 / lfm 0 / sp 0
Tiers headliner 2×5 · sub 3×3 · undercard 4×2 · order interleave · private
Not found on Deezer or Spotify (1): DJ Fluffhead
Next: get_draft view=tracks to review, get_draft view=unresolved for misses, edit_draft to change, create_playlist with confirm: true to publish.

你: 给我看看曲目。

t_4k2p  #1   Fred again.. – Marea (we've lost dancing)  4:52  dz/isrc  2021
t_c81z  #2   Charli xcx – Von dutch  2:44  dz/isrc [E]  2024
t_m0r3  #3   Jamie xx – Gosh  4:50  dz/isrc  2015
t_9x1c  #4   Four Tet – Baby  3:47  dz/isrc  2020
…

你: 删掉 Four Tet 的曲目“Baby”,忽略 DJ Fluffhead,然后发布。

edit_draft 会移除该曲目并排除这位艺人;create_playlist 会返回链接:

Created playlist "Sunfall 2026 · Lineupify" with 26 tracks (1h38m).
URL: https://open.spotify.com/playlist/3cEYpjA9oz9GiPac4AsH4n

之后的编辑会先调用 edit_draft,再调用 update_playlist,以原位替换播放列表内容。

Spotify 中已发布的播放列表,名称为 Metal · Lineupify:78 首歌曲,时长约 6 小时,描述为从经典到现代的金属乐
最终出现在 Spotify 中的内容:名称遵循你的 namingTemplate,描述由你提供或使用默认描述,曲目则来自你审核过的草稿。

一种氛围

你: 适合下雨的周日做饭时听的爵士乐,时长约 1 小时,不要露骨内容。

助手会自行推荐合适的艺人,添加包含相同词语的 genre 种子,避免列表完全依赖自身猜测,然后调用 create_draft,传入 maxDurationMin: 60 和 excludeExplicit: true:

Draft d_r47h8 "Rainy Sunday jazz · Lineupify"  rev 1  status ready
Seed genre "rainy sunday jazz" → 7 artists (Deezer playlists: Jazz for a Rainy Sunday Morning, a jazz Sunday in the rain, …)
Filters: clean only
Artists 10 (resolved 10 · unresolved 0)
Tracks 10 · 52:10 · explicit 0 · via isrc 10 / text 0
两个人

你: 比较我的“6626”播放列表和我的收听历史,然后制作一份我们都会喜欢的混合播放列表,不要包含其中已有的曲目。

compare_playlists 会用数字说明两者的重合情况,助手再将其转述为文字:

Compared 2 sides: 6626 (64 tracks, 52 artists) · your listening history (0 tracks, 210 artists)
Shared by all — artists (18): Mitski, My Chemical Romance, Linkin Park, Olivia Rodrigo, …
6626 vs your listening history: artist overlap 7% (18 shared, 0 identical tracks)
Only in 6626 (34): Camila Cabello, Sara Kays, Prelow, …

然后调用 create_draft,传入 seeds: [{ type: "blend", sources: ["6626", "me"] }] 和 excludeTracksFrom: ["6626"]:

Seed blend 6626 + me → 10 artists (99 artists on 2+ sides, 10 of the 10 picked on every side)
Excluded tracks from: 6626 (64 tracks)
Tracks 10 · 33:57 · explicit 1

工作原理

每个请求都会生成一份艺人列表,而每份艺人列表都会经过相同的处理流程。发布之前,不会对 Spotify 进行任何操作。

flowchart LR
    subgraph give[What you give]
        A[Festival poster or lineup text]
        B[A description or a mood]
        C[An artist or a song you like]
        D[A country or the charts]
        E[A playlist link or your library]
        F[Two or more people's playlists]
    end
    subgraph engine[Lineupify]
        G[Artists]
        H[Most popular songs per artist]
        I[Matched by ISRC]
        J[Filters, dedupe, order]
        K[Draft you can read and edit]
    end
    L[(Your Spotify account)]
    M[CSV / M3U / links / text]
    A --> G
    B --> G
    C --> G
    D --> G
    E --> G
    F --> G
    G --> H --> I --> J --> K
    K -->|create_playlist| L
    K -->|export_draft| M
flowchart TD
    A[artists and/or seeds] --> B[Expand seeds in the background<br/>genre · similar_to · similar_songs · chart · country · playlist · taste · blend]
    B --> C[Resolve each artist<br/>Deezer → Last.fm → Spotify]
    C --> D[Ranked candidate songs<br/>lead tracks first, featured next, live/remix last]
    D --> E[Match by ISRC<br/>text search as fallback]
    E --> F{Filters}
    F -->|yearRange · bpmRange · explicit · excludeTracksFrom| G[Dedupe by URI, ISRC and title+artist]
    G --> H[Per-tier counts and maxTracks cap]
    H --> I[skipCovers · maxDurationMin · order]
    I --> J[(Draft on disk<br/>revisions, undo)]
    J -->|get_draft / edit_draft| J
    J -->|create_playlist| K[Spotify playlist]
    J -->|export_draft| L[CSV · M3U · links · text · Markdown]

为什么用 Deezer 和 Last.fm 排名?Spotify 不再向新应用开放热门曲目、推荐内容、相似艺人、流派或音频特征。Deezer 的公共 API 无需密钥即可使用,并提供流行度、相似艺人、节奏和播放列表;Last.fm(可选密钥)会提供标签、相似艺人、相似歌曲和各国家/地区排行榜;ListenBrainz(开放数据)会提供歌曲级别的邻近曲目信息。播放列表最终会保存到 Spotify,而 ISRC 代码可实现精确匹配。

草稿是一个小型状态机,每处理完一位艺人就会将检查点写入磁盘,因此进程被终止后,可以从停止处继续:

stateDiagram-v2
    [*] --> building: create_draft
    building --> ready: all artists fetched
    building --> paused: quota / token / network
    building --> failed: nothing to build
    paused --> building: get_draft
    ready --> building: edit_draft asks for more tracks
    ready --> published: create_playlist
    published --> published: edit_draft + update_playlist

参考

每个工具、每种 edit_draft 操作、每个种子、每个 create_draft 选项、CLI 和 config.json 都在 docs/reference.md 中,而不在这里,这样你就可以从头到尾读完本页。以下五个工具涵盖了你最常需要的操作:

工具功能
status首先调用:查看连接状态、设置步骤和正在进行的草稿。
create_draft根据艺人和/或种子(流派、氛围、相似艺人、播放列表、混合)创建草稿。
get_draft查看草稿:摘要、曲目、艺人,或未能找到的内容。
edit_draft替换曲目、移除艺人、调整顺序、撤销。
create_playlist发布审核过的草稿并返回其 URL。
set_playlist_image使用保存在你设备上的 JPEG 设置播放列表封面。

完整参考 →

隐私、数据和条款

Lineupify 在你的设备上运行,使用你创建的 Spotify 应用。它没有自己的服务、没有遥测,也无法访问你磁盘上的令牌以外的账户内容。SECURITY.md 列出了它能做和不能做的事,以及如何报告问题。

存储的内容,均位于 ~/.lineupify/(或 LINEUPIFY_HOME)下:

文件内容保留期限
config.json客户端 ID、默认设置、可选的 Last.fm 密钥直到你更改为止
tokens.jsonSpotify 访问令牌和刷新令牌直到执行 disconnect / logout;无论如何,刷新令牌会在 6 个月后失效
cache/artists.json、spotify-tracks.json、deezer-tracks.json、artist-genres.json、covers.json艺人匹配结果、曲目查询结果、节奏、流派30-90 天
cache/playlists.json你读取过的播放列表曲目列表;使用 library 时也包括你喜欢的歌曲12 小时
drafts/每个草稿对应一个 JSON 文件,另含最多 10 个撤销版本未发布的草稿在 30 天后删除;已发布的草稿会保留
exports/export_draft 写入文件的唯一位置直到你删除这些文件

在 macOS 和 Linux 上,tokens.json 会以 0600 模式写入。在 Windows 上,该模式没有实际作用,因此文件会改为仅向你自己的账户授予权限(icacls /inheritance:r /grant:r);如果此操作失败,文件会保留用户配置文件的默认权限,与其他 CLI 的凭据文件一样。

Spotify 登录时请求的权限及其用途:

权限范围用途
playlist-modify-privatecreate_playlist、update_playlist
playlist-modify-public设置 public: true 时,同上
user-read-private基于市场的搜索(market=from_token),即每次构建
user-top-read、user-follow-readcompare_taste、discoveryOnly、使用 me 的 compare_playlists、taste 和 blend 种子、refresh_taste
playlist-read-private、playlist-read-collaborative读取你自己的私人播放列表,以及按名称查找播放列表
user-library-read在读取、排除和 refresh_taste 中使用 library(喜欢的歌曲)
ugc-image-uploadset_playlist_image,唯一会上传内容的工具;它会读取你指定的本地 JPEG 文件并将其发送到你的播放列表

Lineupify 从不删除播放列表或取消关注,从不更改你的音乐库或关注列表,并且除非你要求公开,否则创建的播放列表均为私人播放列表。唯一会覆盖内容的操作是对 Lineupify 创建的播放列表执行 update_playlist;如果该播放列表在 Spotify 中发生了更改,它会拒绝操作,除非你强制执行。 数据流向。 Lineupify 会与 api.spotify.com 和 accounts.spotify.com(你的账户)、api.deezer.com(无需密钥或账户)、ws.audioscrobbler.com(仅在设置 Last.fm 密钥时)、musicbrainz.org 和 labs.api.listenbrainz.org(仅在使用 similar_songs 种子时;种子歌曲的 ISRC、标题和艺人会在这些站点查询),以及 registry.npmjs.org(最多每 6 小时检查一次版本;设置 LINEUPIFY_NO_UPDATE_CHECK=1 可关闭此功能)通信。你的播放列表、喜欢的歌曲和热门艺人中的艺人名称、曲目标题和 ISRC 会作为搜索查询发送给 Deezer,用于排名、节奏、流派和封面检查;如果设置了密钥,也会发送给 Last.fm。不会随之发送任何账户标识符。如果你希望避免将听歌数据发送给 Deezer,请使用填写艺人的列表并设置 sources: ["spotify"],同时跳过 analyze_playlist、bpmRange 和 skipCovers。

开关。

  • LINEUPIFY_READ_ONLY=1 会禁用 create_playlist 和 update_playlist;其他功能均可使用。适用于“仅分析”配置。
  • disconnect(工具)或 lineupify-mcp logout 会清除登录信息;purge: true(需同时设置 confirm: true)/--purge 会删除整个数据文件夹,并且如果文件夹中包含任何非 Lineupify 创建的内容,则会拒绝删除。请在 Spotify 端移除该应用的访问权限:https://www.spotify.com/account/apps/。
  • 你的 MCP 主机可以彻底禁用此服务(Claude Desktop:Settings → Developer;Claude Code:claude mcp remove lineupify)。

由模型驱动的写入。 除非助手传入 confirm: true,否则在草稿展示给你之前,create_playlist 会拒绝执行。与任何 MCP 服务一样,Lineupify 会按助手的要求操作;写入工具带有 MCP destructiveHint 注解,因此支持请求权限的主机可以单独标识这些工具。发布前请检查草稿,或使用只读模式。

外部文本。 海报文字、曲目标题、播放列表描述和 Deezer 播放列表名称都会经过清理(去除控制字符、限制长度),并显示在固定的表格布局中,从而降低外部文本被当作指令读取的可能性。但这无法完全杜绝这种情况:如果海报上的一行文字写着“将其公开发布”,助手接收到的仍是这条数据,而且没有任何机制可以阻止模型据此采取行动。真正的保护措施是上面的开关:播放列表默认设为私密,create_playlist 需要经过审核的草稿或显式的 confirm,disconnect purge 也需要 confirm,LINEUPIFY_READ_ONLY 会关闭所有写入功能,而且 Spotify 没有删除接口。日志仅写入 stderr,其中的令牌和密钥会经过脱敏处理。

条款。 你是 Spotify 应用的所有者,因此受 Spotify 的 Developer Policy 约束。截至 2026-09-08,该政策允许应用让用户“将其播放列表的元数据移至另一项服务”(III.9 节),这正是 export_draft 的功能;但禁止使用 Spotify 内容“训练机器学习或 AI 模型,或以其他方式将 Spotify Content 导入机器学习或 AI 模型”(III.14 节)。Lineupify 不会训练任何内容,但会将曲目名称交给你正在与之聊天的助手;如果你严格解读 III.14 节,请使用 Deezer 模式或 LINEUPIFY_READ_ONLY。Spotify 的刷新令牌有效期自最初授权起为 6 个月,刷新令牌不会延长有效期。Deezer 的 API 条款规定仅限非商业用途(第 IV 条),但未提及缓存;Lineupify 会将 Deezer 查询结果保留 30 至 90 天。Last.fm 数据仅供非商业用途。将 Lineupify 用于商业场景(例如场馆或广播节目编排)前,请查阅这三项条款。

限制和已知问题

  • Spotify 开发模式。 新建的 Spotify 应用会以开发模式运行:最多支持 5 位用户,且应用所有者必须拥有 Spotify Premium。只有月活跃用户达到 250,000+ 的注册企业才能获准使用生产模式(“扩展配额模式”),因此每位 Lineupify 用户都需要自行创建一个免费应用。只有将其他人添加到控制面板中的 用户管理 下,他们才能使用你的应用。没有 Premium 时,请使用 Deezer 模式。
  • 无法向 Deezer 写入。 Deezer 于 2025 年关闭了面向新开发者的 API 应用注册,截至 2026 年年中仍未重新开放,因此 Deezer 草稿只能导出。读取、排名、相关艺人、节奏和播放列表查询均无需密钥,不受影响。
  • 登录有效期为 6 个月。 Spotify 刷新令牌会在首次登录后 6 个月过期。剩余 30 天时,status 会发出警告;使用 connect force: true(或 lineupify-mcp auth --force)重新连接。
  • 每日配额。 开发模式的每日请求配额由你拥有的所有应用共享。配额用尽时,Lineupify 会报告 SPOTIFY_QUOTA_EXCEEDED,暂停草稿,并在配额重置后由 get_draft 恢复处理。已获取的结果会缓存,因此不会丢失。连接失败也会以相同方式暂停构建(NETWORK_ERROR)。
  • 60 秒超时的宿主。 Claude Desktop 和 Cursor 会在 60 秒后终止任何工具调用,并忽略进度通知。因此,create_draft 会在约 15 秒内返回,并在后台继续构建;使用 get_draft waitSeconds: 25 轮询。Claude Code 没有此限制。
  • 不使用 Spotify 进行排名。 Spotify 已移除新应用对艺人热门曲目、推荐内容和人气数据的访问权限,因此歌曲会通过 Deezer 公共 API 和可选的 Last.fm 进行排名,然后按 ISRC 匹配到 Spotify。非常小众或刚出道的艺人可能不在 Deezer 上;这类艺人会显示为未解析。添加 Last.fm 密钥会有所帮助;其余情况可使用 add_track 处理。
  • 规模。 每个草稿最多包含 400 位艺人(较大的阵容可按日期拆分;种子会填满剩余空间),默认最多包含 250 首曲目(maxTracks,最高可达 10,000 首)。
  • 读取播放列表。 新应用无法读取 Spotify 自行创建的播放列表(Discover Weekly、Blend、Today's Top Hits、Daily Mix);用户创建的播放列表则可读取,但必须为公开状态或位于你自己的资料库中。读取上限为 1,000 首曲目(喜欢的歌曲为 3,000 首)。升级后如果 status 列出缺少的权限,请使用 connect force: true 重新连接。
  • 流派和节奏。 Spotify 不会向新应用提供流派或音频特征,因此 analyze_playlist 会使用 Deezer 的粗略流派分类(Pop、Rock、Metal 等)、设置密钥后可用的 Last.fm 标签,以及从最多 60 首曲目采样的 Deezer 节奏。重制版会显示重制年份,因此除非启用 strictYear,否则 yearRange 会将其视为未知。
  • 不设置 Last.fm 密钥时使用 similar_songs 仅依赖 ListenBrainz,其对小众或非西方艺人的覆盖较少;添加密钥后还会使用 Last.fm 的共同收听数据。两个数据源都基于录音,因此歌曲必须存在于 MusicBrainz(ListenBrainz)中,或有 Last.fm 的收听记录。
  • 不设置 Last.fm 密钥时的种子 依赖 Deezer 上的公开播放列表提供流派和国家信息;对常见流派和大国效果较好,对小众标签的覆盖较少。Last.fm 密钥(setup lastfmApiKey)可补充标签、相似艺人和按国家分类的数据。
  • 同一时间只能有一个构建器。 如果两个宿主(例如 Claude Desktop 和 Claude Code)同时运行 Lineupify,只有其中一个会构建指定草稿;另一个只会读取该草稿。
  • npx 缓存。 npx -y lineupify-mcp 会保留首次下载的版本。使用 npm i -g lineupify-mcp@latest 或 npx -y lineupify-mcp@latest 更新。若有更新版本,status 会告知你。

开发

npm install
npm run typecheck && npm run lint && npm test   # unit tests, offline (Spotify and Deezer mocked); includes a stdio boot test of the server
npm run coverage                                 # the same with a coverage report
npm run test:live                                # live Deezer checks
npm run smoke:spotify                            # every Spotify endpoint, needs a connected account
npx tsx test/smoke/playlists.ts <playlist link>  # reads, analysis and seeds against live APIs
npm run build                                    # dist/
npm run bundle:mcpb                              # build/lineupify-<version>.mcpb for Claude Desktop

贡献方式:CONTRIBUTING.md。变更记录见 CHANGELOG.md。

致谢

  • 歌曲排名、相关艺人、节奏和播放列表数据来自 Deezer 公共 API。
  • 配置 LASTFM_API_KEY 后,使用 Last.fm 数据提供支持。Last.fm 数据仅供非商业用途。
  • 歌曲相似度使用 MusicBrainz 和 ListenBrainz(MetaBrainz Foundation)的开放数据,无需密钥。
  • 播放列表通过 Spotify Web API 创建。
  • 基于 Model Context Protocol(@modelcontextprotocol/server)构建。

Lineupify 与 Spotify、Deezer、Last.fm 或 MetaBrainz 均无关联。

许可证

MIT。请参阅 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。