Skip to main content
Glama
Ableton MCP for Live Intro

Ableton MCP for Live Intro

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.

  1. Get the project: git clone https://github.com/untitledxdamage/ableton-mcp-intro

  2. Install the script into Live:

    powershell -ExecutionPolicy Bypass -File install_remote_script.ps1
  3. Enable 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".

  4. Register the MCP server:

    • Claude Code:

      claude mcp add ableton --scope user -- uv run --directory "PATH\TO\ableton-mcp-intro" ableton-mcp
    • Claude Desktop or any MCP client (JSON config):

      { "mcpServers": { "ableton": { "command": "uv",
          "args": ["run", "--directory", "PATH\\TO\\ableton-mcp-intro", "ableton-mcp"] } } }
  5. 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

get_session_info set_tempo set_time_signature transport set_song_options show_view navigate_view

Tracks and routing

create_track delete_track duplicate_track set_track select_track get_track_info get_routing set_routing

MIDI clips

create_clip add_notes get_notes remove_notes quantize_clip set_clip duplicate_clip delete_clip fire_clip stop_track_clips select_clip

Automation

set_clip_automation (envelopes for any device parameter, in MIDI or audio clips)

Audio clips

load_audio_clip arrangement_audio_clip set_audio_clip

Scenes

create_scene rename_scene fire_scene duplicate_scene delete_scene

Devices

browse search_browser load_device delete_device move_device get_device_parameters set_device_parameters set_parameter_real set_sidechain device_property get_drum_pads get_rack set_chain

Arrangement

arrangement_place get_arrangement_clips clear_arrangement

Verification

measure_levels render_to_wav render_status analyze_audio

Maintenance

ping reload_script

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 tools
add_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

    C2.9/5.0

    Scored across 57 tools

    Disambiguation3/5

    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.

    Naming Consistency3/5

    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.

    Tool Count1/5

    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.

    Completeness4/5

    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

    ActivitySlowing
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables 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.
      -
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables 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.
      -
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables 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.
      -
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables 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.
      -