ableton-mind
The ableton-mind MCP server exposes Ableton Live's full Live Object Model (LOM) to LLMs, enabling AI-driven music production, session management, and hardware control.
Transport & Session Control
Play/stop playback and set global tempo (20–999 BPM)
Get session info (tempo, transport state, time signature, track counts, scale/root note)
Check Ableton Link & sync status
Track Management
List, create, upsert (find or create), rename, and set volume for MIDI, Audio, Return, and Master tracks
Get detailed track info (name, type, volume, panning, sends, clips, devices)
Clip & MIDI Editing
Create empty MIDI clips, add notes (pitch, start, duration, velocity, mute)
Fire, stop, and rename clips; configure loop settings
Set clip automation envelopes (linear, ramp, hold curves)
Fire scenes to trigger all clips on a row
Device & Browser
Get/set device parameters with knowledge-base metadata (55 bundled devices)
Inspect Max for Live patchers and VST/AU plug-ins
Browse Ableton's browser categories and load instruments, effects, presets, or samples onto tracks
Automation
Add arrangement automation points for mixer or device parameters
Replace full clip envelopes for complete automation rewrites
Verification & Snapshots
Take deep session snapshots (tracks, clips, devices) before and after mutations
Diff two snapshots to verify what actually changed
Recipes
List and apply embedded music recipes by category (drums, bass, chords, racks, arrangements, mixing, live_performance) with optional overrides
Push Hardware Control
Set Push 2/3 pad colors on the 8×8 grid and button LED states (solid, blink, pulse)
Switch Push modes (note, session, drum, step)
Provides a local copilot feature using Ollama to run LLMs for Ableton Live automation and queries.
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-mind create a new MIDI track with a simple kick and snare pattern at 120 BPM"
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-mind
Definitive MCP (Model Context Protocol) server for Ableton Live. Exposes the full Live Object Model to LLMs (Claude, Cursor, etc.) with an embedded native device knowledge base, declarative music recipes, an integrated verify loop, and reactive listeners.
Status: alpha / v0.1.1 published — core smoke passed against Ableton Live 12.4.1 on macOS and package validation is green. npm, GitHub Release
.mcpb, and the MCP Registry are live. Glama has a listing, but its hosted release/deploy must be published separately from the Glama admin build flow; Smithery metadata is present and may lag indexing. API unstable. Don't use in production yet.Phase 8 status: slice 1 delivers read-only Max for Live/plug-in introspection and Link/remote status discovery. Deeper M4L control, VST3 sidecars, remote DAW integration and mobile companion work remain pending.
📚 Full documentation: pantani.github.io/ableton-mind/
Architecture (3 layers)
Claude/Cursor ──MCP/stdio──▶ ableton-mind (TS, Node 20+) ──TCP NDJSON JSON-RPC──▶ Remote Script (Python, inside Live)src/— TypeScript MCP server. Tools, resources, prompts, TCP client, recipe runner, knowledge loader.live/AbletonMind/— Python Remote Script. TCP server on port9876, dispatches JSON-RPC to LiveAPI.recipes/,src/knowledge/— embedded JSON (drum kits, basslines, racks, device schemas).
Full spec in PLAN.md. Frozen contracts in _workspace/contracts/.
Related MCP server: Ableton MCP
Highlights vs. existing MCP/OSC servers
Capability | ahujasid/ableton-mcp | AbletonOSC + MCP wrapper | ableton-mind |
MCP tools | 22 | ~30 | 36 |
LOM coverage | ~10% | ~95% | ~100% |
Knowledge base | none | none | 55 devices, scales, drum kits |
Recipes | none | none | 14 across 7 categories |
Verify loop | no | no | yes, integrated ( |
Render preview | no | no | yes (snapshot now, bounce planned) |
Reactive listeners → MCP notifications | no | partial (OSC) | yes (7 events live) |
Transactions (undo unitary) | no | no | yes |
Automation envelopes | no | partial | complete (linear / hold) |
Push 1/2/3 control | no | no | yes (pad/button/mode LEDs) |
Docker | no | no | yes |
| no | no | yes |
Doctor CLI | no | no | yes |
Requirements
Node 20+
Ableton Live 12 (priority; Live 11 supported)
macOS (primary), Windows (Phase 1 final)
Setup (source install)
npm install
npm run typecheck
npm run lint
npm run test
npm run buildInstall Remote Script (Python bridge)
Dev mode (symlink):
node scripts/install-remote-script.mjs # creates symlink
node scripts/install-remote-script.mjs --check # status only
node scripts/install-remote-script.mjs --copy # full copy (CI / snapshot)Manual:
macOS: copy
live/AbletonMind/to~/Music/Ableton/User Library/Remote Scripts/AbletonMind/Windows: copy to
~/Documents/Ableton/User Library/Remote Scripts/AbletonMind/
Then Live → Preferences → Link/Tempo/MIDI → Control Surface → AbletonMind.
Smoke test: docs/smoke-test.md.
Run the MCP server
npm run build
node dist/index.jsEnv vars:
Var | Default | |
|
| Python bridge host |
|
| Bridge TCP port |
|
| Per-request timeout |
|
| Max incoming JSON-RPC frame |
|
| Max in-flight JSON-RPC calls |
|
|
|
Local copilot
Run a local LLM against a curated subset of the same Ableton tools:
ollama pull qwen2.5:3b # optional; the UI can pull too
node dist/index.js chat # opens http://127.0.0.1:4142
node dist/index.js ask "What is in this set?"The default tier is read-only (safe). Use --write for simple changes or --creative for recipes/browser load.
Var | Default | |
|
| OpenAI-compatible endpoint |
|
| Local model id |
|
|
|
|
| Browser UI port |
See Local copilot.
Doctor CLI
npx ableton-mind-doctorChecks Node version, Remote Script install, bridge port, knowledge base integrity, recipes.
Distribution
npm:
npm install -g ableton-mind.Claude Code plugin marketplace:
claude plugin marketplace add Pantani/ableton-mind, thenclaude plugin install ableton-mind@ableton-mind.Claude Desktop one-click: download
ableton-mind-0.1.1.mcpbfrom the v0.1.1 GitHub Release.MCP Registry:
io.github.Pantani/ableton-mindis active in the official registry.Glama: listed at glama.ai/mcp/servers/Pantani/ableton-mind; hosted release is separate from the GitHub Release and still requires the Glama admin deploy + Make Release flow.
Source:
npm ci && npm run build && npm run install:remote-script.Docker:
docker build -t ableton-mind . && docker run --rm -i --network host ableton-mind.Smithery:
smithery.yamlis ready for listing/indexing.
Roadmap
See PLAN.md §12 and _workspace/PROGRESS.md.
Phase | Status |
0 — Spike | ✅ real smoke pass |
1 — ahujasid parity | ✅ 22/22 |
2 — Listeners | ✅ 7 events |
3 — Knowledge | ✅ 55 devices |
4 — Automation envelopes | ✅ |
5 — Preview/verify | ✅ snapshot+diff (bounce planned) |
6 — Push | ✅ pad/button/mode LEDs |
7 — Distribution | ✅ DXT/Docker/Smithery/CI/release ready |
8 — Long tail | 🔵 slice 1 delivered: read-only M4L/plug-in introspection + Link/remote status discovery; deeper M4L/VST3/remote DAW/mobile work pending |
License
MIT.
Available Tools
36 toolsapply_recipeA
Apply an embedded recipe by id with optional overrides. Use after list_recipes when the user asks for a genre pattern, rack, mix chain, or arrangement scaffold. NOT fully transactional in Phase 5; returns progress and failed_at/error if a step fails.
Inputs: recipe_id (required), overrides.
arrangement_add_automation_pointA
Add one automation point in the Arrangement view for a mixer or device parameter path. Use for incremental arrangement automation edits. NOT idempotent: repeated calls add more points; returns the written time/value/curve after the bridge accepts it.
Inputs: track_index (required), parameter_path (required), time (required), value (required), +1 more.
browser_get_categoriesA
Read-only list of root categories exposed by the Ableton Live Browser. Use before loading instruments, effects, presets, or samples by browser path; returns available=false with a reason when browser access is unavailable or headless.
Inputs: no named parameters.
browser_load_itemA
Load an Ableton Browser item such as an instrument, effect, preset, or sample onto the selected or armed track. Use after browser_get_categories/path discovery. Idempotent best-effort: if the selected/armed track already has the item, returns changed=false; otherwise returns changed=true with loaded item name/path.
Inputs: path (required).
clip_add_notesA
Add MIDI notes to an existing session clip using ADR-0003 note fields. Use after creating or locating the target clip. NOT idempotent: repeated calls append notes; returns added count and verification diff if the count does not match.
Inputs: track_index (required), clip_slot_index (required), notes (required).
clip_fireB
Trigger a session clip slot. Use when the user wants to launch a specific clip in Session view. Idempotent for already-playing clips, returning changed=false; playback state is async, so verification is marked unverified.
Inputs: track_index (required), clip_slot_index (required).
clip_set_envelopeA
Replace all automation points for one clip envelope. Use when the user wants a complete envelope rewrite for mixer or device parameters. NOT idempotent for partial edits; returns written point count and verification diff after hold-curve expansion.
Inputs: track_index (required), clip_slot_index (required), parameter_path (required), points (required).
clip_set_loopA
Configure a clip's loop_start, loop_end, and/or looping flag while preserving omitted fields. Use for clip loop edits after locating the clip. Idempotent within 1e-4 and verified against only the fields provided by the caller.
Inputs: track_index (required), clip_slot_index (required), loop_start, loop_end, +1 more.
clip_set_nameA
Rename a session clip by track and slot index. Use after confirming the target clip exists. Idempotent: unchanged names return changed=false; verified via read-after-write and returns before/after names.
Inputs: track_index (required), clip_slot_index (required), name (required).
clip_stopA
Stop playback for a specific session clip slot. Use to halt one clip without stopping the global transport. Idempotent for already-stopped clips; returns changed=false when no launch state changed and marks async playback verification unverified.
Inputs: track_index (required), clip_slot_index (required).
create_midi_clipA
Create an empty MIDI clip in a session clip slot. Use when the target MIDI track and clip slot are known and a new clip is needed. NOT idempotent for occupied slots; wrapped in an undo step and verified by returned clip length/name.
Inputs: track_index (required), clip_slot_index (required), length_beats (required), name.
device_get_parametersA
Read-only list of parameters for a device by track/device index. Use before parameter automation or value changes; returns value/range/automation state and knowledge-base unit/description metadata when the device matches bundled schemas.
Inputs: track_index (required), device_index (required).
device_inspect_patcherA
Read-only Max for Live patcher discovery for a device. Use when deciding whether a device exposes inspectable M4L patcher metadata. Returns available=false with a reason when the target is not inspectable or the runtime lacks patcher access.
Inputs: track_index (required), device_index (required).
device_inspect_pluginA
Read-only VST/AU plug-in discovery for a device. Use when identifying third-party plug-ins without relying on user-edited device names. Returns plug-in identity and parameters, or available=false with a reason for native devices or unsupported runtimes.
Inputs: track_index (required), device_index (required).
device_set_parameterA
Set one device parameter by parameter_index or parameter_name. Use after device_get_parameters when possible. Idempotent within 1e-4 (or exact for quantized values); name lookup adds one bridge call and returns before/after value with verification diff.
Inputs: no named parameters.
list_promptsA
Read-only list of MCP prompts bundled with the server for clients that do not expose prompt discovery natively. Use when the user asks what workflows are available; returns prompt names, descriptions, arguments, and total count.
Inputs: no named parameters.
list_recipesA
Read-only list of embedded music recipes, optionally filtered by category. Use before apply_recipe to choose a valid recipe id; returns recipe metadata, tags, version, category, and total count without touching Live.
Inputs: category.
list_resourcesA
Read-only list of MCP resources exposed by the server for clients that do not expose resource discovery natively. Use when the user asks what context URIs are available; returns resource URI, name, description, MIME type, and total count.
Inputs: no named parameters.
playA
Start or continue Ableton Live playback. Use when the user wants transport running; optional from_beginning restarts at song start. Idempotent: already-playing sessions return changed=false; transport state is async, so the result is marked unverified with current song time.
Inputs: from_beginning.
push_set_button_ledA
Set the LED color and mode for a Push transport or utility button. Use for hardware feedback after Push detection. Requires Push 2/3; defaults mode to solid and returns sent=true with the accepted button/color/mode.
Inputs: button (required), color (required), mode.
push_set_modeA
Switch Ableton Push 2/3 to note, session, drum, or step mode. Use when preparing a performance or editing workflow on Push hardware. Requires Push 2/3; returns sent=true with the mode accepted by the bridge.
Inputs: mode (required).
push_set_pad_colorA
Set the color of one Ableton Push 2/3 pad on the 0..63 grid. Use for visual feedback or performance layouts after hardware detection. Requires Push 2/3; returns sent=true with the pad and color accepted by the bridge.
Inputs: pad (required), color (required).
render_previewA
Preview the current Live set state. Use when an agent needs a lightweight result check; mode 'snapshot' returns deep state without audio, while mode 'bounce' is reserved for future audio export and returns requested bar count.
Inputs: mode, bars.
scene_fireA
Fire a Session view scene by index, triggering all clips on that row. Use for arrangement-style playback from scenes. NOT idempotent: re-triggering restarts clips; returns scene name and marks async transport verification unverified.
Inputs: index (required).
session_diffA
Compare a previous session_snapshot with the current Live state. Use after a mutation batch to verify what actually changed; returns added/removed/changed paths with before/after values and a change count.
Inputs: previous (required).
session_get_infoA
Read-only top-level snapshot of the Live set. Use first when orienting an agent before edits; returns tempo, transport, time signature, track counts, root note, and scale without mutating the session.
Inputs: no named parameters.
session_link_statusA
Read-only Ableton Link and external sync status discovery. Use before sync-sensitive playback or collaboration workflows. Returns available=false with nullable status fields and a reason when the Live runtime does not expose Link state.
Inputs: no named parameters.
session_snapshotA
Read-only deep snapshot of the Live session. Use before and after mutating tools to verify changes with session_diff; returns tracks and optional clips/devices without changing playback or session state.
Inputs: include_clips, include_devices.
set_tempoA
Set the global Ableton Live tempo in BPM (20-999). Use for song-wide tempo changes before creating clips or scenes. Idempotent within 0.001 BPM and verified via read-after-write; returns before/after tempo and diff if verification disagrees.
Inputs: bpm (required).
stopA
Stop Ableton Live playback. Use before editing or when the user asks to halt audio. Idempotent: already-stopped sessions return changed=false; transport state is async, so the result returns current song time and is marked unverified.
Inputs: no named parameters.
track_createA
Create a new MIDI or audio track at an optional index. Use when the user explicitly wants another track. NOT idempotent: every call creates a track; returns the created track and verifies that its type matches the request.
Inputs: type (required), index, name.
track_get_infoA
Read-only details for one regular track by index. Use before track-scoped edits to inspect name, type, volume, panning, sends, clip slots, clips, and device counts; returns verified state without mutating the session.
Inputs: index (required).
track_listA
Read-only list of regular, return, and master tracks in the current Live set. Use before addressing tracks by index or deciding where to create content; returns counts and optional return/master sections without mutating the session.
Inputs: include_master, include_returns.
track_set_nameA
Rename a regular track by index. Use after track_list or track_get_info has confirmed the target track. Idempotent: unchanged names return changed=false; verified via read-after-write and returns before/after names.
Inputs: index (required), name (required).
track_set_volumeB
Set a regular track's mixer volume as a normalized 0..1 value. Use for mix balance changes after confirming the track index. Idempotent within 1e-4; returns linear and dB before/after values with verification diff on mismatch.
Inputs: index (required), volume (required).
track_upsertA
Find or create a track by name and type. Use when a workflow needs a named target track but should avoid duplicates. Idempotent: returns changed=false when the track already exists; verified by returned name/type.
Inputs: name (required), type (required), index.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Most tools have distinct purposes, with clear domain boundaries (clip_, track_, device_, session_). However, session_snapshot and render_preview serve similar roles (deep vs lightweight snapshot), and list_recipes/list_prompts/list_resources are generic utility tools that could cause minor confusion.
The naming follows snake_case with a consistent resource_verb pattern within groups (clip_, track_, device_, session_, browser_). A few tools like list_recipes and apply_recipe deviate (verb first), but overall the pattern is predictable and readable.
36 tools is on the higher side but appropriate for Ableton Live's complexity. The toolset covers many aspects (clips, tracks, devices, browser, transport, Push, recipes, utilities). A few tools could be consolidated (e.g., list_prompts and list_resources), but the count is defensible.
Significant gaps exist: no tools for deleting clips/tracks/devices, no pan/send control, no arrangement clip editing beyond automation points, and no ability to manage return/master tracks beyond listing. These omissions will cause agent failures in common workflows.
Maintenance
Related MCP Connectors
MCP server for Producer/Riffusion AI music generation
Remote MCP server for audio stem separation, denoise, reverb, and MIDI export.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to control Ableton Live through natural language by querying tracks, analyzing sessions, and exporting stems via AbletonOSC integration.91MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language control over Ableton Live for generating musical patterns, melodies, and full song arrangements. It also provides tools for sample searching and mixing assistance through an OSC-based connection with Claude Desktop.1MIT
- AlicenseBqualityDmaintenanceEnables Claude to observe and compose in Ableton Live 12 via AbletonOSC, allowing pair-programming-style collaboration for musicians.13MIT
- AlicenseAqualityDmaintenanceControl your Ableton with this MCP and get started to make music3825 PyPIMIT