Skip to main content
Glama
ntworm

Ableton MCP Server

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ABLETON_GROOVE_SEED_BUNDLENoOverrides the curated Groove Intelligence seed bundle that ships inside the wheel; derived artifacts stay in LocalAppData.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_session_infoA

Read top-level transport and time-signature state.

Side effects: none. Example: get_session_info() returns tempo and playhead state. Edge cases: fails when the Remote Script is unavailable.

get_session_overviewA

Compose a compact Session snapshot from three existing read tools.

Side effects: none; performs three read-only TCP bridge calls. Example: get_session_overview() returns session, tracks, and scenes. Edge cases: a bridge failure is returned by the corresponding component read.

get_bridge_statusA

Probe the Live bridge and explain environment-specific connection failures.

Side effects: opens a loopback connection and performs one read-only session query. Example: get_bridge_status() distinguishes MCP discovery from Live availability. Edge cases: WSL NAT failures include a Windows-Python launcher hint.

get_track_listA

List regular, return, and master tracks with session path-ids.

Side effects: none. Example: get_track_list() returns [{"id": "track:0", ...}]. Edge cases: path-ids must be refreshed after structural track changes.

get_track_stateA

Read mixer, device, and Session clip-slot state for one track.

Side effects: none. Example: get_track_state(0) inspects the first track. Edge cases: an out-of-range index returns INVALID_PARAMS.

get_locatorsA

List Arrangement cue points with names and beat times.

Side effects: none. Example: get_locators() returns [{"name": "Verse", "time": 8.0}]. Edge cases: Live beat-time objects are serialized as floats.

take_snapshotA

Capture a normalized full-state debugging snapshot.

Side effects: none. Example: take_snapshot() returns schema version, tracks, and context. Edge cases: large Sets produce correspondingly large JSON results.

get_ableton_logsA

Read the tail of the newest Ableton Log.txt on Windows.

Side effects: reads a local log file; it does not contact Live. Example: get_ableton_logs(50) returns the last fifty lines. Edge cases: returns a diagnostic string when no log can be located.

get_control_surfacesA

List MIDI Remote Scripts currently exposed by Live.

Side effects: none. Example: get_control_surfaces() confirms this script loaded. Edge cases: unavailable surfaces may be omitted by Live.

get_scenesA

List Session View scenes and whether each scene is empty.

Side effects: none. Example: get_scenes() returns scene indexes and names. Edge cases: a scene is non-empty when any contained slot has a clip.

get_scene_stateB

Read one scene and its per-track clip-slot summary.

Side effects: none. Example: get_scene_state(0) inspects the first scene. Edge cases: an invalid scene index returns INVALID_PARAMS.

get_project_metadataA

Read Set name, file path, and dirty state.

Side effects: none. Example: get_project_metadata() identifies the loaded Set. Edge cases: unsaved Sets can have an empty file path.

get_loop_settingsB

Read Arrangement loop enablement, start, and length.

Side effects: none. Example: get_loop_settings() returns loop geometry in beats. Edge cases: values can change with user interaction during a session.

get_selected_contextA

Read the currently selected track, scene, and device.

Side effects: none. Example: get_selected_context() returns selected path-ids. Edge cases: absent selections use null or index -1.

get_clip_summaryA

List Session clip slots and clip metadata for one track.

Side effects: none. Example: get_clip_summary(0) lists the first track's slots. Edge cases: return and master tracks produce WRONG_TYPE.

get_clip_notesA

Read MIDI notes from one Session clip.

Side effects: none. Example: get_clip_notes(0, 1) reads slot one on track zero. Edge cases: audio clips return WRONG_TYPE and empty slots return an empty list.

get_clip_infoA

Read stable metadata for one Session clip slot.

Side effects: none. Example: get_clip_info(0, 1) returns loop, type, color, and signature fields. Edge cases: empty slots return has_clip=false instead of an error.

get_device_listA

List devices and parameter snapshots on one track.

Side effects: none. Example: get_device_list(0) returns device path-ids. Edge cases: special tracks may expose an empty device list.

