Ableton MCP for Live Intro
Summary: This MCP server lets an AI agent (Claude or any MCP client) build, edit, automate, arrange, mix, and objectively verify music inside Ableton Live 12 Intro via 57 tools.
Session & transport: read full session state, set tempo/time signature, control playback, loop, metronome, playhead, record mode, undo/redo.
Tracks & routing: create/delete/duplicate tracks, set volume, pan, sends, mute/solo/arm, color, monitoring, and input/output routing.
MIDI clips & notes: create clips, write/read/remove notes with velocity, probability and variation, quantize, rename, loop, duplicate.
Automation: draw clip envelopes for any device parameter (e.g. filter sweeps, volume ducks) in raw or stepped points.
Audio: load samples into Session slots or place directly on the Arrangement timeline; set warp mode, tape-style pitch, and gain.
Scenes & arrangement: create/rename/fire/duplicate/delete scenes, copy clips onto the Arrangement timeline, list and clear arrangement clips.
Devices: browse/search the browser, load instruments, effects, kits or presets, reorder/delete devices, read and set parameters in real units (Hz, dB, ms, %), access racks and Drum Rack pads, and set compressor sidechains.
UI control: show/hide views, select tracks and clips, zoom and scroll views.
Verification (self-checking): measure live output levels, render the Arrangement to WAV or stems in real time, and analyze audio (LUFS, true peak, spectral balance, stereo, texture).
Maintenance: ping the bridge and hot-reload the Remote Script without restarting Live.
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., "@Ableton MCP for Live Intro create a new MIDI track with a piano and write a 4-bar chord progression"
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 MCP for Live Intro
English · Español
An unofficial MCP server that lets Claude, or any AI agent, operate Ableton Live 12. It is built and tested on the entry-level Live Intro edition: no Max for Live, only stock Intro devices, and within Intro's limits (16 tracks, 16 scenes).
Its robustness doesn't come from theory. It comes from real projects controlled end to end through this bridge, where every result was checked by measurement and every bug found along the way was fixed and documented. See docs/VALIDACION.md.
Not affiliated with or endorsed by Ableton AG. "Ableton" and "Live" are trademarks of Ableton AG.
What it's for
It gives an agent hands and ears inside Live:
Build sessions: create MIDI, audio and return tracks; load instruments, effects, kits and presets from the browser.
Write music: MIDI clips with notes, probability and velocity variation; quantize; read back what you played.
Work with audio, not just MIDI: load samples and recordings (WAV/AIFF/FLAC/MP3) into audio clips; set warp mode, tape-style pitch (warp off + transpose) and gain; place audio directly on the Arrangement timeline at any bar.
Automate: draw clip envelopes for any device parameter, e.g. a filter opening from 700 Hz to 12 kHz over 8 bars, or a sidechain-style volume duck.
Arrange: scenes, and placing clips in the Arrangement to lay out a full song.
Shape sound: set any device parameter, in real units (Hz, dB, ms, %); reach inside racks and Drum Rack pads; reorder effects.
Mix: volume, pan, sends, routing, real Compressor sidechain.
Check its own work, since an agent can't hear: live meters, render to WAV or stems, and audio analysis (LUFS, true peak, spectral balance, stereo, texture).
Related MCP server: Blender Open MCP
What it does well (tested)
Fine-grained control on Intro. 57 tools that cover the everyday Live workflow without Max for Live.
Real units instead of raw values. "150 Hz" or "-18 dB" land exactly: the bridge bisects Live's own display values.
Honest rendering. Live's API can't export, so the bridge records in real time and trims Live's hidden latency pre-roll, so files start on the downbeat (verified to the transient). All stems come out in one pass, and they sum back to the master (correlation 0.97).
Measurement you can trust. Loudness matches BS.1770 references within ±0.02 LU, streamed in about 90 MB of RAM.
Safe around a human. It never steals focus while you're using the computer, guards against Live's "S = solo" hotkey, restores solo/mute states, and returns clear errors.
Hot reload. Update the script without restarting Live.
Results
A complete beat made through the bridge, with audio, charts and a real example session, plus a video of an agent building a lo-fi beat from an empty set: examples/.
What it doesn't do
It doesn't export through Live's dialog. Renders are real-time recordings, so a 2-minute song takes 2 minutes.
It can't save or create sets by itself. Saving after a render is done with Ctrl+S on Windows; on other systems you save by hand.
It can't reach inside many Intro presets. Some racks hide their internals; only their macros are reachable.
Automation lives inside clips. Clip envelopes work (and travel with the clip into the Arrangement), but track-level automation lanes in the Arrangement are not supported.
It can't judge taste. It measures; you listen and decide.
Works with any agent
Any MCP client (Claude Code and Claude Desktop tested; others should work because MCP is a standard).
Any program, without MCP, through the local socket. Send one JSON line per command:
→ {"id": 1, "cmd": "set_tempo", "params": {"bpm": 140}} ← {"id": 1, "ok": true, "result": {"tempo": 140.0}}Commands and parameters: docs/ARQUITECTURA.md.
Install
Requirements: Ableton Live 12 (Intro or higher), Python 3.13, uv.
Get the project:
git clone https://github.com/untitledxdamage/ableton-mcp-introInstall the script into Live:
powershell -ExecutionPolicy Bypass -File install_remote_script.ps1Enable it in Live (once): Settings → Link, Tempo & MIDI → Control Surface → AbletonMCP_Intro (Input/Output: None). The status bar shows "AbletonMCP_Intro listo en el puerto 9880".
Register the MCP server:
Claude Code:
claude mcp add ableton --scope user -- uv run --directory "PATH\TO\ableton-mcp-intro" ableton-mcpClaude Desktop or any MCP client (JSON config):
{ "mcpServers": { "ableton": { "command": "uv", "args": ["run", "--directory", "PATH\\TO\\ableton-mcp-intro", "ableton-mcp"] } } }
Check (with Live open; read-only):
uv run python tests/mcp_smoke.py
Updating the script: install_remote_script.ps1 -Reload applies changes without restarting Live. Toggling the Control Surface does not reload code.
Tools (57)
Area | Tools |
Session and transport |
|
Tracks and routing |
|
MIDI clips |
|
Automation |
|
Audio clips |
|
Scenes |
|
Devices |
|
Arrangement |
|
Verification |
|
Maintenance |
|
Feedback welcome
This is a personal, unofficial project, tested only on my own setup (Live 12.2.7 Intro, Windows). It surely has rough edges. If you try it, open an issue: bugs, missing tools, things that feel wrong in a real workflow, or simply whether it works on Standard/Suite or macOS. I'll keep updating it from time to time, at least until Ableton releases an official option.
Documentation (Spanish)
VALIDACION.md: the evidence. What was tested, how, the results, the 16 bugs found and fixed, and what is not tested.
HALLAZGOS_API_LIVE12.md: what works and what doesn't in the Live 12 API, pitfalls, and raw-value → real-unit calibration tables.
ARQUITECTURA.md: internals, socket protocol, render flow, and how to add commands.
How it was made
Built with Claude Code running Claude Opus 5.5, through iterative working sessions (vibecoding). I set the goals, used the bridge in real projects and judged every result; Claude wrote the code, measured the results and documented each failure. The bridge counts as robust because it was used and broken for real, not because it looks complete.
Credits
The overall architecture (a script inside Live + a local socket + an MCP server) is inspired by ahujasid/ableton-mcp. This is an independent implementation written from scratch, focused on Live Intro, units, rendering and verification. It uses a different script name and port, so both can be installed side by side.
License
MIT. Provided as is, without warranty. Back up your sets.
Available Tools
57 toolsadd_notesB
Write MIDI notes into an existing clip. replace=True clears the clip first. Notes beyond the clip length are kept but won't play until the loop is extended.
Inputs: notes (required), slot_index (required), track_index (required), replace.
analyze_audioA
Objective 'ears' for a WAV/AIFF/FLAC: integrated LUFS, sample and true peak, crest factor, clipping, spectral balance per band (dB relative to total), stereo and low-end (<150 Hz) correlation, loudness per section, and a 'texture' block for Foley/ambiences: contrast_db (p95-p10 of 50 ms RMS; a real fireplace ~25-30 dB, below ~10 dB reads as a wash/"falling water"), crackle_ratio (p99/median 50 ms energy; >= 4 for crackly textures) and tonal_peak_hz/tonal_prominence (a line > 3x its local median in a noisy ambience is a hum; on music it is just a note, so ignore it there).
Inputs: path (required), section_seconds.
arrangement_audio_clipA
Place an audio file (absolute path, WAV/AIFF/FLAC/MP3) directly on an audio
track's Arrangement timeline at time beats (bar N starts at (N-1)*4 in 4/4),
without going through a Session slot. The clip is created unwarped (natural speed).
Inputs: time (required), file_path (required), track_index (required).
arrangement_placeA
Copy a Session clip into the Arrangement timeline at time beats
(bar N starts at (N-1)*4 in 4/4). Use it to lay out a full song from scenes.
Inputs: time (required), slot_index (required), track_index (required).
browseA
List the contents of a browser folder, e.g. 'instruments', 'drums', 'audio_effects/Delay & Loop', 'instruments/Drift'. First segment is the category.
Inputs: path.
clear_arrangementB
Remove every clip from a track's Arrangement timeline (Session clips stay).
Inputs: track_index (required).
create_clipB
Create an empty MIDI clip in a Session View slot. length in beats (4 = one 4/4 bar).
Inputs: slot_index (required), track_index (required), name, length.
create_sceneC
Add a scene (row). index=-1 appends at the bottom.
Inputs: name, index.
create_trackC
Create a MIDI, audio or return track. index=-1 appends at the end.
Inputs: name, type, index.
delete_clipC
Delete the clip in a slot.
Inputs: slot_index (required), track_index (required).
delete_deviceC
Remove a device from a track's chain.
Inputs: track_index (required), device_index (required), kind.
delete_sceneB
Delete a scene row and its clips.
Inputs: scene_index (required).
delete_trackC
Delete a track or return track.
Inputs: track_index (required), kind.
device_propertyB
Read (value omitted) or set a device property that is not an automatable parameter, e.g. Simpler 'voices' (1 = mono, needed for 808 glide).
Inputs: name (required), track_index (required), device_index (required), kind, +3 more.
duplicate_clipB
Copy a clip to another slot (overwrites the target). Good for making variations.
Inputs: slot_index (required), target_slot (required), track_index (required), target_track (required).
duplicate_sceneC
Duplicate a scene with all its clips; the copy lands right below.
Inputs: scene_index (required).
duplicate_trackB
Duplicate a track (with devices and clips); the copy lands right after it.
Inputs: track_index (required).
fire_clipB
Launch a clip (starts on the next launch-quantization boundary).
Inputs: slot_index (required), track_index (required).
fire_sceneC
Launch every clip in a scene row.
Inputs: scene_index (required).
get_arrangement_clipsC
List the clips already on a track's Arrangement timeline (start/end in beats).
Inputs: track_index (required).
get_device_parametersA
List every parameter of a device: index, name, raw value, min, max, the value as Live displays it (Hz, dB, ms...) and options for switch-type parameters. For a device nested inside a rack, pass chain + chain_device (see get_rack).
Inputs: track_index (required), device_index (required), kind, chain, +1 more.
get_drum_padsC
List the filled pads of a Drum Rack (MIDI note -> sample name).
Inputs: track_index (required), kind, device_index.
get_notesC
Read all notes of a MIDI clip (e.g. something the user played) plus clip info.
Inputs: slot_index (required), track_index (required).
get_rackB
Show the chains of a rack (Instrument/Drum/Audio Effect Rack; most presets are racks) and the devices inside each, to edit parameters the macros hide.
Inputs: track_index (required), device_index (required), kind.
get_routingC
Current and available input/output routings of a track (by display name).
Inputs: track_index (required), kind.
get_session_infoA
Snapshot of the Live set: tempo, signature, transport, every track with its devices and clips (by slot), return tracks, master, scenes, selection.
Inputs: no named parameters.
get_track_infoB
Detailed info for one track (mixer, clips, device list with indexes).
Inputs: track_index (required), kind.
load_audio_clipA
Load an audio file (absolute path, WAV/AIFF/FLAC/MP3) into an empty Session View slot of an audio track.
Inputs: file_path (required), slot_index (required), track_index (required).
load_deviceA
Load an instrument, effect, kit or preset onto a track (appended to its chain).
Give an exact browser path (from browse/search_browser) or a query name like
'Reverb', 'Drift', 'EQ Eight', '808 Core Kit'. Call get_track_info afterwards to
get the new device's index.
Inputs: track_index (required), kind, path, query, +1 more.
measure_levelsA
Poll Live's output meters while the set plays and return the peak and average level per track, return and master (Live meter scale 0-1; 0.917 is -0.3 dBFS, ~0.0125-0.015 units per dB near the top). Start playback first. This is the closest thing to listening: use it to balance and catch clipping.
Inputs: seconds.
move_deviceB
Reorder a device in its chain (load_device always appends at the end, e.g. move an EQ in front of the master Limiter).
Inputs: new_index (required), track_index (required), device_index (required), kind.
pingA
Check the bridge is alive and report Live's version.
Inputs: no named parameters.
quantize_clipC
Quantize a clip's notes to a grid. amount 0-1 (1 = hard quantize).
Inputs: slot_index (required), track_index (required), grid, amount.
reload_scriptA
Hot-reload the Remote Script inside Live after its source file was updated.
Inputs: no named parameters.
remove_notesC
Delete notes inside a pitch/time window (defaults: the whole clip).
Inputs: slot_index (required), track_index (required), from_time, time_span, +2 more.
rename_sceneC
Rename a scene (e.g. 'Intro', 'Verso', 'Coro').
Inputs: name (required), scene_index (required).
render_statusB
Progress of the current render; with wait_seconds, block up to that long.
Inputs: wait_seconds.
render_to_wavA
Render the Arrangement to WAV by recording in real time (Live has no export API). Default: the master mix to one file on the user's Desktop. With stems (track/return names, or ["all"]) it records one post-mixer file per track in a single pass into " - stems/" (mind Intro's 16-track limit: each stem adds a temporary track). end_bar=None renders to the last clip; tail_bars keeps reverb/delay tails. Files start exactly on the downbeat (latency pre-roll cut). The set must be saved once; the render saves it again (Live only releases new recordings on save). Takes as long as the music plays: returns immediately unless wait_seconds > 0; poll render_status until 'done'. Master renders include an analysis (LUFS, true peak, bands, per-section loudness); stems a level summary. Renders obey solo/mute: soloed tracks are reported in the result.
Inputs: stems, end_bar, filename, start_bar, +4 more.
search_browserB
Find loadable items (devices, presets, kits, samples) whose name contains
query. Without a category it searches instruments, drums, effects and sounds.
Inputs: query (required), category, max_results.
select_clipC
Highlight a clip slot in Live's UI so the user sees it in the clip view.
Inputs: slot_index (required), track_index (required).
select_trackB
Select a track in Live's UI (shows its devices at the bottom).
Inputs: track_index (required), kind.
set_audio_clipC
Audio clip playback. warp_mode: 0 Beats, 1 Tones, 2 Texture, 3 Re-Pitch (tape-style: pitch and speed move together), 4 Complex, 6 Complex Pro (check which your edition has). pitch_coarse in semitones (-48..48), pitch_fine in cents (-50..50), gain raw 0..1 (read gain_display).
Inputs: slot_index (required), track_index (required), gain, warping, +3 more.
set_chainB
Mix one chain of a rack, e.g. a single Drum Rack pad (get_rack lists them): volume 0-1 like a track fader (0.85 = 0 dB, 1.0 = +6 dB), pan -1..1.
Inputs: chain (required), track_index (required), device_index (required), pan, +4 more.
set_clipC
Rename a clip, change its loop region (beats), looping on/off or color.
Inputs: slot_index (required), track_index (required), name, looping, +3 more.
set_clip_automationB
Draw a clip envelope for a device parameter (e.g. an Auto Filter sweep).
Points are steps: each holds value from time for duration beats; use many
short steps for a smooth ramp. Values use the parameter's raw range.
Inputs: points (required), parameter (required), slot_index (required), track_index (required), +5 more.
set_device_parametersA
Set several parameters at once: {"Frequency": 0.4, "Resonance": 0.3}. Keys are parameter names (or indexes as strings); values are raw numbers within min/max, or an option name for switch parameters. {"Device On": 0} bypasses it. Raw values are not always linear units: check the returned 'display' and adjust. Racks: pass chain + chain_device to reach a device inside a rack (see get_rack).
Inputs: values (required), track_index (required), device_index (required), kind, +2 more.
set_parameter_realA
Set a parameter in the units Live displays instead of raw values: Hz for frequencies (e.g. 150, 5000), dB for gains/thresholds, ms for times (seconds are converted), % for amounts. Finds the raw value by bisection without side effects. Prefer this over set_device_parameters for EQs, filters, compressors.
Inputs: target (required), parameter (required), track_index (required), device_index (required), +3 more.
set_routingC
Route a track by display name, e.g. input_type='Resampling' (records the master) or input_type='808' (records another track). See get_routing for options.
Inputs: track_index (required), kind, input_type, output_type, +1 more.
set_sidechainB
Read or set the sidechain source of a Compressor (or any device with its own input routing). source = a track name, e.g. a silent 'ghost trigger' track that plays short hits on the 808 notes; then set_device_parameters {"S/C On": 1}. Omit source to list the available sources.
Inputs: track_index (required), device_index (required), kind, source, +1 more.
set_song_optionsB
Metronome, arrangement loop (start/length in beats), playhead and record mode. song_time only moves the playhead while playing; while stopped use start_time (the position 'play' starts from).
Inputs: loop, metronome, song_time, loop_start, +3 more.
set_tempoA
Set the song tempo in BPM (20-999).
Inputs: bpm (required).
set_time_signatureC
Set the song time signature, e.g. 4/4, 3/4, 6/8.
Inputs: numerator (required), denominator (required).
set_trackC
Change track properties. volume is 0.0-1.0 (0.85 = 0 dB, about 0.025 per dB near the top), pan -1 (L) to 1 (R), color_index 0-69 from Live's palette, sends is a list per return track (0.0-1.0, None leaves one unchanged).
Inputs: track_index (required), arm, pan, kind, +7 more.
show_viewA
Show a view of Live's window ('Arranger', 'Session', 'Browser', 'Detail', 'Detail/Clip', 'Detail/DeviceChain') and optionally hide others, e.g. view='Arranger', hide=['Browser', 'Detail'] for a clean Arrangement.
Inputs: hide, view.
stop_track_clipsB
Stop whatever clip is playing on one track.
Inputs: track_index (required).
transportC
Transport control. 'undo'/'redo' use Live's own history; 'back_to_arranger' makes every track follow the Arrangement again after Session clips were launched.
Inputs: action (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 57 tools
The set covers many distinct Ableton resources, but several device-parameter and clip-placement tools overlap enough to cause hesitation. set_device_parameters, set_parameter_real, device_property, and set_sidechain all modify device state, while arrangement_audio_clip, arrangement_place, load_audio_clip, and create_clip differ mainly by context.
Most tools use snake_case and an action_object pattern, but the convention is not uniform: transport, ping, browse, and device_property are noun/single-word tools, while others are verb_noun or noun_verb phrases. The names remain readable but are not fully predictable.
57 tools is far beyond the typical 3-15 well-scoped range and exceeds the 50+ threshold for an extreme mismatch. Even for a complex DAW, this surface creates high selection cost and makes it hard to keep the set coherent.
The surface covers core Ableton workflows: transport, tracks, clips, scenes, devices, browser, arrangement, rendering, and audio analysis. Minor gaps remain, such as reading clip automation/envelopes or explicit master-track operations, but agents can mostly work around them.
Maintenance
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
Remote MCP server for audio stem separation, denoise, reverb, and MIDI export.
MCP server for Producer/Riffusion AI music generation
Read and edit DAW projects as an agent, save native Logic projects, convert projects between DAWs
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to control a live Blender session through MCP tools for scene and object manipulation, rendering, PolyHaven asset search/download/texturing, and guided scene workflows, while allowing runtime switching between local or OpenAI-compatible LLM providers.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to control a live Blender session, including scene and object operations, rendering, and PolyHaven asset workflows. Supports provider-agnostic LLM backends that can be switched at runtime through MCP tools.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect and control a live Blender session through MCP tools that create, modify, and delete objects, apply materials, render images, execute Python, and pull PolyHaven assets over a local TCP add-on. It also exposes a provider-agnostic LLM layer that can be pointed at Ollama, LM Studio, llama.cpp, OpenAI-compatible, or Azure endpoints and switched at runtime.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to control a live Blender session via MCP tools for scene and object operations, rendering, code execution, and PolyHaven asset management. It supports provider-agnostic LLM backends that can be configured at startup or switched at runtime.-