Control Ableton Live with AI through the Model Context Protocol
Project description
Ableton Live MCP
MCP Server for Ableton Live, to let AI agents control or inspect Ableton.
Quick Start
- Install uv if you don't have it
- Install Remote Script: Copy the
ableton/folder into Ableton's MIDI Remote Scripts directory asAbletonLiveMCP/(see detailed instructions below) - Enable in Ableton: Settings > Link, Tempo & MIDI > Control Surface > AbletonLiveMCP
- Connect Claude: pick one method from Setup below
- Go: Ask Claude 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 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
Prerequisites
- Ableton Live 11+ (uses the extended MIDI note API)
- uv — handles Python and dependencies automatically
Install uv
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
You do not need to install Python separately — uv manages that for you.
Setup
1. Install the Remote Script
The Remote Script runs inside Ableton. It needs to be in Ableton's MIDI Remote Scripts directory.
Option A — Download just the Remote Script (if you're using uvx and don't need the full repo):
Download ableton/__init__.py from this repo and place it in a folder called AbletonLiveMCP inside:
- Windows:
C:\ProgramData\Ableton\Live XX\Resources\MIDI Remote Scripts\ - macOS: Right-click Ableton Live > Show Package Contents >
Contents/App-Resources/MIDI Remote Scripts/
Option B — Clone the repo and symlink (recommended for development):
git clone https://github.com/opendining/ableton-mcp-server.git
# Windows (PowerShell, run once)
New-Item -ItemType Junction `
-Path "C:\ProgramData\Ableton\Live 12 Intro\Resources\MIDI Remote Scripts\AbletonLiveMCP" `
-Target "C:\path\to\abletonmcp\ableton"
Then enable in Ableton: Settings > Link, Tempo & MIDI > Control Surface > AbletonLiveMCP (Input/Output: None).
2. Connect Claude
Pick one method. Using multiple at once will start duplicate servers.
Claude Desktop (no clone needed)
Edit your config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"AbletonLiveMCP": {
"command": "uvx",
"args": ["ableton-live-mcp"]
}
}
}
Claude Code (no clone needed)
claude mcp add --scope user AbletonLiveMCP -- uvx ableton-live-mcp
Claude Code plugin (clone required)
Auto-starts the MCP server and loads the agent guide skill:
claude --plugin-dir /path/to/abletonmcp
From a cloned repo
If you cloned the repo and want to run from source instead of PyPI:
# Claude Code
claude mcp add --scope user AbletonLiveMCP -- uv run --directory /path/to/abletonmcp ableton-live-mcp
// Claude Desktop
{
"mcpServers": {
"AbletonLiveMCP": {
"command": "uv",
"args": ["run", "--directory", "/path/to/abletonmcp", "ableton-live-mcp"]
}
}
}
3. Verify
- Make sure Ableton is running with AbletonLiveMCP control surface active
- Start/restart your Claude client
- The MCP server connects to Ableton automatically on first use
Troubleshooting: Check Ableton's Log.txt for Remote Script errors:
- Windows:
%APPDATA%\Ableton\Live x.x.x\Preferences\Log.txt - macOS:
~/Library/Preferences/Ableton/Live x.x.x/Log.txt
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 |
app.browser — instruments, effects, drums, sounds |
Live |
The Live module — Live.Clip, Live.Device, etc. |
MidiNoteSpecification |
Live.Clip.MidiNoteSpecification — no import needed |
find_item(parent, query) |
Search browser tree for best match. Returns BrowserItem or None |
find_items(parent, query) |
Search browser tree, return ranked list of matches |
find_track(name) |
Look up a track by name. Returns Track or None |
load_to(track, parent, query) |
Find a browser item and load it onto a track |
log |
Write to Ableton's Log.txt |
json |
The json module |
time |
The time module |
Architecture
See DEVELOPMENT.md for the full technical guide.
Acknowledgments
This project was inspired by ahujasid/ableton-mcp, which pioneered the idea of connecting Ableton Live to AI agents via MCP. That project uses a fixed set of tool-per-action commands (create track, add notes, set tempo, etc.).
This fork takes a different approach inspired by Cloudflare's Code Mode: instead of predefined commands, the agent writes and executes Python directly against Ableton's runtime. A streamlined execution scope with built-in helpers (find_item, find_track, load_to, etc.) and a searchable API reference give the model everything it needs to use the full Live API without being limited to a curated command set.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ableton_live_mcp-0.1.1.tar.gz.
File metadata
- Download URL: ableton_live_mcp-0.1.1.tar.gz
- Upload date:
- Size: 21.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fc6a6e640803b2a11b79272ece2a5fc0b293295cdc57f4c20b2fc5386c29afe
|
|
| MD5 |
f0551f32a988b760ce1f09584cd16eb2
|
|
| BLAKE2b-256 |
629ac55136567686b10f9965267cb4ff27b45f5c1579d498324e633359f01316
|
Provenance
The following attestation bundles were made for ableton_live_mcp-0.1.1.tar.gz:
Publisher:
publish.yml on opendining/ableton-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ableton_live_mcp-0.1.1.tar.gz -
Subject digest:
6fc6a6e640803b2a11b79272ece2a5fc0b293295cdc57f4c20b2fc5386c29afe - Sigstore transparency entry: 1012826595
- Sigstore integration time:
-
Permalink:
opendining/ableton-mcp-server@90201be06c0e68a9f3838c145c0d6bd85eb3e1e1 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/opendining
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@90201be06c0e68a9f3838c145c0d6bd85eb3e1e1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ableton_live_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ableton_live_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c4b6ab0f73acb0d469929aaf5dffa92eaac25b19a78cdca595b1003554863e3
|
|
| MD5 |
1baf40743ed6eff1ab468b78c323cc55
|
|
| BLAKE2b-256 |
9bf59448eac1a3735503d7c37be3bcd5a9dda26740ff17a8e0e02a288dea0aa9
|
Provenance
The following attestation bundles were made for ableton_live_mcp-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on opendining/ableton-mcp-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ableton_live_mcp-0.1.1-py3-none-any.whl -
Subject digest:
3c4b6ab0f73acb0d469929aaf5dffa92eaac25b19a78cdca595b1003554863e3 - Sigstore transparency entry: 1012826725
- Sigstore integration time:
-
Permalink:
opendining/ableton-mcp-server@90201be06c0e68a9f3838c145c0d6bd85eb3e1e1 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/opendining
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@90201be06c0e68a9f3838c145c0d6bd85eb3e1e1 -
Trigger Event:
push
-
Statement type: