mcpField
S
Suno Upload

Suno Upload

github.com/nwp创意与媒体4343 次安装41 周前更新
代码仓库

关于 Suno Upload

Suno Upload 是一款通过 Chrome 自动化将结构化歌曲提示文件 `prompt.md` 填入 Suno 创建界面的 Skill。它面向根据提示文件制作 Suno 歌曲的用户,可处理表单、模型设置并监控生成过程。

主要功能

  1. 01解析标题、歌词、风格和参数
  2. 02进入 Suno 创建页的自定义模式
  3. 03填写歌曲字段和高级选项
  4. 04通过坐标拖动设置滑块值
  5. 05提交创作并监控生成

适用场景

  1. 01将准备好的 `prompt.md` 提交到 Suno
  2. 02根据多个提示文件创建歌曲
  3. 03无需手动复制粘贴即可填写歌词和设置

MCP 相关

需要已启用的 Chrome MCP 服务,并通过其浏览器自动化工具导航和填写 Suno 界面。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nwp/suno-song-creator-plugin --skill suno-upload

安装后在 Claude Code 中输入/suno-upload确认已加载。

详细介绍

Suno 上传

使用 Chrome 自动化功能,将 Suno 提示词文件自动上传到 suno.com。此技能会解析你的 prompt.md 文件,并在 Suno Create 界面中填写所有必需字段。

✅ 全自动化——无需人工干预

此技能可实现 Suno 歌曲创作流程的端到端全自动化:

  • ✅ 解析 prompt.md 文件——提取标题、歌词、风格、模型和所有参数
  • ✅ 自动跳转至 Suno——打开 suno.com/create 并切换到 Custom 模式
  • ✅ 填写所有表单字段——包括复杂的 React 滑块组件
  • ✅ 滑块自动化已生效——通过基于坐标的拖动实现精确控制
  • ✅ 提交并监控——点击 Create 按钮并跟踪生成进度
  • ✅ 已验证并测试——已成功生成歌曲,并能完整控制参数

无需人工干预——只需指定一个 prompt.md 文件,即可开始运行。

前置条件

  • 必须已安装并启动 Chrome MCP 服务
  • 拥有 Suno 账户且有可用点数
  • 准备好符合 Suno 歌曲创作标准格式的 Prompt.md 文件

适用场景

在以下情况下使用此技能:

  • 将生成的 prompt.md 文件上传到 Suno
  • 自动化 suno.com 上的歌曲创作流程
  • 高效提交多个提示词
  • 避免手动复制粘贴歌词和设置

工作流

步骤 1:查找提示词文件

在当前目录及其子目录中搜索 prompt.md 文件。

如果找到多个文件:

  • 显示以下信息:
    • 文件路径
    • 歌曲标题(来自 YAML frontmatter)
    • 项目名称(来自 YAML frontmatter)
    • 最后修改日期
  • 使用 AskUserQuestion 进行交互式选择
  • 清晰呈现选项及完整上下文

如果只找到一个文件:

  • 自动选择该文件
  • 显示所选文件
  • 显示基本信息(标题、项目)

如果未找到文件:

  • 错误消息:"在当前目录或其子目录中未找到 prompt.md 文件。"
  • 指引:"请切换到包含 Suno 提示词文件的目录,或先使用 suno-song-creator 技能创建提示词。"
  • 正常退出

使用的工具:

  • Glob——搜索 **/prompt.md 模式
  • Read——提取 YAML frontmatter,以便列出文件
  • AskUserQuestion——交互式选择文件
第 2 步:解析提示词文件

读取并提取所选 prompt.md 文件中的数据。

解析策略:

1. YAML Frontmatter(第 1-12 行):

---
title: "Song Title Here"
project: "Project Name"
---
  • 提取 title: 的值
  • 如果有引号,则去掉两侧引号
  • 将其作为“歌曲标题”字段

