{"name":"suno-mcp","version":"0.1.0","transport":"Streamable HTTP","endpoint":"/mcp","tools":[{"name":"search","description":"Search Suno for songs by free-text term. Returns up to page_size clips with key fields (id, title, handle, audio_url, image_url, duration). Caches results so later tool calls see the same metadata without re-hitting Suno.","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"search term"},"page_size":{"type":"integer","minimum":1,"maximum":50,"default":20},"cursor":{"type":"string","default":"0"}},"required":["q"]}},{"name":"get_clip","description":"Fetch one Suno clip's metadata by id. Returns the cached row if recent, otherwise hits the API and caches. Includes audio_url and image_url that import_clip / ffstudio import_from_url can consume.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Suno clip uuid"}},"required":["id"]}},{"name":"get_user_clips","description":"List recent clips for a Suno creator handle.","inputSchema":{"type":"object","properties":{"handle":{"type":"string","description":"Suno user handle (no @)"}},"required":["handle"]}},{"name":"get_similar","description":"Get clips similar to a given clip id.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"count":{"type":"integer","minimum":1,"maximum":50,"default":20}},"required":["id"]}},{"name":"generate_song","description":"Start a Suno song generation. Returns the proxy's raw response (often contains task ids) and logs the request locally as a 'pending' generation row.","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"main creative prompt"},"tags":{"type":"string","description":"style tags (comma-separated)"},"title":{"type":"string"},"lyrics":{"type":"string","description":"explicit lyrics (skip prompt-based)"},"is_instrumental":{"type":"boolean","default":false},"mv":{"type":"string","description":"model version, default chirp-fenix"}}}},{"name":"improve_tags","description":"Have Suno's AI rewrite a tag/style string into something richer.","inputSchema":{"type":"object","properties":{"tags":{"type":"string"},"is_instrumental":{"type":"boolean","default":false}},"required":["tags"]}},{"name":"write_lyrics","description":"Have Suno's AI write lyrics from a prompt. Returns suggestions.","inputSchema":{"type":"object","properties":{"prompt":{"type":"string"},"title":{"type":"string"}},"required":["prompt"]}},{"name":"import_clip","description":"Bridge: pull a Suno clip's audio (or image / video) into ffstudio uploads in one call. Looks up the URL from the cached suno_clips row (call get_clip / search first if not cached), POSTs to ffstudio /upload/url with source='suno' + source_ref=<clip_id>, and records the import in suno_imports. Returns the new ffstudio file_id ready for run_recipe.","inputSchema":{"type":"object","properties":{"clip_id":{"type":"string","description":"Suno clip id (must be cached or fetched first)"},"asset":{"type":"string","enum":["audio","image","video"],"default":"audio"}},"required":["clip_id"]}},{"name":"list_cached_clips","description":"List Suno clips this MCP has cached (in the shared SQLite). Cheap discovery without hitting Suno. Use this to remind yourself what the agent has already touched in this workspace.","inputSchema":{"type":"object","properties":{"handle":{"type":"string","description":"filter by handle"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":30}}}},{"name":"list_streams","description":"List streamer instances (each is one independent YouTube live channel).","inputSchema":{"type":"object","properties":{}}},{"name":"create_stream","description":"Create a new streamer instance. Returns its id; pass that id to start_stream / stop_stream.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"human-readable name"}},"required":["name"]}},{"name":"start_stream","description":"Start streaming a list of Suno clip ids to YouTube Live. clipIds is required; source picks what gets streamed: 'video' (Suno's own video), 'mp3_cover' (audio + each clip's cover), or 'mp3_static' (audio + a single static image previously uploaded via /upload-image on the instance). mode='loop' replays forever, 'once' stops after the queue. streamKey overrides the env-default RTMPS key for this run.","inputSchema":{"type":"object","properties":{"instance_id":{"type":"string"},"clipIds":{"type":"array","items":{"type":"string"},"minItems":1},"source":{"type":"string","enum":["video","mp3_cover","mp3_static"]},"mode":{"type":"string","enum":["once","loop"],"default":"loop"},"engine":{"type":"string","enum":["concat","sequential"],"default":"concat"},"streamKey":{"type":"string"},"titleOverlay":{"type":"boolean","default":false}},"required":["instance_id","clipIds","source"]}},{"name":"stop_stream","description":"Stop a running streamer instance.","inputSchema":{"type":"object","properties":{"instance_id":{"type":"string"}},"required":["instance_id"]}},{"name":"stream_status","description":"Get the full status of a streamer instance: phase, current clip, queue length, ffmpeg pid, log tail. Cheap, polls allowed.","inputSchema":{"type":"object","properties":{"instance_id":{"type":"string"}},"required":["instance_id"]}}],"usage":"claude mcp add suno --transport http <PUBLIC_URL>/mcp"}