Skip to main content
Glama

AbletonMCP

AbletonMCP lets an AI agent (Claude, or any MCP client) operate Ableton Live 12 over the Model Context Protocol. It is built for an agentic composer. The agent can go from an empty set to a finished song and render release-ready files without a human touching Live:

  1. Set tempo, key and scale.

  2. Build instruments and effects.

  3. Write MIDI parts and drum patterns.

  4. Arrange sections.

  5. Mix and automate.

  6. Master and bounce the master and stems.

  7. Measure loudness and spectrum.

  8. Encode WAV, FLAC, MP3 and AAC with tags and artwork.

Version 2 is a ground-up redesign. The goals and design are in docs/PRD.md, and the full tool reference is docs/TOOLS.md.

How it works

AI agent ──MCP (stdio)──► AbletonMCP server ──TCP 127.0.0.1:9877──► AbletonMCP Remote Script ──► Ableton Live
                          (Python, this repo)                     (runs inside Live as a control surface)
  • The Remote Script runs inside Live. It executes commands on Live's main thread, with one undo step per change.

  • The MCP server exposes 78 workflow-shaped tools. It also does what Live's API cannot, using ffmpeg: rendering by resampling, loudness and spectral analysis, and encoding and tagging releases.

Related MCP server: Ableton MCP for Live Intro

Requirements

  • Ableton Live 12.4 or later (verified on 12.4.6, Suite). macOS is the primary platform; Windows is best-effort.

  • uv and Python 3.10 or later.

  • ffmpeg, for analyze_audio and create_release. On macOS: brew install ffmpeg.

  • Optional: macOS Automation and Accessibility permission for the app running the MCP server. This enables save_set, new_set and export_audio, which drive Live's menus because Live has no API for them.

Install

  1. Get the code

    git clone https://github.com/elleural/ableton-mcp.git

    Then run uv sync from the cloned folder.

  2. Install the Remote Script into Live's User Library. This links it to your checkout, so updates need no copying.

    uv run ableton-mcp install
  3. Restart Live. It only discovers Remote Scripts at launch. Then open Settings → Link, Tempo & MIDI and set a Control Surface slot to AbletonMCP, with Input and Output set to None.

  4. Register the MCP server with your client.

    • Claude Code:

      claude mcp add --scope user ableton -- uv run --directory /path/to/ableton-mcp ableton-mcp
    • Claude Desktop: in claude_desktop_config.json, add:

      {"mcpServers": {"ableton": {"command": "uv", "args": ["run", "--directory", "/path/to/ableton-mcp", "ableton-mcp"]}}}

    Do not use uvx ableton-mcp. That installs an unrelated older package from PyPI.

  5. Check everything.

    uv run ableton-mcp doctor

Using it

Ask for music in plain language. For example: "Make a 124 BPM house track in A minor: four-on-the-floor drums, a rolling bassline, warm chords; arrange intro/verse/drop; mix it; bounce it with stems and give me a -14 LUFS release." The server's instructions teach the agent the workflow and conventions. Its usual flow:

get_status → set_song → create_track / add_device / load_from_browser → create_clip (notes, pattern) →
write_automation → fire_scene → arrange_from_scenes → set_mixer / set_sidechain → bounce →
get_bounce_status → analyze_audio → create_release → save_set

Conventions every tool shares:

  • Tracks: an index, a name, "return:A", or "master".

  • Devices: an index, a name, or a rack path like "Drum Rack/Kick/Simpler".

  • Time: beats, or "bar.beat.sixteenth" such as "17.1.1".

  • Pitch: a MIDI number or a note name, where C3 is 60.

  • Mixing units: volume in dB, pan from −1 to +1.

Every change is one undo step (undo), and lom_get / lom_set / lom_call reach anything in Live's object model that the curated tools do not.

Rendering and release

Live's API has no export function, so bounce renders in real time inside Live:

  1. It records the master, through Live's "Resampling" input, and any stems you ask for onto temporary audio tracks.

  2. It restores your transport and arm settings.

  3. It writes sample-accurate WAVs to ~/Music/AbletonMCP/Bounces/<name>/.

