Skip to main content
Glama

Ableton Live MCP Server (ableton-mcp-server)

A Node.js/TypeScript stdio Model Context Protocol (MCP) server for controlling and querying Ableton Live via a Python Remote Script TCP bridge.

Architecture

+-------------------+      stdio (MCP)      +--------------------+      TCP (JSON)      +--------------------+
|    MCP Client     | <-------------------> | ableton-mcp-server | <------------------> | Ableton Live       |
| (Claude, AGY, etc)|                       | (Node.js/TS)       |    localhost:9877    | (Remote Script)    |
+-------------------+                       +--------------------+                      +--------------------+
  • MCP Transport: Communicates over stdio using @modelcontextprotocol/sdk. Diagnostics and operational logs are strictly directed to stderr to preserve stdout for JSON-RPC frames.

  • Ableton Bridge: Keeps Ableton Live access behind a typed AbletonClient adapter communicating over localhost TCP port 9877 using framed JSON requests.

  • Remote Script: A Python Control Surface script running inside Ableton Live's Python environment (Live 12 or later). Its socket server is pumped by a Live.Base.Timer on Live's main thread, so every command runs on the main thread and answers in about 10 ms (a threaded server answered in 300-600 ms because socket threads only got the GIL when Live called into Python). Commands are registered with a @command decorator, which is the single source of truth for dispatch, undo behaviour and the capability list.

  • Capability Discovery: Queries the running Remote Script's handshake (get_script_info) dynamically at startup to verify supported capabilities and script version.


Related MCP server: ableton-mcp-loopback

Requirements

  • Ableton Live 12 or newer (any edition; some features depend on the edition, see get_capabilities)

  • Node.js 18+ and npm

  • Optional: ffmpeg / ffprobe for audio analyze and bounce


Installation

1. Build the MCP server

From the repository root:

npm install
npm run build

2. Install the Remote Script into Live

Live loads Remote Scripts from a Remote Scripts folder inside your User Library, and the User Library location is configurable. The script is a package (a folder of Python files), so the whole folder has to be copied.

Easiest: npm run deploy. It finds your User Library from Live's own preferences (or from ABLETON_USER_LIBRARY), refuses to write anywhere that doesn't look like a User Library, mirrors remote-script/AbletonMCP/ into Remote Scripts/AbletonMCP/ (removing stale files) and prints the build id. npm run deploy -- --dry-run shows what would change without touching anything, and npm run deploy -- --check compares the build running inside Live with your source.

By hand: in Live open Preferences → Library, note the User Library location, then copy the folder remote-script/AbletonMCP to <User Library>/Remote Scripts/AbletonMCP:

<your User Library>/
└── Remote Scripts/
    └── AbletonMCP/
        ├── __init__.py      (entry point: create_instance, the AbletonMCP class, build id)
        ├── config.py  clock.py  registry.py  helpers.py  curves.py
        └── server.py  session.py  tracks.py  clips.py  devices.py  automation.py  browser.py

A partial copy makes the script fail to import; AbletonMCP then silently disappears from the Control Surface list (the error is in Live's Log.txt). The handshake reports a build_id (a hash of the sources) so a stale or partial deploy is visible: get_health/get_script_info show it.

While developing, npm run hotswap reloads the deployed package inside the running Live without a restart (dev only: only a real restart proves a clean load).

Note: Live scans for Remote Scripts only at launch. Restart Live after installing or updating the script. If the User Library is on an external drive, make sure it is mounted before launching Live. On macOS, the terminal you copy from may need permission to access removable volumes (System Settings → Privacy & Security → Files and Folders).

3. Enable the script in Live

  1. Restart Live.

  2. Open Preferences → Link, Tempo & MIDI.

  3. In a Control Surface slot, choose AbletonMCP.

  4. Set Input and Output to None.

  5. Live shows: AbletonMCP: Listening for commands on port 9877.

4. Register the server with your MCP client

Point your client at the built entry point, dist/index.js in this repo, using an absolute path for your machine.

Claude Code (from the repo root):

claude mcp add ableton -- node "$(pwd)/dist/index.js"

Claude Desktop / other clients (JSON config):

{
  "mcpServers": {
    "ableton": {
      "command": "node",
      "args": ["<absolute path to this repo>/dist/index.js"],
      "env": {
        "ABLETON_HOST": "127.0.0.1",
        "ABLETON_PORT": "9877"
      }
    }
  }
}

For Claude Code, a project .mcp.json in the repo root with "args": ["dist/index.js"] (a relative path) works for sessions started there. The repo does not ship one (it is git-ignored, so each checkout keeps its own).

5. Verify

With Live running and the script enabled, call the get_health tool. It should report the script version and capability list. Live's Log.txt should also contain (AbletonMCP) AbletonMCP initialized.

Configuration

Variable

Default

Purpose

ABLETON_HOST

127.0.0.1

Host of the Remote Script socket

ABLETON_PORT

9877

Port of the Remote Script socket

FFMPEG_PATH / FFPROBE_PATH

on PATH

Binaries used by audio analyze and bounce

Security

The Remote Script listens on localhost:9877 and does not authenticate: any program running on your computer can send it commands, including ones that change or delete things in the open Set. Web pages cannot reach it (the socket expects one raw JSON document, not HTTP), and nothing outside your computer can.

Two commands are powerful enough to be off by default inside Live itself, whoever is calling: eval (runs any Python in Live, used by the developer tools and eval_python) and record (can record over your timeline and clips). They refuse until you create an empty opt-in file, checked on every call, so no restart is needed:

mkdir -p ~/.ableton-mcp-server && touch ~/.ableton-mcp-server/allow_eval      # developers: the live tests and `npm run hotswap` need this
touch ~/.ableton-mcp-server/allow_record                                # only if you want the record tool
rm ~/.ableton-mcp-server/allow_eval                                     # switches it off again

The MCP tools eval_python and record stay hidden unless ABLETON_MCP_ALLOW_EVAL=1 / ABLETON_MCP_ALLOW_RECORD=1 is also set in the MCP server's environment, so an assistant only ever sees them when you turned on both. get_health shows the state of each gate.


Capabilities & Compatibility

Supported Live Versions

  • Live 12 or newer (developed against 12.4). Live's Python API is undocumented and shifts between versions, so npm run test:drift compares the running Live with a committed API dump (see "Live API reference and drift").

  • Group, return and master tracks are inspected safely: properties that do not apply to a track type are reported as unavailable instead of failing.

Available MCP Tools

Most tools take an address (song, tracks/N, tracks/N/slots/M/clip, grooves/N, ...): see "Properties by address". Tools carry MCP risk annotations (read-only, destructive), and every writing call is one undo step.

Area

Tools

Discover

get_health, get_capabilities, describe_set, list_properties, get_device, browse, audio (what is audible now; a clip's file analysis)

Read / change any property

get_properties, set_properties

Structure

create, duplicate, delete (needs expect)

Play and record

transport, launch, history (undo/redo), record (gated)

Mixing and routing

routing (plus set_properties on mixer parameters and track properties)

Measure levels

measure (meters while scenes or clips play), bounce (record a track or the main output and analyze it)

Clips and notes

clip_action, get_notes, write_notes, edit_notes, convert

Many edits at once

batch

Compose

generate_notes, transform_notes

Devices and sound

device_action, load_item, automation (draw, clear, ramp, cancel), get_automation (a clip's envelopes, or an overview of what is automated) (parameters and device properties are written with set_properties)

Development

eval_python (gated by ABLETON_MCP_ALLOW_EVAL=1)

The tool list has a size budget (test/ts/spec.test.ts), so the longest tools (create, clip_action, edit_notes, device_action, automation, audio) carry short descriptions. Call one with help: true for its full rules: the MCP server answers alone and nothing runs.

Earlier versions had one tool per property or action. These were folded into the verbs above (their bridge commands still exist, only the MCP tools were retired to keep the tool list small):

Retired tool

Use instead

get_session_info, get_track_structure, get_bulk_session_structure

describe_set (whole Set), get_properties on song

set_tempo, set_track_name/color/mute/solo/arm, set_clip_name/color, set_scene_name

set_properties (tempo, name, color, mute, solo, arm, ... on song, tracks/N, returns/N, master, clips, scenes)

create_midi_track, create_clip

create (midi_track, midi_clip)

delete_clip

delete (expect guard)

fire_clip, stop_clip, fire_scene, stop_all_clips

launch

start_playback, stop_playback

transport

get_clip_notes, edit_clip_notes

get_notes, write_notes, edit_notes

bulk_edit_clips

batch (create midi_clip + set_properties name/color per clip, one undo step)

get_browser_tree, get_browser_items

browse (list, search)

load_browser_item

load_item (target is an address; loads devices, presets, samples, hot-swaps)

get_track_detail

describe_set (every track, its devices and clips), get_properties, get_device

get_audio_clip_path

get_properties on the clip (file_path, sample_rate, warping, ...)

get_device_parameters

get_device (parameters with addresses, racks with their chains and pads)

set_device_parameter, bulk_set_device_parameters

set_properties on a parameter address (.../parameters/5), items for many at once

Follow actions (emulated)

Live's API has no clip follow actions, so follow_actions emulates them inside Live on the Remote Script's 10 ms timer. set (address of a Session clip, actions: names or {action, weight} chosen by weight each pass among next, previous, first, last, any, other, again, stop, all relative to the clip's own track; after_bars or after_beats, default one pass through the clip) launches the chosen clip when the clip has played that long. It acts only while the transport runs and the clip plays, once per pass, through Live's normal clip launch: Live's launch quantization decides the exact moment (the trigger fires about 40 ms early to catch the grid point; use q_none on the clips or a quantization that matches for tight timing). clear (one clip or all) stops them at once, status lists them. Configurations live in memory only: they are lost when Live restarts or the script reloads, and a deleted clip drops its configuration. Not undoable, not batchable.

Arrangement and recording

  • Timeline clips have addresses like Session clips: tracks/N/arrangement/M in time order (a take lane's clips are tracks/N/take_lanes/K/arrangement/M), so get_properties, set_properties (name, muted, start_time and end_time are readable), get_notes/write_notes/edit_notes, clip_action and delete (with expect) all work on them. describe_set lists each track's timeline (arrangement: index, name, start, length, kind) and it is part of the fingerprint.

  • create: arrangement_midi_clip (address of a track or take lane, time in beats, length default 4), arrangement_audio_clip (address, time, path), take_lane (address of a track). clip_action to_arrangement copies a Session clip onto its track's timeline at time. launch refuses timeline clips (arrangement playback is transport).

  • Arrangement automation is written through Session clips: automation draw on a Session clip, then clip_action to_arrangement. Live turns the envelopes into the track's arrangement automation: they do not stay on the copy (its has_envelopes is false), and the result lists the parameters that are now automated (automation_state 1). The copy is also a normal arrangement clip, so use an otherwise empty scratch clip if you only want the automation. Not in Live's API: splitting, consolidating, moving or resizing timeline clips, comp editing, and time signature or tempo changes on the timeline.

  • record is gated: it needs ABLETON_MCP_ALLOW_RECORD=1 in the MCP server's environment and the opt-in file ~/.ableton-mcp-server/allow_record (see Security), because recording can overwrite the timeline or clip slots. status (default) shows the recording flags and armed tracks; arrangement_start / arrangement_stop, session_start (record_length) / session_stop, overdub, punch and automation change them. Starting refuses unless a track is armed (arm with set_properties arm) and when recording is already on. Live applies these flags a moment after the call, so each response shows the values just set. Arrangement recording starts the transport whatever play says, and while it runs Live also records every playing Session clip onto its own track's timeline, armed or not: arrangement_start warns when that would happen, so stop those clips first. The test suites never switch it on. session_start begins at Live's next launch-quantization boundary, records into the slot of the selected scene, and rounds the length up to that quantization; poll status to follow it. Recording is not undoable step by step and cannot run in a batch. The default test runs only read status; MCP_TEST_RECORD=1 npm run test:live also records a few beats into a scratch MIDI track and removes it.

Audio clips, warp markers and conversions

  • create kind: "audio_clip": address of an empty slot on an audio track and path, an absolute path to an audio file. Live warps it according to its own settings; the result reports length, file_path and warping. Bad or relative paths are refused.

  • Audio clip settings are ordinary clip properties: warping, warp_mode (by name), gain (and gain_display_string), pitch_coarse, pitch_fine, ram_mode, sample_rate, sample_length, available_warp_modes, and warp_markers ([{beat_time, sample_time}], sample time in seconds in the file).

  • clip_action warp actions: add_warp_marker (beat_time; without sample_time it is placed where it changes nothing), move_warp_marker (beat_time of an existing marker, distance in beats: this is how audio is retimed) and remove_warp_marker. Live's messages come through (Cannot add warp marker to an unwarped clip, Segment length out of range).

  • audio action: "analyze" (address of an audio clip): format, integrated LUFS, sample and true peak, RMS and a six-band spectrum of the source file (ffmpeg), next to the clip's settings. curve: true adds momentary and short-term LUFS over time (at most max_points, default 120), their maxima and the loudness range.

  • audio action: "snapshot" (read-only): what is audible now. Per track, return and the master: meters, the Session clip playing, mute, silenced_by_solo, solo, fader, output routing and audible; plus the transport, CPU and notes on why something that plays is silent. address limits it to one track. Meters are Live's units (0.85 = 0 dB, uncalibrated; a return's reads 0): use bounce for loudness.

  • bounce (audible, needs ffmpeg/ffprobe on the MCP host; confirm_playback: true is required): a calibrated measurement of what a track or the main output really plays (curve: true adds the loudness over time). It creates a scratch audio track named MCP BOUNCE, sets its monitoring to Off and its input to source (master, the default, through Resampling, or a track address with channel Post Mixer, Post FX or Pre FX), arms it, launches scene or clips (otherwise it records what is already playing), waits settle_beats after the launch and records beats (default 16, at most 128) into the track's first slot with the launch tool's recording. That slot is empty, so nothing existing can be overwritten and the gated record tool is not involved. It then analyzes the recorded clip like audio analyze (integrated LUFS, sample and true peak, RMS, six-band spectrum), stops what it started, restores the main fader (master_volume lowers it for the run) and deletes the scratch track (keep_track keeps it). The recording stays in the project's Samples/Recorded folder. Use measure to compare many steps quickly and bounce when absolute loudness or the frequency balance matters.

Automation & Ramps

Targets are addresses: a Session clip (tracks/2/slots/0/clip) and a parameter (tracks/2/devices/0/parameters/5, tracks/2/mixer/volume, .../chains/1/devices/0/parameters/3, ...).

  • automation action: "draw": draws a clip envelope from {time, value, curve?} points (beats from clip start, values in the parameter's own units). The default style: "breakpoints" writes real envelope breakpoints: a linear ramp is two of them, smooth/ease curves get one every resolution beats (default 0.25; Live draws straight lines between breakpoints, so it is a smooth curve, not a staircase), and step makes true jumps. Envelopes drawn this way are light and stay editable in Live. style: "steps" writes the older staircase of fine steps. mode: "replace" (default) rebuilds the parameter's envelope; "merge" rewrites only the drawn range and pins the old envelope at both edges, so everything outside stays exactly as it was. hold (default) fills the clip edges. The result includes a readback of Live's stored values.

  • get_automation: with a clip, its envelopes (all, or one parameter) as breakpoints in the parameter's units, a jump reported as jump_from. Without a clip it is the overview: every automated parameter (of the Set, or of address: a track, return or master) with its state (playing, or overridden by a hand or bridge write), and every Session clip carrying envelopes with the parameters they control. Arrangement lanes show as playing; their breakpoints cannot be read.

  • automation action: "clear": one parameter's envelope, or all of them on the clip.

  • automation action: "ramp" (with action: "cancel" to stop one parameter's ramp or all): sweeps a parameter to a target over beats or seconds, driven inside Live at about 100 updates per second (Live's timer resolution is 10 ms). For live gestures; use draw for motion that belongs to a looping clip. A new ramp on the same parameter replaces the old one however it was addressed. cancel stops one parameter's ramp, or all of them. Ramps are not undoable and cannot run inside a batch (in a batch only the draw and clear actions of automation are allowed).

  • device_action re_enable_automation hands a parameter that was overridden (automation_state 2) back to its clip automation, or every parameter when the address is song. Any write to a parameter while its clip automation is playing overrides it, by hand or through the bridge (set_properties, a ramp), so re-enable it afterwards if the automation should keep control.

Limits from Live's API: envelopes exist only on Session clips (not arrangement clips), only for parameters on the clip's own track, and Live ignores the curve (control) coefficients of an envelope event, so curves are approximated by breakpoints. The bridge still accepts the older track_index/clip_index/device_index argument forms.

Properties by address

get_properties, set_properties and list_properties read and write about a hundred and fifty properties of the Song, tracks, scenes, clip slots, clips, grooves, cue points and the application through one address grammar instead of one tool per property:

  • Addresses: song, master, tracks/N, returns/N, scenes/N, tracks/N/slots/M (clip slot), tracks/N/slots/M/clip and grooves/N (the groove pool), cue_points/N (in time order) and app (the Live application); indices are 0-based. A name selector works wherever a number does: tracks/name:Drift, scenes/name:Verse (exact match; several matches is an AMBIGUOUS error listing the indices).

  • Strict values: booleans must be true/false, integers whole numbers, enums are given by name ("launch_mode": "gate"; list_properties shows the valid names and ranges). Wrong types are TYPE_ERROR, out-of-range values OUT_OF_RANGE, unknown or read-only properties are refused.

  • Interdependent properties (loop_start/loop_end, ...) can be set together in any order, and a call is all-or-nothing: if one write fails, the others are restored.

  • list_properties shows every curated property with its type, range and enum names, plus not_exposed: the properties Live's API has on that class that this server does not expose yet (from the generated registry, see "Live API reference and drift").

  • get_properties without names reads everything readable; properties that do not apply to that object (audio-only ones on a MIDI clip, arm on a return track) are listed under unavailable.

  • set_properties with items changes several objects in one call. expect: {"name": "Drift"} refuses to write if the object is not the one you meant (index drift after deletes).

  • Virtual mixer properties on tracks: volume and panning (device values; volume 0.85 is 0 dB). The master also has crossfader (-1 A to 1 B) and cue_volume, and its mixer parameters are addressable too (master/mixer/crossfader, master/mixer/cue_volume). An unset scene tempo or time_signature_numerator reads as -1.

  • A parameter can be set by what it shows. set_properties on a parameter takes value (raw, within min..max, or a label for a quantized one) or display: the text Live shows ("35 Hz", "1.5 kHz", "-26 dB", "129 ms", "4.00 : 1", or a label such as "Low pass"). Live has no inverse of its display formatting, so the script searches by bisection and keeps the nearest displayable value; the precision you write is the precision that must match ("35 Hz" accepts 34.6 Hz, "-26.10 dB" needs two decimals right). A text in another unit, one outside the parameter's displayed range, or one the display cannot show ("4.001 : 1") is refused with the nearest option in details, never rounded silently. value and display together are refused. The result reports the display before and after.

Views: selection and window state

UI state, never part of the describe_set fingerprint. Read and written with the property tools:

Address

Properties

view

selected_track, selected_scene, highlighted_clip_slot, detail_clip, selected_chain, selected_device, selected_parameter (read-only), follow_song, draw_mode

app/view

focused_document_view (Session or Arranger: brings it forward), visible_views, available_views, browse_mode (read-only)

<track>/view (also returns/N, master)

is_collapsed, selected_device (read-only)

<clip>/view (Session or arrangement)

grid_quantization (by name), grid_is_triplet

<device>/view

is_collapsed; racks is_showing_chain_devices, selected_chain; Drum Racks selected_drum_pad, drum_pads_scroll_position; EQ Eight selected_band; Simpler selected_slice and the read-only modulated sample_* positions

Selections are addresses of the right kind; selected_device goes through Live's select_device. Writing moves what the user sees, and so do create, load_item and device_action insert; both live suites restore it. Not built: showing, hiding and zooming panels, the Detail pane's tab, select_instrument.

Launching and clip actions

  • launch: address is a clip slot or clip (fire starts the clip, or the slot's stop button when it is empty; stop), a scene (fire only), a track (stop: all its clips) or song (stop: all clips, transport keeps running). Slot options: quantization (launch quantization for this launch, e.g. q_no_q, q_bar), legato, and record_length (beats; empty slots only, Live refuses it on a slot that holds a clip). Scenes take legato and select. Stops take quantized (default true; false stops at once: Live's slot stop always waits for the next bar, so it goes through the track). Launching never changes the Set's content, but firing a scene also triggers the stop buttons of empty slots, which stops whatever is playing on those tracks.

  • Holding a fire button. fire is a click, so a gate-mode clip it starts is never released. hold: true presses the button of a slot, clip or scene and hold: false releases it (also ending a gate clip a plain fire started). Gate clips play while held; trigger, toggle and repeat clips keep playing after release. A hold takes no other launch option, releases itself after hold_seconds or hold_beats (default and maximum 120 s, timed on the 10 ms pump) and is refused if already held. Stopping the script releases every hold; a hot-swap keeps them.

  • clip_action (destructive, one undo step): crop, duplicate_loop (MIDI), quantize (grid by name, e.g. rec_q_sixtenth; amount 0-1; aligns warp markers on audio clips), quantize_pitch (one pitch, MIDI), scrub/stop_scrub, move_playing_pos. expect: {"name": ...} refuses to act on the wrong clip. Live's own error messages come through unchanged.

  • Grooves: grooves/N addresses the groove pool (get_properties/set_properties: name, base grid, timing/quantization/random/velocity amounts, in percent). A clip's groove property reads and writes as a groove address. Live reports a groove for every clip (a fresh clip in a one-groove pool reported that groove) and rejects None, so an assignment cannot be cleared, grooves are shared objects (changing one changes every clip that uses it), and the API cannot add grooves to the pool.

Notes

  • get_notes: every field Live stores for each note (id, pitch, start_time, duration in beats, velocity 1-127, mute, probability 0-1, velocity_deviation -127..127, release_velocity 0-127), sorted by time then pitch. Filter by range (from_time/time_span/from_pitch/pitch_span), ids or selected; limit (default 2000) caps the answer and truncated says if more exist. MIDI clips only.

  • write_notes: additive. Every note is validated before anything is written, so one bad note rejects the whole call (max 5000 notes). Returns the new ids and the clip's real note_count: Live never lets notes of one pitch overlap, so a new note shortens an earlier note that runs into it and one at exactly the same start time replaces it.

  • edit_notes (destructive, one undo step): modify (changes: [{id, ...fields}] or ids + set; goes through Live's apply_note_modifications, which keeps note ids and per-note events), remove (exactly one of ids, a range, all: true), replace (swap the notes in a range, or all, for notes in one step; if Live refuses the new notes the old ones are put back), duplicate (ids, destination_time, transposition), duplicate_region, select (ids, all, none). Ids that are not in the clip are refused (NOT_FOUND) with nothing changed.

Composition: generate_notes and transform_notes

The music logic is pure TypeScript in src/music (no Live needed to test it); the two tools read notes, run it, and write the result back in one undo step. Times are beats (quarter notes); rates are numbers or strings like 1/16, 1/8t (triplet), 1/4d (dotted); keys are text like C minor, F# dorian, Bb major pentatonic; pitches are numbers or Ableton note names (C3 = 60); seed makes random choices repeatable. Every call accepts dry_run (preview only) and expect (clip name guard), and unknown parameters are refused.

  • generate_notes (address of a MIDI clip, generator, params, start_time, mode): euclidean (evenly spread hits, with layers for several drums), drum_pattern (step strings per drum: x hit, X accent, o ghost, . rest), chord_progression (roman numerals in a key, or chord symbols like Am7; voice leading, voicings, block/strum/arp/pulse/offbeat styles, optional bass), bassline (follows the chords: root, root+fifth, octaves, walking), melody (seeded random walk inside a scale with contour, rests and a tonic resolution), scale_run, random_notes. mode is add (default), replace_span or replace_all. If the music runs past the clip's loop end the result carries a warning.

  • transform_notes (address, transform, params, optional selection by range from_time/time_span/from_pitch/pitch_span or by ids): in-place transforms keep note ids and per-note settings (transpose by semitones or scale degrees, fit_to_scale, invert, reverse, stretch, shift, humanize, swing, quantize, legato, gate, velocity_shape, strum, recombine); rebuilds replace the selected range in one atomic step (arpeggiate, chop, trill); additions keep the notes and add more (stack, grace_notes, repeat). A transform that would push notes outside 0-127 or before beat 0 refuses and changes nothing.

  • Call either tool with transform: "help" / generator: "help" (no clip needed) for every entry's kind and parameters. npm run test:scenarios composes, transforms, undoes and cleans up on a scratch track through MCP only.

Devices, racks and parameters

Devices, rack chains, drum pads and parameters have addresses under a track (tracks/N, returns/N or master):

  • tracks/3/devices/0 (or devices/name:EQ Eight), then /parameters/5 (or parameters/name:Frequency), /chains/1/devices/2 (racks nest as deep as they go), /return_chains/0, /drum_pads/36 (by MIDI note) and /drum_pads/36/chains/0/devices/0. Mixers are parameters too: tracks/3/mixer/volume, mixer/panning, mixer/sends/0, and chains/1/mixer/volume.

  • get_device reads a device with every parameter (index, address, value, min, max, display, default, labels for quantized ones) and, for racks, chains, return chains, occupied drum pads and macro state. changed_only: true lists only the parameters that are not at their default (a quantized parameter has no readable default and is always listed) and names only the parameters you name; parameter_count is always the total.

  • set_properties writes a parameter's value, checked against that parameter's own range (OUT_OF_RANGE); a quantized parameter also takes its label ("value": "Low-pass"); disabled or macro-mapped parameters refuse (UNAVAILABLE); items writes many parameters (or anything else) in one call. Devices have name, on (the Device On switch), collapsed, is_using_compare_preset_b and rack state; chains have name, color, mute, solo, volume, panning; pads mute and solo (Live ignores those on an empty pad, and the result shows what Live holds). Drum Rack chains also have choke_group 0-16, in_note and out_note 0-127; in_note moves the chain to another pad, so its drum_pads/N/chains/M address changes. A CC Control's targets (custom_float_target_0..11, custom_bool_target) take a controller name such as "1: Modulation Wheel".

  • device_action: insert (name as in Live's browser, position; Live's own refusals such as "Insert audio effects after instruments" come through), delete (needs expect: {"name"}), duplicate, move (to another track or chain; returns where it landed), save_ab, and rack actions insert_chain, add_macro, remove_macro, randomize_macros, store_variation, recall_variation and delete_variation (by index: Live silently does nothing when no variation is selected, so the tool refuses instead), copy_pad, clear_pad (needs expect). Each call is one undo step. A device chain holds one instrument, and Live refuses to duplicate instruments.

  • Device-specific properties and methods. Simpler, Wavetable, Drift, Meld, Eq Eight, Looper, Hybrid Reverb, Roar, Spectral Resonator, Shifter, Drum Cell, CC Control and plug-ins have their own API classes. Their properties are built from the generated registry (exactly what Live offers, and they follow Live updates): integers that Live documents as an enum take its names (playback_mode: "one_shot", unison_mode: "classic"), X_index + X_list pairs become one property X that takes the label the device shows (voice_mode: "Unison", oscillator_1_wavetable: "Vowels"; the labels are in X_options, read on request because they can be long), and everything else is a plain typed property. get_device has a specific block (class, property names, callable methods) and, for a Simpler, its sample; list_properties with the device address shows the values.

  • A Simpler's sample is addressed as <device>/sample (start_marker, end_marker, gain, warping, warp_mode, slicing_style and the slicing settings, slices, ...).

  • device_action call runs one of the listed methods with typed arguments (method, args; parameters and clip slots are given as addresses, a Wavetable modulation source by name): Simpler crop, reverse, warp_as, warp_double, warp_half, guess_playback_length, replace_sample (absolute path); its sample insert_slice, move_slice, remove_slice, clear_slices, reset_slices; Looper record, overdub, play, stop, clear, undo, double_length, half_length, double_speed, half_speed, export_to_clip_slot; Wavetable add_parameter_to_modulation_matrix, set_modulation_value, get_modulation_value, is_parameter_modulatable. Compressor side-chains are routed with routing.

  • Not in Live's API: deleting a rack chain, loading a preset file from disk by its path (browse to it and use load_item), plugin parameters beyond those Live has configured.

Browser: browse and load_item

  • browse action: "list" (default): path like instruments/Drift/Bass (no path lists the roots), kind (all, folders, loadable, devices), paged with limit and offset; every item carries its path, uri and flags. Names ignore case and the path is returned canonically; a wrong name lists similar ones.

  • action: "search": Live has no browser search, so the MCP server builds an index the first time (a few seconds: the Remote Script's browser_walk visits the browser in ~20 ms slices, so Live stays responsive) and keeps it until refresh: true or a restart. query words must all appear in an item's path (drift bass sub); results are ranked with exact and prefix name matches first. Default roots: instruments, audio_effects, midi_effects, drums, sounds, max_for_live, user_library, packs. The big sample libraries and a few other roots (samples, clips, plugins, current_project) are not in the default set: name them in roots to index them. The roots also include user_folders (the folders in Live's sidebar), colors (Favorites) and legacy_libraries; name them in roots to index them (a library can hold tens of thousands of files). action: "index" builds it explicitly.

  • load_item: path (or uri: fast when the index knows it, otherwise a slow walk) and target: a track/return/master (loads an instrument, effect or preset and returns the addresses of the devices it added), a clip slot (loads a sample), or a device (hot-swap: replaces it). Loading selects the target in Live's window and is one undo step; it is batchable. action: "preview" plays an item on the preview channel (audible) and "stop_preview" stops it. Paths can repeat when Live has two items with one name in a folder (the first wins): use the uri from the result for those.

Mixing and routing

  • Mixer parameters are addressable like any parameter: tracks/N/mixer/volume, mixer/panning, mixer/sends/M, mixer/track_activator, mixer/left_split_stereo and right_split_stereo, and on the master master/mixer/crossfader, cue_volume and song_tempo; chains have their own (.../chains/1/mixer/volume). Tracks also take volume and panning directly, plus crossfade_assign (A, NONE, B), panning_mode (stereo, stereo_split) and current_monitoring_state.

  • routing: address is a track, return track, master, or a device with a side-chain (a Compressor); direction is input or output. get returns the current type and channel and every available type and channel by the display names the mixer shows (Ext. In, Main, Resampling, a track's name). set takes type and/or channel by those names; Live only offers valid choices, so it cannot create a routing loop through this call. Feedback guard: routing a track's input from the master or from resampling while its monitoring is not Off refuses (GUARD_FAILED) unless allow_feedback: true. Resampling: the bounce tool does this for you (scratch track, monitoring Off, input Resampling, record, analyze, remove). The available_types / available_channels lists can be long (a Drum Rack track offers every pad, at each of Pre FX, Post FX and Post Mixer, as a sidechain source): filter keeps only the names that contain a text, include_available: false leaves the lists out (then only their counts are reported), and set leaves them out unless include_available: true.

  • Track delay and solo/cue mode are not in Live's API.

Batches

batch runs several tool calls (ops: [{tool, args}], up to 100) as one round trip and one undo step on Live's main thread, so history undo reverts all of it (see the parameter quirk below) and the user never sees a half-built Set. Later ops can use earlier results: "$0.address" is the address op 0 returned (a whole-string reference keeps its type; inside a longer string it is inserted as text; $1.ids[0] indexes lists), e.g. create a track, then insert a device into $0.address. Arguments are validated in TypeScript before anything is sent (references pass for any type). on_error: "stop" (default) leaves ops that already ran applied as one undo step and skips the rest; "continue" runs everything. A failure comes back as BATCH_FAILED with the outcome of every op. Not batchable: transport, launch, history, the ramp and cancel actions of automation (draw and clear are batchable), follow_actions, record (not undoable edits), transform_notes, generate_notes (they combine calls themselves) and the older browser tools. A failed batch is reported, not rolled back automatically (Live's undo cannot be tried out from outside without touching the user's own history): use history undo deliberately. One Live quirk to know: device parameter writes are always their own undo entries, even inside a batch, so a batch that writes k parameter values needs k+1 undos to revert (the same holds for set_properties with several parameters in items). history returns what each undo reverted.

Set structure, capabilities, transport and history

  • describe_set: a compact map of the whole Set (song settings, every track/return/master with address, kind, mixer state, devices and clips, every scene). Each track has a hash, and the Set a fingerprint, that change only when the Set really changes (playhead, play state and meters are ignored), so a client can detect edits by comparing fingerprints and see which track changed by comparing hashes. The hashes also see edits that are not listed in the output: every MIDI note field (each MIDI clip lists a notes_hash, so a transpose is caught even though the note count stays the same), clip launch mode and quantization, loop and start/end markers, warp, gain, pitch and groove, track sends, crossfader assignment, input/output routing, devices switched off, slots without a stop button, and the global launch quantization (song.clip_trigger_quantization). Device and macro parameter values are not hashed because automation moves them during playback. include_clips: false gives a lighter summary. The live test suite uses the fingerprint as an invariant: it must be identical before and after a run. include_scenes: false replaces the per-scene list by scene_count and scenes_with_settings (scenes that have a name, a tempo or a time signature; the fingerprint still covers every scene), which saves thousands of tokens on a Set with dozens of scenes. The master also reports its crossfader and crossfader_display; the position is performance state like the tempo and is not hashed.

  • get_capabilities: script version and build id, Live version/variant, unavailable features and feature probes (Max for Live, Conversions, note probabilities, Suite devices such as Meld/Roar). A beta build reports variant Beta and edition unknown (the edition is not readable), so rely on features.

  • transport: play, continue, stop, stop_all_clips, tap_tempo, jump_by (amount in beats), next_cue/prev_cue, toggle_cue (adds or removes a cue point at the playhead while playing, at the arrangement insert marker while stopped), capture_midi, capture_and_insert_scene. Returns the resulting transport state. Change tempo or loop settings with set_properties on song.

  • history: undo/redo (steps 1-50). It is flagged destructive because undo is global and also reverts edits made by hand.

Creating, duplicating and deleting

  • create: kind is audio_track, midi_track, return_track (always appended), scene, midi_clip (address of an empty clip slot, length in beats, default 4), audio_clip, arrangement_midi_clip, arrangement_audio_clip or take_lane (see the tool for their addresses); optional index (0-based insertion position, -1 appends), name and color. Returns the new object's address. Live snaps colours to its palette, so the result reports the colour it actually applied.

  • duplicate: a regular track (tracks/N, with devices and clips), a scene, or a clip slot (tracks/N/slots/M); the copy lands right after the source and the new address is returned. For a clip slot, to copies the clip into another empty slot (any scene, or another track of the same type); an occupied destination is refused, because Live would replace it silently. Return tracks and the master cannot be duplicated.

  • delete (destructive): a track, return track, scene or clip. expect: {"name": ...} is mandatory: indices shift after every create/delete, and a stale index is exactly how the wrong object gets removed, so the call is refused (GUARD_FAILED) when the object's current name differs. The master cannot be deleted, and a Set always keeps at least one scene. Each call is one undo step, and history undo brings a deleted object back.

  • Cue points can be read (cue_points/N, listed by describe_set and part of its fingerprint), renamed with set_properties and jumped to with launch. They cannot be created or deleted at a chosen time: Live's set_or_delete_cue acts at the arrangement insert marker, which only the user controls, so create/delete refuse with UNAVAILABLE. transport toggle_cue calls it as is (at the playhead while playing, at the insert marker while stopped).

  • Read-only state you can watch: app (average_process_usage, peak_process_usage, open dialogs), Song recording/count-in/Link/tempo-follower flags, track meters, clip slot playing_status. Recording and network toggles (record_mode, session_record, Link) are read-only here on purpose: they belong to the gated record tools.

  • Live renumbers default track names when tracks are inserted or removed ("12-Acid..." becomes "13-Acid..."), so re-read addresses after structural changes instead of caching them.

Addressing: track types, racks and parameter details

The Remote Script still accepts the older track-number argument forms on its commands (its tests use them); every MCP tool takes addresses:

  • track_type: "track" (default), "return" (track_index counts return tracks) or "master" (track_index is ignored; pass 0). The master and return tracks can hold devices, so they can be read, loaded onto, set, ramped and mixed like any other. Clip automation is not available on them (they have no clips). Live prefixes return track names with their letter (A-Reverb), so write the bare name when renaming.

  • device_path: reaches devices inside racks. It alternates device and chain selectors and ends on a device index, e.g. [0, 2, 1] is device 1 in chain 2 of the rack at device 0. A chain selector is a chain index, {"pad": 36} (or {"pad": 36, "chain": 1}) for a drum pad, or {"return": 0} for a return chain. Use it instead of device_index.

get_device lists, for each parameter: index, name, value, min, max, is_quantized, is_enabled, the display string Live shows ("14.2 kHz"), a default for continuous parameters and value_items labels for quantized ones (Filter Type 0 is "Low-pass"). For a rack it also lists its chains, return_chains and occupied drum_pads, so you can see what a device_path can reach; every entry carries its address.

Not covered: device properties Live keeps outside parameters (Wavetable's oscillator wavetable selection, Drift's mod matrix, unison and voice modes), and VST/AU plugin parameters beyond the ones Live has configured.

Development

  • introspect_api (bridge command, no MCP tool): without module, returns the running Live's version and the API module list; with module, describes every class in it (properties with getter/setter types, method signatures, listeners, enums). It reads class-level descriptors only, so it cannot change the Set. It feeds npm run dump-api.

  • eval_python: Evaluate raw Python on the Remote Script instance. Executes arbitrary code inside Live, so the tool is hidden and refused unless ABLETON_MCP_ALLOW_EVAL=1 is set in the MCP server's environment (set it in your MCP config's env for development) and the opt-in file ~/.ableton-mcp-server/allow_eval exists (see Security). Failures come back as errors, not success strings.


Troubleshooting

Errors, timing and undo

  • Every bridge response carries elapsed_ms (time spent inside Live). Errors carry a stable code: OUT_OF_RANGE, NOT_FOUND, INVALID_ARGUMENT, TYPE_ERROR, LIVE_ERROR (Live itself refused), UNKNOWN_COMMAND, INVALID_REQUEST, INTERNAL_ERROR. The Node client exposes it as error.bridgeCode.

  • Every writing command runs in its own undo step, so one undo in Live reverts exactly one tool call. (Without explicit steps Live coalesces all API edits into a single giant step.) Read-only and no-op commands add no undo entries. One exception: Live records a track rename as its own undo entry even inside a grouped call, so undoing a set_properties that renames a track can take two undos (clip and scene renames group normally). Ramps run outside any step and each becomes one undo step of its own.

Audio Analysis Requirements

  • Install ffmpeg and ffprobe on the machine running the MCP server. Set FFMPEG_PATH and FFPROBE_PATH if they are not on PATH.

  • The MCP host must be able to read the same source-file path reported by Ableton Live. Analysis reads the first 60 seconds for signal statistics and frequency bands; integrated loudness is measured across the full file.

  • Not decodable by ffmpeg, so these return an "unsupported source" error: Ableton-compressed .aif files (Live pack samples, AIFF-C codec able) and REX files (.rx2). Analyze a WAV or uncompressed AIFF instead.

  • Audio analysis is local DSP and file metadata only. It does not provide AI instrument recognition, transcription, key detection, or tempo estimation.

  1. Slow responses (hundreds of milliseconds per call): the timer-pumped server answers in about 10 ms. If calls are much slower, the Remote Script in your User Library is probably an older version (the log line Server started on port 9877 (timer pump, 10 ms) confirms the new one) or your Live is older than Live 12 (Live.Base.Timer is required; the log then says "AbletonMCP requires Live 12 or later"). Run npm run deploy -- --check, then npm run deploy and restart Live.

  2. AbletonMCP is not listed under Control Surface:

    • Live only reads the User Library configured in Preferences → Library. Confirm the script is in that library's Remote Scripts/AbletonMCP/__init__.py, not a different one.

    • Confirm the User Library drive is mounted, then restart Live.

    • Check Log.txt (in Live's preferences folder) for RemoteScriptError entries mentioning AbletonMCP.

  3. Connection Refused (127.0.0.1:9877):

    • Ensure Ableton Live is open and AbletonMCP is selected as an active Control Surface in Live Preferences.

    • Check if port 9877 is blocked by firewall or in use by another application.

  4. Unsupported Capability Errors:

    • The MCP server queries get_script_info on startup. If a tool requires a Remote Script command that is missing, it returns a clear unsupported-capability error. Run npm run deploy (it copies the whole remote-script/AbletonMCP package into your User Library) and restart Live.

  5. Group Track Errors:

    • Group tracks and Master/Return tracks do not have arm buttons. The AbletonMCP script handles arm state safely via can_be_armed checks.


What Live's API cannot do

See docs/beyond-the-api.md for the verdicts: what is emulated here (follow actions, arrangement automation, browser search, bounce by resampling) and what is simply not available (export, save, grouping, freeze, MIDI clock and key mapping).


Testing

npm test            # offline: Remote Script logic against a mocked Live API (no Live needed)
npm run test:live   # integration: a running Live with AbletonMCP enabled
npm run test:mcp    # MCP layer: tool schemas, handlers and errors over stdio (needs Live)
npm run test:scenarios  # end-to-end composition scenario through MCP tools only (needs Live)

The live and MCP suites work on your open Set: everything they create is named MCP TEST ... and removed again, and the run fails if the Set's fingerprint or what is playing (transport, tempo, playhead when stopped, playing clips) differs afterwards. They run with the transport stopped or playing. A check that cannot run on your Set (no audio clip, an empty groove pool, ...) or in the current transport state is reported as skipped, not passed, and listed at the end; MCP_TEST_STRICT=1 npm run test:live turns skips for missing Set content into failures, so you know every check really ran.

Live API reference and drift

Live's Python API is undocumented and changes between versions (a beta most of all), so the repo keeps a machine-readable copy and checks it:

npm run dump-api         # write docs/live-api/<live version>.json from the running Live (243 KB, sorted, diff-friendly)
npm run build-registry   # regenerate remote-script/AbletonMCP/registry_data.json from the newest dump (-- --check to verify)
npm run test:drift       # compare the running Live with the committed dump; exit 1 and list added/removed/changed entries

registry_data.json ships inside the Remote Script: it records, for the Song, Track, Scene, ClipSlot and Clip classes, the type Live reports for every property's getter and setter, plus the enum tables the property table refers to. The offline tests check the hand-written property table against it (a property must exist, be writable when we say so, and have a compatible type) and generate fakes from it that behave like Boost.Python (a wrong setter type raises), so every writable property gets an automatic set/read-back. After a Live update, run npm run test:drift; on drift, review the list, run dump-api and build-registry, fix any property the offline tests now flag, and commit the new dump.

The live suites use a scratch clip on a MIDI track with a device, restore every parameter they touch, and delete what they create. Run them with the transport playing to include the check that Live's parameter follows a drawn envelope during playback. Audio will briefly change while they run.


How to Add a New Live-Side Command

  1. Implement it in the matching module under remote-script/AbletonMCP/ (session.py, tracks.py, clips.py, devices.py, automation.py, browser.py; each is a mixin class on AbletonMCP). Write the implementation as a method that raises on failure (ValueError, IndexError, ...; the dispatcher turns them into coded error responses).

  2. Register a thin adapter with @command in the same class:

    @command("my_new_feature", writes=True)          # writes=True: runs in its own undo step; destructive=True flags deletes
    def _cmd_my_new_feature(self, params):
        return self._my_new_feature(params.get("track_index", 0))

    The registry drives dispatch, undo wrapping and the capability list (no other list to update). Everything runs on Live's main thread, so keep handlers quick: a slow one blocks Live.

  3. Add the MCP tool: a definition in src/tools/definitions.ts (with requiredCapability: 'my_new_feature'), a case in src/tools/handlers.ts that calls this.client.sendCommand('my_new_feature', {...}), and types in src/types/ableton.ts if needed. Keep the description to what a first call needs and put the long form in the spec's help (declare help: HELP_ARG in the schema): the size budget leaves little room.

  4. Test it: offline (test/remote_script_test.py, extend the fakes), live (test/live-integration.mjs, with cleanup) and MCP (test/mcp-tools.mjs).

  5. Build and deploy: npm run build && npm run deploy, restart Live (or npm run hotswap while iterating).


License

MIT License. See LICENSE for details.

Available Tools

32 tools
analyze_audio_clipA
Read-onlyIdempotent

Analyze the source file of an audio clip (address: 'tracks/N/slots/M/clip') locally with ffmpeg: format metadata, integrated loudness (LUFS), sample and true peak, RMS and an approximate six-band frequency profile, next to the clip's own settings (warping, gain, pitch). Needs ffmpeg and ffprobe on the MCP host. Compressed Ableton .aif files and REX files cannot be analyzed and say so.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesAn audio clip, e.g. 'tracks/2/slots/0/clip'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds real behavioral value beyond that: execution happens locally on the MCP host, there is an external binary dependency, and two specific file classes fail with a message. It does not describe cost or latency for long files, which keeps it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence, but it is front-loaded with the core action and the analysis list before the dependency and failure caveats. The output enumeration is long, though each item is meaningful rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden, and it does so thoroughly by naming the measurements returned alongside the clip's own settings (warping, gain, pitch). Prerequisites and known failure modes are included, leaving nothing an agent needs to call it correctly out of scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage and a single required parameter already documented with an example ('tracks/2/slots/0/clip'), the baseline is 3. The description's inline 'tracks/N/slots/M/clip' restates the same path shape without adding new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Analyze) plus resource (source file of an audio clip) and an explicit enumeration of what is extracted: format metadata, LUFS, sample/true peak, RMS, six-band frequency profile. It also distinguishes itself from sibling read tools (get_properties, clip_action) by making clear it inspects the underlying source file rather than the clip's Live settings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition (ffmpeg and ffprobe must exist on the MCP host) and explicit exclusions (compressed Ableton .aif and REX files cannot be analyzed and report so). It does not name a sibling alternative for the unsupported formats, but the when/when-not conditions are unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batchA
Destructive

Run several tools in ONE round trip and ONE undo step (history undo reverts all of it; Live records each device parameter write as its own extra undo entry). ops: [{tool, args}] with each tool's usual arguments, run in order on Live's main thread. Later ops can use earlier results: '$0.address' is the address op 0 returned (a whole-string reference keeps its type, e.g. a number; inside a longer string it is inserted as text; '$1.ids[0]' indexes lists). Example: [{tool:'create',args:{kind:'midi_track',name:'Bass'}},{tool:'device_action',args:{action:'insert',address:'$0.address',name:'Drift'}}]. on_error: stop (default; ops already applied stay applied as one undo step, later ones do not run) or continue. A failure returns BATCH_FAILED with every op's outcome. Up to 100 ops. Batchable tools: get_properties, set_properties, list_properties, describe_set, get_capabilities, get_notes, get_device, create, duplicate, delete, write_notes, edit_notes, clip_action, device_action, routing, draw_automation, get_automation, clear_automation, load_item. Not batchable: transport, launch, history, ramp_parameter, cancel_ramps, record, follow_actions (not undoable edits), transform_notes, generate_notes, browse, analyze_audio_clip and convert (they combine calls or wait).

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesThe calls, in order
on_errorNoDefault stop

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructive/idempotent annotations by disclosing undo semantics (history undo reverts all; device parameter writes create extra entries), execution order on the main thread, on_error stop/continue behavior, partial-application consequences, the 100-op cap, and the BATCH_FAILED outcome shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and undo constraint are front-loaded, followed by ops format, references, example, error policy, and capability lists. Dense but nearly every clause carries required information; the batchable/not-batchable lists are long yet load-bearing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still documents the failure response (BATCH_FAILED with every op's outcome), execution ordering, reference resolution, and limits. An agent has everything needed to construct a valid batch and predict behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the '$N.field' reference syntax, type preservation for whole-string refs, list indexing, and on_error default/continue semantics. This meaningfully extends the schema's terse field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+benefit: run several tools in one round trip and one undo step. It clearly distinguishes batch orchestration from the individual sibling tools and explains the scoping (undo granularity) that makes it unique.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly lists which tools are batchable and which are not, with reasons (e.g. not undoable edits, they combine calls or wait). An agent can decide membership and routing without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browseA
Read-onlyIdempotent

Explore and search Live's browser (instruments, presets, effects, drum kits, packs, user library...). action list (default): path like 'instruments/Drift/Bass' (no path lists the roots), kind all|folders|loadable|devices, paged with limit (default 100) and offset; every item has a path to browse deeper or load. search: query words (all must appear in the item's path, e.g. 'drift bass sub') over the preset and device names of roots (default: instruments, audio_effects, midi_effects, drums, sounds, max_for_live, user_library, packs); kind loadable (default), devices or folders; ranked with exact and prefix name matches first. The first search builds an index by walking the browser in short slices (a few seconds, Live stays responsive) and keeps it until refresh: true; the big sample libraries ('samples', 'clips') are only indexed if you name them in roots. index: (re)build the index for roots. Load what you find with load_item.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNolist: filter (default all); search: default loadable
pathNolist: 'root/folder/item'; omit to list roots
limitNolist: page size (default 100); search: results (default 25)
queryNosearch: words that must all appear in the item path
rootsNosearch/index: browser roots to cover
actionNoDefault list
offsetNolist: page start
refreshNosearch: rebuild the index first

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe, idempotent read, and the description goes well beyond them: it explains index-building on first search (short slices, a few seconds, Live stays responsive), cache persistence until refresh:true, and that heavy sample libraries are only indexed when named. The only minor gap is that refresh:true invalidation semantics could be slightly crisper.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then densely packs mode behavior into a single semicolon-structured paragraph with no filler. It is long, but each clause carries actionable detail; slight tightening of the index/search phrasing would help readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of explaining returns: paged items each with a path, ranked results with exact and prefix matches first. It is nearly complete; only the index action's own return and search result shape beyond ranking are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: concrete path examples ('instruments/Drift/Bass'), per-action kind defaults, the differing limit defaults (100 list vs 25 search), the default root set, and that every item carries a path for deeper browsing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs and resource: explore/search Live's browser, and enumerates the browsable content (instruments, presets, effects, drum kits, packs, user library). It distinguishes itself from siblings by routing load actions to load_item, so an agent can tell it apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers the three modes (list default, search, index), the defaults that select each, and names load_item as the tool to use once a path is found. Nothing about when to pick each mode is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_rampsA
Idempotent

Cancel the ramp on one parameter, or every active ramp when no parameter is given. The parameter stays wherever the ramp had taken it.

ParametersJSON Schema
NameRequiredDescriptionDefault
parameterNoParameter address; omit to cancel all

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, idempotent, non-destructive, and the description is consistent with that. It adds genuinely useful context beyond the annotations: 'The parameter stays wherever the ramp had taken it,' meaning cancellation freezes the current value rather than reverting it — an important behavioral detail for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences, front-loaded with the action and scope, with no wasted clauses. Both sentences carry information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, no-output-schema tool whose annotations cover idempotency and destructiveness, the description is nearly complete: it covers scope and post-cancellation state. It could note whether the parameter must currently have an active ramp, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter, and the schema already states 'omit to cancel all'. The description reiterates that semantics but adds no syntax or format detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (cancel) and resource (ramp) and defines the scope precisely: one parameter's ramp, or all active ramps when omitted. The distinction from the sibling ramp_parameter is inferable (cancel vs. create) but never named explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage via the omit-to-cancel-all rule, which tells the agent when to pass the parameter and when not to. It does not name an alternative tool (e.g. ramp_parameter) or state prerequisites, so guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_automationA
Destructive

Clear one parameter's envelope on a Session clip (clip + parameter), or every envelope on the clip when no parameter is given. Returns whether an envelope existed. One undo step.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipYesSession clip address, e.g. 'tracks/2/slots/0/clip'
parameterNoParameter address; omit to clear all envelopes on the clip

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context: that the call reports whether an envelope existed and that the change is a single undo step, which matters for a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, no waste, with the operating scope front-loaded before the return-value and undo notes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description covers the return value (whether an envelope existed) as well as the undo behavior. Complete enough for a two-parameter destructive tool, though it could note any permission or state prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented in the schema, including the 'omit to clear all' semantics. The description restates the same omission behavior without adding format or address syntax beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (clear) and resource (envelope on a Session clip) and distinguishes itself from siblings like get_automation and draw_automation. The dual-mode scope (single parameter vs all envelopes) is spelled out precisely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb and the two operating modes, but the description never explicitly says when to choose this over get_automation or draw_automation, nor states any prerequisite. Adequate but leaves routing to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clip_actionA
Destructive

Edit a clip in place: crop (discard everything outside the loop), duplicate_loop (loop twice as long, notes and envelopes copied; MIDI only), quantize (grid: rec_q_quarter, rec_q_eight, rec_q_eight_triplet, rec_q_sixtenth, rec_q_thirtysecond...; amount 0-1, default 1; on audio clips it aligns warp markers), quantize_pitch (like quantize for one pitch, 0-127; MIDI only), scrub (position in beats) / stop_scrub, move_playing_pos (amount beats, negative goes back; clip must be playing), and on AUDIO clips add_warp_marker (beat_time; sample_time = seconds in the file, default: where it changes nothing), move_warp_marker (beat_time of an existing marker, distance in beats: this is how audio is retimed) and remove_warp_marker (beat_time); current markers are the clip's warp_markers property. to_arrangement copies a SESSION clip onto its track's arrangement timeline at time (beats) and returns the new clip's address; a clip that carries automation envelopes turns them into arrangement track automation (the envelopes do not stay on the copy; the result lists the parameters now automated), which is how arrangement automation is written: draw_automation on the Session clip first. address must be a clip. crop and quantize rewrite content: one undo step each, and expect ({name}) refuses to act on the wrong clip. Returns the clip's length and loop after the action.

ParametersJSON Schema
NameRequiredDescriptionDefault
gridNoSong.RecordingQuantization name (quantize, quantize_pitch)
timeNoto_arrangement: destination position in beats on the arrangement
pitchNoMIDI note number (quantize_pitch)
actionYesWhat to do
amountNoquantize: 0-1 strength; move_playing_pos: beats
expectNoGuard: {"name": "..."} must match the clip
addressYesA clip, e.g. 'tracks/2/slots/0/clip'
distanceNomove_warp_marker: beats to move by
positionNoBeats from the clip start (scrub)
beat_timeNoWarp marker actions: the marker position in beats
sample_timeNoadd_warp_marker: position in the file in seconds

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=false, and the description goes further: crop 'discard[s] everything outside the loop', crop/quantize each cost 'one undo step', and the `expect` guard 'refuses to act on the wrong clip'. It also discloses envelope-copy and envelope-to-arrangement-automation side effects, which the annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Length is defensible for 11 actions, but it is delivered as one dense run-on paragraph heavy with parentheticals and semicolons, with no per-action structure. The opening clause is front-loaded well, yet the middle is hard to scan, so each sentence only partly earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, 11-action tool with no output schema, it covers preconditions, side effects, undo cost, and even the return value ('the clip's length and loop after the action'). Minor gaps remain (e.g., detailed behavior of stop_scrub, error modes), but nothing an agent needs to call it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3; the description nevertheless adds real semantics beyond the schema: the actual grid enum values (rec_q_quarter, rec_q_eight, ...), `amount` 0-1 with default 1, sample_time defaulting to 'where it changes nothing', and the meaning of `beat_time`/`distance` as retiming. Only the omission of explicit defaults for a few params keeps it off 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb+resource ('Edit a clip in place') and then enumerates the exact 11 operations with what each does, letting an agent separate clip-level edits from the note-level siblings (edit_notes, transform_notes) and from automation siblings. MIDI-only vs audio-only scoping is stated per action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives per-action preconditions and routing ('clip must be playing' for move_playing_pos; MIDI only for duplicate_loop/quantize_pitch; audio-only for warp markers) and names a genuine alternative workflow by telling the agent to use draw_automation on the Session clip first for arrangement automation. It does not systematically cover when *not* to use a given action, but the when-to-use coverage is well above average.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convertA

Live's audio conversions (edition dependent: Live's own refusal comes through). action: check (can this audio clip become MIDI?), audio_to_midi (type harmony|melody|drums: a new MIDI track with the extracted notes), simpler_track (a new MIDI track with a Simpler playing the clip), drum_rack_from_clip (a new track with a Drum Rack, the clip on the first pad), pad_to_track (address of a drum pad: its chain becomes its own MIDI track), slice_to_drum_rack (address of a Simpler in Slicing mode: every slice gets a pad). address is the audio clip (or pad, or Simpler). Returns the new tracks with their addresses, devices and clips; audio_to_midi finishes in the background in Live, so this waits for the new track (up to 15 s). One undo step.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoaudio_to_midi: what to extract
actionYesWhat to convert
addressYesAudio clip (check, audio_to_midi, simpler_track, drum_rack_from_clip), drum pad (pad_to_track) or Simpler device (slice_to_drum_rack)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the safety triad; the description adds real behavioral context: output is new tracks with addresses/devices/clips, audio_to_midi runs in the background and the call blocks up to 15 s, results depend on Live edition, and it constitutes one undo step. These are exactly the traits annotations cannot convey for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the overarching purpose leads, then per-action definitions, then address/return/timeout details. Every clause carries information, though the packed parenthetical listing makes it slightly heavy to parse in one pass.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the return value (new tracks with addresses, devices, clips) and the background/timeout behavior for audio_to_midi. An agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds cross-parameter meaning the schema lacks: `address` refers to a different entity per action (clip, drum pad, or Simpler), and `type` is scoped to audio_to_midi only. That conditional mapping is genuinely useful beyond the flat enum descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (Live's audio conversions) and enumerates each action with its concrete outcome, so an agent can distinguish convert from siblings like analyze_audio_clip or clip_action. The scoping to audio clips/pads/Simplers is explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each action's purpose is spelled out (check vs audio_to_midi vs simpler_track vs drum_rack_from_clip vs pad_to_track vs slice_to_drum_rack), giving clear context for selection. However, it never states when NOT to use this tool or names an alternative for overlapping cases, so it stops short of explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createA

Create a track, return track, scene, MIDI clip, audio clip, arrangement clip or take lane and get back its address. kind: audio_track, midi_track, return_track (always appended), scene, audio_clip (address of an EMPTY slot on an audio track and path: an absolute path to an audio file; it is auto-warped by Live's settings and the result reports its length), arrangement_midi_clip (address of a track or take lane, time in beats on the timeline, length default 4) and arrangement_audio_clip (address, time, path), take_lane (address of a track), midi_clip (address of an EMPTY clip slot like 'tracks/2/slots/0', length in beats, default 4). Cue points cannot be created (Live only toggles them at the arrangement insert marker, which is UI state). For tracks and scenes index is the insertion position (0-based; omit or -1 to append; existing objects shift, so re-read addresses afterwards). Optional name and color (RGB integer; Live snaps it to the nearest palette colour and the result reports the colour it applied) are applied immediately. One undo step.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesWhat to create
nameNoName to give it
pathNoaudio_clip: absolute path of the audio file
timeNoarrangement clips: position in beats
colorNoRGB color integer
indexNoInsertion position, -1 (default) appends
lengthNomidi_clip: length in beats (default 4)
addressNomidi_clip, audio_clip: the empty clip slot to fill, e.g. 'tracks/2/slots/0'

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare write, non-idempotent, non-destructive; the description adds substantial behavioral context beyond them: existing objects shift so addresses must be re-read, color is snapped to a palette and reported back, audio clips are auto-warped and report length, and the whole operation is one undo step. This is exactly the extra context annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and densely informative, with no filler sentences; each clause earns its place by clarifying a kind-specific rule. It is a single unbroken block rather than bulleted per-kind, which slightly hurts scannability for a nine-variant enum, but the content is not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nine-kind creation tool with no output schema, the description covers required parameter combinations, defaults, address formats, side effects, and even what the result reports back (length, applied color). Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and schema descriptions are terse ('What to create'), so baseline is 3. The description adds real semantics: which parameters are relevant per kind, the -1/omit append convention for index, the 'tracks/2/slots/0' address format for empty slots, and time-in-beats meaning. This exceeds what the schema conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Create) and enumerates the exact resources it can produce (track, return track, scene, MIDI/audio clip, arrangement clip, take lane). Distinguishes itself from siblings like duplicate and load_item by scope and by returning the new object's address. An agent can tell what it does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives per-kind usage rules (which parameters apply to which kind, defaults like length=4 or index=-1 to append) and a negative exclusion ('Cue points cannot be created'). However, it never routes the agent to alternatives such as duplicate or load_item, so it stops short of explicit when-to-use-this-vs-sibling guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deleteA
Destructive

Delete a track ('tracks/N'), return track ('returns/N'), scene ('scenes/N'), clip ('tracks/N/slots/M/clip' or an arrangement clip 'tracks/N/arrangement/M'); cue points cannot be deleted (Live only toggles them at the arrangement insert marker). DESTRUCTIVE (one undo step brings it back). expect is mandatory: {"name": <the object's current name>}. Indices shift after every create/delete, so read the object first; if its name no longer matches, nothing is deleted (GUARD_FAILED). The master track cannot be deleted, and a Set always keeps at least one scene.

ParametersJSON Schema
NameRequiredDescriptionDefault
expectYesGuard: the object must still have this name (class_name optional)
addressYesWhat to delete

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructiveHint/idempotentHint; the description adds that one undo step reverses the delete, that the mandatory name guard yields GUARD_FAILED when the name no longer matches, and the untouchable-object rules (cue points, master track, last scene). This is behavioral context the agent could not get from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and target enumeration, then moves through destructive semantics, guard, and edge cases. Dense but nearly every clause carries decision-relevant information; the cue-point parenthetical is slightly convoluted but not padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers target syntax, guard semantics, destructive/undo behavior, and the main refusal cases. With no output schema, it never states what a successful call returns (beyond the GUARD_FAILED error), which is the one remaining gap for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, yet the description still adds real meaning: the accepted address forms per object type, the exact `expect` payload shape ({"name": ...}), why the guard exists (index shifting), and the failure mode when it mismatches. That is well beyond the schema's terse 'What to delete'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (Delete) plus every addressable resource type, with concrete path syntax for each ('tracks/N', 'returns/N', 'scenes/N', clip and arrangement paths). An agent can tell this apart from the sibling create/duplicate tools immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-not conditions: cue points cannot be deleted, the master track cannot be deleted, a Set always retains one scene, and indices shift after create/delete so the object must be read first. It stops short of naming an alternative sibling (e.g. history for undo) but the preconditions are unusually clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_setA
Read-onlyIdempotent

A compact map of the whole Set: song settings, every track (regular, return, master) with its address, kind, mixer state, devices and clips, and every scene. Each track has a hash and the Set has a fingerprint that only change when the Set really changes (playhead, play state and meters are ignored): compare fingerprints to detect edits, or hashes to see which track changed. Set include_clips=false for a lighter summary (clip counts and hashes stay).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_clipsNoList each track's clips (default true)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description goes beyond by disclosing what is NOT captured (playhead, play state, meters ignored) and the stability contract of fingerprint/hash values. Doesn't state output size or performance characteristics, but the semantic-stability contract is valuable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose; every sentence carries information (structure, identity, stable comparison, lighter mode). Slightly dense but no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only introspection tool with no output schema, the description covers what's returned (settings, tracks with address/kind/mixer/devices/clips, scenes) and identity semantics. Return value shape is inferred rather than explicit, but adequate for an agent to call correctly and interpret fingerprints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (include_clips documented with type and default). The description adds the consequence of the flag ('clip counts and hashes stay'), which is helpful but baseline 3 applies when schema already covers the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'A compact map of the whole Set'. Clearly distinguishes itself from sibling getters (get_properties, get_health, get_capabilities) by describing a full structural snapshot including tracks, scenes, mixer state, devices and clips.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance: 'compare fingerprints to detect edits, or hashes to see which track changed' and 'Set include_clips=false for a lighter summary'. Names concrete alternatives for achieving specific goals.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_actionA
Destructive

Change device structure. action: insert (address of a track, return track, master or rack chain; name as in Live's browser, e.g. 'EQ Eight', 'Drum Rack', 'Audio Effect Rack'; optional position, default end; Live refuses bad placements such as effects before an instrument and says why), delete (address of a device; expect {name} mandatory), duplicate (a device; the copy goes right after it), move (address of a device, to a track or chain, optional position; returns where it landed), save_ab (store the current preset in the A/B compare slot), and for racks: insert_chain (optional position), add_macro, remove_macro, randomize_macros, store_variation, recall_variation (index selects the variation first; else the selected one; which last = the last recalled), delete_variation (index or the selected one; Live does nothing when none is selected, so this refuses), re_enable_automation (address of a parameter whose playing clip automation was overridden, by hand or by any write through this bridge such as set_properties or ramp_parameter, or 'song' for all: hands it back to the automation), call (address of a device or of a Simpler's '.../sample': method and args object, one of the methods get_device lists for it: crop, reverse, warp_as, replace_sample on a Simpler; insert_slice, move_slice, remove_slice on its sample; record, overdub, stop, clear, export_to_clip_slot on a Looper; set_modulation_value on a Wavetable), copy_pad (Drum Rack: from_note and to_note), clear_pad (address of a drum pad, e.g. 'tracks/1/devices/0/drum_pads/36'; expect {name} mandatory). Returns the new address where one is created. One undo step. DESTRUCTIVE for delete, clear_pad, remove_macro, delete_variation.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNomove: the track or chain to move the device into
argsNocall: the method arguments by name
nameNoinsert: device name
indexNorecall_variation, delete_variation: variation to select first (0-based)
whichNorecall_variation: default selected
actionYesWhat to do
expectNoGuard for delete and clear_pad: {"name": "..."} must match
methodNocall: the method name
addressYesTrack/chain (insert), device (delete, duplicate, move, save_ab, rack actions) or drum pad (clear_pad)
to_noteNocopy_pad: destination pad note
positionNoinsert, move, insert_chain: index, -1 or omitted = end
from_noteNocopy_pad: source pad note

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply only the generic destructive/non-idempotent profile, and the description materially extends it: 'One undo step', the explicit DESTRUCTIVE list (delete, clear_pad, remove_macro, delete_variation), that Live refuses bad placements and explains why, that move returns where the device landed, and that delete_variation refuses when nothing is selected. That is exactly the kind of failure-mode and side-effect detail annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is dense and front-loaded — the core operation is stated first, then each action is unpacked in a compact clause. The single mega-sentence makes scanning harder than a bulleted structure would, but given 16 actions almost every clause carries decisive information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-action, 12-parameter mutation tool with no output schema, the description covers address forms, per-action parameters, guards, failure behavior, undo semantics, and the return value ('the new address where one is created'). Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3, but the description adds genuinely new cross-parameter semantics the schema cannot express: which parameters are valid per action, that `expect` is a mandatory guard for delete/clear_pad, the meaning of 'song' as an address for re_enable_automation, and the enumerated method names for `call` per device type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening 'Change device structure' states a verb and resource, and the per-action enumeration makes the scope concrete against a large action enum. However it never differentiates itself from siblings that appear to overlap (create, duplicate, delete), so an agent cannot tell whether device-level deletion belongs here or to delete without inspecting both.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

For nearly every action it supplies the triggering context and prerequisites: which address type applies (track/chain vs device vs drum pad), that `expect` is mandatory for delete/clear_pad, that position defaults to end, and that recall_variation/delete_variation behave differently when nothing is selected. It stops short of naming alternatives, so there is no explicit 'use X instead when...' routing against sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draw_automationA
Destructive

Draw a clip automation envelope for a device or mixer parameter, inside Live (tempo-locked, sample-accurate). clip: a Session clip address ('tracks/2/slots/0/clip'); parameter: a parameter address on that clip's track ('tracks/2/devices/0/parameters/5', 'tracks/2/mixer/volume', 'tracks/2/mixer/sends/0'). points: [{time, value, curve?}] with time in beats from clip start and value in the parameter's own units (get_device shows min/max). The default style 'breakpoints' writes real envelope breakpoints (straight lines between them; smooth/ease curves get a breakpoint every resolution beats, default 0.25; step curves make jumps), so it is editable in Live and light. 'steps' writes a staircase of fine steps instead (resolution default 0.125). curve: linear (default), step, smooth, ease_in, ease_out (a point's own curve shapes the segment after it). mode replace (default) rebuilds the parameter's envelope, merge rewrites only the drawn range (breakpoints outside connect to it by straight lines). With hold (default true) the clip edges are filled with the first/last value. The result includes a readback of Live's stored values. Arrangement clips have no envelopes in Live's API. One undo step per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipYesSession clip address, e.g. 'tracks/2/slots/0/clip'
holdNoFill the clip before the first and after the last point (default true)
modeNo'replace' (default) or 'merge'
curveNoDefault curve between points (default 'linear')
styleNoDefault 'breakpoints'
pointsYesBreakpoints, e.g. [{"time":0,"value":0.2},{"time":8,"value":0.9}]
parameterYesParameter address, e.g. 'tracks/2/devices/0/parameters/5' or 'tracks/2/mixer/volume'
resolutionNoBeats between generated breakpoints (or steps) on curved segments

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=false, and the description goes well beyond them: what replace destroys (rebuilds the parameter's envelope), how merge preserves out-of-range breakpoints, edge-filling via hold, the one-undo-step-per-call cost, and the stored-value readback. This is exactly the behavioral context a mutation tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then organized parameter-by-parameter; nearly every sentence carries load-bearing detail. It is dense and long, though a reader must parse several embedded clauses to extract defaults, which slightly hurts scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by noting the result includes a readback of Live's stored values. Combined with the Arrangement-clip limitation and undo cost, an agent has everything needed to call this destructive tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema coverage, the description adds real meaning: concrete address grammars for clip and parameter, points expressed in beats from clip start with values in the parameter's own units ('get_device shows min/max'), the point-level curve shaping the segment after it, and resolution semantics that differ per style. This exceeds the schema's terse field notes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Draw a clip automation envelope for a device or mixer parameter, inside Live') and adds scope qualifiers (tempo-locked, sample-accurate). It is immediately distinguishable from siblings like get_automation, clear_automation, and ramp_parameter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditions for internal choices (style breakpoints vs steps, mode replace vs merge) and a hard exclusion ('Arrangement clips have no envelopes in Live's API'). However, it never names sibling alternatives such as ramp_parameter or clear_automation, so the agent must infer routing between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

duplicateA

Duplicate a regular track ('tracks/N', with its devices and clips), a scene ('scenes/N') or a clip slot ('tracks/N/slots/M', with its clip). The copy lands right after the source (a duplicated slot goes into the next scene); returns the new address. Return tracks and the master cannot be duplicated.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesWhat to duplicate, e.g. 'tracks/3', 'scenes/name:Verse', 'tracks/0/slots/2'

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish this as a non-read-only, non-idempotent, non-destructive write. The description meaningfully adds the placement rule (copy lands immediately after the source; a duplicated slot goes into the next scene), the return value (new address), and the unsupported cases. It stops short of noting permissions or what happens on invalid addresses.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: what can be duplicated first, then placement/return behavior, then the exclusion. No filler, and the most decision-relevant content is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema, the description covers accepted inputs, placement behavior, the return value, and the negative cases, which is everything an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already provides address examples, so the baseline is 3. The description adds some interpretable meaning (the N-index convention implied, and that scene addresses may use name: syntax) but largely restates the formats the schema documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (duplicate) and enumerates the exact resource types accepted (regular track, scene, clip slot) with their address forms. This clearly distinguishes it from siblings like create and convert, which an agent could otherwise confuse with duplication.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong selection context by listing accepted address patterns and explicitly excluding return tracks and the master, which prevents wasted calls. It does not, however, contrast this tool against the sibling 'create' or explain when duplicating is preferred over creating fresh.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_notesA
Destructive

Change notes that already exist in a MIDI clip. action: modify (changes: [{id, }] or ids + set: {field: value}; keeps note ids and per-note events), remove (exactly one of ids, a range from_time/time_span/from_pitch/pitch_span, or all: true), replace (swap the notes in a range, or all notes, for notes in one step; if Live refuses the new notes the old ones are restored; omit notes to clear the range), duplicate (ids, optional destination_time and transposition semitones), duplicate_region (start, length, destination_time, optional pitch and transposition) and select (ids, all: true or none: true, for the editor's selection). Get ids from get_notes; unknown ids are refused (NOT_FOUND) with nothing changed. expect ({name}) guards against the wrong clip. One undo step; DESTRUCTIVE (remove, replace).

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoremove or select every note
idsNoNote ids (modify with set, remove, duplicate, select)
setNomodify with ids: fields to set on all of them
noneNoselect: clear the selection
notesNoreplace: the new notes (same fields as write_notes)
pitchNoduplicate_region: only this pitch (-1 = all)
startNoduplicate_region: source start in beats
actionYesWhat to do
expectNoGuard: {"name": "..."} must match the clip
lengthNoduplicate_region: source length in beats
addressYesA MIDI clip
changesNomodify: [{id, pitch?, start_time?, duration?, velocity?, mute?, probability?, velocity_deviation?, release_velocity?}]
from_timeNoRange start (remove, replace)
time_spanNoRange length (remove, replace)
from_pitchNoLowest pitch (remove, replace)
pitch_spanNoPitch count (remove, replace)
transpositionNoduplicate, duplicate_region: semitones
destination_timeNoduplicate, duplicate_region: where the copies start

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: one undo step, DESTRUCTIVE for remove and replace, replace restores old notes if Live refuses the new notes, unknown ids refused with NOT_FOUND and nothing changed. The `expect` guard against the wrong clip and the note about modify keeping note ids and per-note events are real behavioral disclosures. No contradiction with destructiveHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: first sentence states the core purpose, then per-action clauses. Every clause carries operational meaning. It is long, but for six distinct actions with conditional parameters that length is earned; minor friction from comma-spliced clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 18 params, no output schema, and annotations covering safety, the description does the essential work: tells the agent how each action consumes parameters, the failure modes (NOT_FOUND, restore-on-refusal), and the undo/expect guards. It does not describe the return payload, but with no output schema that is a minor gap; it is otherwise complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes further by mapping parameters to actions (e.g. `ids` + `set` for modify, `notes` cleared range, `transposition` semitones, `destination_time`), clarifying which fields apply to which action – value beyond the flat schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change existing notes) and resource (notes in a MIDI clip), and enumerates the six action variants with their semantics. Distinguishes clearly from get_notes, write_notes, and transform_notes by being the edit-existing-notes operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to get ids from get_notes, and notes that unknown ids are refused with NOT_FOUND with nothing changed. Per-action prerequisites (e.g. remove needs exactly one of ids/range/all, replace needs notes) are given. No explicit sibling routing like 'use transform_notes for generative edits', but usage context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

follow_actionsA

Clip follow actions, which Live's API does not have, emulated inside Live on the Remote Script's 10 ms timer. set (address of a Session clip; actions: names or {action, weight} objects, chosen by weight each pass: next, previous, first, last, any, other, again, stop, all relative to the clip's own track; after_bars or after_beats, default one pass through the clip) launches the chosen clip when the clip has played that long. It only acts while the transport runs and the clip plays, once per pass, and launches through Live's normal clip launch, so Live's launch quantization decides the exact moment (the trigger fires ~40 ms early to catch the grid point; use q_none or a matching quantization for tight timing). clear (an address, or everything) stops them at once; status lists them. Configurations live in memory only: they are lost when Live restarts or the script reloads. Not undoable, not batchable.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoDefault status
actionsNoset: e.g. ['next'] or [{action:'next',weight:3},{action:'again',weight:1}]
addressNoset/clear: a Session clip, e.g. 'tracks/2/slots/0/clip'
after_barsNoset: bars of the clip's time signature before the action
after_beatsNoset: beats before the action (min 0.25)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations only marking readOnly=false and destructive=false, the description discloses deep behavioral traits: emulation on a 10 ms timer, ~40 ms early trigger, once-per-pass execution, quantization-dependent timing, and that configurations are memory-only, lost on restart/reload, not undoable and not batchable. This is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded, with the tool's nature stated first and mode-specific detail following. The run-on parenthetical sentences pack a lot in but remain readable; a little could be trimmed without loss, but nothing is wasted filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, stateful, timing-sensitive tool with no output schema, the description covers activation conditions, timing caveats, persistence limits, and undoability. An agent has everything needed to invoke it correctly without opening the source.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: `actions` may be names or {action,weight} objects chosen by weight each pass, the relative action set (next, previous, etc. relative to the clip's own track), and that after_bars/after_beats default to one pass through the clip. These go beyond the terse schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Clip follow actions') and immediately distinguishes the capability from what Live's API provides natively. The three modes (set/clear/status) are enumerated, so an agent knows exactly what the tool covers and how it differs from siblings like clip_action or launch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operating conditions: it only acts while transport runs and the clip plays, once per pass, and recommends q_none or matching quantization for tight timing. It does not explicitly name alternative tools or say when NOT to use follow actions in favor of another sibling, but the modal guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_notesA
Destructive

Compose notes into a MIDI clip from a generator, in one undo step. address: a MIDI clip (create one with create kind midi_clip; the result warns if the music runs past its loop end); generator + params. Generators: euclidean, drum_pattern, chord_progression, bassline, melody, scale_run, random_notes. Use generator 'help' for every generator's parameters (keys, chord progressions by roman numeral or symbol, drum step strings, seeds...). start_time offsets everything (beats). mode: add (default; keeps existing notes), replace_span (replaces notes inside the generated span) or replace_all. dry_run previews.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDefault add
expectNoGuard: {"name": "..."} must match the clip
paramsNoThe generator's parameters (see the list in the tool description)
addressNoA MIDI clip, e.g. 'tracks/2/slots/0/clip'
dry_runNoPreview the result without changing the clip
generatorYesWhich generator (help lists them all with parameters)
start_timeNoBeat where the generated music starts (default 0)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructive=true/non-idempotent, and the description earns credit on top by specifying exactly what gets destroyed per mode (replace_span vs replace_all vs additive add), that the whole operation is one undo step, that dry_run previews, and that the result warns if music overruns the clip's loop end.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and undo behavior, then parameters in backticked order. Dense but almost every clause carries actionable information; the generator-name roster and parenthetical examples add some bulk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates with the dry_run preview hint and the loop-overrun warning. Prerequisites, help discovery, modes, and offset semantics are all covered; only a fuller account of the return payload (e.g. created note count or error shapes) is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the terse schema strings: start_time is measured in beats and offsets everything, mode semantics are spelled out, and address is tied to the required clip prerequisite. `expect` is left to the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (compose notes), the target resource (a MIDI clip), and the distinguishing mechanism (from a generator, in one undo step). The enumerated generator list makes it clearly distinct from plain note-writing siblings like write_notes or edit_notes without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete prerequisites and routing: create the clip first via `create kind midi_clip`, and use generator 'help' to discover parameters. Explains the mode choices and when each applies. It stops short of explicitly stating when to prefer this over write_notes/edit_notes, so no exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_automationA
Read-onlyIdempotent

Read a Session clip's automation: every envelope on the clip (or only parameter's) as breakpoints in the parameter's own units: {time, value, jump_from?} (jump_from marks a step: the value just before it), with the parameter's address, name and range. max_points caps each envelope (default 500; truncated says if more exist). Use it to inspect what a clip already does before drawing over it.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipYesSession clip address, e.g. 'tracks/2/slots/0/clip'
parameterNoOnly this parameter
max_pointsNoBreakpoints per envelope (default 500)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive, so the burden is lighter, yet the description still adds real behavioral detail: default max_points of 500 and the `truncated` flag disclosing possible partial results, plus breakpoint/step semantics via jump_from. Only pagination-style navigation beyond the cap is left unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and refines it in one dense but well-ordered paragraph: return shape, semantics, cap behavior, then the use case. Slightly packed, but virtually every clause conveys information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so thoroughly: breakpoint structure, units, jump_from semantics, per-envelope cap, and truncation signal. Nothing an agent needs to call and interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes further by explaining that `parameter` restricts output to one envelope, `max_points` caps each envelope, and jump_from marks a step's preceding value. It adds meaning beyond the schema text rather than repeating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Read) plus resource (a Session clip's automation), with the return shape ({time, value, jump_from?}) spelled out. The closing clause 'before drawing over it' implicitly routes the agent away from draw_automation/clear_automation, so the purpose is distinguishable from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: inspect existing automation before overwriting it, and states the parameter-scoping option. It does not explicitly name draw_automation as the alternative or state when-not to use this tool, so it falls short of a full when/alternatives statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_capabilitiesA
Read-onlyIdempotent

What this Live and this bridge can do: script version and build id, Live version and variant, unavailable features, and feature probes (Max for Live present, Conversions, note probabilities, Suite devices such as Meld/Roar). A beta build reports variant 'Beta' and edition 'unknown' because the edition is not readable: rely on features, never on the edition. Also lists every bridge command.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so credit goes to the extra behavioral context: the description warns that a beta build reports variant 'Beta' and edition 'unknown' because the edition is unreadable, and that callers should trust `features` instead. That is a genuinely useful quirk disclosure beyond the annotations, though no rate limits or call-order constraints are mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary payload and followed by a targeted caveat about beta builds. The enumeration is dense but each item earns its place; the second sentence exists specifically to prevent a misread of the edition field.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, no output schema, and full annotation coverage, the description carries the burden of explaining return content, which it does by listing the reported fields and the bridge-command listing. It is complete enough to invoke correctly, with only a minor gap around how the feature probe values should be interpreted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies a no-argument introspection call and does not invent parameter semantics that do not exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and enumerates exactly what it reports: script version/build id, Live version and variant, unavailable features, feature probes, and bridge commands. It is distinct from siblings like get_health or get_properties, though it never explicitly contrasts itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the caveat 'rely on `features`, never on the edition' tells the agent how to interpret and act on the output, and 'Also lists every bridge command' hints at discovery use. There is no explicit when-to-use or when-to-prefer-an-alternative guidance relative to get_health or get_properties.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_deviceA
Read-onlyIdempotent

Read a device with all its parameters (index, address, value, min, max, display as Live shows it, default, value_items labels for quantized ones, is_enabled) and, for racks, its chains, return chains, occupied drum pads (each with the addresses of the devices it holds) and macro state. address: 'tracks/2/devices/0', 'returns/0/devices/1', 'master/devices/0' or nested 'tracks/2/devices/0/chains/1/devices/2' (a name selector works too: 'tracks/2/devices/name:EQ Eight'). Device names per track are in describe_set. Change a parameter with set_properties on its address ('.../parameters/5' or '.../parameters/name:Frequency', field value; a quantized parameter also takes its label such as 'Low-pass'); many at once with items. Devices also have properties (name, on, collapsed) and racks chains, pads and mixers have theirs: see list_properties. Simpler, Wavetable, Drift, Meld, Eq Eight, Looper, Hybrid Reverb, Roar, Spectral Resonator, Shifter, Drum Cell and plug-ins also have their own properties and methods: the result's specific block lists them (choices such as a wavetable or voice mode are properties that take the label the device shows; ..._options lists the labels), and a Simpler's sample is at '/sample'.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesA device, e.g. 'tracks/2/devices/0'

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds substantial context about the result shape (the `specific` block for plugin devices, where a Simpler's sample lives). It does not discuss pagination or performance, but discloses what the read returns beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The read purpose is front-loaded, but the paragraph then drifts into detailed set_properties mechanics (value field, quantized labels, `items`) that belong to the sibling tool, not to a read definition. Several sentences about other tools don't earn their place here, making the description bloated and hard to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a simple one-param input, the description carries the return-shape burden and does so thoroughly (parameter fields, chains, pads, macros, `specific` block). It is more than complete for the tool's complexity, even if over-broad.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single `address` param, so baseline is 3; the description goes beyond the schema's one-line example by giving literal forms (tracks/2/devices/0, returns/0/devices/1, master/devices/0, nested chains) and the name selector syntax ('name:EQ Eight').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening verb+resource is precise: 'Read a device with all its parameters...' and it enumerates the scope (parameters, chains, return chains, drum pads, macro state) so an agent can distinguish it from get_properties/list_properties. The address examples make the target unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It routes related tasks to siblings explicitly: 'Change a parameter with set_properties', 'see list_properties' for properties, and 'Device names per track are in describe_set'. It doesn't state when NOT to use get_device, but the alternative routing is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_healthA

Ping Ableton Live Remote Script TCP bridge, report connection status, script version, and available capabilities.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, but it does disclose what the call reports (connection status, script version, capabilities), which is the key behavioral trait here. It does not state what happens when the bridge is unreachable, whether the call blocks times out, or confirm the operation is side-effect free.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the action and the returned information are stated immediately and nothing is repeated from structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description sensibly takes on the return-value role by naming status, version, and capabilities. The only gap is failure/timeout semantics when the TCP bridge is down, which an agent would want to know for a diagnostic call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so by the stated baseline this scores 4. There is nothing for the description to disambiguate beyond the empty input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs (ping, report) and the exact resource (Ableton Live Remote Script TCP bridge) plus the three things it reports: connection status, script version, capabilities. This is clearly distinguishable from siblings like get_session_info, which concerns session content rather than bridge connectivity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use statement, and no alternative tool is named. However, framing it as a ping that reports connection status strongly implies its role as a preflight/connectivity check before issuing the many set_* and get_* tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_notesA
Read-onlyIdempotent

Read the MIDI notes of a clip (address: 'tracks/N/slots/M/clip', MIDI clips only) with every field Live stores: id (stable while the note exists; use it with edit_notes), pitch, start_time and duration (beats), velocity (1-127), mute, probability (0-1), velocity_deviation (-127..127) and release_velocity (0-127). Sorted by start_time then pitch. Without filters it returns all notes (capped by limit, default 2000; truncated says if more exist). Filter by a range (from_time/time_span in beats, from_pitch/pitch_span), by ids, or with selected: true for the notes selected in Live's editor. Also returns the clip's length and loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoOnly these note ids
limitNoMaximum notes returned (default 2000)
addressYesA MIDI clip, e.g. 'tracks/2/slots/0/clip'
selectedNoOnly notes selected in Live's editor
from_timeNoRange start in beats (notes that start in the range)
time_spanNoRange length in beats
from_pitchNoLowest MIDI pitch of the range
pitch_spanNoNumber of pitches in the range

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly/idempotent/non-destructive), and the description still adds substantial behavior: the default 2000 cap, the `truncated` overflow signal, deterministic sort order (start_time then pitch), and the id's stability contract tied to edit_notes. It also documents the extra return values (clip length and loop), which the annotations do not.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Effectively a single dense paragraph covering fields, sorting, truncation, and all filter modes; front-loaded with the purpose and address. It is long and reads as a run-on, but nearly every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe the return payload, and it does: every note field with types/ranges, sort order, the clip length and loop, and the truncation signal. Combined with annotations carrying the safety profile, nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds real meaning beyond it: note field ranges (velocity 1-127, probability 0-1, velocity_deviation -127..127, release_velocity 0-127), the semantics of 'notes that start in the range', and the limit default. It does not restate every filter parameter, but what it adds is substantive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read the MIDI notes of a clip') plus the exact address format and a scoping constraint ('MIDI clips only'). The verb 'Read' cleanly separates it from write_notes, edit_notes, transform_notes and generate_notes in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when to use each filter mode (range, ids, selected:true) and cross-references edit_notes for the returned note ids, giving clear operating context. It stops short of stating when not to use the tool or drawing an explicit contrast with siblings like get_properties.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_propertiesA
Read-onlyIdempotent

Read properties of the Song, a Track, Scene, ClipSlot, Clip, Groove, cue point, the app, or a device, rack chain, drum pad or device parameter. Addresses: 'song', 'master', 'tracks/N', 'returns/N', 'scenes/N', 'tracks/N/slots/M' (clip slot) and 'tracks/N/slots/M/clip', 'tracks/N/arrangement/M' (arrangement clips in time order), 'tracks/N/take_lanes/K', 'tracks/N/devices/M' (also returns/N and master; then '/parameters/P', '/sample' for a Simpler, '/chains/C/devices/...', '/drum_pads/NOTE', '/mixer/volume'), 'grooves/N' (groove pool), 'cue_points/N' and 'app' (the Live application). Indices are 0-based. A name selector works anywhere a number does, e.g. 'tracks/name:Drift' (exact match; several matches is an error that lists their indices). Give names for specific properties, or omit it to read every readable property (properties that do not apply to the object, e.g. audio-only ones on a MIDI clip, are listed under unavailable). Enum values come back as names. Use list_properties to see what exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNoProperty names to read (default: all)
addressYesObject address, e.g. 'tracks/0/slots/1/clip'

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real behavior beyond that: non-applicable properties land under `unavailable`, enum values are returned as names, name selectors are accepted, and ambiguous name matches raise an error listing indices.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the verb and resource list, and the long address grammar is dense but necessary for a path-addressed API. Some address examples are verbose, but each clause carries distinct information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does carry the burden of return behavior and does so reasonably: it explains the `unavailable` bucket, enum-name conversion, and the error path for ambiguous selectors. It stops short of describing the overall return envelope, but for a property reader whose address grammar is already exhaustively documented, coverage is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes further by explaining that `names` defaults to all readable properties, that indices are 0-based, and that a name selector like 'tracks/name:Drift' can substitute for any number — semantics the terse schema strings do not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read properties') plus an explicit enumeration of the resource types it can address (Song, Track, Scene, ClipSlot, Clip, device, rack chain, drum pad, etc.), which cleanly distinguishes it from set_properties (write) and list_properties (enumerate). An agent can tell what it returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives actionable guidance: 'Give `names` for specific properties, or omit it to read every readable property,' and routes to the sibling with 'Use list_properties to see what exists.' No explicit when-not conditions or mention of the set_properties write counterpart, so not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

historyA
Destructive

Undo or redo in Live. Every writing tool call is one undo step, so undo reverts exactly the last call (exceptions: Live records a track rename and every device parameter write as their own entries, so a call or batch that writes several parameters takes that many extra undos). Undo is global: it also reverts edits the user made by hand, so use it deliberately. steps (1-50, default 1) repeats it; returns the names of what was undone and whether more undo/redo is available.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsNoHow many steps (1-50, default 1)
actionYesDirection

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it quantifies the granularity of undo (one step per writing call), documents the exceptions (track rename and device parameter writes consume extra steps), discloses the global scope that reaches manual user edits, and states what is returned. Annotations only supply the destructive/non-idempotent profile; the description supplies the semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action is front-loaded in the first two words and every clause carries operational value, but the long parenthetical about track renames and parameter writes makes the middle sentence dense and slightly run-on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by stating what is returned (names of what was undone plus whether more undo/redo is available). Combined with the granularity rules and global-scope warning, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are already described in the schema, including the 1-50, default 1 range. The description merely restates 'steps repeats it', so it adds no meaning beyond the structured fields. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair and scope: 'Undo or redo in Live.' It also frames the tool against the rest of the writing tools by explaining that each writing call is one undo step, which distinguishes it from every sibling mutation tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns that undo is global and reverts the user's manual edits, so 'use it deliberately' – a clear when-to-be-cautious instruction. It does not name a named alternative tool, but the caution covers the main usage decision.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

launchA

Fire or stop things in the Session view. address is a clip slot or clip ('tracks/N/slots/M[/clip]': fire starts the clip, or the slot's stop button when empty; stop stops it), a scene ('scenes/N': fire only) , a track ('tracks/N': stop all its clips), a cue point ('cue_points/N': jump there) or 'song' (stop all clips, transport keeps running). Options for a slot: quantization overrides the launch quantization for this launch (q_no_q, q_bar, q_half...), legato starts the clip in sync with the one playing, record_length (beats, empty slot only) starts a recording that ends by itself. Scenes take legato and select (false keeps the selection where it is). Stops take quantized (default true; false stops immediately). Launching does not change the Set's content. Arrangement clips cannot be launched (use transport).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoDefault fire
legatoNoStart in sync with the playing clip (slots and scenes)
selectNoScenes: whether launching selects the scene (default true)
addressYesSlot, clip, scene, track or 'song'
quantizedNoStops: wait for the launch quantization (default true)
quantizationNoSong.Quantization name for this launch (slots only), e.g. q_bar
record_lengthNoBeats to record (empty slots only)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-destructive and read-only false; the description adds important context that launching does not change the Set's content, and explains quantized stop behavior and self-ending recordings. It does not cover error or auth conditions, but it adds meaningful behavior beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded with the core action, then follows with address types and options. It could be better structured with lists, but every sentence earns its place for a complex domain.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and rich annotations, the description covers all address types, actions, applicable options, and key caveats needed to call the tool correctly. No significant gaps remain for a Session-view launcher.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds substantial meaning: address format variants, action default, legato scope, select for scenes, quantized for stops, quantization slots, and record_length for empty slots. This materially enriches how each parameter should be understood and used.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (fire or stop) on Session view targets and enumerates the address forms, distinguishing from transport for arrangement clips. An agent can identify intent and scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly notes arrangement clips cannot be launched and directs to transport, and explains how each address type behaves. It lacks explicit when-not guidance versus other session-action siblings like clip_action, but the context is otherwise clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_propertiesA
Read-onlyIdempotent

List the properties get_properties/set_properties know for an object kind: type, whether it is writable, allowed enum values and ranges. Give an address (its kind is used) or a kind: song, track, scene, slot, clip, lane, groove, cue, app, device, chain, pad, parameter or sample. With an address of a device or sample the listing includes its device-specific properties (choices show their labels) and methods.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoObject kind (when no address is given)
addressNoObject address; its kind is listed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, so the safety profile is covered; the description adds substantive behavior beyond that by disclosing the returned shape (type, writable flag, enum values, ranges) and the conditional expansion for device/sample addresses including methods.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and result content, and only two sentences. The inline re-listing of all fourteen kinds duplicates the schema enum and is the one wasteful element.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-value burden and does so adequately (types, writability, enum values, ranges, extra device/sample entries). It omits address string syntax and whether output is paginated, minor gaps for a read-only lister.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum is repeated from the schema, but the description adds real meaning the schema lacks: that address supplies an implicit kind, and that device/sample addresses unlock device-specific properties and labeled choices.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (list) plus resource (properties) and explicit scope: the properties that get_properties/set_properties recognize. It also enumerates what the listing contains (type, writability, enum values, ranges), which distinguishes it from the sibling value-reader get_properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the two selection modes clearly ('give an address (its kind is used) or a kind') and notes that a device/sample address returns richer output. It does not explicitly say when to prefer this over get_properties, leaving that relationship inferential.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_itemA

Load a browser item (from browse) by path, or by uri (fast when it is in the search index, otherwise slow: it walks the whole browser). target: a track ('tracks/2', 'returns/0', 'master') loads an instrument, effect or preset onto it and returns the addresses of the devices it added; a clip slot ('tracks/2/slots/0') loads a sample into it; a device ('tracks/2/devices/0') hot-swaps it for the item. Loading selects the target in Live's window. action preview plays an item on the preview channel without loading it (stop_preview stops it; audible, and it needs no target). Folders and categories cannot be loaded: browse into them. One undo step.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoItem uri instead of a path
pathNoItem path from browse/search, e.g. 'instruments/Drift/Bass/Sub Pulse'
actionNoDefault load
targetNoTrack, clip slot or device address (load)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, idempotent=false, destructive=false, which is thin. The description adds real behavioral context: loading selects the target in Live's window, preview is audible and needs no target, stop_preview reverses it, and the operation consumes 'One undo step'. This goes well beyond the annotations, though permission requirements and failure modes are unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and addressing, then target semantics, then the preview exception. Dense but every clause carries information; slightly heavy to parse in one block, which keeps it just under the top mark.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers addressing, target behavior, the preview alternative, exclusions, undo impact, and even the return value ('addresses of the devices it added'). An agent has what it needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description meaningfully enriches params the schema describes only tersely: it explains what each target address form does (track/clip slot/device) and that action=preview bypasses loading and needs no target. That adds value beyond the schema's one-line descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (load) and resource (browser item) and immediately distinguishes the two addressing modes (path vs uri) plus what each target type does. An agent can tell it apart from browse without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use preview vs load ('plays an item on the preview channel without loading it'), when uri is fast vs slow, and states an exclusion: folders and categories cannot be loaded, browse into them. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ramp_parameterA

Sweep a device or mixer parameter (parameter address) to to over beats or seconds, driven inside Live at about 100 updates per second. For live gestures; use draw_automation for motion that belongs to a looping clip. from defaults to the current value; curve: linear, smooth, ease_in, ease_out. A new ramp on the same parameter replaces the old one. Values are in the parameter's own units. Ramps are not undoable and cannot run inside a batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesTarget value
fromNoStart value (default: current)
beatsNoDuration in beats (give beats or seconds)
curveNoDefault linear
secondsNoDuration in seconds (0.01 to 3600)
parameterYesParameter address, e.g. 'tracks/2/devices/0/parameters/5' or 'tracks/2/mixer/volume'

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly=false, idempotent=false, destructive=false) by disclosing that ramps are not undoable, cannot run inside a batch, that a new ramp on the same parameter replaces the old one, and that updates run at ~100/s inside Live. These are non-obvious operational constraints an agent must know before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with the core action and duration, then constraints. Every clause carries information an agent would otherwise have to guess; none is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent, non-undoable mutation with no output schema, the description covers the replacement semantics, batch exclusion, undo behavior, and units. Nothing an agent needs to invoke it correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: 'from' defaults to the current value, values are in the parameter's own units, and the curve options are enumerated. The one gap is that the seconds range (0.01–3600) appears only in the schema, but that is minor.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb (sweep) on a precise resource (a device or mixer parameter address) with the target, duration, and driving rate. It also distinguishes itself from draw_automation by naming it directly, so an agent can separate the two without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes usage: 'For live gestures; use draw_automation for motion that belongs to a looping clip.' This names the alternative and the condition that selects it, which is exactly the routing an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

routingA
Idempotent

Read or change a track's (or a side-chain device's) input or output routing by the display names the mixer shows. address: 'tracks/N', 'returns/N', 'master' or a device with a side-chain such as a Compressor ('tracks/2/devices/1', input). direction: input or output. action get (default) returns the current type and channel and everything available_types / available_channels (category: external, resampling, master, track, parent_group_track, none...). set takes type and/or channel (exact display names; channels depend on the type, so set both in one call); Live only offers valid choices. Feedback guard: routing a track's INPUT from the master or from resampling while its monitoring is not Off can loop the sound back at full level, so it refuses unless allow_feedback: true (or monitoring is set to OFF first with set_properties current_monitoring_state). One undo step.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoset: routing type display name, e.g. 'Ext. In', 'Master', 'Resampling', a track name
actionNoDefault get
addressYesA track, return track, 'master', or a device with a side-chain
channelNoset: channel display name, e.g. '1/2'
directionYesWhich end
allow_feedbackNoset: allow input routings that can feed back (default false)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnly/idempotent/destructive. The description adds substantial non-structured behavior: the feedback-loop guard, the refusal condition, the allow_feedback escape hatch, the one-undo-step reversibility, and that Live only offers valid choices. This is real behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: it opens with the core read/change statement, then parameters, then the feedback caveat. Every clause carries information, though the long parenthetical enumerations make it slightly less scannable than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description discloses the return shape (type, channel, available_types/available_channels with their category values), covers the required and optional parameters, and documents the safety edge case. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by giving concrete address examples ('tracks/N', 'returns/N', 'master', 'tracks/2/devices/1'), clarifying which parameters apply to get vs set, and noting the type/channel coupling constraint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (read/change) on a precise resource (a track's or side-chain device's input/output routing), and scopes it to 'display names the mixer shows'. An agent can distinguish this from siblings like set_properties or get_properties without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly documents the address forms, the direction values, that action defaults to get, and that set requires type/channel set together in one call since channels depend on type. It routes to an alternative path for the feedback case ('monitoring is set to OFF first with set_properties current_monitoring_state'), which is exactly the when/when-not guidance the dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_propertiesA
Idempotent

Set properties on the Song, a Track, Scene, ClipSlot, Clip, Groove, cue point, device, rack chain, drum pad or device PARAMETER (property value, checked against the parameter's own range). A clip's groove is set to a groove address (grooves/N). Addresses: 'song', 'master', 'tracks/N', 'returns/N', 'scenes/N', 'tracks/N/slots/M' (clip slot) and 'tracks/N/slots/M/clip', 'tracks/N/arrangement/M' (arrangement clips in time order), 'tracks/N/take_lanes/K', 'tracks/N/devices/M' (also returns/N and master; then '/parameters/P', '/sample' for a Simpler, '/chains/C/devices/...', '/drum_pads/NOTE', '/mixer/volume'), 'grooves/N' (groove pool), 'cue_points/N' and 'app' (the Live application). Indices are 0-based. A name selector works anywhere a number does, e.g. 'tracks/name:Drift' (exact match; several matches is an error that lists their indices). Values are checked strictly (booleans must be true/false, integers whole numbers, enums given by name; see list_properties). Interdependent properties (e.g. loop_start/loop_end) can be set together in any order, and the call is all-or-nothing: if one write fails, the others are restored. Returns each property's previous and new value. Each call is one undo step in Live. Give address + properties, or items to change several objects in one call. expect ({name}) refuses to write if the object is not the one you meant.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNoSeveral objects at once: [{address, properties, expect?}]
expectNoGuard: {"name": "Drift"} (optionally class_name) must match the object, or nothing is written
addressNoObject address
propertiesNoProperty values, e.g. {"mute": true, "volume": 0.7}

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: atomic all-or-nothing writes with rollback, one undo step per call, strict type checking (booleans/integers/enums), interdependent properties settable in any order, name selectors with ambiguous-match errors listing indices, and returns of previous vs new values. This is exactly the extra behavioral context the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and then the contract (atomicity, returns, undo), but the long address enumeration is dense and somewhat list-like. It is appropriately sized for the tool's complexity, with only minor redundancy between the atomicity and undo-step sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter, nested-object, no-output-schema mutation tool, the description covers target addressing, batching, guarding, validation rules, atomicity, and return values. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the schema's own parameter descriptions are terse ("Object address", "Property values"). The description compensates heavily by defining the address grammar, the `expect` guard shape, and the `items` batch form, adding real meaning over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Set properties") and enumerates exactly which resources are writable (Song, Track, Scene, ClipSlot, Clip, Groove, cue point, device, rack chain, drum pad, device PARAMETER). This clearly separates it from read-side siblings like get_properties and list_properties without the agent opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: use `address`+`properties` for one object or `items` for several in one call, use `expect` as a guard, and see list_properties for enum names. It does not explicitly state when NOT to use this tool (e.g. preferring batch or device_action for bulk device edits), so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transform_notesA
Destructive

Change notes already in a MIDI clip with a music transform: reads the notes, transforms them, writes the result in ONE undo step. address: a MIDI clip; transform + params. Transforms: transpose, fit_to_scale, invert, reverse, stretch, shift, humanize, swing, quantize, legato, gate, velocity_shape, strum, recombine, arpeggiate, chop, stack, grace_notes, trill, repeat. Use transform 'help' for every transform's parameters and kind. Select notes with a range (from_time/time_span/from_pitch/pitch_span) or, for in-place transforms, ids from get_notes; default is every note. dry_run previews without writing. In-place transforms keep note ids and settings; rebuilds replace the selected notes in one step; additions keep them. Notes that would land outside MIDI range or before beat 0 refuse in-place transforms. Times are beats, pitches C3 = 60.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoOnly these note ids (in-place transforms)
expectNoGuard: {"name": "..."} must match the clip
paramsNoThe transform's parameters (see the list in the tool description)
addressNoA MIDI clip, e.g. 'tracks/2/slots/0/clip'
dry_runNoPreview the result without changing the clip
from_timeNoOnly notes starting at or after this beat
time_spanNoLength of the time range in beats
transformYesWhich transform (help lists them all with parameters)
from_pitchNoLowest pitch of the range
pitch_spanNoNumber of pitches in the range

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, idempotent=false, readOnly=false, but the description adds material behavior beyond them: single-undo-step atomicity, in-place vs rebuild vs addition semantics for note ids, refusal when notes land outside MIDI range or before beat 0, dry_run preview, and unit conventions (beats, C3=60). This is exactly the extra context a mutation tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose and atomicity, then addressing, transforms, selection, and semantics in a tight, dense paragraph. Minor redundancy: the full list of 20 transforms repeats the schema enum verbatim, which costs space without adding information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-param, nested-object, destructive mutation tool with no output schema, the description covers selection, addressing, units, atomicity, and failure conditions. It could say more about what dry_run returns or error reporting, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes further by explaining that range params are an alternative to `ids`, that the default selection is every note, that `ids` only applies to in-place transforms, and that times are beats with C3 = 60. It adds real meaning over the schema's terse per-param lines.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change/transform) and resource (notes in a MIDI clip), and pins down the atomic behavior ('reads the notes, transforms them, writes the result in ONE undo step'). An agent can distinguish this from write_notes/get_notes/edit_notes by the described read-transform-write cycle and the named transform set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: use range params (from_time/time_span/from_pitch/pitch_span) or `ids` from get_notes for in-place transforms, with default = every note, and points to transform 'help' for per-transform params. It names one sibling (get_notes) as a source of ids but never states when to prefer edit_notes or generate_notes instead, so it stops short of explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transportA

Transport and playhead actions: play, continue, stop, stop_all_clips, tap_tempo, jump_by (needs amount: beats, negative jumps back), next_cue / prev_cue (jump to a cue point), toggle_cue (add or remove a cue point at the playhead while playing, or at the arrangement insert marker while stopped, which only the user controls), capture_midi (keep recently played MIDI) and capture_and_insert_scene. Returns the resulting transport state. To change tempo or loop settings use set_properties on 'song'. For undo/redo use the history tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat to do
amountNoBeats to jump (jump_by only)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the mutation/safe profile is already covered. The description adds genuine behavioral context beyond that: toggle_cue's playing-vs-stopped semantics and the arrangement-insert-marker detail ('which only the user controls'), plus capture_midi keeping recent MIDI. It also discloses the return value ('resulting transport state').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded and dense, but the action enumeration substantially restates the enum values already present in the schema, which costs space. The routing sentences and per-action hints do earn their place, so it is functional rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the full action surface, the return value ('resulting transport state'), the one non-obvious parameter's semantics, and sibling alternatives. Remaining gaps (permissions, side effects of stop_all_clips) are minor against the annotation coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description earns extra by clarifying that jump_by 'needs `amount`: beats, negative jumps back' – the negative-direction semantics are not in the schema's terse 'Beats to jump (jump_by only)' text. This is meaningful added meaning over the structured field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Transport and playhead actions') and enumerates the exact operations supported. It distinguishes itself from a few siblings by routing tempo/loop to set_properties and undo/redo to history, but the enumeration largely mirrors the enum rather than adding distinct framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit alternative routing is given: 'To change tempo or loop settings use set_properties on \'song\'. For undo/redo use the history tool.' This is clear when-to-use-elsewhere guidance. It stops short of when-not to use transport itself, but the alternatives are named concretely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_notesA

Add MIDI notes to a clip (additive: existing notes stay). Each note: pitch (0-127), start_time and duration (beats, duration > 0) and optionally velocity (1-127, default 100), mute, probability (0-1, default 1), velocity_deviation (-127..127, default 0), release_velocity (0-127, default 64). Every note is validated before anything is written, so a bad note rejects the whole call (up to 5000 notes per call). Live never lets notes of one pitch overlap: a new note shortens an earlier note of that pitch that runs into it, and one starting at exactly the same time replaces it, so note_count in the result can be lower than expected. Returns the new note ids. One undo step. To replace or change existing notes use edit_notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesYesNotes to add
expectNoGuard: {"name": "..."} must match the clip
addressYesA MIDI clip

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly=false, idempotent=false, destructive=false) by disclosing validation atomicity ('a bad note rejects the whole call'), the 5000-note cap, same-pitch overlap behavior that can shorten or replace earlier notes (lowering note_count), the returned note ids, and single-undo semantics. This is exactly the domain-specific conduct an agent needs and cannot infer from the flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, and every clause carries real information (ranges, atomicity, overlap, undo). It is dense as a single paragraph; splitting the per-note field list from the behavioral notes would read more cleanly, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, it describes return values (new note ids, note_count) and edge cases. For a nested-object mutation tool with 100% schema coverage and full annotations, this leaves no material gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fields carry only thin descriptions ('Notes to add'), so the description compensates richly: it documents pitch range (0-127), beats-unit start_time/duration with duration>0, and defaults for velocity (100), probability (1), velocity_deviation (0), and release_velocity (64). This adds substantial meaning beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Add MIDI notes to a clip') and immediately clarifies scope ('additive: existing notes stay'). It explicitly distinguishes itself from the sibling 'edit_notes', so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit alternative and the condition that selects it: 'To replace or change existing notes use edit_notes.' The additive semantics are stated up front ('existing notes stay'), removing the main ambiguity about when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 63 tool updatesv2.0.3
    • Addedanalyze_audio_clip
    • Addedbatch
    • Addedbrowse
    • Removedbulk_edit_clips
    • Removedbulk_set_device_parameters
    • Addedcancel_ramps
    • Addedclear_automation
    • Addedclip_action
    • Addedconvert
    • Addedcreate
    • Removedcreate_clip
    • Removedcreate_midi_track
    • Addeddelete
    • Removeddelete_clip
    • Addeddescribe_set
    • Addeddevice_action
    • Addeddraw_automation
    • Addedduplicate
    • Removededit_clip_notes
    • Addededit_notes
    • Removedeval_python
    • Removedfire_clip
    • Removedfire_scene
    • Addedfollow_actions
    • Addedgenerate_notes
    • Addedget_automation
    • Removedget_browser_items
    • Removedget_browser_tree
    • Removedget_bulk_session_structure
    • Addedget_capabilities
    • Removedget_clip_notes
    • Addedget_device
    • Removedget_device_parameters
    • Addedget_notes
    • Addedget_properties
    • Removedget_session_info
    • Removedget_track_detail
    • Removedget_track_structure
    • Addedhistory
    • Addedlaunch
    • Addedlist_properties
    • Removedload_browser_item
    • Addedload_item
    • Addedramp_parameter
    • Addedrouting
    • Removedset_clip_color
    • Removedset_clip_name
    • Removedset_device_parameter
    • Addedset_properties
    • Removedset_scene_name
    • Removedset_tempo
    • Removedset_track_arm
    • Removedset_track_color
    • Removedset_track_mute
    • Removedset_track_name
    • Removedset_track_solo
    • Removedstart_playback
    • Removedstop_all_clips
    • Removedstop_clip
    • Removedstop_playback
    • Addedtransform_notes
    • Addedtransport
    • Addedwrite_notes
  2. 33 tool updatesv1.0.0
    • First observedbulk_edit_clips
    • First observedbulk_set_device_parameters
    • First observedcreate_clip
    • First observedcreate_midi_track
    • First observeddelete_clip
    • First observededit_clip_notes
    • First observedeval_python
    • First observedfire_clip
    • First observedfire_scene
    • First observedget_browser_items
    • First observedget_browser_tree
    • First observedget_bulk_session_structure
    • First observedget_clip_notes
    • First observedget_device_parameters
    • First observedget_health
    • First observedget_session_info
    • First observedget_track_detail
    • First observedget_track_structure
    • First observedload_browser_item
    • First observedset_clip_color
    • First observedset_clip_name
    • First observedset_device_parameter
    • First observedset_scene_name
    • First observedset_tempo
    • First observedset_track_arm
    • First observedset_track_color
    • First observedset_track_mute
    • First observedset_track_name
    • First observedset_track_solo
    • First observedstart_playback
    • First observedstop_all_clips
    • First observedstop_clip
    • First observedstop_playback

TDQS

A4/5.0

Scored across 32 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but a few read-oriented tools overlap: get_properties, get_device, and list_properties all inspect object state, and get_health/get_capabilities both report versions and feature probes. Descriptions help tell them apart, but an agent could still hesitate between them. Overall, the set is well differentiated for a large surface.

Naming Consistency3/5

The server mostly uses snake_case, but mixes verb_noun names (get_properties, draw_automation, edit_notes) with single verbs (create, delete, launch, browse) and noun_action names (clip_action, device_action, follow_actions). This produces a readable but inconsistent pattern across 32 tools. A stricter verb_noun convention would make the set more predictable.

Tool Count3/5

32 tools is heavy for an MCP server, and several families (properties, automation, notes, clip/device actions) could be consolidated. The domain—Ableton Live’s full production environment—is genuinely broad, so the count is defensible, but it sits at the borderline where selection effort becomes significant.

Completeness4/5

The surface covers much of Live’s API: tracks, scenes, clips, devices, parameters, notes, automation, routing, browser, conversions, and undo. Notable gaps include arrangement recording (transport lacks a record action), export/render, and track grouping, though most core workflows can be accomplished with workarounds. The set is fairly complete for its scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Local 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.
    59
    12 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server to control Ableton Live via the Live API, offering curated tools for transport, tracks, clips, devices, automation, and more, plus a generic layer to access the entire Live Object Model.
    MIT