Skip to main content
Glama

Doseedo: Film Scoring, AI Instruments, Sound Effects & Stems

Server Details

Score video & make music as an agent: 50+ AI instruments play your MIDI, audio, stems, Logic/Ableton

Ownership verified
Status
Healthy
Uptime
4.6% over 71 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
ChatGPT
–
Claude
–

TDQS

A4/5.0

Scored across 47 tools

Disambiguation4/5

Despite heavy overlap in families (render_midi vs render_score vs generate_music, cover_song vs cover_stem vs fill_gap, analyze_song vs beat_grid vs detect_chords vs analyze_midi, separate_stems vs split_soundtrack), the descriptions repeatedly say which tool is wrong and which to use instead, making boundaries legible. A few pairs still risk misselection (check_task vs wait_task vs list_jobs; session vs project upload flows).

Naming Consistency4/5

Almost all tools follow doseedo_verb_noun snake_case (render_midi, separate_stems, score_to_picture, split_soundtrack), which is predictable. Minor deviations exist: noun-only names (account, instruments, recipes), verb-only (quote, mix), and a longer compound (complete_project_upload).

Tool Count3/5

47 tools is a lot, though the scope genuinely spans spotting, tempo maps, rendering, mixing, stems, DAW conversion, sessions, uploads and job management. Several tools could be folded together (check_task/wait_task/list_jobs; get_upload_url/get_project_upload_url/complete_project_upload), so the surface feels heavier than necessary.

Completeness4/5

The lifecycle is covered end to end: upload, quote, generate/render, analyze, mix, build sessions, download, convert, cancel, wait and delete sessions. Minor gaps remain — no tool to list or delete uploaded artifacts/results, and no session rename/duplicate — but no obvious dead ends for the core film-scoring workflows.

Available Tools

47 tools
doseedo_accountAccount and creditsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_add_audio_to_sessionAdd audio to a sessionA
Idempotent
Inspect

Add an audio file to a session — from a public URL (a doseedo-generated song, a separated stem, any https audio) OR from a LOCAL file you uploaded (doseedo_get_upload_url → PUT the bytes → pass the returned audio_key here). Ingested server-side and returned as a sha256 you then use: place it on a track with attach_audio, or load it into a Quick Sampler with load_quick_sampler_sample {track_id, sample_path: ""} (bakes into the exported .logicx, no desktop needed — the drum-pack/sample-swap path). Give audio_url OR audio_key.

NameRequiredDescriptionDefault
filenameNoOptional name for the asset.
audio_keyNoaudio_key from doseedo_get_upload_url after you PUT a local file to its upload_url (a file from the user's disk, e.g. a drum-pack WAV).
audio_urlNohttps URL of the audio — any public URL, or a doseedo result URL from a job (pre-signed links work as-is; no key needed).
session_idYes

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that ingestion is server-side and that the return value is a sha256 handle, then shows exactly how that handle is consumed (attach_audio, or load_quick_sampler_sample with sample_path set to the sha). It also clarifies the 'no desktop needed' baking behavior into the exported .logicx, which is real behavioral context not implied by readOnlyHint=false or idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded paragraph that opens with the action and the two input modes before diving into downstream usage. Heavily parenthesized and dense, but every clause carries information; minor tightening would help readability without losing content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, and the description compensates by explaining that the result is a sha256 and how to use it, plus the ingestion model. Remaining gaps are small: whether session_id must reference an existing session, and whether re-ingesting the same file is deduplicated given idempotentHint=true.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and the schema itself describes audio_key, audio_url, and filename. The description adds the crucial mutual-exclusivity rule (audio_url OR audio_key) and the workflow that produces audio_key, which the schema does not state. session_id semantics remain unexplained in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource: 'Add an audio file to a session', immediately split into the two supported sources (public https URL vs. local file via audio_key). It also names the downstream consumers (attach_audio, load_quick_sampler_sample) so the agent understands where the result goes. It does not distinguish this from the near-identical sibling doseedo_audio_to_session, which an agent would have to guess between.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit conditional guidance: 'Give audio_url OR audio_key', with the local-file path spelled out as doseedo_get_upload_url → PUT bytes → pass audio_key. It also states pre-signed result URLs work as-is with no key. What's missing is any when-not guidance or a note on choosing this tool over its sibling.

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.

NameRequiredDescriptionDefault
bpmNoTempo of the notes (needed with notes; default 120).
modeNo"midi" (default): sonority / shape factoring. "chord": chord symbols per segment + cell cover.
notesNoThe notes to analyze, in beats from bar 1 (same rows as doseedo_render_midi). Needs bpm.
midi_urlNoAlternative to notes: https URL of a Standard MIDI File (≤2 MiB).
min_seg_beatsNomode midi: shortest sonority segment in beats (default 0.25).
time_signatureNoMeter of the notes, e.g. "4/4" (default).
idempotency_keyNoOptional. 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_segmentNomode chord: segment length in beats (0.25–8, default 2).

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_analyze_songAnalyze a songAInspect

Key detection, BPM/tempo detection, song structure and chords — musical analysis of a recording in one call: key (e.g. "D minor"), bpm + per-beat tempo_map, meter / beats_per_bar, downbeats (seconds), sections (intro/verse/chorus… with times), chords (a progression on the beat grid), dynamics, and cues: the pieces a recording holds (a film's temp: each piece's start, end, tempo, key and level). USE THIS to learn the key and tempo of a reference before writing a part — never guess or ask the user for what the audio already says. Pass audio_key (an upload) or audio_url (a result URL from another job as returned, or any public https URL). Up to 10 minutes of audio is analyzed. Synchronous (~5–20 s): the result is in this response. No separation, so a dense mix's chords are a draft — for a chord chart from stems use doseedo_detect_chords on the separated stems. Cancel: not applicable — the result is returned in the submit response; the job is already finished.

NameRequiredDescriptionDefault
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio (a doseedo result URL as returned, or any public URL). Alternative to audio_key.
idempotency_keyNoOptional. 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

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only carry the generic profile (readOnlyHint=false, openWorldHint=true, destructiveHint=false, idempotentHint=false). The description adds genuinely non-derivable behavior: a 10-minute audio cap, synchronous execution with ~5–20 s latency and results in the submit response, no source separation so dense-mix chords are only a draft, and that cancellation does not apply because the job is already finished.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the capability and output list, then the directive usage sentence, then input dorks — a sensible order. It is dense and dash-heavy, and the closing cancellation sentence is somewhat expendable, 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.

Completeness5/5

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 has to describe returns — and it does, in detail: key string example ('D minor'), tempo_map granularity (per-beat), downbeats in seconds, sections with times, chords on the beat grid, cues with start/end/tempo/key/level. Combined with the input guidance and latency/limits, an agent has everything needed to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 selection semantics the schema does not spell out as clearly: audio_key is 'an upload' while audio_url can be 'a result URL from another job as returned, or any public https URL.' The idempotency_key parameter is not mentioned in the description, though the schema documents it adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb stack and resource — 'Key detection, BPM/tempo detection, song structure and chords... musical analysis of a recording in one call' — then enumerates the exact outputs (key, bpm, tempo_map, meter, downbeats, sections, chords, dynamics, cues). It also distinguishes itself from the closest sibling by name: doseedo_detect_chords is for chord charts from separated stems, this is for one-call analysis of a mix.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use: 'USE THIS to learn the key and tempo of a reference before writing a part — never guess or ask the user for what the audio already says.' Explicit alternative and exclusion: 'for a chord chart from stems use doseedo_detect_chords on the separated stems,' plus 'Cancel: not applicable' to steer the agent away from doseedo_cancel_job. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_audio_to_sessionAudio → DAW sessionAInspect

Turn an uploaded full mix into a complete multitrack DAW session (separated stems as tracks, tempo map, optional per-stem MIDI and chord guide). The result is a downloadable session zip for Logic Pro or Ableton. Async: returns a job_id — poll with doseedo_wait_task (~4 minutes). Cancel: cooperative — the build stops at its next stage boundary and the build's sound-tool unit is refunded (a GPU separation already run stays charged).

NameRequiredDescriptionDefault
keyNoDetect the key and write it into the project (default true in the full build, false with simple).
nameNoProject name for the session file — it also names the download: <name>_session.zip.
loopsNoDetect repeated clips and lay them as loops (default false).
chordsNoAdd a detected-chords guide track (default false).
retuneNoDefault true: a mix sitting >35 cents off A440 is pitch-corrected onto the 12-TET grid before separation (every transcriber coin-flips otherwise). false = leave the tuning as recorded.
simpleNoFaster minimal build: meter + tempo + stems only, no MIDI (default false). Required for stem_mode orchestra/detect.
targetNoDAW target (default logic).
markersNoAdd section markers (intro/verse/chorus…) (default true in the full build, false with simple).
dereverbNoOpt-in: lay DRY stems and recreate the room with a reverb plugin on each track (default false).
separateNofalse = no separation: the mix lands as ONE audio track (default true).
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio, as an alternative to audio_key: a doseedo result URL exactly as a job returned it (a stem, a take, a bounce), or any public URL. The gateway fetches it (≤256 MB) into your account's ingest storage before the job starts. Pass audio_key OR audio_url.
stem_modeNoSeparation family. auto (DEFAULT): the 6 stems plus a residual cascade that peels detected orchestral sections out of "other" (no orchestral content → identical to 6stem). 6stem: vocals/drums/bass/guitar/piano/other. drumsep: the drum stem replaced by isolated kick/snare/hh/… tracks on a Drums bus. sections: the 6 stems with "other" split by the joint section model (trumpet/trombone/sax/violin/viola/cello), each transcribed per chair. orchestra / detect: the 53-instrument bank on the MIX (needs simple:true; detect auto-picks, orchestra takes `instruments`).
tempo_mapNofalse = one constant tempo instead of a tempo map (default true).
midi_stemsNoOptional comma-separated stems to also add as MIDI tracks, e.g. "piano,bass" (include "drums" for a GM drum roll).
instrumentsNostem_mode orchestra/detect: optional comma list restricting the orchestral set, e.g. "violin,cello,flute".
crop_silenceNoPunch regions in where each stem plays instead of whole-length stems (default false).
drum_samplerNoSampled kits → a one-shot sampler track + MIDI (default false).
guitar_splitNoSplit the guitar stem into N players, each its own track + MIDI lane on a Guitar Section bus: "0" (off), "auto" (DEFAULT — a one-vs-two probe decides), "2"–"4".
drum_substemsNoLay each drum piece as its own audio track on a Drums bus (default false; implied by stem_mode drumsep).
quantize_midiNoSnap every pitched MIDI lane: "grid" = to the grid its own onsets support (straight/swing 8ths, 16ths, triplets, detected per lane); "score" = notation positions (straight 8ths). Default off (played timing).
drum_midi_splitNoWith "drums" in midi_stems: one Quick Sampler track PER kit piece, each loaded with a synthesized one-shot (default false = one GM drum-roll track).
idempotency_keyNoOptional. 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.
keep_stem_audioNoWith midi_stems: keep the audio stem next to its MIDI track (default true); false = the MIDI track REPLACES the audio.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnly=false, openWorld=true, idempotent=false, destructive=false; the description goes further by explaining the async job_id flow, approximate runtime, downloadable session-zip result, and cooperative cancellation with partial refund/charge behavior. That is exactly the kind of operational context annotations cannot express, with no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the output and then the async/cancel mechanics; no filler. Every sentence contributes either the deliverable, the polling instruction, or cancellation/refund behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter tool with no output schema but complete schema descriptions and annotations, the description covers the essential contract: input is a full mix, output is a session zip, execution is async, and cancellation has billing consequences. It is complete enough for correct invocation, even though sibling differentiation remains implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are highly detailed, so the baseline is 3; the description only summarizes the output (stems, tempo map, MIDI, chords) and does not add syntax or default semantics beyond the input schema. No parameter-specific guidance is needed here, but none is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: turns an uploaded full mix into a complete multitrack DAW session, and lists the delivered artifacts (stems, tempo map, optional MIDI/chord guide) plus the downloadable zip. It does not distinguish this from siblings such as doseedo_session_from_stems or doseedo_separate_stems, so an agent must infer when this full-build path is preferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives operational guidance for the async job (poll with doseedo_wait_task, ~4 minutes) and cancellation semantics, but never states when to use this tool instead of related siblings (e.g., already-separated stems vs. a full mix, or stems-only workflows). Usage is implied by 'uploaded full mix' but not explicitly scoped with exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_beat_gridBeat grid (BPM & beat detection)AInspect

Beat detection / beat tracking: bpm, beats[] (seconds), downbeats[] (seconds), beats_per_bar, downbeat_offset, beat_map[{t, pos}], duration — the grid to place a part against a recording (beat n is at beats[n] seconds). Pass audio_key (an upload) or audio_url (a result URL from another job as returned, or any public https URL). Up to 10 minutes of audio is analyzed. Synchronous (~3–15 s). For key + sections + chords as well use doseedo_analyze_song. Cancel: not applicable — the result is returned in the submit response; the job is already finished.

NameRequiredDescriptionDefault
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio (a doseedo result URL as returned, or any public URL). Alternative to audio_key.
idempotency_keyNoOptional. 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

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: synchronous execution with a stated latency window, a 10-minute audio cap, and the fact that results come back in the submit response rather than via polling. It does not mention credit/cost implications (doseedo_quote exists as a sibling) or file size/format constraints, which is the main remaining gap for a paid, open-world submit call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the output contract, then inputs, then limits and the sibling alternative — every clause is functional. The output-field enumeration is dense and slightly run-on, but it earns its space given the absence of an output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 documents the return shape, and it covers the input alternatives, duration limit, synchronous timing, and the terminal-state caveat. An agent can call this and interpret the result without consulting anything else.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both audio parameters and idempotency_key are already documented. The description restates the either/or relationship between audio_key and audio_url and notes the public-URL case, but adds little syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific operation (beat detection / beat tracking) and enumerates the exact outputs it produces (bpm, beats[], downbeats[], beats_per_bar, beat_map, duration), plus a concrete usage framing: 'the grid to place a part against a recording'. It also differentiates itself from the closest sibling by routing full analysis to doseedo_analyze_song.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit about inputs (audio_key vs audio_url), the 10-minute audio limit, synchronous ~3–15 s behavior, and the alternative to use when key + sections + chords are also needed. It even resolves a question an agent would otherwise have to guess at: cancellation is not applicable because the job is already finished.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_bounce_sessionBounce a sessionAInspect

Bounce a session (or specific tracks) to audio through their REAL plugin chains, offline — Dø Desktop renders them in the background WITHOUT the user opening the DAW (live via Logic if it's open, headless if it isn't; this is the thing stock DAWs can't do). Headless renders AUDIO tracks only — an instrument/MIDI track needs the project open in Logic. A track that could not render is named in the error with its reason. Async: returns a job_id — poll with doseedo_wait_task. The result is downloadable stem URLs. Needs Dø Desktop to run at some point to pick up the job; until then it stays queued. No credits (rendered on the user's machine). Cancel: a bounce still queued never renders (its budget is refunded); one mid-render has its result dropped on arrival.

NameRequiredDescriptionDefault
stemsNotrue (default) = one file per track; false = a single mixdown.
formatNoOutput format (default wav).
track_idsNoTracks to bounce (t_… ids from doseedo_get_session). Omit to bounce the whole session.
session_idYes
tail_secondsNoExtra seconds for reverb/delay to ring out (default 2).
idempotency_keyNoOptional. 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

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the annotations: async job_id return, queued-until-desktop-picked-up state, no credits because rendering is local, named failing tracks with reasons, and detailed cancel semantics including refunds and dropped mid-render results. These are exactly the operational details an agent needs before invoking a long-running mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded: the main action and offline/real-plugin distinction come first, followed by constraints and async behavior. The long parentheticals and cancellation detail make it slightly heavier than necessary, though nearly every sentence carries useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex async render tool with no output schema, the description covers the missing pieces: return shape (job_id, later stem URLs), polling tool, queueing dependency on Dø Desktop, track-render limitations, billing, and cancellation behavior. An agent has enough information 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already high at 83%, so most parameter meaning is provided structurally. The description reinforces that track_ids can target specific tracks and that results are downloadable stem URLs, but it does not explain format, tail_seconds, or idempotency_key beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Bounce a session (or specific tracks) to audio') and distinguishes it from generic DAW rendering by explaining that it uses real plugin chains offline. It also differentiates from siblings implicitly by noting that headless renders are audio-only and that instrument/MIDI tracks require Logic open.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: offline background rendering via Dø Desktop, headless audio-only limitation, need for Dø Desktop to pick up the job, and polling with doseedo_wait_task. It does not explicitly name alternative sibling tools such as doseedo_mix or doseedo_render_midi, so it stops short of full when-to-use alternative routing.

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 jobA
DestructiveIdempotent
Inspect

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).

NameRequiredDescriptionDefault
job_idYesThe job_id from a submit tool or doseedo_list_jobs.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
bpmNoTempo of the notes (or tempo_map).
notesNoThe notes the take should play, in beats from bar 1 (the rows you sent doseedo_render_midi).
midi_urlNoAlternative to notes: the part as a Standard MIDI File (≤ 2 MiB).
audio_keyNoR2 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_urlNoThe take: a doseedo result URL as returned, or any public https URL.
tempo_mapNoTempo changes [{beat, bpm}].
instrumentNoThe instrument (a drum/percussion name switches to onset-only matching).
time_signatureNoMeter (default 4/4).
idempotency_keyNoOptional. 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_msNoHow far a heard onset may be from the written one and still count (default 50).

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 jobA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
kindNoWhich 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, reframe_video, cover_song, separate_stems, split_soundtrack, 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, reframe, cover, separate, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases.
partsNoOptional, on a finished job: the parts to return in full, by name (as the result names them) or index — e.g. ["Oboes", "Timpani"].
job_idNoAlternatively the job_id (job_…) from a submit tool or the jobs API — replaces task_id + kind.
task_idNoThe task_id returned by a submit tool.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive, open-world), and the description adds genuinely non-obvious behavior: large results are truncated to a 'brief' with rows cut to deciding fields, and specifying parts expands them. It does not mention error/failed states or whether the task record persists after completion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, but the second sentence is a dense run-on packed with unexplained domain jargon ('a mix part's strip, rides (every point) and loudness') that costs more parsing effort than it returns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter read-only check tool with no output schema, the description covers the return shape and the brief/full-result dichotomy well. The main gap is the absence of failure-state handling and any statement that either job_id or task_id+kind is needed, which the agent must infer from annotations and schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description mostly restates what the schema says ('parts returns those rows IN FULL', job_id replacing task_id + kind), though it does add some meaning by explaining what 'full' entails for render_score and mix parts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Check an async doseedo task once') plus what the reply contains (status, result file URLs/notes). The word 'once' implicitly contrasts with the polling/blocking sibling doseedo_wait_task, but it never names that sibling, so the differentiation is inferential rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: you check a task returned by a submit tool, repeatedly if polling. There is no explicit when-to-use versus doseedo_wait_task or doseedo_list_jobs, and no guidance on retry cadence or what to do on a failed status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_complete_project_uploadComplete a project uploadA
Idempotent
Inspect

Finish a MULTIPART project upload started by doseedo_get_project_upload_url: pass every uploaded part's number and ETag (from the PUT response header; quotes optional). Returns the project_key to pass to doseedo_convert_project / doseedo_import_project. All parts except the last must be the same size (what split -b produces). abort:true discards the upload instead.

