Sonilo MCP
OfficialIt exposes Sonilo’s licensed music/SFX generation API plus account, task-recovery, and playback utilities through MCP.
Generate music from a text prompt at a chosen duration and save it locally.
Generate an original video-matched score from a local video or URL.
Generate sound effects from text prompts with selectable audio formats.
Generate video-synced sound effects, optionally scripted per time segment.
Duck a music bed under a voice track, including voice from video, and return a mixed audio/video file.
Recover timed-out SFX or ducking generation tasks with
get_sfx_task.Check available services, limits, upload size, and free-trial/account details.
View usage summaries and per-day breakdowns.
Play local audio files through the system output device.
Generation tools may incur Sonilo charges; only account/usage/task-check/playback utilities are free/read-only.
Provides music licensed via Shutterstock for commercial use, ensuring all generated tracks are cleared for commercial use on social, brand content, and advertising.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Sonilo MCP Server
An MCP (Model Context Protocol) server that exposes Sonilo's licensed music and sound-effects API to MCP-compatible clients (Claude Code, Claude Desktop, Codex).
The flagship tool is video_to_music: hand it your finished video and it composes an original soundtrack matched to the cut — the music follows the pacing, emotion, and edits because the model saw them. Length matches the video automatically. Every track is licensed and safe for commercial use (terms apply). text_to_music is also available for fixed-length tracks with no video to match.
For sound design, video_to_sfx watches your video and generates matching sound effects, returned as a standalone audio file. text_to_sfx generates a standalone effect from a description.
▶ Example result — an AI-generated trailer with its soundtrack composed by video_to_music from the assembled cut. For recipes covering any AI-video pipeline (stitch → grade → add music → mux), see the Sonilo video-to-music cookbook.
Quickstart with Claude Code
Sign in once with the CLI, then add the server with no secret in the config:
npm install -g sonilo-cli && sonilo login
claude mcp add sonilo -- uvx sonilo-mcpOr hold an API key yourself — get one from the Sonilo dashboard:
claude mcp add sonilo --env SONILO_API_KEY=sk-... -- uvx sonilo-mcpThen start a session and ask, e.g. "Make background music that matches this video: ~/Desktop/promo.mp4."
Related MCP server: Spotify MCP Server
Why Sonilo
Video-to-music — give it a video and Sonilo composes a full-length score matched to its pacing, motion, and emotion. Transitions and beat drops align to your cut points, and the track matches the video's duration exactly — no prompts or manual syncing required.
Text-to-music — generate tracks from a text description (genre, mood, tempo, instrumentation), at an exact duration (5–360s) or none at all, in which case Sonilo picks a length that suits the prompt.
Video-to-SFX — Sonilo watches the video and generates sound effects for what it sees. You get the SFX as a standalone audio file. Optional
segmentslet you script effects to specific time ranges ([{start, end, prompt}]).Text-to-SFX — generate a standalone sound effect from a description (0.5–180s), in
wav,mp3,aac, orflac.Proofread before dubbing —
proofreadtranscribes a video and translates the transcript into editable.srtfiles, one per language plus the source-language transcript. Read and correct the wording, then hand the files todubbingassubtitlesso the dub speaks exactly the approved text — nothing is voiced until you have signed off on it.Fully licensed, commercial-safe — music licensed via Shutterstock; every generated track is cleared for commercial use on social, brand content, and advertising, with no Content ID worries.
Video-to-sound — generate music and sound effects for the same clip in one call, mixed into a single balanced soundtrack. Get back the mixed audio, or a new video with it muxed in.
Multiple variants per call —
text_to_music,video_to_music,video_to_video_music,video_to_sound, andvideo_to_video_soundacceptvariants_num(1–10, default 1): generate several distinct creative directions in one request instead of re-rolling one at a time. Cost scales linearly with N, and N > 1 is never covered by the free trial.Instrument stems —
text_to_musicandvideo_to_musicacceptstems=true: get the generated track additionally split into drums, bass, vocals and other, at no extra charge. Separation adds a few minutes; onvideo_to_musicit splits the generated music, never the video's own audio.Pay as you go — billed only for the seconds of music you generate. Self-serve accounts start with free runs on every endpoint, no card required: 2 each on text-to-music, text-to-sfx, audio-ducking and proofread, and 1 each on video-to-music, video-to-sfx, video-to-video-music, video-to-video-sfx, video-to-sound and video-to-video-sound. After that, calls bill at the normal rate.
dubbinggets one free run, a 15-second preview: the first single-language call withoutsubtitlesdubs only the first 15 seconds of the video. After that it billsvideo duration × number of languages(see Free trial below).
Audio Playback Dependencies
The play_audio tool requires PortAudio at runtime (for sounddevice). On macOS/Linux, install via:
macOS:
brew install portaudioDebian/Ubuntu:
sudo apt-get install libportaudio2
uvx sonilo-mcp and pip install will pull the Python bindings, but the system PortAudio library must be installed separately. The other tools (text_to_music, video_to_music, text_to_sfx, video_to_sfx, audio_ducking, get_sfx_task, get_account_services, get_usage) work without PortAudio.
Quickstart with Claude Desktop
Authenticate, either way round:
Sign in with the CLI —
npm install -g sonilo-cli && sonilo login— and leave"env": {}below. Nothing secret goes in the config file.Or get an API key from the Sonilo dashboard and put it in
"env".
Install the
uvpackage manager (providesuvx):curl -LsSf https://astral.sh/uv/install.sh | shSee the uv repo for other install methods.
Go to Claude > Settings > Developer > Edit Config > claude_desktop_config.json to include the following:
{ "mcpServers": { "sonilo": { "command": "uvx", "args": ["sonilo-mcp"], "env": {} } } }That is the whole config when you have signed in with
sonilo login. To hold a key instead, or to change the defaults:"env": { "SONILO_API_KEY": "sk-...", "SONILO_API_URL": "https://api.sonilo.com", "TIME_OUT_SECONDS": "600" }Restart Claude Desktop. You should see the Sonilo tools available in the tool menu.
Quickstart with Codex
Signed in with the CLI (npm install -g sonilo-cli && sonilo login), the whole
setup is one command:
codex mcp add sonilo -- uvx sonilo-mcpOr, holding a key yourself:
codex mcp add sonilo --env SONILO_API_KEY=sk-... -- uvx sonilo-mcpTo configure it by hand instead:
Get your API key from the Sonilo dashboard — or skip this step if you signed in with
sonilo login.Install the
uvpackage manager (providesuvx):curl -LsSf https://astral.sh/uv/install.sh | sh**Go to Codex > Settings > MCP servers to fill out the following:

Or you can add the server** to ~/.codex/config.toml:
[mcp_servers.sonilo]
command = "uvx"
args = ["sonilo-mcp"]
# Omit this whole block when you have signed in with `sonilo login`.
[mcp_servers.sonilo.env]
SONILO_API_KEY = "sk-..."
SONILO_API_URL = "https://api.sonilo.com"
TIME_OUT_SECONDS = "600"Restart Codex (or start a new session), then run
/mcpto confirmsonilois connected and its tools are listed.
Example usage
Once the server is connected, just ask your assistant in natural language. For example:
"Make background music that matches this video:
~/Desktop/promo.mp4.""Compose music for
https://example.com/clip.mp4with a calm, ambient style.""I stitched my AI-generated clips into
~/Desktop/trailer.mp4— add a soundtrack that matches the cut.""Use Sonilo mcp to generate 30 seconds of upbeat lo-fi hip-hop for a study playlist and save it to my Desktop."
"Use Sonilo to write an epic orchestral cinematic track, about 60 seconds long."
"What Sonilo services and limits does my account have?"
"Show my Sonilo usage for the last 7 days."
"Play the track you just generated."
The assistant will call the matching tool (text_to_music, video_to_music, text_to_sfx, video_to_sfx, audio_ducking, get_sfx_task, get_account_services, get_usage, or play_audio) and save generated audio to your configured output directory.
Configuration
Authentication
The server takes its key from SONILO_API_KEY if that is set, and otherwise
from the credential written by sonilo login
(~/.config/sonilo/credentials.json, or $XDG_CONFIG_HOME/sonilo/). The
environment variable wins on purpose, so any config that already sets it keeps
resolving to the same account after an upgrade.
The credential is looked up by the server's own SONILO_API_URL, so a staging
server never picks up a production sign-in. This server only ever reads the
file: run sonilo login again to renew it (keys from a sign-in expire after 90
days) and sonilo logout to revoke it.
Environment Variables
Variable | Default | Description |
| (from | Bearer token. Required only if you have not signed in with the CLI. |
|
| Public API base URL. |
|
| Default output directory and base for relative input paths. Also the confinement boundary (see below). |
|
| Set to |
|
| Timeout, in seconds, for streaming music ( |
Some MCP hosts impose their own tool-call timeout and may cut a call off before that wait ends. The task keeps running and is still billed: its id is in the server's stderr log as [sonilo-mcp] task submitted: <id>, and get_sfx_task("<id>") retrieves the result — nothing is lost.
File access & confinement
By default, the file tools (video_to_music input, play_audio, and any
output_directory) are confined to SONILO_MCP_BASE_PATH. Paths that
resolve outside it (after symlink resolution) are rejected. This limits the
blast radius if a client is tricked into reading or exfiltrating arbitrary
files. To opt out — e.g. to read a video from elsewhere on disk — set
SONILO_MCP_ALLOW_ANY_PATH=true.
Tools
Tool | Description | Cost |
| Generate music from a text prompt. | ✅ |
| Generate music matched to a video. Max duration 360s (6 min); subject to the account's upload-size cap (typically 300 MB). | ✅ |
| Generate a sound effect from text. Duration 0.5–180s, optional — omit it for Sonilo's own default length; formats wav/mp3/aac/flac (default aac). | ✅ |
| Generate SFX for a video; saves the generated SFX audio. Max video duration 480s (8 min). | ✅ |
| Generate music for a video and return a new | ✅ |
| Generate SFX for a video and return a new | ✅ |
| Generate music and SFX for a video in one call and save the mixed audio track. One charge instead of two, with the two layers balanced by the backend. | ✅ |
| Like | ✅ |
| Dub a video into other languages and save one dubbed | ✅ |
| Transcribe a video and translate its script into the target languages, saving one editable | ✅ |
| Analyze a video and return a creative brief — a time-aligned | ✅ |
| Duck a music bed under a voice track. The voice input may be a video — the ducked mix is muxed back into a new | ✅ |
| Check an SFX, audio-ducking, video-to-video, video-to-sound, dubbing, proofread, video-analysis, or async video-to-music task and return its result — recovery for timed-out | ❌ |
| List available services, limits, and the free-trial allowance left per service. | ❌ |
| Show usage summary + per-day breakdown. | ❌ |
| Play a local audio file. | ❌ |
Tools marked ✅ make API calls that incur charges on your Sonilo account.
Every tool also carries MCP tool annotations, so clients can tell the two kinds apart without reading descriptions: get_account_services, get_usage and play_audio are read-only; every other tool writes files or incurs charges, and none of them is destructive (outputs never overwrite an existing file). The server's instructions tell an agent to check get_account_services before the first paid call and to recover a timed-out call with get_sfx_task.
Free trial: self-serve accounts start with a few free runs per service — no card required.
get_account_services()reports what is left astrial[service] = {granted, used, remaining}; check it before calling a ✅ tool so you can warn the user instead of failing on them. When a service'sremaininghits0, calls to it fail withtrial_exhausteduntil a payment method is added. Dubbing's single free run is a 15-second preview: the first single-language call without subtitles translates only the first 15 seconds of the video, free, and the result carriestrial_previewwith what the full video would cost;proofreadhas 2 free runs, and like dubbing it bills per language. Accounts without a free-trial allowance simply have notrialkey.
Optional: if
ffprobe(part of FFmpeg) is installed,video_to_musicchecks a video's duration locally and rejects anything over 360s before uploading.video_to_sfxperforms the same local check with its 480s cap.audio_duckingdoes the same for both of its inputs against its 360s cap. Without it, the same limits are still enforced by the backend.
Sound effects and ducking run as tasks
The music tools stream their result and finish in one call — with one exception: video_to_music(preserve_speech=true) submits a task and polls it internally instead, because keeping the source speech is only available in the backend's async mode. You still get the saved file paths back from a single call; you just don't see the task, and — like the SFX tools — it uses the same get_sfx_task recovery path if the call times out. The SFX tools submit a task, then poll it until it completes — text_to_sfx and video_to_sfx do this for you and return the saved file paths, so you normally never see the task. audio_ducking uses the same submit-then-poll flow and the same get_sfx_task recovery path.
If a call times out, the generation keeps running (and is already charged). The error message carries the task id, and get_sfx_task("<id>") retrieves the result once it's ready. The task id is also printed to stderr the moment a task is submitted, so it survives even a cancelled call. get_sfx_task is safe to call repeatedly: if the file is already on disk it reports that instead of downloading a second copy.
Output Format
Music is saved as .m4a (AAC in MP4 container). File names use the title returned by the backend (slugified), or a sonilo-<timestamp>.m4a fallback. When multiple parallel streams are returned, a -<index> suffix is appended.
video_to_music(preserve_speech=true) saves up to three kinds of file, each labeled in the returned text: the generated music audio (same naming as above, based on prompt or falling back to music-<first 8 chars of the task id>), the preserved speech stem as <base>-vocals.<ext>, and the mux — speech and music already mixed together, the ready-to-use combined result — as <base>-mux.<ext> (or <base>-mux-<index>.<ext> for multiple streams). The speech stem and mux extensions come from the backend's reported content_type (typically .m4a).
Sound effects are saved in the requested audio_format — wav, mp3, flac, or aac (the default, written as .m4a); video_to_sfx saves audio only, not the source video.
Combined sound (video_to_sound / video_to_video_sound) is saved as a single file: a .wav for video_to_sound, a .mp4 for video_to_video_sound. The name comes from music_prompt, falling back to sfx_prompt and then to sound-<first 8 chars of the task id> / v2v-sound-<first 8 chars of the task id>. The separate music and SFX stems stay on the backend — only the mixed result is downloaded.
Multiple variants (variants_num > 1 on text_to_music, video_to_music, video_to_video_music, video_to_sound, video_to_video_sound) save one file per variant instead of one, suffixed -0, -1, … in request order (e.g. <base>-0.m4a, <base>-1.m4a). For the music tools, each variant is its own creative direction and the returned text names it when the backend provides a title. Cost scales linearly with variants_num, and any value above 1 is billed in full even on a free-trial account. A timed-out multi-variant call recovers all of its variants through get_sfx_task, the same as a single-variant one.
Stems (stems=true on text_to_music / video_to_music) save four extra files per generated stream — <base>-stems-drums.<ext>, -stems-bass, -stems-vocals, -stems-other (with the variant index folded in as <base>-stems-<index>-<name>.<ext> when variants_num > 1) — alongside the untouched full track. Separation is free and best-effort: it typically adds 2–6 minutes (the call waits up to 40), and when it fails or is skipped the result carries a stems_error note instead of (or alongside a partial set of) stem files, while the music itself is unaffected and fully delivered.
Dubbing (dubbing) is saved as one .mp4 per requested language, named dubbing-<first 8 chars of the task id>.<language>.mp4 — there is no prompt to name the files after. With export_srt, each language's re-timed script lands beside its video as dubbing-<first 8 chars of the task id>.<language>.srt, reported with that language's export status and alignment loss (plus its issue codes and report link when the export was blocked). Every dubbed .mp4 is downloaded before the first .srt, and a script that was blocked or could not be downloaded is reported as a note, not a failure — a missing subtitle never costs you a video. Asking for four languages writes four files and costs four times as much as one. Dubbing polls for at least two hours regardless of TIME_OUT_SECONDS, matching the backend's own ceiling for the job.
Proofread (proofread) is saved as one .srt per language in the result, named proofread-<first 8 chars of the task id>.<language>.srt — there is no prompt to name the files after. The set always includes the detected source language on top of every requested target, so even a request with no languages writes one file. After the files, the returned text reports the detected source_language and the cue_count of the source script, then one note per non-blocking warning (e.g. a cue whose text runs too fast to read) — a warning never blocks a file, and a language whose .srt could not be downloaded is a note carrying the task id, not a failure. Edit the files, then pass them to dubbing as subtitles so the dub speaks the approved wording; dubbing's subtitle keys must match the languages being dubbed, so leave out the source-language file unless that language is itself a target.
File names come from the prompt (slugified, truncated to 80 characters). When there is no prompt to name a file after — video_to_sfx without one, or an SFX/ducking file recovered via get_sfx_task — the name is sfx-<first 8 chars of the task id> instead. A video_to_music(preserve_speech=true) task recovered via get_sfx_task is named music-<first 8 chars of the task id> instead (get_sfx_task detects the music envelope shape and saves audio/vocals/mux the same way as a direct video_to_music call). Existing files are never overwritten: a -1, -2, … suffix is added instead.
Ducking results are saved as a single file: a .wav, or a .mp4 when the voice input was a video (the ducked mix is muxed back into it). The file name is the voice input's name plus -ducked (e.g. interview.mp4 → interview-ducked.mp4), falling back to ducked-<first 8 chars of the task id> when there is no usable name. A ducking result recovered via get_sfx_task is named sfx-<first 8 chars of the task id> instead, since that tool has no voice file name to work from.
Common Errors
Message | What to do |
| Run |
| Verify the key at https://platform.sonilo.com/dashboard/api-keys. If you signed in with the CLI, the key may have expired (90 days) or been revoked — run |
| |
| That service's free trial is spent. Add a payment method at https://platform.sonilo.com/dashboard/billing — retrying can't help. |
| Calls are going out too fast. The counter runs on a fixed 60-second window and rejected calls count toward it too, so wait the window out instead of retrying inside it. |
| Every generation slot is busy. Waiting alone does not free one — a running generation has to finish first. |
| Raise |
| The generation is still running. Call |
| The task id doesn't exist, or belongs to a purely streaming generation ( |
Available Tools
16 toolsanalyze_videoAnalyze a video for music or sound-effect directionAInspect
Analyze a video and return a CREATIVE BRIEF derived from the footage itself. Generates NOTHING — no audio, no video, no file is written. mode picks which brief comes back: "both" (the default) returns a music-direction brief in segments/variations AND a sound-design brief in sfx_segments/sfx_prompt in one call; "music" returns only the scoring brief (a time-aligned section plan plus one ready-to-use generation prompt per variation); "sfx" returns only the sound-design brief. All three modes cost the same. Use it when the user does not know what music or sound effects the video should get, then feed a variation's prompt into video_to_music, video_to_sfx, video_to_sound or their video-to-video counterparts.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Subject to the account upload cap. video_url (str, optional): HTTP(S) URL to a video file. prompt (str, optional): Guidance for the analysis, e.g. 'focus on the chase'. At most 2000 characters. variants_num (int, optional): 1-5, default 1. How many independent briefs to author for the same video. Billed per brief. mode (str, optional): "both" (default), "music" or "sfx".
Exactly one of video_path and video_url must be provided. Maximum video duration is 480 seconds (8 minutes); billing has a 10-second floor, so a very short clip costs the same as a 10-second one.
Returns:
TextContent holding the brief as JSON: mode (echo of the request), segments (start, end, label, prompt) and variations (one prompt each); in both mode also sfx_segments (same shape as segments) and sfx_prompt (a single string, not one per variation). No file path is returned because no file is written. On timeout the error message includes the task_id — recover the brief with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| prompt | No | ||
| video_url | No | ||
| video_path | No | ||
| variants_num | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: an external Sonilo API call may incur charges, variants_num is billed per brief, there is a 10-second billing floor and an 8-minute duration cap, and the upload cap applies. Annotations already mark openWorldHint=true and idempotentHint=false, and the description is consistent with those while supplying the cost and limit details the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded — the mode semantics and usage trigger come before the parameter list, and the cost warning is visually flagged. It is somewhat long and repeats the 'no file is written' point in both the opening and the Returns section, which costs a little efficiency but not comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full call lifecycle for a 5-parameter, paid, open-world tool: input constraints, mutually exclusive parameters, duration and billing limits, the returned JSON field names per mode, and the timeout recovery path via get_sfx_task with the task_id. Even though an output schema exists, the description usefully flags that sfx_prompt is a single string rather than one per variation — a non-obvious asymmetry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and mode is an unconstrained anyOf string with no enum, so the description carries the full burden — and it does: it enumerates the mode values and their exact return fields, gives the 1-5 range and per-brief billing for variants_num, the 2000-character limit for prompt, the absolute/relative path resolution via SONILO_MCP_BASE_PATH for video_path, the HTTP(S) requirement for video_url, and the 'exactly one of' invariant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (analyze a video, return a creative brief) and immediately clarifies the negative scope: it generates no audio, video, or file. That negative framing is exactly what separates it from the video_to_* generation siblings, and the mode values make the three output shapes explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the trigger condition ('when the user does not know what music or sound effects the video should get') and the downstream action (feed a variation's prompt into video_to_music, video_to_sfx, video_to_sound, or the video-to-video counterparts). It also states the gating rule — only use when explicitly requested by the user — because of the cost warning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audio_duckingDuck music under voice audioAInspect
Duck a music bed under a voice track: Sonilo lowers the music wherever the voice is speaking and lifts it back in the gaps, then returns the mixed result. The voice input may be a video — its audio track is used as the voice, and the ducked mix is muxed back into a new video.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: voice_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Audio (.wav/.mp3/.m4a/.aac/.ogg/.flac) or video (.mp4/.mov/.avi/.wmv/.webm/.mkv). voice_url (str, optional): HTTPS URL to the voice audio/video. music_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Audio only. music_url (str, optional): HTTPS URL to the music audio. output_directory (str, optional): Where to save the result. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of voice_path/voice_url, and exactly one of music_path/music_url, must be provided. A local file and a URL may be mixed across the two inputs. Each input is capped at 360 seconds (6 minutes) and by the account's upload-size limit (typically 300 MB).
Returns: TextContent with the absolute path of the saved file: a .wav, or a .mp4 when the voice input was a video. If the call times out, the error message includes the task_id — recover the result later with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| music_url | No | ||
| voice_url | No | ||
| music_path | No | ||
| voice_path | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses cost implications, API call behavior, input duration and size caps, video handling and muxing, and timeout recovery via task_id. These are important behavioral traits for a non-read-only, open-world tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and a cost warning, then organized into Args, constraints, and Returns. The length is justified by the tool's complexity, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex media-processing tool with five parameters, the description covers inputs, formats, constraints, limits, return values, and failure recovery. Even though an output schema exists, the extra return and timeout details are helpful and complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description explains every parameter: voice_path/voice_url, music_path/music_url, output_directory, their allowed formats, path resolution, and the exactly-one-of constraints. It fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: ducking a music bed under a voice track, including how Sonilo lowers and lifts the music. It clearly distinguishes this from sibling tools like text_to_music or video_to_sfx by focusing on the ducking mix operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: only use when explicitly requested by the user due to API cost. It does not name explicit alternatives or when-not scenarios, but the cost constraint and input rules provide strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dubbingDub a video into other languagesAInspect
Dub a video into one or more other languages and save one dubbed video file per language. The speech is translated and re-voiced; the result is a new .mp4 per target language, not an audio track.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges, and you are billed PER LANGUAGE — asking for four languages costs four times as much as one. Free preview: a self-serve account's first call with ONE language and no subtitles is free — the video is trimmed to its first 15 seconds and translated at no charge, and the result carries trial_preview with what the full video would cost. Every call after that, and any call with several languages or subtitles, is billed. Only use when explicitly requested by the user.
This call polls until the backend finishes and waits AT LEAST TWO HOURS before giving up, regardless of any shorter configured timeout — two hours is the backend's own ceiling for the job. A call that sits for an hour or more is normal, not a hang; do not cancel it, since the task keeps running and charging on the backend either way and a cancelled call just loses the caller's easy path to the result.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Supports .mp4/.mov/.webm/.m4v/.gif (gif must be animated). Subject to the account's max upload size (typically 300 MB). Maximum video duration is 300 seconds (5 minutes). video_url (str, optional): HTTPS URL to a video file. Must be https specifically — the dubbing pipeline fetches the source itself and rejects plain http. languages (list, optional): Target language codes, e.g. ["es", "fr"]. Supported: en, zh_cn, ja, ko, pt, pt_br, es, es_419, de, fr, it, ru, th, ar, tr, vi, id, ta, ml, kn, gu, pa_in, sd_in, hi. pt_br is Brazilian Portuguese and es_419 Latin American Spanish; plain pt and es give unqualified Portuguese and Spanish, so pick the regional code when the region matters. ar is likewise unqualified Arabic, not a country dialect. pa_in and sd_in are Punjabi and Sindhi as spoken in India, the only variants available; hi is Hindi. Omit to get the default ["zh_cn", "es", "fr"]. ducking (bool, optional): Duck the background music/effects bed under the dubbed voice while it speaks. Off by default: the bed is always kept, at a constant level unless this is true. Free. lipsync (bool, optional): Whether the speaker's mouth is re-rendered to match the dubbed speech. On by default. Set false to leave the picture completely untouched instead — the video comes back at its original resolution and frame rate rather than re-rendered, and only the audio is replaced, so the mouths keep moving to the original language. Use it for footage with no on-camera speaker, or when preserving the exact original picture matters more than matching lip movement. The background bed is rebuilt either way, so ducking is unaffected. subtitles (dict, optional): One script per target language, e.g. {"es": "/path/es.srt", "fr": "https://example.com/fr.vtt"}. Each value is either a local .srt/.vtt path (absolute, or relative to SONILO_MCP_BASE_PATH) or an https URL. These are TARGET-language scripts carrying the lines to be spoken in that language — not a transcript of the source — and they replace the pipeline's own translation. The keys must match the languages being dubbed exactly; the backend rejects a missing or extra one. export_srt (bool, optional): After the dub, align each language's final audio against its script and also return a re-timed .srt keeping those lines verbatim. Requires subtitles. Off by default. output_directory (str, optional): Where to save the results. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: One TextContent per saved file, named dubbing-<first 8 chars of the task id>..mp4, plus dubbing-<first 8 chars of the task id>..srt when export_srt was used — each reported with that language's export status and alignment loss. A language whose export was blocked still gets its dubbed video and is reported as a note, not a failure. On timeout the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| ducking | No | ||
| lipsync | No | ||
| languages | No | ||
| subtitles | No | ||
| video_url | No | ||
| export_srt | No | ||
| video_path | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (not read-only, open-world, non-idempotent); the description goes far beyond with billing semantics, the two-hour backend ceiling, and the crucial "an hour-long wait is normal, not a hang — do not cancel" guidance plus the fact that the job keeps charging server-side even if abandoned. It stops just short of stating idempotency/retry behavior explicitly, so it isn't flawless, but the destructive-in-wallet sense is unusually well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the cost warning before anything else — correct priority given real billing risk. The Args and Returns blocks are dense but largely non-redundant; the Returns section is somewhat long given an output schema exists, and a few clauses (background bed rebuilt, ducking unaffected) repeat context. Justified in size overall, not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, zero-schema-coverage, expensive, long-polling call, essentially every decision an agent must make is covered: input format limits (300s duration, 300MB, https-only), default languages, billing, expected wait, cancellation policy, and timeout recovery via get_sfx_task. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the entire burden and does: language codes are enumerated with regional disambiguation (pt vs pt_br, es vs es_419, ar caveat), subtitles are clarified as TARGET-language scripts rather than source transcripts with a key-matching constraint, lipsync's false branch is spelled out in consequence terms, and the exactly-one-of constraint on video_path/video_url is stated. This is meaning the schema cannot provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Dub a video into one or more other languages") and immediately disambiguates the output form: "the result is a new .mp4 per target language, not an audio track" — which separates it from audio_ducking and the video_to_sound siblings. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit gating: "Only use when explicitly requested by the user," plus a concrete free-preview path (one language, no subtitles, 15-second trim) and a stated cost multiplier per language. It also gives a positive condition for the non-default branch ("Use it for footage with no on-camera speaker"). This is the when/when-not/alternative pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_servicesGet Sonilo account servicesARead-onlyIdempotentInspect
Get the authenticated account's available Sonilo services, rate limits, concurrency limit, discount factor, max video upload size, and — when the account has one — its free-trial allowance. Use this to discover what generation endpoints are available before calling them.
Returns: dict with available_services, rpm_limit, concurrency_limit, discount_factor, max_upload_size_mb, and an optional trial object keyed by service, each {granted, used, remaining}.
Check trial[service]['remaining'] before calling a paid generation tool: at 0 that call fails with 402 trial_exhausted, which no retry fixes — tell the user their free trial for that service is spent and that continuing needs a payment method. The trial key is absent for accounts that have no free-trial allowance; treat that as 'the account bills normally', not as an error. A trial object that IS present but has no entry for the service you're about to call means that service has no free-trial allowance at all — it bills from the first call. dubbing's allowance of 1 is a 15-second PREVIEW, not a full run: the first single-language call translates only the first 15 seconds of the video, free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial behavior: the exact failure mode (402 trial_exhausted, no retry fixes it), the meaning of a missing trial key vs. a missing per-service entry, and the dubbing allowance being a 15-second preview rather than a full run. This is context no structured field carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return shape, then errors and edge cases in descending priority, so an agent can stop reading early. Some sentences are long and the dubbing preview detail is narrow, but each carries actionable information rather than restating the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description fully documents the returned dict fields (available_services, rpm_limit, concurrency_limit, discount_factor, max_upload_size_mb, optional trial). It also covers the failure path an agent must handle, so nothing needed for correct invocation or interpretation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; the schema has nothing to document. The description instead spends its space on return-value semantics, which is a reasonable use given no input parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the authenticated account's available Sonilo services') and enumerates exactly what is returned (rate limits, concurrency limit, discount factor, upload size, trial allowance). An agent can distinguish this from generation siblings (text_to_music, dubbing, etc.) immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'to discover what generation endpoints are available before calling them' and gives a concrete precondition for paid calls ('Check trial[service]['remaining'] before calling a paid generation tool'). It does not explicitly differentiate from the sibling get_usage, leaving a small ambiguity about which account-introspection tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sfx_taskGet a Sonilo generation task and save its resultAInspect
Check a sound-effects, audio-ducking, video-to-video, dubbing, proofread, or async video-to-music generation task and, if finished, download its result file(s). Use this to recover a result when text_to_sfx, video_to_sfx, audio_ducking, video_to_video_music, video_to_video_sfx, video_to_sound, video_to_video_sound, dubbing, proofread, or video_to_music(preserve_speech=true) timed out — their error message contains the task_id. Does not poll: a single status check per call. This tool itself never charges.
Args: task_id (str): The task id returned in the timeout message. output_directory (str, optional): Where to save result files. Defaults to SONILO_MCP_BASE_PATH.
Returns: Still processing -> a status message; try again later. Succeeded -> the saved file path(s): audio for text_to_sfx and video_to_sfx tasks; a single .wav or .mp4 for audio_ducking tasks; a single .mp4 for video_to_video_music/video_to_video_sfx/video_to_video_sound tasks; a single .wav for video_to_sound tasks; one .mp4 per language for dubbing tasks; one .srt per language, plus the detected source language and cue count, for proofread tasks; for a video_to_music(preserve_speech=true) task, the audio stream(s) plus the preserved speech ('vocals') stem plus the mux (speech+music mixed — the ready-to-use combined result). If the original call used variants_num > 1 (video_to_music, video_to_video_music, video_to_sound, or video_to_video_sound), every variant is saved here too — one file per variant, suffixed -0, -1, .... Failed -> an error including whether the charge was refunded.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses non-obvious behavior: no polling, no charge for the check itself, per-status outcomes (processing/succeeded/failed), whether a failed task was refunded, and that variant files are saved with -0/-1 suffixes. These are exactly the operational facts an agent needs and none are recoverable from the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage are front-loaded, and the Args/Returns layout makes it scannable. The Returns block is long and enumerates per-task file types that an output schema already covers, so it is somewhat over-specified even though each item is task-specific rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 params, ten upstream producers, and a filesystem side effect, the description covers the trigger, the invocation semantics, the possible statuses, and the refund behavior on failure. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: task_id is defined as 'the task id returned in the timeout message' and output_directory as the destination defaulting to SONILO_MCP_BASE_PATH. That is meaning the bare string types in the schema do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Check') plus the exact resource set (six-plus named generation task types) and immediately follows with the retrieval role ('download its result file(s)'). It is unambiguously distinct from every sibling, which all create tasks rather than check them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the exact condition for use — recovering a result after one of the ten listed generation tools timed out — and tells the agent where to find the task_id (in the timeout error message). It also rules out an incorrect usage pattern with 'Does not poll: a single status check per call.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageGet Sonilo usageARead-onlyIdempotentInspect
Get the authenticated account's usage summary and per-day breakdown. Useful for cost reconciliation and tracking generation history.
Args: days (int, optional): Lookback window in days, 1–365. Defaults to 30.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely new behavioral facts beyond that: results are scoped to the authenticated account and the payload contains both a summary and a per-day breakdown. It does not mention pagination, rate limits, or how empty usage periods are represented, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences state purpose and use case, followed by a compact Args block that adds range information not present in the schema. Every element earns its place; nothing is restated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read-only tool, the description covers purpose, use case, account scoping, return shape (summary plus per-day breakdown), and the full semantics of the one argument. Without an output schema, more detail on the exact fields of the breakdown would help, but an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema gives only a bare integer with a default, so the description carries the full burden — and it does: the single parameter is optional, typed int, bounded 1–365, defaults to 30, and its meaning (lookback window) is spelled out. No ambiguity remains for the caller.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: fetching the authenticated account's usage summary with a per-day breakdown. This is unmistakable against all siblings, which are generation/processing tools, though no sibling is named explicitly. The scope ('authenticated account's') is a valuable qualifier that avoids ambiguity about whose usage is returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete contexts where the tool applies: cost reconciliation and tracking generation history. That is enough for an agent to recognize the trigger, but no exclusions or alternatives are stated, and there is no guidance on what to do if the lookback window needs to exceed 365 days.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_audioPlay a local audio fileARead-onlyIdempotentInspect
Play a local audio file through the system's default output device. Supports WAV, MP3, M4A, AAC, OGG, FLAC.
Args: input_file_path (str): Absolute path or relative to SONILO_MCP_BASE_PATH.
Returns: Success message including the played path.
| Name | Required | Description | Default |
|---|---|---|---|
| input_file_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| type | Yes | |
| _meta | No | |
| annotations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the description only needs to add beyond that — and it does: the output device used, the exact set of accepted container formats, and how relative paths resolve. It stops short of saying whether playback blocks until completion or returns immediately, which matters for sequencing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then compact Args/Returns sections. The Returns block is minor redundancy since an output schema exists, but it costs only one line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with annotations and an output schema, the essentials are covered: accepted formats, path resolution, and target device. The one meaningful hole is synchronous-vs-asynchronous playback behavior, which an agent needs to know before chaining a follow-up call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the load and delivers: input_file_path is an absolute path or relative to SONILO_MCP_BASE_PATH, a resolution rule absent from the schema. It doesn't mention extension requirements or what happens when the path is a directory or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: play a local audio file through the system's default output device, plus an enumerated list of supported formats. That resource (playback of an existing file) is unmistakably distinct from every sibling, which are all generation/analysis tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'play' — nothing states when to reach for this versus the generation siblings, nor any prerequisite such as the file needing to already exist. No exclusions or alternatives are named, though in this toolset the alternative set is far enough away that the risk is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proofreadTranscribe and translate a video into editable subtitlesAInspect
Transcribe a video and translate its script into the target dubbing languages, returning one editable .srt per language plus the source-language transcript, so the text can be read and corrected BEFORE anything is dubbed. Nothing is spoken and no video is produced — this is the step before the dubbing tool. Send the edited files back as subtitles on the dubbing tool so the dub speaks exactly the approved wording.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges, and you are billed PER LANGUAGE: video duration × the number of target languages at $0.001/sec, with a 10-second billing floor. A transcript-only request (no languages) counts as one language. Self-serve accounts get 2 free-trial runs on it. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Subject to the account's max upload size (typically 300 MB). video_url (str, optional): HTTPS URL to a video file. Must be https specifically — the backend fetches the source itself and rejects plain http. Either way: Maximum video duration is 300 seconds (5 minutes), and the video must have an audio track. languages (list, optional): Target language codes to translate the transcript into, e.g. ["ja", "zh_cn"]. These are the same codes the dubbing tool takes (see its languages argument for the list), so a proofread script can go straight into a dub. Omit it, or pass an empty list, for the source-language transcript alone. source_language (str, optional): Hint telling transcription which language to expect, one of the same codes — it helps on short, noisy or mixed-language audio. Omit it to have the language detected; either way the result reports the language the transcript is in. output_directory (str, optional): Where to save the results. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: One TextContent per saved file, named proofread-<first 8 chars of the task id>..srt — always including the detected source language as well as every requested target — then the detected source_language and cue_count, then one note per non-blocking warning (e.g. a cue whose text runs too fast to read). A warning never blocks the files. On timeout the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| languages | No | ||
| video_url | No | ||
| video_path | No | ||
| source_language | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only flag openWorldHint and non-read-only), the description discloses per-language billing math, a 10-second billing floor, free-trial limits, the 300s duration cap, the audio-track requirement, and that warnings never block file output. It also gives failure recovery (task_id in timeout errors, use get_sfx_task). This is unusually complete behavioral disclosure for a costly external API call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the critical cost warning are front-loaded, and the Args/Returns structure is scannable. It is long, and the cost paragraph could be tightened, but nearly every sentence carries operational information an agent needs before spending money.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param, zero-schema-coverage, paid external call, the description covers inputs, mutual exclusion, limits, cost, output file naming, and error recovery. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden — and it does: it explains each of the five params, including the https-only constraint on video_url, the 300 MB upload limit, that language codes match the dubbing tool's, the empty-list semantics for languages, and the source_language hint behavior. It also states the cross-parameter constraint (exactly one of video_path/video_url).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (transcribe a video, translate its script into target languages) and immediately delimits what it does NOT do ("Nothing is spoken and no video is produced"), which cleanly separates it from the `dubbing` sibling. An agent can distinguish it from every other sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use this as the step BEFORE the dubbing tool, then feed the edited .srt files back as `subtitles` on `dubbing`. It also states the gating condition ("Only use when explicitly requested by the user") and the transcript-only case (omit languages). This is the full when/when-not/alternative set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_to_musicGenerate musicAInspect
Generate music from a text prompt and save the resulting audio file(s) to a local directory. Generated tracks are fully licensed (music licensed via Shutterstock) and cleared for commercial use on social, brand content, and advertising.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: prompt (str): Description of the music to generate (1–1000 chars). duration (int, optional): Length in seconds (5–360). Omit it and Sonilo picks a length that suits the prompt. output_format (str, optional): 'm4a' (default), 'wav', or 'mp3' (320 kbps). Anything but 'm4a' requires the backend's async generation mode (submit + poll) instead of streaming — selected automatically, no user-facing mode param needed. variants_num (int, optional): 1-10, default 1. Generate this many distinct music variants in one request — each is its own creative direction with its own title, not just a re-roll. Cost scales linearly with N. Values above 1 require the backend's async generation mode (handled automatically, same as output_format='wav') and are never covered by the free trial — even a trial account is billed for variants beyond the first. stems (bool, optional): Default false. Pass stems=true to also get the track split into four separate instrument tracks — drums, bass, vocals and other — at no extra charge; it adds a few minutes to the wait (this tool then waits up to 75 minutes), so set it only when the user asks for stems or separated tracks. Uses the backend's async generation mode (handled automatically, same as output_format='wav'). If a stems result comes back with stems_error instead of (or alongside a partial) stems — surfaced here as a note in the returned text — only the separation failed or was skipped: the music itself generated fine, the saved audio files are valid, and the user was not charged for the separation — report it as a missing extra, not as a failed generation. output_directory (str, optional): Absolute path, or relative to SONILO_MCP_BASE_PATH. Defaults to SONILO_MCP_BASE_PATH (~/Desktop unless overridden).
Returns: One TextContent per generated audio stream, each containing the absolute path of the saved audio file (.m4a by default, .wav when output_format='wav'). At variants_num > 1, one entry per variant (suffixed -0, -1, ...), each labeled with its title when the backend provides one. stems=True: also one TextContent per saved stem file (drums/bass/vocals/other, per stream), or a note carrying stems_error when the free separation failed or was skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| stems | No | ||
| prompt | Yes | ||
| duration | No | ||
| variants_num | No | ||
| output_format | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: upfront cost warning, licensing/commercial-use status, async vs streaming mode switching, 75-minute stems wait, linear cost scaling with variants, trial-account billing exception, and how to interpret a stems_error as a missing extra rather than a failed generation. This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and organized into Args/Returns blocks with the cost warning early, which is the right priority order. It loses a point for repeating the 'requires backend async generation mode (handled automatically, same as output_format=wav)' clause three separate times, which bloats an otherwise tight spec.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full lifecycle: what is produced, where it lands, the default base path, per-variant/per-stem return shapes, and failure semantics for stems. Even with an output schema present, the description supplies decision-relevant behavior (billing, waits, licensing) that the schema cannot express.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: prompt length range, duration bounds with the omit-to-auto behavior, format enum with bitrate and mode implications, variants range and cost/scaling semantics, stems default and side effects. No parameter meaning is left to guesswork.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Generate music from a text prompt') and adds the differentiating outcome — saving audio files to a local directory. Among siblings like text_to_sfx, video_to_music and video_to_video_music, the text-prompt-to-music scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit guardrail ('Only use when explicitly requested by the user') and a conditional rule for stems ('set it only when the user asks for stems or separated tracks'). It doesn't name sibling alternatives for the video- or SFX-based cases, so routing between siblings is left mostly to the names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_to_sfxGenerate sound effectAInspect
Generate a sound effect from a text prompt and save the audio file to a local directory. Generation is asynchronous on the backend; this tool waits for completion (typically well under the timeout) and returns the saved file path.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: prompt (str): Description of the sound effect (1–2000 chars). duration (float, optional): Length in seconds (0.5–180). Omit it for Sonilo's own default length. audio_format (str, optional): One of wav, mp3, aac, flac. Defaults to aac (.m4a file). output_directory (str, optional): Absolute path, or relative to SONILO_MCP_BASE_PATH. Defaults to SONILO_MCP_BASE_PATH (~/Desktop unless overridden).
Returns: TextContent with the absolute path of the saved audio file. If the call times out, the error message includes the task_id — recover the result later with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | ||
| duration | No | ||
| audio_format | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: asynchronous backend execution, that the call blocks until completion, a cost warning about Sonilo API charges, disk-write behavior with default base path, and that timeout errors carry a task_id recoverable later. None of this is derivable from readOnlyHint/openWorldHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the cost warning are front-loaded, and the Args/Returns blocks are scannable. Slightly verbose given the Args section largely duplicates what a filled-in schema would carry, but with 0% schema coverage that duplication is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a cost-incurring, disk-writing async tool, the description covers invocation, side effects, timeout recovery, and return value. Nothing an agent needs before calling it is missing, and the returns note complements the output schema rather than replacing it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: prompt length bound (1–2000), duration range (0.5–180) and the meaning of omitting it, the allowed audio_format values with the aac→.m4a default quirk, and output_directory resolution against SONILO_MCP_BASE_PATH. This is materially more than the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Generate a sound effect from a text prompt") plus a side effect (saves the audio file to a local directory). This clearly distinguishes it from audio-producing siblings like text_to_music, video_to_sfx, and video_to_sound, whose input modality differs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gates usage with "Only use when explicitly requested by the user" and explains the timeout recovery path via get_sfx_task. It doesn't name the sibling alternatives (e.g. video_to_sfx for video input), so the agent must infer modality routing, but the when-to-use condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_to_musicGenerate music for a videoAInspect
Generate an original score for a video: Sonilo analyzes the video's pacing, motion, and emotion, aligns transitions and beat drops to its cut points, and matches the video's duration exactly. Provide either a local video file path or a publicly accessible video URL. Generated tracks are fully licensed (music licensed via Shutterstock) and cleared for commercial use on social, brand content, and advertising.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Supports .mp4/.mov/.avi/.wmv/.webm/.mkv. Subject to the account's max upload size (typically 300 MB). Maximum video duration is 360 seconds (6 minutes). video_url (str, optional): HTTPS URL to a video file. prompt (str, optional): Style hint for the generated music. preserve_speech (bool, optional): Keep the source speech from the video audible in the result. When set, in addition to the generated music you also get a 'vocals' speech stem and a ready-to-use 'mux' (speech+music, already mixed). Defaults to False. output_format (str, optional): 'm4a' (default), 'wav', or 'mp3' (320 kbps). ducking (bool, optional): Duck the generated music under the source voice at finalize time. Default-OFF server-side: leave unset to skip it, pass True to run it, which adds a ducked track alongside the unchanged clean audio. Free, best-effort. variants_num (int, optional): 1-10, default 1. Generate this many distinct music variants in one request — each is its own creative direction with its own title, not just a re-roll. Cost scales linearly with N. Values above 1 are never covered by the free trial — even a trial account is billed for variants beyond the first. prompt_influence (float, optional): 0-1, API default 0.5. Sets how strongly the generated music follows the prompt; omit it unless the user asks for stricter or looser prompt adherence. Free. stems (bool, optional): Default false. Pass stems=true to also get the generated music split into four separate instrument tracks — drums, bass, vocals and other — at no extra charge; it adds a few minutes to the wait (this tool then waits up to 75 minutes), so set it only when the user asks for stems or separated tracks. It splits the generated music, never the video's own audio. If a stems result comes back with stems_error instead of (or alongside a partial) stems — surfaced here as a note in the returned text — only the separation failed or was skipped: the music itself generated fine, the saved audio files are valid, and the user was not charged for the separation — report it as a missing extra, not as a failed generation. Any of preserve_speech/a non-m4a output_format/ducking/variants_num>1/stems makes this tool internally use the backend's async generation mode (submit + poll) instead of streaming — the call takes longer but the tool still waits for completion. Subject to the same 360-second video duration cap as the plain case. output_directory (str, optional): Where to save the resulting audio file(s). Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: Plain case (no async-triggering param set): one TextContent per generated audio stream, unchanged from before. preserve_speech=True: one TextContent per generated audio stream, plus one for the speech ('vocals') file, plus one per mux stream (speech+music mixed — this is the ready-to-use combined result). ducking=True: also one TextContent per ducked stream (music lowered under the source voice), when the backend rendered one. variants_num > 1: one audio TextContent per variant (suffixed -0, -1, ...), each labeled with its title when the backend provides one. stems=True: also one TextContent per saved stem file (drums/bass/vocals/other, per stream), or a note carrying stems_error when the free separation failed or was skipped. Each TextContent's label says which kind of file it is.
| Name | Required | Description | Default |
|---|---|---|---|
| stems | No | ||
| prompt | No | ||
| ducking | No | ||
| video_url | No | ||
| video_path | No | ||
| variants_num | No | ||
| output_format | No | ||
| preserve_speech | No | ||
| output_directory | No | ||
| prompt_influence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: discloses cost/billing behavior (variants above 1 never covered by free trial, cost scales linearly), internal async-mode switching conditions, a 360s duration cap and ~300 MB upload limit, and how to interpret a stems_error partial result. Annotations only give the generic openWorld/non-idempotent profile; the description supplies the operational and financial risk details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose then the cost warning, so the highest-stakes information is early. It is long and repeats the 360-second cap across two paragraphs, and the returns block is somewhat verbose, but almost every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-param, expensive, open-world generation tool with an output schema, this is thorough: it covers licensing, cost, duration/size limits, async latency (up to 75 min), error semantics, and result labeling. An agent has everything needed to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry all meaning — and it does, documenting every one of the 10 params: defaults, valid formats, ranges (variants_num 1-10, prompt_influence 0-1), file extensions, path resolution against SONILO_MCP_BASE_PATH, and non-obvious semantics (ducking is default-OFF server-side, stems splits generated music not source audio).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Generate an original score for a video') and immediately describes the mechanism (pacing, motion, emotion analysis, beat alignment, exact duration match). This clearly differentiates it from text_to_music and video_to_sfx siblings because the input medium (video) and output (score) are both explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit when-not: 'Only use when explicitly requested by the user' backed by a cost warning, which is exactly the gating condition an agent needs. It also clarifies the input requirement ('Exactly one of video_path and video_url'). It does not name sibling alternatives (e.g., use text_to_music when there is no video), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_to_sfxGenerate sound effects for a videoAInspect
Generate sound effects for a video: Sonilo analyzes the video and creates matching SFX. Returns the generated sound-effects audio file. Provide either a local video file path or a publicly accessible video URL. Generation is asynchronous on the backend; this tool waits for completion and returns the saved file paths.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Supports .mp4/.mov/.webm/.m4v/.gif (gif must be animated). Subject to the account's max upload size (typically 300 MB). Maximum video duration is 480 seconds (8 minutes). video_url (str, optional): HTTPS URL to a video file. prompt (str, optional): Overall description of the desired sound effects (max 2000 chars). segments (list, optional): Per-segment SFX descriptions, each {"start": float, "end": float, "prompt": str}. Backend rules: first start must be 0; segments must be contiguous (each end == next start); every end > start; every prompt non-empty (max 200 chars); last end must not exceed the video duration; max 30 segments. Invalid segments are rejected before any charge. audio_format (str, optional): One of wav, mp3, aac, flac. Defaults to aac (.m4a file). output_directory (str, optional): Where to save the resulting files. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: One TextContent: the saved audio file path. If the call times out, the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | ||
| segments | No | ||
| video_url | No | ||
| video_path | No | ||
| audio_format | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, openWorld=true, idempotent=false, destructive=false) by disclosing the external paid API, the 300 MB upload cap, the 8-minute duration cap, asynchronous backend with a blocking wait, and the timeout/task_id recovery path. It also notes invalid segments are rejected before any charge, which is exactly the cost-safety context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the cost warning before the argument detail, and every Args line earns its place given the empty schema. It is long, but the length is driven by real constraint content rather than repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, cost, input mode exclusivity, per-parameter constraints, output location, and failure recovery, which is everything needed for a paid, non-idempotent, open-world generation tool. The return value is also summarized even though an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all parameter meaning, and it does: it documents every one of the six params, including the full segment contiguity/ordering/non-empty rules, max 30 segments, accepted formats, defaults, and path resolution against SONILO_MCP_BASE_PATH.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Generate sound effects for a video") and names the backend (Sonilo) plus the analysis step, so the agent knows exactly what happens. However, the sibling list contains several near-duplicates (text_to_sfx, video_to_video_sfx, video_to_sound, video_to_video_sound) and the description never distinguishes this tool from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion with the cost warning ("Only use when explicitly requested by the user") and states the input-mode constraint ("Exactly one of video_path and video_url"). It also covers recovery routing to get_sfx_task on timeout, but it never tells the agent when to prefer this over video_to_video_sfx or video_to_sound.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_to_soundGenerate a full soundtrack for a video (audio output)AInspect
Generate music AND sound effects for a video in one call and return them mixed into a single audio track (no video). Use this instead of calling video_to_music and video_to_sfx separately — the two layers are balanced against each other by the backend, and it is one charge. Provide either a local video path or a public video URL. Generation is asynchronous; this tool waits for completion and returns the saved audio path. Music is fully licensed (via Shutterstock) and cleared for commercial use.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Supports .mp4/.mov/.webm/.m4v/.gif (gif must be animated). Subject to the account's max upload size (typically 300 MB). Maximum video duration is 480 seconds (8 minutes). video_url (str, optional): HTTPS URL to a video file. music_prompt (str, optional): Style hint for the music bed (max 2000 chars). sfx_prompt (str, optional): Description of the sound effects layered over the music (max 2000 chars). segments (list, optional): Per-segment SFX descriptions, each {"start": float, "end": float, "prompt": str}. Backend rules: first start must be 0; segments must be contiguous (each end == next start); every end > start; every prompt non-empty (max 200 chars); last end must not exceed the video duration; max 30 segments. Invalid segments are rejected before any charge. preserve_speech (bool, optional): Keep the speech from the source video in the result. Defaults to False. ducking (bool, optional): Bring the source video's own speech into the mix and dip the generated music under it. Defaults to False, and this endpoint has no keep_original_sound, so by default the result is the generated music and effects ALONE — the source's speech is not in it and there is no music_processed stem. Pass preserve_speech instead to bring in the isolated speech rather than the whole track. output_format (str, optional): Container for the combined track — 'wav' (default), 'm4a', or 'mp3' (320 kbps). Applies to the combined output only; the music and sfx stems keep their native formats. Not available on video_to_video_sound, which always returns an mp4. variants_num (int, optional): 1-10, default 1. Generate this many distinct combined-mix variants in one request. Cost scales linearly with N. Values above 1 are never covered by the free trial — even a trial account is billed for variants beyond the first. output_directory (str, optional): Where to save the result. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: TextContent with the saved .wav path. At variants_num > 1, one TextContent per variant, saved as -0.wav, -1.wav, ... On timeout the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| ducking | No | ||
| segments | No | ||
| video_url | No | ||
| sfx_prompt | No | ||
| video_path | No | ||
| music_prompt | No | ||
| variants_num | No | ||
| output_format | No | ||
| preserve_speech | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only convey readOnly=false and openWorld=true; the description supplies the operationally important facts an agent cannot infer: asynchronous with a blocking wait, per-call charge, validation happens before any charge, licensing/clearance, linear cost scaling with variants_num, variants >1 never trial-covered, and timeout recovery via get_sfx_task. It also discloses a default-state trap (ducking has no keep_original_sound, so the result excludes source speech by default).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the sibling-routing decision, then cost warning, then parameters. Nearly every clause carries unique information, but the density is high — the ducking/preserve_speech explanation and the output_format comparison to video_to_video_sound repeat context. Given 0% schema coverage this length is largely justified rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, asynchronous, billable, file-writing tool this covers everything an agent needs: input formats and limits, validation-before-charge, cost model including the trial carve-out, variant naming, and failure recovery. Output-schema existence notwithstanding, it still explains the variant file naming and the timeout error's task_id, which are behavioral rather than structural.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 10 parameters, so full burden is on the description — and it delivers for nearly every one: accepted formats and 300 MB / 480 s limits for video_path, max 2000 chars for both prompts, max 200 chars and six backend contiguity rules for segments, defaults and semantics for preserve_speech/ducking, allowed enum-ish values and stem caveat for output_format, range and billing behavior for variants_num, and the default base path for output_directory. It also adds the cross-parameter constraint the schema omits ("Exactly one of video_path and video_url").
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Generate music AND sound effects for a video") plus the output shape ("mixed into a single audio track (no video)"), which immediately distinguishes it from video_to_music/video_to_sfx (separate layers) and video_to_video_sound (returns mp4). The parenthetical "(no video)" resolves the one ambiguity an agent would have against its sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: "Use this instead of calling video_to_music and video_to_sfx separately" with the reasons (backend balance, single charge). It also states the gating condition "Only use when explicitly requested by the user" and gives a redirect for a related need ("Pass preserve_speech instead to bring in the isolated speech"), so both when-to-use and when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_to_video_musicGenerate a music-scored video (video output)AInspect
Generate an original score for a video and return a NEW VIDEO with the music muxed in (not just an audio file). Provide either a local video path or a public video URL. Generation is asynchronous; this tool waits for completion and returns the saved video path. Tracks are fully licensed (via Shutterstock) and cleared for commercial use.
By default the returned video's audio is the generated music ALONE — the source video's own audio is removed. Pass keep_original_sound=True to keep the whole source track with the music statically mixed under it, adding ducking=True to dip the music under the voice instead; or preserve_speech=True to keep only the isolated speech. The source picture is copied without re-encoding, so the input must carry H.264, H.265/HEVC, VP9 or AV1 video in an mp4, mov, m4v or webm container — animated gif and VP8 webm are rejected.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Subject to the account upload cap. Maximum video duration is 360 seconds (6 minutes). video_url (str, optional): HTTPS URL to a video file. prompt (str, optional): Style hint for the generated music. segments (list[dict], optional): How the music should develop over time, as [{"start": float, "prompt": str, "label": str}, ...]. The first start must be 0, starts must be at least 5 seconds apart, and label is one of intro/verse/pre-chorus/chorus/bridge/break/silence/outro/none. Supplying these skips the plan the backend would otherwise derive from prompt. keep_original_sound (bool, optional): Keep the source video's whole original audio track in the result, with the generated music combined under it. Defaults to False, so by default the returned video's audio is the generated music alone. Supersedes preserve_speech. ducking (bool, optional): How the voice and the generated music are COMBINED — not whether a voice is kept. Default False, matching the backend: a static voice-forward mix at a fixed offset. Pass True for the dynamic duck, where the music dips only while the voice is present. Has no effect when there is no voice source, i.e. neither keep_original_sound nor preserve_speech is set. Free and best-effort: silently falls back to generated-audio-only if the source has no usable audio track, voice isolation fails, or the mix fails. preserve_speech (bool, optional): Keep only the source's ISOLATED speech (not the whole track) in the output. Defaults to False. Superseded by keep_original_sound. variants_num (int, optional): 1-10, default 1. Generate this many distinct video variants in one request, each scored with its own creative direction. Cost scales linearly with N. Values above 1 are never covered by the free trial — even a trial account is billed for variants beyond the first. prompt_influence (float, optional): 0-1, API default 0.5. Sets how strongly the generated music follows the prompt; omit it unless the user asks for stricter or looser prompt adherence. Free. output_directory (str, optional): Where to save the result. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: TextContent with the saved .mp4 path. At variants_num > 1, one TextContent per variant, saved as -0.mp4, -1.mp4, ... On timeout the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | ||
| ducking | No | ||
| segments | No | ||
| video_url | No | ||
| video_path | No | ||
| variants_num | No | ||
| preserve_speech | No | ||
| output_directory | No | ||
| prompt_influence | No | ||
| keep_original_sound | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/open-world profile; the description adds the substantive behavior: asynchronous execution that blocks until done, no re-encoding of the source picture with an accepted codec/container list, the default of discarding source audio, ducking's silent best-effort fallback, and that variants above 1 are billed even on trial. This is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the distinguishing output type and the cost gate, then a well-structured Args block. It is long, and the 'music ALONE' default is stated twice (prose and keep_original_sound), but the length is largely justified by ten undocumented-in-schema parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paid, async, ten-parameter mutation tool with an output schema, nothing material is missing: input constraints, format rejection rules, mode interactions, cost behavior, and return shape (including variant naming and timeout recovery) are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: it documents all ten parameters including segment structure rules (first start 0, ≥5s apart, label enum values), ducking's precise meaning and no-op conditions, supersede relationships between keep_original_sound/preserve_speech, variant cost scaling, and prompt_influence's 'leave it alone' default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate an original score for a video and return a NEW VIDEO with the music muxed in') and explicitly distinguishes itself from the audio-only sibling by parenthesizing 'not just an audio file'. An agent can pick it apart from video_to_music / video_to_video_sound without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('Only use when explicitly requested by the user' due to cost), the exact-one-of constraint on video_path vs video_url, and a decision path for the audio modes (default alone, keep_original_sound, +ducking, or preserve_speech). It also names the recovery route via get_sfx_task on timeout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_to_video_sfxGenerate a sound-effects video (video output)AInspect
Generate sound effects for a video and return a NEW VIDEO with the SFX muxed in (not just an audio file). Provide either a local video path or a public video URL. Generation is asynchronous; this tool waits for completion and returns the saved video path.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Supports .mp4/.mov/.webm/.m4v/.gif (gif must be animated). Subject to the account's max upload size (typically 300 MB). Maximum video duration is 480 seconds (8 minutes). video_url (str, optional): HTTPS URL to a video file. prompt (str, optional): Overall description of the desired sound effects (max 2000 chars). segments (list, optional): Per-segment SFX descriptions, each {"start": float, "end": float, "prompt": str}. Backend rules: first start must be 0; segments must be contiguous (each end == next start); every end > start; every prompt non-empty (max 200 chars); last end must not exceed the video duration; max 30 segments. Invalid segments are rejected before any charge. output_directory (str, optional): Where to save the result. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: TextContent with the saved .mp4 path. On timeout the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | ||
| segments | No | ||
| video_url | No | ||
| video_path | No | ||
| output_directory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a non-idempotent, open-world write, but the description adds substantial behavior beyond them: third-party Sonilo API charges, asynchronous execution that blocks until completion, pre-charge validation of segments, upload/duration caps (300 MB, 480 s), and a recovery path via get_sfx_task using the task_id in timeout errors. This is exactly the cost, latency, and failure-recovery context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key differentiator and the cost warning before any parameter detail, then uses Args/Returns structure that is easy to scan. The Args block is dense and long, but nearly every line is load-bearing constraint information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a costly, slow, open-world generation tool with zero schema description coverage, the description covers cost gating, async semantics, input formats and limits, segment validation, output location, and timeout recovery. An output schema exists, yet the Returns section still adds the timeout/task_id behavior an agent needs to recover, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: each of the five parameters is documented with format constraints (.mp4/.mov/.webm/.m4v, animated gif), size/duration limits, the nested segment object shape {start, end, prompt}, and all six backend segment validation rules. This meaningfully exceeds what the bare anyOf schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and output artifact: generate SFX and return a NEW VIDEO with the SFX muxed in. The parenthetical "not just an audio file" explicitly separates it from the audio-returning siblings (video_to_sfx, video_to_sound, video_to_video_sound) without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage gate ("Only use when explicitly requested by the user" due to cost) and the input-exclusivity rule ("Exactly one of video_path and video_url must be provided"). It implies but never names the alternative tools, so an agent weighing video_to_video_sfx against video_to_sfx must infer the split from the output-format hint alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
video_to_video_soundGenerate a fully-scored video (video output)AInspect
Generate music AND sound effects for a video in one call and return a NEW VIDEO with the mixed soundtrack muxed in (not just an audio file). Use this instead of chaining video_to_video_music and video_to_video_sfx — the two layers are balanced against each other by the backend, and it is one charge. Provide either a local video path or a public video URL. Generation is asynchronous; this tool waits for completion and returns the saved video path. Music is fully licensed (via Shutterstock) and cleared for commercial use.
⚠️ COST WARNING: This tool makes an API call to Sonilo which may incur charges. Only use when explicitly requested by the user.
Args: video_path (str, optional): Absolute local path, or relative to SONILO_MCP_BASE_PATH. Supports .mp4/.mov/.webm/.m4v/.gif (gif must be animated). Subject to the account's max upload size (typically 300 MB). Maximum video duration is 480 seconds (8 minutes). video_url (str, optional): HTTPS URL to a video file. music_prompt (str, optional): Style hint for the music bed (max 2000 chars). sfx_prompt (str, optional): Description of the sound effects layered over the music (max 2000 chars). segments (list, optional): Per-segment SFX descriptions, each {"start": float, "end": float, "prompt": str}. Backend rules: first start must be 0; segments must be contiguous (each end == next start); every end > start; every prompt non-empty (max 200 chars); last end must not exceed the video duration; max 30 segments. Invalid segments are rejected before any charge. keep_original_sound (bool, optional): Keep the source video's whole original audio track in the result, with the generated music and effects combined under it. Defaults to False, so by default the returned video's audio is the generated music and effects ALONE and the source's own audio is removed — and the result carries no music_processed stem, since with no voice source there is no processed track. Supersedes preserve_speech. preserve_speech (bool, optional): Keep only the source's ISOLATED speech (not the whole track) in the result. Defaults to False. Superseded by keep_original_sound. ducking (bool, optional): How the voice and the generated bed are COMBINED — not whether a voice is kept. Defaults to False: a static voice-forward mix at a fixed offset. Pass True for the dynamic duck, where the bed dips only while the voice is present. Has no effect when there is no voice source, i.e. neither keep_original_sound nor preserve_speech is set. variants_num (int, optional): 1-10, default 1. Generate this many distinct combined-mix variants in one request. Cost scales linearly with N. Values above 1 are never covered by the free trial — even a trial account is billed for variants beyond the first. output_directory (str, optional): Where to save the result. Defaults to SONILO_MCP_BASE_PATH.
Exactly one of video_path and video_url must be provided.
Returns: TextContent with the saved .mp4 path. At variants_num > 1, one TextContent per variant, saved as -0.mp4, -1.mp4, ... On timeout the error message includes the task_id — recover with get_sfx_task.
| Name | Required | Description | Default |
|---|---|---|---|
| ducking | No | ||
| segments | No | ||
| video_url | No | ||
| sfx_prompt | No | ||
| video_path | No | ||
| music_prompt | No | ||
| variants_num | No | ||
| preserve_speech | No | ||
| output_directory | No | ||
| keep_original_sound | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic safety profile (not read-only, open-world, non-idempotent); the description adds the substantive behavior: asynchronous generation with blocking wait, per-call and linearly scaling charges, trial exclusions for variants, licensed/cleared music, default removal of source audio, the keep_original_sound/preserve_speech interaction, and timeout recovery via get_sfx_task.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long but front-loaded: purpose and sibling differentiation first, then a clearly flagged cost warning, then per-argument details, then returns. Each sentence carries actionable information (rules, defaults, interactions, recovery path) rather than restating the name or schema titles.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, costly, asynchronous generation tool, nothing an agent needs is missing: input source rules, format/size/duration limits, segment constraints, variant output naming, timeout/task_id recovery, and billing caveats are all covered. Return values are additionally described despite an output schema existing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: it documents defaults, formats and limits for video_path, backend validation rules for segments (contiguity, max 30, 200-char prompts), variants_num cost implications, output_directory default, and the precedence and no-voice no-op semantics of keep_original_sound, preserve_speech, and ducking.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('Generate music AND sound effects for a video') and states the distinctive output ('return a NEW VIDEO with the mixed soundtrack muxed in (not just an audio file)'). It explicitly contrasts itself with the siblings video_to_video_music and video_to_video_sfx, so an agent can route correctly without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit preference rule ('Use this instead of chaining video_to_video_music and video_to_video_sfx') with the reasons (backend balancing, single charge) and a hard gating condition ('Only use when explicitly requested by the user' due to cost). It also states the input exclusivity rule ('Exactly one of video_path and video_url must be provided').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.28.0- Added
analyze_video - Added
dubbing - Added
proofread - Changed
text_to_music7 fields changed- added
Input schema / properties / duration / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / duration / defaultAdded value: +null - removed
Input schema / properties / duration / typeRemoved value: -"integer" - added
Input schema / properties / output_formatAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Output Format" +} - added
Input schema / properties / stemsAdded value: +{ + "default": false, + "title": "Stems", + "type": "boolean" +} - added
Input schema / properties / variants_numAdded value: +{ + "default": 1, + "title": "Variants Num", + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "prompt", - "duration" -]New value: +[ + "prompt" +]
- Changed
text_to_sfx4 fields changed- added
Input schema / properties / duration / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - added
Input schema / properties / duration / defaultAdded value: +null - removed
Input schema / properties / duration / typeRemoved value: -"integer" - changed
Input schema / requiredPrevious value: -[ - "prompt", - "duration" -]New value: +[ + "prompt" +]
- Changed
video_to_music6 fields changed- added
Input schema / properties / duckingAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Ducking" +} - added
Input schema / properties / output_formatAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Output Format" +} - added
Input schema / properties / preserve_speechAdded value: +{ + "default": false, + "title": "Preserve Speech", + "type": "boolean" +} - added
Input schema / properties / prompt_influenceAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Prompt Influence" +} - added
Input schema / properties / stemsAdded value: +{ + "default": false, + "title": "Stems", + "type": "boolean" +} - added
Input schema / properties / variants_numAdded value: +{ + "default": 1, + "title": "Variants Num", + "type": "integer" +}
- Added
video_to_sound - Added
video_to_video_music - Added
video_to_video_sfx - Added
video_to_video_sound
9 tool updates
v0.4.0- First observed
audio_ducking - First observed
get_account_services - First observed
get_sfx_task - First observed
get_usage - First observed
play_audio - First observed
text_to_music - First observed
text_to_sfx - First observed
video_to_music - First observed
video_to_sfx
TDQS
Scored across 16 tools
The set includes parallel variants such as video_to_music vs video_to_video_music, video_to_sfx vs video_to_video_sfx, and especially video_to_sound vs video_to_video_sound, which differ only by output type and are easy to misselect. The descriptions do clarify the audio-vs-video distinction and when to use the combined tools, but the boundaries are not immediately obvious from names alone.
Almost all tools use snake_case with an action-oriented pattern, and the video_to_* versus video_to_video_* convention is mostly systematic. Minor deviations such as dubbing and proofread, which are not verb_noun names, prevent a perfect score.
At 16 tools this is slightly above the ideal range, but each tool maps to a distinct generation mode or administrative function. The six video-music/SFX variants are numerous but justified by different outputs and cost-saving combined operations.
The surface covers text and video music/SFX generation, combined music+SFX, dubbing, proofreading, creative analysis, account/usage inspection, task recovery, and audio playback. Minor gaps remain, such as listing or cancelling in-flight tasks and no equivalent video playback or task-management browser.
Maintenance
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
MCP server for Producer/Riffusion AI music generation
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server exposing the AceDataCloud Fish Audio API (text-to-speech with voice conditioning)
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables controlling Spotify playback through natural language commands in MCP clients like Cursor or Claude for Desktop.1-
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI assistants like Claude Desktop to interact with Spotify's music streaming service, supporting playback control, playlist management, music search, and user profile access.412MIT
- AlicenseAqualityAmaintenanceMCP server for the Spotify Web API — gives Claude and other AI assistants tools to search music, control playback, manage playlists, library, and podcasts.475MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives Claude access to your SoundCloud library, allowing you to manage playlists and tracks through natural language.3AGPL 3.0