AbletonMCP
The AbletonMCP server lets AI assistants programmatically control Ableton Live 11/12 through 104 tools, covering the full music production workflow via a local socket connection.
Session & Transport
Get session info, set tempo, time signature, and song scale
Play, stop, record, undo/redo, capture MIDI, toggle metronome, loop, and overdub modes
Manage locators, scenes, and clip trigger quantization; switch to Arrangement view and set playhead position
Tracks & Mixer
Create, delete, duplicate, rename, and color MIDI, audio, and return tracks
Set volume (0.0–1.0, 0.85 = 0 dB), pan, mute, solo, arm, and send levels per track
Read real-time track and master output meters; configure input/output routing
Clips & MIDI Notes
Create MIDI/audio clips; add, replace, or edit notes (pitch, velocity, duration, mute, probability)
Fire/stop clips and scenes; duplicate, rename, and color clips
Set loop points, per-clip time signature, quantize with strength, and attach Groove Pool grooves
Set audio clip properties (gain, pitch, warp mode); duplicate regions with transposition
Arrangement
Copy session clips to the timeline at specific beat positions
List, inspect, and delete arrangement clips
Write and clear automation envelopes for device parameters on arrangement clips
Devices & Browser
Browse and search Ableton's library by category or query; load instruments/effects onto any track (including return and master)
Read and set device parameters by name or index; enable/bypass devices
Control rack chains, drum rack pads (mute/solo/rename), and manage rack macro snapshots (store/recall/randomize)
Generative Tools
Generate drum patterns in 7 styles (lofi, boom bap, house, techno, trap, DnB, ambient) with swing and humanization
Generate chord progressions and basslines from chord symbols in multiple styles
Write drum patterns from ASCII grid notation
Bootstrap an entire session (tempo + named tracks with instruments) in one call
Batch Operations
Run multiple commands in a single round-trip as one atomic undo step via
batch_commandsPre-defined workflow prompts:
make_a_beat,mix_and_master
The toolset can be selectively loaded via ABLETON_TOOLSETS to focus capabilities for specific tasks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AbletonMCP Create a four-on-the-floor drum pattern at 120 BPM on track 1."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ableton Live MCP Server
Website and installation guide: abletonmcp.com
Control Ableton Live from an AI assistant. This is a Model Context Protocol (MCP)
server that gives Claude, Cursor, Codex, or any MCP client 156 tools for building
tracks, editing MIDI, loading instruments and effects, mixing, and mastering inside
a running Ableton Live set, plus offline tools that read and diff saved .als
project files with Live closed.
A Remote Script runs inside Live and exposes the Live API over a local socket. The MCP server turns that into typed, validated tools that an AI can call correctly, with per-tool documentation, read-only and destructive hints, and workflow prompts.
Quickstart
You need Ableton Live 11 or 12, Python 3.10+, and uv
(brew install uv).
1. Register the MCP server.
Codex (local desktop, CLI or IDE host):
codex mcp add ableton -- uvx mcp-server-ableton-live@1.8.1
codex mcp listFor manual configuration and troubleshooting, see the Codex guide.
Claude Code:
claude mcp add AbletonMCP -s user -- uvx mcp-server-ableton-live@1.8.1Claude Desktop or Cursor, in the mcpServers block of the config file:
{
"mcpServers": {
"AbletonMCP": {
"command": "uvx",
"args": ["mcp-server-ableton-live@1.8.1"]
}
}
}(To run an unreleased revision instead, use
uvx --from git+https://github.com/wstierhout/ableton-live-mcp ableton-live-mcp.)
2. Install the Remote Script. This copies the Live-side script into your User Library:
uvx mcp-server-ableton-live@1.8.1 installThen activate the bridge in Live:
Fully restart Ableton Live.
Open Settings > Tempo & MIDI, then find the MIDI section and its Control Surface list.
In an unused Control Surface row, select AbletonMCP. Leave existing hardware controller rows unchanged.
In that same row, set Input: None and Output: None.
Link is a separate Settings page in current Live versions. In older versions, look under Link, Tempo & MIDI (or Link/MIDI) in Settings/Preferences, then find the MIDI section.
This selection is required for every MCP client. Installation copies the Remote Script; selecting the Control Surface starts it inside Live. The bridge uses a local socket, so its row does not need hardware MIDI input/output ports.
Run the installer again after upgrading the package so the Live-side script stays version-matched. See Ableton's guide to third-party Remote Scripts if the entry does not appear.
3. Check the setup.
uvx mcp-server-ableton-live@1.8.1 doctor --jsonUse the same --user-library "/path/to/User Library" for install and doctor if your
library has moved. If an older/different script exists, installation stops: review
it before adding --replace. A unique backup is retained. Restart Live before
diagnosing; doctor checks both installed bytes and the running bridge version.
4. Start read-only. Ask for the tempo and track names without changes. Then, in a disposable set, try: "Make a lofi beat at 80 BPM with a dusty drum kit, an upright bass, and Rhodes chords, then put a limiter on the master at -1 dB."
Related MCP server: remix-mcp
What it can do
Area | Tools |
Session and transport | session info, one-call session snapshot, play/stop, tempo, tap tempo, time signature, loop, locators and cue navigation, scenes, undo/redo, capture MIDI, song scale, global groove and swing, Ableton Link |
Tracks and mixer | create and delete MIDI, audio, and return tracks; delete devices; take lanes; group-track fold; volume, pan, mute, solo, arm, sends; input/output routing; meters |
Clips and notes | create clips, write and edit MIDI notes (with probability), quantize with strength, Groove Pool swing, loop, gain, pitch, warp mode |
Devices | browse and search by name, load instruments and effects onto any track including Master and Returns, read and set any parameter, sidechain routing, sample preview, rack macro variations, Simpler sample slicing, per-pad drum control, curated device knowledge base |
Arrangement | place clips on the timeline, read and delete arrangement clips, write clip automation |
Generators | drum patterns in 7 styles, euclidean rhythms, chord progressions, voice-led jazz voicings, 50-plus genre-aware progressions, voice-leading melodies, walking basslines, motif transforms (invert, retrograde, augment), minimalist processes, humanize, one-call session setup |
Batch | run many edits in one round trip and one undo step |
Audio and analysis | record a section to a WAV without the Export dialog, detect key and scale, scan the mix for problems, diff the session since the last check |
Offline (no Live) | summarize, list tracks, extract MIDI, detect key, read mixer and locator detail, diff two versions, lint a saved |
Recipes | scaffold a genre starter (lofi, house) in one call |
There are also five workflow prompts (make_a_beat, mix_and_master, start_a_track,
sound_design, analyze_and_improve) and a set of server instructions that teach the
model the conventions before its first call:
0-based indices, beats for time, 0.85 volume equals 0 dB, and native ranges for
device parameters.
Notes
Every action is a specific tool with validated arguments; there is no arbitrary-code path. Some tools still make destructive edits (delete a track, replace a clip's notes, overwrite an arrangement region), so save your work before a big session.
Audio analysis and session changes
analyze_audio_file reads WAV (integer and floating point), AIFF/AIFF-C, FLAC,
Ogg Vorbis, MP3, AAC and M4A/MP4 (AAC or Apple Lossless) locally. The package installs
the PyAV decoder dependency. It preserves the file, sample rate, channel layout and
floating-point headroom; compressed files are measured after decoding. Analysis
covers the first 30 seconds by default (up to 120 seconds, with a 32-million-sample
processing budget), and reports when the result is partial. Measurements include
sample peak and RMS, not LUFS or true peak.
session_diff distinguishes renames, reordering and duplicate track names using
identifiers from the running bridge. Call it before and after an edit; the first
call establishes the comparison baseline. Installing an updated Remote Script and
restarting Live keeps the bridge's snapshot format matched to the server.
Focusing the toolset
The server registers 156 tools. That is a lot for a model to choose from on a small
task. Set ABLETON_TOOLSETS to load only the groups you need, for example
ABLETON_TOOLSETS=session,tracks,clips,generators. Groups (each may span several modules): session, tracks, clips, devices,
browser, arrangement, generators, audio, analysis, offline, recipes.
Unset loads everything.
Conventions
Indices are 0-based. Times and lengths are in beats. Volume uses Live's 0.0 to 1.0 fader range where 0.85 is 0 dB.
Device parameters use each parameter's own range. Read
get_device_parametersfirst and check min, max, and the display value before setting.add_notes_to_clipreplaces the clip's notes. Useedit_notesto add or remove a few without touching the rest.Placing a session clip into the arrangement overwrites whatever is under it, which is also how you replace a section.
Transport replies report the state before the command ran. Confirm with
get_session_info.
Troubleshooting
AbletonMCPis missing from the Control Surface list: the folder has to be named exactlyAbletonMCP, and Live only scans scripts at startup, so restart it.Every command times out: a dialog is open in Live and it blocks the script. On the trial, that is the startup nag. Dismiss it and retry.
Port 9877 is not listening: Live is not running, or the Control Surface is not set. If another program already uses 9877, set
ABLETON_MCP_PORTin Live's launch environment andABLETON_PORTfor the server so both sides match.You cannot export or freeze from a tool: Live's API has no render or freeze function, so those stay manual. For rendered audio, export with the shortcut and analyse the file separately.
Security
The Remote Script listens on 127.0.0.1:9877 with no authentication. It is bound to
loopback so only local processes can reach it. Do not forward that port or change the
bind address to a public interface. See SECURITY.md.
Development
ableton_live_mcp/
server.py entrypoint: runs the MCP server or a setup subcommand
app.py FastMCP app, lifecycle, and server instructions
connection.py socket client to the Remote Script
cli.py install / uninstall / doctor subcommands
tools/ session, tracks, clips, devices, browser, arrangement,
generators, prompts
remote_script/
__init__.py the Live-side script and its command dispatch tables
tests/ protocol, dispatch-contract, and registration testsuv run --extra dev pytest # tests
uvx ruff check . # lintCI runs lint, a byte-compile of the Remote Script, and tests on Python 3.10, 3.12, 3.13, and 3.14.
Frequently asked questions
What is the Ableton Live MCP Server?
It is a local Model Context Protocol server that lets AI clients such as Claude,
Cursor, and Codex inspect and control Ableton Live through typed tools. It can build
tracks, edit MIDI, load and configure devices, arrange clips, mix a set, and analyze
saved .als projects.
How is this different from other Ableton MCP servers?
This server exposes 156 specific, validated tools rather than an arbitrary-code
execution tool. It includes destructive/read-only hints, workflow prompts, built-in
music generators, mixing and analysis tools, and offline .als/.adg inspection.
The Remote Script and MCP package are versioned and tested together.
Can it work while Ableton Live is closed?
The real-time control tools require Ableton Live and the bundled Remote Script to be
running. The offline tools can summarize, inspect, lint, extract MIDI from, and diff
saved .als, .adg, and .adv files without launching Live.
Which MCP clients are supported?
Any client that can launch a local stdio MCP server can use it, including Claude
Desktop, Claude Code, Cursor, Codex, and compatible IDEs. The canonical command is
uvx mcp-server-ableton-live.
Is this an official Ableton product?
No. It is an independent, open-source integration and is not affiliated with or endorsed by Ableton.
Credits and license
MIT licensed, maintained by Wouter Stierhout.
See LICENSE. Ableton and Live are trademarks of Ableton AG. This independent
open-source project is not affiliated with or endorsed by Ableton AG.
Available Tools
156 toolsadd_notes_to_clipADestructive
REPLACES the clip's entire note content with the given notes. Use edit_notes to add or remove a subset without touching the rest.
notes: list of {"pitch": 0-127 (60 = C3 in Live's naming), "start_time": beats from clip start (float), "duration": beats, "velocity": 1-127, "mute": bool}. Precondition: the clip must exist (create_clip first).
Inputs: notes (required), clip_index (required), track_index (required). Returns: result
adg_analyzeARead-only
Full offline analysis of a .adg rack or .adv preset: named macros (name/value), the chain + device tree (recursive, incl. racks-inside-racks with each device's kind/name/on-state and any sample), legacy macro-> parameter mappings, every referenced sample (name + relative path), the required Live edition, and — for drum racks — the pad map (pad -> MIDI note, label, and sample). No Live required.
Inputs: path (required). Returns: result
adg_editionARead-only
Classify the Live edition a saved .adg/.adv needs, offline: 'suite' if any Suite-only device is present (Operator, Wavetable, Echo, Drift, Meld, Sampler, Collision, ...), else 'standard' if any Standard-only device is present (EQ Eight, Compressor, Simpler, Impulse, Drum Rack, ...), else 'intro'. Returns the verdict plus which devices drove it, so an agent can tell whether a preset will load on the user's edition before loading it.
Inputs: path (required). Returns: result
adg_summaryARead-only
Summarize a saved .adg rack or .adv device preset WITHOUT Live running:
name, rack type, total device count, top-level chain count, named-macro
count, required Live edition (intro/standard/suite), and whether it is a drum
kit (is_drum_rack is true when the preset is or wraps a Drum Rack — factory
kits ship wrapped in an Instrument Rack). path is a filesystem path to a
.adg or .adv file.
Inputs: path (required). Returns: result
als_detailsARead-only
Read mixing and arrangement detail from a saved .als, offline: the set's locators (name + beat time) and each track's fader volume, pan, and number of automation lanes. Complements als_summary for reviewing a mix without Live.
Inputs: path (required). Returns: result
als_detect_keyARead-only
Detect the key/scale of a saved .als file WITHOUT Live running
(Krumhansl-Kessler). Pools notes from every MIDI clip in the set, or only
one track when track_index is given. weight selects the histogram
weighting ("duration", "velocity", "product", "count"). path is a
filesystem path to a .als file.
Inputs: path (required), weight, track_index. Returns: result
als_diffARead-only
Diff two saved .als files (e.g. song_v4.als vs song_v5.als) offline: tempo/time-signature changes, tracks added/removed by name, and per-track deltas in device chain, clip count, note count, and mute state. Great for logging what changed between versions.
Inputs: path_a (required), path_b (required). Returns: result
als_extract_midiARead-only
Extract MIDI notes from a track in a saved .als file, as
{pitch,start,duration,velocity} dicts per clip. track_index is the track's
position in the set (see als_summary). No Live required.
Inputs: path (required), track_index (required). Returns: result
als_find_unfinishedARead-only
Lint a saved .als for likely-unfinished work, offline: no master limiter/compressor, MIDI track with no instrument, MIDI clip with no notes, empty audio track, or muted tracks. Returns machine-readable issues so an agent can decide what to fix before rendering.
Inputs: path (required). Returns: result
als_list_tracksARead-only
List every track in a saved .als file with its clips (name, MIDI/audio, start, length, looping, sample path, note count). No Live required.
Inputs: path (required). Returns: result
als_summaryARead-only
Summarize a saved .als file WITHOUT Live running: version/creator, tempo,
time signature, and each track's kind, name, mute/solo, device names, clip
count, and note count. path is a filesystem path to a .als file.
Inputs: path (required). Returns: result
analyze_audio_fileARead-only
Measure local WAV (integer/float), AIFF/AIFF-C, FLAC, Ogg Vorbis, MP3, AAC or M4A/MP4 (AAC/ALAC) without Live: per-channel sample peak/RMS dBFS, DC offset, crest factor and full-scale samples. Analyzes the first max_seconds (default 30, maximum 120); marks partial results. Not LUFS or true peak. No upload. Compressed files are measured after decoding; this does not recover lost audio. Files are read locally without modification, normalization or upload.
Inputs: path (required), max_seconds. Returns: result
analyze_mixARead-only
Heuristic session-state checks, NOT audio, peak, LUFS or headroom measurements. Scan the current live set for inspection leads: several high faders, a muted or empty Session track, or a MIDI track without devices. External routing and Arrangement audio may explain these states. Returns machine-readable findings so you can decide what to fix. Reads the session; changes nothing.
Inputs: no named parameters. Returns: result
apply_recipeADestructive
Scaffold a genre starter in one call: set the tempo, add Drums, Bass, and
Chords MIDI tracks, try to load fitting instruments, and write generated
parts. name is one from list_recipes (e.g. "lofi_beat", "house_groove").
tempo/key/scale/bars override the recipe defaults. Adds new tracks; it does
not overwrite existing ones.
Inputs: name (required), key, bars, scale, +1 more. Returns: result
back_to_arrangerA
Return playback control to the Arrangement (after Session clips have overridden arrangement content - the orange 'Back to Arrangement' state).
Inputs: no named parameters. Returns: result
batch_commandsADestructive
Run several commands in ONE round-trip and ONE undo step (atomic-ish: stops at the first error; completed steps are a single undo away).
commands = [{"type": "", "params": {...}}, ...]. Command names match the MCP tool names (the few that differ are auto-translated), e.g. [{"type": "set_tempo", "params": {"tempo": 80}}, {"type": "create_midi_track", "params": {"index": -1}}]. Composite tools (record_section, load_drum_kit, apply_recipe, save_set, the generate_* tools) are NOT batchable - they orchestrate multiple commands server-side. Prefer this for multi-step edits: fewer round-trips, one undo reverts all.
Inputs: commands (required). Returns: result
capture_and_insert_sceneA
Snapshot the currently playing Session clips into a new scene - the 'keep that combination' workflow.
Inputs: no named parameters. Returns: result
capture_midiA
Grab recently played MIDI into a new clip (Live's Capture MIDI). Requires that MIDI was recently played into an armed/monitored track.
Inputs: no named parameters. Returns: result
clear_automationADestructiveIdempotent
Delete one device parameter's entire automation envelope from a clip.
Resolve the device and parameter with get_device_parameters first. This removes every automation point for that parameter, not a time range; manual parameter state remains. Use write_automation to replace the envelope with new points, or undo immediately to recover an accidental clear.
Inputs: parameter (required), clip_index (required), track_index (required), device_index (required). Returns: result
clip_operationADestructive
Structural clip edits. op: "duplicate_loop" (double the loop, duplicating notes - extend 2 bars to 4 before adding variation), "crop" (discard material outside the loop), "duplicate_region" (copy notes from region_start/region_length to destination_time, optionally transposing by transposition_amount semitones; pitch=-1 means all pitches).
Inputs: op (required), clip_index (required), track_index (required), pitch, +4 more. Returns: result
continue_playingA
Resume playback from the current position (start_playback restarts from the playhead's last start point instead).
Inputs: no named parameters. Returns: result
create_audio_clipA
Create a new audio clip in an audio track's clip slot by importing a file.
Requires Ableton Live 12.0.5 or newer - the underlying ClipSlot.create_audio_clip Live API was introduced in 12.0.5 and is not available in earlier 12.0.x releases.
Parameters:
track_index: The index of the audio track to create the clip in
clip_index: The index of the clip slot to create the clip in
path: Absolute path to a supported audio file (e.g. a .wav). The target track must be an audio track and the clip slot must be empty.
Inputs: path (required), clip_index (required), track_index (required). Returns: result
create_audio_trackA
Insert an empty audio track at a chosen position, or append with -1.
Non-negative indices insert before the current track at that position and shift it and later track indices up. Use create_midi_track for instruments and MIDI clips, or create_return_track for a shared send-effect bus.
Inputs: index. Returns: result
create_clipA
Create an empty MIDI clip in a Session slot. Fails if the slot already has a clip (pick another clip_index or delete_clip first) or the track is an audio track. length is in beats (4.0 = one 4/4 bar). Typical chain: create_clip -> add_notes_to_clip -> fire_clip or duplicate_to_arrangement.
Inputs: clip_index (required), track_index (required), length. Returns: result
create_locatorA
Create or rename an Arrangement locator at an absolute beat position.
SIDE EFFECT: first moves the Arrangement playhead to time, because Live
creates cues at the playhead. If a locator already exists there, it is reused
and renamed when name is provided. Use set_arrangement_time when only the
playhead should move, and get_locators to inspect existing markers.
Inputs: time (required), name. Returns: result
create_midi_trackA
Create a new MIDI track in the Ableton session.
Parameters:
index: The index to insert the track at (-1 = end of list)
Inputs: index. Returns: result
create_return_trackA
Create a new return track (a send bus, e.g. for shared reverb or delay).
Inputs: no named parameters. Returns: result
create_sceneA
Create a new scene (row of clip slots). index -1 appends at the end.
Inputs: index. Returns: result
create_take_laneA
Add a take lane to a track (for comping multiple recorded takes on one track). Returns the new take-lane count.
Inputs: track_index (required). Returns: result
delete_arrangement_clipADestructive
Delete a clip from the Arrangement timeline by its position in get_arrangement_clips' list. NOTE: indices of later clips on the same track shift down by one after each delete - re-read get_arrangement_clips between deletes.
Inputs: track_index (required), arrangement_clip_index (required). Returns: result
delete_clipADestructive
Delete the existing Session-view clip in a slot, including its content.
This leaves the slot empty and does not shift other slot indices. It fails for an empty slot. Use stop_clip if the intent is only to stop playback; use undo immediately if the deletion was accidental.
Inputs: clip_index (required), track_index (required). Returns: result
delete_deviceADestructive
Delete a device from a track's chain by its position (0-based). Shifts the indices of later devices, so re-read the chain afterwards.
Inputs: track_index (required), device_index (required). Returns: result
delete_return_trackADestructive
Delete a return track by index (0 = Return A). Later returns shift down.
Inputs: return_index (required). Returns: result
delete_sceneADestructive
Delete a scene (row). Later scene indices shift down by one.
Inputs: scene_index (required). Returns: result
delete_trackADestructive
Delete a track. NOTE: indices of all later tracks shift down by one.
Inputs: track_index (required). Returns: result
describe_capabilitiesARead-only
A high-level map of this server: the tool groups and what each covers, plus the conventions to follow, so you can orient before your first call. Set ABLETON_TOOLSETS to load only some groups. For the current live state, call get_session_snapshot; for mix problems, analyze_mix.
Inputs: no named parameters. Returns: result
describe_deviceARead-only
Return curated guidance for a common Ableton native device: which parameters
matter, their units (note curve = perceptual, not proportional), sensible
values, and mixing tips. device_name is case-insensitive (e.g. "EQ Eight",
"Compressor", "Glue Compressor", "Reverb", "Auto Filter", "Saturator",
"Utility", "Limiter", "Delay"). Pair with get_device_parameters for the live
indices and ranges.
Inputs: device_name (required). Returns: result
detect_clip_keyARead-only
Detect the key/scale of one Session MIDI clip (Krumhansl-Kessler). Reads
the clip's notes and returns the best-fit key with a confidence (-1..1),
margin over the runner-up, and the runner-up key. weight is how notes are
weighted into the pitch-class histogram: "duration" (default), "velocity",
"product", or "count". Reads only; changes nothing.
Inputs: clip_index (required), track_index (required), weight. Returns: result
detect_session_keyARead-only
Detect the overall key/scale of the whole set by pooling the notes of
every MIDI track's Session clips (Krumhansl-Kessler). Gives the harmonic
center of the arrangement as a whole. weight selects the histogram
weighting ("duration", "velocity", "product", "count"). Reads only.
Inputs: weight. Returns: result
detect_track_keyARead-only
Detect the key/scale of a whole track by pooling the notes of every
Session clip it holds (Krumhansl-Kessler). Useful when a part is spread
across several clips. weight selects the histogram weighting ("duration",
"velocity", "product", "count"). Reads only; changes nothing.
Inputs: track_index (required), weight. Returns: result
duplicate_clip_toADestructive
Copy a Session clip to any other track/scene slot (overwrites the destination slot). The cross-track way to build variations.
Inputs: dst_scene (required), dst_track (required), src_scene (required), src_track (required). Returns: result
duplicate_sceneA
Insert a copy of one Session scene, including every clip in its row.
This creates new content and increases the scene count; later scene indices shift to make room. Use duplicate_track for a whole track or duplicate_clip_to for one clip. Use the new scene as an editable section variation.
Inputs: scene_index (required). Returns: result
duplicate_to_arrangementADestructive
Copy a Session-view clip into the Arrangement timeline.
OVERWRITES whatever already occupies the destination range on that track (like recording over tape) - this is also the supported way to REPLACE a section. Uses Live's track.duplicate_clip_to_arrangement() API (Live 11/12). The clip is placed at destination_time beats from the start of the arrangement on the same track it lives in.
Typical workflow:
create_clip / add_notes_to_clip to build a Session clip
Call duplicate_to_arrangement once per bar/section you need
Call switch_to_arrangement_view to confirm the result in Live
Parameters:
track_index: Index of the track that owns the Session clip
clip_index: Index of the clip slot in that track (Session view)
destination_time: Beat position in the arrangement to place the clip (e.g. 0.0 = start, 8.0 = bar 3 in 4/4)
Inputs: clip_index (required), track_index (required), destination_time (required). Returns: result
duplicate_trackA
Insert a copy of one regular track, including its devices and clips.
This creates new content and increases the track count; later track indices shift to make room. Use duplicate_scene for a Session row or duplicate_clip_to for one clip. Rename or edit the copy to create a variation.
Inputs: track_index (required). Returns: result
edit_notesA
Edit a subset of notes in a MIDI clip without rewriting all of them. add = [{pitch,start_time,duration,velocity,mute}], remove = [{pitch,start_time}] (matched by pitch+start).
Inputs: clip_index (required), track_index (required), add, remove. Returns: result
fire_clipA
Launch one existing Session-view clip using Live's launch quantization.
The slot must contain a clip. Launching it takes Session control of that track and replaces any other playing Session clip on the same track; firing an already-playing clip may retrigger it according to its launch settings. Use fire_scene to launch a whole row, or continue_playing for transport only.
Inputs: clip_index (required), track_index (required). Returns: result
fire_sceneA
Launch a Session-view scene using Live's launch quantization.
This fires the row's clips together and can replace or stop clips currently playing on the affected tracks according to each slot's launch behavior. Use fire_clip to launch only one track's clip, or start_playback when the intent is Arrangement transport rather than Session launching.
Inputs: scene_index (required). Returns: result
generate_additiveADestructive
Write a Philip-Glass additive process into a Session clip. REPLACES the clip's notes if it already exists.
Builds a short one-voice motif (each pitch a note_length-beat note, back
to back) from pitches -- a space-/comma-separated list of MIDI numbers.
Then plays the first 1 note, then the first 2, then the first 3 ...
concatenated end to end, so the phrase audibly grows one note per stage.
steps is how many stages to build (0 = use every note; capped at the
number of pitches).
If source_clip_index is given, the motif is read from that clip on the
same track instead of built from pitches. Returns a short summary.
Inputs: clip_index (required), track_index (required), steps, pitches, +3 more. Returns: result
generate_basslineADestructive
Write a bassline following a chord progression. REPLACES existing notes.
progression: same syntax as generate_chord_progression. style: "roots" (long root notes), "root_fifth" (root + fifth bounce), "walking" (root, approach tones), "eighth_pump" (driving 8ths on the root). octave: 1 = very low (C1=24), 2 = typical bass (C2=36).
Inputs: clip_index (required), progression (required), track_index (required), style, +3 more. Returns: result
generate_chord_progressionADestructive
Generate voiced chords and write them into one Session-view MIDI clip.
DESTRUCTIVE: creates a clip when the slot is empty; otherwise resizes its loop
and replaces every existing note. The track must accept MIDI. Progressions
accept dash/comma/space-separated symbols such as Am9-Fmaj7-Cmaj9-G13;
supported qualities include maj7, m7, m9, 9, 13, 7#9, sus4, dim, and add9.
Use add_notes_to_clip for exact notes or edit_notes to preserve existing ones.
Inputs: clip_index (required), progression (required), track_index (required), strum, +4 more. Returns: result
generate_drum_patternADestructive
Write a genre drum pattern into a Session clip on a Drum Rack track. REPLACES the clip's notes if the clip exists.
style: lofi | boom_bap | house | techno | trap | dnb | ambient. swing: beats to delay 8th-note offbeats (0.0-0.1; 0.06 ≈ MPC-ish). humanize: max random velocity deviation (0 = machine-perfect). Uses the standard Live drum map (36 kick, 38 snare, 42/46 hats...).
Inputs: clip_index (required), track_index (required), bars, seed, +3 more. Returns: result
generate_euclidean_drumsADestructive
Write a Euclidean (Bjorklund) rhythm for one drum voice into a Session clip. REPLACES the clip's notes if the clip exists.
Distributes pulses hits as evenly as possible across steps slots spanning
one bar (steps=8 -> 8th notes, 16 -> 16th notes), repeated for bars.
pulses=3, steps=8 is the tresillo. rotate shifts the pattern left by that
many steps. instrument: a drum-map name (kick/snare/chat/ohat/clap/ride/...) or
a raw MIDI number. humanize is max +/- velocity jitter.
Inputs: clip_index (required), track_index (required), bars, seed, +6 more. Returns: result
generate_genre_progressionADestructive
Build a genre-idiomatic chord progression and write it as voiced chords. REPLACES existing notes.
genre: lofi/boom_bap/hip_hop/trap/house/deep_house/techno/trance/dnb/rnb/ neo_soul/jazz/bossa_nova/ambient/synthwave/pop/afrobeats/amapiano/... (fuzzy matched). The genre's scale-degree grammar is transposed into key+scale, then voiced (see generate_voiced_progression for the style options). bars = number of chords (the grammar loops). Returns the chord symbols it used.
Inputs: genre (required), clip_index (required), track_index (required), key, +8 more. Returns: result
generate_grooveADestructive
Write a pocketed drum groove into a Session clip. REPLACES existing notes.
style: lofi | boom_bap | house | trap | jazz | funk. pocket: beats to lay every hit behind the beat (0.0-0.1). swing: off-beat hat delay (0.5 straight .. ~0.66). ghost: 0-1 probability of soft ghost snares between backbeats. humanize: max +/- velocity deviation. Uses the standard Live drum map.
Inputs: clip_index (required), track_index (required), bars, seed, +5 more. Returns: result
generate_melodyADestructive
Write a voice-led melody over a chord progression. REPLACES existing notes.
Notes come from key+scale, biased to chord tones on strong beats, chosen by nearest-pitch voice-leading (small steps), with optional chromatic approach notes. progression: dash-/comma-separated symbols. key: e.g. "C", "F#", "Bb". scale: major/minor/dorian/lydian/mixolydian/blues/bebop/minor_pentatonic/... density: low|medium|high (note rate). phrase_arc: rising|arch|ascend_descend| static (register contour). chromatic: 0-1 approach-note probability. low/high bound the register (MIDI). swing: 0.5 straight .. ~0.66.
Inputs: clip_index (required), progression (required), track_index (required), key, +9 more. Returns: result
generate_phaseADestructive
Write a Steve-Reich phasing pattern into a Session clip. REPLACES the clip's notes if it already exists.
Builds a short one-voice motif (each pitch a note_length-beat note, back
to back) from pitches -- a space-/comma-separated list of MIDI numbers,
e.g. "60 62 64 67 69". Then stacks repeats copies of that motif, each copy
starting shift beats later than the last, so the copies drift against one
another. A shift smaller than the motif length (len(pitches)*note_length)
gives the classic overlapping phase texture; shift == motif length is a
plain loop.
If source_clip_index is given, the motif is read from that clip on the
same track instead of built from pitches. Returns a short summary.
Inputs: clip_index (required), track_index (required), shift, pitches, +4 more. Returns: result
generate_voiced_progressionADestructive
Write voice-led jazz chord voicings into a Session clip. REPLACES existing notes.
progression: dash-/comma-separated symbols, e.g. "Am9-Dm7-G13-Cmaj7". style: rootless (3-7-9-13 stack, no root), quartal (stacked 4ths), shell (root-3-7), or block (close-position). Smooth voice-leading is applied between chords. center_pitch biases register (60 = C3 in Live). voices caps notes per chord; humanize is max +/- velocity jitter.
Inputs: clip_index (required), progression (required), track_index (required), seed, +6 more. Returns: result
generate_walking_bassADestructive
Write a quarter-note walking bass line under a progression. REPLACES notes.
Root on beat 1, chord/scale tones through the bar, chromatic approach into the next chord's root on the last beat, with occasional soft ghost notes. progression: dash-/comma-separated symbols. key/scale set the passing-tone pool. octave: 1 = very low (C1), 2 = typical bass (C2). ghost: 0-1 offbeat ghost-note probability.
Inputs: clip_index (required), progression (required), track_index (required), key, +6 more. Returns: result
get_arrangement_clipsARead-only
List all clips placed in the Arrangement timeline for a track.
Returns each clip's name, start_time, end_time, length, and type.
Parameters:
track_index: The index of the track to inspect
Inputs: track_index (required). Returns: result
get_browser_items_at_pathARead-only
Get browser items at a specific path in Ableton's browser.
Parameters:
path: Path in the format "category/folder/subfolder" where category is one of the available browser categories in Ableton
Inputs: path (required). Returns: result
get_browser_treeARead-only
List the browser's top-level categories and their immediate entries. NOTE: returns a shallow listing (no deep hierarchy) - drill down with get_browser_items_at_path("instruments"), ...("sounds/Piano & Keys"), etc., or skip straight to search_browser when you know a name. category_type: "all", "instruments", "sounds", "drums", "audio_effects", "midi_effects".
Inputs: category_type. Returns: result
get_clip_infoARead-only
Full clip state: loop points, markers, playing position, per-clip time signature; for audio clips also file path, gain display, and warp markers.
Inputs: clip_index (required), track_index (required). Returns: result
get_clip_notesARead-onlyIdempotent
Return every MIDI note in an existing Session-view MIDI clip.
Each note includes pitch, start time, duration, velocity, and mute state; newer Live versions may add expression fields. This is read-only and fails for an empty slot or audio clip. Use get_clip_info for clip properties.
Inputs: clip_index (required), track_index (required). Returns: result
get_device_parametersARead-only
List all parameters of a device on a track: names, values, ranges, display strings.
Inputs: track_index (required), device_index (required). Returns: result
get_device_routingARead-only
Read a device's audio-input (sidechain) routing: current input type/channel and the available options. Only sidechain-capable devices (Compressor, Gate) have this. Use the options with set_device_routing to pick a sidechain source.
Inputs: track_index (required), device_index (required). Returns: result
get_drum_padsARead-only
List a Drum Rack's occupied pads (MIDI note, name, mute, solo).
Inputs: track_index (required), device_index (required). Returns: result
get_groovesARead-only
List grooves in the Groove Pool (index + name) and the global groove amount.
Inputs: no named parameters. Returns: result
get_group_infoARead-only
Report a track's group state: whether it is a foldable group track, whether it is inside a group, its fold state, and its parent group's name.
Inputs: track_index (required). Returns: result
get_locatorsARead-only
List arrangement locators (index, name, beat time) for structure-aware navigation. Jump with jump_to_locator.
Inputs: no named parameters. Returns: result
get_master_device_parametersARead-only
List parameters of a device on the Master track.
Inputs: device_index (required). Returns: result
get_master_metersARead-only
Read the Master track's output meters - values pinned near 1.0 during playback mean the master is clipping; pull set_master_volume down.
Inputs: no named parameters. Returns: result
get_rack_chainsARead-only
List an Instrument/Effect Rack's chains and the devices inside each - previously unreachable nested devices. Use set_chain_device_parameter to control them.
Inputs: track_index (required), device_index (required). Returns: result
get_return_device_parametersARead-only
List parameters of a device on a Return track: names, values, min/max, display strings. Call before set_return_device_parameter.
Inputs: device_index (required), return_index (required). Returns: result
get_return_tracksARead-only
List return tracks (index + name).
Inputs: no named parameters. Returns: result
get_scale_infoARead-only
Read the song's scale and tuning: scale name, root note, scale intervals, and the active tuning system (microtonal, Live 12.3+) if any. Set the scale with set_song_scale; tune device parameters (e.g. Wavetable) with set_device_parameter.
Inputs: no named parameters. Returns: result
get_session_infoARead-onlyIdempotent
Return global Live-set and transport state without modifying the set.
Includes tempo, song time signature, playback position/state, Arrangement loop, track/return/scene counts, scene names, key/scale, record mode, launch quantization, Master volume/pan, and Live version. Use get_track_info for a single track's clips/devices, or get_session_snapshot for a compact overview of every track.
Inputs: no named parameters. Returns: result
get_session_snapshotARead-only
One-call overview of the whole set: tempo, time signature, play state, and for every track its name, type, mute/solo/arm, volume, clip count, and device names, plus return-track names. Prefer this over many get_track_info calls.
Inputs: no named parameters. Returns: result
get_track_infoARead-onlyIdempotent
Return detailed state for one regular track without modifying the set.
Includes name/type, mixer and arm/mute/solo state, sends, freeze/color state, playing/fired slot indices, every Session slot's basic clip state, and the device-chain names/types. Use get_session_info for global transport state, get_device_parameters for parameter values, or get_clip_info for full clip properties.
Inputs: track_index (required). Returns: result
get_track_metersARead-only
Read a track's output level meters (post-fader): left/right 0.0-1.0ish (0.85 ≈ 0 dB, like faders). Poll during playback to judge balance/clipping - this is how you 'listen' without exporting.
Inputs: track_index (required). Returns: result
get_track_routingARead-only
Read a track's input/output routing (current + all available options) and monitoring state (0=In, 1=Auto, 2=Off). Routing options are identified by display_name - use those strings with set_track_routing.
Inputs: track_index (required). Returns: result
humanize_clipADestructive
Read a MIDI clip, apply timing + velocity humanization, and write it back. REPLACES the clip's notes with the jittered version.
timing: max +/- start-time deviation in beats. velocity: max +/- velocity deviation. Pitches are preserved; times stay non-negative. seed makes it reproducible.
Inputs: clip_index (required), track_index (required), seed, timing, +1 more. Returns: result
jump_byA
Move the playhead by a relative number of beats (negative moves back). Works during playback for on-the-fly navigation.
Inputs: beats (required). Returns: result
jump_to_cueA
Jump the playhead to the next locator/cue (direction >= 0) or the previous one (direction < 0).
Inputs: direction. Returns: result
jump_to_locatorA
Move the playhead to a locator (index from get_locators).
Inputs: locator_index (required). Returns: result
list_known_devicesARead-only
List the devices that describe_device has curated guidance for.
Inputs: no named parameters. Returns: result
list_recipesARead-only
List the built-in composition recipes (name, description, and default tempo/key/scale/bars), for use with apply_recipe.
Inputs: no named parameters. Returns: result
load_device_to_masterA
Load a device/effect from the browser onto the Master/Main track (e.g. a limiter for mastering).
Inputs: item_uri (required). Returns: result
load_device_to_returnA
Append one loadable browser device or preset to a return track's chain.
Obtain item_uri from search_browser. Loading selects the return track in
Live and creates a new device, so repeated calls add duplicates. Prefer audio
effects on returns; use load_instrument_or_effect for a regular track or
load_device_to_master for the Master chain.
Inputs: item_uri (required), return_index (required). Returns: result
load_drum_kitA
Load a Drum Rack, then the first loadable kit at a browser path.
Use search_browser to obtain the rack URI and get_browser_items_at_path to
verify the kit path. This is a two-step mutation: it appends the rack first,
then loads the first loadable item found at kit_path. If path lookup fails,
the new empty rack remains on the track; repeated calls add more racks. Use
load_instrument_or_effect when one known browser URI is sufficient.
Inputs: kit_path (required), rack_uri (required), track_index (required). Returns: result
load_instrument_or_effectA
Load an instrument or effect onto a track using its URI.
Parameters:
track_index: The index of the track to load the instrument on
uri: The URI of the instrument or effect to load (e.g., 'query:Synths#Instrument%20Rack:Bass:FileId_5116')
Inputs: uri (required), track_index (required). Returns: result
preview_browser_itemA
Audition a browser item (a sample, instrument, or preset) through Live's
preview tab WITHOUT loading it onto a track. item_uri comes from
search_browser or get_browser_items_at_path. Use stop_browser_preview to stop.
Inputs: item_uri (required). Returns: result
quantize_clipA
Quantize a MIDI clip. grid: quarter/eighth/eighth_triplet/sixteenth/sixteenth_triplet/thirtysecond. amount 0.0-1.0 (use <1.0 to humanize toward the grid without full snap).
Inputs: clip_index (required), track_index (required), grid, amount. Returns: result
rack_variationA
Rack macro snapshots. action: "store" (save current macros as a
variation), "recall" (restore variation index), "randomize" (randomize
all macro knobs - instant sound-design exploration).
Inputs: action (required), track_index (required), device_index (required), index. Returns: result
record_sectionADestructive
Bounce a section of the arrangement to an audio file WITHOUT the Export
dialog, so you can hear an internal signal. Creates a temporary audio track,
routes its input to source ("Resampling" = the master output, or a track's
name for that track's output), arms it, and records from start_beat to end_beat
in REAL TIME (a 4-bar section takes about 4 bars of wall-clock; capped at
5 minutes). Returns the recorded WAV path. Set cleanup=False to keep the
recording track. Runs the transport and adds an arrangement clip.
Inputs: end_beat (required), start_beat (required), source, cleanup. Returns: result
redoA
Redo the last undone action in Live.
Inputs: no named parameters. Returns: result
re_enable_automationA
Restore automation that was overridden by manual parameter changes. IMPORTANT: setting a device parameter that has an envelope overrides the envelope until this is called.
Inputs: no named parameters. Returns: result
replace_simpler_sampleADestructiveIdempotent
Replace a Simpler sample with an absolute local audio-file path. Requires Live 12.4+ AND runtime API support; otherwise fails before writing. Replaces musical content: confirm the target and preserve the original set. Readback is not an audio audition.
Inputs: path (required), track_index (required), device_index (required). Returns: result
save_setA
Save the current Live set to its existing file, if the Live API supports it (it does not on most versions). Returns whether the API call is available and whether the save succeeded. To save under a new name/path, use the GUI Save-As.
Inputs: no named parameters. Returns: result
search_browserARead-only
Search the Ableton browser by display name (case-insensitive substring). Returns loadable items with their URIs for load_instrument_or_effect / load_device_to_master / load_device_to_return.
category: optionally limit to one of "instruments", "sounds", "drums", "audio_effects", "midi_effects", "packs" (default: search all of them). Prefer this over walking get_browser_items_at_path when you know a name.
Inputs: query (required), category, max_results. Returns: result
session_diffARead-only
Report what changed in the set since the LAST time you called this tool: tempo/time-signature/play-state, tracks added, removed, renamed or reordered, and per-track volume, mute, solo, arm, clip-count, and device changes. The first call records a baseline (no diff). Track IDs are scoped to the running bridge; older bridges cannot identify renames reliably. Call it before and after an edit to verify it took effect.
Inputs: no named parameters. Returns: result
set_ableton_linkA
Enable or disable Ableton Link, which syncs tempo and phase with other Link-enabled apps and devices on the local network.
Inputs: enabled (required). Returns: result
set_arrangement_overdubA
Toggle arrangement overdub: recording layers MIDI onto existing arrangement clips instead of replacing them.
Inputs: enabled (required). Returns: result
set_arrangement_timeA
Move the arrangement playhead to a specific position.
Parameters:
time: Position in beats from the start of the arrangement (e.g. 8.0 = bar 3 in 4/4)
Inputs: time (required). Returns: result
set_chain_device_parameterA
Set a parameter on a device INSIDE a rack chain (indices from get_rack_chains). Values clamp to the parameter's native range.
Inputs: value (required), parameter (required), chain_index (required), track_index (required), +2 more. Returns: result
set_clip_audioA
Set audio-clip properties. gain 0-1, pitch_coarse semitones (-48..48), pitch_fine cents, warping on/off, warp_mode 0=Beats 1=Tones 2=Texture 3=Re-Pitch 4=Complex 6=Complex Pro.
Inputs: clip_index (required), track_index (required), gain, warping, +3 more. Returns: result
set_clip_colorAIdempotent
Set an existing Session clip's palette color without changing its content.
This is a visual organization change only. Use set_track_color to recolor the track header instead. Repeating the same color has no additional effect.
Inputs: clip_index (required), color_index (required), track_index (required). Returns: result
set_clip_grooveA
Attach a Groove Pool groove to a clip by index (swing/timing feel). Pass no groove_index to clear.
Inputs: clip_index (required), track_index (required), groove_index. Returns: result
set_clip_loopAIdempotent
Update selected loop and launch markers on one existing Session clip.
Provide at least one optional field; omitted fields stay unchanged. start
and end are loop-brace positions in clip-relative beats and end must be
after start. start_marker controls where non-looped launch begins;
looping enables or disables repetition. Use set_loop for the Arrangement's
global loop region, not a clip, and get_clip_info to inspect current values.
Inputs: clip_index (required), track_index (required), end, start, +2 more. Returns: result
set_clip_nameAIdempotent
Rename an existing Session-view clip without changing its notes or audio.
The slot must contain a clip. Use this for the clip label; use set_track_name for the track label. Repeating the same name has no additional effect.
Inputs: name (required), clip_index (required), track_index (required). Returns: result
set_clip_signatureA
Set a clip's own time signature (polymeter / odd-bar loops).
Inputs: numerator (required), clip_index (required), denominator (required), track_index (required). Returns: result
set_clip_trigger_quantizationA
Global launch quantization for firing clips/scenes. 0=None (instant, good for auditioning), 4=1 bar (default), 7=1/4 note, 13=1/32.
Inputs: value (required). Returns: result
set_crossfade_assignAIdempotent
Assign one regular track to crossfader side A, neither side, or side B.
This configures which side affects the track; it does not move the crossfader or change track volume immediately. Use set_crossfader afterward to blend the A/B groups. Repeating the same assignment has no additional effect.
Inputs: assign (required), track_index (required). Returns: result
set_crossfaderA
Set the master crossfader (-1.0 = full A, 0 = center, 1.0 = full B).
Inputs: value (required). Returns: result
set_device_enabledAIdempotent
Enable or bypass one device on a regular track.
true turns the device on; false bypasses its processing while preserving
the device and parameter values. This changes audible signal flow but not
clip content. Use set_track_mute to silence the whole track, or
set_device_parameter to change one control.
Inputs: enabled (required), track_index (required), device_index (required). Returns: result
set_device_parameterA
Set a parameter after reading get_device_parameters. Numbers use the native range; strings use display units ('250 Hz', '-6 dB') or exact enum labels. Unsupported display mappings fail before writing. Returns Live's actual readback and warnings.
Inputs: value (required), parameter (required), track_index (required), device_index (required). Returns: result
set_device_routingA
Set a device's sidechain audio input. field is "input_routing_type" (the
source track/return) or "input_routing_channel" (Pre FX / Post FX / Post Mixer);
display_name is one of the options from get_device_routing. For ducking, also
enable the device's Sidechain parameter via set_device_parameter.
Inputs: field (required), track_index (required), device_index (required), display_name (required). Returns: result
set_drum_padA
Mute/solo/rename a single Drum Rack pad by its MIDI note (e.g. 36=kick). Per-pad muting = instant beat variations without touching the notes.
Inputs: note (required), track_index (required), device_index (required), mute, +2 more. Returns: result
set_fold_stateA
Fold (collapse) or unfold a group track. Errors if the track is not a group track (see get_group_info).
Inputs: track_index (required), folded. Returns: result
set_groove_amountA
Set the global Groove Amount (0.0 to 1.0), which scales how strongly every clip's assigned groove is applied across the whole set.
Inputs: amount (required). Returns: result
set_loopAIdempotent
Set the global Arrangement loop region and its enabled state.
start is an absolute beat and length is a positive beat duration. The
region is updated even when enabled=false; playback simply will not repeat
it. Use set_clip_loop for a Session clip's loop braces, not the Arrangement.
Inputs: start (required), length (required), enabled. Returns: result
set_master_device_parameterAIdempotent
Set one enabled parameter on a device in the Master track's chain.
Call get_master_device_parameters first and use its parameter name/index and native min/max; numeric out-of-range values are clamped. Display strings with supported units or exact enum labels also work; unsupported mappings fail before writing. This affects the full mix. Read back the resulting display. Use set_device_parameter for a regular track or set_return_device_parameter for a return track.
Inputs: value (required), parameter (required), device_index (required). Returns: result
set_master_volumeA
Set the Main/Master track volume. Range 0.0-1.0 where 0.85 = 0 dB.
Inputs: volume (required). Returns: result
set_metronomeA
Turn Live's metronome click on/off.
Inputs: enabled (required). Returns: result
set_record_modeAIdempotent
Arm or disarm Live's global Arrangement Record state.
true enables Arrangement recording; false disables it. Enabling alone
does not record: arm the intended tracks with set_track_arm, then use
start_playback. Use set_session_record or trigger_session_record for Session
slots instead. Repeating the current state has no additional effect.
Inputs: enabled (required). Returns: result
set_return_device_parameterAIdempotent
Set one enabled parameter on a device in a return track's chain.
Call get_return_device_parameters first and use its parameter name/index and native min/max; numeric out-of-range values are clamped. Supported display-unit strings and exact enum labels also work; unsupported mappings fail before writing. Use set_device_parameter for a regular track or set_master_device_parameter for the full-mix chain.
Inputs: value (required), parameter (required), device_index (required), return_index (required). Returns: result
set_scene_nameAIdempotent
Rename one Session-view scene without changing any clips in the row.
Use set_clip_name for an individual clip. Repeating the same name has no additional effect.
Inputs: name (required), scene_index (required). Returns: result
set_sendA
Set a track's send level (send_index 0 = Return A, 1 = Return B, ...). Range 0.0-1.0.
Inputs: value (required), send_index (required), track_index (required). Returns: result
set_session_automation_recordA
Toggle recording of parameter changes into Session clip envelopes - an alternative to write_automation for captured knob rides.
Inputs: enabled (required). Returns: result
set_session_recordA
Toggle Session record (records into armed tracks' selected Session slots; also enables MIDI overdub into playing clips).
Inputs: enabled (required). Returns: result
set_simpler_playback_modeA
Set a Simpler device's playback mode: 0 = Classic, 1 = One-Shot, 2 = Slicing. Slicing chops the sample into playable slices, central to lofi/hip-hop sampling. Errors if the device at that index is not a Simpler.
Inputs: mode (required), track_index (required), device_index (required). Returns: result
set_song_scaleA
Set the song's key context. root_note 0-11 (0=C, 2=D...), scale_name e.g. "Major", "Minor", "Dorian". Read current values via get_session_info.
Inputs: root_note, scale_name. Returns: result
set_swing_amountA
Set the global swing amount (0.0 to 1.0) used when quantizing with swing.
Inputs: amount (required). Returns: result
set_tempoA
Set the tempo of the Ableton session.
Parameters:
tempo: The new tempo in BPM
Inputs: tempo (required). Returns: result
set_time_signatureAIdempotent
Set the Live set's global time signature, such as 4/4, 3/4, or 6/8.
This changes bar/grid and metronome interpretation but does not rewrite clip notes. Use set_clip_signature instead when only one clip needs a different meter for polymeter. Repeating the same signature has no additional effect.
Inputs: numerator (required), denominator (required). Returns: result
set_track_armA
Arm or disarm a track for recording (fails on tracks that can't be armed, e.g. group/return tracks).
Inputs: arm (required), track_index (required). Returns: result
set_track_colorA
Set a track's color by index (0-69 in Live's palette).
Inputs: color_index (required), track_index (required). Returns: result
set_track_monitoringA
Set input monitoring: 0=In (always hear input), 1=Auto, 2=Off. Required for resampling/bounce workflows.
Inputs: state (required), track_index (required). Returns: result
set_track_muteAIdempotent
Set one regular track's mute state (true mutes; false unmutes).
Muting silences that track in Live but preserves its clips, devices, and mixer settings. Use set_track_solo to audition a track relative to the rest, or stop_clip when only Session clip playback should stop.
Inputs: mute (required), track_index (required). Returns: result
set_track_nameA
Set the name of a track.
Parameters:
track_index: The index of the track to rename
name: The new name for the track
Inputs: name (required), track_index (required). Returns: result
set_track_panAIdempotent
Set one regular track's stereo pan position; 0.0 is centered.
Live clamps the value to the track's native range. This changes mixer state, not the audio file or clip content. Use set_master_device_parameter for a device control, and set_crossfader for A/B crossfading.
Inputs: pan (required), track_index (required). Returns: result
set_track_routingA
Set track routing by display name. field: input_routing_type | output_routing_type | input_routing_channel | output_routing_channel. Enables sidechain sources, bus routing, and resampling (route a track's output into another track's input, arm, record). Get options from get_track_routing first.
Inputs: field (required), track_index (required), display_name (required). Returns: result
set_track_soloAIdempotent
Set one regular track's solo state (true solos; false unsolos).
Solo changes monitoring relative to other tracks and does not alter clip or device content. Other tracks may remain soloed, so clear them separately when exclusive auditioning is required. Use set_track_mute to silence this track.
Inputs: solo (required), track_index (required). Returns: result
set_track_volumeA
Set track volume. Range 0.0-1.0 where 0.85 = 0 dB (unity gain).
Inputs: volume (required), track_index (required). Returns: result
setup_sessionA
Bootstrap a session in one call: set tempo and create named MIDI tracks, optionally loading an instrument found by name for each.
tracks: [{"name": "Drums", "instrument": "drum kit"}, {"name": "Bass", "instrument": "upright bass"}, ...]. "instrument" is a search_browser query (best match is loaded); omit it to create an empty track. Returns a per-track report with the loaded item names.
Inputs: tempo (required), tracks (required). Returns: result
start_playbackA
Start Arrangement playback from the current song time. NOTE: the response reports the PRE-command state (may say playing=false right after starting) - confirm with get_session_info.
Inputs: no named parameters. Returns: result
stop_all_clipsA
Stop every playing Session clip (does not stop the transport).
Inputs: no named parameters. Returns: result
stop_browser_previewA
Stop the browser preview started by preview_browser_item.
Inputs: no named parameters. Returns: result
stop_clipA
Stop playing a clip.
Parameters:
track_index: The index of the track containing the clip
clip_index: The index of the clip slot containing the clip
Inputs: clip_index (required), track_index (required). Returns: result
stop_playbackA
Stop playback. NOTE: the response reports the PRE-command state - confirm with get_session_info.
Inputs: no named parameters. Returns: result
switch_to_arrangement_viewA
Switch Ableton's main window to the Arrangement view.
Parameters:
Inputs: no named parameters. Returns: result
tap_tempoA
Tap the tempo once. Tapping repeatedly at a beat sets the tempo to that rate; a single tap nudges the transport. Returns the resulting tempo.
Inputs: no named parameters. Returns: result
transform_clipADestructive
Read a MIDI clip's notes, apply a classical motif transformation, and write
the result. Overwrites the source clip unless dest_clip_index is given
(in which case that destination slot is REPLACED instead).
op (one of):
transpose - shift every pitch by amount semitones (integer; may be
negative). Timing unchanged; out-of-range pitches clamped.
invert - mirror pitches about the first note's pitch (up-motion becomes
down-motion). amount is ignored.
retrograde - play the motif backwards in time (onset order reversed,
durations preserved). amount is ignored.
augment - scale start times and durations by amount (a factor > 1
stretches/slows, 0 < amount < 1 compresses/speeds up).
Requires amount > 0.
amount therefore means semitones for transpose and a time factor for
augment. Returns a short summary of what was written.
Inputs: op (required), clip_index (required), track_index (required), amount, +1 more. Returns: result
trigger_session_recordA
Start Session recording into armed tracks; record_length in beats records a fixed-length loop (e.g. 16.0 = 4 bars) then auto-switches to playback.
Inputs: record_length. Returns: result
undoA
Revert the most recent undoable Live-set action.
This mutates the set and may remove newly created content or restore deleted content. It has no target parameter: Live chooses the top undo-history entry. Use redo to reapply an accidental undo. Prefer batch_commands for related edits so one undo reverts the group.
Inputs: no named parameters. Returns: result
write_automationA
Write clip automation for a device parameter. points = [{"time": beats, "value": v}, ...]. Replaces any existing envelope for that parameter on the clip.
Inputs: points (required), parameter (required), clip_index (required), track_index (required), +1 more. Returns: result
write_drum_gridADestructive
Write drums from an ASCII grid (16th-note steps). REPLACES existing notes.
grid: one line per instrument: "name: pattern" where pattern chars are 'X' (accent, vel 105), 'x' (normal, 85), 'o' (soft, 55), '.' or '-' (rest). Line length = number of 16th steps (16 = one 4/4 bar; 32 = two bars...). Instruments: kick snare rim clap chat phat ohat ltom mtom htom crash ride perc shaker, or a raw MIDI number ("36: x...").
Example (one bar of lofi): kick: X..x......X..... snare: ....x.......x... chat: x.o.x.o.x.o.x.o.
Inputs: grid (required), clip_index (required), track_index (required), swing. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 156 tools
Most tools target clearly distinct resources (track vs clip vs device vs return), and the descriptions are exemplary at cross-referencing alternatives. However, several overlapping clusters remain - four drum-pattern writers (generate_drum_pattern, generate_groove, generate_euclidean_drums, write_drum_grid), three chord generators, and two bass generators - where an agent must read carefully to avoid misselection.
Naming is overwhelmingly systematic: snake_case, verb-first, with predictable family prefixes (get_, set_, create_, delete_, generate_, als_, adg_) across nearly all 156 tools. Minor deviations include noun-style commands (batch_commands, clip_operation, session_diff) and the jump_by vs jump_to_* split.
156 tools far exceeds the well-scoped range, and despite Ableton Live's genuinely broad domain, there is significant redundancy (4 drum writers, 3 chord writers, 4 key detectors, 3 parameter-setter variants). This volume imposes heavy context costs and makes every tool selection a high-cardinality decision.
The surface is remarkably complete: tracks, clips, devices, transport, browser, automation, MIDI generation, live analysis, and offline .als/.adg inspection are all covered with full lifecycles. Minor gaps exist - no final render/export to disk, no arrangement clip move/trim/split, and automation can only be written/cleared, not read back - but agents can work around them.
Maintenance
Related MCP Connectors
MCP server for Producer/Riffusion AI music generation
Remote MCP server for audio stem separation, denoise, reverb, and MIDI export.
MCP server that lets your AI assistant build and deploy apps, hosting each one at a live URL.
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseCqualityDmaintenanceA Model Context Protocol server that enables real-time interaction with Ableton Live, allowing AI assistants to control song creation, track management, clip operations, and audio recording workflows.23133 npm94MIT
- AlicenseNot gradedqualityDmaintenanceA Rust MCP server that enables AI assistants to control Ableton Live via OSC, offering 266 tools for transport, tracks, clips, scenes, devices, and more.24MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that enables AI agents to read and edit Ableton Live sets, including tracks, clips, MIDI notes, devices, and scenes.1-
- FlicenseBqualityDmaintenanceMCP server for controlling Ableton Live, enabling AI assistants to interact with Live sessions through tools for track/clip/scene management, playback control, and device parameter adjustments.48-