NameRequiredDescriptionDefault
abortNotrue = abandon the upload and free its parts (no project_key results).
partsNo[{part_number, etag}] for EVERY part, in order.
upload_idYes
project_keyYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the ETag provenance ('from the PUT response header; quotes optional'), the part-size rule ('all parts except the last must be the same size'), and the abort semantics. Minor gap: it doesn't say whether retrying with the same upload_id is safe, even though idempotentHint=true is declared, and abort's relationship to destructiveHint=false could be clearer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the identity of the operation, then parameter guidance, then the abort alternative. No filler and no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the workflow position, the required part metadata, the size constraint, the abort path, and the return value ('the project_key'), which matters since no output schema exists. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 50% schema description coverage, the description compensates by explaining what the parts array must contain ('every uploaded part's number and ETag'), where the ETag comes from, and what abort does. upload_id and project_key remain undocumented in both places, so it isn't fully complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Finish a MULTIPART project upload'), ties it to the initiating sibling doseedo_get_project_upload_url, and names the downstream consumers (doseedo_convert_project / doseedo_import_project). An agent can place it precisely in the upload workflow 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says this is the step after doseedo_get_project_upload_url and before convert/import, and names the escape hatch ('abort:true discards the upload instead'). When-to-use and the alternative path are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_convert_projectConvert a DAW project (DAW converter)AInspect

DAW CONVERTER: a project rebuilt natively in the target: tracks, MIDI, audio clips, tempo and markers arrive editable (Logic/Ableton/Pro Tools/REAPER pairs also automation, buses/sends, plugin state; into FL 3rd-party plugins only). Sources: Logic .logicx, Ableton .als, FL Studio .flp, Pro Tools .ptx, REAPER .rpp, Cubase .cpr, Dorico .dorico/.musicxml, Studio One .song, GarageBand .band (SOURCE only — zip the .band package like a .logicx; a GarageBand 6 project must be re-saved in GarageBand 10), Bitwig = any .dawproject (Bitwig/Studio One/Cubase export it; a native .bwproject is refused — File > Export… > DAWproject in Bitwig). The enum lists the exact pairs. ★ ASYMMETRIC TARGETS (an undocumented native file is never written): TO Cubase, Studio One or Bitwig = ONE .dawproject the app imports, not a .cpr/.song/.bwproject; TO Dorico = MusicXML (.mxl, Dorico's own notation import), not a .dorico. FROM Cubase the .cpr carries tracks, tempo and MIDI parts but not the audio pool (audio tracks arrive empty). FROM Dorico a .dorico carries players and flows but NOT its notes: convert its MusicXML export instead (.musicxml/.mxl accepted under dorico2*). Every result carries a transfer REPORT: report, lossy, summary[] (what changed), warnings[] (read before opening) — relay them; silence is never "lossless". Upload first: doseedo_get_project_upload_url + PUT (zip a project FOLDER so its audio travels; a bare project file works too; multipart past ~4 GB). Directions: "2"; "auto2" detects the source; "2" rebuilds Logic/Ableton/FL/REAPER/Pro Tools in place (e.g. options.third_party_plugins:"disable"). To EDIT a project use doseedo_import_project; to convert a session the tools built: doseedo_download_session → upload that zip → logic2 (not a session_id). Async: job_id → doseedo_wait_task (15 s–2 min; stage); file is a direct storage link. Cancel: no stop — it completes, the job ends canceled, output discarded; the credit is refunded only when the conversion itself fails.

NameRequiredDescriptionDefault
optionsNoConversion options (all optional). third_party_plugins:"disable" drops third-party AU/VST devices so the export opens clean on a machine without them; stock_plugins:"disable" leaves stock devices unmapped instead of mapping to the nearest target-DAW device; carry_plugin_presets:false strips plugin patches; lossless:true (→Logic) pins the project to the MAX clip sample rate so no clip is downsampled; project_rate (→Logic) pins an exact rate in Hz; silence_empty_sampler:false (→Logic) keeps Logic's audible default Quick Sampler on tracks whose sampler had no sample; source_name = the project's display name for the output file.
directionYesSource and target as "<source>2<target>" (logic | ableton | fl | protools | reaper | cubase | dorico | studioone | bitwig | garageband | aaf), "auto2<target>" to let the server detect the source, or "<daw>2<daw>" to rebuild in the same format (Logic/Ableton/FL/REAPER/Pro Tools only). cubase2* reads a .cpr and *2cubase writes a .dawproject (Cubase 14+/Nuendo open it natively). dorico2* reads a .dorico, .musicxml or .mxl and *2dorico writes MusicXML (.mxl). studioone2* reads a .song and *2studioone writes a .dawproject (Studio One 6.5+ imports it). bitwig2* reads any .dawproject and *2bitwig writes a .dawproject (Bitwig 5+ imports it). garageband2* reads a zipped .band package (source only — no *2garageband). aaf2* reads an AAF (Pro Tools / Logic / Resolve / Premiere export) — zip the .aaf with its audio files so clips relink by name; audio only, every clip unwarped at its exact time, no *2aaf or aaf2dorico.
project_keyYesR2 key of the uploaded project (from doseedo_get_project_upload_url / POST /api/upload/r2/signed-url; starts with "uploads/").
idempotency_keyNoOptional. 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

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only saying non-readonly, non-destructive, open-world, the description adds substantial behavioral context beyond them: asynchronous job lifecycle, the transfer REPORT fields (`report`, `lossy`, `summary[]`, `warnings[]`), asymmetric target formats (Cubase/Studio One/Bitwig → .dawproject, Dorico → MusicXML), known lossiness (Cubase .cpr lacks audio pool, Dorico .dorico lacks notes), and the credit-refund rule. None of this contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, but the remainder is a single dense paragraph of parenthetical clauses where critical operational steps (upload flow, async waiting, cancel/refund) are buried mid-text rather than surfaced. Every sentence carries information, but the lack of structure makes it harder to scan than its length warrants.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, high-variance conversion tool with no output schema, the description covers input prep, direction semantics, target-format asymmetries, expected report fields, async handling, and failure/refund behavior. An agent has everything needed to invoke it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 operational meaning beyond the schema for project_key — zip a project folder so audio travels, a bare file also works, multipart past ~4 GB — and names the exact direction string pattern and per-family asymmetry. It does not, however, add much to the options object that the schema doesn't already spell out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with 'DAW CONVERTER: a project rebuilt natively in the target' — a specific verb and resource — and enumerates exactly what travels (tracks, MIDI, audio clips, tempo, markers, plus automation/buses/plugin state for certain pairs). It explicitly distinguishes itself from doseedo_import_project (editing) and from session-based conversion, so an agent can tell it apart from siblings 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: 'To EDIT a project use doseedo_import_project; to convert a session the tools built: doseedo_download_session → upload that zip → logic2<target> (not a session_id).' It also states the prerequisite ('Upload first: doseedo_get_project_upload_url + PUT'), the async follow-up (job_id → doseedo_wait_task), and the no-stop cancel semantics, 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_cover_songCover a songAInspect

AI COVER / style transfer of a whole song: re-render an uploaded song as a cover, keeping its structure/melody while changing timbre, instruments, or lyrics. INSTRUMENT SWAP: instruments {"piano": "electric_guitar"} separates the song, transcribes the swapped stem and re-plays THOSE transcribed notes on the target instrument; by default only the swapped stem(s) are regenerated and every other stem passes through as the original separated audio (regen changes that). Because the swap replays a transcription, small note differences from the source are expected — verify from result.cover.instrument_swaps (applied or why not), and offer the user the result/takes to judge rather than promising a note-perfect copy. Target ids: GET https://api.doseedo.com/api/instruments (open). Optionally export a DAW session too. Async: returns a job_id — poll with doseedo_wait_task (several minutes for full songs). Result files are pre-signed links: 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.

NameRequiredDescriptionDefault
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
seedNoOptional random seed for reproducibility.
genreNoOptional GENRE style transfer: the target genre in a few words, ≤ 64 characters (e.g. "bossa nova", "80s synth-pop", "West End musical showstopper") — a name, not a description; a longer one is cut at its last comma or word that fits, with a warning on the reply. Every regenerated stem is captioned with it. Outcome in result.cover.genre.
regenNoOptional: which stems to regenerate. Default with a swap = only the swapped stems (the rest are the original separated audio). "all" = cover every stem; or a comma list of stems/instruments, e.g. "piano,other" (a swapped stem is always regenerated).
exportNoOptionally also build a DAW session for this target.
labelsNoOptional identity CORRECTIONS {source: instrument}, same shape as instruments, e.g. {"other": "trumpet"} when the separation mislabels a stem. Only fixes what the stem is called (caption/timbre); nothing is re-played. Outcome in result.cover.stem_labels.
lyricsNoOptional replacement lyrics.
swap_cnsNoOptional 0–1, only with instruments: how far the SWAPPED stems may depart from their source (overrides cover_noise_strength for them; server default 0.35). Lower = closer to the original timing/feel.
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio, as an alternative to audio_key: a doseedo result URL exactly as a job returned it (a stem, a take, a bounce), or any public URL. The gateway fetches it (≤256 MB) into your account's ingest storage before the job starts. Pass audio_key OR audio_url.
midi_onlyNoOptional: re-perform every regenerated stem from its transcribed MIDI with NO timbre from the recording (the stem's own sound is dropped). Stems with nothing to render are skipped (result.cover.midi_only.skipped).
style_keyNoOptional ingest key (upload it first) of a reference MIX whose TIMBRE the regenerated stems take on (style transfer).
drum_splitNotrue = explode the covered drums into isolated kick/snare/hh/… stems, each generated from its own slice of the drum roll (result.drum_stems).
instrumentsNoOptional per-stem instrument SWAP map {source: target}, e.g. {"piano": "electric_guitar", "sax": "violin"}. Source = a stem (drums, bass, vocals, guitar, piano, other) or a detected instrument (sax, trumpet…); target = an instrument id from /api/instruments (an unknown target is refused up front).
guitar_splitNoDeal the guitar bucket into N players, each its own row/swap: "2"–"4", or "auto" (a one-vs-two probe decides). Outcome in result.cover.guitar_split.
structure_keyNoOptional ingest key of audio whose STRUCTURE codes replace the source's (the Cover page's "Structure: custom").
timbre_presetNoOptional named timbre preset — the fallback rung of the timbre ladder (stem latent > this > stock bank).
idempotency_keyNoOptional. 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.
cover_noise_strengthNoOptional 0–1 fidelity dial: higher departs further from the source.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true) by disclosing that the swap replays a transcription so small note differences are expected, that only swapped stems regenerate by default, that cancel refunds credits only if the render has not reached the GPU, and that result links are pre-signed and valid 24h with no auth header. This is exactly the kind of cost/irreversibility/workflow 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the instrument-swap caveat are front-loaded, and the dense run-on later sentences (cancel/credit semantics, download instructions) each carry actionable information. It is heavy for a single paragraph and could be broken with line labels, but little is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 19-parameter async generation tool with no output schema, the description covers job lifecycle, polling, result delivery, verification and cancellation thoroughly. Minor gaps remain: it does not describe the shape of the eventual result beyond result.cover.instrument_swaps, and does not mention how name collisions or take re-runs should be handled beyond the schema's own note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with rich per-parameter text, so the baseline is 3. The description adds genuine cross-parameter meaning for the instruments/regen interaction (swap separates, transcribes and replays the target stem while others pass through) that the individual schema entries do not fully state, but the bulk of parameter semantics lives in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('AI COVER / style transfer of a whole song: re-render an uploaded song as a cover') and names the two operating modes (timbre/instrument/lyric change, instrument swap). The 'whole song' framing implicitly separates it from the sibling doseedo_cover_stem without the agent needing to open a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong operational context: poll with doseedo_wait_task, several minutes for full songs, default regen behavior for swaps, and the instruction to verify from result.cover.instrument_swaps rather than promise a note-perfect copy. It stops short of an explicit 'use cover_stem instead when you only need one stem' routing statement, leaving sibling selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_cover_stemCover a stem on another instrumentAInspect

TIMBRE TRANSFER (an instrument swap) from a recording: hum or whistle a melody, play it on a kazoo, take a guitar line — and get it back played by a cello, a trumpet, a koto (any doseedo_instruments call). Re-play ONE recorded part — a separated stem, a solo, a region of the user's session — on another instrument, straight from the audio: the recording's FSQ codes carry its structure into a take generated from noise, and the sound is the instrument's (caption + timbre_preset) — the FSQ + timbre combination the cond5 model was trained on (served on its turbo graft). No MIDI by default (midi:true adds the server's own pitch roll of the recording); fidelity > 0 also keeps that much of the recording's own latents (closer, but its sound leaks back in). For the exact notes, transcribe and doseedo_render_midi; a whole mix → doseedo_cover_song. result.recipe says what reached the model (fsq, timbre, cns). Async: job_id → doseedo_wait_task (~30–90 s) → takes[{url}] (pre-signed: curl -OJ, no auth header, 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.

