Doseedo
Edit DAW sessions; convert Logic/Ableton/FL/PT/REAPER/Cubase/Dorico; stems, transcribe, generate
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"doseedo": {
"url": "https://api.doseedo.com/mcp"
}
}
}Remote endpoints
https://api.doseedo.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (25)
π’doseedo_generate_music(prompt, lyrics, duration_seconds, bpm, time_signature, ...)
Generate an original song or instrumental from a text prompt (optionally with lyrics). Async: returns a task_id β poll with doseedo_wait_task kind="generate" (typically 1β3 minutes). The finished result is a list of downloadable audio file URLs.
Input Schema
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "Style/mood/instrumentation prompt, e.g. \"warm jazz trio, brushed drums, late-night ballad\"."
},
"lyrics": {
"type": "string",
"description": "Optional lyrics to sing. Omit for instrumental."
},
"duration_seconds": {
"type": "number",
"description": "Target length in seconds (e.g. 30β120). Omit for the model default."
},
"bpm": {
"type": "number",
"description": "Optional tempo in BPM (default 120)."
},
"time_signature": {
"type": "string",
"description": "Optional time signature, e.g. \"4/4\", \"3/4\"."
},
"seed": {
"type": "number",
"description": "Optional random seed for reproducibility."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"required": [
"prompt"
],
"additionalProperties": false
}βͺdoseedo_cover_song(audio_key, lyrics, instruments, cover_noise_strength, export, ...)
Re-render an uploaded song as a cover: keep its structure/melody while changing timbre, instruments, or lyrics. Optionally swap specific stems to other instruments, or export a DAW session too. Async: returns a task_id β poll with doseedo_wait_task kind="cover" (several minutes for full songs).
Input Schema
{
"type": "object",
"properties": {
"audio_key": {
"type": "string",
"description": "R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with \"ingest/\")."
},
"lyrics": {
"type": "string",
"description": "Optional replacement lyrics."
},
"instruments": {
"type": "object",
"description": "Optional per-stem instrument swap map, e.g. {\"piano\": \"electric_guitar\"}.",
"additionalProperties": {
"type": "string"
}
},
"cover_noise_strength": {
"type": "number",
"description": "Optional 0β1 fidelity dial: higher departs further from the source."
},
"export": {
"type": "string",
"enum": [
"logic",
"ableton"
],
"description": "Optionally also build a DAW session for this target."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"required": [
"audio_key"
],
"additionalProperties": false
}βͺdoseedo_separate_stems(audio_key, models, instruments, include_midi, export, ...)
Split an uploaded mix into stems (vocals, drums, bass, guitar, piano, other β or orchestral/auto-detected instruments), with optional per-stem MIDI transcription and DAW-session export. Async: returns a task_id β poll with doseedo_wait_task kind="separate" (~2 minutes).
Input Schema
{
"type": "object",
"properties": {
"audio_key": {
"type": "string",
"description": "R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with \"ingest/\")."
},
"models": {
"type": "string",
"enum": [
"6stem",
"auto",
"orchestra",
"detect"
],
"description": "Separation model set. Default 6stem (vocals/drums/bass/guitar/piano/other); auto/orchestra/detect for wider instrument sets."
},
"instruments": {
"type": "string",
"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, harp, brass, trumpet, trombone, french_horn, tuba, saxophone, clarinet, oboe, bassoon, flute, woodwind, strings, violin, viola, cello. Omit for the curated default set."
},
"include_midi": {
"type": "boolean",
"description": "Also transcribe each stem to MIDI (default true)."
},
"export": {
"type": "string",
"enum": [
"logic",
"ableton"
],
"description": "Optionally also build a DAW session from the stems."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"required": [
"audio_key"
],
"additionalProperties": false
}βͺdoseedo_transcribe(audio_key, audio_url, instrument, tempo_bpm, register, ...)
Transcribe audio to notes (pitch, onset/offset seconds, velocity, confidence as JSON β not a MIDI file). Works from an uploaded audio_key or a public audio_url. Async: returns a task_id β poll with doseedo_wait_task kind="transcribe" (usually ~15β60s).
Input Schema
{
"type": "object",
"properties": {
"audio_key": {
"type": "string",
"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."
},
"audio_url": {
"type": "string",
"description": "Public https URL of the audio to transcribe (alternative to audio_key)."
},
"instrument": {
"type": "string",
"description": "Optional instrument hint, e.g. \"piano\", \"sax\", \"vocals\", \"bass\"."
},
"tempo_bpm": {
"type": "number",
"description": "Optional known tempo β enables beat-aligned note times."
},
"register": {
"type": "string",
"description": "Optional register hint for the instrument (e.g. \"soprano\", \"tenor\", \"bass\")."
},
"family": {
"type": "string",
"description": "Optional instrument family (e.g. \"brass\", \"reeds\", \"strings\") when the exact instrument is unknown."
},
"polyphony": {
"type": "string",
"description": "Optional: \"solo\" (monophonic line), \"poly\", or \"section\" (a horn section β see roster/chairs)."
},
"roster": {
"type": "string",
"description": "polyphony=\"section\": the chairs on the stem, e.g. \"trumpet,trumpet,trombone,tenor_sax\". Omit for the family default."
},
"chairs": {
"type": "string",
"description": "polyphony=\"section\": register codes per chair, as an alternative to roster."
},
"strikes": {
"type": "boolean",
"description": "With tempo_bpm: also return the harmony_strikes attack grid."
},
"beats_per_bar": {
"type": "number",
"description": "With tempo_bpm: beats per bar for the beat-domain times (default 4)."
},
"backend": {
"type": "string",
"description": "Advanced: force a transcription backend. Omit β the server routes by instrument."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"additionalProperties": false
}βͺdoseedo_audio_to_session(audio_key, target, midi_stems, chords, simple, ...)
Turn an uploaded full mix into a complete 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 task_id β poll with doseedo_wait_task kind="session" (~4 minutes).
Input Schema
{
"type": "object",
"properties": {
"audio_key": {
"type": "string",
"description": "R2 ingest key of an uploaded audio file (from doseedo_get_upload_url / POST /api/upload/r2/ingest-url; starts with \"ingest/\")."
},
"target": {
"type": "string",
"enum": [
"logic",
"ableton"
],
"description": "DAW target (default logic)."
},
"midi_stems": {
"type": "string",
"description": "Optional comma-separated stems to also add as MIDI tracks, e.g. \"piano,bass\"."
},
"chords": {
"type": "boolean",
"description": "Add a detected-chords guide track (default false)."
},
"simple": {
"type": "boolean",
"description": "Faster minimal build: meter + tempo + stems only, no MIDI (default false). Required for stem_mode=\"detect\"."
},
"separate": {
"type": "boolean",
"description": "false = no separation: the mix lands as ONE audio track (default true)."
},
"tempo_map": {
"type": "boolean",
"description": "false = one constant tempo instead of a tempo map (default true)."
},
"stem_mode": {
"type": "string",
"enum": [
"6stem",
"drumsep",
"detect"
],
"description": "Separation family: 6stem (default), drumsep (split the kit too) or detect (orchestral, auto-picked; needs simple=true)."
},
"instruments": {
"type": "string",
"description": "stem_mode=\"detect\": optional comma list restricting the orchestral set."
},
"crop_silence": {
"type": "boolean",
"description": "Punch regions in where each stem plays instead of whole-length stems (default false)."
},
"loops": {
"type": "boolean",
"description": "Detect repeated clips and lay them as loops (default false)."
},
"drum_sampler": {
"type": "boolean",
"description": "Sampled kits β a one-shot sampler track + MIDI (default false)."
},
"name": {
"type": "string",
"description": "Project name for the session file."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"required": [
"audio_key"
],
"additionalProperties": false
}π‘doseedo_convert_project(project_key, direction, idempotency_key)
Convert a complete DAW project between Logic Pro (.logicx), Ableton Live (.als), FL Studio (.flp), Pro Tools (.ptx), REAPER (.rpp), Cubase (.cpr) and Dorico (.dorico/.musicxml) β any pair, both ways. The project is rebuilt natively in the target format: tracks, MIDI, audio clips, tempo, and markers arrive editable (for LogicβAbleton also automation, buses/sends, and plugin state). β CUBASE AND DORICO ARE ASYMMETRIC, by necessity β neither native format is documented, so a file we cannot guarantee opens is never written. TO Cubase you get a .dawproject (the open format Cubase 14+ and Nuendo import as a real editable session; Studio One and Bitwig read it too), not a .cpr. TO Dorico you get MusicXML (.mxl) β Dorico's own full-notation import route, which MuseScore, Finale and Sibelius also open β not a .dorico. FROM Cubase reads the native .cpr: tracks, tempo, signature and MIDI parts carry; its audio pool does not, so audio tracks arrive named but empty. FROM Dorico: a .dorico carries its players and flows but NOT its notes (score.dtn exposes no note position or duration), so export MusicXML from Dorico and convert THAT for the music β this tool accepts .musicxml/.mxl under the same dorico2* directions. Every conversion reports what it could not carry; read the task result rather than assuming silence means lossless. First call doseedo_get_project_upload_url and PUT the project there (zip a project FOLDER so its audio travels; a bare .als/.flp/.rpp/.ptx/.cpr/.dorico/.mxl or zipped .logicx works too). Async: returns a task_id β poll with doseedo_wait_task kind="convert" (typically 15sβ2min).
Input Schema
{
"type": "object",
"properties": {
"project_key": {
"type": "string",
"description": "R2 key of the uploaded project (from doseedo_get_project_upload_url / POST /api/upload/r2/signed-url; starts with \"uploads/\")."
},
"direction": {
"type": "string",
"enum": [
"logic2ableton",
"ableton2logic",
"fl2logic",
"fl2ableton",
"ableton2fl",
"logic2fl",
"reaper2logic",
"reaper2ableton",
"reaper2fl",
"logic2reaper",
"ableton2reaper",
"fl2reaper",
"protools2logic",
"protools2ableton",
"protools2fl",
"protools2reaper",
"logic2protools",
"ableton2protools",
"fl2protools",
"reaper2protools",
"cubase2logic",
"cubase2ableton",
"cubase2fl",
"cubase2reaper",
"cubase2protools",
"cubase2dorico",
"logic2cubase",
"ableton2cubase",
"fl2cubase",
"reaper2cubase",
"protools2cubase",
"dorico2logic",
"dorico2ableton",
"dorico2fl",
"dorico2reaper",
"dorico2protools",
"dorico2cubase",
"logic2dorico",
"ableton2dorico",
"fl2dorico",
"reaper2dorico",
"protools2dorico"
],
"description": "Source and target as \"<source>2<target>\" (logic | ableton | fl | protools | reaper | cubase | dorico). 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)."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"required": [
"project_key",
"direction"
],
"additionalProperties": false
}π‘doseedo_get_project_upload_url(filename, content_type)
Get a presigned upload for a DAW PROJECT file (for doseedo_convert_project). Returns an upload_url (PUT the bytes there, e.g. `curl -X PUT -H "Content-Type: application/zip" --data-binary @project.zip "<upload_url>"`) and a project_key to pass to doseedo_convert_project. Zip a project folder so its audio travels with it.
Input Schema
{
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "File name including extension, e.g. \"Song Project.zip\", \"beat.flp\", \"song.cpr\" or \"score.mxl\"."
},
"content_type": {
"type": "string",
"description": "MIME type: application/zip for zips (default), application/octet-stream for bare project files."
}
},
"required": [
"filename"
],
"additionalProperties": false
}π‘doseedo_get_upload_url(filename, content_type)
Get a presigned upload for your own audio file. Returns an upload_url (PUT the raw file bytes there, e.g. `curl -X PUT -H "Content-Type: <content_type>" --data-binary @song.wav "<upload_url>"`) and an audio_key to pass to doseedo_separate_stems / doseedo_transcribe / doseedo_cover_song / doseedo_audio_to_session.
Input Schema
{
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "File name including extension, e.g. \"song.wav\"."
},
"content_type": {
"type": "string",
"description": "MIME type; inferred from the extension when omitted (audio/* only)."
}
},
"required": [
"filename"
],
"additionalProperties": false
}π’doseedo_check_task(task_id, kind, job_id)
Check an async doseedo task once. Returns current status, and the result (file URLs / notes) when finished.
Input Schema
{
"type": "object",
"properties": {
"task_id": {
"type": "string",
"description": "The task_id returned by a submit tool."
},
"kind": {
"type": "string",
"enum": [
"generate",
"cover",
"separate",
"transcribe",
"session",
"convert",
"bounce"
],
"description": "Which tool family created the task."
},
"job_id": {
"type": "string",
"description": "Alternatively the job_id (job_β¦) from a submit tool or the jobs API β replaces task_id + kind."
}
},
"additionalProperties": false
}π’doseedo_wait_task(task_id, kind, job_id, timeout_seconds)
Wait for an async doseedo task to finish (polls server-side for up to ~50s, then returns the latest status). If it returns while the task is still running, simply call this tool again β long jobs can take a few minutes total.
Input Schema
{
"type": "object",
"properties": {
"task_id": {
"type": "string",
"description": "The task_id returned by a submit tool."
},
"kind": {
"type": "string",
"enum": [
"generate",
"cover",
"separate",
"transcribe",
"session",
"convert",
"bounce"
],
"description": "Which tool family created the task."
},
"job_id": {
"type": "string",
"description": "Alternatively the job_id (job_β¦) from a submit tool or the jobs API β replaces task_id + kind."
},
"timeout_seconds": {
"type": "number",
"description": "Max seconds to wait in this call (5β50, default 45)."
}
},
"additionalProperties": false
}π’doseedo_list_jobs(limit, kind, status, before)
List the jobs this account submitted (generate / cover / stems / transcribe / session / convert / bounce), newest first β to find an earlier result, check what is still running, or resume after a lost connection. Read-only.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "How many (1β100, default 20)."
},
"kind": {
"type": "string",
"description": "Only this job kind, e.g. \"separate_stems\"."
},
"status": {
"type": "string",
"enum": [
"queued",
"running",
"succeeded",
"failed",
"canceled"
]
},
"before": {
"type": "string",
"description": "Page cursor: the next_cursor of a previous call."
}
},
"additionalProperties": false
}π΄doseedo_cancel_job(job_id)
Cancel a queued or running job. A generation that has not reached the GPU yet is stopped and its credit refunded; work a plane has already started may finish, but the job ends as canceled and its output is discarded.
Input Schema
{
"type": "object",
"properties": {
"job_id": {
"type": "string",
"description": "The job_id from a submit tool or doseedo_list_jobs."
}
},
"required": [
"job_id"
],
"additionalProperties": false
}π’doseedo_account
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.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}π’doseedo_quote(job, args)
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, cover_song, separate_stems, transcribe, audio_to_session, convert_project) and the same args you would give the job tool (duration_seconds, models, instruments, β¦). The estimate follows the planes' own price table; the gate is authoritative and a refusal names the exact price.
Input Schema
{
"type": "object",
"properties": {
"job": {
"type": "string",
"enum": [
"generate_music",
"cover_song",
"separate_stems",
"transcribe",
"audio_to_session",
"convert_project"
],
"description": "Which job to price (a doseedo_ tool name or recipe verb is accepted too)."
},
"args": {
"type": "object",
"description": "The arguments you intend to pass to the job tool; only the price-relevant ones matter.",
"additionalProperties": true
}
},
"required": [
"job"
],
"additionalProperties": false
}π’doseedo_recipes(name)
The named pipelines people actually ask for β stems, session (mix β DAW project), cover, transcribe, generate, convert, bounce β 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.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "A recipe name or alias, e.g. \"session\" / \"stems-to-session\". Omit to list all."
}
},
"additionalProperties": false
}π’doseedo_list_sessions(limit)
List the connected account's DAW sessions (most recently updated first) β their ids, names, DAW, and update time. Use a session id with doseedo_get_session and doseedo_edit_session.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "How many to return (default 25, max 200)."
}
},
"additionalProperties": false
}π’doseedo_get_session(session_id)
Read a DAW session as a compact arrangement summary an agent can edit against: every track with its wire ids (track_id t_β¦, its mixer strip channel_id ch_β¦), its regions in BOTH beats and seconds, mixer state (volume with dB, pan, mute), and plugin chain (third-party flagged); plus tempo, time signature, markers, length, and a "sync" block saying whether DΓΈ Desktop is live on this session and how far it has applied. Read-only. Pass these ids straight to doseedo_edit_session.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "From doseedo_list_sessions."
}
},
"required": [
"session_id"
],
"additionalProperties": false
}π‘doseedo_edit_session(session_id, batch_key, atomic, ops)
Edit a DAW session by applying a list of ops (move/trim a region, set MIDI notes, add/remove a track, change a fader/pan/mute, insert or tweak a plugin, set tempo, add a marker, β¦). If DΓΈ Desktop is running with the project open, the edits appear in Logic live within seconds; otherwise they persist and apply next time the session opens. Get ids and current values from doseedo_get_session first, and see doseedo_edit_ops_reference for every op and its arguments. CONTRACT: every op is validated before anything is stored (unknown ops and ops outside the key's ops:<group> scopes are refused). atomic (default true): one rejected op β NOTHING is stored and the response lists every rejection; atomic:false stores the good ops and lists the rest. RETRY: a call that timed out may have been stored β re-send it with the SAME batch_key and it dedups (deduped:true, original cursors); a retry without batch_key duplicates the edits. Stored ops are applied by the desktop one at a time in order; there is no per-batch undo group β verify what landed with doseedo_download_session (replay).
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string"
},
"batch_key": {
"type": "string",
"description": "A 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."
},
"atomic": {
"type": "boolean",
"description": "Default true: any rejected op means nothing is stored. Set false to store the valid ops and receive the rest as `rejected`."
},
"ops": {
"type": "array",
"description": "The 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.",
"items": {
"type": "object",
"properties": {
"op": {
"type": "string",
"description": "The op name, e.g. \"set_track_crop\"."
},
"args": {
"type": "object",
"description": "The op arguments (see the ops reference)."
}
},
"required": [
"op",
"args"
],
"additionalProperties": false
}
}
},
"required": [
"session_id",
"ops"
],
"additionalProperties": false
}π’doseedo_edit_ops_reference
The full catalog of session edit ops doseedo_edit_session accepts: every op with its arguments, units, and where it lands (live in the open project, at next open, or state-only) β plus the WORKFLOW, UNITS (ids, beats, 0.709 = 0 dB, Quick Sampler root C3 = 60) and RECIPES (drum kit from local samples, one-shots on an audio track, remote sample, submix bus, verify). Read it ONCE per session and copy a recipe. Read-only.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}π’doseedo_desktop_status
Is DΓΈ Desktop running on the user's Mac and connected to their DAW? Reports which sessions it currently holds, whether a live Logic hook is answering, and its per-session applied cursor. Use it to know whether an edit will reach the DAW live now (desktop online + logic connected) or wait for the next session open. Read-only.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}π‘doseedo_add_audio_to_session(session_id, audio_url, audio_key, filename)
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: "<the sha>"} (bakes into the exported .logicx, no desktop needed β the drum-pack/sample-swap path). Give audio_url OR audio_key.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string"
},
"audio_url": {
"type": "string",
"description": "Public https URL of the audio (e.g. a doseedo artifact URL)."
},
"audio_key": {
"type": "string",
"description": "audio_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)."
},
"filename": {
"type": "string",
"description": "Optional name for the asset."
}
},
"required": [
"session_id"
],
"additionalProperties": false
}βͺdoseedo_bounce_session(session_id, track_ids, stems, tail_seconds, format, ...)
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). Async: returns a task_id β poll with doseedo_wait_task kind="bounce". The result is downloadable stem URLs. Needs DΓΈ Desktop to run at some point to pick up the job; until then it stays queued.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string"
},
"track_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tracks to bounce (t_β¦ ids from doseedo_get_session). Omit to bounce the whole session."
},
"stems": {
"type": "boolean",
"description": "true (default) = one file per track; false = a single mixdown."
},
"tail_seconds": {
"type": "number",
"description": "Extra seconds for reverb/delay to ring out (default 2)."
},
"format": {
"type": "string",
"enum": [
"wav",
"aiff"
],
"description": "Output format (default wav)."
},
"idempotency_key": {
"type": "string",
"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."
}
},
"required": [
"session_id"
],
"additionalProperties": false
}π’doseedo_download_session(session_id, daw)
Save a session to the device as a native Logic project (.logicx.zip), rebuilt server-side from the current session state β no desktop needed. Returns a SHORT-LIVED, NO-AUTH download URL: fetch it with a plain `curl -o ~/Downloads/β¦` (no API key or header) and unzip. Use this to put the project in the user's Downloads folder. The result also carries `replay` β what the build actually put in the file (per track: kind, the sample its Quick Sampler plays, MIDI note count, audio region count; media in the bundle; ops the offline build could not synthesize) β and `warnings`. Verify from those; do not unzip and inspect ProjectData. `place_local_files` (when present) MUST be run after unzipping.
Input Schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string"
},
"daw": {
"type": "string",
"enum": [
"logic",
"ableton",
"fl",
"reaper"
],
"description": "Target DAW (default logic; only logic is a one-shot native download β for others use doseedo_convert_project)."
}
},
"required": [
"session_id"
],
"additionalProperties": false
}π’doseedo_list_plugins
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: "β¦"}}.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}π‘doseedo_create_session(name, daw)
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.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Session name."
},
"daw": {
"type": "string",
"enum": [
"logic",
"ableton"
],
"description": "Bound DAW (default logic)."
}
},
"required": [
"name"
],
"additionalProperties": false
}Community
Evidence