AbletonMCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_statusA | Start here. Connection, Live and Remote Script versions, the open set (name, path), transport
(playing, position, tempo, loop), any open Live dialog with its message, active background jobs,
and capabilities: ffmpeg (needed by analyze_audio and create_release) and macOS UI automation
(needed by save_set, new_set and export_audio; When Live is unreachable it still answers, with connected: false and how to fix it. If |
| get_song_overviewA | One-call map of the project: tempo, meter, key and scale, swing, loop, song length; every track (index, name, kind, colour, mute/solo/arm, devices, non-empty Session slots with name and length, arrangement clip count and extent); returns and master; scenes (name, tempo, signature, empty); locators; the selection. Times come as beats plus "bar.beat.sixteenth". detail=True adds every set_song setting, mixer levels (dB), pan and sends, device classes and on/off, clip colours and arrangement clip lists. Use get_track or get_notes for more. |
| undoA | Undo the last |
| redoA | Redo |
| respond_to_dialogA | Press a button on the dialog Live is showing (get_status reports its message and button count). button: an index (0 = first button), or a name where Live's layout is known: "ok" on one-button dialogs; "save", "dont_save" or "cancel" on Live's save-changes prompt. Destructive: "dont_save" discards unsaved work, so confirm with the user first. |
| open_setA | Open a Live Set (.als) in the running Live, replacing the current set. No UI permission needed. If the current set has unsaved changes Live asks to save them: with discard_unsaved=False (default) nothing is discarded, the prompt stays open and the call fails with what to do; discard_unsaved=True answers "Don't Save". Destructive with discard_unsaved: confirm with the user first. Waits until the set has loaded and returns it; then call get_song_overview. |
| new_setA | [UI automation] Start a new empty Live Set (File > New Live Set), replacing the current one. Unsaved changes are refused unless discard_unsaved=True (then Live's save prompt is answered "Don't Save"). Needs macOS UI automation: get_status shows whether it is available and how to enable it. Destructive with discard_unsaved: confirm with the user first. |
| save_setA | [UI automation] Save the current Live Set; with Without path the set must already have a file. Save-as never overwrites an existing file; Live may put the set in a new " Project" folder. Verified through Live's file path or the file's modification time. Needs macOS UI automation (see get_status). |
| export_audioA | [UI automation, EXPERIMENTAL] Render the arrangement from Sets the arrangement loop to the range (Live exports the loop brace) and restores it afterwards. The file format and rendered track follow the Export dialog's last settings. Never overwrites a file. Prefer bounce, which needs no UI permission. Needs macOS UI automation (see get_status). |
| set_songA | Set song-wide settings in one undo step; returns every setting as Live now reports it. tempo 20..999 BPM; time_signature "3/4"; key a root ("F#") or root plus scale ("A minor"); scale one of Live's scales ("Minor", "Dorian", ...); swing 0..1; groove_amount 0..1.31; loop_start/loop_end times and loop_length a length ("8 bars"), giving the arrangement loop (also the export range); launch_quantization "none".."1/32" ("1 bar", "1/16"); record_quantization "none", "1/16", "1/8T"...; follow = arrangement follows the playhead. record_mode arms arrangement recording. Example: set_song(tempo=124, key="A minor", time_signature="4/4"). No arguments: read the settings. |
| transportA | Control playback. action: "play" (from position: beats, "bar.beat.sixteenth" or a locator name. While stopped, play/jump move the start marker. Returns the action plus the transport state read on Live's next tick. Example: transport("play", position="17.1.1"). |
| create_sceneA | Create a Session scene (a song section) at |
| set_sceneA | Change a scene (index or name): name, color (0..69 or "#RRGGBB"), tempo in BPM, time_signature ("7/8"). Pass tempo="off" or time_signature="off" so the scene keeps the song's tempo or meter. |
| fire_sceneA | Launch a scene (index or name): every clip in its row starts at the launch quantization, and its tempo or time signature applies. Starts the transport. force_legato launches clips immediately in legato. Audition with get_meters; stop with transport("stop_all_clips") or transport("stop"). |
| delete_sceneA | Delete a scene (index or name) together with every clip in its row. Destructive: confirm with the user before deleting their material. A set keeps at least one scene. |
| duplicate_sceneA | Duplicate a scene (index or name) with its clips into a new scene right below it, and select it. Returns the new scene; later scene indices shift by one. |
| create_locatorA | Add an arrangement locator (cue point) at |
| set_locatorA | Rename a locator, addressed by index (time order) or by name. To move one, delete it and create it again at the new time. |
| delete_locatorA | Delete a locator, addressed by index (time order) or by name. The transport must be stopped; the playhead is put back afterwards. |
| get_groovesA | The groove pool: each groove's index, name, base grid and amounts (percent), plus the global groove amount (0..1.31). Assign a groove to a clip with set_clip(groove=...). |
| set_grooveA | Edit a groove of the groove pool (index or name). base is the grid: "1/4", "1/8", "1/8T", "1/16", "1/16T" or "1/32". Amounts are percent: quantize, timing and random 0..100, velocity -100..100. The global amount is set_song(groove_amount=...). |
| selectA | Select in Live's UI so the user sees what you are working on: a track, a scene, a clip slot of
|
| show_messageA | Show a short message in Live's status bar (bottom of the window), e.g. to tell the user what the agent is doing. It does not open a dialog. |
| create_trackA | Create a track: kind "midi", "audio" or "return", optionally named, coloured and with a first device. index: position among regular tracks (-1 = end; returns always go last). color: Live colour index 0..69 or "#RRGGBB". device: any device by name, case-insensitive ("Operator", "eq eight", "DS Kick"); native devices are inserted directly, Max for Live and pack devices are loaded through the browser. Instruments and MIDI effects need a MIDI track. Returns the new track's ref, routing and arm state (MIDI tracks can come up armed). Example: create_track("midi", "Bass", device="Operator"). |
| get_trackA | Read one track: kind, colour, mute/solo/arm, monitoring, group membership, freeze state, input and output routing, mixer (volume dB, pan, sends in dB by return letter), top-level devices (index, name, class, on), non-empty Session slots, arrangement clip count and extent, and take lanes. detail=True adds everything else: every slot and arrangement clip, full mixer, meters and flags. track: index, name, "return:A" or "master". |
| set_trackA | Change a track: name, colour, arm, monitoring ("in", "auto", "off"), fold (group tracks), collapsed (Arrangement), show_chains (Instrument Rack), and input/output routing. Routing takes display names from get_routing_options, matched case-insensitively ("Main", "Sends Only", "Resampling", "No Input", a track name such as "Drum Bus" or a track index); channels like "1/2", "Post FX" or a MIDI channel number. Set the type and its channel in one call. Example: set_track("Vox", input="Ext. In", input_channel="1", monitoring="auto"). |
| delete_trackA | Delete a regular or return track with all its clips and devices. The master cannot be deleted. Deleting a return also removes every track's send to it, and later returns move up a letter. Destructive: confirm with the user before deleting their own work (undo reverts it). |
| duplicate_trackA | Duplicate a regular track with its devices, clips and mixer settings; the copy goes right after it and is selected. Optionally name the copy. Live cannot duplicate return or master tracks. |
| get_routing_optionsA | Current input and output routing of a track, with the available types and channels. Channels belong to the current type: after choosing another type with set_track, read again to see its channels. Return, group and master tracks have output routing only. |
| create_busA | Create a bus, Live's substitute for group tracks: a new audio track (monitoring "In", input "No Input") at the end of the set, with every source track's output routed into it. Mix the bus like any track (set_mixer, add_device). name must be unique. Sources need audio output (a MIDI track needs an instrument). Reverting takes two undo steps. Example: create_bus("Drum Bus", ["Kick", "Snare", "Hats"], color="#FF8800"). |
| get_mixerA | Mixer state of every regular, return and master track (or only |
| set_mixerA | Set a track's mixer in one call and get the resulting mixer state back. volume_db: up to +6, or "-inf" (or volume: raw 0..1). pan: -1..1 or "25L"/"C"/"50R". sends: {return letter, index or name: dB up to 0, or "-inf"}. mute/solo (solo is not exclusive), active (track activator), crossfade "A"/"none"/"B", pan_mode "stereo"/"split" with left_pan/right_pan. Master only: crossfader (-1 = A .. 1 = B) and cue_volume_db. Example: set_mixer("Bass", volume_db=-6, pan=-0.2, sends={"A": -18}). |
| get_metersA | Momentary peak levels of every track, return and master (or only Output levels are post-fader dBFS: peak_db (max of left/right, held 1 s), left_db, right_db, plus Live's raw 0..1 values (dBFS = 76 * raw - 70, so "-inf" means below -70 dBFS and 6.0 the meter top). over_0db flags a peak at or above 0 dBFS. Audio tracks add input levels; MIDI tracks show MIDI activity (0..1). Meters only move while the transport plays. |
| create_clipA | Create a clip: MIDI in an empty Session length: MIDI only, beats or "N bars" (default 4 beats; a bare number is beats). at: beats, "bar.beat.sixteenth" ("9.1.1") or a locator name. MIDI ranges that overlap arrangement clips are refused (audio reports what it trimmed). color: index 0..69 or "#RRGGBB". Returns the new clip (as get_clip). Example: create_clip("Drums", slot=0, length="1 bar", pattern={"kick": "x---x---x---x---"}). |
| get_clipB | Every property of one clip: name, colour, length (beats and bars), loop and markers, signature, launch mode and quantization, legato, mute, velocity amount, groove, grid, playing state and automated parameters. Audio clips add gain_db, pitch, warping, warp mode, file and warp markers. Arrangement clips give start and end in
beats and bars. notes=True adds up to |
| set_clipA | Set clip properties; only the ones you pass change. Returns the clip as get_clip. Times are clip beats or "bar.beat.sixteenth" (1.1.1 = clip start; seconds for unwarped audio). signature "3/4". launch_mode: trigger, gate, toggle, repeat. launch_quantization: global, none, "1 bar", "1/4", ... grid: "1/16", ... groove: groove pool name or index. Audio only: gain_db (-inf..+24), pitch_coarse (-48..48 semitones), pitch_fine (-50..49 cents), warping, warp_mode (beats, tones, texture, repitch, complex, complex_pro), ram_mode. Example: set_clip(track="Keys", slot=0, loop_end="3.1.1", launch_quantization="1 bar"). |
| delete_clipA | Delete a Session or arrangement clip. Destructive: confirm with the user before deleting their own material. |
| duplicate_clipA | Copy (or move=True) a clip: Session -> Session slot, Session -> arrangement, or arrangement -> arrangement. to_slot: empty Session slot (default: next empty slot below, same track). to_time: arrangement time in beats or "bar.beat.sixteenth" (arrangement sources default to right after themselves). to_track defaults to the same track. Clip envelopes travel with the copy. Occupied slots and overlapping arrangement ranges are refused. Example: duplicate_clip(track="Drums", slot=0, to_time="9.1.1"). |
| fire_clipA | Launch the clip in a Session slot (starts at the next launch-quantization boundary; Live starts the transport). Check the result with get_clip (state) or get_meters; stop with stop_clip or transport. |
| stop_clipA | Stop the playing or triggered Session clips on a track (quantized=False stops immediately). |
| get_notesA | Notes of a MIDI clip with note_id, pitch, name (C3 = 60), start, duration, velocity, probability, velocity_deviation, release_velocity and mute, sorted by time. Optional filters (combined): pitches (list), pitch_min/pitch_max (numbers or names), start/end (notes starting in [start, end), clip beats or "bar.beat.sixteenth"), note_ids. Use the ids with edit_notes, delete_notes or transform_notes. Example: get_notes(track="Bass", slot=0, start="2.1.1", end="3.1.1"). |
| write_notesA | Write MIDI notes into a clip. mode: "add", "replace" (clears the clip first) or "replace_range" (clears notes starting in [start, end); defaults to the span of the new notes). Each note: pitch (60 or "C3"), start (clip beats or "1.3.1"; 1.1.1 = clip start), duration (beats, "1/8", "1/16T"), optional velocity=100, probability=1, velocity_deviation=0, release_velocity=64, mute=false. Chords: "pitches": [...] or "chord": "Am7" (+ octave, inversion, voicing). music_theory progression "notes" fit as-is. Example: [{"pitch": "C3", "start": 0, "duration": 1}, {"chord": "F", "start": 4, "duration": 4}]. |
| edit_notesA | Change existing notes by note_id (from get_notes), keeping their ids. Each edit: {"note_id": 12, ...} plus any of pitch, start, duration, velocity, probability, velocity_deviation, release_velocity, mute. Example: edit_notes(track="Keys", slot=0, edits=[{"note_id": 12, "velocity": 90, "pitch": "E3"}]). For relative changes on many notes use transform_notes. |
| delete_notesA | Delete notes from a MIDI clip by note_ids, pitches, pitch_min/pitch_max and/or a start/end time range (notes starting in [start, end)), or every note with all=True. Filters combine; at least one is required. |
| transform_notesA | Transform notes in place (ids kept). Filters as in get_notes select the notes (default: all). operation and its options: transpose: semitones, or steps (scale degrees in the song's key and scale). quantize: grid ("1/16", "1/8T"), amount 0..1 (default 1), swing 0..1 (delays every second grid line). humanize: timing (+/- beats, or "10ms"), velocity (+/- spread), seed. velocity: factor (multiply), offset (add), value (set), random (+/- spread), seed. legato; reverse (within start/end or the loop); stretch: factor (around start or loop start); shift: offset (beats). |
| write_drum_patternA | Write drums from step strings, repeated across the clip's loop: {"Kick": "x---x---x---x---", "Snare": "----x-------x---"}. Steps: "x" hit, "X" accent, "o" ghost, "-" or "." rest (spaces and "|" ignored); steps_per_beat=4 means 16ths. Drum names match the track's Drum Rack pads (case-insensitive, "kick" finds "Kick 808"), else General MIDI (kick 36, snare 38, clap 39, closed hat 42, open hat 46, crash 49, ride 51, toms); notes like "C1" or 36 work too. velocities: {"x": 100, "X": 127, "o": 60}. swing 0..1 delays every second step. mode: "replace" (those drums' notes) or "add". |
| clip_actionB | Run a clip function. Actions and args: crop (keeps the loop, or the marker range); duplicate_loop (doubles the loop and its content); duplicate_region {start, length, destination, pitch?, transpose?} (MIDI); quantize {grid "1/16", amount 0..1, pitch?} (MIDI notes, or audio warp markers; uses the song's swing); add_warp_marker {beat_time, sample_time? seconds}, move_warp_marker {beat_time, distance}, remove_warp_marker {beat_time}; audio_to_midi {type: melody|harmony|drums, name?}, drum_rack_from_audio {name?}, simpler_track_from_audio {name?} (these create a new track and return it). |
| write_automationA | Automate a parameter inside a clip (clip envelope) from points or a shape; returns sampled values. parameter: "volume", "pan", "send:A", or a device parameter with |
| get_automationA | List the parameters a clip automates; with |
| clear_automationB | Remove a clip's envelope for one parameter, or every envelope when |
| get_arrangementA | The arrangement timeline: each track's clips (index for arrangement_clip refs, name, start and end in beats and bars, length, looping, type, colour, envelopes), plus locators, loop region and song length. start/end keep only clips overlapping that range (beats or "bar.beat.sixteenth"); tracks limits the
tracks. At most |
| arrange_from_scenesA | Build the arrangement from scenes: sections play one after another from sections: [{scene (index or name), bars (or length: beats / "8 bars"), name?}]. Looping clips loop
to fill a section exactly, at any length; one-shot clips play once. Clip envelopes travel along.
A track's range is overwritten where it has a clip; clear=True first empties the whole range on the
tracks taking part (those with a clip in a listed scene, or |
| clear_arrangementA | Delete arrangement clips by track and time range. Destructive: confirm before deleting the user's work. mode "trim" (default) empties exactly start..end: clips inside are deleted and clips crossing an edge are cut there. "overlapping" deletes every clip touching the range, whole; "inside" deletes only clips entirely within it. Omit start/end for the whole timeline. Pass tracks, or all_tracks=True to clear every track. Times are beats, "bar.beat.sixteenth" or a locator name. Example: clear_arrangement(tracks=["Bass"], start="Chorus", end="Outro"). |
| music_theoryA | Music theory without touching Live (C3 = 60). operation:
scale: key ("A", "F# dorian") + scale (any Live scale name, "minor", "blues"...) -> notes, pitches from |
| add_deviceA | Insert a native Live device by name on a track, or into a rack chain. name: case-insensitive ("Operator", "eq eight", "Drum Rack"). position: device index (-1 = end). chain: a path to a rack chain alternating device and chain segments: "Instrument Rack/0", "Drum Rack/C1" (a drum note gets a new chain if the pad is empty) or "Audio Effect Rack/new". Instruments and MIDI effects need a MIDI track or MIDI rack chain. Max for Live devices listed with Live's devices (LFO, DS Kick, ...) load through the browser. Presets and packs: load_from_browser. Example: add_device("Bass", "Saturator"). |
| get_devicesA | Device tree of a track: every device with path ("1/0/0"), name_path ("Drum Rack/Kick/Simpler"),
class, type and on/off; racks with chains (recursively), visible macros and variation count; Drum Racks
with their non-empty pads (note, note name, pad and chain names). Pass a path as |
| get_deviceB | One device in detail: parameters (index, value, display, range, items), type-specific properties with their options (Simpler mode, Wavetable oscillators, Compressor sidechain routing, plug-in presets, ...), rack chains with mixer, pads, macros, variations and chain selector, and Simpler's sample (file, markers, warping, slices). device: index, name or path ("Drum Rack/C1/Simpler", "1/0/0"). parameters=False skips the parameter list; detail=True adds parameter metadata, hidden macros, full option lists and sample detail. |
| set_device_parametersA | Set several device parameters in one call; returns each new value and display string. values: {parameter name or index: value}. Numbers are raw values (min/max from get_device). Strings are display values with units ("-6 dB", "800 Hz", "1.2 kHz", "250 ms", "2.5 s", "30 %", "25L") or item names of switches and choosers ("Sine", "On"). Names match exactly, then by original name, then a unique substring. Failures are listed in "errors" without stopping the others. Example: set_device_parameters("Bass", "Auto Filter", {"Frequency": "800 Hz", "Resonance": 0.4}). |
| set_deviceA | Change a device: enabled (on/off), name, collapsed, compare_b (A/B compare slot B) and the type-specific properties get_device lists. properties: {name: value}; option properties take an option name or index ("playback_mode": "one_shot", "voice_mode": "Mono", "selected_preset_index": "Init"); routing properties take display names ("input_routing_type": "Kick" for a Compressor sidechain). "sample." sets Simpler's sample ("sample.warping": true, "sample.warp_mode": "complex"); "view." sets view properties. Failures are listed per property. |
| device_actionC | Run a type-specific device function; args holds its named arguments. Racks: insert_chain(index, name, note), add_macro, remove_macro, randomize_macros, store_variation, recall_variation(index), recall_last_variation, delete_variation(index). Drum Racks: copy_pad(source, destination), delete_chains(pad), to_midi_track(pad, name). Simpler: crop, reverse, warp_as(beats), warp_double, warp_half, replace_sample(file_path), guess_playback_length, insert_slice/remove_slice (time in frames or seconds), move_slice(time, to), clear_slices, reset_slices, to_drum_rack. Looper: record, overdub, play, stop, clear, undo, double_length, half_length, double_speed, half_speed, export_to_clip_slot(track, slot). Wavetable: get_modulation(target, source), set_modulation(target, source, value), add_parameter_to_modulation_matrix(parameter). Plug-ins: parameter_names(begin, end). A/B devices: save_ab_slot. |
| delete_deviceA | Delete a device (a rack with everything in it) from its track or chain; returns what remains. Destructive: confirm with the user before deleting their own work (undo reverts it). |
| duplicate_deviceA | Duplicate a device (racks with their contents) right after itself in its track or chain. Live will not duplicate a track's instrument: use duplicate_track, or another Instrument Rack chain. |
| move_deviceA | Move a device within its chain, to another track, or into a rack chain. to_track: destination track (default: the same track). to_position: index in the destination (omitted or -1 = end). to_chain: a chain path in the destination track ("Drum Rack/C1", "Audio Effect Rack/0", "Instrument Rack/new"). Live picks the nearest valid position (MIDI effects stay before the instrument); instruments and MIDI effects cannot go onto audio tracks. |
| set_chainA | Change a rack chain: name, colour, mute, solo, volume_db ("-inf" allowed), pan (-1..1 or "25L"), and for Drum Rack chains in_note (the pad that plays it, as a note name or number: this moves the chain to another pad), out_note and choke_group (0 = none, 1..16). device: the rack (index, name or path). chain: index, name, drum note ("C1") or "return:0" for a return chain. Example: set_chain("Drums", "Drum Rack", "C1", volume_db=-3, choke_group=1). |
| set_sidechainA | Duck Uses Live's Compressor, the only device whose sidechain input the API can route: |
| search_browserA | Search Live's browser by name: devices, presets, drum kits, samples, clips, plug-ins, Max for Live devices and packs. Every word must appear in the name (or the path). Ranked results give name, path, uri, category, kind (device, preset, rack_preset, sample, clip, max_device, plugin, folder), is_loadable and is_device. category: "all" or instruments, audio_effects, midi_effects, sounds, drums, samples, clips, plugins, max_for_live, packs, user_library, current_project, user_folders. The index builds in the background ("truncated" until complete) and follows newly installed packs; refresh=True forces a rescan. Load a result with load_from_browser(track, uri=...). |
| browseA | List a browser folder. path "" lists the categories; "drums/Drum Hits/Kick" lists that folder (names match case-insensitively, file extensions optional). Items give name, path, uri, kind, is_loadable and is_device; page large folders with limit and offset. |
| load_from_browserA | Load a browser item onto a track, chosen by exactly one of uri or path (from search_browser or browse) or query (the best loadable match). Targets: by default devices and presets go on the track (an instrument, instrument preset or drum kit replaces the track's instrument; a sample on a MIDI track becomes a Simpler). position: device index to insert at. drum_pad: a note ("C1", 36) or pad name on the track's Drum Rack. slot: Session scene index for a sample on an audio track (default: the first empty slot). Clips (.alc) load as a new track. Returns the new or replaced devices, the pad or slot, and any created tracks. |
| bounceA | Render the arrangement to WAV in real time (resampling inside Live): the master plus optional stems. start/end: beats, "bar.beat.sixteenth" or a locator name; end defaults to the last arrangement event rounded up to a bar. tail: time after end for reverb and delay tails: beats, "1 bar", or seconds ("2 s"). stems: "all" (unmuted tracks with audio), or track names or indices ("return:A" works); include_returns adds every return. Files go to output_dir (default ~/Music/AbletonMCP/Bounces//) as " - Master.wav" and " - .wav", replacing same-named files. The song plays audibly; transport, loop, metronome and arm states are restored. Returns a job: poll get_bounce_status(wait=50) until phase is "done" (polling is required: it delivers the files and removes the temporary tracks). Example: bounce(stems=["Drums", "Bass"], name="Demo"). |
| get_bounce_statusA | Progress of the current bounce; when recording ends, deliver the files and return their paths. wait: seconds (0-50) to long-poll until the bounce finishes. While running: phase, progress (0-1) and eta_seconds. When done: folder, manifest (bounce.json) and files [{stem, path, duration_seconds, peak_dbfs, silent}]; delivery trims each take sample-exactly to the range and removes the temporary "[bounce]" tracks. failed carries error; cancelled after cancel_bounce. Next: analyze_audio(path). |
| cancel_bounceA | Cancel a running bounce: recording stops, transport and arm states are restored, and the temporary "[bounce]" tracks are removed. With no bounce running, removes leftover "[bounce]" tracks. |
| analyze_audioA | Measure an audio file so you can judge a mix without hearing it. Returns loudness (integrated LUFS, range LU, true peak dBTP, short-term and momentary max), levels (sample peak, RMS, crest factor, DC offset, clipped samples), stereo (correlation -1..1; width = side/mid RMS, 0 = mono), spectrum (% of energy: sub <60 Hz, low 60-250, low_mid 250-2k, high_mid 2k-6k, high >6k), a short-term loudness curve, dropouts and plain-language notes. sections: "locators" (the bounce's locators, else Live's from 1.1.1) or [{name, start, end}] in seconds, for loudness per section. images=True adds a spectrogram and a waveform (PNG). |
| create_releaseA | Master and package a finished song: normalise a bounced master, encode, tag, embed artwork, write release.json. Loudness goes to target_lufs (-14 for streaming) with true peak at most true_peak dBTP: linear gain when peaks allow, else a 4x-oversampled true-peak limiter. formats (default all): wav24, wav16 (triangular dither), flac (24-bit), mp3 (320 kbps CBR), aac (256 kbps .m4a). artwork: JPEG or PNG, embedded in FLAC/MP3/M4A. stems: "auto" (the bounce's other files) or paths, copied unprocessed to Stems/. Output: ~/Music/AbletonMCP/Releases/ - /, replacing same-named files. release.json holds tempo, key, loudness per file and sha256 checksums. |
| lom_getA | Read an object of Live's object model by path, with all property values or only Paths use Max for Live style: "live_set tracks 0 mixer_device volume", "live_set view selected_track", "live_app view". Lists are summarised as counts and names. Use the curated tools first; this reaches anything they do not cover. |
| lom_setB | Set a writable property of the object at |
| lom_callA | Call a function of the object at Example: lom_call("live_set", "create_scene", [-1]). Returns the result, with a path for any object returned. |
| lom_describeB | List the properties (with whether each is writable) and functions available at |
| reload_remote_scriptA | Developer tool: hot-reload the Remote Script's code inside Live without restarting it. full=True also reloads the script's shell module. A module that fails to import is reported and the previous code keeps running. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 78 tools
The set is massive (78 tools), and while most tools target distinct resources/actions, there are overlapping areas such as set_device vs set_device_parameters, get_device vs get_devices, and catch-all tools (clip_action, device_action, lom_*) that duplicate or extend narrower tools. Descriptions are detailed but an agent could still misselect among the many options.
Names are overwhelmingly snake_case and follow verb_noun or noun_action patterns (create_track, get_clip, set_mixer), with clear grouping prefixes (get_, set_, create_, delete_, duplicate_, move_). Minor deviations like new_set, transport, select, bounce, music_theory, and lom_* prefixes are readable but not perfectly uniform.
78 tools is extreme for any server; even a complex DAW control surface can be consolidated. This far exceeds the 50+ threshold for severe mismatch, likely overwhelming an agent and reducing usability.
The surface covers set management, tracks, clips, notes, devices, mixer, routing, browser, automation, arrangement, bounce, release, and audio analysis, plus a LOM fallback for anything missing. This is effectively complete for the stated domain.