NameRequiredDescriptionDefault
bpmNoThe recording's tempo (a hint; default 120).
fsqNofalse = leave the recording's FSQ codes out: the take follows the server's note roll (needs midi: true) on the instrument's sound, with none of the source's phrasing or articulation carried over — for a line whose phrasing doesn't suit the new instrument (a sung vocal on a sax). Default true. recipe.fsq says which ran.
midiNotrue = the server also transcribes the recording's notes into a roll that drives the MIDI hooks beside the FSQ codes — closer notes, a little slower (LatentPitch on audio; vaescriptor on a latent_key; a drum part — either route — gets its hits from vaescriptor_drums). recipe.midi_source names it. Default false: the codes alone.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
seedNoOptional random seed for reproducibility.
takesNoHow many takes, 1–4 (default: the server's best-of-N).
lyricsNoA SINGER's cover (instrument "voice" or "choir" — doseedo_instruments rows with sings:true): the words to sing, a line per phrase, in the order the recording sings them — e.g. the recording's own words transcribed. The take sings them in the recording's phrasing (its FSQ codes). ≤2000 chars. Without it a singer sings no words. Any other instrument: an error.
fidelityNoHow much of the recording's own latents the take keeps, 0–0.6 (cover noise strength over the source). Default 0: structure from its FSQ codes only, the sound all the instrument's.
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this, audio_url, or latent_key.
audio_urlNohttps URL of the audio, as an alternative to audio_key: a doseedo result URL exactly as a job returned it (a stem, a take, a bounce), or any public URL. The gateway fetches it (≤256 MB) into your account's ingest storage before the job starts. Pass audio_key OR audio_url.
instrumentYesREQUIRED. The instrument that plays it — call.instrument from doseedo_instruments (with its call.timbre_preset where it has one).
latent_keyNoInstead of the audio: the recording already VAE-encoded (ACE-Step 1.5 VAE, 48 kHz stereo → [T, 64] at 25 Hz, the latent mean) as a 64-channel 25 Hz float WAV `*.latent.wav`, uploaded like audio (POST /api/jobs/uploads). The server skips its encode. Dø Desktop sends this when encoding on the Mac lands sooner than uploading the audio.
timbre_presetNoA named timbre preset (the catalog's preset ids, e.g. "cello:preset1"). Omit for the instrument default.
idempotency_keyNoOptional. 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_secondsYesREQUIRED. The recording's length in seconds (0.5–600): the take is this long.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: ~30–90 s async latency, pre-signed 24 h output URLs requiring no auth header, GPU-reached jobs still spending credits on cancel, and what result.recipe reports. However the description stresses a reusable idempotency_key returning the same job, which sits in tension with idempotentHint=false (the annotation describes default behaviour, the description describes an opt-in override) – a mild inconsistency an agent must resolve rather than a reversal of the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the purpose well, but the paragraph is dense with model plumbing (cond5, turbo graft, LatentPitch, vaescriptor, recipe keys) that most callers cannot act on, and the cancel/refund sentence is very long. The information is accurate but not pruned to what an agent needs before invoking.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter async generation tool with no output schema, the description covers the return path (takes[{url}], pre-signed download), the recipe provenance fields, and cancel semantics, which is close to sufficient. It does not mention cost/credit pricing per take, though the sibling doseedo_quote exists for that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 15 parameters in detail. The description mostly restates the schema's own points (midi:true adds a pitch roll, fidelity>0 leaks source sound) with only marginal added tradeoff nuance ("closer, but its sound leaks back in") and the cond5 FSQ+timbre training rationale. Baseline 3 is the right ceiling when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource framing ("TIMBRE TRANSFER ... re-play ONE recorded part ... on another instrument") and immediately scopes it against siblings: a whole mix goes to doseedo_cover_song, exact notes go to transcribe + doseedo_render_midi. An agent can distinguish this from every neighbouring tool 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules with named alternatives (doseedo_cover_song for a mix, doseedo_render_midi for exact notes, doseedo_instruments to source the instrument) plus the async follow-up chain (job_id → doseedo_wait_task → takes). It also states the cancellation/refund boundary, which tells an agent when cancelling is useful and when it is pointless.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_create_sessionCreate a DAW sessionAInspect

Create a new, empty DAW session in the account (a blank project you can then populate with doseedo_edit_session, or target with doseedo_audio_to_session). Returns its session_id.

NameRequiredDescriptionDefault
dawNoBound DAW (default logic).
nameYesSession name.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds genuinely useful context beyond that: the session is created empty, and the call returns a session_id needed by downstream tools. No output schema exists, so naming the return value is a real contribution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core action, followed by the useful workflow hand-off and return value. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter creation tool with full annotations and full schema coverage, this covers the essentials. A minor gap: it doesn't explain the implication of the "daw" binding for later operations, though the schema enum and default largely handle that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters (name, daw enum with default logic) are fully documented in the schema. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a new, empty DAW session") and the scope ("in the account"), plus what it returns. The word "empty" distinguishes it from siblings like doseedo_session_from_stems and doseedo_import_project, which also produce sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the follow-on tools (doseedo_edit_session to populate, doseedo_audio_to_session to target), giving the agent a clear workflow context. It does not state when NOT to use it (e.g., prefer session_from_stems when stems already exist), so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_delete_sessionsDelete DAW sessionsA
DestructiveIdempotent
Inspect

Delete DAW sessions in bulk — a SOFT delete (the sessions disappear from the account and every listing; nothing on the user's disk is touched). Select by ids, or by filters (daw_kind, created_before / created_after, name_contains); filters combine with AND. SAFE BY DEFAULT: without confirm:true this is a DRY RUN that deletes nothing and returns {matched, ids}. Always run the dry run first, show the user the count (and names if few), and call again with confirm:true only after they agree. Never delete sessions the user did not ask to remove.

NameRequiredDescriptionDefault
idsNoSession ids to delete (up to 500), from doseedo_list_sessions.
limitNoCap on how many sessions one call may match (default and max 1000).
confirmNofalse/omitted = dry run (nothing deleted). true = actually delete — only after the user saw the dry-run count and agreed.
daw_kindNoOnly sessions bound to this DAW, e.g. "logic", "ableton".
created_afterNoISO-8601 date/time: only sessions created after this.
name_containsNoOnly sessions whose name contains this text (case-insensitive).
created_beforeNoISO-8601 date/time: only sessions created before this.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations by explaining the soft-delete behavior, dry-run default, return value for dry runs, and that confirm:true is required for actual deletion. The destructiveHint is consistent because the operation removes sessions from the account, even though user disk files are untouched.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately front-loaded with the action and safety model. It is longer than typical but every sentence supports correct, safe invocation for a destructive bulk operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the critical context for a destructive tool: dry-run behavior, return shape for dry runs, filter composition, and confirmation workflow. It does not describe the success response after actual deletion, but annotations and the 100%-covered schema reduce that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameter descriptions already do most of the work. The tool description adds useful semantics: ids come from doseedo_list_sessions, filters combine with AND, and confirm:true triggers actual deletion only after a dry run.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete DAW sessions in bulk') and immediately clarifies the soft-delete scope and that disk files are untouched. This clearly distinguishes it from sibling tools like get_session or list_sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes selection modes (ids or filters) and mandates the dry-run-first workflow. It tells the agent exactly when to proceed with confirm:true and includes a clear safety rule: 'Never delete sessions the user did not ask to remove.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_desktop_statusDø Desktop statusA
Read-onlyIdempotent
Inspect

Is Dø Desktop running on the user's Mac, and can it put edits into their Logic project? Reports which sessions it holds, how it applies edits (apply_mode "reopen" = save, back up, close, apply, reopen), whether macOS lets it (logic_control), each session's last apply (reopen_results) and its applied cursor. Use it to know whether an edit will reach the project now or wait for the next session open. When it is NOT connected the result says how the user gets and pairs the app, and what still works without it. Read-only.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent/non-destructive, and the description adds genuinely new behavior: the apply_mode "reopen" sequence (save, back up, close, apply, reopen), the logic_control macOS gate, and the not-connected path (how the user gets and pairs the app, what still works without it). These are traits not inferable from annotations. It omits cost/latency details, so 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core question, then the field inventory, then the failure case – well-ordered and dense. The parenthetical apply_mode expansion is worth its length, but the trailing 'Read-only.' duplicates the readOnlyHint annotation and is mild waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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: it names each reported field and explains the disconnected branch. An agent has enough to call it and interpret the result without further docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is nothing to disambiguate and baseline is 4. The description instead spends its words documenting return fields, which is appropriate for a paramless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

It opens with a specific, answerable question (is Dø Desktop running, can it push edits into Logic) and states exactly what the tool reports: sessions held, apply_mode, logic_control, reopen_results, applied cursor. No sibling covers this diagnostic role, and the description makes that distinctive 'is my edit going to land now' framing explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear selection condition: 'Use it to know whether an edit will reach the project now or wait for the next session open,' which implicitly routes agents here before edit_session. It does not name when-not to call it or explicitly name the alternative tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_detect_chordsDetect chordsAInspect

Chord detection on audio (a chord chart on the beat grid): chord_spans[{chord, start, end, start_beat, end_beat, confidence}], chords{"": "Am7"}, bpm, beats_per_bar, beat_map. Default = the deep ACE detector (GPU-backed, a CPU chroma detector is the automatic fallback); deep:false forces the fast CPU detector. Pass audio_key (an upload) or audio_url (a result URL from another job as returned, or any public https URL). Up to 10 minutes of audio is analyzed. Works best on a harmonic stem (piano/guitar/bass) or a clean mix. Synchronous (~5–30 s). Cancel: not applicable — the result is returned in the submit response; the job is already finished.

NameRequiredDescriptionDefault
deepNotrue (default) = deep ACE detector; false = fast CPU chroma detector.
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio (a doseedo result URL as returned, or any public URL). Alternative to audio_key.
idempotency_keyNoOptional. 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic safety profile (non-read-only, open-world, non-idempotent, non-destructive). The description adds the genuinely useful traits: GPU-backed vs CPU detector selection, the automatic fallback, the ~10-minute input limit, synchronous ~5–30 s execution, and an explicit 'Cancel: not applicable — result is returned in the submit response.' That last point is critical because doseedo_cancel_job exists as a sibling and an agent would otherwise try to cancel.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the payload shape, then detector defaults, then input sourcing, then limits and timing. Dense parentheticals make it slightly run-on, but virtually every clause carries operational information (fallback, 10-min cap, sync timing, no-cancel).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 correctly enumerates the return fields (chord_spans with confidence/beats, chords beat map, bpm, beats_per_bar, beat_map). Combined with the sync/cancel clarification and input limits, an agent has everything needed to call this correctly in one shot.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 earns credit by explaining the default value semantics of deep (deep ACE with automatic CPU fallback) and the distinction between audio_key (an upload, ingest/) and audio_url (a prior result URL as returned, or any public https URL). These are behavioral implications the schema descriptions only partially convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (chord detection on audio) and immediately disambiguates the output from siblings like doseedo_beat_grid and doseedo_tempo_map by naming chord_spans, chords, bpm, beats_per_bar and beat_map. An agent can tell exactly which analysis product this returns 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage conditions: default is the deep ACE detector with CPU chroma fallback, deep:false forces the fast detector, supply audio_key or audio_url, 10-minute cap, and 'works best on a harmonic stem (piano/guitar/bass) or a clean mix' — which implicitly points at doseedo_separate_stems. It never explicitly names a sibling it replaces or excludes versus doseedo_analyze_song/doseedo_beat_grid, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_download_sessionDownload a DAW sessionA
Read-onlyIdempotent
Inspect

Save a session as a native Logic project (.logicx.zip), rebuilt server-side from the session state — no desktop needed. Returns a short-lived NO-AUTH download_url (plain curl -o ~/Downloads/…, no header) plus replay = what the build put in the file (per track: kind, Quick Sampler sample + sampler {mode, sample_seconds, start/end, plays_beats}, MIDI note count, audio region count; bundled media; deferred ops the offline build could not synthesize) and warnings (e.g. a classic-mode sampler whose notes end before its sample; an unknown sample length). Verify from replay/warnings, never by unzipping ProjectData. place_local_files (when present) is ACTION-REQUIRED after unzipping — for Quick Sampler samples AND audio regions from local paths: a replay track with audio_source:"place_local_files" or a "NOT bundled" warning means that file is not in the zip until you run those cp commands; then tell the user the project is complete.

NameRequiredDescriptionDefault
dawNoTarget DAW (default logic; only logic is a one-shot native download — for others use doseedo_convert_project).
session_idYes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses the short-lived no-auth download_url, the replay manifest contents, warning examples, and the ACTION-REQUIRED post-unzip place_local_files step. These are concrete behavioral traits an agent needs and are not available from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then covers return shape and required follow-up without obvious filler. It is dense and long, but most detail earns its place because there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex download/build tool with no output schema, the description explains the returned download_url, replay manifest, warnings, and place_local_files follow-up well. The main remaining gap is input semantics, especially the required session_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: the daw parameter has a helpful enum description, but the required session_id has no description in either the schema or the tool description. The description focuses on outputs and post-processing rather than clarifying the inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: save a session as a native Logic project rebuilt server-side, with no desktop needed. It clearly distinguishes this from desktop-dependent flows, though it does not name the sibling alternative (convert_project) directly in the description; that routing detail appears only in the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is appropriate: native Logic download, server-side rebuild, no desktop. It does not spell out explicit when-not-use exclusions, but the schema's daw parameter routes non-Logic targets to doseedo_convert_project.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_edit_ops_referenceSession edit ops referenceA
Read-onlyIdempotent
Inspect

The catalog of session edit ops doseedo_edit_session accepts, served in views that each fit one answer (never cut mid-JSON). DEFAULT (no args): units, ids, applies, groups, batching/policy, the recipe NAMES and every op as {op, group, applies, summary} — read it ONCE before a build. Then fetch what you need: op:"load_quick_sampler_sample" (or ops:[…]) → those ops in full (args, units, doc; an unknown name gets did_you_mean); section:"recipes" → the full recipes (drum kit from local samples, fix note lengths, one-shots on an audio track, remote sample, submix bus, verify) — copy one instead of discovering op order; section:"ops" → every op in full; "units" / "ids" / "summary" (the get_session field map + workflow + policy + batching) / "all" (fitted, may shorten). Each op says where it lands (applies: live in the open project | next_open | state). Read-only, no key needed.

NameRequiredDescriptionDefault
opNoOne op name, e.g. "set_midi_notes" — returns that op in full.
opsNoSeveral op names — returns each in full.
sectionNoWhich part of the catalog. Omit for the default overview.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations in useful ways: 'never cut mid-JSON' and 'all' (fitted, may shorten) disclose truncation/fitting behavior, 'an unknown name gets did_you_mean' discloses the error path, and 'no key needed' discloses auth. It also explains where operations land (live | next_open | state), which 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The default behavior is front-loaded in the first sentence and every clause carries information. The heavy parenthetical, em-dash-dense packing makes it harder to scan than necessary, but nothing is filler or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 describes return shapes for every mode (default overview, op details, section views) and the truncation caveat. Combined with annotations covering safety and idempotency, an agent has everything needed to call it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, yet the description still explains each parameter's effect: op/ops return entries in full, and every enum value of section is spelled out (recipes contents, ops in full, summary = field map + workflow + policy, all = fitted). It adds genuine semantics over the schema, including multi-value behavior via ops:[…].

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the catalog of session edit ops that doseedo_edit_session accepts) and its serving model ('views that each fit one answer'). It explicitly names the tool it supports, so an agent can distinguish it from doseedo_edit_session itself without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Strong sequencing guidance: 'read it ONCE before a build', then fetch by op/section, and 'copy one instead of discovering op order' for recipes. It does not, however, state when NOT to use it or contrast it with the sibling doseedo_recipes tool, which plausibly overlaps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_edit_sessionEdit a DAW sessionAInspect

Edit a DAW session with a list of ops (regions, MIDI notes, sampler samples, tracks, mixer faders/pans/mutes, plugins, tempo, markers, key, …): ids and current values from doseedo_get_session, op arguments from doseedo_edit_ops_reference. When sync.live_edits is true Dø Desktop puts it into the user's Logic project (it saves, backs up, closes and reopens the project, ~10–20 s — tell the user); otherwise stored and applied at next open. CONTRACT: every op is validated before anything is stored; a rejection carries a code — unknown_op / unknown_plugin (with did_you_mean), unknown_id (with the valid ids), duplicate_id, forbidden_group, read_only_key — and a reason. atomic (default true): one rejection → NOTHING stored, all rejections listed; atomic:false stores the good ops. RETRY: re-send a timed-out call with the SAME batch_key and it dedups (deduped:true); without batch_key a retry duplicates. Ops apply on the desktop one at a time in order, no per-batch undo — verify with doseedo_download_session (replay).

NameRequiredDescriptionDefault
opsYesThe edits, e.g. [{"op":"set_track_crop","args":{"track_id":"t_…","start_beats":4,"end_beats":124,"prev_start_beats":24}}, {"op":"set_channel_volume","args":{"channel_id":"ch_…","value":0.6}}]. See doseedo_edit_ops_reference.
atomicNoDefault true: any rejected op means nothing is stored. Set false to store the valid ops and receive the rest as `rejected`.
batch_keyNoA stable id for THIS batch (e.g. "drumkit-build-1"). Same batch_key + same ops on a retry = the same client_op_ids = no duplicates. Always pass one for a build you might have to retry.
session_idYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag it as a non-read-only, non-idempotent, open-world mutation. The description adds substantial context beyond that: the 10–20 s save/backup/close/reopen cycle, validate-before-store contract with named error codes, atomic-vs-partial semantics, dedup behavior via batch_key, in-order application, and absence of per-batch undo. Slight remaining gap: no note on what a successful response returns beyond `deduped`/`rejected`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and information-dense, with CONTRACT and RETRY labels aiding scanability. However, it reads as one long run-on paragraph; some sentences (the ~10–20 s save cycle, the error-code list) could be tighter to reduce cognitive load, though none is truly wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, stateful, no-output-schema mutation tool, the description covers purpose, prerequisites, side effects, error contract, idempotency, and verification. An agent has everything needed to call it correctly and interpret partial results without opening other docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, but the description meaningfully extends every key parameter: ops get their id/argument sources, atomic gains the all-or-nothing vs good-ops-only contrast, and batch_key gains the dedup-on-retry contract with a concrete example. This is more than the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Edit) and resource (DAW session) and enumerates the op domains (regions, MIDI notes, samples, tracks, mixer, plugins, tempo, markers, key). It routes the agent to companion tools (get_session for ids/values, edit_ops_reference for op arguments) so it is clearly differentiated from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when live sync happens (sync.live_edits true → desktop writes into Logic project, ~10–20 s, tell the user) versus when ops are stored and applied at next open. It also gives concrete retry guidance (re-send with same batch_key) and verification guidance (download_session replay). No guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_fill_gapFill a gap in a recorded partAInspect

INPAINT (repair) a part: send ONE recorded part (a stem, a DAW track's audio) with a gap in it — the silence between two clips, a bar to redo, a dropout — and get it back with the gap PLAYED: the take before and after the gap is kept bit-exact (spliced back), and the gap is generated against both, so it continues out of what comes before and leads into what follows. What fills it is planned first (the DSP plane's extend planner, which hears the part): the take's own LOOP when it has one — the gap is seeded from its own passes at the matching bar phase, so a groove keeps turning — else a part written in its key and over its chords, performed in the take's own sound. Pass the session's bpm and bar grid (bar_offset_seconds: where a bar line falls in the audio you send); the gap is in seconds of that audio. Send the part with some of the take on each side of the gap (8 bars or more before it is best). Async: job_id → doseedo_wait_task (~40–150 s) → takes[{url}]: WAVs as long as the audio you sent, the gap filled — cut out the gap (or the span you need) to drop it into the DAW. output.plan says what filled it (loop bars, or the writer and the changes). 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.

NameRequiredDescriptionDefault
bpmYesREQUIRED. The session's tempo — the gap is filled on its bar grid.
fillNoWhat fills the gap: "context" = the span played AGAIN from the take around it — no plan, no notes: a variation of what is there, in its own sound and level (INPAINTING a span that has audio — the right default there); "loop" = the take's own passes (a groove that keeps turning), "written" = a part written in its key and chords, "auto" (default) = the loop when the part has one, else written.
keepNofill "context": how much of what is in the span its regeneration keeps, 0.01–0.9 (default 0.05: a variation; 0.45 ≈ the same playing again).
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
roleNoThe part's role, when you know it (the planner hears it otherwise).
seedNoOptional random seed (the same seed plans and renders the same).
notesNoYOUR part for the gap — a custom part (a MIDI region drawn there in the DAW): [{pitch, start_seconds, duration_seconds, velocity?}], seconds of the audio you send. It is the written part, no planner: the take plays exactly these notes, in its own sound (notes outside the gap are ignored; silence where there are none). fill "written" or omitted. ≤2000.
takesNoHow many takes, 1–4 (default: the server's best-of-N).
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). The part, with the gap in it. Provide this or audio_url.
audio_urlNohttps URL of the audio, as an alternative to audio_key: a doseedo result URL exactly as a job returned it (a stem, a take, a bounce), or any public URL. The gateway fetches it (≤256 MB) into your account's ingest storage before the job starts. Pass audio_key OR audio_url.
exact_gridNotrue = the audio is cut from a DAW session, so bpm and bar_offset_seconds are its EXACT grid: the fill keeps it (default false: the planner fine-tunes the grid to the audio's own onsets — right for a stem whose tempo you only know roughly).
instrumentNoWhat plays the part (an id from doseedo_instruments). Optional — the take's own sound is kept either way; a written fill is played by it.
track_nameNoThe part's track name in the DAW ("Drums", "Bass", "Strings") — the planner hears a role from the name first, then from the sound.
time_signatureNoThe session's meter, e.g. "4/4" (default) or "3/4".
gap_end_secondsYesREQUIRED. Where the gap ends (and the take resumes), in seconds of the audio.
idempotency_keyNoOptional. 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_secondsYesREQUIRED. The audio's length in seconds (1–600).
gap_start_secondsYesREQUIRED. Where the gap starts, in seconds of the audio.
bar_offset_secondsNoWhere a bar line falls in the audio (seconds; default 0 = the audio starts on a downbeat). Sending a span of a DAW track that starts mid-bar? Give the first downbeat's time in it.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the safety profile is partly covered. The description adds substantial context beyond that: the async job lifecycle, ~40–150 s render time, bit-exact splicing of surrounding audio, the output.plan field, and precise cancel/refund behavior. It does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, but it is front-loaded with the core operation and the length is justified by a 19-parameter tool with a multi-step async workflow. Heavy capitalization and parenthetical asides add some noise, but every section carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, async, 19-parameter tool with no output schema, the description covers the full lifecycle: input requirements, planning behavior, return shape (takes[{url}], output.plan), timing, and cancellation. An agent has everything needed to invoke it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description adds real meaning beyond the schema: it explains that the gap is in seconds of the audio sent, that bar_offset_seconds marks where a bar line falls, and that bpm/bar grid drive the fill. It also clarifies the practical requirement of including take audio on each side of the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('INPAINT (repair) a part') and immediately defines the operation: send one recorded part with a gap, get it back with the gap played. It clearly distinguishes this from generative siblings like doseedo_generate_music or doseedo_render_midi by emphasizing that the surrounding take is kept bit-exact and the fill is generated against it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to use each fill mode ('context' for inpainting a span that has audio, 'loop' for a groove, 'written' for a composed part, 'auto' as default), gives practical guidance ('send 8 bars or more before it is best'), and spells out the async workflow via doseedo_wait_task with expected timing. Cancel semantics are also documented, 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_generate_musicPrompt-only AI sketch (doseedo does not compose — you write the piece)AInspect

NOT A COMPOSER: doseedo plays music, it does not write it — YOU write the piece. Background music for a video or a brand film, an instrumental, a theme, a song: compose every part yourself as notes ([{pitch, start_beats, duration_beats, velocity}], beats from bar 1 — melody, harmony, bass, in the key and at the tempo you choose), then play them: doseedo_render_score {parts} for several instruments (one stem each, then doseedo_mix) or doseedo_render_midi for one; doseedo_instruments lists the players and their ranges; the steps: doseedo_recipes name="compose-piece" (to picture: "score-a-film"; one part in a session's key: "compose-part"). THIS tool is text to music from a PROMPT alone (optionally lyrics) with NO notes behind it: the instrument model then has nothing to play, and a take is often near-silent, a drone or clicks. Nothing in it is controlled — no key control (a key in the prompt is not honoured), no MIDI input, bpm/time_signature only tag the caption. Use it only when the user explicitly asks for a prompt-only AI sketch, listen before handing a take over, and never deliver one as the music. Async: job_id → doseedo_wait_task (typically 1–3 min) → audio URLs (pre-signed: curl -OJ , no auth header, valid 24 h — see expires_at). 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.

NameRequiredDescriptionDefault
bpmNoOptional tempo HINT in BPM, written into the caption (default 120). Not enforced — the output tempo can drift from it.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
seedNoOptional random seed for reproducibility.
lyricsNoOptional lyrics to sing, ≤ 16000 characters. Omit for instrumental.
promptYesStyle/mood/instrumentation prompt, e.g. "warm jazz trio, brushed drums, late-night ballad". ≤ 16000 characters (a longer one is cut at a word boundary, with a warning).
time_signatureNoOptional meter HINT written into the caption, e.g. "4/4", "3/4". Not enforced.
idempotency_keyNoOptional. 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_secondsNoTarget length in seconds (e.g. 30–120). Omit for the model default.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the safety story is partly covered. The description goes well beyond them with the async lifecycle (job_id → wait_task, 1–3 min), pre-signed URL handling and 24 h expiry, credit/refund semantics on cancel, and the honest warning that output can be near-silent, a drone, or clicks — rich behavioral context that the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the decisive 'NOT A COMPOSER' framing, then workflow, then the caveat and async mechanics — a sensible order. It is dense and longer than typical, but nearly every clause carries routing or behavioral information; minor tightening of the instrument/recipe enumeration would help.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by explaining what comes back (audio URLs, expires_at, file naming driven by `name`) and how to cancel. Combined with 100% schema coverage and annotation-backed safety, an agent has what it needs; only the quality-variance caveat is left qualitative rather than quantified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all eight parameters are already documented, setting the baseline at 3. The description adds some meaning the schema does not — that a key stated in the prompt is not honoured and that bpm/time_signature only tag the caption — but it does not walk through the remaining parameters (seed, duration_seconds, idempotency_key).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — text-to-music generation from a prompt alone, with no note data behind it — and explicitly carves out what it is not (a composer). It names the sibling tools (doseedo_render_score, doseedo_render_midi, doseedo_instruments, doseedo_recipes) it should be chosen over, so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('only when the user explicitly asks for a prompt-only AI sketch'), explicit alternatives ('YOU write the piece' via score/midi paths, recipes compose-piece / score-a-film / compose-part), plus a hard caution to listen before delivery and never ship a take as the music. Both the positive and negative routing conditions are stated.

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.

NameRequiredDescriptionDefault
bpmNoTempo a loop is cut to (default 120).
kindNohit = one sound (0.5–10 s), loop = 1–4 bars tiled at bpm, texture = a bed. Default: read off the prompt.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
seedNoOptional random seed for reproducibility.
promptYesWhat it sounds like, e.g. "punchy house kick drum, single hit" or "dusty vinyl crackle". ≤ 300 characters (a longer one is cut at a word boundary, with a warning).
time_signatureNoMeter a loop is cut to, e.g. "4/4" (default).
idempotency_keyNoOptional. 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_secondsNoLength in seconds. Default: 2 s for a hit, 4 bars at bpm for a loop, 8 s for a texture.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the async contract (job_id → doseedo_wait_task, typically 15–40 s), the return form (pre-signed audio URLs, usable with curl -OJ and no auth header, valid 24 h), and precise cancellation economics — refunded if not yet on the GPU, credits spent and output discarded if already rendering. The idempotency_key parameter is consistent with idempotentHint=false: dedupe is opt-in, not a property of 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then the kind rule, then the wrong-tool routing, then the async/cancel contract — a sensible order with no filler sentences. It is densely packed with parenthetical example lists, which is scannable but pushes toward the upper bound of useful length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-read-only, open-world, async generation tool with no output schema, the description supplies everything an agent needs: what gets produced, how long it takes, which follow-up tool completes the job, what the URLs look like and how long they live, and what cancel does to credits and output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the schema carries most parameter meaning; the description still adds the non-obvious coupling between prompt wording and kind inference, plus the hit/loop/texture behavioral distinction that the enum description only sketches. It does not, however, add anything for bpm, time_signature, seed, or idempotency_key beyond what the schema says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Generate sound effects (SFX) from words with Stable Audio Open") and enumerates concrete output families — impacts, whooshes, footsteps, UI blips, ambiences, risers, one-shots. It also draws a hard boundary against the nearest siblings by naming doseedo_render_midi for note parts and doseedo_render_score for scored music.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (SFX/foley for games, apps, video), explicit when-not (parts with notes or composed music, each routed to a named alternative), and a practical selection rule for the kind parameter (hit vs loop vs texture, with the server inferring it if omitted). It even includes a concrete anti-pattern — don't put tempo words in a hit prompt or the model writes a loop.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_get_project_upload_urlGet a project upload URLA
Idempotent
Inspect

Get a presigned upload for a DAW PROJECT file (for doseedo_convert_project / doseedo_import_project). Zip a project FOLDER so its audio travels with it — and a .logicx or GarageBand .band, which are folders (macOS packages). SIZE LIMITS: a single PUT takes up to 5 GB; guest and free accounts convert projects up to 2 GB, paid plans up to 12 GB (a larger one is refused as project_too_large with the cap and an upgrade link). Pass size_bytes: past 4 GB (or with multipart:true) you get a MULTIPART upload instead — a part_size, one presigned part_url per part, and the complete step (doseedo_complete_project_upload); each part is retried on its own, so a dropped connection costs one part, not the upload. Single PUT: curl -sS -X PUT -H "Content-Type: application/zip" --data-binary @project.zip "<upload_url>", then pass project_key on. Multipart: split -b <part_size_bytes> project.zip part. then for each piece in order curl -sS -X PUT --data-binary @part.aa "<part_url>" -D - -o /dev/null | grep -i etag (keep each ETag), then doseedo_complete_project_upload {project_key, upload_id, parts}. Need more part URLs than one answer holds? Call this again with project_key + upload_id + part_numbers.

NameRequiredDescriptionDefault
filenameNoFile name including extension, e.g. "Song Project.zip", "My Song.band.zip", "beat.flp", "song.cpr", "Mix.song", "set.dawproject" or "score.mxl".
multipartNoForce a multipart upload regardless of size (resumable per part).
upload_idNoCONTINUATION: the upload_id the first call returned.
size_bytesNoThe file's size in bytes (stat it). Decides single PUT vs multipart and sizes the parts.
project_keyNoCONTINUATION of a multipart upload: the key the first call returned.
content_typeNoMIME type: application/zip for zips (default), application/octet-stream for bare project files.
part_numbersNoCONTINUATION: which part numbers (1-based) to sign now, ≤ 24 per call.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, idempotent=true, openWorld=true, destructive=false, so the description carries the operational burden and does so well: hard size caps per plan tier, the exact refusal error (project_too_large with the cap and an upgrade link), the 4 GB multipart threshold, per-part retry semantics, and the required follow-up step doseedo_complete_project_upload. The one blemish is mild internal tension between 'a single PUT takes up to 5 GB' and 'past 4 GB you get a MULTIPART upload', which leaves the real single-PUT ceiling slightly ambiguous.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single dense paragraph, but it is front-loaded with purpose and size limits and every later sentence carries executable detail (curl lines, split, ETag capture, retry rationale). The 5 GB vs 4 GB statement is the one place where wording could be tightened rather than expanded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a seven-parameter tool spanning a multi-step, resumable workflow, the description covers the entire lifecycle: initiating the presign, choosing the transport, executing the upload, and completing it via doseedo_complete_project_upload, plus the re-call path for additional part URLs. An agent can act correctly without consulting other documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 genuine meaning beyond the schema: size_bytes is what selects single-PUT vs multipart and sizes the parts, and project_key/upload_id/part_numbers are only meaningful as a continuation of an earlier call. The curl/split recipes attach concrete operational behavior to each parameter rather than restating its type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get a presigned upload for a DAW PROJECT file') and immediately ties it to the consuming siblings doseedo_convert_project / doseedo_import_project. The one gap is that it never explicitly contrasts itself with the sibling doseedo_get_upload_url, which an agent must choose between; the distinction ('DAW project file' vs. a general upload) is only implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says exactly when to use it (before convert_project/import_project), how to package the input (zip a project FOLDER so audio travels with it, including .logicx/.band packages), and which mode to pick (single PUT vs multipart driven by size_bytes or the multipart flag). It also handles the non-obvious continuation case: re-call with project_key + upload_id + part_numbers when more part URLs are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_get_sessionRead a DAW sessionA
Read-onlyIdempotent
Inspect

Read a DAW session as the arrangement an agent edits against: every track with its wire ids (track_id t_…, mixer strip channel_id ch_…), regions in BOTH beats and seconds with their MIDI notes (i, pitch, velocity, start_beats, duration_beats — i is what edit_midi_notes selects by), mixer (volume with dB, pan, mute), plugins with params[{param_id, name, value}] (set_device_param needs param_id) and sampler {mode, sample_seconds, plays_beats, …}, sends/output as ch_b_… ids, buses, tempo_bpm + tempo_map, time_signature + meter_map, key_signature when known, markers (marker_id, beat ABSOLUTE from bar 1), automation lanes, instrument, counts, length — and sync with live_edits:true|false + live_edits_reason (will an edit reach Logic now?). Field-by-field map: doseedo_edit_ops_reference {section:"summary"}. BUDGET (never cut mid-JSON): notes come inline when the selected tracks hold ≤200 notes, else regions carry note_count + notes_omitted:true — pass include_notes:true with tracks:[ids] for a track's notes; include_params:false / include_automation:false drop params / points; a result still too big is paginated by track with truncated + next (the exact args for the rest). Read-only. Pass the ids straight to doseedo_edit_session, or a track_id to doseedo_render_midi {session_id, track_id}.

NameRequiredDescriptionDefault
tracksNoOnly these tracks (track_id t_… or channel_id ch_…; a track name matches too). The rest of the session (tempo, markers, buses, sync) is always included.
session_idYesFrom doseedo_list_sessions.
include_notesNoInclude MIDI notes. Default: true when the selected tracks hold ≤200 notes in all, else false (regions then carry note_count + notes_omitted:true).
include_paramsNoInclude plugin params (default true). false keeps param_count only.
include_automationNoInclude automation lanes with points (default true). false keeps a lane count per track.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly/idempotent/non-destructive), and the description is consistent with them ('Read-only'). Beyond that it discloses behavior no annotation carries: the note inline/omission budget (≤200 notes, else note_count + notes_omitted:true), track-level pagination via `truncated` + `next` with the exact resume args, the 'never cut mid-JSON' guarantee, the sync.live_edits flag answering 'will an edit reach Logic now?', and markers being absolute beats from bar 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then payload, then budget, then next steps — a sensible order. It is a dense run-on with heavy parentheticals that hurts scannability, and the long inline field enumeration partially duplicates the doseedo_edit_ops_reference call it already points to, but nearly every clause carries usable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 full burden for a very complex return, and it does: top-level shape, id conventions, budget/degradation behavior, pagination contract, and the sync freshness signal. An agent can call it, interpret a truncated result, and continue without another discovery call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 cross-tool meaning the schema cannot: `i` is what edit_midi_notes selects by, param_id is required by set_device_param, ch_b_… denotes sends/output, and the include_* flags are framed as interlocking budget fallbacks with the pagination path. That is genuine semantic value over the field definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read a DAW session') and immediately frames it as 'the arrangement an agent edits against', then enumerates the exact payload (tracks with wire ids, regions, mixer, plugins, buses, tempo_map, sync). It also positions itself against siblings: it produces ids consumed by doseedo_edit_session and doseedo_render_midi. An agent can tell this is the read-state entry point, distinct from doseedo_list_sessions, 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear routing context: pass returned ids to doseedo_edit_session, a track_id to doseedo_render_midi, and consult doseedo_edit_ops_reference for the field map. It also gives concrete usage triggers for the knobs ('pass include_notes:true with tracks:[ids] for a track's notes'). No explicit when-not-to-use condition is stated, so not quite a 5.

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 URLA
Idempotent
Inspect

Get a presigned upload for your own audio file — or a SCORE (.mid / .midi / .musicxml / .xml / .mxl / .mscz / .mscx → a score_key for doseedo_render_score: send a big score as a file, not as notes in the call). 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. A FILE ALREADY ONLINE (a film an editor exported — Canva, Adobe Express — or any public https URL): pass source_url and doseedo copies it in itself — nothing to PUT; the key comes back ready (≤ 256 MB).

NameRequiredDescriptionDefault
filenameYesFile name including extension, e.g. "song.wav", "film.mp4", or "cue.mid" / "cue.musicxml" / "cue.mscz" for a score. With source_url: the name for the copy when the URL names none (its extension decides the type).
source_urlNoA public https URL of an audio file or a film to copy in instead of uploading it (e.g. an editor's export link). Returns the key directly — no upload_url, nothing to PUT. ≤ 256 MB.
content_typeNoMIME 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is a non-read-only, idempotent, open-world call; the description adds the actual mechanics: you must PUT raw bytes to upload_url with a matching Content-Type, a key comes back for four or more downstream tools, and source_url mode returns a key with nothing to PUT. It also discloses plan-dependent behavior (lossless session storage only on Pro+) and hard limits (film ≤ 2 GB, URL copy ≤ 256 MB) that no structured field carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information is front-loaded with the return values stated before the routing detail, and the AUDIO / SCORE / FILM / ONLINE-URL markers make scanning possible. It is still a very dense block with a long nested-parenthesis opening sentence and a format list repeated verbatim from the content_type schema, so it is not maximally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter tool with no output schema, the description supplies everything an agent needs: what is returned (upload_url + audio_key/video_key/score_key), which sibling consumes each key, size and format limits, plan caveats, and the local-file escape hatch. No meaningful gap remains for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and all three parameters are documented there, including extension inference for content_type and the source_url copy semantics. The description reinforces the mode split (source_url vs PUT) and lists accepted formats, but that mostly duplicates the schema's own content_type description rather than adding new syntax or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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') and immediately enumerates the three distinct input modes it serves: own audio file, SCORE (→ score_key for doseedo_render_score), FILM (→ video_key for doseedo_spot_video / doseedo_score_to_picture). It names the downstream siblings each returned key feeds, so an agent can separate this from a plain upload or render tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules: use this when the file is local or a public https URL, but do NOT upload for session samples/regions on this machine (use load_quick_sampler_sample sample_path / attach_audio local_path and place_local_files). It also names the alternative path (source_url) and its precondition (public https, ≤ 256 MB), and warns to send big scores as files rather than notes in the call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_import_projectImport a DAW projectAInspect

Open an uploaded DAW project (Logic .logicx.zip, Ableton .als or project zip, FL .flp, REAPER .rpp, Pro Tools .ptx — zip the folder) as an EDITABLE doseedo session: returns a session_id the session tools then work on (doseedo_get_session → doseedo_edit_session → doseedo_download_session as a native Logic project, or convert that download to another DAW with doseedo_convert_project). The session gets the project's tempo (+ tempo map), meter, markers, and every track with its name, mixer level/pan, color and MIDI notes. AUDIO IS NOT CARRIED: the import reads the project, not its media — audio tracks arrive named and positioned (audio.placements lists each clip's file and beats) and audio.next says how to supply the files. Plugins and summing buses are reported, not recreated. Upload first with doseedo_get_project_upload_url; this call parses the project (seconds to minutes for a big one) — if it answers status:"running", call it again with the returned task_id until it hands back session_id.

