Make songs with AI
Three ways to work
Be walked through it question by question, have the gaps filled in, or specify everything at once.
build_song takes a mode. It exists because "make me a song" and "here is the exact chart I want" are different requests, and a server that only handles one of them is annoying for the other.
guided — one question at a time
For when you do not know NØISE yet. The server asks in musical order — what is it called, what key, how fast, which style (one for the whole song), which groove it starts in, which kit, which tuning, how is it built up — and every option says what it does, not just what it is called:
Which groove does the song start in? These are the ones rock offers; a section may pick another with its own `feel`.
- straight (recommended): Straight - the rock default
- halfTime: Half-time - changes the timing grid, not just the pattern
- driving16: Driving 16ths - changes the timing grid, not just the patternBecause the server keeps no session, each answer comes back with the draft so far. Your model sends that draft plus the new answer, and gets the next question. Nothing is stored anywhere.
That has a useful consequence: the draft is always a valid starting point. Halfway through, you can fill in the rest yourself and switch to direct — the guided flow is not a funnel you are stuck in.
assisted — the default
Builds what you gave it, and only asks about the things that genuinely change what you hear and are missing: the key and the style. Anything else you leave out simply stays unset, and the app plays it with the format's fixed defaults — the style's first kit and feel, the STOCK preset, the arrangement's own fills. A value the server could not use comes back as a warning with what it used instead.
direct — no questions
Builds the song or fails with precise errors. For batch work, and for when you know exactly what you want.
{ "mode": "direct", "song": { "name": "…", "key": "Am", "sections": [ … ] } }When a client cannot ask
The server does not use MCP elicitation, even in clients that support it. A question always comes back as structured data next to the text, and your model asks you itself:
{
"done": false,
"step": 2,
"total": 8,
"question": { "field": "key", "prompt": "Which key is it in? …" },
"draft": { "name": "What's Up" }
}So the conversation works in every client. The server never blocks waiting for something it cannot get.