create_release then:

  1. Normalises to a loudness target, by default −14 LUFS with a −1 dBTP ceiling.

  2. Encodes WAV 24-bit and 16-bit (dithered), FLAC, MP3 320 and AAC.

  3. Writes tags and artwork.

  4. Saves the files with a release.json manifest to ~/Music/AbletonMCP/Releases/<artist> - <title>/.

Listening loop

The agent cannot hear, so the listening loop (docs/listening-loop-prd.md) lets it check its own work against a spec of the brief (key, progressions, loop lengths, layer tiers, loudness targets; the bundled one is NOVA's, ears/specs/nova.spec.json):

Tool

Does

analyze_notes

Checks the stem clips' notes: key, chord tones, semitone clashes between stems, loop lengths, grid, lead rests. Under a second, no audio

capture

Records every stem's track output, the returns and the main mix in real time inside Live (Session recording on temporary cap: tracks), cuts the folded second cycle into a take and analyses it. Leaves the set as found

analyze_audio(take=...)

Tier sums T1–T5 as the game layers them: −14 LUFS / −1 dBTP, key, mono sub, stems + returns cancel the mix, tempo consistency, tier ladder, masking, the game's analyser bands, phone survival; strict adds the delivery-file checks

compare

Deltas between two takes (or against the spec), loudness-matched, each improved, regressed or within the measured noise; blind gives an X/Y packet for a fresh judge

takes

The ledger of takes, keep the best one, restore an earlier take's notes and parameters

ref, meter

References: a Spotify track played in the desktop app and measured through the interface's loopback (a 4th Gen Scarlett's inputs 3-4, or a virtual device), once, as numbers only; or a file you own. compare(take, "refs") places a take's balance, dynamics and width against them; meter measures whatever plays now

The analysis is the standalone ears package; its CLI runs without Live and doubles as the soundtrack's acceptance script:

uv run ears acceptance path/to/public/music/masters

Takes live in <set folder>/ears/ for a saved set, else ~/Music/AbletonMCP/Ears/<set name>/ (EARS_HOME overrides). Verified capture behaviour and calibration are in docs/spikes.md and docs/listening-loop-calibration.md.

Limits of Live's API

Not possible through Live's API

What AbletonMCP does instead

Offline export

Real-time bounce; optional export_audio drives Live's dialog through UI automation

Saving or creating sets

save_set / new_set through UI automation; open_set uses the OS

Group tracks

create_bus routes tracks into an audio bus track

Arrangement automation lanes

Automate Session clips with write_automation; envelopes travel into the arrangement

Freeze, flatten, consolidate, audio editing

Not available

Troubleshooting

  • Run uv run ableton-mcp doctor first. It checks Live, the Remote Script link, the port, versions, ffmpeg and permissions, and prints a fix for each failure.

  • AbletonMCP is not in the Control Surface list: restart Live after ableton-mcp install.

  • Errors after updating the code: call the reload_remote_script tool, or run uv run ableton-mcp-debug send reload_remote_script, to hot-load new Remote Script code without restarting Live.

  • Live's log: ~/Library/Preferences/Ableton/Live <version>/Log.txt on macOS. Remote Script messages are prefixed AbletonMCP.

Development

See docs/DEVELOPING.md for the architecture, adding commands and tools, hot reload and the test layers:

  • Offline unit and contract tests: uv run pytest tests/unit tests/contract

  • Listening loop analysis (ears) on synthetic fixtures: uv run pytest tests/ears and uv run ears calibrate

  • Live integration tests: uv run pytest tests/live, against a running Live; they clean up after themselves.

Credits

The original AbletonMCP is by Siddharth Ahuja. This fork's v2 rewrite is by Frederic Laruelle. MIT licensed. This is a third-party project and is not made by Ableton.

Available Tools

78 tools
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").

Inputs: name (required), track (required), chain, position.

analyze_audioA
Read-onlyIdempotent

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

Inputs: path (required), images, sections.

arrange_from_scenesA
Destructive

Build the arrangement from scenes: sections play one after another from start, each placing every track's clip from its scene for the section's length.

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 tracks). locators=True adds a locator per section, named after it; the transport is stopped first if it is playing. Arrangement clips are independent copies: write notes and automation in the Session clips BEFORE arranging (or re-run with clear=True after editing them). Returns undo_steps. Example: arrange_from_scenes([{"scene": "Intro", "bars": 4}, {"scene": "Verse", "bars": 8}]). Verify with get_arrangement.