NameRequiredDescriptionDefault
dawNoThe source DAW, when the filename does not say (optional; detected otherwise).
nameNoSession name (default: the project's own name).
task_idNoCONTINUATION: the task_id a previous call returned while the parse was still running.
project_keyNoR2 key of the uploaded project (from doseedo_get_project_upload_url; starts with "uploads/").

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: reveals what is carried (tempo map, meter, markers, track mixer state, MIDI notes), what is NOT carried (audio media), how audio is surfaced (audio.placements, audio.next), that plugins/buses are reported not recreated, and that parsing takes seconds to minutes with a status:'running' continuation. This is unusually rich behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded with the core action and return value first, then caveats about audio and plugins, then the upload/polling prerequisites. Long sentences with stacked parentheticals make it slightly harder to scan, but every clause carries real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 return values (session_id, status:'running', task_id, audio.placements/audio.next), prerequisites (prior upload), and processing latency. For a four-parameter tool with a multi-step async flow, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns extra by explaining that project_key originates from doseedo_get_project_upload_url and by describing the task_id continuation loop in operational terms (re-call until session_id is returned). It does not add much about daw/name beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Open an uploaded DAW project ... as an EDITABLE doseedo session'), enumerates supported formats, and names what it produces (session_id). It is clearly distinguishable from siblings like doseedo_convert_project or doseedo_create_session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to upload first with doseedo_get_project_upload_url, and names the downstream flow (get_session → edit_session → download_session) plus the alternative for other DAWs (doseedo_convert_project). It also gives the continuation rule for task_id polling, so when/when-again is fully prescribed.

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)A
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idNoOne 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.
queryNoWhat the part needs, in words: an instrument ("trumpet"), a family ("woodwinds"), a technique ("pizzicato", "muted") or a register ("low", "bright"). Ranked best-first.
chordsNotrue = only instruments one player can play chords on.
familyNoOnly this family.
pitchesNoMIDI pitches the part uses (concert, 60 = C4) — only instruments whose range holds every one.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 jobsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
kindNoOnly 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, reframe_video, cover_song, separate_stems, split_soundtrack, 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, reframe, cover, separate, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases.
limitNoHow many (1–100, default 20).
beforeNoPage cursor: the next_cursor of a previous call.
statusNo
session_idNoOnly 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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotent/non-destructive, and the description restates read-only as a confirmation rather than a contradiction. It adds ordering semantics (newest first) and, with no output schema present, describes row shape (artifact names per job). It does not mention pagination or the page-scoped nature of some filters, which the schema covers instead.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and scope, then usage cases, then row shape and the cross-reference. Dense but every clause carries information; the parenthetical kind list is the only slightly bloated part.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description supplies ordering, row contents, and the escalation path to full results, which is what an agent needs to act. Remaining gaps are cursor/pagination behavior and the page-scoped caveat on session_id filtering, both of which live in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema carries most parameter meaning. The description only gestures at filtering via the kind list, which even mixes registry names with short aliases ("generate", "stems", "session") rather than the schema's names, and says nothing about limit, before, or status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List the jobs this account submitted") and enumerates the job kinds covered, including analyses. It explicitly contrasts itself with doseedo_check_task, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete situations to call this tool (finding an earlier result, checking what is running, resuming after a lost connection) and names the alternative for full details ({job_id} via doseedo_check_task). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_list_pluginsList pluginsA
Read-onlyIdempotent
Inspect

List the plugins you can insert on a strip with doseedo_edit_session's add_device op. Returns the stock Logic catalog (instruments + effects, always available) and — when Dø Desktop is connected — the actual plugins installed on the user's Mac (stock + third-party). Insert any of them BY NAME: add_device {channel_id, device: {name: "…"}}.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered; the description adds genuine context beyond that by disclosing the conditional result set depending on whether Dø Desktop is connected. It stops short of describing ordering, size, or whether names are unique across stock and third-party plugins.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences: purpose, result composition, then the actionable follow-up with an example payload. It is dense but every sentence carries information; the parenthetical 'stock + third-party' partly repeats the preceding clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description correctly shouldered the job of explaining what comes back — and it does, at the level of catalog vs. installed set. It could say more about the shape of each entry (name, type, vendor), which matters since the agent must match names exactly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema carries no semantic burden and the baseline is 4. The description does add useful adjacent semantics by naming the exact add_device argument the returned names feed into, tying output to downstream input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list available insertable plugins) and immediately names the consuming operation, doseedo_edit_session's add_device. It also distinguishes the two sources returned (stock Logic catalog vs. plugins actually installed when Dø Desktop is connected), which is far more than a restatement of the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent forward: after listing, insert with add_device {channel_id, device: {name: "…"}}, including the exact payload shape. What is missing is differentiation from the sibling doseedo_instruments, which plausibly overlaps, and any statement of when this list is unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_list_sessionsList DAW sessionsA
Read-onlyIdempotent
Inspect

List the connected account's DAW sessions (most recently updated first) — their ids, names, DAW, and update time. Pages with limit + offset (the response carries total and next_offset); name_contains filters by name. Use a session id with doseedo_get_session and doseedo_edit_session; clean up old ones with doseedo_delete_sessions.

NameRequiredDescriptionDefault
limitNoHow many to return (default 25, max 200).
offsetNoHow many to skip (default 0) — pass the previous response's next_offset to get the next page.
name_containsNoOnly sessions whose name contains this text (case-insensitive).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond that: result ordering, that the response carries total and next_offset, and that name_contains is a case-insensitive substring filter — useful since there is 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary action and scope, then paging and sibling routing. Every clause earns its place — no restating of the title or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the returned fields and the pagination envelope (total, next_offset). All three optional parameters are covered by the schema, and the sibling handoffs are named, so an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents defaults, max, and the next_offset chaining pattern. The description restates the same paging and filtering concepts without adding syntax or edge-case guidance, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb plus resource ('List the connected account's DAW sessions') with a stated sort order and the exact fields returned (ids, names, DAW, update time). An agent can distinguish it from doseedo_get_session and doseedo_edit_session without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes onward: session ids feed doseedo_get_session and doseedo_edit_session, and doseedo_delete_sessions handles cleanup. It does not state when *not* to list (e.g. use name_contains rather than paging everything), so there is clear context but no explicit exclusions.

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: each part levelled, panned, high-passed, given its depth on a shared reverb, and mastered to a loudness target — a WAV AND 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, brass behind, each seat at its depth in a 2.3 s hall, written dynamics riding the faders); 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, lofi-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 (dB off the strip's gain_db: 0 = as set, -60 mutes) — and call again with mix_job (this job_id) + only your edits (or the whole mixgraph + the same stems): rendered as written, rails reported, no credits. Then doseedo_session_from_stems {from_job, mix_job: } → the DAW project at this mix's levels and pans. TO PICTURE: dialogue (the VO; the music ducks under each line), music_offset_s (bar 1 on the picture), length_s (cut + end fade). 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.

NameRequiredDescriptionDefault
duckNoHow the music sits under the dialogue: {vo_over_db (default 7 dB — a broadcast mix's 6–10), carve_db (default 3, at 1–4 kHz), max_db (default 12), include (default true; false = the music bed alone, ducked as if the voice played)}.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
roomNoAn 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.
stemsNo[{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.
styleNoA 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 …
balanceNo{part name: dB in -12..12} — your balance on top of the levelling (and of the written dynamics a from_job reads).
mix_jobNoMCP: 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.
vintageNoA 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.
dialogueNoThe VO / dialogue on the picture's timeline (≤ 4): [{name?, audio_url}]. The music ducks under each line until the voice sits duck.vo_over_db over it, with a 1–4 kHz carve while it talks; the voice joins after the music's master chain. Report: output.dialogue.lines [{start_s, end_s, duck_db, vo_over_music_db}] as mixed.
dynamicsNoFader 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_jobNoMCP: 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.
length_sNoThe program's length (a :30 = 30; ≤ 600 s): the mix is cut there with end_fade_s (default 0.5 s); the room's tail never runs past it.
mixgraphNoAn 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.
end_fade_sNoWith length_s: the fade at the program's end (0–10 s, default 0.5).
target_lufsNoMaster loudness, -24..-6 LUFS (default: the style's — -18 for film-orchestral, -14 for the blind default). Met within ~0.3 LU (a loud target clips the shortest transients first); output.loudness says what landed, and why when short. With mix_job it re-masters the stored mix.
tonal_matchNoNudge 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_rideNoHow hard the written dynamics move the faders: 1 = default (pp to ff ≈ 17 dB), 0 = no rides, up to 1.5.
written_levelNo[[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.
music_offset_sNoWhere bar 1 of the music sits on the picture (seconds, ≤ 600; the program ≤ 600 s): every music stem — and its rides — starts this late; the dialogue does not move.
idempotency_keyNoOptional. 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_carriedNo{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

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, open-world, non-idempotent mutation, and the description adds substantial context beyond them: async job_id with ~15–90 s waits, no stop for a running mix (credits spent, output discarded), refunds only for plane-queued failures, and 'no credits' for mixgraph edits. The idempotency_key note sits slightly at odds with idempotentHint=false, but it is an opt-in request key rather than a claim the tool is idempotent, so this is not a true contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and stems sourcing are front-loaded, and nearly every clause carries information, but the single sprawling block with nested parentheticals and a 25-item style enumeration is hard to parse on first read. It is dense rather than padded, but the structure could be split into clearer segments.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 21-parameter tool with no output schema, the description covers the asynchronous lifecycle, cancellation and refund semantics, what the returned mixgraph contains and how to edit it, and even names result fields such as output.loudness and output.dialogue.lines. An agent has what it needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline would be 3, but the description adds real meaning: balance is dB on top of the levelling (+3 brings a melody forward), automation values are dB off the strip gain_db with 0 = as set and -60 = mute, mixgraph edits are partial against the stored mix, and target_lufs states the tolerance and clipping tradeoff.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb pair and resource: each part levelled, panned, high-passed, reverbed, then mastered to a loudness target, returning a WAV plus an editable mixgraph. It also distinguishes itself from siblings by naming doseedo_render_score as the source of from_job and doseedo_session_from_stems as the downstream consumer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit selection rules: use from_job after render_score, or pass stems directly; call again with mix_job plus only your edits to revise a mix; use dialogue/music_offset_s/length_s when mixing to picture. It also names the follow-on tools and the wait/cancel path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_quotePrice a jobA
Read-onlyIdempotent
Inspect

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, split_soundtrack, transcribe, audio_to_session, convert_project, bounce_session, spot_video, score_to_picture, reframe_video, 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.

NameRequiredDescriptionDefault
jobYesWhich job to price (a doseedo_ tool name or recipe verb is accepted too).
argsNoThe arguments you intend to pass to the job tool; only the price-relevant ones matter.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive, and the description reinforces this with 'Spends nothing', which is exactly the behavior an agent needs to trust a dry run. It goes further with real behavioral detail absent from annotations: the gate is authoritative, refusals name the exact price, and 'refused'/'planned' semantics for render_score. It does not describe the returned estimate structure (cost fields, whether a breakdown is included), leaving some behavioral surface undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loading is strong: the purpose and zero-cost guarantee come first. However, the description re-enumerates all 24 enum values already fully specified in the schema, which is pure duplication, and packs job-specific arg rules into one run-on parenthetical spanning multiple sub-cases. Roughly a third of the text could be cut without information loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, no-output-schema pricing tool, this covers intent, safety, arg relevance, and refusal behavior — enough to invoke correctly and interpret a refusal. Remaining gaps are modest: the actual shape of a successful estimate (what fields a cost estimate returns) is never characterized beyond 'the planes' own price table', and there is no indication of latency or rate limits for repeated quoting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but `args` is a free-form object with additionalProperties, and the description meaningfully constrains it by naming the price-relevant keys (duration_seconds, models, instruments, notes/bpm, voice_split) and giving pricing rules the schema cannot express — takes free, voices cost one batch per ~6. The phrasing is dense and some clauses (tempo_map vs duration_seconds precedence) require re-reading, which costs a point.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 a second dimension (affordability), and immediately distinguishes itself from the sibling job tools via 'BEFORE submitting it' and 'Spends nothing'. An agent can tell this is a dry-run pricing call, not a job submission, 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use guidance: call before submitting, pass the same args you would give the job tool. The alternative (invoking the job tool directly, spending credits) is implied by 'Spends nothing' and 'BEFORE submitting'. It does not explicitly state when not to use it — e.g. that it can't replace the job tool itself or that doseedo_account is the place for balance history — so it stops short of full routing coverage.

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)A
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
nameNoA recipe name or alias, e.g. "session" / "stems-to-session". Omit to list all.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reframe_videoPut a video in another frame (9:16, 4:5, 1:1, 16:9)AInspect

REFRAME A VIDEO: the same video in another frame, for where it is posted — 9:16 (stories, reels, shorts), 4:5 (a feed post), 1:1 (square) or 16:9 (a landscape master). fit "fit" (default) keeps the whole picture, centred over a blurred fill of itself, so nothing is cut (captions at the top or bottom of a vertical ad stay); "fill" scales to cover the frame and centre-crops the rest (the report says how much of the picture is kept). The sound is kept as it is (a scored film's mix untouched). Up to 1080 px on the short side (never upscaled past the source's), H.264 MP4. A video already in that frame is copied, not re-encoded. Input: video_key (an upload) or video_url (a doseedo_score_to_picture video as returned, or any public https URL). CPU, no credits. Async: job_id → doseedo_wait_task. Cancel: the plane has no stop for a running re-frame — 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.

NameRequiredDescriptionDefault
fitNofit (default): the whole picture over a blurred fill, nothing cut. fill: cropped to fill the frame.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
aspectYesThe frame: 9:16 (stories, reels, shorts), 4:5 (feed), 1:1 (square), 16:9 (landscape).
video_keyNoR2 ingest key of the video (from doseedo_get_upload_url).
video_urlNoThe video's URL: a doseedo_score_to_picture video as returned, or a public https URL.
idempotency_keyNoOptional. 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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only covering the read/write/safety profile, the description carries rich behavior: fit versus fill (blurred-fill preservation vs centre crop), audio preserved untouched, 1080 px short-side cap with no upscaling, H.264 MP4 output, and passthrough copy when the video is already in that frame. It also discloses the important operational facts — CPU with no credits, async job_id, and that a running re-frame cannot be stopped (credits spent, output discarded, only queued jobs refunded). The idempotentHint=false alongside an idempotency_key parameter is a nuance rather than a contradiction, since the key makes retry-safety opt-in.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first clause and every operational fact (fit semantics, format, credits, async, cancel) is present. There is some redundancy — the four aspect ratios and their use cases are restated from the schema's enum descriptions, and the cancel explanation is a long parenthetical chain — but little is genuinely wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation-style render with no output schema, the description supplies everything an agent needs: accepted inputs and their provenance, output container and resolution ceiling, cost model, async hand-off to doseedo_wait_task, and the cancellation/refund outcome. Nothing essential to calling it correctly or setting user expectations is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 genuine meaning: it explains that fit (the default) centres the picture over a blurred fill of itself so captions survive, and that fill centre-crops with the report stating how much of the picture was kept. It also clarifies where video_url may legitimately come from. The name and idempotency_key parameters are left entirely to the schema, which keeps this below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"REFRAME A VIDEO: the same video in another frame" gives a specific verb and resource, and immediately enumerates the four target frames with their real-world use cases (stories, reels, shorts, feed, square, landscape master). An agent can distinguish this from doseedo_score_to_picture or doseedo_bounce_session without inspecting any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names the concrete situations each aspect ratio serves and the two acceptable input sources (an upload video_key, or a video_url obtained from doseedo_score_to_picture or any public https URL), plus the async follow-up route via doseedo_wait_task. What is missing is an explicit exclusion — nothing says when to reach for a sibling instead, e.g. when re-framing is unnecessary because the video is already correct.

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, a virtual instrument: plays a part you wrote. 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. Input ONE of: notes[] ({pitch, start_beats, duration_beats, velocity} — beats from bar 1), 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): the drum model (default) PLAYS a kit — the sound of acoustic drums; it can drop a hit (takes[].fit.missing). drum_engine:"oneshot" = a programmed sampler kit for drum_genre (default for "electronic"/"808"), every hit as written — drum machines only; real drums (a kit, boom bap) stay on the model (drop a hit: take again). "synth" = a one-shot patch (synth_role, synth_genre; "performed" = played, less 1-shot); result.oneshots = the samples. SOUND: a preset (timbre_preset), a recording's tone (timbre_audio_url = timbre transfer; a drum kit too: a ride / snare recording), 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.

NameRequiredDescriptionDefault
bpmNoREQUIRED (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.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
seedNoRandom seed (−1 or 0–4294967295). Reuse a result's seed to re-render close to the same take.
tuneNoLight 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.
notesNoThe 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.
takesNoHow 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.
lyricsNoA SUNG part (instrument "voice" — a solo singer — or "choir"): the words, one syllable per note in time order ("Hold the light a lit-tle lon-ger": hyphens split a word where you want, "_" holds a syllable over the next note; one word such as "Ah" is sung on every note). ≤ 2000 characters. Without it a sung part sings "Ooh". Any other instrument: an error.
promptNoOptional caption override (default: the instrument id), ≤ 16000 characters. Style words help a little; the notes are the control.
refineNoOpt-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).
vaefixNoVAE 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_idNoA 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.
dynamicsNoOne 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_urlNoAlternative 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_idNoWith session_id: the t_… id of the MIDI/instrument track to render.
tempo_mapNoTempo 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_genreNoThe drum style. A drum machine (instrument "electronic" or "808"): the genre whose one-shot kit plays the part — "house", "techno", "trap", "drill", "dnb", "amapiano", "synthwave"… or free words. A real-drums style ("boom bap", "lo-fi", "breakbeat", "funk", "rock", "jazz"…) plays on the drum model's drum_kit instead, never a one-shot kit. Default: the instrument.
instrumentYesREQUIRED. 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_idNoAlternative to notes: with track_id, render THAT session track's notes (read from doseedo_get_session's summary).
synth_roleNoinstrument "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_engineNoWho plays a drum part: "model" = the drum model (the default for every kit but electronic / 808): a drummer playing the kit in a room — cymbals ring, hits vary, ghost notes speak; the sound for acoustic drums. It can drop or smear a hit: read takes[].fit and take it again. "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, but it sounds programmed (one sample per drum, the same on every hit) — for drum-machine genres only. An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot — and so does a real-drums drum_genre on whatever kit, which plays on drum_kit (funk, boom bap, lo-fi, breakbeat: a sampled break is a drummer; its dust comes from the mix, doseedo_mix style "1990s-hiphop" / "lofi-hiphop"; the submit reply says so, prepared.drums). A take that drops a hit is taken again (takes: 3, keep the best). Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81.
synth_genreNoinstrument "synth": the genre the patch is made for — "house", "techno", "trap", "synthwave", "lo-fi", "dnb"… or free words.
synth_wordsNoinstrument "synth": extra sound words for the patch ("reese", "warm analog", "acid"), ≤ 80 characters (a longer one is cut at a word boundary, with a warning).
voice_splitNotrue = the notes hold chords: split them into the voices one player of this instrument can hold and render every voice (result.voices). A SUNG chord (choir, voice) is sung one stem per voice, each in its register, one take each. Default false (a chord in a mono part is an error the model will fudge).
synth_engineNoWho plays a synth part: "oneshot" = a patch of one-shots made for it (the default for "synth"; every note the same sample), "performed" = that same patch (synth_role / synth_genre / synth_words pick it) played by the synth model trained on real synth loops — each note its own, the tone moving, the written notes kept (lora_strength 0.5 default; seed = another performance), "model" = the instrument model alone.
lora_strengthNoWith lora_id (or synth_engine "performed"): 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; performed synth 0.5 — up to ~0.75 plays it looser, past that it starts leaving the notes).
timbre_presetNoA 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_curveNoWhat 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_signatureNoMeter of the part, e.g. "4/4", "3/4", "6/8" (default 4/4). Written into the MIDI and the caption.
idempotency_keyNoOptional. 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_urlNoREVISE 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_secondsNoLength 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_beatsNoWith revise_take_url: end of the region to redo (exclusive), beats from bar 1.
timbre_audio_urlNoTIMBRE 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_beatsNoWith revise_take_url: start of the region to redo, beats from bar 1.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, it discloses async timing (~1–3 min), takes returned best-first, pre-signed 24-hour URLs, note-fidelity caveats, credit refund behavior on cancellation, and detailed drum/synth engine outcomes. These details are substantive and do not contradict the supplied readOnly/openWorld/idempotent/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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and core input modes are front-loaded, but the description is very dense and repeats schema-level material such as the GM drum pad mapping and note object fields. It is comprehensive and structured, yet portions could be trimmed or left to the schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 must carry return behavior; it does so by explaining job_id, doseedo_wait_task, takes with rank/score, pre-signed URLs, seed, duration, voices, refine, chain, and cancellation outcomes. That is complete for a complex 34-parameter render tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already defines each parameter. The description still adds meaningful cross-parameter routing: input must be exactly one of notes[], midi_url, or session_id + track_id, and notes are sent as given with no pitch snapping or quantizing. Most per-parameter detail is rightly left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the exact transformation (MIDI to audio) and the resource (an AI virtual instrument playing a written part). It clearly distinguishes this from doseedo_analyze_midi, doseedo_instruments, doseedo_wait_task, and doseedo_train_instrument by assigning each sibling its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing: run doseedo_analyze_midi first for a free harmony check, use doseedo_wait_task for async jobs, pull instrument ids from doseedo_instruments, and use doseedo_train_instrument for custom lora_id. It also explains when to choose drum_engine "oneshot" versus "model" and synth_engine "oneshot"/"performed"/"model" based on genre and acoustic versus electronic context.

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

Plays a whole arrangement you wrote in one call — film scoring, orchestral arrangement, background music, a song or instrumental (a film cue, a string quartet, a big-band chart): each 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). 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, summed into ONE section stem — an orchestra = violins I / II, violas, cellos, basses as five parts with players 6 / 6 / 4 / 4 / 3, horns 2–4 in unison; a choir = S/A/T/B parts on "choir" (Carmen, "choir:hp", "choir:m2" or YOUR singer: parts[].timbre_audio_url), which SINGS parts[].lyrics ("Ooh" without), players 4–8 (recipe "choir"); a solo: no players. The WHOLE orchestra in one call: ≤ 32 lines and ≤ 96 player rows (players: N = N rows), any instruments together, ≤ 600 s. Drums: the drum model is a real kit, drum_engine "oneshot" a drum machine. Synth parts: 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.

NameRequiredDescriptionDefault
bpmNoTempo 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.
mixNoAlso bounce a summed mix of the stems (default true).
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
seedNoRandom seed (reuse to re-render close to the same performance).
tuneNoLight 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).
partsNoThe parts you wrote: [{name?, instrument, timbre_preset?, lora_id?, players?, lyrics?, notes:[{pitch, start_beats, duration_beats, velocity?, lyric?}], dynamics?}] — beats from bar 1, concert pitch. lyrics / lyric: a choir part's words. 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).
vaefixNoVAE 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_urlNoAlternative 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…). A track's CC11 lane (CC1 on a wind / brass / string / bass part) is its written dynamics: a held note swells as it says.
score_keyNoAlternative to parts: a score file on YOUR machine — doseedo_get_upload_url {filename: "cue.mid" | "cue.musicxml" | "cue.mscz"} → PUT the file → its score_key (kept 24 h). A big score sent as a file, not as notes in this call.
score_urlNoAlternative to parts: a score file URL — MIDI, MusicXML or a MuseScore .mscz / .mscx, told apart by its content.
tempo_mapNoTempo changes [{beat, bpm}] (first point at beat 0). Overrides a file's own tempo.
instrumentsNoName the instrument for any part: {"Violin I": {"instrument": "violin", "players": 6}, "2": {"instrument": "acoustic_guitar", "timbre_preset": "koto:preset1"}, "Choir": {"instrument": "choir", "players": 6, "lyrics": "Glo-ri-a"}} — key = the part name or its 0-based index; players makes a MIDI / MusicXML part a section, lyrics gives a sung part its words (as parts[].lyrics), timbre_audio_url / timbre_audio_urls its own singer or sound (as parts[]: {"Soprano": {"timbre_audio_url": "https://…/singer.wav"}}), drum_engine "oneshot" (+ drum_genre) plays a file's drum part on a one-shot kit ({"Drums": {"drum_engine": "oneshot"}} — no instrument keeps the part's own). Wins over the name/program match.
musicxml_urlNoAlternative to parts: a MusicXML score (.musicxml / .xml / .mxl, ≤ 8 MiB) exported from Dorico, Sibelius, Finale, MuseScore, or written by you — or a MuseScore file itself (.mscz / .mscx), read with all its markings.
time_signatureNoMeter, e.g. "4/4" (default, or the file's).
idempotency_keyNoOptional. 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_secondsNoRender length (default: the last note + 2 s; ≤ 600).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses hard caps (≤32 lines, ≤96 player rows, ≤600 s), cost behavior ('Each player renders (and costs) like a part'), a failed part being re-rolled once, and a precise cancellation policy distinguishing jobs not yet on GPU (refunded) from in-flight renders (credits spent, output discarded). It even describes the result object's receipt fields, which no output schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and the ★ SECTIONS marker helps, but the body is a single very long paragraph with dense em-dash clauses and abbreviations that a reader must re-parse. Several passages duplicate schema descriptions (GM drum pads, lyrics syllable rules, dynamics automation) rather than adding value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter, deeply nested, no-output-schema render tool, it covers what is needed: input alternatives, limits, timing, per-part result fields with fit.verdict/coverage and lora.applied, mix_url, and the async/cancel lifecycle. Almost nothing an agent needs to call this correctly is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already carries per-parameter semantics; the description nevertheless adds cross-parameter meaning it cannot express — file parts matched by name then GM program, instruments{} keyed by name or 0-based index winning over that match, and a chord on a one-line instrument splitting into one stem per voice. Some sections (lyrics, dynamics lane, drum pad map) merely restate schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource ('plays a whole arrangement you wrote in one call') and immediately scopes it with concrete genres. It also names the boundary case explicitly ('Synth parts: doseedo_render_midi'), so an agent can separate this from the MIDI and generic-generation siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It spells out the alternative input paths (parts[], midi_url, musicxml_url) and when each applies, plus concrete selection rules: players 2–8 for a section versus a soloist, drum_engine 'model' for acoustic kits versus 'oneshot' for drum machines, and real-drum genres that must stay on the model. It also hands off the next steps (doseedo_mix then doseedo_session_from_stems) and the async path (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_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|dialogue|effects, duck?, name?}], ≤ 64. Keep the production audio (default) or drop it (production_audio:"drop"). A FILM THAT ALREADY HAS MUSIC: keeping its audio mixes the old music under yours — split it first (doseedo_split_soundtrack) and lay its dialogue and effects stems back (start_s 0, role dialogue / effects) with production_audio:"drop": the old music is gone, the lines are kept, and the duck reads the lines off the dialogue stem; lay the old music stem back too with duck:false to keep it (or a part of it). With dialogue tracks the delivery also returns the dialogue / music / effects stems. 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.

NameRequiredDescriptionDefault
duckNoDialogue 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.
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
tracksYesWhat to lay on the film, in any order.
dialogueNoDialogue spans [{start_s, end_s}] to duck under, instead of detecting them (use the cue sheet's dialogue, or your own).
loudnessNoDelivery loudness: "web" (−16 LUFS, default), "streaming" (−14), "broadcast" / "ebu" (−23), "atsc" (−24), or a LUFS number (−36…−8).
video_keyNoR2 ingest key of the video (the same upload doseedo_spot_video used).
video_urlNohttps URL of the video, as an alternative to video_key.
start_timecodeNoSMPTE 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_keyNoOptional. 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_audioNokeep (default) mixes the video's own soundtrack — all of it, its music included — under the score; drop replaces it (lay a doseedo_split_soundtrack's dialogue + effects stems to keep the lines).
production_gain_dbNoTrim on the production audio when kept (default 0).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark it non-readOnly, openWorld and non-idempotent; the description supplies the real behavioural picture: mux with no re-encode, CPU with no credits, dialogue detection by VAD or supplied spans, measured delivery report, and — critically — that a running delivery cannot be stopped, burns credits, ends as canceled with output discarded, and is only refunded when still queued at the plane.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose then workflow, and nearly every clause carries decision-relevant content. It is nonetheless a dense single block with heavily nested parentheticals and an inline tracks sketch that duplicates the schema, which costs some readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 11 parameters, nested objects and no output schema, the description covers inputs, the split-soundtrack workflow, duration limits, async handoff, cancellation/refund behaviour, and the returned artefacts and measurement report. An agent has what it needs to call this correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning: audio_url must be a doseedo_mix mix_url or any public https URL, role defaults to music and is ducked, tracks cap at 64, start_s negative means the head is cut at the first frame, and production_audio:"keep" also drags the film's own music under the score. It does not re-cover the finer fade/source_start_s knobs the schema documents, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: lay mixed cues on the picture at SMPTE timecode, with ducking, loudness normalisation and mux. It explicitly identifies itself as "the last step of scoring a film" and names the surrounding siblings (doseedo_mix mix_url, doseedo_split_soundtrack, doseedo_spot_video), so it is distinguishable without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use routing: use it after mixing, split first with doseedo_split_soundtrack if the film already has music and lay dialogue/effects stems back with production_audio:"drop", or lay the old music back with duck:false. It also names the async path (job_id → doseedo_wait_task), the 25-minute reel limit, and the cancel/refund rule, 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_separate_stemsSeparate stems (vocal remover)AInspect

STEM SEPARATION and VOCAL REMOVER: split an uploaded mix into stems (vocals, drums, bass, guitar, piano, other — or orchestral/auto-detected instruments) to isolate vocals (the vocals stem is the acapella; the other stems are the karaoke backing), with optional per-stem MIDI transcription and DAW-session export. Async: returns a job_id — poll with doseedo_wait_task (~2 minutes). Result: stems{name: url}, midi{name: url}, drum_substems{kick, snare, …} (drum_split), vocals_lyrics / vocals_notes, session_tracks + session_tempo_bpm when session_id was given, models_effective (what the auto family gate actually ran), other_classification (what the "other" stem was heard as), guitar_split (outcome). Cancel: the plane has no stop for a running separation — 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.

NameRequiredDescriptionDefault
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
exportNoOptionally also build a DAW session from the stems.
modelsNoSeparation model set. Default 6stem (vocals/drums/bass/guitar/piano/other); auto/orchestra/detect for wider instrument sets.
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio, as an alternative to audio_key: a doseedo result URL exactly as a job returned it (a stem, a take, a bounce), or any public URL. The gateway fetches it (≤256 MB) into your account's ingest storage before the job starts. Pass audio_key OR audio_url.
drum_splitNotrue = also split the drum stem into isolated kick / snare / hi-hat / toms / ride / crash (+ perc) sub-stems (result.drum_substems).
session_idNoRegister the stems INTO this doseedo session (from doseedo_list_sessions) as audio tracks — result.session_tracks lists them. Needs parent_track_id.
stems_onlyNotrue = the stems and NOTHING derived from them (no MIDI, no lyrics, no latents) — the fastest, cheapest separation. Implies include_midi:false.
instrumentsNomodels=orchestra only: comma-separated extractor targets, e.g. "saxophone,trumpet,trombone". Available: drums, percussion, bass, double_bass, guitar, electric_guitar, acoustic_guitar, piano, organ, harp, brass, trumpet, trombone, french_horn, tuba, saxophone, clarinet, oboe, bassoon, flute, woodwind, strings, violin, viola, cello. Omit for the curated default set.
guitar_splitNoDeal the guitar stem into N players (same-instrument separation): "2"–"4", or "auto" (a one-vs-two probe decides; no split when it hears one). Outcome in result.guitar_split.
include_midiNoAlso transcribe each stem to MIDI (default true).
idempotency_keyNoOptional. 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.
parent_track_idNoWith session_id: the t_… track the mix sits on; the stems are added as its children.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the operation is not read-only and open-world; the description goes far beyond by disclosing the async job_id model, the ~2 minute poll loop, that cancellation does not stop a running separation (credits are spent and output discarded), and that only plane-queued jobs get a failure refund. It also enumerates the exact result keys (stems, midi, drum_substems, vocals_lyrics, session_tracks, models_effective), so the agent knows what comes back despite there being 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause and every subsequent clause carries operational information (async flow, result keys, cancel economics). It is dense and parenthetical-heavy — one long block rather than separated sections — which costs some scannability, but little of it is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, no-output-schema, expensive async job this is unusually complete: input sourcing (audio_key vs audio_url, 256 MB fetch limit), model selection, derivative outputs, result field inventory, polling path, and cancellation/refund behavior are all covered. An agent could call and follow up on this tool correctly from the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 cross-parameter meaning the schema only states piecemeal: stems_only implying include_midi:false, session_id requiring parent_track_id and yielding session_tracks/session_tempo_bpm, and guitar_split/other_classification outcomes flowing into named result fields. The optional idempotency_key semantics are also spelled out in behavior terms (same job returned after a timeout).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('split an uploaded mix into stems') and enumerates the outputs (vocals/drums/bass/guitar/piano/other or orchestral sets), plus a secondary framing ('vocal remover', acapella vs karaoke backing). That is enough to distinguish it from neighbors such as doseedo_split_soundtrack or doseedo_transcribe without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real context: use it to isolate vocals or produce karaoke backing, use stems_only for the fastest/cheapest run, use models=orchestra with instruments for wider sets, and poll with doseedo_wait_task. What it lacks is an explicit exclusion statement — nothing says when to prefer doseedo_split_soundtrack, doseedo_transcribe, or doseedo_session_from_stems instead.

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.

NameRequiredDescriptionDefault
bpmNoProject tempo (default 120).
cuesNoMCP: ONE session for a whole scored film — [{cue: "1M1", start_s, from_job: <its doseedo_render_score job>, mix_job?: <its doseedo_mix job>, emotion?}] (≤ 12 cues, from the cue sheet's start_s). Every cue's stems and MIDI land on one timeline at its start, on ONE tempo map (each cue's own tempo_map joined, each cue's bar 1 on a bar line), a marker per cue, each track at its cue's mix level and pan, each cue's mix as a muted reference. Replaces from_job / mix_job / stems.
nameNoProject name — the project inside the zip, and the zip itself downloads as <name>_session.zip.
stemsNo[{name, audio_url | audio_key, gain_db?, pan?, mute?, position_beats?}] — the audio tracks, in order.
videoNoThe film the music is written to: {video_key: the ingest/ key of your upload (doseedo_get_upload_url), name?, start_s?}. It is re-encoded lean (720p) and travels inside the project: REAPER gets a muted video track, Logic Pro gets its Movie (inside the package; Logic finds it by name). Ableton projects are built without it (the answer says so).
targetNoWhich DAW (default logic): Logic Pro (.logicx), Ableton Live (.als) or REAPER (.rpp + media, with the film as a video track).
markersNoArrangement markers [{name, beat}] — beat 0 = bar 1 on the project's tempo map. A scored film's cues are written as markers by `cues`.
mix_jobNoMCP: 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_jobNoMCP: a doseedo_render_score job_id — its stems, parts' MIDI and tempo are used (no other input needed).
mixgraphNoA 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_mapNoTempo changes [{beat, bpm}] for the project.
midi_tracksNoOptional MIDI tracks: [{name, notes:[{pitch, start_beats, duration_beats, velocity?}]}].
session_beatsNoLength of the session in beats (the tempo map is written this far; default: the last note). `cues` sets it.
time_signatureNoMeter (default 4/4).
idempotency_keyNoOptional. 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

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say non-readOnly, non-destructive, non-idempotent and open-world; the description adds the operational facts an agent actually needs beyond that: async job semantics with a 30-90 s wait, a pre-signed zip URL that expires in 24 h, credits that are spent even if the job is abandoned, that a running build cannot be stopped, and that only a queued job is refunded. It also discloses secondary behavior such as video re-encoding to 720p, the video appearing only as a muted track in REAPER/Logic, and Ableton projects being built without video.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence front-loads the deliverable and the source/target choices, so scanning yields the essentials quickly. It is dense — the run of clauses about cues, tempo maps and reference tracks in one sentence, plus a long trailing paragraph on cancellation and refunds, costs a little readability, but almost every clause carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter, nested, async rendering tool with no output schema, the description covers the workflow, the return artifact (pre-signed zip named <name>_session.zip) and the failure/cancel economics, which is nearly everything an agent needs. The only gap is that it says nothing about the shape of an error or partial-failure response, which matters for a job that can spend credits and be discarded.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 does not carry: stems URLs may be result links used as-is, cues replaces from_job/mix_job/stems and caps at 12 cues with bar-1-on-a-bar-line joining, target defaults to logic, and mixgraph applies only gain_db and pan (its EQ, compression, reverb and rides are discarded). The idempotency_key and session_beats interplay is left to the schema, which keeps this off a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and deliverable ("Build a native DAW PROJECT from stems") plus the concrete artifacts (one audio track per stem from bar 1, optional MIDI tracks, on your tempo) and the three output formats (.logicx, .als, .rpp zipped). It is clearly separable from siblings like doseedo_render_score and doseedo_separate_stems because it consumes their output rather than producing audio.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three explicit entry paths with the condition selecting each: pass from_job plus a doseedo_render_score job_id, pass raw stems [{name, audio_url}] from renders/separations, or add mix_job after doseedo_mix. It also names the mandatory follow-up (doseedo_wait_task ~30-90 s) and explains the cues alternative for multi-cue films, so an agent never has to guess which parameter set applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doseedo_split_soundtrackSplit a film's soundtrack (dialogue / music / effects)AInspect

SPLIT A FILM'S SOUNDTRACK (dialogue / music / effects — "DME" — separation): the film's own audio into three stems that sum back to it, plus a report of what it holds: whether there is music already, where it plays (spans in seconds) and how much of the film it covers, where the dialogue is (cleaner than VAD on the full mix: a song's singer stays in the music stem), each part's level, and how far the music sits under the lines. Use it before scoring a film that already has music (soundtrack.stems.music.present): to REPLACE that music, lay the dialogue and effects stems under your score with doseedo_score_to_picture (production_audio:"drop", tracks role "dialogue" / "effects"); to REMIX or RE-ORCHESTRATE it, the music stem goes to doseedo_separate_stems / doseedo_transcribe / doseedo_analyze_song; to KEEP it, score where the report shows no music. Input: video_key (the upload doseedo_spot_video read) or video_url; audio_key / audio_url for a soundtrack already on its own. One reel per call (≤ 30 min). The split is good, not perfect: the dialogue comes out clean, while some of the old music (its percussion most) reads as effects — about −10 dB of it stays in the dialogue + effects bed, which the new score masks. Async: job_id → doseedo_wait_task (about a third of the soundtrack's length: a 3-min scene ≈ 1 min, a 20-min reel ≈ 6 min). Cancel: the plane has no stop for a running split — 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.

NameRequiredDescriptionDefault
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
audio_keyNoAn ingest key of the soundtrack on its own (WAV/FLAC/MP3/M4A), instead of the film.
audio_urlNohttps URL of the soundtrack on its own, instead of the film.
video_keyNoR2 ingest key of the film (the same upload doseedo_spot_video read; starts with "ingest/").
video_urlNohttps URL of the film, as an alternative to video_key (fetched through the URL up to 256 MB; upload a bigger film).
idempotency_keyNoOptional. 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

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false), and the description adds substantially beyond that: async job_id → doseedo_wait_task, a runtime estimate of roughly one third of soundtrack length, and the cancel/refund rule that a running split cannot be stopped and its credits are spent. The one real gap is that it never says the call spends credits up front or what happens to the returned job when the run fails — but the cancellation and refund semantics it does disclose are the kind of operational detail annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first clause and every subsequent block carries load-bearing content: routing branches, quality caveat, async timing, cancel policy. It is dense and parenthesis-heavy (nested quotes, em-dashes, colon chains) enough that a reader has to work, but nothing is filler and no sentence could be dropped without losing a real decision input.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 it well: it enumerates the report contents (music present, spans in seconds, coverage, dialogue locations, per-part levels, music-under-dialogue depth). The quality caveat (dialogue clean, some percussion bleeding into effects at about −10 dB) is exactly the kind of expectation-setting a caller needs. It stops short of describing the job object fields a caller must poll, which keeps it off a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all six parameters are already documented, and the description mostly restates them (video_key from doseedo_spot_video, key-or-URL alternatives). It does add one constraint absent from the schema — one reel per call, ≤ 30 min — which justifies staying at the baseline rather than falling below it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("split a film's soundtrack") plus the exact output shape: three DME stems that sum back to the source, plus a report. It distinguishes itself from the sibling doseedo_separate_stems by scope (whole film soundtrack vs. music-only separation), so an agent can pick between them 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ("use it before scoring a film that already has music") and then three named branches — REPLACE via doseedo_score_to_picture with production_audio:"drop", REMIX/RE-ORCHESTRATE via doseedo_separate_stems / doseedo_transcribe / doseedo_analyze_song, KEEP by scoring where the report shows no music. It also routes the async handoff to doseedo_wait_task and the cancel question to the absence of a stop call, which is exactly the when/when-not guidance the dimension asks for.

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; SCENES — where the picture moves to a new place, at a cut or with none (a camera move, a dissolve) — each with its start, how it arrives, how fast the camera travels (pace) and a 640-px frame; and a storyboard: the whole film on one JPEG, a frame every few seconds; where dialogue is (Silero VAD) and loud audio hits; INTENSITY — the picture's energy (motion, cutting, camera, the sound) as sections [{start_s, end_s, level, rel: low | medium | high | peak}], and each scene's own: where the music steps up, settles and peaks; 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 scene frames and the storyboard 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), spotter. 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.

NameRequiredDescriptionDefault
nameNoOptional: a name for this job's files, e.g. "rainy-loop-3". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: "rainy-loop-3b"). Default: doseedo-<last 6 characters of the job id>.
reelNoReel number for the cue ids (default 1 → 1M1, 1M2 …).
spotterNoWho places the cues. "rules" (default): light, motion and editing, weighted by hand, at coverage. "model": a cue model trained on 200 human-scored films. It places the cues where a composer would, and gives each cue its tempo (suggested_bpm), dynamics marks (dynamics: pp–ff every 8 s), turns (where it comes in full or steps up or down) and hits. Its tempo_map_input lands the hits on a beat and the turns on a bar line. Without coverage it decides how much of the film gets music; cue_sheet.cue_model says what it decided.
coverageNoHow 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.
keyframesNoHow many shots get a keyframe JPEG (default 24; the longest shots first). 0 = no images at all (no scene frames, no storyboard).
video_keyNoR2 ingest key of the uploaded video (doseedo_get_upload_url with the file name, e.g. reel1.mp4; starts with "ingest/").
video_urlNohttps URL of the video, as an alternative to video_key (a public file URL, fetched directly; ≤ 2 GB).
cut_thresholdNoScene-change threshold at full contrast (default 0.3). Lower finds softer cuts, higher only the hardest.
start_timecodeNoSMPTE 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_keyNoOptional. 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

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, openWorld=true, non-idempotent and non-destructive; the description goes far beyond that with the operational facts an agent needs: it is async (job_id → doseedo_wait_task), ~1 min for a 10-min 1080p reel, CPU-based with no credits for the analysis itself, hard input limits (≤ 2 GB, ≤ 3 h), and the credit consequences. The cancellation clause is unusually candid — a running spotting pass cannot be stopped, credits are spent, output is discarded, and only jobs still queued are refunded — which directly warns against a destructive-cost mistake. It even discloses a limitation ('sees light, movement and editing, not meaning') that shapes how the caller must interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded correctly — the film-in/cue-sheet-out framing and 'first step of scoring to picture' land in the first clause — but the body is one very long, semi-colon-chained paragraph with no headings or line breaks. Output enumeration, input constraints and the cancel/refund policy are all run together, so an agent scanning for the cost warning must read past dense shot-detection detail. Nearly every clause carries information, but the lack of structure makes it harder to use than its content warrants.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations covering cost, so the description must define the return payload itself — and it does, in detail: per-shot brightness/colour/motion/mood with keyframe JPEGs, scenes with arrival and pace, a storyboard, Silero VAD dialogue positions, intensity sections with rel levels, and cues with SMPTE timecodes, emotion, energy, tension arc, ranked hit points, suggested bpm and tempo_map_input. For a 10-parameter, credit-spending async tool it also states inputs, limits, the handoff chain, and the failure/refund semantics. Nothing an agent needs to call it correctly or interpret its result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 baseline; the description nonetheless adds meaning beyond it, notably that video_key comes from doseedo_get_upload_url and accepts mp4/mov/m4v/webm/mkv (not stated in the schema), that tempo_map_input should be passed to doseedo_tempo_map 'as is', and that keyframes=0 disables scene frames and the storyboard as well. The prose restates defaults for coverage, reel and start_timecode that the schema already documents, which caps it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb+resource+artifact: 'a video in, the music editor's cue sheet out', and immediately positions it as 'the first step of scoring to picture'. It explicitly distinguishes itself from downstream siblings by naming doseedo_tempo_map, doseedo_render_score, doseedo_mix and doseedo_score_to_picture, and it states the scope boundary ('sees light, movement and editing, not meaning'), which no other sibling claims.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context and an explicit pipeline: spot → doseedo_tempo_map per cue → write notes → render_score → mix → score_to_picture, plus the async handoff to doseedo_wait_task. It also says what 'spotter: model' is for versus 'rules' and when to raise/lower coverage. It never names a condition under which an agent should NOT use this tool (e.g. audio-only material belongs to doseedo_analyze_song or doseedo_split_soundtrack), so it stops short of full when/when-not routing.

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 pointsA
Read-onlyIdempotent
Inspect

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 / an eighth — per hit with hits[].land), staying near your tempo and inside bpm_range. A cue whose pace changes (she runs faster, then stops): give the hit where it changes a bpm, and the map moves to that tempo from there, every hit still landed. An AD or any cue that must hold ONE tempo: fixed_bpm: true (+ max_deviation_bpm, tolerance_ms) finds the tempo and the bar-1 offset (music_offset_s) landing the most hits, and says which ones it could not. 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.

NameRequiredDescriptionDefault
bpmYesThe cue's tempo (20–300) — the map stays as close to it as the hits allow.
fpsNoFrame rate of the timecodes: 23.976, 24, 25, 29.97, 30, 50, 59.94, 60.
hitsYesThe 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?, bpm?}] — land = THIS hit's landing ("downbeat", "beat" or "eighth"; default: the request's land), e.g. the big cuts on bar lines and a quick accent on an eighth. bpm = the tempo FROM this hit on, a new section (the chase at 160 from the cut where she starts running, back to 112 when she stops), until a later hit names another; the range around it scales with it. A bare number = {time_s}.
landNoLand hits on bar lines (default), on any beat, or on any eighth — the default for every hit without its own land.
start_sNoAlternative: the cue start in seconds of film time (informational when hits are time_s).
bpm_rangeNoAllowed tempo range [min, max] (default ±12 % of bpm).
fixed_bpmNoONE tempo for the whole cue (an ad, a song-form cue): the solver picks the tempo (within max_deviation_bpm of bpm; default exactly bpm) and where bar 1 sits (music_offset_s, default within the first bar; offset_range_s) so the most hits land within tolerance_ms (default 40). Hits it cannot land come back landed:false with nearest_beat — never an error.
tolerance_msNoSOFT hits (0–250 ms): a hit within this of the grid counts as landed, and one the grid can't reach is reported (landed:false), never refused. Every hit then carries error_ms; hit_rate = landed / all.
offset_range_sNofixed_bpm: where bar 1 may sit on the cue, [min, max] seconds (default [0, one bar]).
start_timecodeNoFilm timecode of the cue's first downbeat (bar 1); hit timecodes are measured from it.
time_signatureNoMeter (default 4/4).
max_deviation_bpmNoHow far the tempo may move from bpm (both modes; in place of bpm_range). A variable map at 124 ±12 % can swing 11+ bpm between hits — 3 keeps it a steady groove.

