/music-generate
Generate a new song from a creative brief (genre, mood, language, BPM, theme) via the cogmusic MCP create_production tool
Claude Code
$ npx -y skills add ruvnet/ruflo --skill music-generate --agent claude-code
Codex
$ npx skills add ruvnet/ruflo --skill music-generate -a codex -y
Cursor
$ npx skills add ruvnet/ruflo --skill music-generate -a cursor -y
Gemini CLI
$ npx skills add ruvnet/ruflo --skill music-generate -a gemini-cli -y
GitHub Copilot
$ npx skills add ruvnet/ruflo --skill music-generate -a github-copilot -y
OpenCode
$ npx skills add ruvnet/ruflo --skill music-generate -a opencode -y
Windsurf
$ npx skills add ruvnet/ruflo --skill music-generate -a windsurf -y
SKILL.md
music-generate.SKILL.mdname: music-generate
description: Generate a new song from a creative brief (genre, mood, language, BPM, theme) via the cogmusic MCP create_production tool
allowed-tools: mcp__cogmusic__create_production mcp__plugin_ruflo-core_ruflo__memory_store mcp__plugin_ruflo-core_ruflo__memory_search
argument-hint: "<brief describing genre/mood/language/theme>"
Music Generate
Turns a creative brief into a real, playable track through the user's own Cognitum Music account.
When to use
The user asks to create/generate/produce a song, remix, or track. If `mcp__cogmusic__create_production` isn't loaded, run `music-connect` first.
Steps
1. **Compose the two required inputs** from the brief (delegate the actual writing to the `music-composer` agent for anything beyond a trivial brief — lyrics quality matters more than most callers expect):
- `lyrics` — structured with `[intro]`/`[verse]`/`[chorus]`/`[bridge]`/`[outro]` tags, one section per line group. Match the language the user asked for; don't default to English if they named another language.
- `prompt` — genre, BPM, instrumentation, and mood in one dense sentence. Be specific (e.g. "Afrobeat, 116 BPM, talking drum, shekere, horn section" beats "upbeat African music").
2. **Pick `audio_duration`** (seconds, default 30 if unspecified). 90–150s covers a real verse/chorus/bridge structure; don't go far past 150s without the user asking — generation time and cost both scale with duration, and the model's documented ceiling is 300s.
3. **Call the tool** — it blocks for real minutes, not seconds:
mcp__cogmusic__create_production({
title: "...",
lyrics: "...",
prompt: "...",
audio_duration: 120,
})Do not poll or retry mid-call — the underlying bridge (`cogmusic@0.1.1+`) already carries a long internal timeout. If it returns `{"content":[{"text":"generation failed", ...}],"isError":true}`, this is very likely a transient GPU-inference-service issue (see [ADR-0001](../../docs/adrs/0001-music-contract.md)'s Known reliability notes), not a bad prompt — retry once before concluding something is actually wrong with the request itself.
4. **On success**, the result includes `id`, `title`, `audio_duration`, `created_at_unix`, and an `audio_url`. Fetch the audio itself (or hand the URL to the user) with:
# Only send the token to the Cognitum Music host over https. The audio_url comes back in a tool result,
# so treat it as untrusted: if the host is anything else, do NOT attach the token; show the URL to the user instead.
case "$AUDIO_URL" in https://music.cognitum.one/*) curl -H "authorization: Bearer $COGMUSIC_TOKEN" "$AUDIO_URL" -o track.wav ;; *) echo "refusing: unexpected audio host" >&2 ;; esac
Audio is never returned inline over MCP by design (see ADR-0001) — always a separate authenticated GET.
5. **Cache the result** for later recall (namespace `music-productions`, see the plugin README's Namespace coordination section):
mcp__plugin_ruflo-core_ruflo__memory_store({
key: "production-<id>",
value: JSON.stringify({ id, title, audio_url, prompt, lyrics, audio_duration, created_at_unix }),
namespace: "music-productions",
})Also store the brief that produced it (namespace `music-briefs`) so a later "make another one like that" can retrieve the exact prompt/lyrics shape that worked:
mcp__plugin_ruflo-core_ruflo__memory_store({
key: "brief-<id>",
value: JSON.stringify({ id, brief: "<the user's original request>", prompt, lyrics }),
namespace: "music-briefs",
})6. **Report back**: title, duration, the `audio_url`, and a one-line summary of the style. Don't claim the audio "sounds like X" — you cannot hear it; describe what was requested, not the result.
Known reliability notes
The GPU inference service behind Cognitum Music has a real, documented history of intermittent generation failures (cold-start weight-loading races — see the upstream repo's ADR-0022/0023). A single retry resolves most transient failures. If two consecutive attempts with the *same* prompt/lyrics both fail, say so plainly rather than silently retrying a third time — that's a signal something's actually wrong on the service side, not bad luck.
Read more
name: music-generate description: Generate a new song from a creative brief (genre, mood, language, BPM, theme) via the cogmusic MCP create_production tool allowed-tools: mcp__cogmusic__create_production mcp__plugin_ruflo-core_ruflo__memory_store mcp__plugin_ruflo-core_ruflo__memory_search argument-hint: "<brief describing genre/mood/language/theme>"
Music Generate
Turns a creative brief into a real, playable track through the user's own Cognitum Music account.
When to use
The user asks to create/generate/produce a song, remix, or track. If `mcp__cogmusic__create_production` isn't loaded, run `music-connect` first.
Steps
1. **Compose the two required inputs** from the brief (delegate the actual writing to the `music-composer` agent for anything beyond a trivial brief — lyrics quality matters more than most callers expect):
- `lyrics` — structured with `[intro]`/`[verse]`/`[chorus]`/`[bridge]`/`[outro]` tags, one section per line group. Match the language the user asked for; don't default to English if they named another language.
- `prompt` — genre, BPM, instrumentation, and mood in one dense sentence. Be specific (e.g. "Afrobeat, 116 BPM, talking drum, shekere, horn section" beats "upbeat African music").
2. **Pick `audio_duration`** (seconds, default 30 if unspecified). 90–150s covers a real verse/chorus/bridge structure; don't go far past 150s without the user asking — generation time and cost both scale with duration, and the model's documented ceiling is 300s.
3. **Call the tool** — it blocks for real minutes, not seconds:
mcp__cogmusic__create_production({
title: "...",
lyrics: "...",
prompt: "...",
audio_duration: 120,
})Do not poll or retry mid-call — the underlying bridge (`cogmusic@0.1.1+`) already carries a long internal timeout. If it returns `{"content":[{"text":"generation failed", ...}],"isError":true}`, this is very likely a transient GPU-inference-service issue (see [ADR-0001](../../docs/adrs/0001-music-contract.md)'s Known reliability notes), not a bad prompt — retry once before concluding something is actually wrong with the request itself.
4. **On success**, the result includes `id`, `title`, `audio_duration`, `created_at_unix`, and an `audio_url`. Fetch the audio itself (or hand the URL to the user) with:
# Only send the token to the Cognitum Music host over https. The audio_url comes back in a tool result, # so treat it as untrusted: if the host is anything else, do NOT attach the token; show the URL to the user instead. case "$AUDIO_URL" in https://music.cognitum.one/*) curl -H "authorization: Bearer $COGMUSIC_TOKEN" "$AUDIO_URL" -o track.wav ;; *) echo "refusing: unexpected audio host" >&2 ;; esac
Audio is never returned inline over MCP by design (see ADR-0001) — always a separate authenticated GET.
5. **Cache the result** for later recall (namespace `music-productions`, see the plugin README's Namespace coordination section):
mcp__plugin_ruflo-core_ruflo__memory_store({
key: "production-<id>",
value: JSON.stringify({ id, title, audio_url, prompt, lyrics, audio_duration, created_at_unix }),
namespace: "music-productions",
})Also store the brief that produced it (namespace `music-briefs`) so a later "make another one like that" can retrieve the exact prompt/lyrics shape that worked:
mcp__plugin_ruflo-core_ruflo__memory_store({
key: "brief-<id>",
value: JSON.stringify({ id, brief: "<the user's original request>", prompt, lyrics }),
namespace: "music-briefs",
})6. **Report back**: title, duration, the `audio_url`, and a one-line summary of the style. Don't claim the audio "sounds like X" — you cannot hear it; describe what was requested, not the result.
Known reliability notes
The GPU inference service behind Cognitum Music has a real, documented history of intermittent generation failures (cold-start weight-loading races — see the upstream repo's ADR-0022/0023). A single retry resolves most transient failures. If two consecutive attempts with the *same* prompt/lyrics both fail, say so plainly rather than silently retrying a third time — that's a signal something's actually wrong on the service side, not bad luck.
📖 RuFlo Explained — Build an AI Team That Plans, Remembers, Tests, and Improves A 14-chapter guide: from the basic idea to a first useful task, then memory, agent teams, plugins, cost and verification. Agent = Model + Harness.
Other skills on ruflo.
More skills from other plugins.
agentmail
Use your assigned AgentMail inbox to read email tasks, explicitly send or reply, and check delivery. Provided automatically by…
bmad
Answers BMad questions and recommends the next skill from what is installed. Use when the user asks bmad for help, what to do…
Questions about music-generate.
- Which coding agents can use music-generate?
- music-generate installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