Inputs: sections (required), clear, start, tracks, +1 more.

bounceA
Destructive

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

Inputs: end, name, tail, start, +3 more.

browseA
Read-onlyIdempotent

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.

Inputs: path, limit, offset.

cancel_bounceA
Idempotent

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.

Inputs: no named parameters.

clear_arrangementA
Destructive

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

Inputs: end, mode, start, tracks, +1 more.

clear_automationB
Destructive

Remove a clip's envelope for one parameter, or every envelope when parameter is omitted. Works for Session and arrangement clips. Example: clear_automation("Pad", slot=0, parameter="volume").

Inputs: track (required), slot, device, parameter, +1 more.

clip_actionB
Destructive

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

Inputs: track (required), action (required), args, slot, +1 more.

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

Inputs: name (required), sources (required), color.

create_clipA
Destructive

Create a clip: MIDI in an empty Session slot (0-based scene index) or on the arrangement at a time; audio from file_path on audio tracks. Optionally fill it in the same call: notes (as write_notes) and/or pattern (drum steps, as write_drum_pattern).

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

Inputs: track (required), at, name, slot, +5 more.

create_locatorA

Add an arrangement locator (cue point) at time (beats or "bar.beat.sixteenth"), optionally named. The transport must be stopped. Live snaps locators to the 1/16 grid, and only places them within the song length. Locators are indexed in time order. Example: create_locator("17.1.1", "Chorus").

Inputs: time (required), name.

create_releaseA
Destructive

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.

Inputs: title (required), artist (required), source (required), year, +9 more.

create_sceneA

Create a Session scene (a song section) at index (-1 = at the end), optionally named and coloured (Live colour index 0..69 or "#RRGGBB"). tempo (BPM) and time_signature ("3/4") make Live switch to them when the scene fires. Example: create_scene(name="Chorus", tempo=128).

Inputs: name, color, index, tempo, +1 more.

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

Inputs: kind (required), name, color, index, +1 more.

delete_clipA
Destructive

Delete a Session or arrangement clip. Destructive: confirm with the user before deleting their own material.

Inputs: track (required), slot, arrangement_clip.

delete_deviceA
Destructive

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

Inputs: track (required), device (required).

delete_locatorA
Destructive

Delete a locator, addressed by index (time order) or by name. The transport must be stopped; the playhead is put back afterwards.

Inputs: locator (required).

delete_notesA
Destructive

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.

Inputs: track (required), all, end, slot, +6 more.

delete_sceneA
Destructive

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.

Inputs: scene (required).

delete_trackA
Destructive

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

Inputs: track (required).

device_actionC
Destructive

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.

Inputs: track (required), action (required), device (required), args.

duplicate_clipA
Destructive

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

Inputs: track (required), move, slot, to_slot, +3 more.

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.

Inputs: track (required), device (required).

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.

Inputs: scene (required).

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.

Inputs: track (required), name.

edit_notesA
Idempotent

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.

Inputs: edits (required), track (required), slot, arrangement_clip.

export_audioA

[UI automation, EXPERIMENTAL] Render the arrangement from start to end (beats or "bar.beat.sixteenth") with Live's own offline File > Export Audio/Video, to path (".wav").

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

Inputs: end (required), path (required), start (required).

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.

Inputs: slot (required), track (required).

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

Inputs: scene (required), force_legato.

get_arrangementA
Read-onlyIdempotent

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 limit clips are listed. Example: get_arrangement(start="9.1.1", end="17.1.1").

Inputs: end, limit, start, tracks.

get_automationA
Read-onlyIdempotent

List the parameters a clip automates; with parameter, also its breakpoints and samples values across the clip loop, in display units (dB, Hz, pan ...). Works for Session clips and for the envelopes arrangement clips carry. Example: get_automation("Pad", slot=0, parameter="volume").

Inputs: track (required), slot, device, samples, +2 more.

get_bounce_statusA
Idempotent

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

Inputs: wait.

get_clipB
Read-onlyIdempotent

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 limit notes (or use get_notes with filters).

Inputs: track (required), slot, limit, notes, +1 more.

get_deviceB
Read-onlyIdempotent

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.

Inputs: track (required), device (required), detail, parameters.

get_devicesA
Read-onlyIdempotent

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 device to other tools.

Inputs: track (required).