TDQS

A4.6/5.0
Behavior5/5

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 material context beyond them: it is pure math, free, instant, and needs no key, and it discloses that unlandable soft hits come back landed:false with nearest_beat rather than as an error. It also describes the returned tempo_map and hits shapes even though no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the opening clause, and every sentence carries useful information about modes, outputs, or timecode handling. The description is dense and somewhat long for a single block, with several parenthetical examples, but it avoids true filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no output schema, the description is complete enough: it covers the main scoring-to-picture use case, the fixed-tempo mode and its tolerance behavior, supported frame rates, and the returned tempo_map and hits arrays. It also identifies the downstream tools that consume the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 interpretive meaning beyond the schema: a hit-level bpm means the tempo from that hit onward until another hit names a new tempo, and max_deviation_bpm is illustrated with a concrete example of 124 ±12% versus 3. It does not explain every parameter, but it meaningfully clarifies the interplay among hits[].land, hits[].bpm, fixed_bpm, tolerance_ms, and bpm_range.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource — turn hit points into a tempo map that lands each hit on a downbeat, beat, or eighth — and distinguishes the output from downstream render tools by naming doseedo_render_midi, doseedo_render_score, and doseedo_session_from_stems. An agent can tell exactly what this tool produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames the primary use case (scoring to picture) and gives concrete modes: variable tempo when the cue's pace changes and fixed_bpm: true for an ad or any cue that must hold one tempo. It names downstream consumers, but does not explicitly compare against sibling alternatives such as doseedo_score_to_picture or doseedo_spot_video.

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.

