{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T18:25:48.237Z","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film","markdownUrl":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film.md","server":{"slug":"com-doseedo-film-score","name":"Doseedo Film Score: spot a video, play your score on AI instruments, mix it to picture","registryName":"com.doseedo/film-score","description":"Score video as an agent: cue sheet from the cut, 50+ AI instruments play your MIDI, mixed to picture","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"mcp-film","type":"remote","identifier":"https://api.doseedo.com/mcp/film","withdrawn":false,"url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film","version":"0.21.0","transport":null,"scoredAt":"2026-11-05T06:38:56.956Z"},"score":{"total":80,"tier":"high trust","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":80},{"date":"2026-11-04","total":80},{"date":"2026-11-03","total":79},{"date":"2026-11-02","total":79},{"date":"2026-11-01","total":78},{"date":"2026-10-31","total":78},{"date":"2026-10-30","total":77},{"date":"2026-10-29","total":77}]},"categories":[{"name":"Endpoint Security","score":97,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.","HTTPS is enforced; there's no plaintext access path.","The HSTS (Strict-Transport-Security) header is present.","DNSSEC check failed: this domain isn't protected by DNSSEC.","The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.rfc9728_invoke","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_present","args":{}},{"code":"dnssec.absent","args":{}},{"code":"auth.registration_cimd","args":{}}]},{"name":"Transport & Reachability","score":100,"verdict":"pass","reasons":["Verified streamable-http transport via a live MCP handshake."],"codes":[{"code":"transport.verified","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":54,"verdict":"fail","reasons":["AI-judged instruction clarity (excellent).","Context-footprint check failed: tool/resource definitions use about 18771 tokens (~782/item across 24 items; 24 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"excellent"}},{"code":"schema.footprint_heavy","args":{"avg":"782","items":"24","tools":"24","tokens":"18771","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":23,"verdict":"partial","reasons":["Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"7"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","We read all 24 captured tool definition(s), and no name or description among them implies an irreversible operation.","An AI judge read all 25 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_none","args":{"tools":"24"}},{"code":"toolsafety.manipulation_clean","args":{"units":"25","judged":"25"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"mcp-film","type":"remote","identifier":"https://api.doseedo.com/mcp/film","withdrawn":false,"score":80,"current":true,"url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film","markdownUrl":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film.md"}],"facts":[{"label":"Endpoint","value":"https://api.doseedo.com/mcp/film"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"required"},{"label":"Version","value":"0.21.0"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"doseedo_generate_sound","title":"Generate sound effects (SFX & foley)","description":"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 <url>, 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.","inputs":[{"name":"bpm","type":"number","required":false,"description":"Tempo a loop is cut to (default 120)."},{"name":"duration_seconds","type":"number","required":false,"description":"Length in seconds. Default: 2 s for a hit, 4 bars at bpm for a loop, 8 s for a texture."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"kind","type":"string","required":false,"description":"hit = one sound (0.5–10 s), loop = 1–4 bars tiled at bpm, texture = a bed. Default: read off the prompt."},{"name":"name","type":"string","required":false,"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),…"},{"name":"prompt","type":"string","required":true,"description":"What it sounds like, e.g. \"punchy house kick drum, single hit\" or \"dusty vinyl crackle\". ≤ 300 characters."},{"name":"seed","type":"number","required":false,"description":"Optional random seed for reproducibility."},{"name":"time_signature","type":"string","required":false,"description":"Meter a loop is cut to, e.g. \"4/4\" (default)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":612},{"name":"doseedo_render_midi","title":"Render MIDI on AI instruments (MIDI to audio)","description":"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 — for drum machines only; an acoustic kit stays on the model (a take that drops a hit: take it 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 fi…","inputs":[{"name":"bpm","type":"number","required":false,"description":"REQUIRED (or tempo_map). Tempo of the notes (10–400). Written into the MIDI's tempo meta, so start_beats/duration_beats land at exactly this tempo."},{"name":"drum_engine","type":"string","required":false,"description":"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 acous…"},{"name":"drum_genre","type":"string","required":false,"description":"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:…"},{"name":"duration_seconds","type":"number","required":false,"description":"Length of the render in seconds (0.01–600). Default: the last note's end + 2 s of release. Each 30 s window costs 10 credits."},{"name":"dynamics","type":"string","required":false,"description":"One target dynamic for the whole part's tone: \"pp\", \"p\", \"mp\", \"mf\", \"f\", \"ff\", \"fff\", a 0–1 number, or a MIDI velocity as text. Omit it to let the notes' velocities shape the tone (dynamics_curve)."},{"name":"dynamics_curve","type":"string","required":false,"description":"What colours the TONE over time: omitted/\"auto\" = the note velocities when they vary (soft notes darker, loud brighter — every instrument but drums, LoRAs included); \"off\" = one colour; \"cc11\"/\"cc1\"…"},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"instrument","type":"string","required":true,"description":"REQUIRED. The instrument from doseedo_instruments — its `call.instrument` (e.g. \"violin\", \"tenor_sax\", \"electric_guitar\", \"piano\"; a World name such as \"koto\" is resolved to its call). Keep the notes…"},{"name":"lora_id","type":"string","required":false,"description":"A CUSTOM INSTRUMENT: the lora_id doseedo_train_instrument returned (16 hex). The render is played by that trained instrument; pass the same instrument it was trained as. Owner-only."},{"name":"lora_strength","type":"number","required":false,"description":"With 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.…"},{"name":"lyrics","type":"string","required":false,"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 syl…"},{"name":"midi_url","type":"string","required":false,"description":"Alternative to notes: https URL of a Standard MIDI File (≤2 MiB) — a doseedo result link (a stem's MIDI) or a public URL. Its own tempo map is used by the model; bpm still tags the caption and sizes…"},{"name":"name","type":"string","required":false,"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),…"},{"name":"notes","type":"array","required":false,"description":"The part, as note rows in beats from bar 1 (beat 0 = bar 1 beat 1, quarter-note beats at `bpm`). Monophonic for one voice; chords need voice_split:true. Up to 4096 notes."},{"name":"prompt","type":"string","required":false,"description":"Optional caption override (default: the instrument id). Style words help a little; the notes are the control."},{"name":"refine","type":"string","required":false,"description":"Opt-in post-render correction. \"light\": attacks re-timed onto the score, exposed wrong pitch classes re-pitched inside the played octave, misfires muted (winds/brass/strings). \"shred\": play exactly t…"},{"name":"revise_end_beats","type":"number","required":false,"description":"With revise_take_url: end of the region to redo (exclusive), beats from bar 1."},{"name":"revise_start_beats","type":"number","required":false,"description":"With revise_take_url: start of the region to redo, beats from bar 1."},{"name":"revise_take_url","type":"string","required":false,"description":"REVISE an earlier take instead of rendering a new one: the take's URL (as a render returned it). Only [revise_start_beats, revise_end_beats) is regenerated — steered by `notes` (send the whole part,…"},{"name":"seed","type":"number","required":false,"description":"Random seed (−1 or 0–4294967295). Reuse a result's seed to re-render close to the same take."},{"name":"session_id","type":"string","required":false,"description":"Alternative to notes: with track_id, render THAT session track's notes (read from doseedo_get_session's summary)."},{"name":"synth_engine","type":"string","required":false,"description":"Who 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…"},{"name":"synth_genre","type":"string","required":false,"description":"instrument \"synth\": the genre the patch is made for — \"house\", \"techno\", \"trap\", \"synthwave\", \"lo-fi\", \"dnb\"… or free words."},{"name":"synth_role","type":"string","required":false,"description":"instrument \"synth\": the patch Stable Audio Open makes for the part — bass (an 808 where the genre's bass is one), 808, pad, lead, pluck. Default: from the notes (chords = pad, a low line = bass, else…"},{"name":"synth_words","type":"string","required":false,"description":"instrument \"synth\": extra sound words for the patch (\"reese\", \"warm analog\", \"acid\"), ≤80 chars."},{"name":"takes","type":"number","required":false,"description":"How many takes to render, 1–4 (one GPU batch; no extra credits). Omit to let the server choose best-of-N for the part length."},{"name":"tempo_map","type":"array","required":false,"description":"Tempo CHANGES for the notes: [{beat, bpm}] — each point holds from its beat (beats from bar 1) until the next; the first point is beat 0 (or bpm covers the beats before it). Written into the MIDI, so…"},{"name":"timbre_audio_url","type":"string","required":false,"description":"TIMBRE TRANSFER: https URL of a short recording (≤24 MB; its first 30 s are used) whose SOUND the render should take on — a doseedo result link or a public URL. The notes stay yours; the tone comes f…"},{"name":"timbre_preset","type":"string","required":false,"description":"A preset from doseedo_instruments — an entry's call.timbre_preset or presets[].call.timbre_preset (e.g. \"violin:pizz\", \"sax:alto\", \"koto:preset1\"). Omit for the instrument default."},{"name":"time_signature","type":"string","required":false,"description":"Meter of the part, e.g. \"4/4\", \"3/4\", \"6/8\" (default 4/4). Written into the MIDI and the caption."},{"name":"track_id","type":"string","required":false,"description":"With session_id: the t_… id of the MIDI/instrument track to render."},{"name":"tune","type":"boolean","required":false,"description":"Light intonation (default true): a held, clearly pitched note the model rendered 15–85 cents off its written pitch is moved toward it, to a small natural residual — attack and vibrato as played, fast…"},{"name":"vaefix","type":"boolean","required":false,"description":"VAE spectral corrector (default true): trims the low-mid fog the decoder adds under the instrument's register and removes mic hiss only when the take carries it. Winds, brass and strings. Receipt: va…"},{"name":"voice_split","type":"boolean","required":false,"description":"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…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":2889},{"name":"doseedo_train_instrument","title":"Train a custom instrument","description":"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: <the same 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.","inputs":[{"name":"audio_key","type":"string","required":false,"description":"R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with \"ingest/\"). One recording; or audio_keys for several."},{"name":"audio_keys","type":"array","required":false,"description":"Several uploaded takes of the SAME instrument (≤8)."},{"name":"audio_url","type":"string","required":false,"description":"https URL of a recording (a doseedo result link — a separated stem works — or any public URL). Alternative to audio_key."},{"name":"audio_urls","type":"array","required":false,"description":"Several recording URLs of the same instrument (≤8)."},{"name":"bpm","type":"number","required":false,"description":"Optional tempo of the recording (30–300)."},{"name":"drum_mode","type":"boolean","required":false,"description":"true for an unpitched percussion recording."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"instrument","type":"string","required":true,"description":"REQUIRED. The catalog instrument it is closest to (call.instrument from doseedo_instruments, e.g. \"violin\", \"acoustic_guitar\", \"flute\", \"percussion\")."},{"name":"name","type":"string","required":false,"description":"A name for it, e.g. \"Grandpa's banjo\" (≤80 chars)."},{"name":"notes","type":"array","required":false,"description":"Optional: the notes played, one list per file — [[{pitch, start, end, velocity?}…]] in SECONDS. Omitted, they are transcribed."},{"name":"seed","type":"number","required":false,"description":"Random seed."},{"name":"steps","type":"number","required":false,"description":"Training steps 50–800. Default 300 for ≤60 s of audio, 400 above."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":668},{"name":"doseedo_render_score","title":"Render a whole score","description":"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 {\"<part name or index>\": {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 f…","inputs":[{"name":"bpm","type":"number","required":false,"description":"Tempo of the parts (10–400). Required with parts[] unless tempo_map is given; on a file it sets the speed and keeps the score's fermatas / rit. / tempo changes."},{"name":"duration_seconds","type":"number","required":false,"description":"Render length (default: the last note + 2 s; ≤ 600)."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"instruments","type":"object","required":false,"description":"Name the instrument for any part: {\"Violin I\": {\"instrument\": \"violin\", \"players\": 6}, \"2\": {\"instrument\": \"acoustic_guitar\", \"timbre_preset\": \"koto:preset1\"}, \"Choir\": {\"instrument\": \"choir\", \"playe…"},{"name":"midi_url","type":"string","required":false,"description":"Alternative to parts: a multi-track Standard MIDI File (≤ 2 MiB) — a doseedo result link or a public https URL. Channel 10 = drums: the kit, or the one percussion instrument a part is named for (Bass…"},{"name":"mix","type":"boolean","required":false,"description":"Also bounce a summed mix of the stems (default true)."},{"name":"musicxml_url","type":"string","required":false,"description":"Alternative 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…"},{"name":"name","type":"string","required":false,"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),…"},{"name":"parts","type":"array","required":false,"description":"The 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.…"},{"name":"score_key","type":"string","required":false,"description":"Alternative 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,…"},{"name":"score_url","type":"string","required":false,"description":"Alternative to parts: a score file URL — MIDI, MusicXML or a MuseScore .mscz / .mscx, told apart by its content."},{"name":"seed","type":"number","required":false,"description":"Random seed (reuse to re-render close to the same performance)."},{"name":"tempo_map","type":"array","required":false,"description":"Tempo changes [{beat, bpm}] (first point at beat 0). Overrides a file's own tempo."},{"name":"time_signature","type":"string","required":false,"description":"Meter, e.g. \"4/4\" (default, or the file's)."},{"name":"tune","type":"boolean","required":false,"description":"Light intonation on every winds / brass / strings part (default true): held, clearly pitched notes the model rendered 15–85 cents off are moved toward their written pitch, to a small natural residual…"},{"name":"vaefix","type":"boolean","required":false,"description":"VAE spectral corrector on every winds / brass / strings part (default true): the decoder's low-mid fog under each instrument's register is trimmed, mic hiss removed only where present. Receipt: parts…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":1665},{"name":"doseedo_mix","title":"Mix and master stems","description":"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, 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.<stem>.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: <this job_id>} → 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…","inputs":[{"name":"balance","type":"object","required":false,"description":"{part name: dB in -12..12} — your balance on top of the levelling (and of the written dynamics a from_job reads)."},{"name":"dialogue","type":"array","required":false,"description":"The 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 j…"},{"name":"duck","type":"object","required":false,"description":"How 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,…"},{"name":"dynamics","type":"object","required":false,"description":"Fader rides from written dynamics: {part name: [[onset_seconds, velocity 0-127], …]}. from_job fills it from the score (pp to ff ≈ 17 dB); pass {} for no rides."},{"name":"dynamics_carried","type":"object","required":false,"description":"{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."},{"name":"dynamics_ride","type":"number","required":false,"description":"How hard the written dynamics move the faders: 1 = default (pp to ff ≈ 17 dB), 0 = no rides, up to 1.5."},{"name":"end_fade_s","type":"number","required":false,"description":"With length_s: the fade at the program's end (0–10 s, default 0.5)."},{"name":"from_job","type":"string","required":false,"description":"MCP: a doseedo_render_score job_id — its parts are the stems, each with the instrument it plays, and each part's written dynamics (its mean velocity) set its balance."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"length_s","type":"number","required":false,"description":"The 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."},{"name":"mix_job","type":"string","required":false,"description":"MCP: a doseedo_mix job_id to edit — its whole stored mix (every ride) is the base, mixgraph is applied on top, and its stems are reused when you pass no from_job / stems."},{"name":"mixgraph","type":"object","required":false,"description":"An edited mix — the mixgraph a doseedo_mix returned, changed — rendered against the same stems (from_job or stems). With mix_job: ONLY what you change (strips[] by stem, automation[] rides by target…"},{"name":"music_offset_s","type":"number","required":false,"description":"Where 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."},{"name":"name","type":"string","required":false,"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),…"},{"name":"room","type":null,"required":false,"description":"An orchestra's room: \"studio\" (intimate scoring stage, ~1.2 s, close), \"stage\" (~1.8 s), \"hall\" (the default scoring hall, ~2.3 s), \"cathedral\" (~4 s, wet) — or 0..1 between them. Sets the decay, siz…"},{"name":"stems","type":"array","required":false,"description":"[{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 decide…"},{"name":"style","type":"string","required":false,"description":"A mix style: an id or words (\"dry 90s rock\"). Pick it for the picture — the default (film-orchestral, a 2.3 s scoring hall) suits film drama, not every orchestra: cartoon-studio = a cartoon / animati…"},{"name":"target_lufs","type":"number","required":false,"description":"Master 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…"},{"name":"tonal_match","type":"boolean","required":false,"description":"Nudge the master toward professionally mixed orchestral references (default on for the orchestral styles). Its presence and air are judged only where the score is written loud (written_level), so a p…"},{"name":"vintage","type":"string","required":false,"description":"A period medium over any style, after the mix: \"tape\" = 7.5 ips tape (saturation, wow and flutter, a low hiss); \"shellac\" = a 78 played back (mono, ~90 Hz–5.5 kHz with the reproducer's presence, a 1.…"},{"name":"written_level","type":"array","required":false,"description":"[[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 loude…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":2074},{"name":"doseedo_session_from_stems","title":"Stems → a DAW session","description":"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 <url>, 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.","inputs":[{"name":"bpm","type":"number","required":false,"description":"Project tempo (default 120)."},{"name":"cues","type":"array","required":false,"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). Ever…"},{"name":"from_job","type":"string","required":false,"description":"MCP: a doseedo_render_score job_id — its stems, parts' MIDI and tempo are used (no other input needed)."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"markers","type":"array","required":false,"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`."},{"name":"midi_tracks","type":"array","required":false,"description":"Optional MIDI tracks: [{name, notes:[{pitch, start_beats, duration_beats, velocity?}]}]."},{"name":"mix_job","type":"string","required":false,"description":"MCP: a doseedo_mix job_id — every track takes that mix's level and pan, and the mix itself rides along as a muted reference track \"Mix (doseedo)\"."},{"name":"mixgraph","type":"object","required":false,"description":"A mix document (doseedo_mix → mixgraph): each stem named in it takes its strip's gain_db and pan. The EQ, compression, reverb and rides are not written into the project."},{"name":"name","type":"string","required":false,"description":"Project name — the project inside the zip, and the zip itself downloads as <name>_session.zip."},{"name":"session_beats","type":"number","required":false,"description":"Length of the session in beats (the tempo map is written this far; default: the last note). `cues` sets it."},{"name":"stems","type":"array","required":false,"description":"[{name, audio_url | audio_key, gain_db?, pan?, mute?, position_beats?}] — the audio tracks, in order."},{"name":"target","type":"string","required":false,"description":"Which DAW (default logic): Logic Pro (.logicx), Ableton Live (.als) or REAPER (.rpp + media, with the film as a video track)."},{"name":"tempo_map","type":"array","required":false,"description":"Tempo changes [{beat, bpm}] for the project."},{"name":"time_signature","type":"string","required":false,"description":"Meter (default 4/4)."},{"name":"video","type":"object","required":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 travels inside the project: REAPER gets a mut…"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":897},{"name":"doseedo_spot_video","title":"Spot a video → cue sheet","description":"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 <reel>M<n>), keyframes (0–60). Async: job_id → doseedo_wait_task (~1 min for a 10-min 1080p reel). Next: doseedo_tempo_map per cue → write the notes → doseedo_render_score → doseedo_mix → doseedo_score_to_picture. Cancel: the plane has no stop for a running spotting pass — it runs to completion (credits spent), the job ends as canceled and its output is discarded. Only a job still queued at…","inputs":[{"name":"coverage","type":"number","required":false,"description":"How much of the film gets music (default 0.55). Raise it for wall-to-wall scoring (a trailer, an animation), lower it for a dialogue drama."},{"name":"cut_threshold","type":"number","required":false,"description":"Scene-change threshold at full contrast (default 0.3). Lower finds softer cuts, higher only the hardest."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"keyframes","type":"integer","required":false,"description":"How many shots get a keyframe JPEG (default 24; the longest shots first). 0 = no images at all (no scene frames, no storyboard)."},{"name":"name","type":"string","required":false,"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),…"},{"name":"reel","type":"integer","required":false,"description":"Reel number for the cue ids (default 1 → 1M1, 1M2 …)."},{"name":"start_timecode","type":"string","required":false,"description":"SMPTE timecode of the first frame, HH:MM:SS:FF (\";\" before the frames = drop-frame at 29.97/59.94). Default: the file's embedded timecode, else 00:00:00:00."},{"name":"video_key","type":"string","required":false,"description":"R2 ingest key of the uploaded video (doseedo_get_upload_url with the file name, e.g. reel1.mp4; starts with \"ingest/\")."},{"name":"video_url","type":"string","required":false,"description":"https URL of the video, as an alternative to video_key (a public file URL, fetched directly; ≤ 2 GB)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":983},{"name":"doseedo_score_to_picture","title":"Lay the score on the picture","description":"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.","inputs":[{"name":"dialogue","type":"array","required":false,"description":"Dialogue spans [{start_s, end_s}] to duck under, instead of detecting them (use the cue sheet's dialogue, or your own)."},{"name":"duck","type":"object","required":false,"description":"Dialogue ducking (on by default): depth_db (default 10), attack_ms (250: how early before a line the music is down), release_ms (700), sfx (false: duck effects too), enabled."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"loudness","type":null,"required":false,"description":"Delivery loudness: \"web\" (−16 LUFS, default), \"streaming\" (−14), \"broadcast\" / \"ebu\" (−23), \"atsc\" (−24), or a LUFS number (−36…−8)."},{"name":"name","type":"string","required":false,"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),…"},{"name":"production_audio","type":"string","required":false,"description":"keep (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)."},{"name":"production_gain_db","type":"number","required":false,"description":"Trim on the production audio when kept (default 0)."},{"name":"start_timecode","type":"string","required":false,"description":"SMPTE timecode of the film's first frame (default: the file's own, else 00:00:00:00) — the clock the tracks' start_timecode is read on."},{"name":"tracks","type":"array","required":true,"description":"What to lay on the film, in any order."},{"name":"video_key","type":"string","required":false,"description":"R2 ingest key of the video (the same upload doseedo_spot_video used)."},{"name":"video_url","type":"string","required":false,"description":"https URL of the video, as an alternative to video_key."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":947},{"name":"doseedo_separate_stems","title":"Separate stems (vocal remover)","description":"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.","inputs":[{"name":"audio_key","type":"string","required":false,"description":"R2 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."},{"name":"audio_url","type":"string","required":false,"description":"https 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 acc…"},{"name":"drum_split","type":"boolean","required":false,"description":"true = also split the drum stem into isolated kick / snare / hi-hat / toms / ride / crash (+ perc) sub-stems (result.drum_substems)."},{"name":"export","type":"string","required":false,"description":"Optionally also build a DAW session from the stems."},{"name":"guitar_split","type":"string","required":false,"description":"Deal 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."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"include_midi","type":"boolean","required":false,"description":"Also transcribe each stem to MIDI (default true)."},{"name":"instruments","type":"string","required":false,"description":"models=orchestra only: comma-separated extractor targets, e.g. \"saxophone,trumpet,trombone\". Available: drums, percussion, bass, double_bass, guitar, electric_guitar, acoustic_guitar, piano, organ, h…"},{"name":"models","type":"string","required":false,"description":"Separation model set. Default 6stem (vocals/drums/bass/guitar/piano/other); auto/orchestra/detect for wider instrument sets."},{"name":"name","type":"string","required":false,"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),…"},{"name":"parent_track_id","type":"string","required":false,"description":"With session_id: the t_… track the mix sits on; the stems are added as its children."},{"name":"session_id","type":"string","required":false,"description":"Register the stems INTO this doseedo session (from doseedo_list_sessions) as audio tracks — result.session_tracks lists them. Needs parent_track_id."},{"name":"stems_only","type":"boolean","required":false,"description":"true = the stems and NOTHING derived from them (no MIDI, no lyrics, no latents) — the fastest, cheapest separation. Implies include_midi:false."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":903},{"name":"doseedo_split_soundtrack","title":"Split a film's soundtrack (dialogue / music / effects)","description":"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.","inputs":[{"name":"audio_key","type":"string","required":false,"description":"An ingest key of the soundtrack on its own (WAV/FLAC/MP3/M4A), instead of the film."},{"name":"audio_url","type":"string","required":false,"description":"https URL of the soundtrack on its own, instead of the film."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"name","type":"string","required":false,"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),…"},{"name":"video_key","type":"string","required":false,"description":"R2 ingest key of the film (the same upload doseedo_spot_video read; starts with \"ingest/\")."},{"name":"video_url","type":"string","required":false,"description":"https URL of the film, as an alternative to video_key (fetched through the URL up to 256 MB; upload a bigger film)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":686},{"name":"doseedo_transcribe","title":"Audio to MIDI (transcribe notes)","description":"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.","inputs":[{"name":"audio_key","type":"string","required":false,"description":"R2 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."},{"name":"audio_url","type":"string","required":false,"description":"https 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."},{"name":"backend","type":"string","required":false,"description":"Advanced: force a transcription backend. Omit — the server routes by instrument."},{"name":"beats_per_bar","type":"number","required":false,"description":"With tempo_bpm: beats per bar for the beat-domain times (default 4)."},{"name":"chairs","type":"string","required":false,"description":"polyphony=\"section\": register codes per chair, as an alternative to roster."},{"name":"family","type":"string","required":false,"description":"Optional instrument family (e.g. \"brass\", \"reeds\", \"strings\") when the exact instrument is unknown."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"instrument","type":"string","required":false,"description":"Optional instrument hint, e.g. \"piano\", \"sax\", \"vocals\", \"bass\"."},{"name":"polyphony","type":"string","required":false,"description":"Optional: \"solo\" (monophonic line), \"poly\", or \"section\" (a horn section — see roster/chairs)."},{"name":"register","type":"string","required":false,"description":"Optional register hint for the instrument (e.g. \"soprano\", \"tenor\", \"bass\")."},{"name":"roster","type":"string","required":false,"description":"polyphony=\"section\": the chairs on the stem, e.g. \"trumpet,trumpet,trombone,tenor_sax\". Omit for the family default."},{"name":"strikes","type":"boolean","required":false,"description":"With tempo_bpm: also return the harmony_strikes attack grid."},{"name":"tempo_bpm","type":"number","required":false,"description":"Optional known tempo — enables beat-aligned note times."},{"name":"want","type":"string","required":false,"description":"What to return: \"notes\" (default), \"f0\" (the continuous pitch contour — frame-rate Hz values, for glides/vibrato/intonation), or both."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":650},{"name":"doseedo_analyze_song","title":"Analyze a song","description":"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.","inputs":[{"name":"audio_key","type":"string","required":false,"description":"R2 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."},{"name":"audio_url","type":"string","required":false,"description":"https URL of the audio (a doseedo result URL as returned, or any public URL). Alternative to audio_key."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":368},{"name":"doseedo_check_take","title":"Check a take against its notes","description":"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.","inputs":[{"name":"audio_key","type":"string","required":false,"description":"R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with \"ingest/\"). Alternative to audio_url."},{"name":"audio_url","type":"string","required":false,"description":"The take: a doseedo result URL as returned, or any public https URL."},{"name":"bpm","type":"number","required":false,"description":"Tempo of the notes (or tempo_map)."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"instrument","type":"string","required":false,"description":"The instrument (a drum/percussion name switches to onset-only matching)."},{"name":"midi_url","type":"string","required":false,"description":"Alternative to notes: the part as a Standard MIDI File (≤ 2 MiB)."},{"name":"notes","type":"array","required":false,"description":"The notes the take should play, in beats from bar 1 (the rows you sent doseedo_render_midi)."},{"name":"onset_tolerance_ms","type":"number","required":false,"description":"How far a heard onset may be from the written one and still count (default 50)."},{"name":"tempo_map","type":"array","required":false,"description":"Tempo changes [{beat, bpm}]."},{"name":"time_signature","type":"string","required":false,"description":"Meter (default 4/4)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":497},{"name":"doseedo_analyze_midi","title":"Analyze MIDI harmony","description":"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.","inputs":[{"name":"beats_per_segment","type":"number","required":false,"description":"mode chord: segment length in beats (0.25–8, default 2)."},{"name":"bpm","type":"number","required":false,"description":"Tempo of the notes (needed with notes; default 120)."},{"name":"idempotency_key","type":"string","required":false,"description":"Optional. Any unique string for THIS request (e.g. a UUID). Re-sending the same call with the same key after a timeout returns the same job instead of starting a second one."},{"name":"midi_url","type":"string","required":false,"description":"Alternative to notes: https URL of a Standard MIDI File (≤2 MiB)."},{"name":"min_seg_beats","type":"number","required":false,"description":"mode midi: shortest sonority segment in beats (default 0.25)."},{"name":"mode","type":"string","required":false,"description":"\"midi\" (default): sonority / shape factoring. \"chord\": chord symbols per segment + cell cover."},{"name":"notes","type":"array","required":false,"description":"The notes to analyze, in beats from bar 1 (same rows as doseedo_render_midi). Needs bpm."},{"name":"time_signature","type":"string","required":false,"description":"Meter of the notes, e.g. \"4/4\" (default)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":445},{"name":"doseedo_instruments","title":"Instrument catalog (the sound palette)","description":"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.","inputs":[{"name":"chords","type":"boolean","required":false,"description":"true = only instruments one player can play chords on."},{"name":"family","type":"string","required":false,"description":"Only this family."},{"name":"id","type":"string","required":false,"description":"One instrument (id, alias or label, e.g. \"cello\", \"upright bass\", \"koto\") → its full entry: every preset with its own call and range, transposition, aliases, demo, page."},{"name":"pitches","type":"array","required":false,"description":"MIDI pitches the part uses (concert, 60 = C4) — only instruments whose range holds every one."},{"name":"query","type":"string","required":false,"description":"What the part needs, in words: an instrument (\"trumpet\"), a family (\"woodwinds\"), a technique (\"pizzicato\", \"muted\") or a register (\"low\", \"bright\"). Ranked best-first."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":364},{"name":"doseedo_tempo_map","title":"Tempo map from hit points","description":"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.","inputs":[{"name":"bpm","type":"number","required":true,"description":"The cue's tempo (20–300) — the map stays as close to it as the hits allow."},{"name":"bpm_range","type":"array","required":false,"description":"Allowed tempo range [min, max] (default ±12 % of bpm)."},{"name":"fixed_bpm","type":"boolean","required":false,"description":"ONE 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…"},{"name":"fps","type":"number","required":false,"description":"Frame rate of the timecodes: 23.976, 24, 25, 29.97, 30, 50, 59.94, 60."},{"name":"hits","type":"array","required":true,"description":"The moments the music must land on: [{time_s} (seconds from the cue start) or {timecode: \"01:00:12:08\"} (film timecode, with fps and start_timecode), label?, land?, bpm?}] — land = THIS hit's landing…"},{"name":"land","type":"string","required":false,"description":"Land hits on bar lines (default), on any beat, or on any eighth — the default for every hit without its own land."},{"name":"max_deviation_bpm","type":"number","required":false,"description":"How 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."},{"name":"offset_range_s","type":"array","required":false,"description":"fixed_bpm: where bar 1 may sit on the cue, [min, max] seconds (default [0, one bar])."},{"name":"start_s","type":"number","required":false,"description":"Alternative: the cue start in seconds of film time (informational when hits are time_s)."},{"name":"start_timecode","type":"string","required":false,"description":"Film timecode of the cue's first downbeat (bar 1); hit timecodes are measured from it."},{"name":"time_signature","type":"string","required":false,"description":"Meter (default 4/4)."},{"name":"tolerance_ms","type":"number","required":false,"description":"SOFT 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."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":876},{"name":"doseedo_get_upload_url","title":"Get an audio upload URL","description":"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).","inputs":[{"name":"content_type","type":"string","required":false,"description":"MIME type; inferred from the extension when omitted (wav, aif/aiff, flac, mp3, m4a/aac, ogg/opus, webm; a film: mp4, mov, m4v, mkv). Required for any other extension."},{"name":"filename","type":"string","required":true,"description":"File 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 decid…"},{"name":"source_url","type":"string","required":false,"description":"A 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."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":567},{"name":"doseedo_check_task","title":"Check a job","description":"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: [\"<name>\" 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.","inputs":[{"name":"job_id","type":"string","required":false,"description":"Alternatively the job_id (job_…) from a submit tool or the jobs API — replaces task_id + kind."},{"name":"kind","type":"string","required":false,"description":"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_stem…"},{"name":"parts","type":"array","required":false,"description":"Optional, on a finished job: the parts to return in full, by name (as the result names them) or index — e.g. [\"Oboes\", \"Timpani\"]."},{"name":"task_id","type":"string","required":false,"description":"The task_id returned by a submit tool."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":339},{"name":"doseedo_wait_task","title":"Wait for a job","description":"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.","inputs":[{"name":"job_id","type":"string","required":false,"description":"Alternatively the job_id (job_…) from a submit tool or the jobs API — replaces task_id + kind."},{"name":"kind","type":"string","required":false,"description":"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_stem…"},{"name":"task_id","type":"string","required":false,"description":"The task_id returned by a submit tool."},{"name":"timeout_seconds","type":"number","required":false,"description":"Max seconds to wait in this call (5–50, default 45). Start with the submit reply's suggested_next_wait."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":365},{"name":"doseedo_list_jobs","title":"List jobs","description":"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.","inputs":[{"name":"before","type":"string","required":false,"description":"Page cursor: the next_cursor of a previous call."},{"name":"kind","type":"string","required":false,"description":"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_son…"},{"name":"limit","type":"number","required":false,"description":"How many (1–100, default 20)."},{"name":"session_id","type":"string","required":false,"description":"Only jobs whose input names this session — a bounce, stems registered into it, a render of one of its tracks (filtered within the fetched page)."},{"name":"status","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":326},{"name":"doseedo_cancel_job","title":"Cancel a job","description":"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).","inputs":[{"name":"job_id","type":"string","required":true,"description":"The job_id from a submit tool or doseedo_list_jobs."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":181},{"name":"doseedo_account","title":"Account and credits","description":"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.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":59},{"name":"doseedo_quote","title":"Price a job","description":"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, 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.","inputs":[{"name":"args","type":"object","required":false,"description":"The arguments you intend to pass to the job tool; only the price-relevant ones matter."},{"name":"job","type":"string","required":true,"description":"Which job to price (a doseedo_ tool name or recipe verb is accepted too)."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":281},{"name":"doseedo_recipes","title":"Recipes (named pipelines)","description":"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.","inputs":[{"name":"name","type":"string","required":false,"description":"A recipe name or alias, e.g. \"session\" / \"stems-to-session\". Omit to list all."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":209}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T06:38:56.000Z","track":"remote","endpoint":"https://api.doseedo.com/mcp/film","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=doseedo.com","issuer":"CN=WE1,O=Google Trust Services,C=US","notBefore":"2026-10-01T00:11:58Z","notAfter":"2026-12-30T01:11:45Z","keyType":"ECDSA","keyBits":256,"isCa":false},{"subject":"CN=WE1,O=Google Trust Services,C=US","issuer":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","notBefore":"2023-12-13T09:00:00Z","notAfter":"2029-02-20T14:00:00Z","keyType":"ECDSA","keyBits":256,"isCa":true},{"subject":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","issuer":"CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE","notBefore":"2023-11-15T03:43:21Z","notAfter":"2028-01-28T00:00:42Z","keyType":"ECDSA","keyBits":384,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"api.doseedo.com.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"com.","outcome":"verified","label":"Verified"},{"zone":"doseedo.com.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"enforced_validated","label":"Enforced and verified","gate":"invoke","gateLabel":"On tool calls","status":200,"authorizationServers":["https://api.doseedo.com"]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":301},"transports":[{"transport":"streamable-http","outcome":"verified","label":"Verified","status":200,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-29","recent":[{"id":"chg_01a1aa6e-97d2-7910-9235-6837010f82d4","kind":"tool.description_changed","summary":"Tool “doseedo_analyze_song” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d2-7910-9235-6837010f82d4"},{"id":"chg_01a1aa6e-97d4-728c-9c34-ccb5aa874c7e","kind":"param.added_optional","summary":"“doseedo_generate_sound” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d4-728c-9c34-ccb5aa874c7e"},{"id":"chg_01a1aa6e-97d4-783e-ae50-365aa2787e99","kind":"param.added_optional","summary":"“doseedo_mix” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d4-783e-ae50-365aa2787e99"},{"id":"chg_01a1aa6e-97d4-7d44-ba49-ba7f0a5d0bba","kind":"tool.description_changed","summary":"Tool “doseedo_render_midi” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d4-7d44-ba49-ba7f0a5d0bba"},{"id":"chg_01a1aa6e-97d5-72e2-8209-9c822e4602a6","kind":"param.description_changed","summary":"“doseedo_render_midi” reworded the description of “drum_engine”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d5-72e2-8209-9c822e4602a6"},{"id":"chg_01a1aa6e-97d5-7889-9fc7-b92e9927743a","kind":"param.description_changed","summary":"“doseedo_render_midi” reworded the description of “voice_split”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d5-7889-9fc7-b92e9927743a"},{"id":"chg_01a1aa6e-97d5-7d51-a345-25b70fc1618f","kind":"param.added_optional","summary":"“doseedo_render_midi” added an optional parameter “lyrics”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d5-7d51-a345-25b70fc1618f"},{"id":"chg_01a1aa6e-97d6-72ab-b73a-b0c25c029f6a","kind":"param.added_optional","summary":"“doseedo_render_midi” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d6-72ab-b73a-b0c25c029f6a"},{"id":"chg_01a1aa6e-97d6-7721-86b9-c91c6bd4226a","kind":"tool.description_changed","summary":"Tool “doseedo_render_score” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d6-7721-86b9-c91c6bd4226a"},{"id":"chg_01a1aa6e-97d6-7c2c-b430-120532a47398","kind":"param.added_optional","summary":"“doseedo_render_score” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d6-7c2c-b430-120532a47398"},{"id":"chg_01a1aa6e-97d7-7152-8b76-3fad230f5a54","kind":"param.added_optional","summary":"“doseedo_score_to_picture” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d7-7152-8b76-3fad230f5a54"},{"id":"chg_01a1aa6e-97d7-75de-b903-c5b99bcb6157","kind":"param.added_optional","summary":"“doseedo_separate_stems” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d7-75de-b903-c5b99bcb6157"},{"id":"chg_01a1aa6e-97d7-7bc3-896d-2838bda18cc9","kind":"param.description_changed","summary":"“doseedo_session_from_stems” reworded the description of “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d7-7bc3-896d-2838bda18cc9"},{"id":"chg_01a1aa6e-97d8-7174-a53e-c4f4226a6af4","kind":"param.description_changed","summary":"“doseedo_session_from_stems” reworded the description of “target”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d8-7174-a53e-c4f4226a6af4"},{"id":"chg_01a1aa6e-97d8-756d-83f8-82aeae37f4df","kind":"param.added_optional","summary":"“doseedo_session_from_stems” added an optional parameter “cues”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d8-756d-83f8-82aeae37f4df"},{"id":"chg_01a1aa6e-97d8-7955-9a2f-6d5ad0d841ac","kind":"param.added_optional","summary":"“doseedo_session_from_stems” added an optional parameter “markers”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d8-7955-9a2f-6d5ad0d841ac"},{"id":"chg_01a1aa6e-97d8-7d11-996a-a45ddd7b0793","kind":"param.added_optional","summary":"“doseedo_session_from_stems” added an optional parameter “session_beats”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d8-7d11-996a-a45ddd7b0793"},{"id":"chg_01a1aa6e-97d9-7197-a923-76e05e2da8f8","kind":"param.added_optional","summary":"“doseedo_session_from_stems” added an optional parameter “video”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d9-7197-a923-76e05e2da8f8"},{"id":"chg_01a1aa6e-97d9-74fd-af6e-7a636efd5dda","kind":"param.added_optional","summary":"“doseedo_split_soundtrack” added an optional parameter “name”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d9-74fd-af6e-7a636efd5dda"},{"id":"chg_01a1aa6e-97d9-78d5-9e48-80ccb366d466","kind":"tool.description_changed","summary":"Tool “doseedo_spot_video” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film#chg-chg_01a1aa6e-97d9-78d5-9e48-80ccb366d466"}],"truncated":true,"feedUrl":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film","markdown":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film.md","changelogJson":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film/changelog.json","changelogRss":"https://verifymcp.io/servers/com-doseedo-film-score/mcp-film.xml","external":[{"label":"Remote endpoint","href":"https://api.doseedo.com/mcp/film"},{"label":"Website","href":"https://doseedo.com/guides/score-a-film-with-an-ai-agent"}]}}