关于 Suno Upload
Suno Upload 是一款通过 Chrome 自动化将结构化歌曲提示文件 `prompt.md` 填入 Suno 创建界面的 Skill。它面向根据提示文件制作 Suno 歌曲的用户,可处理表单、模型设置并监控生成过程。
主要功能
- 01解析标题、歌词、风格和参数
- 02进入 Suno 创建页的自定义模式
- 03填写歌曲字段和高级选项
- 04通过坐标拖动设置滑块值
- 05提交创作并监控生成
适用场景
- 01将准备好的 `prompt.md` 提交到 Suno
- 02根据多个提示文件创建歌曲
- 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 会话
设置浏览器自动化环境。
步骤:
- 调用
tabs_context_mcp获取当前标签页状态- 检查是否存在 MCP 标签页组
- 获取可用的标签页 ID
- 如果不存在 MCP 标签页组:调用
tabs_context_mcp并设置createIfEmpty: true - 创建新标签页:
tabs_create_mcp- 为 Suno 自动化新建标签页
- 避免干扰用户现有的标签页
- 导航至 suno.com:
navigate(url: "https://suno.com") - 等待页面加载:
computer(action: wait, duration: 3)
错误处理:
- 如果导航失败:重试一次,然后请用户检查连接
- 如果创建标签页失败:告知用户并退出
- 如果已在 suno.com:询问是否要创建新标签页或使用现有标签页
使用的工具:
- tabs_context_mcp - 获取标签页上下文
- tabs_create_mcp - 创建新标签页
- navigate - 导航至 URL
- computer (wait) - 等待页面加载
步骤 5:导航至创建界面
从首页导航至自定义模式下的创建页面。
步骤:
-
导航至创建页面:
- Use navigate tool: "https://suno.com/create" - OR use find + computer tools to click "Create" button - Wait 2 seconds for page load -
切换至自定义模式:
- Use find tool: query="Custom tab button" - Use computer tool: left_click on the Custom button ref - Wait 1 second for mode switch -
确认自定义模式已加载:
- 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 输入框。要设置数值,必须基于坐标进行鼠标拖动。
逐步实施:
-
查找滑块元素:
Use find: query="Weirdness slider" This returns a ref to the slider with role="slider" -
使用 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 执行此操作并返回坐标
-
将滑块拇指拖至目标位置:
Use computer: left_click_drag - start_coordinate: [startX, startY] (from JavaScript) - coordinate: [targetX, targetY] (from JavaScript)
此方法有效的原因:
- 鼠标拖动事件完成时,React 状态会更新
- 坐标计算可确保定位准确
- getBoundingClientRect() 可提供精确的像素位置
- 拖动拇指(最后一个子元素)会触发 React 的 onChange 处理程序
i. 风格影响滑块
数据: 解析出的风格影响值(0-100)
操作方法(与怪异度相同):
使用相同的基于坐标的拖动方法:
-
查找滑块:
Use find: query="Style Influence slider" -
使用 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; -
拖动至目标位置:
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 步:确认与审核
提交前,向用户展示将要提交的内容并请求确认。
流程:
-
截取已填写表单的屏幕截图:
- Use computer: screenshot action - Capture the entire Create form area - User can visually verify all fields -
向用户显示摘要:
✅ 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] -
请求确认:
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 -
处理回复:
- 如果回复“Yes”:继续第 8 步
- 如果回复“No”:告知用户并正常退出
- 消息:“上传已取消。表单已填写,但尚未提交。如有需要,你可以在浏览器中手动检查并提交。”
此步骤的重要性:
- 用户在消耗点数前拥有最终决定权
- 在提交前发现任何解析错误
- 视觉确认有助于建立信任
- 防止意外提交
使用的工具:
- computer(screenshot)- 捕获表单
- AskUserQuestion - 获取明确确认
步骤 8:提交并监控
提交表单并监控歌曲 URL。
提交:
-
查找 Create 按钮:
- Use find: query="Create song button" or "Create button" - Expected ref like: ref_943 (based on exploration) -
点击 Create 按钮:
- Use computer: left_click on Create button ref - Wait 3 seconds for submission processing -
监控响应:
- 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(如果开始生成):
-
检查歌曲 URL:
- Suno typically generates 2 songs per creation - URLs may appear immediately or after processing - Format: https://suno.com/song/[song-id] -
提取 URL:
- Use read_page to get page content - Look for song URLs in the recent creations area - OR check the workspace/library section -
向用户显示结果:
✅ 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 发生变更,请更新以下部分:
- 第 5 步:导航路径和按钮引用
- 第 6 步:表单字段选择器和名称
- 第 8 步:创建按钮选择器
- URL 提取模式
定期使用真实的 prompt.md 文件进行测试,确保解析准确无误。
版本: 2.0.0 - 已实现完整自动化 最后更新: 2026-01-01 依赖项: Chrome MCP server、拥有积分的 Suno 账户
v2.0 的主要改进:
- ✅ 滑块自动化已全面可用,采用基于坐标的拖动方式
- ✅ 实现完整的端到端自动化,无需人工干预
- ✅ 通过鼠标事件可靠地与 React 组件交互
- ✅ 已通过成功生成歌曲验证(“Fixer-Upper”测试用例)