Ableton MCP Extended
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 Extended set volume of track 2 to -3 dB"
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 Extended
An independently maintained, privacy-focused derivative of ahujasid/ableton-mcp that adds deeper session editing, feedback, mixing, MIDI surgery, and bounce workflows for Ableton Live.
This project is not affiliated with or endorsed by Ableton. It remains in private staging while the extended commands are tested against real Live sets.
Why this derivative exists
The upstream project provides the MCP-to-Ableton bridge. This derivative keeps that architecture and adds 31 MCP tools:
Session structure: create audio and return tracks, delete tracks, create and name scenes, duplicate clips between scenes, and inspect scene names.
Clip editing: delete clips, clear notes, read notes, update individual notes, remove notes by pitch/time range, set loop markers, and quantize clips.
Instruments and devices: load samples onto Drum Rack pads, inspect pad names, inspect device parameters, and set device parameters.
Mixing and feedback: set volume, pan, mute, solo, arm, monitoring, color, and send levels; inspect return tracks and output meters; undo and redo.
Rendering: bounce a Session View MIDI clip to audio in real time.
It also changes the privacy posture:
No telemetry code or Supabase dependency.
The Ableton Remote Script listens on
127.0.0.1by default, not every network interface.MCP request and response sizes are bounded.
Command parameters, prompts, paths, and raw responses are not written to normal MCP logs.
See UPSTREAM.md for provenance and CHANGELOG.md for the maintained change summary.
Related MCP server: ableton-mcp
Requirements
Ableton Live 11 or newer; Live 12 is recommended.
Python 3.10 or newer for the MCP server.
uv.
Some note-editing and clip-duplication operations depend on APIs introduced in newer Live versions. Save a copy of important sets before testing destructive commands.
Install for development
git clone https://github.com/RichieMiller-HU/ableton-mcp-extended.git
cd ableton-mcp-extended
uv sync --extra devCopy AbletonMCP_Remote_Script into Ableton's User Remote Scripts directory,
restart Live, and select AbletonMCP as a Control Surface.
During private staging, configure an MCP client to run the local checkout:
{
"mcpServers": {
"AbletonMCP-Extended": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/ableton-mcp-extended",
"run",
"ableton-mcp-extended"
]
}
}
}The path above is an example. Never commit a personal absolute path or MCP client configuration containing credentials.
Only run one Ableton MCP server at a time.
Security model
The Remote Script has no authentication. Loopback binding prevents direct
connections from other computers, but any process running as a local user may
attempt to connect to port 9877 and issue Ableton commands. Do not change the
bind address to 0.0.0.0 or expose the port through forwarding or tunneling.
See SECURITY.md for reporting and deployment guidance.
Development checks
uv run --extra dev pytest
uv run --extra dev detect-secrets scan --all-files --exclude-files '^\.git/'
uv buildLive API behavior still requires an integration pass inside Ableton; the unit suite covers the Python bridge and publication/privacy invariants.
License and attribution
MIT licensed. The original copyright and permission notice are preserved in LICENSE. Modifications are documented rather than presented as original upstream work.
Available Tools
52 toolsadd_notes_to_clipC
Add MIDI notes to a clip.
Parameters:
track_index: The index of the track containing the clip
clip_index: The index of the clip slot containing the clip
notes: List of note dictionaries, each with pitch, start_time, duration, velocity, and mute
Inputs: notes (required), clip_index (required), track_index (required). Returns: result
bounce_midi_clip_to_audioA
Bounce (record) a MIDI clip's audible output to an audio clip, in REAL TIME via resampling-record (Live's Freeze/Flatten is not automatable). Creates an audio track (or uses dest_track_index), routes the MIDI track's Post FX output into it, records the clip in the same scene row, and auto-stops after clip length + tail. Returns immediately — wait the reported duration_seconds, then verify with get_track_info / get_arrangement_clips.
Playback is audible during the bounce; don't change the session while recording.
Parameters:
track_index: source MIDI track
clip_index: source clip slot (recording lands in the SAME slot row on the audio track)
extra_tail_beats: extra beats recorded for reverb/delay tails (default 4)
dest_track_index: existing audio track to record into (-1 = create new '[BOUNCE]' track)
Inputs: clip_index (required), track_index (required), dest_track_index, extra_tail_beats. Returns: result
clear_clip_notesA
Remove ALL MIDI notes from a clip while keeping the clip itself (so you can rewrite it from scratch without deleting/recreating the slot).
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
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
Create a new audio track in the Ableton session.
Parameters:
index: The index to insert the track at (-1 = append at end)
Inputs: index. Returns: result
create_clipC
Create a new MIDI clip in the specified track and clip slot.
Parameters:
track_index: The index of the track to create the clip in
clip_index: The index of the clip slot to create the clip in
length: The length of the clip in beats (default: 4.0)
Inputs: clip_index (required), track_index (required), length. 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_trackB
Create a new return (send/FX) track in the Ableton session.
Return tracks are appended at the end of the return track list.
Parameters:
Inputs: no named parameters. Returns: result
create_sceneA
Create a new scene (Session-view row). index=-1 appends at the end.
Parameters:
index: The position to insert the scene at (-1 = end)
Inputs: index. Returns: result
delete_clipB
Delete the clip in the specified track/clip slot (empties the slot).
Parameters:
track_index: The index of the track containing the clip
clip_index: The index of the clip slot to empty
Inputs: clip_index (required), track_index (required). Returns: result
delete_trackA
Delete a track by its index. Indices of later tracks shift down by one.
Parameters:
track_index: The index of the track to delete
Inputs: track_index (required). Returns: result
duplicate_clip_to_sceneA
Copy a clip (MIDI or AUDIO) from one slot to another empty slot on the SAME track. This is how you place a loop into several scenes for live performance — and unlike create_clip it works for audio clips too.
Parameters:
track_index: The track that owns the clip
src_clip_index: The slot index to copy FROM (must contain a clip)
dest_clip_index: The slot index to copy TO (must be empty)
Inputs: track_index (required), src_clip_index (required), dest_clip_index (required). Returns: result
duplicate_to_arrangementA
Copy a Session-view clip into the Arrangement timeline.
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
fire_clipC
Start 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
get_arrangement_clipsA
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_pathA
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_treeC
Get a hierarchical tree of browser categories from Ableton.
Parameters:
category_type: Type of categories to get ('all', 'instruments', 'sounds', 'drums', 'audio_effects', 'midi_effects')
Inputs: category_type. Returns: result
get_clip_notesA
Read the actual MIDI notes of a clip (pitch, start_time, duration, velocity, mute) so you can see its real chords/melody. MIDI clips only.
Parameters:
track_index: The track holding the clip
clip_index: The clip slot index (Session scene - 1)
Inputs: clip_index (required), track_index (required). Returns: result
get_device_parametersA
List every parameter of a device (index, name, current value, min, max). Use this before set_device_parameter to find the right parameter and its range.
Parameters:
track_index: The track holding the device
device_index: The device's index in that track's chain (0 = first)
Inputs: track_index (required), device_index (required). Returns: result
get_drum_pad_namesA
List which MIDI note triggers which drum pad/instrument on the first Drum Rack of a track (e.g. 36=Kick 808, 38=Snare...). Call this before writing/fixing drum MIDI so you know what each pitch plays.
Parameters:
track_index: The track holding the Drum Rack
Inputs: track_index (required). Returns: result
get_metersA
Snapshot the current output meter levels for every track and the master. Returns output_meter_left and output_meter_right (0.0-1.0 linear peak) for each track, plus output_meter_level where available. Call repeatedly during playback to poll levels; each call is a single instantaneous sample.
Inputs: no named parameters. Returns: result
get_return_tracksA
List all return tracks (A, B, C…) with their names and loaded devices. Use before set_send_level to know available return track indices.
Inputs: no named parameters. Returns: result
get_scene_namesA
List all Session scenes: index, name, tempo hint (if the scene name sets one) and whether the scene is empty. Use before firing/organizing scenes.
Inputs: no named parameters. Returns: result
get_session_infoB
Get detailed information about the current Ableton session
Parameters:
Inputs: no named parameters. Returns: result
get_track_infoA
Get detailed information about a specific track in Ableton.
Parameters:
track_index: The index of the track to get information about
Inputs: track_index (required). Returns: result
load_drum_kitB
Load a drum rack and then load a specific drum kit into it.
Parameters:
track_index: The index of the track to load on
rack_uri: The URI of the drum rack to load (e.g., 'Drums/Drum Rack')
kit_path: Path to the drum kit inside the browser (e.g., 'drums/acoustic/kit1')
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
load_sample_to_drum_padA
Load a browser sample (by its URI) onto a specific pad of a Drum Rack that is already on the track. This lets you build a custom drum kit pad-by-pad.
Prerequisite: a Drum Rack must already be loaded on the track (use load_instrument_or_effect with the Drum Rack URI 'query:Drums#Drum%20Rack', or any drum kit). Get the sample's URI from get_browser_items_at_path.
Parameters:
track_index: The index of the track holding the Drum Rack
pad_note: MIDI note number of the target pad (e.g. 36=C1, 38=D1, 42=F#1)
item_uri: Browser URI of the sample to load onto that pad
Inputs: item_uri (required), pad_note (required), track_index (required). Returns: result
quantize_clipA
Quantize a MIDI clip's notes to a grid.
Parameters:
track_index / clip_index: which clip
grid: 1=1/4, 2=1/8, 3=1/8T, 4=1/8+T, 5=1/16 (default), 6=1/16T, 7=1/16+T, 8=1/32
amount: 0.0-1.0 strength (1.0 = hard snap; 0.5 keeps half the human feel)
Inputs: clip_index (required), track_index (required), grid, amount. Returns: result
redoA
Redo the last undone action in Ableton Live (equivalent to Cmd+Shift+Z). Returns can_undo and can_redo flags after the operation.
Inputs: no named parameters. Returns: result
remove_notes_in_rangeA
Surgically remove notes inside a pitch/time window of a MIDI clip, keeping everything else (unlike clear_clip_notes which wipes all).
Parameters:
track_index / clip_index: which clip
from_pitch: lowest MIDI pitch to remove (default 0)
pitch_span: how many pitches up from from_pitch (default 128 = all)
from_time: window start in beats (default 0.0)
time_span: window length in beats (-1 = to end of clip)
Inputs: clip_index (required), track_index (required), from_time, time_span, +2 more. 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_clip_loopA
Set a clip's loop and start/end marker properties (in beats). Only the parameters you pass are changed.
Parameters:
track_index / clip_index: which clip
looping: enable/disable looping
loop_start / loop_end: loop brace positions in beats
start_marker / end_marker: clip play start/end in beats
Inputs: clip_index (required), track_index (required), looping, loop_end, +3 more. Returns: result
set_clip_nameA
Set the name of a clip.
Parameters:
track_index: The index of the track containing the clip
clip_index: The index of the clip slot containing the clip
name: The new name for the clip
Inputs: name (required), clip_index (required), track_index (required). Returns: result
set_device_parameterA
Set a device parameter (e.g. a Utility's Gain, a Compressor's Threshold) by its index or its name. Call get_device_parameters first to see names/ranges. The value is clamped to the parameter's min/max.
Parameters:
track_index: The track holding the device
device_index: The device's index in that track's chain (0 = first)
parameter: Parameter index (int) or exact parameter name (str)
value: The value to set (in the parameter's own units, e.g. dB for Gain)
Inputs: value (required), parameter (required), track_index (required), device_index (required). Returns: result
set_scene_nameB
Set the name of a scene (Session-view row), e.g. 'INTRO', 'HOOK'.
Parameters:
scene_index: The index of the scene
name: The new scene name
Inputs: name (required), scene_index (required). Returns: result
set_send_levelA
Set a track's send level to a return track.
Parameters:
track_index: The index of the source track
send_index: The index of the send (0 = first return track / Send A)
level: Normalized level 0.0-1.0 (0.0 = off, 0.85 ~ 0 dB, 1.0 = max)
Inputs: level (required), send_index (required), track_index (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_track_armB
Arm or disarm a track for recording / input monitoring.
Parameters:
track_index: The index of the track
armed: True to arm, False to disarm
Inputs: track_index (required), armed. Returns: result
set_track_colorB
Set a track's color. Pass either an int 0xRRGGBB (e.g. 16711680 for red) or a [r, g, b] list with 0-255 values.
Parameters:
track_index: The index of the track
color: 0xRRGGBB int, or [r, g, b]
Inputs: color (required), track_index (required). Returns: result
set_track_monitorA
Set a track's input monitoring. Use 'in'/0 to always hear the live input (e.g. a mic), 'auto'/1 for monitor-when-armed, 'off'/2 for none.
Parameters:
track_index: The index of the track
state: 'in'|'auto'|'off' or 0|1|2
Inputs: state (required), track_index (required). Returns: result
set_track_muteB
Mute or unmute a track.
Parameters:
track_index: The index of the track
mute: True to mute, False to unmute
Inputs: mute (required), track_index (required). Returns: result
set_track_nameC
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_panA
Set a track's stereo panning position.
Parameters:
track_index: The index of the track
pan: Pan value -1.0 (full left) to 1.0 (full right); 0.0 = center
Inputs: pan (required), track_index (required). Returns: result
set_track_soloB
Solo or unsolo a track.
Parameters:
track_index: The index of the track
solo: True to solo, False to unsolo
Inputs: solo (required), track_index (required). Returns: result
set_track_volumeA
Set a track's mixer fader. value is the normalized 0.0-1.0 position where ~0.85 is 0 dB and 1.0 is +6 dB (the fader max). For bigger gain than the fader allows, add a Utility device and use set_device_parameter on its Gain.
Parameters:
track_index: The index of the track
value: Normalized volume 0.0-1.0
Inputs: value (required), track_index (required). Returns: result
start_playbackA
Start playing the Ableton session.
Parameters:
Inputs: no named parameters. Returns: result
stop_clipC
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_playbackC
Stop playing the Ableton session.
Parameters:
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
undoA
Undo the last action in Ableton Live (equivalent to Cmd+Z). Returns can_undo and can_redo flags after the operation so the caller knows whether further undo/redo steps are available.
Inputs: no named parameters. Returns: result
update_notesA
Surgically modify EXISTING notes in a MIDI clip without clearing/rewriting it. Each update matches notes by pitch + start_time (within tolerance) and applies the new_* fields. Much safer than clear_clip_notes + add_notes_to_clip.
Parameters:
track_index: The track holding the clip
clip_index: The clip slot index
updates: List of dicts, each with: pitch (int, required), start_time (float, required, beats), tolerance (float, optional, default 0.05 beats), new_velocity / new_duration / new_start_time / new_pitch / new_mute (optional)
Inputs: updates (required), clip_index (required), track_index (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 52 tools
Each tool has a clear, distinct purpose. Playback controls, track operations, clip manipulation, device parameters, browser navigation, and undo/redo are all separate, with no overlapping functionality. Tools like fire_clip/stop_clip and start_playback/stop_playback operate at different levels, avoiding ambiguity.
Tool names consistently follow a verb_noun pattern (e.g., create_midi_track, set_track_mute, get_session_info). Standard names like undo and redo fit the pattern. No mixing of casing conventions; all snake_case.
52 tools is high compared to typical MCP servers and might overwhelm agents. However, the scope of controlling a full DAW like Ableton Live justifies many operations. Each tool serves a specific need, so the count is borderline but not excessive for the domain.
The tool set covers a wide range of operations: session control, track and clip management, note editing, device parameters, browser, drum pads, bounce, and undo/redo. Minor gaps exist (e.g., no automation or grouping), but core workflows are well-covered.
Maintenance
Related MCP Connectors
Remote MCP server for audio stem separation, denoise, reverb, and MIDI export.
Create, co-edit, analyze, publish, and export collaborative step-sequencer sessions through MCP.
MCP server for Producer/Riffusion AI music generation
Personal MCP server for humans who create. Proof of authorship, license control.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server that bridges Ableton Live with AI models, enabling real-time project inspection and control such as track overview, device parameters, and audio analysis.1235 PyPI1MIT
- 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-
- AlicenseAqualityDmaintenanceA loopback-bound MCP server that enables MCP clients to control Ableton Live (set tempo, create tracks/clips, add MIDI notes, start/stop playback) over a secure local-only connection.21MIT
- AlicenseAqualityBmaintenanceAn MCP server that enables AI assistants to control Ableton Live, providing 104 tools for music production including track, clip, device, and mixer control.156867 PyPI73MIT