NameRequiredDescriptionDefault
bpmNoOptional tempo of the recording (30–300).
nameNoA name for it, e.g. "Grandpa's banjo" (≤80 chars).
seedNoRandom seed.
notesNoOptional: the notes played, one list per file — [[{pitch, start, end, velocity?}…]] in SECONDS. Omitted, they are transcribed.
stepsNoTraining steps 50–800. Default 300 for ≤60 s of audio, 400 above.
audio_keyNoR2 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_urlNohttps URL of a recording (a doseedo result link — a separated stem works — or any public URL). Alternative to audio_key.
drum_modeNotrue for an unpitched percussion recording.
audio_keysNoSeveral uploaded takes of the SAME instrument (≤8).
audio_urlsNoSeveral recording URLs of the same instrument (≤8).
instrumentYesREQUIRED. The catalog instrument it is closest to (call.instrument from doseedo_instruments, e.g. "violin", "acoustic_guitar", "flute", "percussion").
idempotency_keyNoOptional. 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

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_transcribeAudio to MIDI (transcribe notes)AInspect

AUDIO TO MIDI transcription: a melody, a bass line or a part as notes (pitch, onset/offset seconds, velocity, confidence as JSON — not a MIDI file; for .mid files per stem use doseedo_separate_stems with transcription or doseedo_audio_to_session). Works from an uploaded audio_key or an audio_url — any public https URL, including a result URL from another doseedo job (a generate take, a stem) as it was returned. Async: returns a job_id — poll with doseedo_wait_task (usually ~15–60s). For the KEY / tempo / chords of a whole mix use doseedo_analyze_song instead. Cancel: the plane has no stop for a running transcription — 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.

NameRequiredDescriptionDefault
wantNoWhat to return: "notes" (default), "f0" (the continuous pitch contour — frame-rate Hz values, for glides/vibrato/intonation), or both.
chairsNopolyphony="section": register codes per chair, as an alternative to roster.
familyNoOptional instrument family (e.g. "brass", "reeds", "strings") when the exact instrument is unknown.
rosterNopolyphony="section": the chairs on the stem, e.g. "trumpet,trumpet,trombone,tenor_sax". Omit for the family default.
backendNoAdvanced: force a transcription backend. Omit — the server routes by instrument.
strikesNoWith tempo_bpm: also return the harmony_strikes attack grid.
registerNoOptional register hint for the instrument (e.g. "soprano", "tenor", "bass").
audio_keyNoR2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with "ingest/"). Provide this or audio_url.
audio_urlNohttps URL of the audio to transcribe (alternative to audio_key): any public URL, or a doseedo result URL exactly as a job returned it — no key needed.
polyphonyNoOptional: "solo" (monophonic line), "poly", or "section" (a horn section — see roster/chairs).
tempo_bpmNoOptional known tempo — enables beat-aligned note times.
instrumentNoOptional instrument hint, e.g. "piano", "sax", "vocals", "bass".
beats_per_barNoWith tempo_bpm: beats per bar for the beat-domain times (default 4).
idempotency_keyNoOptional. 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

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations by disclosing the async job_id contract, the polling tool (doseedo_wait_task) and expected ~15–60s duration, plus the cancellation reality: no stop for a running job, credits spent, output discarded, refund only if still queued. That cost/cancellation disclosure is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and output shape, then labeled segments ("Async:", "Cancel:") for scanning. The cancellation/refund sentences are a bit verbose and repeat the verb "runs"/"plane" phrasing, but each carries non-obvious operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter async transcription tool with no output schema, the description still covers what is returned (pitch, onset/offset seconds, velocity, confidence), how to obtain it (poll job_id), how to source audio, and what happens on failure/cancel. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, but the description adds workflow-level meaning the schema only hints at: audio_url may be any public https URL or a doseedo result URL exactly as returned, enabling chaining of generate/stem outputs. The remaining 13 params are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("AUDIO TO MIDI transcription") and immediately bounds the output (notes as JSON, not a .mid file). It names the sibling tools that handle the excluded cases (doseedo_separate_stems, doseedo_audio_to_session), so an agent can distinguish it 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: melody/bass/part → this tool; per-stem .mid files → doseedo_separate_stems or doseedo_audio_to_session; whole-mix key/tempo/chords → doseedo_analyze_song. It also spells out the two accepted input sources, so the when-to-use decision is fully determined.

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 jobA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
kindNoWhich 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, reframe_video, cover_song, separate_stems, split_soundtrack, 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, reframe, cover, separate, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases.
job_idNoAlternatively the job_id (job_…) from a submit tool or the jobs API — replaces task_id + kind.
task_idNoThe task_id returned by a submit tool.
timeout_secondsNoMax seconds to wait in this call (5–50, default 45). Start with the submit reply's suggested_next_wait.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses the hard 50-second server-side hold cap, the polling contract, the still_running flag, and the shape of a finished reply (output, pre-signed artifact links, note). This is exactly the behavioral context an agent needs to loop correctly instead of assuming one call suffices.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action and then the loop rule and return shape; nothing is padding. The nested parentheses (range, per-kind ETAs) make it dense to scan but each fragment carries real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly takes on the return-value burden (output, pre-signed artifact links, note, still_running). It omits failure/expiry behavior — what a failed or expired job returns and what the agent should do then — which is the main remaining gap for a polling tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter meanings are already documented; the description nonetheless adds decision-relevant context by tying timeout_seconds to the submit reply's stated ETA and giving per-kind latency figures that drive that choice. The job_id-versus-task_id+kind relationship is left to the schema, which already states it, so this stays a modest add rather than a full re-explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Wait for an async doseedo job to finish', then adds the mechanism (server-side polling) and the terminal outcomes (result or latest status). It implicitly separates itself from a one-shot status check by describing blocking/polling, but never names the sibling doseedo_check_task, so the distinction has to be inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete operational guidance: if the reply has still_running:true, call again, and a submit reply's eta_seconds tells you how many calls a job needs, with per-kind examples (~15 s, 1–3 min, ~4 min). What is missing is routing guidance against alternatives — when to use this versus doseedo_check_task or doseedo_list_jobs if you do not want to block.

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.

  1. 1 tool update
    • Changeddoseedo_score_to_picture5 fields changed
      • addedInput schema / properties / tracks / items / properties / fade_in_s
        Added value: +{
        +  "description": "A longer fade in from its first heard sample (the first frame when its head is cut).",
        +  "maximum": 30,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / tracks / items / properties / fade_out_s
        Added value: +{
        +  "description": "A longer fade out to its last heard sample — its own end, length_s, or the last frame: let a piece go over the last shot instead of cutting it.",
        +  "maximum": 60,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / tracks / items / properties / length_s
        Added value: +{
        +  "description": "How much of the audio plays from source_start_s (default: to its end or the last frame). The cut is faded (declick).",
        +  "maximum": 7200,
        +  "minimum": 0.05,
        +  "type": "number"
        +}
      • addedInput schema / properties / tracks / items / properties / source_start_s
        Added value: +{
        +  "description": "Where in the AUDIO it starts playing (default 0): pick the stretch of a longer piece — a public-domain recording cut to a :30 starts at the phrase you chose. The cut is faded (declick).",
        +  "maximum": 7200,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / tracks / items / properties / start_s / description
        Previous value: -"Or where it starts in seconds from the first frame."New value: +"Or where it starts in seconds from the first frame (negative = its head is before the first frame and cut there)."
  2. 1 tool update
    • Changeddoseedo_spot_video1 field changed
      • addedInput schema / properties / spotter
        Added value: +{
        +  "description": "Who places the cues. \"rules\" (default): light, motion and editing, weighted by hand, at coverage. \"model\": a cue model trained on 200 human-scored films. It places the cues where a composer would, and gives each cue its tempo (suggested_bpm), dynamics marks (dynamics: pp–ff every 8 s), turns (where it comes in full or steps up or down) and hits. Its tempo_map_input lands the hits on a beat and the turns on a bar line. Without coverage it decides how much of the film gets music; cue_sheet.cue_model says what it decided.",
        +  "enum": [
        +    "rules",
        +    "model"
        +  ],
        +  "type": "string"
        +}
  3. 5 tool updates
    • Changeddoseedo_check_task2 fields changed
      • changedInput schema / properties / kind / description
        Previous value: -"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, split_soundtrack, 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, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases."New value: +"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, reframe_video, cover_song, separate_stems, split_soundtrack, 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, reframe, cover, separate, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases."
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "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",
        -  "split_soundtrack",
        -  "transcribe",
        -  "audio_to_session",
        -  "convert_project",
        -  "bounce_session",
        -  "analyze_song",
        -  "detect_chords",
        -  "beat_grid",
        -  "check_take",
        -  "analyze_midi",
        -  "generate",
        -  "sound",
        -  "coverstem",
        -  "fillgap",
        -  "render",
        -  "train",
        -  "score",
        -  "stemsess",
        -  "spot",
        -  "picture",
        -  "cover",
        -  "separate",
        -  "soundtrack",
        -  "session",
        -  "convert",
        -  "bounce",
        -  "analyze",
        -  "chords",
        -  "beats",
        -  "check",
        -  "harmony"
        -]New value: +[
        +  "generate_music",
        +  "generate_sound",
        +  "cover_stem",
        +  "fill_gap",
        +  "render_midi",
        +  "train_instrument",
        +  "render_score",
        +  "mix",
        +  "session_from_stems",
        +  "spot_video",
        +  "score_to_picture",
        +  "reframe_video",
        +  "cover_song",
        +  "separate_stems",
        +  "split_soundtrack",
        +  "transcribe",
        +  "audio_to_session",
        +  "convert_project",
        +  "bounce_session",
        +  "analyze_song",
        +  "detect_chords",
        +  "beat_grid",
        +  "check_take",
        +  "analyze_midi",
        +  "generate",
        +  "sound",
        +  "coverstem",
        +  "fillgap",
        +  "render",
        +  "train",
        +  "score",
        +  "stemsess",
        +  "spot",
        +  "picture",
        +  "reframe",
        +  "cover",
        +  "separate",
        +  "soundtrack",
        +  "session",
        +  "convert",
        +  "bounce",
        +  "analyze",
        +  "chords",
        +  "beats",
        +  "check",
        +  "harmony"
        +]
    • Changeddoseedo_list_jobs1 field changed
      • changedInput schema / properties / kind / description
        Previous value: -"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, split_soundtrack, 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, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases."New value: +"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, reframe_video, cover_song, separate_stems, split_soundtrack, 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, reframe, cover, separate, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases."
    • Changeddoseedo_quote1 field changed
      • changedInput schema / properties / job / enum
        Previous value: -[
        -  "generate_music",
        -  "generate_sound",
        -  "cover_stem",
        -  "fill_gap",
        -  "render_midi",
        -  "train_instrument",
        -  "cover_song",
        -  "separate_stems",
        -  "split_soundtrack",
        -  "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"
        -]New value: +[
        +  "generate_music",
        +  "generate_sound",
        +  "cover_stem",
        +  "fill_gap",
        +  "render_midi",
        +  "train_instrument",
        +  "cover_song",
        +  "separate_stems",
        +  "split_soundtrack",
        +  "transcribe",
        +  "audio_to_session",
        +  "convert_project",
        +  "bounce_session",
        +  "spot_video",
        +  "score_to_picture",
        +  "reframe_video",
        +  "analyze_song",
        +  "detect_chords",
        +  "beat_grid",
        +  "analyze_midi",
        +  "render_score",
        +  "mix",
        +  "session_from_stems",
        +  "check_take"
        +]
    • Addeddoseedo_reframe_video
    • Changeddoseedo_wait_task2 fields changed
      • changedInput schema / properties / kind / description
        Previous value: -"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, split_soundtrack, 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, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases."New value: +"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, reframe_video, cover_song, separate_stems, split_soundtrack, 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, reframe, cover, separate, soundtrack, session, convert, bounce, analyze, chords, beats, check, harmony) are accepted aliases."
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "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",
        -  "split_soundtrack",
        -  "transcribe",
        -  "audio_to_session",
        -  "convert_project",
        -  "bounce_session",
        -  "analyze_song",
        -  "detect_chords",
        -  "beat_grid",
        -  "check_take",
        -  "analyze_midi",
        -  "generate",
        -  "sound",
        -  "coverstem",
        -  "fillgap",
        -  "render",
        -  "train",
        -  "score",
        -  "stemsess",
        -  "spot",
        -  "picture",
        -  "cover",
        -  "separate",
        -  "soundtrack",
        -  "session",
        -  "convert",
        -  "bounce",
        -  "analyze",
        -  "chords",
        -  "beats",
        -  "check",
        -  "harmony"
        -]New value: +[
        +  "generate_music",
        +  "generate_sound",
        +  "cover_stem",
        +  "fill_gap",
        +  "render_midi",
        +  "train_instrument",
        +  "render_score",
        +  "mix",
        +  "session_from_stems",
        +  "spot_video",
        +  "score_to_picture",
        +  "reframe_video",
        +  "cover_song",
        +  "separate_stems",
        +  "split_soundtrack",
        +  "transcribe",
        +  "audio_to_session",
        +  "convert_project",
        +  "bounce_session",
        +  "analyze_song",
        +  "detect_chords",
        +  "beat_grid",
        +  "check_take",
        +  "analyze_midi",
        +  "generate",
        +  "sound",
        +  "coverstem",
        +  "fillgap",
        +  "render",
        +  "train",
        +  "score",
        +  "stemsess",
        +  "spot",
        +  "picture",
        +  "reframe",
        +  "cover",
        +  "separate",
        +  "soundtrack",
        +  "session",
        +  "convert",
        +  "bounce",
        +  "analyze",
        +  "chords",
        +  "beats",
        +  "check",
        +  "harmony"
        +]
  4. 1 tool update
    • Changeddoseedo_fill_gap1 field changed
      • addedInput schema / properties / notes
        Added value: +{
        +  "description": "YOUR part for the gap — a custom part (a MIDI region drawn there in the DAW): [{pitch, start_seconds, duration_seconds, velocity?}], seconds of the audio you send. It is the written part, no planner: the take plays exactly these notes, in its own sound (notes outside the gap are ignored; silence where there are none). fill \"written\" or omitted. ≤2000.",
        +  "items": {
        +    "properties": {
        +      "duration_seconds": {
        +        "type": "number"
        +      },
        +      "pitch": {
        +        "type": "number"
        +      },
        +      "start_seconds": {
        +        "type": "number"
        +      },
        +      "velocity": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "pitch",
        +      "start_seconds",
        +      "duration_seconds"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  5. 5 tool updates
    • Changeddoseedo_cover_song1 field changed
      • changedInput schema / properties / genre / description
        Previous value: -"Optional GENRE style transfer: the target genre in a few words, at most 64 characters (e.g. \"bossa nova\", \"80s synth-pop\", \"West End musical showstopper\") — a name, not a description; every regenerated stem is captioned with it. Outcome in result.cover.genre."New value: +"Optional GENRE style transfer: the target genre in a few words, ≤ 64 characters (e.g. \"bossa nova\", \"80s synth-pop\", \"West End musical showstopper\") — a name, not a description; a longer one is cut at its last comma or word that fits, with a warning on the reply. Every regenerated stem is captioned with it. Outcome in result.cover.genre."
    • Changeddoseedo_cover_stem1 field changed
      • addedInput schema / properties / lyrics
        Added value: +{
        +  "description": "A SINGER's cover (instrument \"voice\" or \"choir\" — doseedo_instruments rows with sings:true): the words to sing, a line per phrase, in the order the recording sings them — e.g. the recording's own words transcribed. The take sings them in the recording's phrasing (its FSQ codes). ≤2000 chars. Without it a singer sings no words. Any other instrument: an error.",
        +  "type": "string"
        +}
    • Changeddoseedo_generate_music4 fields changed
      • changedInput schema / properties / lyrics / description
        Previous value: -"Optional lyrics to sing. Omit for instrumental."New value: +"Optional lyrics to sing, ≤ 16000 characters. Omit for instrumental."
      • addedInput schema / properties / lyrics / maxLength
        Added value: +16000
      • changedInput schema / properties / prompt / description
        Previous value: -"Style/mood/instrumentation prompt, e.g. \"warm jazz trio, brushed drums, late-night ballad\"."New value: +"Style/mood/instrumentation prompt, e.g. \"warm jazz trio, brushed drums, late-night ballad\". ≤ 16000 characters (a longer one is cut at a word boundary, with a warning)."
      • addedInput schema / properties / prompt / maxLength
        Added value: +16000
    • Changeddoseedo_generate_sound2 fields changed
      • changedInput schema / properties / prompt / description
        Previous value: -"What it sounds like, e.g. \"punchy house kick drum, single hit\" or \"dusty vinyl crackle\". ≤ 300 characters."New value: +"What it sounds like, e.g. \"punchy house kick drum, single hit\" or \"dusty vinyl crackle\". ≤ 300 characters (a longer one is cut at a word boundary, with a warning)."
      • addedInput schema / properties / prompt / maxLength
        Added value: +300
    • Changeddoseedo_render_midi6 fields changed
      • changedInput schema / properties / lyrics / description
        Previous value: -"A SUNG part (instrument \"voice\" — a solo singer — or \"choir\"): the words, one syllable per note in time order (\"Hold the light a lit-tle lon-ger\": hyphens split a word where you want, \"_\" holds a syllable over the next note; one word such as \"Ah\" is sung on every note). ≤2000 chars. Without it a sung part sings \"Ooh\". Any other instrument: an error."New value: +"A SUNG part (instrument \"voice\" — a solo singer — or \"choir\"): the words, one syllable per note in time order (\"Hold the light a lit-tle lon-ger\": hyphens split a word where you want, \"_\" holds a syllable over the next note; one word such as \"Ah\" is sung on every note). ≤ 2000 characters. Without it a sung part sings \"Ooh\". Any other instrument: an error."
      • addedInput schema / properties / lyrics / maxLength
        Added value: +2000
      • changedInput schema / properties / prompt / description
        Previous value: -"Optional caption override (default: the instrument id). Style words help a little; the notes are the control."New value: +"Optional caption override (default: the instrument id), ≤ 16000 characters. Style words help a little; the notes are the control."
      • addedInput schema / properties / prompt / maxLength
        Added value: +16000
      • changedInput schema / properties / synth_words / description
        Previous value: -"instrument \"synth\": extra sound words for the patch (\"reese\", \"warm analog\", \"acid\"), ≤80 chars."New value: +"instrument \"synth\": extra sound words for the patch (\"reese\", \"warm analog\", \"acid\"), ≤ 80 characters (a longer one is cut at a word boundary, with a warning)."
      • addedInput schema / properties / synth_words / maxLength
        Added value: +80
  6. 2 tool updates
    • Changeddoseedo_render_midi2 fields changed
      • changedInput schema / properties / drum_engine / description
        Previous value: -"Who plays a drum part: \"model\" = the drum model (the default for every kit but electronic / 808): a drummer playing the kit in a room — cymbals ring, hits vary, ghost notes speak; the sound for acoustic drums. It can drop or smear a hit: read takes[].fit and take it again. \"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, but it sounds programmed (one sample per drum, the same on every hit) — for drum-machine genres only. An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot: a take that drops a hit is taken again (takes: 3, keep the best). Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."New value: +"Who plays a drum part: \"model\" = the drum model (the default for every kit but electronic / 808): a drummer playing the kit in a room — cymbals ring, hits vary, ghost notes speak; the sound for acoustic drums. It can drop or smear a hit: read takes[].fit and take it again. \"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, but it sounds programmed (one sample per drum, the same on every hit) — for drum-machine genres only. An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot — and so does a real-drums drum_genre on whatever kit, which plays on drum_kit (funk, boom bap, lo-fi, breakbeat: a sampled break is a drummer; its dust comes from the mix, doseedo_mix style \"1990s-hiphop\" / \"lofi-hiphop\"; the submit reply says so, prepared.drums). A take that drops a hit is taken again (takes: 3, keep the best). Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."
      • changedInput schema / properties / drum_genre / description
        Previous value: -"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."New value: +"The drum style. A drum machine (instrument \"electronic\" or \"808\"): the genre whose one-shot kit plays the part — \"house\", \"techno\", \"trap\", \"drill\", \"dnb\", \"amapiano\", \"synthwave\"… or free words. A real-drums style (\"boom bap\", \"lo-fi\", \"breakbeat\", \"funk\", \"rock\", \"jazz\"…) plays on the drum model's drum_kit instead, never a one-shot kit. Default: the instrument."
    • Changeddoseedo_render_score2 fields changed
      • changedInput schema / properties / parts / items / properties / drum_engine / description
        Previous value: -"A drum / percussion part: \"model\" (default) = the drum model — a drummer playing the kit in a room (cymbals ring, hits vary, ghost notes speak): the sound for any acoustic kit, rock to jazz to a film cue. A take may drop or add a hit (parts[].fit.voices: missing / extra): render the part again for another take. \"oneshot\" = a one-shot kit generated for drum_genre, one sample per drum: every written hit lands exactly as written (a half-time bar stays half-time, a stop-time hit stays a hit), but it sounds programmed — the kit for electronic / drum-machine genres only (house, trap, 808). An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot: a take that drops a hit is rendered again. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."New value: +"A drum / percussion part: \"model\" (default) = the drum model — a drummer playing the kit in a room (cymbals ring, hits vary, ghost notes speak): the sound for any acoustic kit, rock to jazz to a film cue. A take may drop or add a hit (parts[].fit.voices: missing / extra): render the part again for another take. \"oneshot\" = a one-shot kit generated for drum_genre, one sample per drum: every written hit lands exactly as written (a half-time bar stays half-time, a stop-time hit stays a hit), but it sounds programmed — the kit for electronic / drum-machine genres only (house, trap, 808). An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot — and a kit whose drum_genre is real drums (funk, boom bap, lo-fi, breakbeat: a sampled break is a drummer; its dust comes from the mix, doseedo_mix style \"1990s-hiphop\" / \"lofi-hiphop\") plays on drum_kit whatever is asked (warnings say so). A take that drops a hit is rendered again. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."
      • changedInput schema / properties / parts / items / properties / drum_genre / description
        Previous value: -"With drum_engine \"oneshot\": the kit's genre / words, e.g. \"house\", \"techno\", \"trap\", \"synthwave\": a dry drum-machine kit. Default: the instrument."New value: +"With drum_engine \"oneshot\": the kit's genre / words, e.g. \"house\", \"techno\", \"trap\", \"synthwave\": a dry drum-machine kit. A real-drums genre (\"boom bap\", \"lo-fi\", \"breakbeat\", \"funk\") puts the part on the drum model's drum_kit. Default: the instrument."
  7. 1 tool update
    • Changeddoseedo_render_score1 field changed
      • changedInput schema / properties / parts / items / properties / timbre_audio_url / description
        Previous value: -"This part's OWN timbre: a recording of the singer (a choir part) or sound it should take on — an https URL, or the audio_key doseedo_get_upload_url returned for a file on your machine. The first 30 s are used; a clean solo take of the voice, 10–30 s, works best. Wins over the preset's voice; a choir part keeps the choir's adapter and sings in THIS voice. receipt: parts[].timbre."New value: +"This part's OWN timbre: a recording of the singer (a choir part) or sound it should take on (a drum part too: a kit, a ride or a snare recording on the drum model — not drum_engine \"oneshot\" or a sampled instrument, which play their own samples) — an https URL, or the audio_key doseedo_get_upload_url returned for a file on your machine. The first 30 s are used; a clean solo take of the voice, 10–30 s, works best. Wins over the preset's voice; a choir part keeps the choir's adapter and sings in THIS voice. receipt: parts[].timbre."
  8. 2 tool updates
    • Changeddoseedo_render_midi1 field changed
      • changedInput schema / properties / drum_engine / description
        Previous value: -"Who plays a drum part: \"model\" = the drum model (the default for every kit but electronic / 808): a drummer playing the kit in a room — cymbals ring, hits vary, ghost notes speak; the sound for acoustic drums. It can drop or smear a hit: read takes[].fit and take it again. \"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, but it sounds programmed (one sample per drum, the same on every hit) — for drum-machine genres, or the fallback when an acoustic part's takes keep losing a hit that must land. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."New value: +"Who plays a drum part: \"model\" = the drum model (the default for every kit but electronic / 808): a drummer playing the kit in a room — cymbals ring, hits vary, ghost notes speak; the sound for acoustic drums. It can drop or smear a hit: read takes[].fit and take it again. \"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, but it sounds programmed (one sample per drum, the same on every hit) — for drum-machine genres only. An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot: a take that drops a hit is taken again (takes: 3, keep the best). Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."
    • Changeddoseedo_render_score2 fields changed
      • changedInput schema / properties / parts / items / properties / drum_engine / description
        Previous value: -"A drum / percussion part: \"model\" (default) = the drum model — a drummer playing the kit in a room (cymbals ring, hits vary, ghost notes speak): the sound for any acoustic kit, rock to jazz to a film cue. A take may drop or add a hit (parts[].fit.voices: missing / extra): render the part again for another take. \"oneshot\" = a one-shot kit generated for drum_genre, one sample per drum: every written hit lands exactly as written (a half-time bar stays half-time, a stop-time hit stays a hit), but it sounds programmed — the kit for electronic / drum-machine genres (house, trap, 808), or the fallback for an acoustic part whose takes keep losing a hit that must land. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."New value: +"A drum / percussion part: \"model\" (default) = the drum model — a drummer playing the kit in a room (cymbals ring, hits vary, ghost notes speak): the sound for any acoustic kit, rock to jazz to a film cue. A take may drop or add a hit (parts[].fit.voices: missing / extra): render the part again for another take. \"oneshot\" = a one-shot kit generated for drum_genre, one sample per drum: every written hit lands exactly as written (a half-time bar stays half-time, a stop-time hit stays a hit), but it sounds programmed — the kit for electronic / drum-machine genres only (house, trap, 808). An acoustic kit (drum_kit: rock, punk, jazz, soul, a band seen playing) stays on the model, never oneshot: a take that drops a hit is rendered again. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."
      • changedInput schema / properties / parts / items / properties / drum_genre / description
        Previous value: -"With drum_engine \"oneshot\": the kit's genre / words, e.g. \"country rock, acoustic kit\", \"jazz brushes\", \"house\", \"trap\". An acoustic genre gets an acoustic kit in a small room; an electronic one a dry drum-machine kit. Default: the instrument."New value: +"With drum_engine \"oneshot\": the kit's genre / words, e.g. \"house\", \"techno\", \"trap\", \"synthwave\": a dry drum-machine kit. Default: the instrument."
  9. 1 tool update
    • Changeddoseedo_score_to_picture1 field changed
      • changedInput schema / properties / tracks / items / properties / duck / description
        Previous value: -"false = this music track is not ducked (the film's own music laid back from doseedo_split_soundtrack was mixed under its lines already). Default true."New value: +"false = this music track is not ducked: a band seen playing in the scene or a drop (the scene's own sound, forward), or the film's own music laid back from doseedo_split_soundtrack (mixed under its lines already). Default true."
  10. 3 tool updates
    • Changeddoseedo_render_midi1 field changed
      • changedInput schema / properties / drum_engine / description
        Previous value: -"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. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."New value: +"Who plays a drum part: \"model\" = the drum model (the default for every kit but electronic / 808): a drummer playing the kit in a room — cymbals ring, hits vary, ghost notes speak; the sound for acoustic drums. It can drop or smear a hit: read takes[].fit and take it again. \"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, but it sounds programmed (one sample per drum, the same on every hit) — for drum-machine genres, or the fallback when an acoustic part's takes keep losing a hit that must land. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."
    • Changeddoseedo_render_score1 field changed
      • changedInput schema / properties / parts / items / properties / drum_engine / description
        Previous value: -"A drum / percussion part: \"oneshot\" = played through a one-shot kit generated for drum_genre — every written hit lands exactly as written (a half-time bar stays half-time, a stop-time hit stays a hit); \"model\" (default) = the drum model, a live performance that may drop or add hits (check parts[].fit.voices: missing / extra). Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."New value: +"A drum / percussion part: \"model\" (default) = the drum model — a drummer playing the kit in a room (cymbals ring, hits vary, ghost notes speak): the sound for any acoustic kit, rock to jazz to a film cue. A take may drop or add a hit (parts[].fit.voices: missing / extra): render the part again for another take. \"oneshot\" = a one-shot kit generated for drum_genre, one sample per drum: every written hit lands exactly as written (a half-time bar stays half-time, a stop-time hit stays a hit), but it sounds programmed — the kit for electronic / drum-machine genres (house, trap, 808), or the fallback for an acoustic part whose takes keep losing a hit that must land. Its pads (GM): kick 35/36, snare 38/40, rim 37, clap 39, hats 42/44/46, toms 41–50, crash 49/57, ride 51/59, tambourine 54, cowbell 56, bongos 60/61, congas 62–64, shaker 69/70/82, guiro 73/74, claves 75, woodblock 76/77, triangle 80/81."
    • Changeddoseedo_session_from_stems1 field changed
      • changedInput schema / properties / video / description
        Previous value: -"The film the music is written to: {video_key: the ingest/ key of your upload (doseedo_get_upload_url), name?, start_s?}. It is re-encoded lean (720p) and laid on its own muted track in the project — for REAPER today; Logic / Ableton projects are built without it (the answer says so)."New value: +"The film the music is written to: {video_key: the ingest/ key of your upload (doseedo_get_upload_url), name?, start_s?}. It is re-encoded lean (720p) and travels inside the project: REAPER gets a muted video track, Logic Pro gets its Movie (inside the package; Logic finds it by name). Ableton projects are built without it (the answer says so)."
  11. 2 tool updates
    • Changeddoseedo_render_midi1 field changed
      • changedInput schema / properties / voice_split / description
        Previous value: -"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)."New value: +"true = the notes hold chords: split them into the voices one player of this instrument can hold and render every voice (result.voices). A SUNG chord (choir, voice) is sung one stem per voice, each in its register, one take each. Default false (a chord in a mono part is an error the model will fudge)."
    • Changeddoseedo_session_from_stems6 fields changed
      • addedInput schema / properties / cues
        Added value: +{
        +  "description": "MCP: ONE session for a whole scored film — [{cue: \"1M1\", start_s, from_job: <its doseedo_render_score job>, mix_job?: <its doseedo_mix job>, emotion?}] (≤ 12 cues, from the cue sheet's start_s). Every cue's stems and MIDI land on one timeline at its start, on ONE tempo map (each cue's own tempo_map joined, each cue's bar 1 on a bar line), a marker per cue, each track at its cue's mix level and pan, each cue's mix as a muted reference. Replaces from_job / mix_job / stems.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cue": {
        +        "type": "string"
        +      },
        +      "emotion": {
        +        "type": "string"
        +      },
        +      "from_job": {
        +        "type": "string"
        +      },
        +      "mix_job": {
        +        "type": "string"
        +      },
        +      "start_s": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "cue",
        +      "start_s",
        +      "from_job"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / markers
        Added value: +{
        +  "description": "Arrangement markers [{name, beat}] — beat 0 = bar 1 on the project's tempo map. A scored film's cues are written as markers by `cues`.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "beat": {
        +        "type": "number"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "beat"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / session_beats
        Added value: +{
        +  "description": "Length of the session in beats (the tempo map is written this far; default: the last note). `cues` sets it.",
        +  "type": "number"
        +}
      • changedInput schema / properties / target / description
        Previous value: -"Which DAW (default logic)."New value: +"Which DAW (default logic): Logic Pro (.logicx), Ableton Live (.als) or REAPER (.rpp + media, with the film as a video track)."
      • changedInput schema / properties / target / enum
        Previous value: -[
        -  "logic",
        -  "ableton"
        -]New value: +[
        +  "logic",
        +  "ableton",
        +  "reaper"
        +]
      • addedInput schema / properties / video
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The film the music is written to: {video_key: the ingest/ key of your upload (doseedo_get_upload_url), name?, start_s?}. It is re-encoded lean (720p) and laid on its own muted track in the project — for REAPER today; Logic / Ableton projects are built without it (the answer says so).",
        +  "properties": {
        +    "name": {
        +      "type": "string"
        +    },
        +    "start_s": {
        +      "type": "number"
        +    },
        +    "video_key": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "video_key"
        +  ],
        +  "type": "object"
        +}
  12. 1 tool update
    • Changeddoseedo_render_midi1 field changed
      • addedInput schema / properties / lyrics
        Added value: +{
        +  "description": "A SUNG part (instrument \"voice\" — a solo singer — or \"choir\"): the words, one syllable per note in time order (\"Hold the light a lit-tle lon-ger\": hyphens split a word where you want, \"_\" holds a syllable over the next note; one word such as \"Ah\" is sung on every note). ≤2000 chars. Without it a sung part sings \"Ooh\". Any other instrument: an error.",
        +  "type": "string"
        +}
  13. 14 tool updates
    • Changeddoseedo_audio_to_session1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Project name for the session file."New value: +"Project name for the session file — it also names the download: <name>_session.zip."
    • Changeddoseedo_cover_song1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_cover_stem1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_fill_gap1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_generate_music1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_generate_sound1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_mix1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_render_midi1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_render_score1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_score_to_picture1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_separate_stems1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_session_from_stems1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Project name."New value: +"Project name — the project inside the zip, and the zip itself downloads as <name>_session.zip."
    • Changeddoseedo_split_soundtrack1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
    • Changeddoseedo_spot_video1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional: a name for this job's files, e.g. \"rainy-loop-3\". Every file it returns downloads as <name>_<part>.<ext> (rainy-loop-3_Celesta.wav, rainy-loop-3_rough-mix.wav; one take: rainy-loop-3.wav), so the user can find them. Give each job its own name (a second take: \"rainy-loop-3b\"). Default: doseedo-<last 6 characters of the job id>.",
        +  "maxLength": 80,
        +  "type": "string"
        +}
  14. 1 tool update
    • Changeddoseedo_cover_song2 fields changed
      • changedInput schema / properties / genre / description
        Previous value: -"Optional GENRE style transfer: free text naming the target genre (e.g. \"bossa nova\", \"80s synth-pop\"); every regenerated stem is captioned with it. Outcome in result.cover.genre."New value: +"Optional GENRE style transfer: the target genre in a few words, at most 64 characters (e.g. \"bossa nova\", \"80s synth-pop\", \"West End musical showstopper\") — a name, not a description; every regenerated stem is captioned with it. Outcome in result.cover.genre."
      • addedInput schema / properties / genre / maxLength
        Added value: +64

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to listen to MIDI keyboard performances and play notes, chords, loops, and MIDI files into synths, supporting harmonization, replay, and live backing tracks without a DAW.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides AI agents with reversible DAW control for music production, enabling inspection of instruments and parameters, batch edits, and evaluated revision runs with audio feedback and rollback.
    2
    -
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents to control a browser-based digital audio workstation (openDAW) for music production, including track creation, effects, MIDI, automation, and rendering.
    100
    Apache 2.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources