ableton-mcp
This MCP server lets an MCP client inspect and control an Ableton Live Set and write MIDI files offline.
Check Live status, version, edition limits, and get a full Set overview including tracks, devices, drum pads, clips, mix, scenes, and returns.
Create/delete MIDI tracks and clips, copy clips, create/copy scenes, and delete tracks or clips.
Read and replace MIDI clip notes, and set the Set scale.
Generate drum patterns (styles plus Euclidean layers), basslines, and chord progressions into Live clips or
.midfiles.Browse Live's library, load browser items/instruments/presets, and read device parameters including rack chains.
Set device parameters and track mix (volume, pan, mute, solo, sends), rename/color tracks, clips, and scenes, and set tempo.
Launch clips and scenes, stop playback, and undo the last change.
Write standalone
.midfiles without Live.
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-mcpmake an 8-bar house drum pattern on track 1"
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-mcp
MCP server that lets an MCP client (Claude Code) drive Ableton Live 12.1+ (Lite included) through a stdlib-only Remote Script. It also builds and reads presets for the free Vital synth, and has an offline .mid writer. Both work with Live closed.
Tested on Live 12.1.10 Lite (embedded Python 3.11.6) and Vital 1.5.5, macOS. Session View only.
How it works
remote_script/AbletonMCP/: Live loads this as a Control Surface. It listens on127.0.0.1on a random port. It writes{port, token}to~/.ableton-mcp/connection.json(mode 0600) and removes the file when Live quits. On each Live timer tick (~100 ms) it handles up to 64 pending JSON-lines requests on Live's main thread. Each change is one undo step. A request that arrives after its deadline is refused, so a timed-out write never lands late.src/ableton_mcp/: the MCP server (stdio). It readsconnection.jsonon every call and never retries a request.src/ableton_mcp/vital.py: Vital has no remote control, so the Vital tools write.vitalpreset files (plain JSON) to~/Music/Vital/User/Presets/, where Vital's browser finds them. If the Vital app is closed, the tool starts it with the new preset. Inside Live, load Vital on a track and pick the preset in its browser. Format notes:docs/vital-mcp-research.md.
Related MCP server: ableton-live-mcp
Install
Requires uv and Live 12.1 or newer.
uv sync
uv run ableton-mcp install-script # copies the script to ~/Music/Ableton/User Library/Remote Scripts/AbletonMCP
# other User Library location: uv run ableton-mcp install-script --user-library "/path/to/User Library"Restart Live. Open Settings → Link, Tempo & MIDI, and pick AbletonMCP in a Control Surface slot (leave Input/Output as None). Log.txt (~/Library/Preferences/Ableton/Live 12.x.y/Log.txt) should then show AbletonMCP listening on 127.0.0.1:<port> (Python 3.11.x).
Re-run install-script and restart Live after every change to remote_script/.
Register with Claude Code:
claude mcp add ableton -- uv --directory /path/to/ableton-mcp run ableton-mcpCheck the whole setup:
uv run ableton-mcp doctor # add --user-library "/path/to/User Library" if you installed elsewhereIt checks the Live app version, Live's Log.txt, the installed script against the repo, connection.json, a read-only hello to Live, and the Claude Code registration (claude mcp get ableton). Each line is PASS, WARN, FAIL or SKIP, and each FAIL or WARN prints its fix. Exit code 1 means at least one FAIL.
Check the bridge without an MCP client:
uv run ableton-mcp call hello
uv run ableton-mcp call browse '{"root":"drums","path":[]}'Tools
uv run ableton-mcp runs the stdio server with 29 tools, in this order:
Tool | What it does | Read-only |
| Live version, edition, features, edition | yes |
| Tempo, tracks, devices, Drum Rack pads ( | yes |
| Add a MIDI track (refused in Lite once 8 audio+MIDI tracks exist) | no |
| Empty MIDI clip in a slot (length in beats) | no |
| Delete a track with its clips and devices; refuses group tracks (destructive, one undo step) | no |
| Delete the clip in a slot (destructive, one undo step) | no |
| Add a scene at an index, or | no |
| Copy a clip to an empty slot; an occupied target is refused | no |
| Replace all notes in a clip (beats; pitches from | no |
| Clip length and notes, in the shape | yes |
| Set the Set's key (root + scale) and turn on Scale Mode; the melodic generators default to it | no |
| Drum beat in a style (rock, house, hip_hop, trap, reggaeton, breakbeat), plus optional Euclidean layers, on a Drum Rack track or to a | no |
| Bassline from scale degrees, one per bar (patterns: quarters, eighths, octaves, offbeat, arpeggio), into a slot or a | no |
| Held root-position chords from scale degrees (optional sevenths), into a slot or a | no |
| List one level of Live's browser | yes |
| Load a browser item onto a track; returns | no |
| Load an instrument by kind (drift, simpler, impulse, drum_rack, ...), optionally a preset by name; refuses non-Lite kinds on Lite | no |
| A device's parameters (name, raw value, min/max, Live's | yes |
| Set several parameters of one device by name, in one undo step; all-or-nothing | no |
| Set a track's volume (dB), pan (-50..50), mute, solo and sends (dB, by return letter); one undo step | no |
| Rename and/or colour a track, a clip (track + slot) or a scene | no |
| Set BPM (20-999) | no |
| Fire a clip | no |
| Launch every clip in a scene (not an undo step) | no |
| Stop playback | no |
| Undo the last change | no |
| Write a | no |
| Build a Vital synth preset (controls, modulation routes, saw/square/triangle/sine waves, a silent or white-noise sample) in | no |
| Controls, routes, wavetable names and sample name of a | yes |
If Live or the Remote Script is not reachable, or the script reports an error, the tool returns an isError result with the reason.
Tools that delete tracks or clips, replace a clip's notes, or write a generated clip (create_drum_pattern, create_bassline, create_chord_progression replace any clip in the target slot) carry destructive_hint: true, so the client can ask before it runs them. Every other write tool carries destructive_hint: false.
Lessons and resources
The server also sends instructions to the agent once per session (src/ableton_mcp/lessons.py). They tell it to check Live before changing anything, explain each change in plain words, reuse tracks under Lite's limits, offer undo_last, and remind you once to press Cmd+S at the end of a task that changed the Set.
Guided lessons are MCP prompts. In Claude Code, type / and pick one. They take no arguments: the lesson asks you instead.
Command | What you build |
| A one-bar drum loop: kick, snare, hi-hats, tempo |
| Hear a scale, compare major and minor, pick a key |
| A four-chord progression in your key |
| A bassline that follows the chords |
| A short melody over the chords |
| Song sections as scenes, played in order |
| A plain-words tour of your Set; changes nothing |
The lessons follow the chapter order of Ableton's Learning Music and link each chapter for hands-on practice. The site states no licence, so the lesson texts are our own words and only link to it.
Two read-only resources return the same JSON as their tools. Attach one to a message with @:
@ableton:live://capabilities: same aslive_status.@ableton:live://set/overview: same asget_set_overview.
The ableton: prefix is the name the server was registered under (claude mcp add ableton ... in Install). Under another name, the commands and mentions use that name instead.
Limits
Live Lite allows 8 audio+MIDI tracks.
create_midi_trackchecks this before it calls Live; free a track withdelete_trackor reuse one.Live Lite allows 16 scenes.
create_scenechecks this before it calls Live; name and reuse empty scenes withset_label.Live Lite allows 2 return tracks (A and B). Return and master track mixing is not supported;
set_track_mixcovers audio, MIDI and group tracks.Volume and send levels are in dB. In
get_set_overview,nullmeans -inf (silent).set_track_mixtakes numbers only; to silence a track, usemute.Solo is not exclusive:
set_track_mix(solo=true)does not unsolo other tracks. Unsolo them yourself.Colours are 10 names (red, orange, yellow, lime, green, cyan, blue, purple, pink, grey). Live snaps each to the nearest colour in its chooser.
live_statuscompares the Remote Script's protocol version with the server's. After an upgrade, runinstall-scriptagain and restart Live.read_notesdoes not return mute or probability, so aread_notes+write_notesround trip resets them. Notes that start at or after the clip length never play;write_notesreports them asnotes_outside_clip.drum_padscomes from the first Drum Rack on the track: top level first, then one level inside other racks (many Lite kits wrap their Drum Rack in an Instrument Rack). Deeper nesting is not searched.The LOM cannot save the Set. Press Cmd+S yourself.
Devices load only through the browser (
load_from_library,load_instrument), so a load replaces the current instrument and is one undo step.Track.insert_device(Live 12.3) is not used;live_statusreports it underfeatures.load_instrumentkinds: drift, simpler, impulse, drum_rack, drum_sampler and instrument_rack are in every edition. operator, wavetable, analog and meld (use drift) and sampler (use simpler) are refused on Lite before Live is called. On Standard/Suite they load by browser name; that path is untested.load_instrumentpresets: it searches the kind's browser folder and each folder one level below it (drum_rack: thedrumsroot), onebrowsecall per folder (14 for Drift on Lite). The first name match in browser order wins; the result returns the loadedpath. Other presets:browse_library+load_from_library.Device parameters are raw values between
minandmax, not units. Readdisplay(Live's own text) after a set and adjust.display_value(Live 12.2+) is not used. A parameter withenabled: falseis controlled by a macro or locked;set_device_parametersrefuses it.Some Core Library rack presets (e.g. "Basic Analog Bass", "808 Drifter") hide their chains: Live shows only the macros and the LOM reports
chains: []. Use the macros. Racks with visible chains (e.g. "Ahlimba Kit") can be read inside withdevice_path[0, chain, device].A
.midfromwrite_midi_fileholds notes only. Drop it on a track with an instrument, or it plays silent. It never overwrites an existing file; reuse of a name returns an error.Vital presets are files: Vital has no remote control, so the agent cannot tweak a sound live or hear it.
vital_create_presetopens the Vital standalone with the preset only when Vital is closed (a second launch would start a second instance). If Vital is open, or runs inside Live, pick the preset in Vital's preset browser under User. Vital's--rendercrashes on 1.5.5, so there is no offline preview. Presets never overwrite an existing file. Waves are saw, square, triangle and sine only. The sample source plays silence or 1 s of white noise (a loop you may hear as a repeat on long notes); no audio files. 94 common controls are accepted, including the comb and formant filter controls, and unknown names are refused.load_from_librarywith an instrument replaces the track's current instrument.undo_lastrestores it.Generators are 4/4 only and refuse a Set in another signature. Their
.midfiles are always 4/4 at 120 BPM.Scales: Major, Minor, Dorian, Phrygian, Lydian, Mixolydian, Locrian, Harmonic Minor, Melodic Minor, Major Pentatonic, Minor Pentatonic, Minor Blues. Any other name is refused before Live is called.
create_chord_progressionneeds a 7-note scale.create_drum_patternpicks each voice's pad by a keyword in the pad name first (e.g. "Kick", "Snare", "Hihat Closed"), then by its General MIDI note (36 kick, 38 snare, 42 closed hat, 46 open hat, ...) if no other voice claims that pad by name. Kits with odd or empty pad names can leave voices unresolved; the result lists them inmissing_voices.Generators replace the clip in the target slot as one undo step. They never create tracks or load instruments. Melodic clips need an instrument on the track, or they play silent.
If Live shows a modal dialog, calls time out. A timed-out change may still have run: check
get_set_overviewbefore retrying.
Manual smoke checklist (real Live)
Upgrade only: with the old script still installed,
live_statusreturns theinstall-scripthint.install-script, restart Live, select AbletonMCP.Log.txtshowsAbletonMCP listeningand Python 3.11.doctorprints no FAIL and exits 0.call helloshows your Live version, edition (variant) andprotocol_version: 5.call browse '{"root":"drums","path":[]}'lists the drum kits.In Claude Code, ask "make a 1-bar 4/4 drum beat on a new track and play it". You get a new track, a kit, a clip with notes, and sound. Cmd+S still saves.
undo_lastremoves only the last tool's change.Lite only: with 8 tracks, asking for another returns the edition-limit error and Live shows no dialog. In Claude Code, "add a bass track" makes the agent delete or reuse a track.
call get_overviewshowsdrum_padsnames (e.g. "Kick", "Snare") for a kit track.call get_notes '{"track":N,"slot":0}'lists the drum clip's notes.call delete_track '{"track":N}'removes the track; onecall undorestores it with its clip and kit.Quit Live.
get_set_overviewreturns the Control Surface hint, andwrite_midi_filestill writes a.midthat you can drag into Live.A
uv run python -cloop callsLiveClient().call("set_scale", ...)for each of the 12 scales and prints any whose returnedintervalsdiffer fromtheory.SCALES. It prints nothing; the MIDI editor highlights the last scale.On an 808 Core Kit track,
create_drum_pattern(style="house", bars=2, track=0, slot=1)returns nomissing_voicesand plays as house. Oneundo_lastremoves the clip. On an occupied slot, oneundo_lastrestores the old clip and its notes.Load a Lite kit with empty pad names (e.g. "Ahlimba Kit").
create_drum_pattern(style="rock")resolves kick, snare and closed_hat.In a fresh Claude Code session, "make a hip hop beat, a bassline and chords in A minor" calls
set_scale,create_drum_pattern,create_basslineandcreate_chord_progression(nowrite_notes). All three clips play in key.With Live closed, "write me a house beat as a MIDI file" writes a
.midin~/Music/ableton-mcp/midi/that plays on a kit when dragged in.call get_overview(read-only) showsmix.volume_db0.0 andpan0 for a default track,return_tracksA/B with their names, and 8scenes. A dB parse error shows here, before any setter runs.set_track_mix(track=0, volume_db=-6, pan=25, sends={"A": -12}): Live shows -6.0 dB, 25R and send A at -12 dB. Oneundo_lastrestores all three.create_scene(copy_of=0)adds a copy below scene 0 with the same clips.fire_scene(scene=1)plays that row.set_labelwithcolor="red"on a track, a clip and a scene shows red in Live.copy_clipinto an empty slot plays. Cmd+S still saves.Lite only: with 16 scenes,
create_scenereturns the Lite error and Live shows no dialog.In Claude Code, "turn my loop into a song with intro, verse and chorus" names the scenes, copies or varies the clips, colours them by role and fires the scenes in order.
call get_device '{"track":1,"device_path":[0]}'on a rack preset (e.g. "Basic Analog Bass") lists its macro parameters andchains: [](its chains are hidden). On "Ahlimba Kit",[0,0,0]reaches the Drum Rack and[0,0,1]the Saturator. Nodisplayis blank.In Claude Code, "put a Drift on track 5" calls
load_instrument(4, "drift")and track 5 shows Drift. "load the Deep Bass preset on track 6" loads it with oneload_instrumentcall and nobrowse_library.set_device_parameterson two Drift parameters: the returneddisplaymatches Live's UI. Oneundo_lastrestores both.Lite only: "use Operator for the lead" gets the refusal, and the agent loads Drift instead.
uv run python -c "import asyncio; from ableton_mcp import server; print(asyncio.run(server.mcp.read_resource('live://capabilities')))"shows your Live version, edition andlimits("audio_midi_tracks": 8on Lite).In Claude Code, after
/mcpreconnect: typing/lessonlists the six/ableton:lesson-*commands,/ableton:explain-my-setis there, and typing@ableton:offers bothlive://resources./ableton:lesson-first-beatbuilds a playing beat step by step, explains the drum roles and tempo, links the Beats chapter, and ends with one Cmd+S reminder and the next lesson's command./ableton:explain-my-setmakes no write tool call.In a fresh session with no lesson, "add an open hi-hat on the off-beats" gets a plain-words summary of the change and one save reminder at the end, not one after each tool call.
With the Vital app closed, ask Claude Code for "a warm detuned supersaw pad". Vital opens with the new preset, and its values match the tool call. With Vital open, the same request starts no second instance, and the preset is in the browser under User. In Live, Vital loaded with
load_from_libraryplays the preset with notes fromcreate_chord_progression.With the Vital app closed, ask for "a plucked string from a noise burst". The sample panel shows White Noise on, filter 1 shows a comb style, and C3 and C4 ring at different pitches and decay like a pluck. Then ask for "a vowel 'ah' to 'ee' formant pad": filter 1 shows Formant with AOIE or AIUO, and moving the vowel pad in Vital changes the vowel from where the tool set it.
Development
uv sync
uv run pytest -qCI (.github/workflows/test.yml) runs the suite on Python 3.11 (Live's embedded version) and 3.13 for every push to main and every pull request. Keep src/ and remote_script/ working on 3.11.
License
MIT, see LICENSE. Some design patterns come from other MIT-licensed Live projects. They were re-implemented here, and no code was copied.
Available Tools
27 toolsbrowse_libraryARead-only
List one level of Live's browser. root is one of: instruments, drums, audio_effects, midi_effects, sounds, samples, clips, packs, user_library, plugins, max_for_live, current_project. path is the folder names to open, e.g. []. Navigate one level at a time: add one folder name per call.
Inputs: root (required), path.
copy_clipA
Copy the clip in track/slot to the empty slot to_track/to_slot, e.g. to reuse a loop in another scene. An occupied target is refused: delete_clip it first. A MIDI clip needs a MIDI target track.
Inputs: slot (required), track (required), to_slot (required), to_track (required).
create_basslineADestructive
Write a bassline in a key. degrees are scale degrees, one per bar, cycled (default [1]; e.g. [1, 6, 4, 5]). bars defaults to len(degrees). root and scale default to the Set's scale (see set_scale); without Live, give both. octave 1 puts A at MIDI 45. The track needs an instrument (e.g. a bass synth), or the clip plays silent. Destination: track + slot writes a clip into Live and replaces any clip in that slot (one undo_last restores it); file_name instead writes a 120 BPM .mid file to ~/Music/ableton-mcp/midi/ and works with Live closed. Never creates tracks. 4/4 only.
Inputs: bars, name, root, slot, +6 more.
create_chord_progressionADestructive
Write held root-position chords built from scale degrees, e.g. [1, 6, 4, 5] in C Major gives C Am F G. The result's chords names each chord. Needs a 7-note scale (not the pentatonics or Minor Blues). root and scale default to the Set's scale (see set_scale); without Live, give both. The track needs an instrument. Destination: track + slot writes a clip into Live and replaces any clip in that slot (one undo_last restores it); file_name instead writes a 120 BPM .mid file to ~/Music/ableton-mcp/midi/ and works with Live closed. Never creates tracks. 4/4 only.
Inputs: degrees (required), name, root, slot, +6 more.
create_drum_patternADestructive
Write a drum beat in a style, repeated over bars. The track must hold a Drum Rack kit; hits go to the pads that match each voice (kick, snare, hats...), and voices the kit lacks are listed in missing_voices. layers add Euclidean rhythms, e.g. {voice: "perc", pulses: 3, steps: 8}; a layer replaces the style's part for that voice. style null with layers gives layers only. The result's about explains the style for a beginner. Destination: track + slot writes a clip into Live and replaces any clip in that slot (one undo_last restores it); file_name instead writes a 120 BPM .mid file to ~/Music/ableton-mcp/midi/ and works with Live closed. Never creates tracks. 4/4 only.
Inputs: bars, name, slot, style, +3 more.
create_midi_clipB
Create an empty MIDI clip in an empty clip slot of a MIDI track. Length is in beats (4 beats = 1 bar in 4/4).
Inputs: slot (required), track (required), name, length_beats.
create_midi_trackA
Add a new MIDI track. index -1 puts it at the end. Live Lite allows only 8 audio+MIDI tracks, so reuse an existing empty track when you can.
Inputs: name, index.
create_sceneA
Add a scene (a row of clip slots across all tracks). index -1 or none puts it at the end. copy_of copies that scene with all its clips and puts the copy directly below it; later scenes shift down by one. Give index or copy_of, not both. Live Lite allows only 16 scenes, so name and reuse empty scenes when you can.
Inputs: name, index, copy_of.
delete_clipADestructive
Delete the clip in this clip slot. One undo_last restores it.
Inputs: slot (required), track (required).
delete_trackADestructive
Delete a track with its clips and devices. One undo_last restores it. Use it to free a track under Live Lite's 8-track limit. Group tracks are refused. Later tracks' indices shift down by one, so call get_set_overview again before the next delete.
Inputs: track (required).
fire_sceneA
Launch every clip in this scene (one song section). Live starts the transport if it is stopped. Not an undo step.
Inputs: scene (required).
get_set_overviewARead-only
Describe the open Set: tempo, time signature, playing state, and every track with its index, type, devices and clip slots. Indices are 0-based. drum_pads lists {note, name} for each used pad of the track's Drum Rack (null when the track has none): use those notes as pitches in write_notes. Each track's mix is {volume_db, pan, mute, solo, sends}: dB values with null = -inf, pan -50..50 (50L..50R), sends keyed by return letter ("A", "B"...). scenes lists {index, name}; return_tracks lists {send, name, devices}.
Inputs: no named parameters.
live_statusARead-only
Check that Live is reachable. Returns the Live version, edition ("Lite", "Standard", "Suite") and supported features. Call this first. limits gives the edition's caps: audio_midi_tracks and scenes (null = no cap).
Inputs: no named parameters.
load_from_libraryA
Load a browser item onto a track, e.g. a drum kit from root "drums". path must end at an item that browse_library marked is_loadable. Returns the names of the devices that were added and device_index, the position of the first one (use [device_index] as device_path in read_device). Loading an instrument replaces the track's current instrument; undo_last restores it. For instruments and their presets, load_instrument does this in one call.
Inputs: path (required), root (required), track (required).
load_instrumentA
Put an instrument on a MIDI track, replacing its current instrument; undo_last restores it. Without preset you get the bare device. preset is a preset name from the kind's browser folders, e.g. drift "Deep Bass" or drum_rack "808 Core Kit" (a kit); case and the .adv/.adg ending are ignored. Live Lite has drift, simpler, impulse, drum_rack, drum_sampler and instrument_rack only; other kinds are refused there. Returns the added devices, device_index (for read_device) and the browser root and path that were loaded.
Inputs: kind (required), track (required), preset.
play_clipB
Start playing the clip in this slot. Live starts the transport if it is stopped.
Inputs: slot (required), track (required).
read_deviceARead-only
Read one device's parameters: {index, name, value, min, max, display, quantized, enabled}; switches (quantized) also list their choices in items. display is Live's own text for the value, e.g. "1.20 kHz". device_path defaults to [0], the track's first device (get_set_overview lists the devices). Add [chain, device] to go into a rack: [0, 0, 1] is device 1 in chain 0 of rack 0. chains lists a rack's chains and their devices (null when the device is not a rack). enabled false means a macro or lock controls the parameter: change the macro instead.
Inputs: track (required), device_path.
read_notesARead-only
Return the clip's length and its notes, in the same shape write_notes takes, sorted by start_time then pitch. Mute and probability are not returned, so a read_notes + write_notes round trip resets them.
Inputs: slot (required), track (required).
set_device_parametersA
Change parameters of one device (device_path as in read_device), all in one undo step. values maps a parameter name from read_device (case ignored) to a raw value between its min and max, or, for a switch, one of its items, e.g. {"Filter Freq": 0.6, "Osc 1 Shape": "Saw"}. Raw values are not units: check display in the result and set again if it is off. If any entry is invalid, nothing changes. undo_last restores all of them.
Inputs: track (required), values (required), device_path (required).
set_labelA
Rename and/or colour a track (track alone), a clip (track + slot) or a scene (scene alone). Live snaps the colour to the nearest one in its chooser. Colour by role, e.g. drums red, bass blue, chords green, and scenes by song section (intro, verse, chorus).
Inputs: name, slot, color, scene, +1 more.
set_scaleA
Set the Set's key, e.g. root "A", scale "Minor", and turn on Scale Mode so Live's MIDI editor highlights the scale's notes. create_bassline and create_chord_progression use this key when you leave root and scale out.
Inputs: root (required), scale (required).
set_tempoA
Set the song tempo in BPM (20-999).
Inputs: bpm (required).
set_track_mixA
Set a track's mixer; give only what you want to change. volume_db in dB (0 is Live's default, max +6). pan -50..50 (-50 = 50L, 50 = 50R). sends maps a return letter to dB, e.g. {"A": -12}. To silence a track use mute. solo is not exclusive: Live does not unsolo other tracks, so unsolo them yourself. Returns the track's resulting mix.
Inputs: track (required), pan, mute, solo, +2 more.
stopB
Stop playback.
Inputs: no named parameters.
undo_lastA
Undo the last change in Live. Each tool call that changes the Set is one undo step.
Inputs: no named parameters.
write_midi_fileA
Save notes as a .mid file in ~/Music/ableton-mcp/midi/ without using Live (works even when Live is closed). The user can drag the file into Live. The file holds notes only, so tell the user to drop it on a track that has an instrument (e.g. a Drum Rack kit) or it plays silent. Times are in beats. name: letters, digits, space, '_' or '-'. An existing file with that name is never overwritten: pick a new name.
Inputs: name (required), notes (required), bpm.
write_notesADestructive
Replace ALL notes in the clip with these notes. To edit existing notes, read_notes first and send the full changed list. Times and durations are in beats (1.0 = one quarter note). For a Drum Rack, take pitches from drum_pads in get_set_overview. The result's notes_outside_clip counts notes that start at or after the clip length; they never play (assumes the loop starts at beat 0).
Inputs: slot (required), notes (required), track (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 27 tools
Most tools target a distinct resource+action (clips, tracks, scenes, devices, mix, transport), and the detailed descriptions draw lines carefully. The main fuzziness is the MIDI-content cluster: create_midi_clip + write_notes, write_midi_file, and the three generators (create_drum_pattern, create_bassline, create_chord_progression) all produce notes across overlapping destinations, and load_from_library overlaps load_instrument (the description even says 'load_instrument does this in one call').
The set overwhelmingly follows verb_noun snake_case: create_/delete_/copy_/read_/write_/set_/get_/load_/browse_/play_. Deviations are minor and domain-justified: bare 'stop', 'undo_last', and 'fire_scene' alongside 'play_clip', plus the state-style 'live_status'.
27 tools exceeds the comfortable band; the surface is genuinely broad (tracks, clips, notes, scenes, devices, mixer, browser, offline MIDI export), so each tool is defensible, but it is heavy for an agent to route through. Some consolidation is plausible, e.g. folding the three generators and write_midi_file into fewer entry points.
Strong session-view lifecycle coverage: create/delete tracks and clips, scene creation, note read/write, device read/write, mixer, transport, browser loading, undo, plus offline file output. Gaps remain: no scene deletion or clip move/duplicate (only copy to empty slot), no device removal, no per-clip stop or arrangement-view operations, so a few workflows dead-end.
Related MCP Connectors
Create, co-edit, analyze, publish, and export collaborative step-sequencer sessions through MCP.
Remote MCP server for audio stem separation, denoise, reverb, and MIDI export.
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
MCP server for Producer/Riffusion AI music generation
Related MCP Servers
- FlicenseBqualityDmaintenanceControl Ableton Live from Claude Code via the Model Context Protocol (MCP). Create/edit tracks, control plugins, fire clips, edit MIDI notes, capture audio — all through natural language.100-
- AlicenseBqualityCmaintenanceLocal MCP server for inspecting and controlling Ableton Live through a local HTTP bridge. Enables LLMs to perform production workflows like MIDI import, track editing, mixing, mastering, and export.5921 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to control Ableton Live through a Max for Live device and optional Remote Script, covering tracks, clips, MIDI notes, mixer settings, transport, and plugin search and insertion.1MIT
- AlicenseCqualityBmaintenanceEnables Claude or any AI agent to operate Live 12 Intro end to end: creating tracks and scenes, writing and quantizing MIDI clips, loading audio onto the Arrangement timeline, setting device parameters in real units, drawing clip automation, mixing with real sidechain, and rendering or analyzing audio so the agent can check its own work. It exposes 57 tools over MCP or a local JSON socket, working within the stock Intro edition's 16-track, 16-scene limits.57MIT