get_parameter_valueA

Read a named device parameter and its bounds.

Side effects: none. Example: get_parameter_value(0, 0, "Device On") reads a top-level parameter; get_parameter_value(4, 1, "Out Low", chain_index=0, chain_device_index=0) reads one nested inside a rack chain. Edge cases: names are exact and missing parameters return INVALID_PARAMS. chain_index without chain_device_index addresses the chain's mixer, which exposes only volume and panning.

set_parameter_valueA

Write a named device parameter and verify the observed Live value.

Side effects: mutates one device parameter in one Live undo step. Example: set_parameter_value(0, 0, "Filter Freq", 0.75) updates a device; set_parameter_value(4, 1, "Out Low", 20, chain_index=0, chain_device_index=0) reaches a Velocity device nested inside a rack chain. Edge cases: chain_index alone addresses the chain's own mixer, where only volume and panning exist. Disabled, unknown, and out-of-range parameters return structured errors.

get_plugin_presetsA

List a VST/VST3/AU plugin's presets and report its Configure state.

Side effects: none. Example: get_plugin_presets(2, 2) returns the preset names plus selected_preset_index for the plugin on track two. Edge cases: native Live devices return WRONG_TYPE; a plugin whose parameters were never added through Live's Configure button reports plugin_state.hint = "PLUGIN_NOT_CONFIGURED".

set_plugin_presetA

Select one plugin preset by index or exact name and verify the readback.

Side effects: switches the plugin preset in one Live undo step. Example: set_plugin_preset(2, 2, preset_name="Rock Kit") selects a preset without the Configure step set_parameter_value needs. Edge cases: pass exactly one selector; unknown names, out-of-range indexes, and plugins that expose no presets return structured errors.

get_routingA

Read input and output routing labels for one track.

Side effects: none. Example: get_routing(0) reports the first track's routes. Edge cases: unavailable routes are returned as empty strings.

get_browser_categoriesA

List top-level Live Browser categories available in this version.

Side effects: none. Example: get_browser_categories() returns category display names. Edge cases: version-specific missing categories are omitted.

search_browserA

Search the Live Browser with bounded TCP-side traversal.

Side effects: none. Example: search_browser("Operator", "instruments", 25) finds native devices. Edge cases: traversal is capped by depth, children, visited nodes, and result limit.

diff_snapshots_toolA

Compare two snapshots recursively on the MCP-server side.

Side effects: none; no socket call is made. Example: diff_snapshots_tool(old, new) reports changed paths. Edge cases: list entries are compared by position, not object identity.

get_song_lengthA

Read the derived Arrangement song length in beats.

Side effects: none. Example: get_song_length() returns {"song_length": 64.25}. Edge cases: the LOM property is read-only; no setter tool exists.

live_find_trackA

Find tracks by case-insensitive name substring and return fresh path-ids.

Side effects: none. Example: live_find_track("bass") resolves matching tracks. Edge cases: no match is a valid empty result.

live_find_deviceA

Find devices in a track by case-insensitive name substring and return fresh path-ids.

Side effects: none. Example: live_find_device(0, "operator") resolves matching devices on track 0. Edge cases: no match is a valid empty result.

live_find_clipA

Find clip slots in a track by case-insensitive name substring and return fresh path-ids.

Side effects: none. Example: live_find_clip(0, "verse") resolves matching clips on track 0. Edge cases: no match is a valid empty result.

list_device_paramsA

Resolve a track path-id and list all device parameters.

Side effects: none. Example: list_device_params("track:0") returns parameter path-ids. Edge cases: missing targets return STALE_REFERENCE with a recovery hint.

create_cue_pointA

Create or idempotently rename a cue point at a beat time.

Side effects: mutates the Set in one undo step and temporarily moves the playhead. Example: create_cue_point("Verse", 8.0) creates a locator. Edge cases: verified movement failure raises PLAYHEAD_NOT_MOVED before toggling. Arrangement-grid snap is reversed and raises CUE_SNAPPED_TO_GRID.

bulk_create_cue_pointsA

Create or rename multiple cue points as one command.

Side effects: mutates all successful items inside one undo step. Example: bulk_create_cue_points([{"name": "A", "time": 0}]). Edge cases: per-item errors are aggregated instead of aborting later items; off-grid snaps are reversed and reported as CUE_SNAPPED_TO_GRID.

delete_cue_pointA

Delete a cue point by verified move-and-toggle.

Side effects: mutates the Set in one undo step and temporarily moves the playhead. Example: delete_cue_point(8.0) deletes a cue near beat eight. Edge cases: no cue at the time returns deleted: false; an Arrangement-grid snap is reversed and raises CUE_SNAPPED_TO_GRID.

set_current_song_timeA

Move the Arrangement playhead with set/read/retry verification.

Side effects: writes transport state in one undo step. Example: set_current_song_time(32.0) moves to beat thirty-two. Edge cases: a stuck setter raises PLAYHEAD_NOT_MOVED after three attempts.

set_tempoA

Set the Live Set tempo in BPM.

Side effects: writes tempo in one undo step. Example: set_tempo(128.0) sets 128 BPM. Edge cases: values outside 20..999 or non-finite values are rejected. With dry_run=True, the change is validated but not committed.

start_playbackA

Start Live's transport.

Side effects: starts playback in one undo-scoped command. Example: start_playback() returns the observed playing state. Edge cases: Live can reject the call while shutting down.

stop_playbackA

Stop Live's transport.

Side effects: stops playback in one undo-scoped command. Example: stop_playback() returns the observed playing state. Edge cases: Live can reject the call while shutting down.

set_loopA

Enable or disable the Arrangement loop.

Side effects: writes loop state in one undo step. Example: set_loop(True) enables looping. Edge cases: only a boolean value is accepted.

set_loop_startA

Set Arrangement loop start with read-back verification.

Side effects: writes loop geometry in one undo step. Example: set_loop_start(16.0) starts the loop at beat sixteen. Edge cases: a stuck setter raises PLAYHEAD_NOT_MOVED.

set_loop_lengthA

Set Arrangement loop length with read-back verification.

Side effects: writes loop geometry in one undo step. Example: set_loop_length(8.0) makes an eight-beat loop. Edge cases: length must be positive and a stuck setter raises an error.

run_batchA

Run allowed mutations sequentially inside one Live undo step.

Side effects: successful prefix mutations persist until one Ctrl+Z; no rollback occurs. Example: run_batch([{"type": "set_tempo", "params": {"tempo": 128}}]). Edge cases: execution aborts at the first error and nested batches are rejected.

add_notes_to_clipA

Add validated MIDI notes to an existing Session clip.

Side effects: adds notes in one undo step; existing notes remain. Example: add_notes_to_clip(0, 0, [{"pitch": 60, ...}]). Edge cases: audio clips, empty slots, and invalid MIDI ranges are rejected.

fire_clipA

Fire an existing Session clip through its clip slot.

Side effects: launches playback in one undo-scoped command. Example: fire_clip(0, 1) launches slot one on track zero. Edge cases: empty or invalid slots are rejected.

create_clipA

Create an empty MIDI clip in an empty Session slot.

Side effects: creates a clip in one undo step. Example: create_clip(0, 1, 4.0) creates a four-beat clip. Edge cases: only empty slots on MIDI tracks accept this operation. With dry_run=True, the change is validated but not committed.

delete_clipB

Delete one occupied Session clip slot.

Side effects: deletes a clip in one Live undo step. Example: delete_clip(0, 1) removes the clip in slot one. Edge cases: empty slots return BAD_INPUT.

clear_clip_notesA

Remove every MIDI note from one Session clip and report the observed delta.

Side effects: clears notes in one Live undo step. Example: clear_clip_notes(0, 1) empties a MIDI clip without deleting it. Edge cases: empty or audio clips return structured errors.

fire_sceneA

