Doseedo Film Score: spot a video, play your score on AI instruments, mix it to picture
Server Details
Score video as an agent: cue sheet from the cut, 50+ AI instruments play your MIDI, mixed to picture
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 20 tools
Each tool maps to a distinct pipeline stage (spot video, tempo map, render_midi, render_score, mix, session_from_stems, score_to_picture), and the descriptions draw sharp boundaries between the rendering tools (notes on one instrument vs. a whole arrangement) and the sound-effect tool. The confusable clusters are the job-tracking trio (check_task / wait_task / list_jobs) and the near-homophone check_task vs check_take, though the descriptions do resolve both.
All names use a single snake_case convention under a consistent doseedo_ prefix, and most are verb_noun (render_midi, spot_video, train_instrument, get_upload_url). A handful are noun-only (account, instruments, recipes, tempo_map), and check_task/check_take are uncomfortably close, but the pattern stays predictable.
20 tools is on the heavy side, but the domain is a genuinely multi-stage pipeline plus a meta layer (account, quote, list_jobs, check_task, wait_task, cancel_job, recipes, instruments) and each stage earns its slot. It is slightly over-lean rather than bloated.
The core film-scoring chain (spot → tempo_map → analyze_midi → render_score → check_take → mix → session_from_stems → score_to_picture) is fully covered with read-only catalogs and job control. But many tools referenced inside the descriptions are absent from this set — separate_stems, transcribe, cover_song, generate_music, add_audio_to_session, edit_session/set_midi_notes, place_local_files — so following the documented recipes hits dead ends.
Available Tools
20 toolsdoseedo_accountAccount and creditsARead-onlyIdempotentInspect
Check the connected doseedo account: plan tier, the monthly credit pool (generation AND DAW conversions draw it), purchased extra-usage credits, and storage. Read-only — consumes nothing. Use it before starting expensive work to confirm there is budget.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds useful behavioral context: the call consumes no credits and the monthly pool is shared by generation and DAW conversions. That budget-consumption detail is valuable beyond the annotations, though return formatting and auth requirements are not described.
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 tight sentences, with purpose and returned information front-loaded. The read-only/no-consumption caveat and usage recommendation each earn their place.
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-parameter tool with full annotation coverage and no output schema, the description is complete enough to call correctly. It states what the tool reports, that it is read-only, that it consumes nothing, and when to use 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?
There are zero parameters, so the baseline is 4. The description appropriately uses the space to explain account fields and credit semantics rather than parameter behavior.
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 names a specific verb and resource: checking the connected doseedo account. It enumerates the concrete data returned: plan tier, monthly credit pool, extra-usage credits, and storage. It also distinguishes this diagnostic tool from the many action-oriented sibling 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?
It explicitly says to use the tool before starting expensive work to confirm budget, which gives clear usage context. It does not name an alternative or a when-not-to-use condition, but the guidance is sufficient for a zero-parameter read-only account check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_analyze_midiAnalyze MIDI harmonyAInspect
Check the HARMONY of notes before rendering or placing them: factor a MIDI progression into its sonorities (mode "midi", default — chord-detection-free: each segment of simultaneously sounding pitches reduced to an anchor pitch class + register-exact shape, covered with recurring shape cells) or into chord symbols (mode "chord": one estimated chord per ~2 beats + a corpus-grammar cell cover with a schedule). Input: notes[] (the rows you would give doseedo_render_midi / set_midi_notes) with bpm, or midi_url (a .mid ≤2 MiB: a doseedo result link such as a stem's MIDI, or a public URL). Synchronous (~2–10 s), CPU, no credits. Returns sonorities[] or chords[], cover, cells, compression — read chords[].chord / sonorities[].anchor to confirm the key and progression you intended. Cancel: not applicable — the result is returned in the submit response; the job is already finished.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Tempo of the notes (needed with notes; default 120). | |
| mode | No | "midi" (default): sonority / shape factoring. "chord": chord symbols per segment + cell cover. | |
| notes | No | The notes to analyze, in beats from bar 1 (same rows as doseedo_render_midi). Needs bpm. | |
| midi_url | No | Alternative to notes: https URL of a Standard MIDI File (≤2 MiB). | |
| min_seg_beats | No | mode midi: shortest sonority segment in beats (default 0.25). | |
| time_signature | No | Meter of the notes, e.g. "4/4" (default). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| beats_per_segment | No | mode chord: segment length in beats (0.25–8, default 2). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides rich behavioral context beyond the annotations, detailing the synchronous nature of the operation, the time and CPU cost, and the lifecycle management of the job, including confirmation instructions and cancellation policy.
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 quite dense and long, sacrificing brevity for extremely high information density. However, the information is logically structured, though its overall length makes it less concise than ideal.
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?
Despite lacking a formal output schema, the description is highly complete. It explicitly details the expected data fields to check in the results (e.g., 'chords[].chord / sonorities[].anchor') and clearly outlines the job completion flow.
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?
While the schema is 100% covered, the description adds critical domain expertise that the schema lacks. It clarifies the specific functional difference between the 'midi' mode (being chord-detection-free) and the 'chord' mode (output density), as well as how to correctly utilize the optional 'idempotency_key'.
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 immediately identifies the tool's purpose: analyzing MIDI harmony. It clearly distinguishes its capabilities across two operational modes: 'midi' (chord-detection-free sonorities) and 'chord' (chord symbols).
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?
The tool specifies how it must be invoked by accepting either a detailed 'notes[]' array (or a 'midi_url'). It provides critical operational constraints regarding timing ('Synchronous (~2–10 s)') and resource allocation ('CPU, no credits').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_cancel_jobCancel a jobADestructiveIdempotentInspect
Cancel a queued or running job. What that stops and refunds depends on the kind — generate_music / render_midi / cover_song: a render not yet on the GPU is stopped and its credits refunded; one already rendering finishes (credits spent), the job ends as canceled, output discarded. audio_to_session: cooperative — stops at the next stage boundary and refunds the build's sound-tool unit (a separation already run stays charged). bounce_session: a bounce still queued never renders (budget refunded); one mid-render has its result dropped. separate_stems / transcribe / convert_project: no plane-side stop — the work completes (credits spent), the job ends as canceled and its output is discarded. The synchronous analyses are already finished (409 already_terminal).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id from a submit tool or doseedo_list_jobs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (destructiveHint=true, idempotentHint=true) by disclosing exactly what is destroyed, what is refunded, and which kinds cannot be stopped plane-side. The refund semantics — credits spent vs. refunded, separation charges retained — are the kind of consequence detail annotations cannot 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 core action, then a structured kind-by-kind breakdown with consistent labels and semicolons. It is long, but nearly every clause carries distinct behavioral information; the density is justified even if a summary line would aid scanning.
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 one-parameter mutation tool with no output schema, the description covers eligibility, side effects, refund behavior, and terminal-state errors. Nothing an agent needs to call it correctly or predict consequences 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 100% for the single job_id parameter, so the baseline is adequate. The description adds no format or sourcing detail beyond the schema's own note, though the per-kind taxonomy implicitly tells the agent which submit tools produce cancellable job_ids.
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 ("Cancel a queued or running job") and immediately scopes which job states are eligible. It goes further by enumerating job kinds, which lets an agent distinguish this from submission siblings like doseedo_generate_music or doseedo_bounce_session 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?
Makes clear the tool applies to queued or running jobs and explains per-kind outcomes, plus notes that finished synchronous analyses return 409 already_terminal — effectively telling the agent when not to call it. It stops short of naming alternatives explicitly (e.g., doseedo_list_jobs to obtain job_id), though the schema description covers that pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_check_takeCheck a take against its notesAInspect
MEASURE a take instead of guessing: give the audio (a render_midi take URL, any recording) and the notes it should play — notes[] + bpm (and tempo_map) or a midi_url — and get back how many written notes were heard at the right pitch and time (recall / precision / f1, octave errors, the first missed notes with their beats), the timing error in ms, loudness (integrated LUFS, peak dBFS, clipped share), any stretch where a note was written but nothing sounds, and a verdict (good / check / bad) with reasons in plain words. doseedo_render_midi results already carry this per take (takes[].check) when the part was given as notes. Method: an independent note transcriber (basic-pitch) — dense chords and very fast runs read less reliably; use it as a screen, and listen to anything marked check. Synchronous (~3–15 s), CPU, no credits. Cancel: not applicable — the result is returned in the submit response; the job is already finished.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Tempo of the notes (or tempo_map). | |
| notes | No | The notes the take should play, in beats from bar 1 (the rows you sent doseedo_render_midi). | |
| midi_url | No | Alternative to notes: the part as a Standard MIDI File (≤ 2 MiB). | |
| audio_key | No | R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Alternative to audio_url. | |
| audio_url | No | The take: a doseedo result URL as returned, or any public https URL. | |
| tempo_map | No | Tempo changes [{beat, bpm}]. | |
| instrument | No | The instrument (a drum/percussion name switches to onset-only matching). | |
| time_signature | No | Meter (default 4/4). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| onset_tolerance_ms | No | How far a heard onset may be from the written one and still count (default 50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: synchronous ~3–15 s, CPU-bound, no credits, cancel not applicable because the response is the result, and the underlying method (basic-pitch) with its failure modes (dense chords, fast runs). Annotations already cover the read/write and open-world profile, so this is above bar, though it could state auth or size constraints more explicitly.
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 imperative and the payoff, with latency, cost, and method caveats deferred to the end. It is dense and long for a single paragraph, but nearly every clause carries information an agent needs.
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?
With no output schema, the description fully compensates by describing the return payload (metrics, first missed notes with beats, timing error, loudness, verdict with reasons). Input alternatives, runtime, cost, and accuracy limits are all covered, leaving no material gap for correct invocation.
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 100%, so baseline is 3; the description earns extra by clarifying the input modes — notes[]+bpm/tempo_map versus midi_url — and that instrument names switch to onset-only matching. Defaults like onset_tolerance_ms and time_signature remain schema-only, which is fine given full coverage.
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?
Opens with a specific verb and resource ('MEASURE a take') and immediately enumerates what it returns (recall/precision/f1, octave errors, timing error, LUFS, verdict). The input requirements are stated inline, so an agent can tell this apart from siblings like doseedo_transcribe or doseedo_analyze_midi 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?
Explicitly says when to use it and offers an alternative: doseedo_render_midi results already carry takes[].check, so checking a rendered part is redundant. It also gives the working caveat — 'use it as a screen, and listen to anything marked check' — which tells the agent how to act on the output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_check_taskCheck a jobARead-onlyIdempotentInspect
Check an async doseedo task once. Returns current status, and the result (file URLs / notes) when finished. A big result comes back as a brief (each row cut to its deciding fields): parts: ["" or index, …] returns those rows of the job record IN FULL — a render_score part's every receipt, a mix part's strip, rides (every point) and loudness.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which job kind created the task — the registry name the submit reply carried (generate_music, generate_sound, cover_stem, fill_gap, render_midi, train_instrument, render_score, mix, session_from_stems, spot_video, score_to_picture, cover_song, separate_stems, transcribe, audio_to_session, convert_project, bounce_session, analyze_song, detect_chords, beat_grid, check_take, analyze_midi); the short codes (generate, sound, coverstem, fillgap, render, train, score, stemsess, spot, picture, cover, separate, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases. | |
| parts | No | Optional, on a finished job: the parts to return in full, by name (as the result names them) or index — e.g. ["Oboes", "Timpani"]. | |
| job_id | No | Alternatively the job_id (job_…) from a submit tool or the jobs API — replaces task_id + kind. | |
| task_id | No | The task_id returned by a submit tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive behavior, so the description's added value is the single-shot polling model and the fact that large results are truncated to deciding fields unless parts is given. That truncation detail is genuinely useful context an agent cannot get from the annotations. It stops short of describing status values or behavior on unknown/expired jobs.
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 key facts (single check, status and result, brief default) are front-loaded and there is little waste. The final parts sentence is a dense run-on with awkward punctuation, which slightly hurts readability.
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?
With no output schema, the description carries the return-value burden and does reasonably well: status, file URLs / notes, and the truncation/expansion model are all covered. Missing are error or still-pending cases, which an agent polling a job would want.
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 100%, so the baseline is 3, but the description goes beyond the schema by explaining the default 'brief' result shape and exactly what 'in full' means for different part types (a render_score part's every receipt, a mix part's strip, rides and loudness). That is real added meaning for choosing the parts parameter.
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 ('Check an async doseedo task once') and describes the outcome (status plus result when finished), which is far more than the title. It distinguishes itself only implicitly from doseedo_wait_task via the word 'once'; the sibling is never named.
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?
The word 'once' implies a poll-again-later pattern versus blocking, but the description never says when to use this instead of doseedo_wait_task or doseedo_list_jobs, nor what to do if the job is still running. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_generate_soundGenerate sound effects (SFX & foley)AInspect
SOUND EFFECTS (SFX) from words with Stable Audio Open — SOUND DESIGN and FOLEY for game audio, apps and video: impacts, whooshes, door slams, footsteps, UI blips, creature and sci-fi sounds, ambiences ("rain on a tin roof", "busy café"), risers, drum one-shots. A one-shot hit ("punchy house kick", "snare with a short room", "a riser into the drop"), a loop on the tempo grid ("glitchy percussion"), or a texture ("vinyl crackle", "rain"). kind picks which (hit | loop | texture); omitted, the server reads it off the words. Don't put a tempo in a hit's prompt — tempo words make it write a loop. Wrong tool for a part with notes (doseedo_render_midi) or a piece of music (you write it; doseedo_render_score plays it). Async: job_id → doseedo_wait_task (typically 15–40 s) → audio URLs (pre-signed: curl -OJ , no auth header, valid 24 h). Cancel: a render that has not reached the GPU yet is stopped and its credits refunded; one already rendering finishes on the GPU (its credits are spent), the job ends as canceled and the output is discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Tempo a loop is cut to (default 120). | |
| kind | No | hit = one sound (0.5–10 s), loop = 1–4 bars tiled at bpm, texture = a bed. Default: read off the prompt. | |
| seed | No | Optional random seed for reproducibility. | |
| prompt | Yes | What it sounds like, e.g. "punchy house kick drum, single hit" or "dusty vinyl crackle". ≤ 300 characters. | |
| time_signature | No | Meter a loop is cut to, e.g. "4/4" (default). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| duration_seconds | No | Length in seconds. Default: 2 s for a hit, 4 bars at bpm for a loop, 8 s for a texture. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides extremely high behavioral detail that is not in the schema or annotations, specifically regarding the asynchronous workflow, the use of `doseedo_wait_task`, URL handling (pre-signed, no auth), and a nuanced cancellation policy based on GPU state.
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?
While extensive, the detail is perfectly justified by the tool's complexity (handling asynchronous state, cancellation, and varied resource types). The information is front-loaded with high-value context.
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?
Given the need to manage an asynchronous job lifecycle, the description is exceptionally complete, covering request, waiting, retrieval, and termination in detail.
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?
Although schema coverage is 100%, the description adds vital semantic rules regarding parameter interaction, such as how omitting 'kind' defaults to prompt content, and the functional consequence of putting tempo words in a hit's prompt.
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 tool clearly states its purpose as generating sound effects (SFX) and Foley. It explicitly distinguishes itself from sibling tools by stating it is the wrong tool for music, thereby defining its operational scope precisely.
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 provides immediate, practical guidance on usage with extensive examples (impact, whooshes, UI blips). Crucially, it provides 'when not to use' guidance by referring the user to specific sibling tools for musical content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_get_upload_urlGet an audio upload URLAIdempotentInspect
Get a presigned upload for your own audio file. Returns an upload_url (PUT the raw file bytes there, e.g. curl -X PUT -H "Content-Type: <content_type>" --data-binary @song.wav "<upload_url>") and an audio_key to pass to doseedo_separate_stems / doseedo_transcribe / doseedo_cover_song / doseedo_audio_to_session, or to doseedo_add_audio_to_session. A FILM (mp4, mov, m4v, webm, mkv; ≤ 2 GB) uploads the same way: pass the key as video_key to doseedo_spot_video / doseedo_score_to_picture. Formats: WAV, AIFF, FLAC, MP3, M4A/AAC, Ogg/Opus, WebM — all accepted for processing on every plan. Storing audio IN A SESSION (doseedo_add_audio_to_session) keeps WAV/AIFF/FLAC lossless only on Pro+; below Pro+ lossless is not kept there, so send Opus (audio/ogg). Samples/regions for a session that are on this machine need NO upload: use load_quick_sampler_sample sample_path / attach_audio local_path / set_track_clips audio_ref.local_path and run place_local_files after the download.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | File name including extension, e.g. "song.wav". | |
| content_type | No | MIME type; inferred from the extension when omitted (wav, aif/aiff, flac, mp3, m4a/aac, ogg/opus, webm; a film: mp4, mov, m4v, mkv). Required for any other extension. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, idempotent=true, destructive=false, openWorld=true); the description adds real behavioral context beyond that — the PUT-with-raw-bytes protocol, the ≤2 GB film limit, universal format acceptance on every plan, and the plan-tier caveat that lossless WAV/AIFF/FLAC is not retained in sessions below Pro+. It omits presigned-URL expiry/reuse semantics, which matters for a time-limited credential.
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-loading is good — purpose and return values come first — but the remainder is a single dense paragraph mixing protocol, film handling, plan tiers, format lists, and a local-file alternative. For a two-parameter tool this is over-packed and would read better split into short labeled sections.
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?
With no output schema, the description carries the return-value burden and does so (upload_url + audio_key, plus the exact PUT invocation). Combined with format, size, and plan caveats, an agent has enough to call it correctly; only URL lifetime and whether repeat calls return the same key are unaddressed.
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 100% and already documents filename-with-extension and content_type inference from extension. The description reinforces content_type by showing it used in the PUT header and enumerates the accepted formats, but adds no parameter-level detail the schema lacks — baseline 3.
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?
Opens with a specific verb+resource: 'Get a presigned upload for your own audio file', and states exactly what comes back (upload_url, audio_key). It never contrasts itself with the similarly named sibling doseedo_get_project_upload_url, so an agent must infer which upload-URL tool applies to which artifact.
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 routes the returned key to the four consuming tools plus doseedo_add_audio_to_session and video_key for doseedo_spot_video / doseedo_score_to_picture. It also gives a clear when-NOT-to-use case: local samples/regions 'need NO upload' and should instead use load_quick_sampler_sample / attach_audio / set_track_clips with place_local_files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_instrumentsInstrument catalog (the sound palette)ARead-onlyIdempotentInspect
The instrument list — the sound palette: every instrument doseedo can PLAY YOUR NOTES on (doseedo_render_midi) — orchestral strings, brass and winds, guitars, basses, keys, drums and percussion, and World instruments (koto, sitar, banjo, pedal steel, tabla, congas…). Each entry gives the EXACT render call (call: instrument, plus timbre_preset where one is needed — a koto is the acoustic_guitar model with the koto timbre), its playable range in concert MIDI pitch, whether it plays chords, its presets (pizz, muted, sax registers…) and a demo render. No args → the whole catalog; query:"warm low brass" / family / pitches:[…] (instruments whose range holds them) / chords:true narrow it; id:"cello" → one instrument in full. Read-only, free, no key needed — read it before writing a part.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One instrument (id, alias or label, e.g. "cello", "upright bass", "koto") → its full entry: every preset with its own call and range, transposition, aliases, demo, page. | |
| query | No | What the part needs, in words: an instrument ("trumpet"), a family ("woodwinds"), a technique ("pizzicato", "muted") or a register ("low", "bright"). Ranked best-first. | |
| chords | No | true = only instruments one player can play chords on. | |
| family | No | Only this family. | |
| pitches | No | MIDI pitches the part uses (concert, 60 = C4) — only instruments whose range holds every one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real context on top: 'free, no key needed', that no args returns the whole catalog, and exactly what each entry contains (render call, timbre preset, range, chord capability, presets, demo). That is genuine behavioral disclosure beyond the structured fields.
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 purpose and the filtering modes in one dense paragraph where every clause carries information. It is long and parenthetical-heavy, but there is no filler sentence to remove without losing catalog semantics.
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, so the description carries the burden of describing return contents — and it does, enumerating call, range, chord support, presets, and demo per entry. An agent has everything needed to call it and interpret the response.
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?
Despite 100% schema coverage, the description adds meaning the schema doesn't: illustrative queries ('warm low brass'), that query results are ranked best-first, that pitches filters to instruments whose range holds every pitch, and that id returns one instrument in full with all presets. This meaningfully upgrades parameter interpretation.
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 — the full instrument catalog — and defines scope precisely: every instrument doseedo can render notes on, broken down by families and with concrete exotic examples. An agent can immediately distinguish it from siblings like doseedo_list_plugins or doseedo_train_instrument.
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 tells the agent to 'read it before writing a part' and ties it to the downstream tool doseedo_render_midi, which is strong when-to-use guidance. There is no explicit when-not or named alternative, but for a catalog tool the routing is essentially unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_list_jobsList jobsARead-onlyIdempotentInspect
List the jobs this account submitted (generate / render_midi / cover / stems / transcribe / session / convert / bounce / the analyses), newest first — to find an earlier result, check what is still running, or resume after a lost connection. Each row names its artifacts (e.g. ["vocals", "drums", "midi_piano"]); doseedo_check_task {job_id} returns the full result with fresh links. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only this job kind (registry name): generate_music, generate_sound, cover_stem, fill_gap, render_midi, train_instrument, render_score, mix, session_from_stems, spot_video, score_to_picture, cover_song, separate_stems, transcribe, audio_to_session, convert_project, bounce_session, analyze_song, detect_chords, beat_grid, check_take, analyze_midi. Short codes (generate, sound, coverstem, fillgap, render, train, score, stemsess, spot, picture, cover, separate, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases. | |
| limit | No | How many (1–100, default 20). | |
| before | No | Page cursor: the next_cursor of a previous call. | |
| status | No | ||
| session_id | No | Only jobs whose input names this session — a bounce, stems registered into it, a render of one of its tracks (filtered within the fetched page). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation it adds ordering ('newest first') and the key caveat that rows only name artifacts while links must be re-fetched via check_task. 'Read-only' merely restates the annotation, and pagination/limit behavior isn't discussed, so it stops short of full behavioral disclosure.
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 action and scope, then use cases, then the artifact/link caveat. The parenthetical kind list is dense but earns its place by mapping casual names to the tool's domain; every sentence carries information.
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?
With no output schema, the description covers the essential return shape (rows with artifact names, newest-first ordering) and points to the sibling for full results. It omits any mention of cursor-based paging or the next_cursor field an agent needs to iterate, which is a minor but real gap.
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 80% and the schema itself documents kind aliases, limit bounds, the before cursor, and the page-scoped session_id filter. The description only indirectly references the kind parameter through its list of job types, adding no format or boundary detail beyond the schema, so baseline 3 applies.
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?
Names the specific verb and resource ('List the jobs this account submitted') and enumerates the job kinds covered, so an agent immediately knows the scope. It also distinguishes itself from doseedo_check_task by describing that as the full-result lookup.
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 states three concrete situations to call it: finding an earlier result, checking what is still running, and resuming after a lost connection. It also routes to the alternative ('doseedo_check_task {job_id} returns the full result with fresh links') for the case where a fresh link is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_mixMix and master stemsAInspect
MIXING and MASTERING: mix the stems instead of summing them: each part levelled for how loud it plays, panned, high-passed, given its depth on a shared reverb, and mastered to a loudness target — returned as a WAV AND as mixgraph, the mix as a document you edit. After doseedo_render_score pass from_job (its parts and the instruments they play are the stems); or stems: [{name, audio_url, instrument?}] (result links work as-is). An orchestra (strings / winds / brass / timpani / harp…) is SEATED by default (film-orchestral: violins left, low strings right, winds centre, brass behind, each seat with its own depth in a 2.3 s hall, written dynamics riding the faders; room / dynamics_ride change that); other stems get the blind default. style: film-orchestral, film-scoring-stage, concert-hall, film-epic-hybrid, cathedral-choral, classical-chamber, cartoon-studio, golden-age-cartoon, jazz-combo, ambient, country-pop, metal-modern, 1950s-mono, 1960s-lcr-pop, 1970s-analog-rock, 1970s-dub, 1980s-pop-gated, 1990s-rock-dry, 1990s-hiphop, 2000s-loudness-rock, 2010s-edm, 2010s-trap, 2020s-pop, 2020s-hyperpop — an id or words ("dry 90s rock"). balance {part: dB} moves parts on top of the levelling (+3 brings a melody forward). Change the mix: edit the returned mixgraph — strips[] {stem, gain_db, pan, seat, chain, sends}, buses[] (verb = the hall), master.chain, automation [{target: "strips..gain_db", points: [[seconds, dB]…]}] for rides — and call again with mixgraph + the same from_job / stems — or mix_job (this job_id) + only your edits: rendered as written (safety rails apply, reported), no credits. report.strips..active_lufs = how loud each part plays in the mix. Then doseedo_session_from_stems {from_job, mix_job: } → the DAW project at this mix's levels and pans. Async: job_id → doseedo_wait_task (~15–90 s). Cancel: the plane has no stop for a running mix — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at the plane is refunded by the plane's own failure refund.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | An orchestra's room: "studio" (intimate scoring stage, ~1.2 s, close), "stage" (~1.8 s), "hall" (the default scoring hall, ~2.3 s), "cathedral" (~4 s, wet) — or 0..1 between them. Sets the decay, size and how wet every seat sits. | |
| stems | No | [{name, audio_url, instrument?}] — the stems (≤ 32). instrument = the sound it plays (a doseedo_instruments id: "violin", "timpani", "harp"), which decides how it is mixed; without it the name decides. | |
| style | No | A mix style: an id or words ("dry 90s rock"). Pick it for the picture — the default (film-orchestral, a 2.3 s scoring hall) suits film drama, not every orchestra: cartoon-studio = a cartoon / animation orchestra (a close, dry, wide scoring stage, punchy rides); golden-age-cartoon = a 1940s–50s cartoon (mono, small studio, tape); film-scoring-stage = intimate TV / documentary; concert-hall; film-epic-hybrid = trailer / action; cathedral-choral; classical-chamber; or jazz-combo, ambient, 1970s-analog-rock, 2020s-pop … | |
| balance | No | {part name: dB in -12..12} — your balance on top of the levelling (and of the written dynamics a from_job reads). | |
| mix_job | No | MCP: a doseedo_mix job_id to edit — its whole stored mix (every ride) is the base, mixgraph is applied on top, and its stems are reused when you pass no from_job / stems. | |
| vintage | No | A period medium over any style, after the mix: "tape" = 7.5 ips tape (saturation, wow and flutter, a low hiss); "shellac" = a 78 played back (mono, ~90 Hz–5.5 kHz with the reproducer's presence, a 1.3 Hz wow, surface noise that swishes once a turn, crackle). "none" takes a style's own medium off (golden-age-cartoon carries tape). Its node (master.chain type vintage: noise_db, crackle, hi_hz …) is editable in the returned mixgraph. | |
| dynamics | No | Fader rides from written dynamics: {part name: [[onset_seconds, velocity 0-127], …]}. from_job fills it from the score (pp to ff ≈ 17 dB); pass {} for no rides. | |
| from_job | No | MCP: a doseedo_render_score job_id — its parts are the stems, each with the instrument it plays, and each part's written dynamics (its mean velocity) set its balance. | |
| mixgraph | No | An edited mix — the mixgraph a doseedo_mix returned, changed — rendered against the same stems (from_job or stems). With mix_job: ONLY what you change (strips[] by stem, automation[] rides by target — points: [] removes one, buses[] by id, master) — the rest is that mix as stored. A mixgraph marked `partial` (its rides summarized) is refused without mix_job. Omit for a fresh mix. | |
| target_lufs | No | Master loudness, -24..-6 LUFS (default: the style's — -18 for film-orchestral, -14 for the blind default). | |
| tonal_match | No | Nudge the master toward professionally mixed orchestral references (default on for the orchestral styles). Its presence and air are judged only where the score is written loud (written_level), so a pp passage keeps its darkness. | |
| dynamics_ride | No | How hard the written dynamics move the faders: 1 = default (pp to ff ≈ 17 dB), 0 = no rides, up to 1.5. | |
| written_level | No | [[seconds, velocity], …] — the whole score's written level, the loudest part sounding, held until the next row (0 = nothing plays). The tonal match reads only the passages it writes loud (f and louder), so a pp passage keeps its darkness. from_job fills it. | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| dynamics_carried | No | {part name: top velocity} — parts whose stems already play their written level (a render part's dynamics_level receipt, up to its top_vel). Their rides count it: no doubled swing. from_job fills it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses behavior well beyond the annotations: output includes WAV and mixgraph, edits through mix_job render as written with safety rails and no credits, and async jobs take roughly 15–90 s. It also gives unusually specific cancellation semantics — no stop for a running mix, credits spent, output discarded, only queued jobs refunded — without contradicting readOnlyHint=false or destructiveHint=false.
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 purpose and primary workflow are front-loaded, and the length is largely justified by the tool's 15 parameters and many edit pathways. It is dense and paragraph-like rather than sectioned, so scanability suffers slightly, but most sentences carry actionable 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?
With no output schema, the description still explains the returned artifacts (WAV and mixgraph), key report fields such as report.strips.<part>.active_lufs, async job handling, and cancellation limitations. Given the complexity and rich input schema, an agent has enough context to invoke and follow up 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 100%, so the schema already carries most parameter definitions. The description still adds cross-parameter workflow meaning for from_job, stems, mixgraph, and mix_job, and supplies the long style id list that the schema only partially exemplifies, though many individual parameter details remain schema-led.
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 states a specific verb and resource — mixing and mastering stems instead of summing them — and enumerates the concrete processing applied. It also names related tools and input modes, so an agent can distinguish this from rendering, stem separation, or session creation.
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?
The description gives explicit entry paths: use from_job after doseedo_render_score, or pass stems directly; then edit the returned mixgraph and call again with mix_job or with the same from_job/stems. It also routes the follow-on step to doseedo_session_from_stems and explains the async wait path with doseedo_wait_task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_quotePrice a jobARead-onlyIdempotentInspect
Estimate what a job will cost in credits BEFORE submitting it, and whether the connected account can afford it right now. Spends nothing. Pass the job (generate_music, generate_sound, cover_stem, fill_gap, render_midi, train_instrument, cover_song, separate_stems, transcribe, audio_to_session, convert_project, bounce_session, spot_video, score_to_picture, analyze_song, detect_chords, beat_grid, analyze_midi, render_score, mix, session_from_stems, check_take) and the same args you would give the job tool (duration_seconds, models, instruments; for render_midi: notes + bpm / tempo_map or duration_seconds, voice_split / voices, takes — takes are free, voices cost one batch per ~6; for render_score: parts + bpm / tempo_map — planned exactly as the job plans it (lines, player rows, length), and refused says when the job would refuse it). The estimate follows the planes' own price table; the gate is authoritative and a refusal names the exact price.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | Which job to price (a doseedo_ tool name or recipe verb is accepted too). | |
| args | No | The arguments you intend to pass to the job tool; only the price-relevant ones matter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description reinforces this with 'Spends nothing' and adds genuinely new context: the estimate follows the planes' price table while 'the gate is authoritative and a refusal names the exact price'. This warns the agent that the quote and the actual charge can diverge — useful, non-obvious behavior. It doesn't say what the response object looks like beyond `refused`.
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 benefit and the 'spends nothing' guarantee are well front-loaded, but the description then dumps the full 22-item enum inline, duplicating the schema and bloating an otherwise efficient statement. The price-rule clauses are valuable but delivered as a dense run-on.
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?
With no output schema, the description still conveys the return shape well enough: a credit estimate, an affordability answer, and a `refused` field indicating when the job would be rejected. For a two-parameter read-only tool this is close to sufficient, though the exact response fields are only sketched.
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 100%, so the baseline is 3, but the description earns extra by explaining that `args` should mirror the job tool's arguments ('only the price-relevant ones matter') and by giving non-obvious pricing semantics — takes are free while voices cost one batch per ~6, and render_score parts are planned exactly as the job plans them. The detail is uneven, focused on only two of the 22 jobs.
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 ('Estimate what a job will cost in credits') plus the pre-condition timing ('BEFORE submitting it') and the affordability check. An agent can instantly separate this from doseedo_generate_music or any other job tool, which actually spend credits.
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 frames the use case as pre-flight pricing before invoking the job tool and reassures 'Spends nothing', which is the key decision input. It does not name a hard alternative (e.g. doseedo_account for balance) or state when-not to call it, so it falls 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.
doseedo_recipesRecipes (named pipelines)ARead-onlyIdempotentInspect
The named pipelines people actually ask for — stems, session (mix → DAW project), cover, transcribe, generate, render-midi (your notes played by an instrument model), custom-instrument (train your own from a recording), timbre-transfer (your notes, a recording's tone), sound-design (SFX / foley / one-shots), analyze-song (key/tempo/sections/chords), convert, bounce, and the compose-part guide (a part in the session's key at its tempo: analyze → you write the MIDI → place or render it) — each with its inputs, the tool calls in order, outputs, a credit/time estimate and how to VERIFY success from the response. Call with no name for the index (pick by use_when), or with a name for the full recipe. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A recipe name or alias, e.g. "session" / "stems-to-session". Omit to list all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description confirms read-only. Beyond that it discloses the payload of each recipe — inputs, ordered tool calls, outputs, credit/time estimate, and how to VERIFY success from the response — which is genuine behavioral context an agent needs before trusting the guide.
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 a clear scope statement, but the recipe enumeration is a single very long em-dash sentence that becomes a wall of text. Every clause is informative, yet the structure could be tightened.
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?
No output schema exists, so the description carries the burden of explaining return content — and it does, listing inputs, ordered tool calls, outputs, estimates, and verification guidance. Complete for a one-parameter read-only reference tool.
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 100% and already documents omitting name to list all. The description adds value by naming the index concept and tying recipes to a use_when selector, plus mentioning aliases implicitly in the recipe list — marginal but real beyond the schema.
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?
Names a specific resource — a catalog of named multi-step pipelines — and enumerates them (stems, session, cover, transcribe, render-midi, timbre-transfer, analyze-song, etc.), so the agent immediately knows this is a reference/guide tool rather than an action tool. It is cleanly distinguished from the many sibling action tools that actually perform those steps.
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 states the two invocation modes: no name returns the index (to pick by use_when), a name returns the full recipe. What is missing is guidance on when to consult this versus calling sibling tools directly, though the recipe content description implies it should be read before assembling a multi-step workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_render_midiRender MIDI on AI instruments (MIDI to audio)AInspect
MIDI TO AUDIO, the virtual instrument for agents — THE tool for "I wrote the part, now play it": an AI instrument model (orchestral strings, brass, woodwinds, piano, guitar, bass, drums, World) performs your exact notes, in your key, at your bpm, and returns audio takes (doseedo_generate_music takes no notes or key). Input ONE of: notes[] ({pitch, start_beats, duration_beats, velocity} — beats from bar 1, the same rows as doseedo_edit_session set_midi_notes), midi_url (a .mid ≤2 MiB: a doseedo result link or a public https URL), or session_id + track_id (that track's notes, read from the session). Required: instrument (an entry's call from doseedo_instruments, no key — stay inside its range) and bpm. The notes are sent AS GIVEN — no pitch snapping, no quantizing. One voice per part: a chord part is rendered one voice per output with voice_split:true (result.voices maps each voice to its files and notes). Takes come back best-first (takes[0] = the scorer's winner). Async: job_id → doseedo_wait_task (~1–3 min). Result: takes[{url, rank, score}] (pre-signed: curl -OJ, no auth header, 24 h), seed, duration, voices?, refine?, chain. A take may miss or change a note — read takes[].check (measured against your notes) or listen; offer the takes, never promise note-perfection. Free harmony check first: doseedo_analyze_midi. DRUMS (GM notes): drum_engine:"oneshot" = a sampler kit made for drum_genre (default for "electronic"/"808"), every hit as written — use it on ANY kit when every hit must land; the drum model PERFORMS a kit and can drop hits (takes[].fit.missing). "synth" = a one-shot patch (synth_role, synth_genre); result.oneshots = the samples. SOUND: a preset (timbre_preset), a recording's tone (timbre_audio_url = timbre transfer), or YOUR OWN instrument (lora_id from doseedo_train_instrument; result.lora.applied). Cancel: a render that has not reached the GPU yet is stopped and its credits refunded; one already rendering finishes on the GPU (its credits are spent), the job ends as canceled and the output is discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | REQUIRED (or tempo_map). Tempo of the notes (10–400). Written into the MIDI's tempo meta, so start_beats/duration_beats land at exactly this tempo. | |
| seed | No | Random seed (−1 or 0–4294967295). Reuse a result's seed to re-render close to the same take. | |
| tune | No | Light intonation (default true): a held, clearly pitched note the model rendered 15–85 cents off its written pitch is moved toward it, to a small natural residual — attack and vibrato as played, fast notes left. Winds, brass and strings. false = the take exactly as rendered. | |
| notes | No | The part, as note rows in beats from bar 1 (beat 0 = bar 1 beat 1, quarter-note beats at `bpm`). Monophonic for one voice; chords need voice_split:true. Up to 4096 notes. | |
| takes | No | How many takes to render, 1–4 (one GPU batch; no extra credits). Omit to let the server choose best-of-N for the part length. | |
| prompt | No | Optional caption override (default: the instrument id). Style words help a little; the notes are the control. | |
| refine | No | Opt-in post-render correction. "light": attacks re-timed onto the score, exposed wrong pitch classes re-pitched inside the played octave, misfires muted (winds/brass/strings). "shred": play exactly the written line, octave included, mute anything the score never wrote (any pitched mono part). The raw render stays downloadable (result.refine.raw_url). | |
| vaefix | No | VAE spectral corrector (default true): trims the low-mid fog the decoder adds under the instrument's register and removes mic hiss only when the take carries it. Winds, brass and strings. Receipt: vaefix. false = the decode exactly as rendered. | |
| lora_id | No | A CUSTOM INSTRUMENT: the lora_id doseedo_train_instrument returned (16 hex). The render is played by that trained instrument; pass the same instrument it was trained as. Owner-only. | |
| dynamics | No | One target dynamic for the whole part's tone: "pp", "p", "mp", "mf", "f", "ff", "fff", a 0–1 number, or a MIDI velocity as text. Omit it to let the notes' velocities shape the tone (dynamics_curve). | |
| midi_url | No | Alternative to notes: https URL of a Standard MIDI File (≤2 MiB) — a doseedo result link (a stem's MIDI) or a public URL. Its own tempo map is used by the model; bpm still tags the caption and sizes the default duration. | |
| track_id | No | With session_id: the t_… id of the MIDI/instrument track to render. | |
| tempo_map | No | Tempo CHANGES for the notes: [{beat, bpm}] — each point holds from its beat (beats from bar 1) until the next; the first point is beat 0 (or bpm covers the beats before it). Written into the MIDI, so a ritardando or a tempo that lands a cue on a film hit plays exactly. doseedo_tempo_map builds one from hit times. | |
| drum_genre | No | Electronic drums (instrument "electronic" or "808"): the genre whose one-shot kit plays the part — "house", "techno", "trap", "drill", "lo-fi", "dnb", "amapiano", "synthwave"… or free words. Default: the instrument. | |
| instrument | Yes | REQUIRED. The instrument from doseedo_instruments — its `call.instrument` (e.g. "violin", "tenor_sax", "electric_guitar", "piano"; a World name such as "koto" is resolved to its call). Keep the notes inside its range. An unknown name close to a catalog one is refused with did_you_mean before anything is spent. | |
| session_id | No | Alternative to notes: with track_id, render THAT session track's notes (read from doseedo_get_session's summary). | |
| synth_role | No | instrument "synth": the patch Stable Audio Open makes for the part — bass (an 808 where the genre's bass is one), 808, pad, lead, pluck. Default: from the notes (chords = pad, a low line = bass, else lead). | |
| drum_engine | No | Who plays a drum part: "oneshot" = a sampler kit made for drum_genre (the default for electronic / 808; congas and bongos are recordings of the skins) — every note lands exactly as written; use it on ANY kit when every hit must land. "model" = the drum model (the default for every other kit): a performance, which can drop or smear hits — read takes[].fit. | |
| synth_genre | No | instrument "synth": the genre the patch is made for — "house", "techno", "trap", "synthwave", "lo-fi", "dnb"… or free words. | |
| synth_words | No | instrument "synth": extra sound words for the patch ("reese", "warm analog", "acid"), ≤80 chars. | |
| voice_split | No | true = the notes hold chords: split them into the voices one player of this instrument can hold and render every voice (result.voices). Default false (a chord in a mono part is an error the model will fudge). | |
| synth_engine | No | Who plays a synth part: "oneshot" = a patch of one-shots made for it (the default for "synth"), "model" = the instrument model. | |
| lora_strength | No | With lora_id: how strongly the custom instrument applies, 0–2 (default 1.0, or a tuned per-adapter default; ~0.6 when a small training set overshoots). | |
| timbre_preset | No | A preset from doseedo_instruments — an entry's call.timbre_preset or presets[].call.timbre_preset (e.g. "violin:pizz", "sax:alto", "koto:preset1"). Omit for the instrument default. | |
| dynamics_curve | No | What colours the TONE over time: omitted/"auto" = the note velocities when they vary (soft notes darker, loud brighter — every instrument but drums, LoRAs included); "off" = one colour; "cc11"/"cc1" = that CC lane of a midi_url; or "pos:level,…" (pos and level 0–1, e.g. "0:0.1,1:0.9" = a crescendo). Receipt: result.dynamics. | |
| time_signature | No | Meter of the part, e.g. "4/4", "3/4", "6/8" (default 4/4). Written into the MIDI and the caption. | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| revise_take_url | No | REVISE an earlier take instead of rendering a new one: the take's URL (as a render returned it). Only [revise_start_beats, revise_end_beats) is regenerated — steered by `notes` (send the whole part, with your corrections) — and spliced back with short crossfades; the rest of the take is kept as it was. | |
| duration_seconds | No | Length of the render in seconds (0.01–600). Default: the last note's end + 2 s of release. Each 30 s window costs 10 credits. | |
| revise_end_beats | No | With revise_take_url: end of the region to redo (exclusive), beats from bar 1. | |
| timbre_audio_url | No | TIMBRE TRANSFER: https URL of a short recording (≤24 MB; its first 30 s are used) whose SOUND the render should take on — a doseedo result link or a public URL. The notes stay yours; the tone comes from the recording. | |
| revise_start_beats | No | With revise_take_url: start of the region to redo, beats from bar 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses async job behavior (~1–3 min via doseedo_wait_task), best-first take ordering, pre-signed 24-hour result URLs, note-imperfection caveats, cancellation/refund semantics, and drum-model hit-dropping behavior. These are substantive operational details an agent needs before invoking the 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?
It is front-loaded with purpose and core inputs, then branches into drums, sound, and cancellation, and nearly every sentence carries operational information. However, the description is extremely dense and long, with many parenthetical clauses, making it harder to scan than it could be for a 32-parameter tool.
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?
Given the tool's complexity, 32 parameters, no output schema, and open-world behavior, the description is unusually complete: it covers input selection, required fields, async lifecycle, result shape, take-quality caveats, drum/synth routing, timbre options, and cancellation semantics. An agent has enough context to invoke it correctly without additional documentation.
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?
Although schema coverage is already 100%, the description adds high-value semantics: it explains the notes/midi_url/session-track alternatives, how instrument ids are sourced from doseedo_instruments, the purpose of voice_split, drum_engine, timbre transfer, LoRA application, and revise-region behavior beyond the schema text.
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: render MIDI notes through an AI instrument model and return audio takes. It explicitly distinguishes itself from doseedo_generate_music by noting that generate_music takes no notes or key, so an agent can choose between them 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 a clear triggering scenario ('I wrote the part, now play it'), names the alternative for note-less generation, and points to doseedo_analyze_midi as a free harmony check first. It also explains the three mutually exclusive input modes (notes[], midi_url, or session_id + track_id) and when to use each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_render_scoreRender a whole scoreAInspect
FILM SCORING, orchestral arrangement, background music, a song or an instrumental YOU wrote: a WHOLE ARRANGEMENT in one call (a film cue, a string quartet, a big-band chart): every part played by its doseedo instrument, one stem per part from bar 1 at your tempo, plus a summed mix. Input ONE of: parts[] ({name, instrument, timbre_preset?, lora_id?, players?, notes[]} — doseedo_instruments calls), midi_url (multi-track SMF), or musicxml_url (notation played as marked, at concert pitch; what isn't: prepared.score.warnings). A file's parts are matched by name, then GM program; name any part with instruments {"": {instrument, timbre_preset?, players?}}. A chord on a one-line instrument is split into voices (one stem each). ★ SECTIONS: an instrument is ONE player; give a part players: N (2–8) and its line is played by N different players (each its own performance), summed into ONE section stem — that is how you write an orchestra: violins I / violins II / violas / cellos / basses as five parts with players 6 / 6 / 4 / 4 / 3, horns 2–4 in unison, a woodwind or brass line doubled; leave players out for a solo. The WHOLE orchestra in one call: ≤ 32 lines and ≤ 96 player rows (players: N = N rows), plain, sampled and World / LoRA instruments together (~1 min groups), ≤ 600 s. Synth / electronic parts and drums where every hit must land (drum_engine:"oneshot"): doseedo_render_midi. Timing: bpm and/or tempo_map ([{beat, bpm}]; doseedo_tempo_map lands film hits on downbeats). Result: parts[{name, instrument, url, fit, timbre, lora, players}] — fit.verdict / coverage = did it PLAY its notes (a failed part is re-rolled once; fit.rolls.missed = a roll not played as one), lora.applied = its adapter played — plus mix_url. Next: doseedo_mix {from_job}, then doseedo_session_from_stems {from_job, mix_job}. Async: job_id → doseedo_wait_task (~1–4 min). Cancel: a render that has not reached the GPU yet is stopped and its credits refunded; one already rendering finishes on the GPU (its credits are spent), the job ends as canceled and the output is discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Tempo of the parts (10–400). Required with parts[] unless tempo_map is given; on a file it sets the speed and keeps the score's fermatas / rit. / tempo changes. | |
| mix | No | Also bounce a summed mix of the stems (default true). | |
| seed | No | Random seed (reuse to re-render close to the same performance). | |
| tune | No | Light intonation on every winds / brass / strings part (default true): held, clearly pitched notes the model rendered 15–85 cents off are moved toward their written pitch, to a small natural residual — attacks, vibrato and fast notes as played. Receipt: parts[].tune. false = every part as rendered (or parts[].tune false for one). | |
| parts | No | The parts you wrote: [{name?, instrument, timbre_preset?, lora_id?, players?, notes:[{pitch, start_beats, duration_beats, velocity?}], dynamics?}] — beats from bar 1, concert pitch. instrument/timbre_preset = a doseedo_instruments call. players = how many play the line: 1 (default) a soloist, 2–8 a SECTION (e.g. Violins I players 6). | |
| vaefix | No | VAE spectral corrector on every winds / brass / strings part (default true): the decoder's low-mid fog under each instrument's register is trimmed, mic hiss removed only where present. Receipt: parts[].vaefix. false = every decode as rendered (or parts[].vaefix false for one). | |
| midi_url | No | Alternative to parts: a multi-track Standard MIDI File (≤ 2 MiB) — a doseedo result link or a public https URL. Channel 10 = drums: the kit, or the one percussion instrument a part is named for (Bass Drum, Cymbals, Bass Drum & Cymbals, Triangle…). | |
| score_url | No | Alternative to parts: a score file URL — MIDI or MusicXML, told apart by its content. | |
| tempo_map | No | Tempo changes [{beat, bpm}] (first point at beat 0). Overrides a file's own tempo. | |
| instruments | No | Name the instrument for any part: {"Violin I": {"instrument": "violin", "players": 6}, "2": {"instrument": "acoustic_guitar", "timbre_preset": "koto:preset1"}} — key = the part name or its 0-based index; players makes a MIDI / MusicXML part a section. Wins over the name/program match. | |
| musicxml_url | No | Alternative to parts: a MusicXML score (.musicxml / .xml / .mxl, ≤ 8 MiB) exported from Dorico, Sibelius, Finale, MuseScore, or written by you. | |
| time_signature | No | Meter, e.g. "4/4" (default, or the file's). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| duration_seconds | No | Render length (default: the last note + 2 s; ≤ 600). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses async job behavior, expected wait time (1–4 min), cancellation/refund rules, orchestral limits (≤32 lines, ≤96 player rows, ≤600 s), one automatic re-roll for failed parts, and output fields for fit/coverage/tuning. These are operationally important facts not captured by readOnly/openWorld/destructive hints.
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 purpose is front-loaded, but the description is extremely dense, using all-caps phrases, parentheticals, symbols, and repeated references to doseedo_instruments that make it harder to parse. Much of the length is justified for a 14-parameter render tool, but the delivery is not tightly concise.
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, 14-parameter async rendering tool with no output schema, the description is highly complete: it explains input modes, orchestration/section semantics, timing, output fields (url, fit, mix_url), next steps, wait behavior, and cancellation consequences. An agent has enough context to invoke and follow up 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 already 100%, so the schema carries the basic parameter meanings. The description adds useful semantics beyond the schema: file parts are matched by name then GM program, instruments{} can override by part name/index, and players converts a line into a section stem.
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: rendering a WHOLE ARRANGEMENT as stems plus mix from parts[], MIDI, or MusicXML. It distinguishes this from doseedo_render_midi by reserving synth/electronic parts and tightly timed drums for that sibling, so an agent can select it without opening 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 explicitly names the alternative doseedo_render_midi and the condition that selects it: synth/electronic parts and drums where every hit must land. It also states the three valid input modes and gives concrete examples (film cue, string quartet, big-band chart), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_score_to_pictureLay the score on the pictureAInspect
SCORE TO PICTURE: the last step of scoring a film. Lays each mixed cue (and any sound effect) on the video at its SMPTE timecode, with dialogue ducking (the lines found on the video's own soundtrack by VAD, or the spans you pass; the music dips ahead of each line and comes back after it), normalises the program to a delivery loudness (web −16, streaming −14, broadcast/ebu −23, atsc −24 LUFS, or a number; true peak under the ceiling) and muxes it onto the picture untouched (no re-encode). Returns the scored video, the printmaster WAV and the music-and-effects stem, plus a report of what it MEASURED: where each track landed (and what was cut at the film's edges), how far the music sits under the lines, and the final loudness and true peak. CPU, no credits. tracks: [{audio_url (a doseedo_mix mix_url as returned, or any public https URL) | audio_key, start_timecode (in the film's timecode) | start_s, gain_db?, role?: music|sfx, name?}], ≤ 64. Keep the production audio (default) or drop it (production_audio:"drop" — e.g. a temp score you are replacing; then pass dialogue spans to duck under). Up to 25 minutes of film per call (a reel). Async: job_id → doseedo_wait_task. Cancel: the plane has no stop for a running delivery — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at the plane is refunded by the plane's own failure refund.
| Name | Required | Description | Default |
|---|---|---|---|
| duck | No | Dialogue ducking (on by default): depth_db (default 10), attack_ms (250: how early before a line the music is down), release_ms (700), sfx (false: duck effects too), enabled. | |
| tracks | Yes | What to lay on the film, in any order. | |
| dialogue | No | Dialogue spans [{start_s, end_s}] to duck under, instead of detecting them (use the cue sheet's dialogue, or your own). | |
| loudness | No | Delivery loudness: "web" (−16 LUFS, default), "streaming" (−14), "broadcast" / "ebu" (−23), "atsc" (−24), or a LUFS number (−36…−8). | |
| video_key | No | R2 ingest key of the video (the same upload doseedo_spot_video used). | |
| video_url | No | https URL of the video, as an alternative to video_key. | |
| start_timecode | No | SMPTE timecode of the film's first frame (default: the file's own, else 00:00:00:00) — the clock the tracks' start_timecode is read on. | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. | |
| production_audio | No | keep (default) mixes the video's own soundtrack under the score; drop replaces it. | |
| production_gain_db | No | Trim on the production audio when kept (default 0). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: no re-encode ('muxes it onto the picture untouched'), CPU-only with no credits, async job semantics, up to 25 min per call, and a candid warning that a running delivery cannot be stopped and discards output on cancel. It also enumerates what the returned report measures, which is valuable for a job with no output schema.
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 core purpose is front-loaded, but the description is a dense wall of parentheticals covering ducking, loudness, returns, tracks syntax, limits, and cancel policy in one block. For a 10-parameter tool this length earns its place, though it could be broken into paragraphs for scanability.
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, nested-schema, no-output-schema tool, it covers what is produced (scored video, printmaster WAV, M&E stem, measurement report), the async continuation path, and the operational limits. 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 coverage is already 100%, but the description still adds real meaning: audio_url can be a doseedo_mix mix_url, the loudness preset names map to specific LUFS values, production_audio 'drop' is illustrated with a temp-score example, and the tracks array shape with the ≤64 cap is spelled out. It stops short of explaining every duck tuning knob, but the schema does that.
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 up front ('SCORE TO PICTURE: the last step of scoring a film'), then lists the concrete operations: laying cues at SMPTE timecode, ducking, loudness normalisation, and muxing onto the picture. It clearly distinguishes itself from doseedo_mix (which produces the cue) and doseedo_spot_video (which uploads the picture).
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?
Positions the tool in a workflow ('the last step'), gives the alternative paths (keep vs drop production audio, with the temp-score replacement example), tells how to supply dialogue instead of VAD detection, and names the follow-up tool (doseedo_wait_task). It also states the 25-minute/reel limit and the cancellation/refund rules so there are no surprises.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_session_from_stemsStems → a DAW sessionAInspect
Build a native DAW PROJECT from stems: each stem on its own audio track from bar 1, optional MIDI tracks (the written parts) beside them, on your tempo (bpm or tempo_map) — Logic Pro (.logicx) or Ableton Live (.als), zipped. The deliverable after doseedo_render_score (pass from_job: its job_id and the stems, MIDI and tempo come from that job) or after any renders / separations you made (stems: [{name, audio_url}] — result links work as-is). After doseedo_mix add mix_job: each track at that mix's level and pan, the mix as a muted reference track. Async: job_id → doseedo_wait_task (~30–90 s) → file (pre-signed zip, curl -o session.zip , 24 h). Cancel: the plane has no stop for a running session build — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at the plane is refunded by the plane's own failure refund.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Project tempo (default 120). | |
| name | No | Project name. | |
| stems | No | [{name, audio_url | audio_key, gain_db?, pan?, mute?, position_beats?}] — the audio tracks, in order. | |
| target | No | Which DAW (default logic). | |
| mix_job | No | MCP: a doseedo_mix job_id — every track takes that mix's level and pan, and the mix itself rides along as a muted reference track "Mix (doseedo)". | |
| from_job | No | MCP: a doseedo_render_score job_id — its stems, parts' MIDI and tempo are used (no other input needed). | |
| mixgraph | No | A mix document (doseedo_mix → mixgraph): each stem named in it takes its strip's gain_db and pan. The EQ, compression, reverb and rides are not written into the project. | |
| tempo_map | No | Tempo changes [{beat, bpm}] for the project. | |
| midi_tracks | No | Optional MIDI tracks: [{name, notes:[{pitch, start_beats, duration_beats, velocity?}]}]. | |
| time_signature | No | Meter (default 4/4). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses async timing (~30–90 s), the pre-signed zip download pattern with curl, 24-hour expiry, cancellation limitations, credit-spend behavior, and refund conditions. It also clarifies that mixgraph EQ, compression, reverb, and rides are not written into the project.
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 dense but front-loaded, starting with the core build action and deliverable before moving into input modes, async behavior, and cancellation caveats. Despite its length, every sentence carries operational information relevant to invoking the tool correctly.
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?
Given 11 parameters, nested stem/MIDI objects, no output schema, and asynchronous execution, the description provides the missing operational context: how to use upstream job IDs, what the output is, how to retrieve it, and what cancellation does. Nothing essential for correct invocation appears absent.
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 100%, so the schema already documents all parameters. The description adds useful cross-parameter semantics, especially that from_job supplies stems, MIDI, and tempo without other input, that result links work as-is, and that mix_job causes tracks to inherit level/pan with a muted reference mix.
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 action and deliverable: build a native DAW project from stems, with each stem on its own track, optional MIDI tracks, and target formats Logic Pro or Ableton Live. It distinguishes the tool from sibling creation/import/convert tools by emphasizing stems as the input and a zipped DAW session as the output.
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 explicitly names upstream alternatives and when to use them: after doseedo_render_score with from_job, after any renders or separations with stems, or after doseedo_mix with mix_job. It also explains the async follow-up flow via doseedo_wait_task, making the intended invocation path clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_spot_videoSpot a video → cue sheetAInspect
SPOT A FILM: a video in, the music editor's cue sheet out — the first step of scoring to picture. Scene detection on EVERY frame, and it listens to the soundtrack (CPU, no credits): hard cuts frame-exact (dark, low-contrast footage included), fades, flashes and visual impacts; each shot's brightness, colour, warmth, contrast, motion and mood, with a keyframe JPEG per shot so you can SEE what it shows; where dialogue is (Silero VAD) and loud audio hits; then cues placed where the picture wants music and the dialogue lets it (1M1, 1M2 …: start/end SMPTE timecode, emotion, energy, tension arc, hit points ranked by strength, a suggested bpm that lands them, and tempo_map_input — pass it to doseedo_tempo_map as is). It sees light, movement and editing, not meaning: read the keyframes for what each scene is about. Input: video_key (doseedo_get_upload_url accepts mp4/mov/m4v/webm/mkv) or video_url (public https), ≤ 2 GB and ≤ 3 h. Optional start_timecode (the first frame's, e.g. 01:00:00:00; default the file's own), coverage (0.05–0.98, default 0.55: how much of the film gets music), reel (cue ids M), keyframes (0–60). Async: job_id → doseedo_wait_task (~1 min for a 10-min 1080p reel). Next: doseedo_tempo_map per cue → write the notes → doseedo_render_score → doseedo_mix → doseedo_score_to_picture. Cancel: the plane has no stop for a running spotting pass — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at the plane is refunded by the plane's own failure refund.
| Name | Required | Description | Default |
|---|---|---|---|
| reel | No | Reel number for the cue ids (default 1 → 1M1, 1M2 …). | |
| coverage | No | How much of the film gets music (default 0.55). Raise it for wall-to-wall scoring (a trailer, an animation), lower it for a dialogue drama. | |
| keyframes | No | How many shots get a keyframe JPEG (default 24; the longest shots first). | |
| video_key | No | R2 ingest key of the uploaded video (doseedo_get_upload_url with the file name, e.g. reel1.mp4; starts with "ingest/"). | |
| video_url | No | https URL of the video, as an alternative to video_key (a public file URL, fetched directly; ≤ 2 GB). | |
| cut_threshold | No | Scene-change threshold at full contrast (default 0.3). Lower finds softer cuts, higher only the hardest. | |
| start_timecode | No | SMPTE timecode of the first frame, HH:MM:SS:FF (";" before the frames = drop-frame at 29.97/59.94). Default: the file's embedded timecode, else 00:00:00:00. | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: async job_id → doseedo_wait_task with an expected runtime, CPU/no-credit cost, hard input limits (≤2 GB, ≤3 h), and a precise disclosure that a running spotting pass cannot be stopped and credits are spent even though the job ends canceled. The annotations (readOnlyHint=false, destructiveHint=false) don't cover any of this, so the description carries real weight.
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 verb and output, and nearly every clause carries operational information. It is dense and longer than typical, with input limits and pipeline steps packed into a long run-on, which costs a point but not much value is wasted.
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?
With no output schema, the description still documents the return shape thoroughly (cue ids, SMPTE start/end, emotion, energy, tension arc, ranked hit points, suggested bpm, tempo_map_input handoff). Combined with the async flow and cost caveats, an agent has everything needed to call and follow up 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 100%, so baseline is 3; the description still adds file-size/duration constraints and explains coverage's intent ('raise for wall-to-wall scoring, lower for a dialogue drama') plus how video_key/video_url relate. Most other params (reel, keyframes, cut_threshold) are only restated, keeping it at 4.
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 concrete verb+resource+output: 'a video in, the music editor's cue sheet out — the first step of scoring to picture'. An agent can immediately distinguish this from doseedo_analyze_song or doseedo_score_to_picture, and the description enumerates what the output cue sheet contains.
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?
Strong routing context: it positions itself as the first step and chains 'Next: doseedo_tempo_map per cue → ... → doseedo_score_to_picture'. It also warns on cancellation semantics. It stops short of explicitly saying when NOT to use it (e.g. audio-only, MIDI sources), so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_tempo_mapTempo map from hit pointsARead-onlyIdempotentInspect
Scoring to picture: turn HIT POINTS (a cut, an impact, the title card — as seconds from the cue start or SMPTE timecodes) into a TEMPO MAP that lands each hit exactly on a downbeat (or a beat — per hit with hits[].land), staying near your tempo and inside bpm_range. Returns tempo_map [{beat, bpm}] to pass unchanged to doseedo_render_midi / doseedo_render_score / doseedo_session_from_stems, and hits[] with the beat, bar and beat-in-bar each hit lands on — write the accent, stinger or change there. Handles 23.976 / 24 / 25 / 29.97 (";" = drop-frame) / 30 / 50 / 59.94 / 60 fps timecode. Pure math: free, instant, no key needed.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | Yes | The cue's tempo (20–300) — the map stays as close to it as the hits allow. | |
| fps | No | Frame rate of the timecodes: 23.976, 24, 25, 29.97, 30, 50, 59.94, 60. | |
| hits | Yes | The moments the music must land on: [{time_s} (seconds from the cue start) or {timecode: "01:00:12:08"} (film timecode, with fps and start_timecode), label?, land?}] — land = THIS hit's landing ("downbeat" or "beat"; default: the request's land), e.g. the big cuts on bar lines and a quick accent on a beat. A bare number = {time_s}. | |
| land | No | Land hits on bar lines (default) or on any beat — the default for every hit without its own land. | |
| start_s | No | Alternative: the cue start in seconds of film time (informational when hits are time_s). | |
| bpm_range | No | Allowed tempo range [min, max] (default ±12 % of bpm). | |
| start_timecode | No | Film timecode of the cue's first downbeat (bar 1); hit timecodes are measured from it. | |
| time_signature | No | Meter (default 4/4). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, but the description adds valuable context beyond them: 'Pure math: free, instant, no key needed,' supported timecode frame rates, and the exact shape of the returned tempo map and hit placements. This tells the agent about cost, speed, auth requirements, and output semantics that structured fields alone do not provide.
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 dense but front-loaded: the core action comes first, followed by output-usage guidance and timecode support. Every sentence contributes useful information, though the middle sentence is packed with several ideas at once.
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, but the description fully specifies what is returned: tempo_map [{beat, bpm}] and hits[] with beat, bar, and beat-in-bar placement. It also covers input flexibility, timecode handling, and downstream tool integration, leaving no material gap for an agent calling this tool.
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 100%, so the schema already documents all eight parameters. The description still adds meaning by explaining how hits can be bare numbers, objects with time_s or timecode, per-hit 'land' overrides, and how the tempo map stays near bpm but inside bpm_range. This is more than schema repetition and helps an agent assemble correct inputs.
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 ('turn HIT POINTS into a TEMPO MAP') and explicitly distinguishes the tool's role from siblings by naming the downstream consumers (doseedo_render_midi, doseedo_render_score, doseedo_session_from_stems). An agent can tell this is a scoring-to-picture tempo-mapping utility, not a generic renderer or beat-grid analyzer.
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 clearly establishes the use case ('Scoring to picture') and what inputs to supply, plus where the output goes next. It lacks explicit when-not-to-use guidance or direct comparison to alternatives like doseedo_beat_grid, but the context is strong enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_train_instrumentTrain a custom instrumentAInspect
Make a CUSTOM INSTRUMENT in your own sound: upload 30 s–3 min of ONE instrument playing (your own player, a rare or folk instrument, a prepared/invented instrument, a vintage synth) and doseedo trains a private adapter (LoRA) on its serving instrument model in about 1–2 minutes. After that, doseedo_render_midi {instrument: , lora_id} plays ANY notes you write in that sound. Several takes help (up to 8 files; the first 3 min are used, ≥8 s required); a clean, solo, dry recording works best. instrument = the closest catalog instrument — it picks the model voice the adapter trains on (a shamisen trains as acoustic_guitar, a whistle as flute: doseedo_instruments lists each one's call.instrument). The notes are transcribed for you (pass notes to skip that). 20 credits. Result: lora_id, name, the windows it trained on, loss first→last, and use (the render args). Earlier ones: doseedo_list_jobs {kind:"train_instrument"}. Owner-only: no one else can render with it. Async: job_id → doseedo_wait_task (~1–2 min). Cancel: the plane has no stop for a running training — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at the plane is refunded by the plane's own failure refund.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | No | Optional tempo of the recording (30–300). | |
| name | No | A name for it, e.g. "Grandpa's banjo" (≤80 chars). | |
| seed | No | Random seed. | |
| notes | No | Optional: the notes played, one list per file — [[{pitch, start, end, velocity?}…]] in SECONDS. Omitted, they are transcribed. | |
| steps | No | Training steps 50–800. Default 300 for ≤60 s of audio, 400 above. | |
| audio_key | No | R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). One recording; or audio_keys for several. | |
| audio_url | No | https URL of a recording (a doseedo result link — a separated stem works — or any public URL). Alternative to audio_key. | |
| drum_mode | No | true for an unpitched percussion recording. | |
| audio_keys | No | Several uploaded takes of the SAME instrument (≤8). | |
| audio_urls | No | Several recording URLs of the same instrument (≤8). | |
| instrument | Yes | REQUIRED. The catalog instrument it is closest to (call.instrument from doseedo_instruments, e.g. "violin", "acoustic_guitar", "flute", "percussion"). | |
| idempotency_key | No | Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses cost (20 credits), async job_id flow with ~1–2 min latency, owner-only rendering, transcription by default (skippable via notes), and unusually honest cancel semantics (no stop for a running training; it runs to completion and credits are spent, only plane-queued jobs are refunded). Annotations only say it mutates and is open-world, so this added context is substantial, though the 'queued at the plane' refund rule is slightly ambiguous in phrasing.
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?
Dense but front-loaded: the core action and requirements come first, then result shape, then async/cancel details. A couple of the semicolon-chained asides (refund nuance, transcription note) are compressed to the point of near-illegibility, and the cancel paragraph is lower value than the setup guidance.
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 12-parameter async job tool with no output schema, the description covers the full lifecycle an agent needs: how to supply audio, how to choose instrument, default transcription, cost, result fields (lora_id, name, trained windows, loss first→last, and the ready-made `use` render args), waiting, and failure/refund behavior. 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 100%, so the baseline is 3, but the description adds real meaning the schema cannot: that instrument selects the model voice the adapter trains on (shamisen trains as acoustic_guitar, whistle as flute) and that notes are auto-transcribed unless supplied. This is genuine interpretive value, not restatement.
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 — training a private LoRA adapter on the serving instrument model from uploaded audio — and immediately links the result to doseedo_render_midi, which clearly separates it from the rendering sibling. No ambiguity about what is produced (a lora_id usable in that sound).
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 input requirements (30 s–3 min, one solo dry instrument, up to 8 takes, first 3 min used, ≥8 s each), tells the agent how to pick the instrument (call doseedo_instruments, pick the nearest catalog voice, with concrete mappings), and routes to doseedo_list_jobs for prior runs and doseedo_wait_task for completion. This is when-to-use guidance with alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doseedo_wait_taskWait for a jobARead-onlyIdempotentInspect
Wait for an async doseedo job to finish: polls server-side for up to timeout_seconds (5–50; one call can never hold longer than 50 s), then returns the result or the latest status. If it returns still_running:true, call it again — a submit reply's eta_seconds says how long the whole job usually takes (transcribe ~15 s, a render 1–3 min, audio_to_session ~4 min), so a 3-minute job is three or four calls, not one. A finished job answers with its output, artifacts (pre-signed links) and note.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which job kind created the task — the registry name the submit reply carried (generate_music, generate_sound, cover_stem, fill_gap, render_midi, train_instrument, render_score, mix, session_from_stems, spot_video, score_to_picture, cover_song, separate_stems, transcribe, audio_to_session, convert_project, bounce_session, analyze_song, detect_chords, beat_grid, check_take, analyze_midi); the short codes (generate, sound, coverstem, fillgap, render, train, score, stemsess, spot, picture, cover, separate, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases. | |
| job_id | No | Alternatively the job_id (job_…) from a submit tool or the jobs API — replaces task_id + kind. | |
| task_id | No | The task_id returned by a submit tool. | |
| timeout_seconds | No | Max seconds to wait in this call (5–50, default 45). Start with the submit reply's suggested_next_wait. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly/idempotent/non-destructive, so the description correctly spends its words on the long-poll mechanics the annotations can't convey: the hard 50 s server-side cap, the still_running flag contract, and what a finished job returns (output, pre-signed artifact links, note). It does not say what happens on job failure, cancellation, or timeout expiry with no result, which is the main behavioral gap.
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 action and the cap, then the retry rule, then the return shape — a logical order with no filler sentences. The parenthetical duration lists for transcribe/render/audio_to_session are useful but dense enough that the sentence becomes slightly hard to scan.
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?
With no output schema, the description carries the return contract itself and does so (output, artifacts, note, still_running), plus the polling cap and retry pattern — enough to invoke it correctly. Failure modes and the check_task alternative are the notable omissions for a tool in a family with cancel_job and check_task siblings.
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 100%, so the baseline is 3. The description restates timeout_seconds' 5–50 bound and the 'call it again' loop, and the schema itself documents the job_id-replaces-task_id+kind relationship; the description adds no new parameter meaning beyond that.
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 ('Wait for an async doseedo job to finish') plus the mechanism (server-side polling) and the return contract (result or latest status). It is clearly distinguishable from submit tools, but it never names the near-identical sibling doseedo_check_task, so the agent must infer the wait-vs-poll distinction itself.
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?
Strong guidance on the repeat-call pattern: 'If it returns still_running:true, call it again,' with eta_seconds from the submit reply as the budgeting heuristic and concrete duration examples. What is missing is the exclusion case — when to use doseedo_check_task instead, or how this interacts with doseedo_cancel_job.
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.
20 tool updates
- First observed
doseedo_account - First observed
doseedo_analyze_midi - First observed
doseedo_cancel_job - First observed
doseedo_check_take - First observed
doseedo_check_task - First observed
doseedo_generate_sound - First observed
doseedo_get_upload_url - First observed
doseedo_instruments - First observed
doseedo_list_jobs - First observed
doseedo_mix - First observed
doseedo_quote - First observed
doseedo_recipes - First observed
doseedo_render_midi - First observed
doseedo_render_score - First observed
doseedo_score_to_picture - First observed
doseedo_session_from_stems - First observed
doseedo_spot_video - First observed
doseedo_tempo_map - First observed
doseedo_train_instrument - First observed
doseedo_wait_task
Related MCP Connectors
Score video & make music as an agent: 50+ AI instruments play your MIDI, audio, stems, Logic/Ableton
Autonomous music production for AI agents with MIDI generation, QC and provenance.
Free, copyright-safe AI music library for video creators and AI agents.
Deterministic music theory for agents: analyze, voice, reharmonize, conduct — computed, not guessed
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAI-assisted sheet music transcription and notation workflow via Agent and MCP.1Apache 2.0
- FlicenseNot gradedqualityAmaintenanceAnalyzes video footage to detect mood, energy, pace, speech, and scene cuts, then returns license-safe royalty-free/CC BGM shortlists with hook windows, beat-synced cut suggestions, and ffmpeg ducking and mix specs. Lets agents preview mixes and export ready-to-render specs with attribution printed on every recommendation.-

AINSOF MCP Serverofficial
AlicenseNot gradedqualityAmaintenanceEnables AI assistants to search a curated production-music catalogue by brief or reference link, listen to full previews, and score videos with synced music, plus retrieve stems, versions, and cue sheets for licensing.MIT- FlicenseNot gradedqualityAmaintenanceEnables agents to ingest video or URLs, analyze mood, pace, speech, and scene cuts, and return ranked license-safe BGM recommendations with hook windows, beat/cut suggestions, and ffmpeg ducking or mix specs.-
Glama MCP Gateway
Add one secure layer between your agents and this server.