2. 结构化提示词(位于“### Structured Prompt”标题下):

找到标题 ### Structured Prompt,然后提取三个反引号之间的所有内容:

genre: "bubblegum pop, synth-pop, disco-influenced pop..."
vocal: "bright female pop vocals, playful delivery..."
instrumentation: "synth bass, disco-inspired drums..."
production: "polished modern pop, wide stereo mix..."
mood: "playful, sarcastic, witty, upbeat..."

重要事项:

  • 原样复制整个代码块(共 5 行)
  • 不要解析单独的字段
  • 将此完整代码块填入 Suno 的“Styles”字段
  • 保留所有引号和格式

3. 歌词部分(位于“## Lyrics”标题之后):

找到 ## Lyrics,然后提取三个反引号之间的所有内容:

///*****///

[Verse 1 | playful | bright production]
Lyrics text here...

[Chorus | upbeat | full production]
Chorus lyrics here...

关键解析规则:

  • 移除分隔线:跳过开头的 ///*****///(它只是文件中的分隔符)
  • 保留所有元标签:[Verse 1 | playful | bright production]——Suno 会用到这些!
  • 保留章节标记:[Verse]、[Chorus]、[Bridge] 等
  • 保留所有空行:准确保留原有格式
  • 从第一段实际歌词内容开始:移除分隔线后,从第一个 [Verse...] 标签开始

提取示例:

File contains:
///*****///

[Verse 1 | playful | bright production]
You showed up late...

Extract as:
[Verse 1 | playful | bright production]
You showed up late...

4. 模型选择(来自“### Model and Parameters”部分):

在本部分靠前位置查找模型规格:

**Model:** v5 (cleanest audio, most natural vocals - best for modern pop)

提取规则:

  • 模型:提取 **Model:** 之后、左括号之前的值
    • 预期值:“v5”、“v4.5”、“v4.5+”、“v4”
    • 去除空格:“v5”
    • 如果未指定,则默认为“v5”

5. 参数(来自“### Model and Parameters”部分):

查找此标题下的项目符号列表:

- Weirdness: 40%
- Style Influence: 60%
- Vocal Gender: Female
- Exclude Styles: Rock, Metal, Country

提取规则:

  • 怪异度:提取 % 之前的数字(例如,从“40%”中提取“40”)
    • 如果是范围,例如“30-40%”,则取中间值(35)
    • 转换为滑块值:直接使用该值(0-100 刻度)
  • 风格影响:提取 % 之前的数字(例如,从“60%”中提取“60”)
    • 如果是范围,例如“60-70%”,则取中间值(65)
    • 转换为滑块值:直接使用该值(0-100 刻度)
  • 人声性别:提取 : 之后的值并去除空格
    • 预期值:“Female”、“Male”或未指定
    • 映射到 Suno 的性别按钮
  • 排除风格:提取 : 之后以逗号分隔的列表
    • 去除空格:“Rock, Metal, Country”
    • 保留为逗号分隔的字符串

异常处理:

  • 如果字段缺失:使用合理的默认值或跳过
  • 如果 YAML 格式错误:尝试使用正则表达式提取作为备用方案
  • 如果歌词部分为空:报错(Suno 需要歌词)
  • 如果缺少参数:使用 Suno 默认值(滑块为 50%)

使用的工具:

  • Read - 读取 prompt.md 文件
  • Regex/string parsing - 提取结构化数据

验证:

  • 标题存在且非空
  • 歌词存在且非空
  • 结构化提示词存在且非空
  • 参数在有效范围内(滑块为 0-100)
第 3 步:显示解析后的数据

向用户展示从文件中提取的内容,以便核对:

格式:

📋 Parsed Prompt Data:

Title: "Fixer-Upper"
Project: "Pop Songs I Love"
Model: v5

Lyrics Preview (first 200 chars):
[Verse 1 | playful | bright production]
You showed up late with pizza stains
On that shirt you wore last Tuesday
Asked me if I'd do your laundry
While you played your gam...

(Note: Divider line removed for Suno upload)

Style/Genre (from structured prompt):
genre: "bubblegum pop, synth-pop, disco-influenced pop..."
[Full 5-line structured prompt shown]

Parameters:
- Weirdness: 40%
- Style Influence: 60%
- Vocal Gender: Female
- Exclude Styles: Rock, Metal, Country

Ready to upload to Suno!

目的:

  • 用户可以确认解析是否正确
  • 在自动化开始前发现任何问题
  • 增强用户对流程的信心
步骤 4:初始化 Chrome 会话

设置浏览器自动化环境。

步骤:

  1. 调用 tabs_context_mcp 获取当前标签页状态
    • 检查是否存在 MCP 标签页组
    • 获取可用的标签页 ID
  2. 如果不存在 MCP 标签页组:调用 tabs_context_mcp 并设置 createIfEmpty: true
  3. 创建新标签页:tabs_create_mcp
    • 为 Suno 自动化新建标签页
    • 避免干扰用户现有的标签页
  4. 导航至 suno.com:navigate(url: "https://suno.com")
  5. 等待页面加载:computer(action: wait, duration: 3)

错误处理:

  • 如果导航失败:重试一次,然后请用户检查连接
  • 如果创建标签页失败:告知用户并退出
  • 如果已在 suno.com:询问是否要创建新标签页或使用现有标签页

使用的工具:

  • tabs_context_mcp - 获取标签页上下文
  • tabs_create_mcp - 创建新标签页
  • navigate - 导航至 URL
  • computer (wait) - 等待页面加载
步骤 5:导航至创建界面

从首页导航至自定义模式下的创建页面。

步骤:

  1. 导航至创建页面:

    - Use navigate tool: "https://suno.com/create"
    - OR use find + computer tools to click "Create" button
    - Wait 2 seconds for page load
    
  2. 切换至自定义模式:

    - Use find tool: query="Custom tab button"
    - Use computer tool: left_click on the Custom button ref
    - Wait 1 second for mode switch
    
  3. 确认自定义模式已加载:

    - Take screenshot for debugging (optional)
    - Use read_page to verify "Lyrics" field is present
    

要查找的 UI 元素:

  • 创建按钮/链接(引用因情况而异,使用 find 工具)
  • 自定义选项卡按钮(区别于“简单”模式)
  • 歌词文本区域(确认自定义模式已加载)

错误处理:

  • 如果创建页面未加载:重试导航一次
  • 如果未找到自定义按钮:截取屏幕截图并告知用户
  • 如果超时:请用户检查 Suno 状态

使用的工具:

  • navigate - 直接导航至 URL
  • find - 根据描述查找 UI 元素
  • computer - 点击按钮
  • read_page - 确认页面已正确加载
第 6 步:填写表单字段

使用解析后的数据填写每个表单字段。

逐字段填写流程:

a. 模型选择器(创建区域顶部)

- Use find: query="v5" or "model selector dropdown"
- Location: Top of create area, near Simple/Custom tabs
- Current default: v5
- Click to open dropdown if not already showing target model
- Select the parsed model (v5, v4.5, v4.5+, or v4)

数据: 第 2 步中的模型(例如,“v5”) 注意: 根据对 UI 的探索,模型选择器显示在顶部 实施方式:

  • 如果模型是“v5”(默认值):可以跳过(已选中)
  • 如果模型不同:点击下拉菜单并选择相应选项
  • 使用 find 定位具体的模型选项
  • 使用 computer.left_click 进行选择

b. 歌词文本框

- Use find: query="lyrics textarea"
- Use form_input: ref=<lyrics_ref>, value=<full_lyrics_text>
- Or use computer.type if form_input fails

数据: 第 2 步中的完整歌词(删除分隔行 ///*****///,但保留所有元标签,如 [Verse 1 | ...])

c. 风格字段(结构化提示词)

- Use find: query="styles textbox" or "style of music"
- Use form_input: ref=<styles_ref>, value=<structured_prompt_block>

数据: 完整的 5 行结构化提示词块

d. 歌曲标题(可选)

- Use find: query="song title optional"
- Use form_input: ref=<title_ref>, value=<song_title>

数据: YAML 前置元数据中的标题

e. 展开高级选项

- Use find: query="Advanced Options"
- Use computer: left_click on Advanced Options button
- Wait 1 second for expansion

f. 排除风格

- Use find: query="exclude styles"
- Use form_input: ref=<exclude_ref>, value=<exclude_styles_list>

数据: 以逗号分隔的排除列表(例如,“Rock, Metal, Country”)

g. 人声性别

- Use find: query="Female" (or "Male" based on parsed data)
- Use computer: left_click on the appropriate gender button

数据: 参数中的“Female”或“Male” 注意: 如果未指定,跳过此字段(使用 Suno 默认值)

h. 怪异度滑块

数据: 解析出的怪异度值(0-100)

操作方法(基于坐标拖动):

Suno 中的滑块是自定义 React 组件(具有 ARIA 角色的 DIV),而不是标准 HTML 输入框。要设置数值,必须基于坐标进行鼠标拖动。

逐步实施:

  1. 查找滑块元素:

    Use find: query="Weirdness slider"
    This returns a ref to the slider with role="slider"
    
  2. 使用 JavaScript 计算目标位置:

    const slider = document.querySelector('[role="slider"][aria-label*="Weirdness"]');
    const thumb = slider.children[slider.children.length - 1];
    const sliderRect = slider.getBoundingClientRect();
    const thumbRect = thumb.getBoundingClientRect();
    
    // Current thumb center position
    const startX = thumbRect.left + thumbRect.width / 2;
    const startY = thumbRect.top + thumbRect.height / 2;
    
    // Target position (e.g., 40% along slider width)
    const targetPercent = 40;  // Use parsed value
    const targetX = sliderRect.left + (sliderRect.width * (targetPercent / 100));
    const targetY = sliderRect.top + sliderRect.height / 2;
    

    使用 javascript_tool 执行此操作并返回坐标

  3. 将滑块拇指拖至目标位置:

    Use computer: left_click_drag
    - start_coordinate: [startX, startY] (from JavaScript)
    - coordinate: [targetX, targetY] (from JavaScript)
    

此方法有效的原因:

  • 鼠标拖动事件完成时,React 状态会更新
  • 坐标计算可确保定位准确
  • getBoundingClientRect() 可提供精确的像素位置
  • 拖动拇指(最后一个子元素)会触发 React 的 onChange 处理程序

i. 风格影响滑块

数据: 解析出的风格影响值(0-100)

操作方法(与怪异度相同):

使用相同的基于坐标的拖动方法:

  1. 查找滑块:

    Use find: query="Style Influence slider"
    
  2. 使用 JavaScript 计算坐标:

    const slider = document.querySelector('[role="slider"][aria-label*="Style Influence"]');
    const thumb = slider.children[slider.children.length - 1];
    const sliderRect = slider.getBoundingClientRect();
    const thumbRect = thumb.getBoundingClientRect();
    
    const startX = thumbRect.left + thumbRect.width / 2;
    const startY = thumbRect.top + thumbRect.height / 2;
    
    const targetPercent = 60;  // Use parsed value
    const targetX = sliderRect.left + (sliderRect.width * (targetPercent / 100));
    const targetY = sliderRect.top + sliderRect.height / 2;
    
  3. 拖动至目标位置:

    Use computer: left_click_drag from [startX, startY] to [targetX, targetY]
    

两个滑块的重要注意事项:

  • 不要使用 form_input(会因“Element type 'DIV' is not a supported form input”而失败)
  • 不要直接设置 ARIA 属性(不会更新 React 状态)
  • 不要使用键盘事件(方向键不会触发状态更新)
  • 请使用通过计算坐标进行的 left_click_drag
  • 精度:通常在 ±1% 以内,足以满足要求

实施说明:

  • 按顺序填写字段,不要并行填写
  • 每次填写字段后等待 0.5 秒,以确保 UI 稳定
  • 填写关键字段后截取屏幕截图以进行调试
  • 如果未找到字段,记录警告并继续(可选字段)
  • 如果必填字段填写失败,则报错并退出

使用的工具:

  • find - 定位表单元素
  • form_input - 填写文本字段
  • computer(left_click)- 点击按钮、操作滑块
  • computer(type)- 文本输入的备用方法
  • computer(wait)- 暂停以确保稳定
第 7 步:确认与审核

提交前,向用户展示将要提交的内容并请求确认。

流程:

  1. 截取已填写表单的屏幕截图:

    - Use computer: screenshot action
    - Capture the entire Create form area
    - User can visually verify all fields
    
  2. 向用户显示摘要:

    ✅ Suno Form Ready for Submission:
    
    Title: "Fixer-Upper"
    Lyrics: 140 lines (with meta tags preserved)
    Style: bubblegum pop, synth-pop, disco-influenced pop...
    Weirdness: 40%
    Style Influence: 60%
    Vocal Gender: Female
    Exclude Styles: Rock, Metal, Country
    
    [Screenshot of filled form displayed above]
    
  3. 请求确认:

    Use AskUserQuestion:
    - Question: "Submit this song to Suno for generation?"
    - Options:
      * "Yes, create the song" (proceed to submit)
      * "No, cancel" (exit without submitting)
    - Wait for explicit user response
    
  4. 处理回复:

    • 如果回复“Yes”:继续第 8 步
    • 如果回复“No”:告知用户并正常退出
      • 消息:“上传已取消。表单已填写,但尚未提交。如有需要,你可以在浏览器中手动检查并提交。”

此步骤的重要性:

  • 用户在消耗点数前拥有最终决定权
  • 在提交前发现任何解析错误
  • 视觉确认有助于建立信任
  • 防止意外提交

使用的工具:

  • computer(screenshot)- 捕获表单
  • AskUserQuestion - 获取明确确认
步骤 8:提交并监控

提交表单并监控歌曲 URL。

提交:

  1. 查找 Create 按钮:

    - Use find: query="Create song button" or "Create button"
    - Expected ref like: ref_943 (based on exploration)
    
  2. 点击 Create 按钮:

    - Use computer: left_click on Create button ref
    - Wait 3 seconds for submission processing
    
  3. 监控响应:

    - Page may redirect or update with song generation status
    - Look for success indicators or error messages
    - Wait up to 10 seconds for initial response
    

提取 URL(如果开始生成):

  1. 检查歌曲 URL:

    - Suno typically generates 2 songs per creation
    - URLs may appear immediately or after processing
    - Format: https://suno.com/song/[song-id]
    
  2. 提取 URL:

    - Use read_page to get page content
    - Look for song URLs in the recent creations area
    - OR check the workspace/library section
    
  3. 向用户显示结果:

    ✅ Song submitted to Suno!
    
    Generation started. Suno is creating your song(s).
    
    URLs (check these for your songs):
    - https://suno.com/song/abc123-def456-...
    - https://suno.com/song/xyz789-uvw012-...
    
    Note: Songs may take 1-2 minutes to generate.
    Visit the URLs above to listen once ready.
    

错误处理:

  • 未找到提交按钮:

    • 截取屏幕截图
    • 错误:“无法找到 Create 按钮。Suno UI 可能已更改。”
    • 提议向用户显示屏幕截图,以便手动完成
  • Suno 验证错误:

    • 从页面读取错误消息
    • 向用户显示:“Suno 验证错误:[错误消息]”
    • 如果能识别原因,建议修复方法(例如,“歌词太短”)
  • 网络/超时错误:

    • 错误:“提交超时。请手动检查 Suno。”
    • 提供表单状态:“表单已填写并点击 Create 按钮,但未收到响应。”
  • 点数耗尽:

    • 如果出现与点数相关的错误消息
    • 告知用户:“Suno 点数已耗尽。请购买更多点数后重试。”

URL 提取回退方案:

如果无法自动提取 URL:

  • 告知用户:“歌曲已成功提交,但无法自动提取 URL。”
  • 指引:“请在 https://suno.com/me 查看您的 Suno 工作区,找到新创建的歌曲。”

使用的工具:

  • find - 定位 Create 按钮
  • computer (left_click) - 提交表单
  • computer (wait) - 等待处理
  • read_page - 提取 URL 和错误
  • computer (screenshot) - 调试
步骤 9:完成

结束自动化流程并提供最终状态。

成功情况:

✅ Suno Upload Complete!

Song: "Fixer-Upper"
Status: Submitted and generating
URLs:
- [Song URL 1]
- [Song URL 2]

Songs typically generate in 1-2 minutes. Visit the URLs above to listen!

部分成功情况:

✅ Suno Upload Submitted!

Song: "Fixer-Upper"
Status: Form submitted, URLs not yet available

Check your Suno workspace for the generated songs:
https://suno.com/me

失败情况:

❌ Suno Upload Failed

Error: [Specific error message]

The form was partially filled. You can:
1. Complete manually in the browser (tab is still open)
2. Try running /suno-upload again
3. Check the error message above for guidance

错误处理模式

未找到文件:

  • 清楚说明出了什么问题
  • 提供修复指引(导航到正确目录、先创建提示词)
  • 不显示堆栈跟踪或技术术语

解析错误:

  • 指明解析失败的字段
  • 如果有帮助,显示有问题的内容
  • 建议修复 prompt.md 文件
  • 如果字段非关键,提供使用默认值继续的选项

Chrome 自动化失败:

  • 在失败时截取屏幕截图
  • 向用户显示屏幕截图(用于可视化调试)
  • 说明当时正在尝试执行的操作
  • 如果可能是临时故障,提供重试选项

Suno UI 更改:

  • 多次尝试后仍找不到元素时
  • 错误:“Suno UI 可能已更改。此技能需要更新。”
  • 建议将手动上传作为备用方案
  • 请用户报告问题

网络问题:

  • 区分本地网络问题和 Suno 服务端问题
  • 建议检查互联网连接
  • 提供重试选项
  • 超时时间应留得充足(提交时至少 10 秒)

使用示例

示例 1:单个提示词文件

User: "Upload this to Suno"
Skill:
- Finds single prompt.md in current directory
- Parses: "Fixer-Upper" pop song
- Displays parsed data
- Navigates to Suno, fills form
- Asks confirmation
- User: "Yes"
- Submits and returns URLs

示例 2:多个提示词文件

User: "/suno-upload"
Skill:
- Finds 5 prompt.md files in subdirectories
- Lists all 5 with titles and projects
- Asks which to upload
- User selects #3
- Proceeds with upload workflow

示例 3:由 suno-song-creator 调用

User: Creates song with suno-song-creator
Skill (suno-song-creator):
- Generates prompt, saves to prompt.md
- Asks: "Upload to Suno now?"
- User: "Yes"
- Invokes suno-upload skill with file path
- suno-upload proceeds automatically

工具参考

发现与解析:

  • Glob - 查找 prompt.md 文件
  • Read - 读取文件内容
  • AskUserQuestion - 选择文件、确认

Chrome 自动化:

  • tabs_context_mcp - 获取标签页状态
  • tabs_create_mcp - 创建新标签页
  • navigate - 导航到 URL
  • computer (screenshot) - 截取屏幕截图
  • computer (wait) - 等待稳定
  • computer (left_click) - 点击按钮
  • computer (type) - 输入文本(备用方案)
  • find - 根据描述定位 UI 元素
  • form_input - 填写表单字段
  • read_page - 获取页面结构

成功标准

✅ 正确查找并解析 prompt.md 文件 ✅ 提取所有字段,且不丢失数据 ✅ 保留歌词元标签和格式 ✅ 导航到 Suno Create 界面 ✅ 准确填写所有表单字段 ✅ 处理滑块和特殊输入 ✅ 提交前显示确认信息 ✅ 成功提交并提取 URL ✅ 清晰地处理错误 ✅ 可由其他技能调用

已知限制

滑块精度:

  • 基于坐标的拖动精度可达 ±1%
  • 对创意参数而言,这种偏差可以忽略,且在可接受范围内
  • 浏览器渲染和视口大小不会影响计算(使用 getBoundingClientRect)

URL 提取:

  • Suno 的生成过程是异步的
  • URL 可能不会立即显示
  • 后备方案:引导用户前往工作区

UI 变更:

  • Suno 可能会更新其 UI
  • UI 变更后,可能需要更新此技能
  • 参考选择器可能会失效

积分要求:

  • 此技能不会预先检查积分余额
  • 用户必须拥有积分才能成功提交
  • 只有在提交时才会显示错误

维护说明

如果 Suno UI 发生变更,请更新以下部分:

  1. 第 5 步:导航路径和按钮引用
  2. 第 6 步:表单字段选择器和名称
  3. 第 8 步:创建按钮选择器
  4. URL 提取模式

定期使用真实的 prompt.md 文件进行测试,确保解析准确无误。


版本: 2.0.0 - 已实现完整自动化 最后更新: 2026-01-01 依赖项: Chrome MCP server、拥有积分的 Suno 账户

v2.0 的主要改进:

  • ✅ 滑块自动化已全面可用,采用基于坐标的拖动方式
  • ✅ 实现完整的端到端自动化,无需人工干预
  • ✅ 通过鼠标事件可靠地与 React 组件交互
  • ✅ 已通过成功生成歌曲验证(“Fixer-Upper”测试用例)

评论

支持 Markdown