Fire one Session scene using Live's current launch quantization.

Side effects: triggers all playable clips in the selected scene. Example: fire_scene(0) launches the first scene. Edge cases: an out-of-range index returns INVALID_PARAMS.

set_track_propertyA

Set and verify one boolean track property.

Side effects: changes mute, solo, or arm in one Live undo step. Example: set_track_property(0, "mute", True) mutes the first track. Edge cases: arm is rejected for return and master tracks.

set_track_colorA

Set and verify one track colour, by palette index or packed RGB.

Side effects: writes Track.color_index or Track.color in one Live undo step and reads the value back; clips are never recoloured. Example: set_track_color(0, color_index=12) or set_track_color(0, color=0x336699). Edge cases: exactly one of color_index (0..69) and color (0x000000..0xFFFFFF) is required; a track that does not expose the property returns WRONG_TYPE and a rejected write returns VERIFICATION_FAILED — the write is never retried.

set_clip_colorA

Set and verify one clip colour, by palette index or packed RGB.

Side effects: writes Clip.color_index or Clip.color in one Live undo step and reads the value back. Only the addressed clip changes. Example: set_clip_color(0, 1, color_index=12) colours a Session clip; set_clip_color(0, 0, scope="arrangement", color=0x336699) colours the first Arrangement clip on that track. Edge cases: exactly one of color_index (0..69) and color (0x000000..0xFFFFFF) is required. An empty Session slot returns BAD_INPUT. Arrangement scope needs Track.arrangement_clips (Live 11+); a host without it returns CAPABILITY_UNAVAILABLE — run diagnose_clip_targets to see what is reachable. The write is issued once and never retried.

diagnose_clip_targetsA

Report which clips set_clip_color can and cannot reach.

Side effects: none; a read-only sweep of Session slots and Arrangement clips. Example: diagnose_clip_targets(0) inspects one track; diagnose_clip_targets() sweeps the whole Set. Edge cases: returns arrangement_supported: false and an inaccessible entry for a host that does not expose Track.arrangement_clips, instead of reporting zero Arrangement clips.

get_arrangement_clipsA

List one track's Arrangement clips with their placement on the timeline.

Side effects: none. Example: get_arrangement_clips(3) returns each clip's start_time, end_time and length in beats, sorted by position. Edge cases: a host without Track.arrangement_clips returns CAPABILITY_UNAVAILABLE instead of an empty list.

duplicate_session_clip_to_arrangementA

Place a Session clip onto the Arrangement timeline at an exact beat.

Side effects: adds one Arrangement clip in one Live undo step. The Session clip stays where it is, and clip envelopes travel with the copy. Example: duplicate_session_clip_to_arrangement(38, 0, 468.0) drops slot one of track 38 at beat 468. Edge cases: an empty slot returns BAD_INPUT; a host without Track.duplicate_clip_to_arrangement returns CAPABILITY_UNAVAILABLE.

delete_arrangement_clipA

Delete one clip from the Arrangement timeline.

Side effects: removes one Arrangement clip in one Live undo step. Example: delete_arrangement_clip(3, 2) deletes the third clip of the track's Arrangement lane. Edge cases: clip_index indexes Track.arrangement_clips; re-read it after any structural change because the indices shift.

get_device_chainsA

Open one rack and list its chains, their mixer state and inner devices.

Side effects: none. Example: get_device_chains(39, 0) reveals the four guitar chains and the volume of each, which get_device_list cannot show. Edge cases: a device that is not a rack returns WRONG_TYPE.

get_midi_chain_reportA

Report the MIDI effects that rewrite what a clip says, before writing one.

Side effects: none. Example: get_midi_chain_report(58) reveals that a Note Length device overrides every written duration and which parameter actually controls it. Edge cases: a track with no such device returns rewrites_input: false.

describe_instrumentA

Describe a track's instrument and what the user must still set up.

Side effects: none. Example: describe_instrument(60) returns the SWAM plugin's automatable parameters, or a setup_requests entry asking the user to press Configure when a plugin exposes none. Edge cases: a track without an instrument returns has_instrument: false with the request to load one.