get_groovesA
Read-onlyIdempotent

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

Inputs: no named parameters.

get_metersA
Read-onlyIdempotent

Momentary peak levels of every track, return and master (or only tracks), read from Live's meters.

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.

Inputs: tracks.

get_mixerA
Read-onlyIdempotent

Mixer state of every regular, return and master track (or only tracks) in one call: volume_db, pan (-1..1 plus display), sends in dB keyed by return letter, mute, solo, arm, active (track activator), crossfade, pan_mode and split pans; the master adds crossfader and cue_volume_db. "-inf" means silence.

Inputs: tracks.

get_notesA
Read-onlyIdempotent

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

Inputs: track (required), end, slot, limit, +6 more.

get_routing_optionsA
Read-onlyIdempotent

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.

Inputs: track (required).

get_song_overviewA
Read-onlyIdempotent

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.

Inputs: detail.

get_statusA
Read-onlyIdempotent

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; fix says how to enable it).

When Live is unreachable it still answers, with connected: false and how to fix it. If dialog is set, Live is waiting for an answer: respond_to_dialog.

Inputs: no named parameters.

get_trackA
Read-onlyIdempotent

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

Inputs: track (required), detail.

load_from_browserA
Destructive

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.

Inputs: track (required), uri, path, slot, +3 more.

lom_callA
Destructive

Call a function of the object at path with positional args ({"path": "..."} refers to an object).

Example: lom_call("live_set", "create_scene", [-1]). Returns the result, with a path for any object returned.

Inputs: path (required), method (required), args.

lom_describeB
Read-onlyIdempotent

List the properties (with whether each is writable) and functions available at path, with Live's docs.

Inputs: path.

lom_getA
Read-onlyIdempotent

Read an object of Live's object model by path, with all property values or only properties.

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.

Inputs: path (required), properties.

lom_setB
Destructive

Set a writable property of the object at path. Pass {"path": "..."} as value to refer to an object.

Inputs: path (required), value (required), property (required).

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.

Inputs: track (required), device (required), to_chain, to_track, +1 more.

music_theoryA
Read-onlyIdempotent

Music theory without touching Live (C3 = 60). operation: scale: key ("A", "F# dorian") + scale (any Live scale name, "minor", "blues"...) -> notes, pitches from octave. chord: chord symbol ("Am7", "F#m7b5", "C7sus4", "Cadd9", "C/E"), or a numeral ("V7") with key; inversion, voicing (close, open, drop2, drop3, spread), octave -> pitches. progression: key ("C", "A minor") + numerals ("ii7-V7-Imaj7", "i-bVI-bIII-bVII", "V7/V") or chord symbols; beats_per_chord, voice_leading -> chords plus "notes" ready for write_notes. notes: note names or numbers -> MIDI number, names, frequency. list: available scales, chords, voicings.

Inputs: operation (required), key, chord, notes, +8 more.

new_setA
Destructive

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

Inputs: discard_unsaved.

open_setA
Destructive

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.

Inputs: path (required), discard_unsaved.

redoA

Redo steps actions previously undone with undo (1..100). Returns how many were redone plus can_undo and can_redo. Any new change clears the redo history.

Inputs: steps.

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.

Inputs: full.

respond_to_dialogA
Destructive

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.

Inputs: button (required).

save_setA
Destructive

[UI automation] Save the current Live Set; with path, save it as a new file ("~/Music/My Song.als").

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

Inputs: path.

search_browserA
Read-onlyIdempotent

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

Inputs: query (required), limit, refresh, category.

selectA
Idempotent

Select in Live's UI so the user sees what you are working on: a track, a scene, a clip slot of track (shows its clip in the Detail view), or a device of track (index, name or rack path); and show a view: "Session", "Arrangement", "Detail", "Clip", "Devices" or "Browser". Pass slot or scene, not both. With no arguments, returns the current selection and focused view.

Inputs: slot, view, scene, track, +1 more.

set_chainA
Idempotent

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

Inputs: chain (required), track (required), device (required), pan, +8 more.

set_clipA
Idempotent

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

Inputs: track (required), grid, name, slot, +21 more.

set_deviceA
Idempotent

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.

Inputs: track (required), device (required), name, enabled, +3 more.

set_device_parametersA
Idempotent

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

Inputs: track (required), device (required), values (required).

