Live control tools
These tools expose Ableton Live's set, Session View, browser, transport, and Arrangement View through the MCP server. They are the general-purpose control surface inherited from the upstream Ableton MCP projects; the organizer and harmony tools are documented separately.
Before you call a tool
- Ableton Live must be running with
BetterAbletonMCP_Remote_Scriptselected as a Control Surface. The MCP server connects to that script over TCP. track_indexandclip_indexare zero-based. Aclip_indexidentifies a Session View clip slot unless a tool explicitly says Arrangement View.- Beat positions and clip lengths use Live beats, not seconds. In 4/4,
0.0is the start,4.0is bar 2, and8.0is bar 3. - Calls return text to the MCP client. Inspection tools embed JSON or a readable browser listing; mutation tools return a short confirmation.
- Most tools accept an optional
user_promptstring. It is server-side call context and is not sent to Live or used to change the operation. Clients can normally omit it. - Invalid indices, unsupported Live APIs, missing clips, and Remote Script
connection problems are returned as
Error ...text rather than raised to the MCP client.
When the target set is unfamiliar, call get_session_info and then
get_track_info before making changes.
Session and track inspection
get_session_info
Read the current set's global state.
Parameters: no operation-specific parameters.
Returns: formatted JSON containing tempo, time-signature numerator and
denominator, normal-track and return-track counts, Master volume and panning,
and transport state: is_playing, current_song_time, song_length, loop,
loop_start, and loop_length.
Transport properties unavailable in a particular Live version fall back to a
stable value (false or 0.0) instead of removing fields from the response.
The track count does not include return or Master tracks.
get_track_info
Inspect one normal Live track, including its Session slots and devices.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based index in song.tracks. |
Returns: formatted JSON with the track's index, name, audio/MIDI input
capabilities, mute/solo/arm state, volume, panning, every Session clip slot,
and every device. An occupied slot includes clip name, length, playing state,
and recording state. A device includes index, name, Live class name, and an
inferred type such as drum_machine, rack, instrument, audio_effect,
midi_effect, or unknown.
Only normal tracks can be addressed; return and Master tracks are not in this index space. The device type is heuristic, so use its class name when exact identification matters.
Track creation and naming
create_midi_track
Create a normal MIDI track.
| Parameter | Type | Default | Description |
|---|---|---|---|
index |
integer | -1 |
Insert position; -1 appends after the last normal track. |
The response reports Live's generated track name. Existing tracks at an explicit insertion index shift to the right.
create_audio_track
Create a normal audio track.
| Parameter | Type | Default | Description |
|---|---|---|---|
index |
integer | -1 |
Insert position; -1 appends after the last normal track. |
The response reports Live's generated track name. This tool does not accept
user_prompt.
create_return_track
Append and name a return track.
| Parameter | Type | Default | Description |
|---|---|---|---|
name |
string | "Return" |
Name assigned immediately after creation. |
Live's API always appends return tracks, so there is no insertion index. The
returned index is in the separate song.return_tracks collection. This tool
does not accept user_prompt.
set_track_name
Rename a normal track.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
name |
string | New track name. |
Return and Master tracks cannot be targeted by this tool.
Session clips and MIDI notes
create_clip
Create an empty MIDI clip in a Session View slot.
| Parameter | Type | Default | Description |
|---|---|---|---|
track_index |
integer | required | Zero-based normal-track index. |
clip_index |
integer | required | Zero-based Session slot index. |
length |
number | 4.0 |
Clip length in beats. |
The target must support MIDI clips and the slot must be empty. Live rejects an
invalid length, an audio track, or an occupied slot. This tool creates the clip
only; use add_notes_to_clip to populate it.
create_audio_clip
Import an audio file into an empty Session View slot on an audio track.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal audio-track index. |
clip_index |
integer | Zero-based Session slot index. |
path |
string | Absolute filesystem path to a Live-supported audio file. |
Requires Ableton Live 12.0.5 or newer because it uses
ClipSlot.create_audio_clip. The path is interpreted by the machine running
Live, must be absolute, and must be readable there. The target must be an audio
track and the slot must be empty. Import can take longer than other operations;
the Remote Script allows up to 60 seconds for this command. The confirmation
includes the resulting clip name and length.
add_notes_to_clip
Add MIDI notes to an existing Session clip.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
clip_index |
integer | Zero-based Session slot index. |
notes |
array | Note objects described below. |
Each note object accepts:
| Field | Type | Default | Description |
|---|---|---|---|
pitch |
integer | 60 |
MIDI note number, normally 0–127. |
start_time |
number | 0.0 |
Start position in beats relative to the clip. |
duration |
number | 0.25 |
Duration in beats. |
velocity |
number | 100 |
MIDI velocity, normally 1–127. |
mute |
boolean | false |
Whether the note is muted. |
{
"track_index": 0,
"clip_index": 0,
"notes": [
{"pitch": 60, "start_time": 0.0, "duration": 1.0, "velocity": 96, "mute": false},
{"pitch": 64, "start_time": 1.0, "duration": 1.0, "velocity": 92, "mute": false}
]
}
The slot must already contain a MIDI clip. This calls Live's set_notes with
the supplied notes; it adds them to the clip and does not provide the
all-notes replacement workflow used by the separate MIDI cleanup feature.
Live performs final range and validity checks.
set_clip_name
Rename an existing Session clip.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
clip_index |
integer | Zero-based Session slot index. |
name |
string | New clip name. |
The slot must contain a clip. Arrangement clips cannot be renamed with this tool.
Tempo and transport
set_tempo
Set the set tempo in beats per minute.
| Parameter | Type | Description |
|---|---|---|
tempo |
number | Desired BPM. |
Live enforces its supported tempo range. This changes the set immediately.
fire_clip
Launch a Session View clip using Live's normal clip-launch behavior.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
clip_index |
integer | Zero-based Session slot index. |
The slot must contain a clip. Global quantization and the clip's launch settings still apply, so playback may begin on a later beat.
stop_clip
Stop playback for a Session slot.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
clip_index |
integer | Zero-based Session slot index. |
This calls ClipSlot.stop() and does not require the slot to contain a clip.
Live's launch quantization may affect when the stop takes effect.
start_playback
Start Live's global transport from the current song time.
This uses Song.start_playing; it does not reset the playhead or select a
particular Session scene.
stop_playback
Stop Live's global transport.
This uses Song.stop_playing; it does not move the playhead back to zero.
Live browser and device loading
Browser content varies with the installed Live edition, Packs, User Library, plug-ins, and Live version. Discover paths and URIs in the same Live instance where the item will be loaded.
get_browser_tree
List available browser root categories.
| Parameter | Type | Default | Description |
|---|---|---|---|
category_type |
string | "all" |
all, instruments, sounds, drums, audio_effects, midi_effects, or another browser attribute exposed by Live. |
The MCP response is a readable bullet list, not raw JSON. Despite the tool's
historical name, the current Remote Script returns a shallow root-category
summary; use get_browser_items_at_path to descend through folders. A category
missing from this Live installation produces a message listing the available
browser attributes.
get_browser_items_at_path
Inspect the immediate children of a browser category or folder.
| Parameter | Type | Description |
|---|---|---|
path |
string | Slash-separated browser path, beginning with a root category. |
Matching is case-insensitive by display name. Empty path components are
ignored. The formatted JSON response describes the selected item (path,
name, uri, is_folder, is_device, and is_loadable) and an items
array with those fields for each immediate child.
Use root names such as instruments, sounds, drums, audio_effects, or
midi_effects; additional Live browser attributes may also work. Paths depend
on localized display names and installed content. The tool reports the first
missing component, a non-folder component, or available roots when navigation
fails.
load_instrument_or_effect
Load a browser item onto a normal track by URI.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
uri |
string | Exact URI returned by Live's browser. |
The Remote Script selects the target track, searches the browser, and asks Live to load the matching item. The search includes the standard roots and, when exposed, plug-ins, Max for Live, User Library, Packs, and Samples. It is limited to 10 levels and successful URI lookups are cached for the Remote Script's lifetime.
The name is historical: any loadable browser item accepted by Live may be
loaded, and Live determines the insertion position from its current browser
loading rules. Use an exact URI from get_browser_items_at_path; a display
path is not a URI. Large browser libraries can make a first lookup slow, and
state-changing commands normally time out after 10 seconds.
load_drum_kit
Load a drum rack, then load a kit found at a browser path onto the same track.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal MIDI-track index. |
rack_uri |
string | Exact URI of the rack browser item. |
kit_path |
string | Slash-separated browser folder containing kits. |
The operation first loads rack_uri, gets the immediate children of
kit_path, then loads the first child whose is_loadable flag is true. It
does not select a kit by name and is not atomic: if path lookup or kit loading
fails, the rack can remain loaded. Inspect the folder first when deterministic
kit selection matters. Both loads use Live's browser and current loading
behavior.
Arrangement View
switch_to_arrangement_view
Show Arrangement View in Live's main window.
This changes the visible UI only; it does not start playback, move the playhead, or copy clips.
set_arrangement_time
Move the song playhead to a beat position.
| Parameter | Type | Description |
|---|---|---|
time |
number | Absolute beat position from the start of the arrangement. |
The response confirms Live's resulting current_song_time. The tool does not
switch views or start playback. Live performs final validation of the value.
get_arrangement_clips
List every Arrangement clip on one normal track.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based normal-track index. |
Returns: formatted JSON containing the track index and name, clip_count,
and clips. Each clip contains name, start_time, end_time, length,
color, is_midi_clip, is_audio_clip, and is_playing.
This relies on track.arrangement_clips, available in Live 11 and 12. Session
clips are not included.
duplicate_to_arrangement
Copy an existing Session View clip to the Arrangement timeline on the same track.
| Parameter | Type | Description |
|---|---|---|
track_index |
integer | Zero-based index of the normal track that owns the source clip. |
clip_index |
integer | Zero-based source Session slot index. |
destination_time |
number | Absolute destination beat in Arrangement View. |
The source slot must contain a clip. Live duplicates the clip to the same
track using Track.duplicate_clip_to_arrangement; it does not remove or alter
the Session source. Existing Arrangement material is not cleared first, so the
copy may overlap it. The API is available in Live 11 and 12. Call
switch_to_arrangement_view afterward if you want Live to display the result.
Typical workflows
Create and launch a MIDI idea:
create_midi_trackwith{"index": -1}.set_track_namewith the returned track index.create_clipin an empty Session slot.add_notes_to_clipwith the desired note objects.set_clip_name, thenfire_clip.
Build an Arrangement from a Session clip:
- Inspect the source with
get_track_info. - Call
duplicate_to_arrangementonce for each desired destination beat. - Confirm placement with
get_arrangement_clips. - Call
switch_to_arrangement_viewto show it in Live.
Load a browser device safely:
- Call
get_browser_treeto learn the roots available in this installation. - Walk one folder at a time with
get_browser_items_at_path. - Copy the desired loadable item's exact
uriintoload_instrument_or_effect.