get_clip_automationA

Read back one clip envelope as a sampled curve.

Side effects: none. Example: get_clip_automation(38, 0, "FILTER", resolution=0.5) returns the written shape so intent can be compared against reality. Edge cases: the LOM exposes no breakpoint list, so the answer is sampled at resolution beats; a parameter name shared by several devices returns AMBIGUOUS_MATCH unless device_index is given.

create_clip_automation_curveA

Write a smooth envelope from a handful of control points.

Side effects: replaces one clip envelope in one Live undo step. Example: create_clip_automation_curve(38, 0, "FILTER", [{"time": 0, "value": 12}, {"time": 16, "value": 110}], shape="exp") expands into contiguous steps on the server. Edge cases: Live's envelopes are stepped, so the expansion is a dense staircase capped at 500 steps; raise resolution if it overflows.

add_notes_patternA

Repeat one note cell N times instead of sending every note.

Side effects: adds notes in one Live undo step; existing notes remain. Example: add_notes_pattern(59, 0, cell, cell_length=4, repeats=16, transpose_per_repeat=0) writes a sixteen-bar ostinato from one bar. Edge cases: the same validation as add_notes_to_clip applies to every expanded note; pitch and velocity are clamped to the MIDI range.

set_arrangement_clip_propertiesA

Rename or mute one Arrangement clip, verified by readback.

Side effects: changes one Arrangement clip in one Live undo step. Example: set_arrangement_clip_properties(44, 2, muted=False) unmutes a clip that was silenced by hand. Edge cases: clip_index indexes Track.arrangement_clips and shifts after structural changes; provide at least one of name or muted.

move_arrangement_clipA

Move one Arrangement clip to a new beat.

Side effects: copies the clip to time and deletes the original, both verified. The LOM exposes no setter for Clip.start_time, so this is the only way to reposition; a failed copy leaves the original in place. Example: move_arrangement_clip(3, 2, 96.0). Edge cases: indices shift after the move — re-read with get_arrangement_clips.

move_trackA

Attempt to move one track to another index; Live's API cannot do this.

Side effects: none — the request is validated and refused. Example: move_track(3, 0) returns CAPABILITY_UNAVAILABLE with the LOM and Extension SDK evidence in details. Edge cases: invalid indexes return INVALID_PARAMS and return/main tracks return WRONG_TYPE, so a malformed request stays distinguishable from the capability gap. Create tracks at the index you want, or reorder by hand in Live.

reorder_tracksA

Attempt to reorder every track at once; Live's API cannot do this.

Side effects: none — the request is validated and refused. Example: reorder_tracks([2, 0, 1]) returns CAPABILITY_UNAVAILABLE with the API evidence in details. Edge cases: order must be a permutation of the regular track indexes; anything else returns BAD_INPUT before the capability refusal.

move_track_to_groupA

Attempt to move a track into a Group Track; Live's API cannot do this.

Side effects: none — the request is validated and refused. Example: move_track_to_group(4, 1) returns CAPABILITY_UNAVAILABLE with the API evidence in details. Edge cases: Track.group_track is read-only in the LOM and the Extension SDK exposes only a getter. A non-foldable target returns WRONG_TYPE; a self-nesting or cyclic request returns BAD_INPUT.

ungroup_trackA

Attempt to take a track out of its group; Live's API cannot do this.

Side effects: none — the request is validated and refused. Nothing is deleted under any circumstance. Example: ungroup_track(2) returns CAPABILITY_UNAVAILABLE with the API evidence in details. Edge cases: a track that is not grouped returns WRONG_TYPE before the capability refusal.

merge_groupsA

Attempt to move one group's members into another; Live's API cannot.

Side effects: none — the request is validated and refused. This bridge never deletes a track, so an emptied group would always be left in place. Example: merge_groups(5, 1) returns CAPABILITY_UNAVAILABLE with the API evidence in details. Edge cases: both indexes must be Group Tracks (WRONG_TYPE otherwise), must differ, and must not nest into each other (BAD_INPUT). delete_empty_source=True is rejected with BAD_INPUT.

set_clip_propertiesB

Set and verify selected Session clip loop bounds or name.

Side effects: changes one clip in one Live undo step. Example: set_clip_properties(0, 1, loop_end=8, name="Verse") edits a clip. Edge cases: the final loop interval must remain positive and non-empty.

create_clip_automationA

Replace one Session clip parameter envelope with verified breakpoints.

Side effects: clears and rewrites one clip envelope in one Live undo step. Example: create_clip_automation(0, 1, "volume", [{"time": 0, "value": 0.5}]). Edge cases: requires Session-clip automation APIs and accepts at most 500 points. A parameter name carried by several devices of the track returns AMBIGUOUS_MATCH; pass device_index to choose one. Envelopes are stepped, so a smooth ramp needs dense points — or use create_clip_automation_curve and let the server expand it.

get_composition_structureB

Retrieve the full track layout, scene count, and composition properties.

Side effects: none. Example: get_composition_structure() returns tracks, scenes, unnamed tracks. Edge cases: large Sets produce correspondingly large JSON results.

diagnose_midi_clipA

Scan a MIDI clip for overlapping notes, notes outside scale, and quantization issues.

Side effects: none. Example: diagnose_midi_clip(0, 0, "C", "major") checks scale conformance. Edge cases: audio clips return WRONG_TYPE; omitting scale skips pitch analysis.

create_midi_trackA

Create a new MIDI track inside Ableton Live under safe constraints.

Side effects: mutates the Set by adding a track in one undo step. Example: create_midi_track("Bass") appends a named MIDI track. Edge cases: fails with TRACK_LIMIT_REACHED when ≥ 96 tracks exist.

create_audio_trackA

Create a new audio track in Ableton Live.

Side effects: mutates the Set by adding an audio track in one undo step. Example: create_audio_track(name="vocals") appends a named audio track; create_audio_track(index=2) inserts at position 2. Edge cases: raises LIVE_UNAVAILABLE when the Live host does not expose Song.create_audio_track. Note: this audio variant does not reuse the 96-track TRACK_LIMIT_REACHED guard — Live itself enforces the per-host track cap.

rename_trackA

Rename a track in the Live Set.

Side effects: mutates the track name in one undo step. Example: rename_track(0, "Drums") renames the first track. Edge cases: an out-of-range index returns INVALID_PARAMS.

get_warp_stateA

Retrieve warping status, warp mode, and warp markers of an audio clip.

Side effects: none. Routed via the Extension Host WebSocket bridge. Example: get_warp_state(1, 0) reads warp data from track 1, clip 0. Edge cases: requires the AbletonMCPServer Extension to be installed.

set_warp_stateC

Modify warp parameters on an audio clip.

Side effects: mutates warp state via the Extension Host. Example: set_warp_state(1, 0, warping=True, warp_mode="complex") Edge cases: requires the AbletonMCPServer Extension to be installed.

load_device_to_trackA

Load a device onto a track using the Extensions SDK browser API.

Side effects: mutates the track device chain via the Extension Host. Example: load_device_to_track(0, device_name="Operator") loads Operator on track 0. device_uri is retained as a deprecated alias for callers that still pass a query URI. Edge cases: requires the AbletonMCPServer Extension to be installed.

lifecycle_statusA

Read Live save/quit API availability and return a GUI-workflow fallback.

Side effects: none. Example: lifecycle_status() reports song_save_available and app_quit_available. Edge cases: missing Live APIs degrade to False flags; never raises.

save_setA

Save the Live Set via Song.save() when exposed, otherwise return a GUI workflow.

Side effects: invokes Song.save() in one undo step when available. Example: save_set(require_api=True) raises when the API is missing. Edge cases: missing API returns a structured GUI workflow response.

quit_abletonB

Save the Live Set (when requested) then schedule Application.quit after a small UI delay.