set_grooveA
Idempotent

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

Inputs: groove (required), base, name, random, +3 more.

set_locatorA
Idempotent

Rename a locator, addressed by index (time order) or by name. To move one, delete it and create it again at the new time.

Inputs: name (required), locator (required).

set_mixerA
Idempotent

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

Inputs: track (required), pan, mute, solo, +10 more.

set_sceneA
Idempotent

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.

Inputs: scene (required), name, color, tempo, +1 more.

set_sidechainA

Duck track whenever source plays: sidechain compression, e.g. a bass or pad pumping to the kick.

Uses Live's Compressor, the only device whose sidechain input the API can route: device, else the first Compressor on the track, else a new one at the end of its chain. source: the triggering track (it needs audio output; for a kick inside a drum track, use that track). channel: "Post FX" (default), "Pre FX" or "Post Mixer". Sets S/C On, threshold (dB), ratio, attack and release (ms); enabled=False turns it off. Example: set_sidechain("Bass", "Drums", threshold_db=-30, ratio=6, release_ms=150).

Inputs: track (required), ratio, device, source, +5 more.

set_songA
Idempotent

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.

Inputs: key, link, loop, scale, +19 more.

set_trackA
Idempotent

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

Inputs: track (required), arm, fold, name, +8 more.

show_messageA
Idempotent

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.

Inputs: text (required).

stop_clipA

Stop the playing or triggered Session clips on a track (quantized=False stops immediately).

Inputs: track (required), quantized.

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

Inputs: track (required), operation (required), end, grid, +18 more.

transportA

Control playback. action: "play" (from position if given), "continue", "stop", "jump" (to position), "jump_to_next_locator", "jump_to_prev_locator", "play_selection", "stop_all_clips", "back_to_arrangement" (stop Session clips overriding the arrangement and resume it), "tap_tempo", "capture_midi" (recently played MIDI into a clip), "capture_scene" (playing clips into a new scene).

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

Inputs: action (required), position.

undoA

Undo the last steps actions in Live (1..100). Every AbletonMCP call that changes the set is one undo step, so undo() reverts the previous call. Returns how many steps were undone plus can_undo and can_redo. Live's history is shared with the user's own edits in Live.

Inputs: steps.

write_automationA
Destructive

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 device. Times are clip beats or "bar.beat.sixteenth" (1.1.1 = clip start). points: [{time, value}]; two points at one time make a jump. shape: {type: ramp|sine|triangle|square|saw|steps, from, to, period ("1 bar"), steps: [values]} over start..end (default: the clip loop). units "display": dB, Hz, ms, %, pan -1..1, item names; "raw": internal values. clear_range replaces breakpoints in the range. Envelopes loop with the clip and travel into the arrangement; arrangement clips can only edit envelopes they already carry. Example: write_automation("Pad", "volume", slot=0, shape={"type": "ramp", "from": -24, "to": 0}).

Inputs: track (required), parameter (required), end, slot, +7 more.

write_drum_patternA
Destructive

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

Inputs: track (required), pattern (required), mode, slot, +4 more.

write_notesA
Destructive

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}].

Inputs: notes (required), track (required), end, mode, +3 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 78 tools

    Disambiguation3/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness5/5

    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.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      C
      quality
      B
      maintenance
      Enables Claude or any AI agent to operate Live 12 Intro end to end: creating tracks and scenes, writing and quantizing MIDI clips, loading audio onto the Arrangement timeline, setting device parameters in real units, drawing clip automation, mixing with real sidechain, and rendering or analyzing audio so the agent can check its own work. It exposes 57 tools over MCP or a local JSON socket, working within the stock Intro edition's 16-track, 16-scene limits.
      57
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables any MCP client to control Ableton Live 12 through 56 tools covering tracks, clips, MIDI notes, devices and racks, mixer parameters, transport, browser loading, automation, and arrangement editing. It also provides optional audio analysis (key, chords, groove, transcription, stem separation, mastering listen) and session memory.
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables Claude or any MCP client to produce full tracks in Ableton Live from chat: building tracks, writing MIDI notes, loading and tweaking device parameters, arranging sections, and drawing real clip and Arrangement automation. It also exposes mixer state snapshots and clip editing so a live set can be inspected and reshaped end to end.
      43
      MIT