Ableton Live MCP
MCP Server for Ableton Live, to let AI agents control or inspect Ableton.
Quick Start
1. Install the Remote Script
Download `ableton/__init__.py` and place it in a new folder called AbletonLiveMCP inside Ableton's MIDI Remote Scripts directory:
- Windows:
C:\ProgramData\Ableton\Live XX\Resources\MIDI Remote Scripts\AbletonLiveMCP\ - macOS: Right-click Ableton Live → Show Package Contents →
Contents/App-Resources/MIDI Remote Scripts/AbletonLiveMCP/
Then enable it in Ableton: Settings → Link, Tempo & MIDI → Control Surface → AbletonLiveMCP (Input/Output: None).
2. Connect Claude
First, install uv (which includes uvx) if you don't already have it:
| Platform | Command |
|---|---|
| macOS | brew install uv |
| Windows | winget install astral-sh.uv |
Alternative install methods
# macOS/Linux — standalone installer
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows — PowerShell standalone installer
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Then connect Claude:
Claude Code:
claude mcp add --scope user AbletonLiveMCP -- uvx ableton-live-mcp
Claude Desktop — edit your config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"AbletonLiveMCP": {
"command": "uvx",
"args": ["ableton-live-mcp"]
}
}
}
3. Go
Make sure Ableton is running with the AbletonLiveMCP control surface active, then start (or restart) Claude and ask it to do something in Ableton.
How It Works
Claude → MCP Server → TCP :16619 → Remote Script (inside Ableton)
↓
exec(python_code)
↓
Live Object Model
(song, tracks, clips, devices, browser...)
The MCP server and Remote Script communicate over TCP port 16619. The Remote Script runs inside Ableton's embedded Python interpreter — Claude sends Python code as a string, the Remote Script exec()s it with the full Live API in scope, and returns the serialized result. There are no predefined commands — anything the Live API supports is available immediately.
What Claude Can Do
# Read session state
song.tempo # → 120.0
[(i, t.name) for i, t in enumerate(song.tracks)] # → [(0, "Bass"), (1, "Drums"), ...]
# Modify session
song.tempo = 140
song.tracks[0].name = "Lead Synth"
# Create tracks and clips
song.create_midi_track(-1)
song.tracks[-1].clip_slots[0].create_clip(4.0)
# Write MIDI notes (MidiNoteSpecification is in scope, no import needed)
clip = song.tracks[0].clip_slots[0].clip
clip.add_new_notes(tuple([
MidiNoteSpecification(pitch=60, start_time=0.0, duration=0.5, velocity=100),
MidiNoteSpecification(pitch=64, start_time=1.0, duration=0.5, velocity=90),
]))
# Find and load instruments (find_item, find_items, find_track, load_to are in scope)
load_to(song.tracks[0], browser.instruments, "Grand Piano")
load_to(find_track("Drums"), browser.drums, "808")
# Control transport
song.start_playing()
song.stop_playing()
song.tracks[0].clip_slots[0].fire()
# Mix
find_track("Bass").mixer_device.volume.value = 0.7
song.tracks[0].mixer_device.panning.value = -0.3
MCP Tools
The server exposes three tools:
| Tool | Purpose |
|---|---|
execute(code) |
Send Python code to run inside Ableton. The main tool. |
api(class_name?) |
Browse the Live API reference by class (Song, Track, Clip, Device, etc.). |
search_api(query) |
Search the API reference by keyword across all classes. |
api and search_api read from a structured API reference. Claude can execute anything the Live API supports, not just what's in the reference.
Execution Scope
Every execute call gets a fresh namespace with:
| Variable | What It Is |
|---|---|
song |
The Live Set — tempo, tracks, scenes, transport |
app |
The Live Application — browser, version info |
tracks |
Shortcut for song.tracks (stale after create/delete — use song.tracks or find_track) |
returns |
song.return_tracks |
master |
song.master_track |
browser |
`a |
Tools 3
executeSend Python code to run inside Ableton.apiBrowse the Live API reference by class.search_apiSearch the API reference by keyword across all classes.