Side effects: invokes Song.save() and schedules Application.quit. Example: quit_ableton(quit_delay_ticks=5) waits five UI ticks. Edge cases: missing APIs return a structured GUI workflow refusal.

live_fadeA

Interpolate one track's mixer volume to a target value over duration seconds.

Side effects: blocks the Live main thread for up to duration seconds plus steps; first such command in our bridge. Writes mixer_device.volume in one undo step. Example: live_fade(track_index=0, target_percent=0) ramps the first track to silence; live_fade(track_index=0, target_percent=120, allow_over_unity=True) exceeds unity and may clip. Edge cases: rejects duration above 60 seconds and target_percent above 100 without allow_over_unity. Provide exactly one of target_percent or target_value.

scaffold_extensionA

Create a template Ableton Extension project folder.

The scaffold produces an extension that follows the same shape as the repository's own AbletonMCPServer_Extension: it imports @ableton-extensions/sdk, declares dist/extension.js as the package entry in both package.json["main"] and manifest.json["entry"], and bundles via tsx build.ts. Vendor tarballs shipped with the package are copied locally into the new project so local SDK/CLI packages are used during build. In the acceptance report, offline_passed indicates a probe that runs without requiring a connection to Ableton Live.

Side effects: creates files on disk. No Ableton connection required. Example: scaffold_extension("MyEffect", output_directory="/tmp/ext") Edge cases: returns a status="error" JSON when vendor tarballs are missing or output directory is not writable; never raises during disk writes.

build_extensionA

Run a build of an Ableton Extension project.

Side effects: runs npm install and npm run build in the supplied project directory.

Contract (v0.5.1): the JSON document returned by this tool has the following shape::

{
    "status": "built" | "error",
    "entrypoint": "dist/extension.js",
    "entrypoint_exists": true,
    "steps": [
        {"step": "install", "returncode": 0,
         "stdout": "...", "stderr": "..."},
        {"step": "build", "returncode": 0,
         "stdout": "...", "stderr": "..."}
    ],
    "artifacts": ["dist/extension.js", "..."]
}

entrypoint is read from package.json["main"] (falling back to manifest.json["entry"] when main is missing) so the contract reflects the project's own declaration. artifacts is populated when status == "built" and lists every file under dist/ relative to the project root. When the build completes but the declared entrypoint is missing on disk, status flips to "error" and entrypoint_exists is false.

Example: build_extension("/path/to/my-extension") runs npm install then npm run build and returns the JSON document above. Requires Node.js and npm on the host machine. Edge cases: returns {"status": "error", "message": ...} when package.json is missing; never raises during the subprocess execution — every step's returncode is reported in the steps array instead.

analyze_audioA

Compute LUFS-I, true-peak, RMS, and per-band energy summary for a local audio file.

Side effects: reads the file from disk. Example: analyze_audio(path="/stems/kick.wav") returns LUFS-I plus per-band energy summary. Edge cases: missing files and unsupported encodings return a structured {"ok": False, "reason": ...}.

find_frequency_maskingA

Identify frequency bands where target_path exceeds reference_path by threshold_db dB or more.

Side effects: reads both files. Example: find_frequency_masking(target_path=master, reference_path=kick) suggests band-level cuts. Edge cases: mismatched sample rates raise a structured error; identical paths are rejected at the model.

analyze_mixA

Run per-stem analysis and pair-wise masking across up to 16 local audio files.

Side effects: reads each stem from disk. Example: analyze_mix(stems=["/stems/kick.wav", "/stems/bass.wav"]) returns per-stem LUFS plus pair-wise masking scores. Edge cases: more than 16 stems raises a structured error; missing files are reported per-stem via {"ok": False, "reason": ...}.

extract_single_cycleB

Find a candidate single-cycle loop in a local audio file plus its detected pitch.

Side effects: reads the file from disk. Example: extract_single_cycle(path="/stems/kick.wav") returns the detected pitch plus the single-cycle sample buffer. Edge cases: aperiodic content returns {"ok": False, "reason": ...} instead of crashing.

