MCP Server for Ableton Live, to let AI agents control or inspect Ableton.
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.Configuration
{"mcpServers": {"AbletonLiveMCP": {"command": "uvx", "args": ["ableton-live-mcp"]}}}