music_generate_drum_grooveA

Generate a deterministic kick-and-hat groove, optionally into a clip.

Side effects: none unless apply is true, which creates one clip and its notes in a single undo step. Example: music_generate_drum_groove(bars=4, seed=7) returns the notes without touching Live. Edge cases: apply without track_index and clip_index is rejected at the model. traits accepts groove, electro, weirdness and space in 0..1, applied in that fixed order; the response names the axes that actually changed the notes under traits_applied.

music_generate_bassA

Generate a deterministic root-only bass line, optionally into a clip.

Side effects: none unless apply is true, which creates one clip and its notes in a single undo step. Example: music_generate_bass(bars=4, seed=7, root_midi=40) returns an E bass line without touching Live. Edge cases: every note is root_midi in some octave, folded back into the MIDI range, octave leaps from weirdness included. traits behaves exactly as it does for the drum groove.

music_plan_productionA

Lay a conventional section grid over a prompt and report what is missing.

Side effects: none; this tool never reaches Live. Example: music_plan_production(prompt="a track at 128 bpm", bars=64) returns six tiled sections plus the resolved tempo. Edge cases: no language model backs this tool. It reads only what the prompt states literally and lists everything else under unresolved instead of inventing it.

groove_searchB

Search the configured immutable groove seed bundle.

Side effects: none; this is an offline deterministic read. Example: groove_search(query="laid back", limit=5). Edge cases: invalid cursors and missing criteria fail before runtime I/O.

groove_evidenceB

Return bounded provenance and projection evidence for one artifact.

Side effects: none; this is an offline deterministic read. Example: groove_evidence(artifact_id="ga1_..."). Edge cases: raw notes, payloads, paths, and SQL are never returned.

groove_generateA

Create a deterministic derived artifact in the local content store.

Side effects: writes only a content-addressed local artifact; never calls Live. Example: groove_generate(source={"artifact_id": "ga1_..."}, transforms={}, bars=4, seed=7). Edge cases: rights, bounds, and unknown transform axes fail explicitly.

groove_compareB

Compare bounded cards and projections without exposing event payloads.

Side effects: none; this is an offline deterministic read. Example: groove_compare(artifact_ids=["ga1_...", "ga1_..."], metrics=["features"]). Edge cases: incompatible projection sets remain explicit in compatibility.

groove_applyB

Preview or explicitly commit one mapped groove to one empty clip slot.

Side effects: preview is offline; commit performs one guarded Live batch. Example: groove_apply(..., mode="preview") returns a bounded receipt. Edge cases: rights, mapping, capability, epoch, and slot races are explicit.

plan_user_journeyA

Plan a capability-aware guided journey as a fixed stage grid.

Side effects: none; the plan names tools but calls none of them. Example: plan_user_journey("sequence_drums", "half time, dark"). Edge cases: identity or exact-copy language returns a clarification request.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.1/5.0

Scored across 97 tools

Disambiguation2/5

Several read/snapshot tools overlap heavily (get_session_overview, get_session_info, get_track_state, take_snapshot, get_composition_structure) and clip/device queries plus analysis/generation tools have nearby scopes. Descriptions help, but at 97 tools an agent will frequently struggle to pick the right one.

Naming Consistency3/5

Names are mostly snake_case, but the set mixes patterns: get_, list_, live_find_, diagnose_, music_generate_, groove_, set_, create_, and a stray diff_snapshots_tool. Readable, yet not a single predictable verb_noun convention.

Tool Count1/5

97 tools is far beyond a well-scoped MCP surface (typical 3-15). Many are niche diagnostics, capability-refusal stubs, or overlapping read helpers, making the server heavy and hard to navigate.

Completeness3/5

Coverage is broad across session/transport, tracks, clips, devices, browser, automation, audio analysis, generation, and extension workflows. However, obvious lifecycle gaps remain: no scene create/delete/rename, no track deletion, and no direct clip-stop operation.

Maintenance

ActivityActive
ResponsivenessNo issues