Skip to main content
Glama

Live Maestro

An AI copilot for Ableton Live™. Speak in natural language to program drums, generate chord progressions, tweak synthesizers, shape automation, and mix your tracks, right inside your open Live set.

License: AGPL-3.0 Python 3.11+ Ableton Live 11+ No telemetry Glama


Stay in the creative flow

Making music in a DAW is inspiring, but clicking around to draw notes, adjust mixer faders, and tweak envelopes over and over can pull you out of the zone.

Live Maestro acts like an assistant producer sitting next to you in the studio:

  • Keep your hands on the music: Live stays open right in front of you. You listen, evaluate, and make the creative decisions.

  • Natural studio dialogue: Ask for beats, basslines, filter sweeps, sidechain setups, or mix adjustments in plain language.

  • Real parameters, real clips: Nothing is faked or pre-rendered. Everything is written directly into your active project as editable MIDI notes, native devices, and standard Live automation envelopes.


Related MCP server: Ableton MCP

How it feels in the studio

Here is what collaborating with Maestro looks like in a session:

1. Beatmaking & Groove

You: "Build me a driving 126 BPM techno groove. Punchy 909 kick, a crisp clap on 2 and 4, and rolling 16th closed hats with a bit of velocity groove and swing."

Assistant: Created track Techno Drums with a 909 Drum Rack and a 4-bar looped clip at 126 BPM:

  • Kick: Four-on-the-floor on C1 with accented downbeats.

  • Clap: Sitting on beats 2 and 4 on D#1.

  • Hi-Hats: 16th notes on F#1 with alternating velocity dynamics (92 / 76 / 86 / 76) and the offbeats pushed late for a swung feel.

Clip is ready and playing.

2. Sound Design & Automation

You: "The hats feel too loud and harsh. Drop them by 2.5 dB, add an Auto Filter to the lead synth, and draw a 4-bar low-pass sweep that opens up towards the drop."

Assistant:

  • Reduced the Hi-Hat chain volume by 2.5 dB.

  • Added an Auto Filter (Low-Pass) to track Lead Synth.

  • Created a 4-bar automation envelope on the filter cutoff frequency, sweeping from 600 Hz smoothly up to 18 kHz.

3. Harmony & Chords

You: "Add a lush Neo-Soul chord progression in D minor on an Electric piano track. Keep the chords laid back with realistic human velocity."

Assistant:

  • Created a MIDI track Electric Piano with a Rhodes preset.

  • Wrote a 4-bar progression (Dm9, G13, Cmaj9, A7#9) with slight timing humanization and soft velocities between 65 and 85.


What you can do

Workflow

Example prompt

What Maestro does

🥁 Drums & Beats

"Create a 4-bar UK Garage drum beat with swung hats and ghost snares"

Creates drum tracks, loads kits, places MIDI notes with realistic velocities and swing

🎹 Chords & Melodies

"Write an 8-bar melodic bassline in F minor that follows the root notes"

Generates chord progressions, basslines, melodies, and arpeggios

🎛️ Sound Design

"Open the Wavetable filter cutoff to 65% and increase resonance slightly"

Adjusts native instruments, synthesizers, and audio effect parameters

📈 Automation & Envelopes

"Draw a 2-bar reverb swell into the pad clip, then copy the clip to bar 31"

Draws parameter curves, filter sweeps, and volume swells into Session clip envelopes, which travel with the clip onto the timeline

🎚️ Mixing & Levels

"Turn the bass down 3 dB, pan the rhythm guitar 25% left, and add a chorus"

Sets track volumes, panning, sends, returns, and insert effects

🎼 Arrangement & Structure

"Duplicate the verse clip to bar 17 in the Arrangement and drop a locator called Drop"

Copies Session clips onto the arrangement timeline, sets cue points/locators, loops sections

🎚️ Editing & Groove

"Transpose the synth lead up a minor third and quantize to 1/16 notes at 70%"

Transposes pitches, quantizes timing, modifies note lengths, and adjusts velocities


Three channels into Live

Maestro reaches Live through three complementary routes (docs/architecture.md):

  • Channel A: Real-Time Live Object Model (LOM): A loopback TCP connection (127.0.0.1:9878) to the custom Remote Script inside Live's process. Drives Session clips, MIDI note editing, device knobs, mixer levels, and real-time playback.

  • Channel B: Offline Project Files (.als): Direct inspection and safe modification of saved .als project files on disk when the target set is closed in Live (Live may continue running with another or blank set). Handles track automation, sidechain routing audits, and third-party VST parameter configuration, protected by automatic timestamped backups and hash validation.

  • Channel C: Audio Measurement (analyze_audio): A Max for Live device (devices/LiveMaestro_Analyzer.amxd) placed on any track, answering one OSC request per call over loopback UDP (127.0.0.1:9882). Reports EBU R128 loudness, oversampled true peak, stereo correlation broadband and below 120 Hz, and energy in seven bands. Optional: without the device every other tool works and this one reports device_not_found with the steps to load it.


MCP Tools & Resources

Maestro exposes 43 tools and 4 resources over the Model Context Protocol (MCP):

Intent Tools (Production Workflows)

  • Session & Inspection: get_session, get_track, get_clip, get_devices, describe

  • Tracks & Devices: create_track, delete_track, load_device, delete_device, set_parameter, set_parameter_display

  • Clips & MIDI Notes: create_clip, delete_clip, write_clip_notes, read_clip_notes, quantize_clip, transpose_clip

  • Mixing & Automation: set_mix, write_automation, read_automation, clear_automation

  • Audio Measurement (Channel C): analyze_audio

  • Arrangement & Transport: arrange, set_locator, set_arrangement_time, play, stop, fire_scene, set_tempo, set_loop

  • Offline Projects (Channel B): als_read, als_write

  • Sound Matching: match_sound, sound_index_status

  • Transcription: transcribe_stem

Smart Path Discovery: find_path

Looking up any of Live's 1,166 addressable paths by reading the whole catalog costs ~134,000 tokens. The find_path tool maps producer vocabulary ("turn the bass down", "filter cutoff", "quantize swing") into the right mechanism and ranked catalog rows in ~1.5k tokens, distinguishing between fixed LOM rows, runtime device parameters, and impossible requests.

Finding a Sound: find_sound

find_path answers which path serves an intent; find_sound answers which thing in Live's library could make a sound. It splits a phrase such as "warm bass" or "dark cinematic strings" into words, searches the browser for each one separately (the browser's own search matches one substring, spaces included, so the whole phrase finds nothing), and ranks the union by the preset's name and by the category its uri carries. Each candidate carries the argument block that loads it through load_device. Nothing is loaded, played or measured: the ranking reads the names Ableton gave these presets and says nothing about how any of them sounds.

Matching a Sound: match_sound

find_sound reads names; match_sound reads audio. Hand it a stem, a loop or a one shot and it ranks the installed library by how close each item sounds to it, which is what a rebuild needs when the source carries no names at all.

The comparison runs against the audio Ableton renders for its own browser previews, which sits beside the content under Ableton Folder Info/Previews and is ordinary Ogg Vorbis. That route exists because the direct one does not: Ableton's factory samples carry an able compression type, a same-size transform of the payload, and neither Python nor Max for Live inside Live's own process reads them. Both were measured against a running Live and the readings are in measurements/spikes/.

The descriptor is pure Python with no third-party package: a 2048-point transform at 32 kHz reduced to 32 logarithmic bands, plus spectral centroid, rolloff, peakiness, onset rate, sustain fraction and crest factor. Level is removed on purpose, so a quiet recording and a loud one of the same sound match exactly; pitch is not matched.

Tell it what the instrument is. Measured against the separated stems of a real song, ranked against the whole library: with the settings it ships with, a twenty second window, the top candidate shared the probe's family 1 time in 7; on one and a half second slices the same descriptor managed 6 of 20. A bass stem answers with drum kits and a guitar stem with pads. Given instrument="bass", the same audio answers with basses, and instrument="guitar" answers with plucked guitars. The order inside an answer is not reproducible either: two windows of one stem share about one name in ten of their top ten, because the stem moves further from itself between windows than the whole candidate list is wide. Read it as a shortlist to audition, not a ranking, and see measurements/spikes/spike-match-sound-window-dependence.json. drum_kit and drum_hit are separate families, because a kit stem answered with five single hi-hats is a useless answer.

Build the index by running live-maestro-index, which is installed alongside the server. It takes about a quarter of an hour, needs no network, and is not committed: it describes one machine's installed packs.

macOS only. Decoding goes through afconvert, which ships with macOS, and the library is looked for in the macOS locations. On another system match_sound and live-maestro-index say so and every other tool is unaffected. What it cannot describe is behaviour per note, because a preview is the phrase Ableton chose rather than a note anyone played.

Notes out of Audio: transcribe_stem

Hand it a separated stem and it returns notes in clip beats, or writes them straight into a Session clip. The transcriber is basic-pitch (Apache 2.0), which runs in an environment of its own because it supports Python up to 3.11 while this server runs later; without that environment the tool answers no_transcriber and nothing else is affected.

Against the MIDI a generator exported for the same five separated stems, with nothing tuned, the pitch content agreed between 93.7 and 96.2 percent. A transcriber reports what is in the signal, though, and one played note puts more than one thing there: an octave and a twelfth above a bass note are loud enough to look like notes. Those are removed where a lower, louder, simultaneous note explains them, which raised a guitar's agreement from 95.4 to 96.9 percent while taking it from 835 notes to 635 against an export of 580. monophonic=True is a separate step for a part played one note at a time; on a bass it takes 463 notes to 401, the median pitch from seven semitones above the export's to five, and the agreement from 92.0 to 93.2 percent. Bass stays the weakest case and the record says so. Recompute any of these with scripts/eval_transcription.py.

Generic LOM Escape Hatches

Direct, low-level access to the entire verified catalog surface:

  • lom_get / lom_set: Read or write any catalogued property with read-back confirmation.

  • lom_call: Invoke allowlisted Live Object Model methods.

  • lom_batch: Execute multiple operations in a single round trip to eliminate socket latency.

  • lom_describe: Deep runtime inspection of Live objects, collections, and device chains.

  • lom_enums: Inspect and decode Live integer enum members.

MCP Resources

  • live://session: Live snapshot of active tracks, clips, and mixer state.

  • live://catalog: Map of all catalog areas, counts, and status indicators.

  • live://catalog/{selector}: Query catalog rows by area, status, or search term.

  • live://limits: Documentation of known API and DAW constraints (docs/limits.md).


Safety & Two-Way Verification

A command sent to Live can be refused, clamped, or applied late, and a plain success reply shows none of that.

  • Safe Dry-Run by Default: Destructive and structural operations (delete_track, delete_device, delete_clip, clear_automation, set_locator, als_write, transcribe_stem's write, and the load step of load_device) require explicit confirm=True. Without confirmation, Maestro performs a safe dry run and reports exactly what would be removed or altered.

  • Three writes are destructive and are not gated, because gating every note edit would make ordinary work unusable: write_clip_notes with its default mode="replace" discards every note in the target clip, and quantize_clip and transpose_clip rewrite one in place. All three are annotated as destructive so a client can ask, and read_clip_notes is how to look first. There is no undo through this server and the Live Object Model has no rollback.

  • Read-Back Verification: Parameter updates via lom_set read the stored value back from Live and report the exact state: applied (exact match), clamped (quantized or bounded by Live), or not_observed (deferred or asynchronous update).

  • Change Baseline Checks: Methods that modify material (note duplication, quantizing, loop doubling) measure baselines before dispatching and verify the resulting state one round trip later.

  • Empirical LOM catalog: Built on a catalog of 1,166 rows across 5 files, with 1,130 verified against a running Ableton Live, spanning the song and transport, tracks, clips, native devices, and the browser.


Quick start

You need Ableton Live 12 and uv. No repository, no virtual environment, no Python knowledge.

1. Install it

uv tool install git+https://github.com/romanstark/live-maestro.git

2. Set up Live

live-maestro-install

This finds your Ableton Live User Library, copies the Remote Script into it, and puts the analyzer device where Live's browser looks for it. It prints every path it touched, and it never writes into another script's folder.

3. Switch it on in Live

Live → Preferences / Settings → Link, Tempo & MIDI → Control Surface → LiveMaestro

Then quit Live completely and start it again. Remote Scripts load only at startup: closing the set is not enough, and Live reports nothing either way.

Check that it answers by asking your assistant for get_session, which reports the script handshake. From a checkout there is also a shell form:

.venv/bin/python -m live_maestro.client ping

4. Connect your AI assistant

Add the server to your MCP client configuration (Claude Desktop, Cursor, Antigravity IDE):

{
  "mcpServers": {
    "live-maestro": {
      "command": "live-maestro"
    }
  }
}

To run it without installing anything permanently, let uvx fetch it per launch:

{
  "mcpServers": {
    "live-maestro": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/romanstark/live-maestro.git", "live-maestro"]
    }
  }
}

Live still needs its two files either way. With this arrangement, install them once with uvx --from git+https://github.com/romanstark/live-maestro.git live-maestro-install.

5. Put the analyzer device on a track (only for analyze_audio)

The installer places LiveMaestro Analyzer in your User Library, where Live's browser lists it under Presets → Audio Effects → Max Audio Effect. Drag it onto the track you want to measure, last in the chain: it reads the signal at its own position, so anything after it is not in what it reports. It passes audio through unchanged.

Only analyze_audio uses it. Every other tool works without it, and without it that one tool says so and names these steps. Live does not reload a changed device, so after an update replace any copy already loaded in a set. Skip the device entirely with live-maestro-install --no-device.

Four environment variables change where the server looks, and none of them is normally needed:

Variable

Default

What it changes

LIVE_MAESTRO_PORT

9878

The TCP port the Remote Script listens on. Change it in the Remote Script too, or nothing answers.

LIVE_MAESTRO_HOST

127.0.0.1

Where to look for Live. Loopback is the only arrangement this project has measured; the Remote Script speaks no authentication, so anything else is your own arrangement to secure.

LIVE_MAESTRO_ANALYZER_PORT

9882

The UDP port the analyzer device listens on. Change it in the device too.

LIVE_MAESTRO_BASIC_PITCH_PYTHON

unset

Interpreter of the environment holding basic-pitch, which only transcribe_stem needs. Unset, the usual places are looked at and the tool says how to make one if it finds nothing.

Open a project in Ableton Live and start by asking: "What tracks are in this set?"


Your music stays yours

  • 100% Local: All communication between your AI assistant and Ableton Live happens over a local, internal loopback connection on your computer.

  • No telemetry or cloud tracking: Maestro collects zero analytics, has no database, and does not upload your MIDI, audio, project files, or prompts to any external server.

  • Minimal dependencies: Pure local code with no hidden web scrapers or cloud telemetry.


What stays in your hands

Live's API is extensive, but some things are intentionally reserved for you in the DAW interface:

Task

Why

How to do it

Export / Audio Bounce

Not exposed by Live's scripting API

Use File → Export Audio/Video in Live

Save Project

Not exposed by Live's API

Press Ctrl+S / Cmd+S as usual

Group Tracks

Read-only in Live's API

Press Ctrl+G / Cmd+G in Live

Track Order

No LOM method moves a track, so reordering means rebuilding one

Drag the track header in Live

Unconfigured Third-Party VSTs

How much of a plugin the Object Model sees is decided by the plugin, and Configure mode is how Live adds more

Click Configure on the VST and click the parameters you want exposed

Critical Listening

AI can shape parameters, but only you have ears

Listen on your monitors/headphones and guide the music


Also using Steinberg Dorico®?

If you also work with music notation, check out Dorico Maestro, an MCP server built with the same architecture for Steinberg Dorico. Use the same AI assistant to bridge your workflow between session sketching in Live and engraving parts in Dorico.


Development

Working on the server itself rather than making music with it:

git clone https://github.com/romanstark/live-maestro.git
cd live-maestro
python -m venv .venv

Activate it with .venv\Scripts\activate on Windows or source .venv/bin/activate on macOS and Linux, then:

pip install -e ".[dev]"
python scripts/install_script.py

The [dev] extra adds pytest, ruff, pyright and pyrefly, which are the four CI gates, and is only needed for the tests and the checkers. scripts/install_script.py is the same installer as live-maestro-install and takes the same flags: it calls live_maestro.installer, which ships inside the wheel so that a user with no checkout can run it.

Point your MCP client at the checkout's interpreter while you work on it:

{
  "mcpServers": {
    "live-maestro": {
      "command": "/absolute/path/to/live-maestro/.venv/Scripts/python.exe",
      "args": ["-m", "live_maestro.server"]
    }
  }
}

On macOS and Linux the interpreter is .venv/bin/python rather than .venv/Scripts/python.exe.


Documentation & Developer Resources

For technical details, architecture specs, and contributing:


Ableton is a registered trademark, and Live, Max for Live, Link, Drum Rack, Operator and Sampler are trademarks of Ableton AG. Steinberg, Dorico and VST are trademarks or registered trademarks of Steinberg Media Technologies GmbH, registered in Europe and other countries.

Live Maestro is an independent open-source project and is not affiliated with, endorsed, sponsored, or supported by Ableton AG or Steinberg Media Technologies GmbH. For full third-party notices, licenses, and attributions, see THIRD-PARTY.md.

Available Tools

43 tools
als_readA
Read-onlyIdempotent

Read a saved Ableton project (.als) or rack (.adg) from disk.

Returns:
    Dictionary containing project metadata, track list, devices, and automation structure.

Note:
    This is Channel B, a peer of the live connection rather than a fallback. It
    answers two questions the LOM never will: what is in someone else's project, and
    where an envelope's breakpoints actually sit.

    Automation lives in two places and the LOM can read only one of them. Measured
    over the 174-project corpus (docs/limits.md section 9): 52 (30 %) have clip
    envelopes but 159 (91 %) have
    track automation, and a tool that counted clip envelopes alone reported 110 of
    those projects as unautomated. The two layers are reported separately here and
    are never added together.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFilesystem path to a saved .als project or .adg rack. The file is read from disk and is not opened in Live, so it does not have to be the set currently on screen.
trackNoNarrow the read to one track, given either as its name or as its index in a string. Empty reads the whole project.
locateNoAnswer with the arguments als_write needs to edit a field, instead of the project survey: the ElementTree expression, the attribute, the index that picks the right match, and the value currently there. 'tempo' for the project tempo, 'track_names' for every track's name. These are the fields usually edited on a file. Anything else needs an expression built by hand, which als_write's own confirm=False resolves against the file and reports on before it writes.
reportNoTrue adds a formatted summary written for a person to read, alongside the structured answer rather than instead of it.
with_notesNoTrue parses the clip notes and reports note metrics, which is the expensive part of the read on a large project.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive; the description adds materially useful behavior beyond that: the file is not opened in Live, automation exists in two separate layers, and those layers are never added together. The corpus stats reinforce a subtle reporting behavior that could otherwise cause misinterpretation.

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 description front-loads the core purpose and return shape before a focused note. The note is somewhat long with corpus statistics, but it earns its place by explaining the automation-layer split, a non-obvious behavioral detail. It is structured and readable, though slightly verbose.

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 the output schema exists and the annotations cover safety/idempotency, the description covers the key remaining context: disk-based read scope, relationship to the live connection, automation layer separation, and cost implications of with_notes. An agent has enough context to select and invoke the tool 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?

The input schema provides 100% parameter coverage with detailed descriptions, so the baseline is 3. The description adds only light context beyond the schema, such as with_notes being the expensive part and locate returning als_write-ready arguments, but it does not meaningfully exceed the schema's already thorough parameter documentation.

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 description states a specific operation ('Read a saved Ableton project (.als) or rack (.adg) from disk') and names the returned content (metadata, track list, devices, automation structure). It also distinguishes itself from live-session/LOM siblings by framing itself as Channel B, a peer connection that reads files the LOM cannot.

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?

The description explicitly positions the tool versus the LOM: it is 'a peer of the live connection rather than a fallback' and answers two questions the LOM never will — reading someone else's project and locating envelope breakpoints. This gives clear selection guidance for when this file-based read is appropriate instead of live-session tools.

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

als_writeA
Destructive

Edit a saved .als project file on disk. Requires confirm=True.

The target file must not be the one Live currently holds: Live writes its own memory
over the file when it next saves, without a conflict warning, and the edit is gone. Live
running on a different set is fine.

Returns:
    Dictionary reporting write status, changes made, and verification report.

Note:
    ``sidechain`` and ``configure`` reach what the LOM cannot; for the set open in Live
    use ``lom_set``, ``set_parameter`` or ``set_mix`` instead. Measured across the
    174-project corpus (docs/limits.md section 9), 74 of 82 projects in the house/trance
    BPM window use sidechain compression, median 6 wirings each.

    ``configure`` fills a plug-in's parameter strip whatever the strip currently holds.
    Two parameters written into an instance whose strip held nothing came back on reopen
    with their real values, writable through ``lom_set`` with ``read_back: applied``.
    Live allocates 128 slots per instance and leaves them all in the file, so nothing is
    inserted: three fields of an existing element are filled.

    ``attribute`` sets one attribute anywhere in the file, addressed by an ElementTree
    expression. An expression matching more than one element is refused unless ``index``
    picks one, and ``index`` counts the matches of that expression rather than tracks in
    the project: ``.//MidiTrack/Name/EffectiveName`` does not see the audio tracks at
    all. ``als_read`` with ``locate='tempo'`` or ``locate='track_names'`` answers with
    the expression, attribute and index for those fields; otherwise the expression is
    built by hand, and ``confirm=False`` resolves it against the file and reports what
    it selects.
ParametersJSON Schema
NameRequiredDescriptionDefault
tapNoWhere the sidechain listens on the source track: 'pre' before that track's own effects and fader, 'post' after them. Used by 'sidechain' only.post
pathYesFilesystem path to the .als project to edit. A backup is written first and can be put back with the restore operation.
indexNoWhich match to edit when the expression selects more than one element, counted from 0. An ambiguous expression is refused rather than resolved to the first match, so this is how to disambiguate.
valueNoFor 'attribute', the new attribute value. For 'configure', the parameter strip assignment as '<index>=<name>; ...'.
backupNoPath to the backup file to put back. Required by the 'restore' operation and read by no other.
createNoTrue adds the attribute when the element does not already carry it. False refuses, which catches a misspelled attribute name instead of inventing a field Live will ignore.
deviceNoDevice index within the target track chain, counted from 0. Used by 'sidechain' and 'configure'.
confirmNoTrue carries the edit out. False changes nothing and reports what the call requires, which is how to check the arguments first.
attributeNoWhich attribute of the selected element to set. Live stores most numbers under 'Value'. Used by 'attribute' only.Value
operationYesWhat to do. 'sidechain' wires a compressor to a trigger track, 'configure' fills a plug-in parameter strip, 'attribute' sets one XML attribute anywhere in the file, 'restore' puts a backup back. Each one reads a different subset of the arguments below.
expressionNoElementTree path selecting the element to edit, e.g. './/MasterTrack/DeviceChain/Mixer/Tempo/Manual'. Used by 'attribute' only. Read the tree with als_read first.
source_trackNoName of the track the compressor should listen to, which is usually the kick. Used by 'sidechain' only.
target_trackNoName of the track carrying the device to edit, as it appears in Live. Used by 'sidechain' and 'configure'.
allow_live_runningNoTrue permits the edit while Live is running at all. The check behind it looks for a running Live process and cannot tell which set that process holds, so it is not a guard against editing the open one: only you know that. What matters is the file, not the process. Live open on a different set is harmless. Live holding this file overwrites the edit from memory when it next saves.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the destructiveHint annotation by disclosing the backup-and-restore behavior, the confirm=False dry-run mechanism, the risk of Live overwriting edits, and detailed operational side effects such as fill-in-place behavior for configure and expression-match refusal for attribute. This is substantial behavioral context that an agent would otherwise have no way to infer.

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 description is long but well structured, with the core statement and safety requirement front-loaded, followed by returns and operation-specific notes. Most content earns its place due to the tool's complexity, though the corpus statistics about sidechain usage are arguably secondary and could be trimmed without losing essential guidance.

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 14-parameter, four-operation mutation tool with no openWorldHint and a destructive annotation, the description covers the critical context: when to edit, what gets changed, how to verify, how to avoid data loss, and how each parameter interacts with each operation. Combined with the rich schema and an output schema, nothing essential is left unexplained.

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?

Although the schema coverage is 100%, the description adds significant meaning beyond the field definitions: it maps each operation to its relevant argument subset, explains confirm=True/False as a check-and-apply flow, and clarifies subtle semantics like index counting expression matches rather than project tracks. This materially helps an agent choose and populate parameters correctly.

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 description opens with a specific verb and resource—'Edit a saved .als project file on disk'—and clarifies the scope by naming the sibling tools it is not, such as lom_set, set_parameter, and set_mix. It also distinguishes operations within the tool (sidechain, configure, attribute, restore), making its purpose immediately intelligible.

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?

It explicitly states when not to use the tool: the target file must not be the one Live currently holds, and warns about Live overwriting edits. It names the alternative tools to use for the set open in Live and references als_read for building expressions, giving an agent clear routing guidance without ambiguity.

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

analyze_audioA
Read-onlyIdempotent

Measure the audio itself: loudness, true peak, stereo phase and band balance.

Reads the LiveMaestro Analyzer Max for Live device over loopback OSC; without it this
reports device_not_found with the steps to load it.

- Loudness to EBU R128: momentary 400 ms, short term 3 s, gated integrated since
  reset, range.
- True peak, oversampled, with sample peak, RMS and the crest factor between them.
- Stereo correlation full band and below 120 Hz, and low-end survival of a mono sum.
- Seven band energies on the mono sum, and their weighted centre, not an FFT centroid.

The device reads at its position in the chain, so it belongs last: an effect
after it is not in the reading. A master chain sits before the master fader, so a
master reading matches the output only at 0.0 dB. The two peak figures are maxima
since the last reset and only rise: to measure one, call with
reset=true and no accumulate, let a pass of the material through, then call again.
The averaged figures need no reset. What it proves is what the signal measured
passing the device, not the room.

Every measurement carries the transport state from immediately after it, so a reading
taken mid scene change can be recognised. ``in_transition`` is true while any track
reports fired_slot_index 0 or more, a launch waiting for the next quantization boundary,
and ``tracks_sounding`` counts tracks whose playing_slot_index is 0 or more while the
transport runs, 0 when stopped: clips Live plays, not what is audible. Unreadable state
gives ``transport`` null with a code and one sentence in ``transport_unavailable``, or
not_queried when the analyzer did not answer.
ParametersJSON Schema
NameRequiredDescriptionDefault
resetNoRestart the integrated loudness and loudness range before measuring, to integrate one section rather than everything since the audio engine started. The reply that performs the reset reports no integrated figure, because it had just begun. It applies to a call with no 'accumulate' at all: an accumulation samples the device on its own schedule, and accumulate='read' reports the windows already counted rather than taking a fresh measurement, so a call that passes both performs no reset.
trackNoWhich analyzer to read: a track name, a zero-based track index, 'master' for the main track, or '*' for whichever instance answers first. Every instance in the set answers every request, and the result lists them all under 'answered'. An index or 'master' costs one extra round trip, because the device reports the name of its track and the index is resolved against the set here.master
window_msNoHow far back the averaged measurements reach, in milliseconds. This governs the averaged figures alone: RMS, both correlations and the seven bands. Loudness keeps its own EBU windows and the peaks are maxima since the last reset. This looks backwards at audio that already played and returns immediately. It does not record for this long. The device buffers a fixed number of samples, so the window this reaches depends on the sample rate: about 2180 ms at 44.1 kHz and 1000 ms at 96 kHz. A longer request is clamped without complaint, so read window_ms back off the result rather than assuming the request was honoured.
accumulateNoAccumulate band occupancy and levels over multiple analysis windows. 'start' begins periodic background sampling; 'read' returns the accumulated occupancy percentages and averaged levels across all sampled windows, together with the span they were taken over; 'reset' stops and clears accumulation. Occupancy is a share of time, so it is reported on 'read' alone: a single call measures one window and reports none.
occupancy_threshold_dbNoThreshold in dB relative to the loudest band in each analysis window. A band is counted as occupied if its level is within this threshold of the loudest band. It takes effect on accumulate='start' alone, because that is where the counting happens: an accumulate='read' reports the threshold its own accumulation was started with, and a single call counts no occupancy at all.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds far more: device dependency, monotonic peak behavior, placement effects, master fader dependency, and transport-state caveats including in_transition and tracks_sounding. It also discloses failure modes like device_not_found and transport null. No contradiction with 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?

The description is well structured: a one-line summary, a compact bullet list, then short paragraphs for device placement, reset procedure, and transport state. It is long but dense and mostly earns its length; a small deduction because the transport-state detail could be considered redundant if the output schema already documents those fields.

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 tool with this complexity, the description covers prerequisites, failure behavior, parameter interactions, placement constraints, reset workflow, and output interpretation. Combined with the annotations and output schema, it gives an agent everything needed to invoke the tool correctly and interpret the reading accurately.

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%, and each parameter already has rich semantic documentation. The prose adds workflow guidance like 'call with reset=true and no accumulate', but it does not materially expand parameter meaning beyond what the input schema already provides, which matches the high-coverage baseline of 3.

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 description opens with a specific verb and object ('Measure the audio itself') and immediately enumerates the exact measurements: loudness, true peak, stereo phase, and band balance. This clearly differentiates it from sibling tools like get_session, describe, or get_track, which do not claim audio-signal measurement.

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 operational context: it requires the LiveMaestro Analyzer device, reports device_not_found otherwise, must be placed last in the chain, and needs a reset-then-measure cycle for peak figures. It does not explicitly name alternative sibling tools or say when not to use it, so it stops short of a 5.

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

arrangeA

Copy Session clips onto the Arrangement timeline at beat positions.

Supports two modes:
1. Single placement: specify track, slot, at_beat (and optionally to_track).
2. Batch placements: pass a placements list to duplicate several clips and verify
   each one against the destination track it landed on.

A copy, not a move: the Session clip stays in its slot and the two are separate
clips afterwards, so editing one leaves the other alone. This is how a Session
idea becomes an arrangement, and how clip automation written by write_automation
reaches the Arrangement timeline.

Returns:
    For single placement: dictionary with placement status, destination track,
    clip counts before and after, the beat the clip actually landed on, and the
    clip itself under placed_clip. Both modes identify a placement by comparing the
    destination track before and after, so a clip that was already on the requested
    beat never stands in for one that did not land.
    For placements list: dictionary with per-placement requested_beat, actual_beat,
    ok, and summary counts.

Note:
    Call it once per placement. Repeating the same call adds another copy at the
    same beat rather than replacing the first, so a retry after an unclear result
    needs the clip count in this answer checked first.

    A list retries worse than a single call, not better: a list that half landed
    doubles what landed if it is sent again. 'destinations' carries the clip count
    per destination track before and after, which is the number to check first.

    Use create_clip and write_clip_notes to build the source clip, and
    set_arrangement_time then play to hear where it landed.
ParametersJSON Schema
NameRequiredDescriptionDefault
slotNoClip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down. Required if placements is omitted.
trackNoTrack index in song.tracks, counted from 0. Required if placements is omitted.
at_beatNoWhere the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted. Required if placements is omitted.
to_trackNoTrack index to place the copy on. Omit to use the source track, which is the usual case. A MIDI clip needs a MIDI destination.
placementsNoList of placements to duplicate onto the Arrangement timeline, each verified against the destination track it landed on: [{"track": 0, "slot": 1, "at_beat": 64.0, "to_track": null}, ...]. A long list is chunked across several round trips rather than refused. When provided, the single-placement parameters (track, slot, at_beat) must be omitted, including to_track, which each placement carries itself.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, idempotentHint=false, destructiveHint=false), but the description goes well beyond them. It clarifies non-destructive copy behavior, explains that repeated calls add duplicates (non-idempotent), details the return structure and how to detect placement failures, and notes that long lists are chunked. It even warns about the risk of re-sending partially-successful lists. This is rich 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.

Conciseness5/5

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

The description is structured logically: purpose, modes, copy semantics, return details, and practical notes. It is comprehensive without redundancy; every sentence adds information. Front-loading the core purpose and modes ensures agents quickly grasp the tool's function, while the later notes address edge cases. It is long but efficient for the tool's complexity.

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 the tool's complexity (two modes, 5 parameters, output schema present), the description covers return values, usage patterns, and common pitfalls. It explains how to verify results, warns about retry behavior, and integrates with surrounding tools (create_clip, write_automation). The presence of an output schema reduces the need to describe return fields, and the description still adds operational context. Nothing critical 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. The description adds value by explaining the two modes and how parameters interact (e.g., to_track omitted for source track, MIDI needs MIDI destination, placements list omits single-placement parameters). It also clarifies the meaning of at_beat with fractional beats and the verification logic. This goes beyond the schema, justifying a 4.

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 description opens with a precise action: 'Copy Session clips onto the Arrangement timeline at beat positions.' It then distinguishes two operational modes (single vs. batch) and explicitly states it is a copy, not a move, making the tool's role unambiguous. It also connects to related workflows (write_automation, create_clip) without confusing it with siblings.

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?

It explicitly states when to use this tool: 'This is how a Session idea becomes an arrangement, and how clip automation... reaches the Arrangement timeline.' It also gives guidance on building the source clip with create_clip and write_clip_notes, and how to verify placement with set_arrangement_time and play. It warns against retries and explains the difference between single and list calls, providing clear when/why guidance.

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

clear_automationA
Destructive

Delete automation envelopes on a Session clip. Requires confirm=True.

With confirm=False it changes nothing and reports the envelope it would remove: its
range, where the low and the high point sit, and how densely it was sampled to find
them. That report covers one named parameter; with all_envelopes it says only whether
the clip is automated at all, because has_envelopes is one flag for the whole clip. To
see which parameters those envelopes belong to, read clip.automation_envelopes with
lom_get and then each automation_envelopes[i].parameter.name.

Returns:
    Dictionary reporting the clearance, or the envelopes that would go.

Note:
    A cleared envelope is gone, and the parameter falls back to whatever value it holds
    outside the clip rather than to the first breakpoint. Sample it with read_automation
    first if the shape might be wanted back, since nothing here restores it.

    The dry run samples the curve rather than reading its breakpoints, so a feature
    narrower than the reported sampling step can still sit between two samples. Where
    the exact shape matters, read it with read_automation at a resolution you choose, or
    read the breakpoints out of the saved file with als_read.

    To change a curve rather than remove it, write_automation with ``clear_first=True``
    replaces it in one call and needs no clearing first.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
confirmNoTrue carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it.
parameterNoLOM path to the one DeviceParameter whose envelope should go, e.g. 'song.tracks[0].mixer_device.volume'. Leave empty only when all_envelopes is true.
all_envelopesNoTrue clears every envelope on the clip, ignoring ``parameter``. One of this or ``parameter`` has to be given; neither is refused rather than treated as clear everything.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, but the description adds essential nuance: confirm=True actually deletes, confirm=False is a dry-run report. It discloses the fallback behavior (parameter returns to outside value, not first breakpoint), sampling limitations, and the all_envelopes report limitation. This goes far beyond the annotation 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?

The description is lengthy but every section serves a purpose. It is front-loaded with the primary action and structured with Returns and Note sections for clarity. Slightly more verbose than necessary, but the density of critical caveats justifies the length.

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 destructive tool with 6 parameters and an output schema, the description covers purpose, usage, behavior, parameter interactions, alternatives, and error handling (refusing Arrangement paths). Nothing an agent needs to call it correctly is missing.

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 enriches parameter meaning: confirm's dry-run vs. actual behavior, the mutual exclusivity of parameter and all_envelopes (neither is refused), and how to resolve parameter names via lom_get. It adds context the schema alone lacks.

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 description opens with a precise verb+resource: 'Delete automation envelopes on a Session clip.' It immediately distinguishes from Arrangement clips and names sibling tools (write_automation, read_automation) for alternatives. An agent can confidently select this tool over its siblings without ambiguity.

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 guidance is given: use write_automation with clear_first=True to change a curve, use read_automation to preserve shape, and use lom_get to inspect envelope parameters. It also clarifies the Session-only scope and the confirm requirement. No inference is needed.

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

create_clipA

Create an empty MIDI clip of a given length in a Session slot.

The target must be a MIDI track. An audio slot takes a sample instead, which is a
different call: lom_call with path='song.tracks[N].clip_slots[M]',
method='create_audio_clip' and one absolute file path (catalog row
clip_slot.create_audio_clip).

Returns:
    Dictionary with the creation status, the clip path, and the read-back length.

Note:
    An occupied slot is refused rather than overwritten, so nothing is lost by
    aiming at the wrong slot. To replace a clip, delete_clip first.

    The clip arrives empty. Fill it with write_clip_notes, and copy it onto the
    Arrangement timeline with arrange once it holds something.

    Live gives a new Session clip a loop: ``looping`` reads back true with
    ``loop_start`` at 0 and ``loop_end`` at the length asked for. That is Live's
    own default for Session clips and this does not set it. Turn it off through
    ``lom_set`` on ``clip.looping`` where the part is to play once.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName for the new clip. Empty leaves it unnamed.
slotYesClip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down.
trackYesTrack index in song.tracks, counted from 0.
length_beatsNoLoop length of the new clip in beats, so 4.0 is one bar in 4/4 and 16.0 is four. Must be greater than 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With annotations all set to false, the description carries the behavioral burden and delivers: occupied slots refuse rather than overwrite, the clip is empty on arrival, and Live's default looping behavior is disclosed. This goes beyond the schema and prevents surprise side effects.

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?

The description is organized into short purpose, return, and note sections, with no filler. Each sentence carries operational information and is front-loaded with the core purpose.

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?

It covers prerequisites (MIDI track), creation behavior, conflict handling, follow-up actions, and the default loop side effect, plus the return shape. Nothing an agent needs to call 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?

The schema already documents all four parameters at 100% coverage, so the baseline is 3. The description adds that track must be a MIDI track and connects length_beats to the read-back loop length, enriching parameter meaning beyond the 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 the exact operation: create an empty MIDI clip of a given length in a Session slot. The description also differentiates from the audio-slot counterpart by naming lom_call/create_audio_clip, so an agent can distinguish it 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 Guidelines5/5

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

Explicitly says when not to use it (audio slots) and names the alternative call. It also provides the workflow chain: fill with write_clip_notes, arrange to timeline, and delete_clip before replacing an occupied slot.

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

create_trackA

Insert a MIDI, audio, or return track and return its resolved index.

Returns:
    Dictionary with the resolved index of the new track, its kind and name, and
    the track count before and after.

Note:
    Inserting at index N shifts the track that was at N, and every track after it, up
    by one. Every track index held from before the call is then wrong, including ones
    in a plan not yet executed. Append with -1 where the position does not matter, and
    otherwise take the resolved index out of this answer rather than assuming it.

    Creating a track does not put an instrument on it. Select it and call
    load_device for that, then create_clip for something to play.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhat to create: 'midi' for a MIDI track, 'audio' for an audio track, 'return' for a send return. A return track is appended to song.return_tracks and cannot be named or positioned here.midi
nameNoName for the new MIDI or audio track. Empty leaves Live to name it, which produces a default like '3-MIDI'.
indexNoWhere to insert it in song.tracks. -1 appends at the end, which is the only value that leaves existing track indices alone. Ignored for a return track.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (which only indicate non-read-only, non-idempotent, etc.), the description discloses the important side effect of index shifting and the fact that previously held track indices become invalid. It also clarifies that no instrument is added and that return tracks are appended and cannot be named/positioned. This is rich, honest 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.

Conciseness5/5

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

The description is concise yet substantive. The one-line summary is followed by a Return section and a Note section, both front-loaded with the most operationally important warnings. Every sentence adds necessary information; there is no filler or repetition of schema details.

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 the tool's complexity, the 100% schema coverage, and the presence of an output schema, the description is complete. It explains the return dictionary contents, the critical index-shifting behavior, and the necessary follow-up steps. An agent has everything needed to invoke and interpret the result 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 adds value beyond the schema by clarifying the semantic implications of index values ('Append with -1... only value that leaves existing track indices alone'), reinforcing that the resolved index from the response should be used, and noting the return-track limitation of name/index. This surpasses baseline without fully re-explaining each 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?

The description opens with a specific verb and resource: 'Insert a MIDI, audio, or return track and return its resolved index.' It names the three track kinds and the tool's key output, making it easy to distinguish from sibling tools like create_clip or delete_track. The core purpose is unambiguous and not a tautology.

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?

The description explicitly explains when to append with -1 versus take a resolved index, and warns that inserting at N shifts existing indices. It also gives a clear follow-up workflow: 'Select it and call load_device for that, then create_clip for something to play,' naming specific alternatives and sequencing. This is strong guidance for an agent deciding how to use the tool.

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

delete_clipA
Destructive

Delete the clip in a Session slot, its notes and envelopes with it.

Requires confirm=True. With confirm=False it reports the clip name, length and
note count that the call would remove, and changes nothing.

Returns:
    Dictionary reporting the deletion, or the loss report when unconfirmed.

Note:
    This empties one Session slot. Slot indices do not shift, so nothing else
    moves and no other index goes stale.

    Emptying a clip is not the same as deleting it: write_clip_notes with an
    empty list and mode='replace' leaves the clip in place with its length,
    loop and envelopes intact. Prefer that where the slot should stay filled.
    A clip already copied into the Arrangement by arrange is a separate clip and
    survives this.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
confirmNoTrue carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already include destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it states that slot indices do not shift, that confirm=False only reports without changing anything, and that clips copied into the Arrangement are independent and survive. This reveals side effects and safety behavior that annotations cannot convey.

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?

The description is well-structured with clear headings (Requires, Returns, Note), front-loads the core action, and every sentence earns its place by conveying either a safety requirement, an edge case, or an alternative. Despite moderate length, there is no fluff, and the organization makes scanning easy.

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?

The description covers the full calling context: intended effect, safety mechanism (confirm=True), return values, side effects on slot indices, relationship to write_clip_notes, and behavior of Arrangement copies. An agent has everything needed to invoke the tool correctly and safely, especially with an output schema also present.

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%, so the schema already documents all four parameters thoroughly. The description does not add significant parameter-level detail beyond what the schema provides; it mostly restates the confirm behavior and path/track/slot alternatives already present in the schema. Baseline 3 is appropriate.

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 description opens with a specific verb+resource: 'Delete the clip in a Session slot, its notes and envelopes with it.' This distinguishes the tool from siblings like delete_track, create_clip, and write_clip_notes. It names what is removed (clip, notes, envelopes) and where (Session slot), leaving no ambiguity.

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?

The description explicitly tells when to prefer an alternative: 'Emptying a clip is not the same as deleting it: write_clip_notes with an empty list and mode='replace' leaves the clip in place... Prefer that where the slot should stay filled.' It also warns that an Arrangement copy survives deletion, helping an agent choose correctly. The confirm=True requirement is clearly stated as a precondition for actual removal.

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

delete_deviceA
Destructive

Delete one device from a track chain, its settings with it.

Requires confirm=True. With confirm=False it reports the name of the track, and
the device's name, class and parameter count, and changes nothing.

Returns:
    Dictionary reporting deletion status or pending loss report.

Note:
    The track is named in the report because a device name does not identify
    one. A device class like Utility or EQ Eight sits on several tracks in a
    normal set, so a loss report naming only the device reads the same whether
    the index points at the intended chain or at a neighbour's. Check the track
    name against the one you meant before confirming.

    Deleting shifts every later device in the chain down one index, so a second
    delete aimed at an index read before the first one lands on a different
    device. Read the chain again with get_devices between deletes.

    Two neighbouring intentions are not this tool. To reorder a chain nothing
    needs deleting: call ``song.move_device`` through lom_call. To swap the
    instrument on a track, load the replacement with load_device, which replaces
    the instrument already there in one step (measured). Deleting first only
    loses the settings earlier.

    ``kind`` reaches the return and main chains, which are addressed the same way
    get_devices addresses them. A return track carries its own index and the main
    track has none, so ``track`` is not read at all when kind is master.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.track
trackYesTrack index in song.tracks, counted from 0.
deviceYesDevice index in that track chain, counted from 0 left to right as Live draws it. get_devices lists the chain with its indices.
confirmNoTrue carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, but the description adds far more: the confirm=True/False safety gate with a no-op preview mode, the index-shifting side effect that makes repeated deletes land on different devices, and the rationale for why the track name appears in reports (device names are not unique across tracks). It also clarifies the return shape ('Dictionary reporting deletion status or pending loss report').

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 description is long (~220 words) but front-loaded with the core action and confirm semantics, then organized into Returns and a structured Note with distinct points. Every section addresses a real failure mode, but the Returns line is mildly redundant with the confirm paragraph and the track-naming rationale could be tightened. Slightly verbose, never wasteful.

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 destructive, non-idempotent mutation tool with 4 parameters, this is complete: it covers the danger gate (confirm), post-call hazard (index shift) and its mitigation, equivalent alternatives, cross-tool addressing consistency (get_devices), and a parameter edge case (master ignores track). The output schema exists, so return details need no further elaboration.

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 adds genuine behavioral nuance beyond the schema: that 'track' is not read at all when kind is master, that kind addresses return/main chains the same way get_devices does, and how confirm=False frames the report as a look-before-committing preview. This exceeds the baseline.

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 line names a specific verb ('Delete'), a precise resource ('one device from a track chain'), and the scope of the effect ('its settings with it'). It unambiguously distinguishes this from sibling deletion tools like delete_track and delete_clip, and from non-destructive neighbors like load_device.

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?

The description explicitly rules out neighboring intentions: reordering a chain should use song.move_device via lom_call, and swapping an instrument should use load_device because 'Deleting first only loses the settings earlier.' It also instructs the agent to re-read the chain with get_devices between deletes—concrete operational guidance for correct sequencing.

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

delete_trackA
Destructive

Delete a track with everything on it. Requires confirm=True.

The widest deletion here: the devices, every Session clip and every Arrangement
clip on that track go with it. With confirm=False it reports the track name, the
devices, the filled Session slots and the Arrangement clip count the call would
remove, and changes nothing.

Returns:
    Dictionary reporting the deletion, or the loss report when unconfirmed.

Note:
    Deleting shifts every later track down one index, so any track index read
    before this call is wrong afterwards. Re-read with get_session, and where
    several tracks are going, delete from the highest index downwards so the
    earlier indices stay valid.

    For something narrower, delete_clip empties one slot and delete_device takes
    one device out of the chain, neither of which renumbers anything.
ParametersJSON Schema
NameRequiredDescriptionDefault
trackYesTrack index in song.tracks, counted from 0.
confirmNoTrue carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: the confirm=True requirement, what exactly gets destroyed, the confirm=False preview behavior, and the side effect of renumbering later track indices. It also warns that previously read indices become invalid and advises re-reading via get_session. This aligns with and enriches the destructiveHint annotation without contradiction.

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?

The description is well-structured and front-loaded: the core purpose and confirm requirement come first, followed by scope, preview behavior, side effects, and alternatives. Each section earns its place, and the use of Returns/Note keeps the content organized without bloat.

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 the output schema exists, return values are adequately covered. The description covers invocation requirements, destructive scope, preview behavior, re-numbering side effects, operational guidance for multi-deletion, and alternative tools. There are no significant gaps for an agent to call this tool 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?

The schema already covers 100% of the parameters, so the baseline is 3. The description adds meaningful detail by explaining the confirm parameter's role as a safety gate: 'True carries the removal out. False changes nothing and returns a report of what the call would remove.' It also clarifies the consequence of the track index parameter by explaining the shift in indices after deletion.

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 description states a specific verb and resource ('Delete a track with everything on it') and clarifies the full scope: devices, Session clips, and Arrangement clips are all removed. It distinguishes itself from sibling tools by naming delete_clip and delete_device as narrower alternatives.

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?

The description explicitly explains when to use this tool versus alternatives: 'For something narrower, delete_clip empties one slot and delete_device takes one device out of the chain, neither of which renumbers anything.' It also provides concrete guidance on using confirm=False to preview before committing and deleting from highest index downwards when removing multiple tracks.

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

describeA
Read-onlyIdempotent

Introspect any Live object: class, properties, children, and methods.

The route to the dynamic surface: what a loaded plug-in actually exposes, which
no catalog can know in advance because it is decided at runtime and, for
third-party plug-ins, by what the user picked up in Configure mode.

Returns:
    Dictionary with the object class, its properties, its child collections, the
    methods the allowlist permits, and the parameter survey where asked for.

Note:
    Prefer this over lom_describe for a device, and prefer lom_describe for
    anything else. The difference is ``with_parameters``: lom_describe reports a
    device's parameters as a count, and a count is what a Live ``Vector`` that
    refuses ``len()`` fails to give, so a plug-in with parameters can be reported
    as having none. Measured against Live 12.4.5. When that happens this tool
    falls back to probing parameter indices, reports the names it found, and says
    which of the two answers you are looking at.

    Methods are never callable through a path. Take the name from here and invoke
    it through lom_call, which accepts only names on the Remote Script's own
    allowlist. For a device parameter, set it with set_parameter rather than
    writing the path by hand.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesLOM path to the object to inspect, e.g. 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'. Path shapes are listed in the live://catalog resource.
depthNoHow far to descend into child collections. Deep descents over a whole set can be slow and the cost is unmeasured, so raise this deliberately rather than by default.
with_parametersNoFor a device path, survey every parameter with its name, value, min, max, quantized steps and display unit, instead of reporting the parameters child as a bare count. This is also what diagnoses an unconfigured third-party plug-in.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description adds significant behavioral nuance beyond that: the dynamic runtime surface, the parameter counting failure in Live Vector, the fallback probing behavior, and the fact that methods are never callable through a path. This gives the agent realistic expectations about edge cases.

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 description is longer than typical but well structured into purpose, return summary, usage note, and parameter behavior. Each paragraph earns its place by explaining critical distinctions and fallback behavior. Slightly dense, but the detail is justified for a runtime-introspection tool with surprising edge cases.

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 the tool's complexity, the output schema, and 100% schema parameter coverage, the description is complete. It covers what the tool returns, when to use it over its main sibling, what edge cases exist, and how to continue the workflow with lom_call and set_parameter. Nothing essential 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. The description adds meaningful value by explaining the behavioral difference of with_parameters, its role in diagnosing unconfigured plug-ins, and the unmeasured cost of deep depth descents. This is more than the schema alone provides, though the path parameter gains little beyond its already thorough schema description.

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 description opens with a specific verb and resource: 'Introspect any Live object: class, properties, children, and methods.' It clearly identifies the tool's purpose and differentiates it from its sibling lom_describe by stating when to prefer each, so an agent can distinguish them without opening their 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?

The description explicitly directs usage: 'Prefer this over lom_describe for a device, and prefer lom_describe for anything else.' It also routes follow-up actions, telling the agent to invoke methods through lom_call and to set device parameters via set_parameter, which goes beyond vague context into concrete decision-making.

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

find_pathA
Read-onlyIdempotent

Find the mechanism that serves an intent, and the catalog rows when rows serve it.

Returns:
    Dictionary with the chosen route, any matching rows with their paths and docs,
    and the next call to make when rows are not the answer.

Note:
    There are four routes, and which one comes back matters more than the rows do.
    ``catalog_row`` means the rows carry the answer: each hit gives the path template to
    fill in, the access verbs, the full doc, and ``scopes``, the other places the same
    property exists, since track, return, master and chain mirror one another and a clip
    row usually has an arrangement_clip twin. ``writes`` appears when the best row is a
    read-only parameter object and names the sibling that actually takes a value.

    ``device_parameter`` means the answer is a knob inside a device, which this catalog
    cannot enumerate because what a device exposes depends on the device: filter cutoff,
    resonance, attack, threshold and everything else behind a front panel arrive this
    way, with the procedure to reach them.

    ``blocked`` means Live's API cannot do it at all, with what to do in Live instead.
    ``intent_tool`` is reported in the ``tool`` field alongside the rows rather than in
    place of them, because a tool that verifies its own work is the better route to the
    same end but the path is still worth seeing. ``unresolved`` means nothing matched,
    and ``unmatched`` lists the words that found nothing, which is usually where the
    query went wrong.

    A lookup costs about 1.5k tokens instead of the whole catalog. It does not touch
    Live: it reads the catalog only, so nothing here proves anything about the set that
    is open.
ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoRestrict to one catalog area, e.g. 'clip' or 'track'. The areas are listed in the live://catalog resource. Empty searches all of them.
limitNoHow many rows to return. Six is about 1.5k tokens.
queryYesWhat you want to do, in your own words. 'turn the bass down', 'sidechain the pad', 'where is the loop brace'. Producer vocabulary is expected: the lookup translates it into the catalog's own words.
accessNoRestrict to rows granting this verb: get, set, call, observe or automate. Use 'set' when you intend to write, which filters out the read-only parameter objects.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds valuable context beyond those: the lookup costs about 1.5k tokens, 'does not touch Live,' and 'nothing here proves anything about the set that is open.' These are behavioral disclosures—cost and side-effect boundary—that the annotations do not provide.

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?

The description is front-loaded with the purpose and uses structured Returns/Note sections, but it runs long (~250 words). The device_parameter paragraph's enumeration ('filter cutoff, resonance, attack, threshold and everything else behind a front panel') is illustrative but padded, and the route details could be tightened without losing meaning.

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 tool with complex multi-route semantics, the description covers the four routes, the writes field, the intent_tool nuance, the unmatched diagnostics, cost, and the no-Live-access caveat. An output schema exists, so structural return details are covered elsewhere; the description supplies the semantic layer an agent needs. Minor gaps remain around explicit alternative selection, but overall it is complete for its complexity.

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%, so the baseline is 3. The description adds some indirect meaning—e.g., the 'writes' route and 'read-only parameter object' discussion illuminate the access parameter's 'set' filtering behavior—but it does not add per-parameter semantics beyond what the schema already states for area, limit, query, and access.

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 line states a specific verb and resource: find the mechanism serving an intent plus the catalog rows when rows serve it. It is clearly distinguishable from siblings like describe (describes an object), find_sound (sound matching), and set_parameter (direct write), because this is a lookup/routing tool, and the four-route note further sharpens the identity.

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 guidance is mostly implied: the description frames the tool as a ~1.5k-token alternative to reading the whole catalog, and the route explanations guide the next call ('the next call to make when rows are not the answer'). However, it never explicitly names sibling alternatives or states when-not-to-use conditions, so an agent must infer when this beats describe or lom_describe.

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

find_soundA
Read-onlyIdempotent

Find an instrument or preset in Live's library by what you want it to sound like.

Returns:
    Dictionary with the root that was searched and why, the words that were searched
    for, the ranked candidates each carrying ``item_path``, ``uri`` and ``category``,
    how far the walks got, and the next call.

Note:
    Nothing here has been listened to: the ranking reads the preset's name and the
    browser category in its uri, so load one and listen before believing it fits.
    ``status`` is coverage, not fit: an empty ``candidates`` under ``complete`` does
    mean no name there answers, while ``incomplete`` makes the list a lower bound.
    Measured 2026-09-17 against Live 12.4.6, ``sounds`` completes, ``drums`` completes
    at the depth this tool sends, and ``instruments`` cannot be searched to the end for
    presets, so a negative from that root is never evidence of absence.

    Each word costs one browser walk and blocks Live's main thread, so three are
    searched and the rest named in ``words_not_searched``. ``considered`` is the sum
    of items those walks examined, not the size of the root and not the size of the
    library, so it exceeds either when two words search the same place. Both word
    lists describe the walk, not the library: the ranking scores every intent word,
    and shortened forms, against the names returned, so an unsearched word still
    appears in ``matched``.
    Measured 2026-09-17 against Live 12.4.6, "rhodes" and "moog" match no preset name in
    ``sounds``, and "kick" none in ``drums`` though a folder "Kick" matches under
    ``kind="any"``.

    ``category`` is derived from the uri's fragment rather than read from Live and is
    null where the uri carries none; ``also_in`` names the other categories it was
    filed under. To load one, call ``load_device`` with the candidate's ``load_with``
    block, the target ``track`` and ``confirm=True``, preferring ``item_path``: a
    ``uri`` is walked for again and can run out of budget. Loading an instrument
    silently replaces the one on that track, so read the chain with get_devices first.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhat to keep. 'preset' is the default and is what a sound is. 'device' with root='instruments' answers which instruments exist at all, rather than which preset to load.preset
rootNoBrowser root to search. Empty picks one from your words: a drum word searches 'drums', everything else searches 'sounds'. The reply says which was chosen and why.
limitNoHow many candidates to return.
intentYesThe sound you want, in your own words and in any order: 'warm bass', 'dark cinematic strings', 'punchy kick'. The phrase is split into words and each one is searched for separately, which is what the browser's own search does not do.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral detail beyond that: it notes nothing is listened to, ranking is based on names and categories, status is coverage not fit, performance costs (each word blocks main thread), and interpretation of 'considered' and word lists. This is far beyond the annotations and helps the agent understand edge cases and limitations.

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 description is excessively long, over 300 words, with detailed performance measurements and specific examples (e.g., 'rhodes' and 'moog'). While structured with paragraphs, it is not concise and would burden an agent parsing it. Key information is buried among many details, and the length is disproportionate to the tool's complexity.

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 the verbosity, the description is fully complete for an agent to use the tool correctly. It explains the return dictionary structure, the meaning of status and considered, how to load results via load_device, and even warns about silent replacement of instruments. Given the output schema exists, the description effectively covers all necessary behavioral and interpretive context.

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 all parameters are already documented. The description adds valuable context: it explains that intent is split into words and searched separately, and that root selection defaults based on word type. It also clarifies that the ranking scores all intent words even if unsearched. This goes beyond the schema, justifying a score above the baseline 3.

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 description clearly states the tool's purpose: finding instruments or presets by sound description, with a specific verb and resource. It distinguishes itself from generic search by explaining it splits the intent into words and searches each, which differentiates it from siblings like match_sound without naming them explicitly.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as match_sound or find_path. It explains how to interpret results and mentions load_device for loading, but does not state when not to use this tool or what distinguishes it from similar search tools. The usage context is implied by the purpose but not explicit about exclusions.

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

fire_sceneA

Fire a scene and report which beat the launch actually lands on.

Returns:
    Dictionary with the launch grid, the song position read on either side of the
    call, and the beat the launch falls on, or both candidate beats where the
    window spanned a boundary.

Note:
    ``fire`` answers that it succeeded and says nothing about when anything starts.
    Live quantises a launch to the next grid boundary, so aiming a scene at a
    particular bar from outside is a race: read the position, decide, fire, and Live
    may already have passed the boundary the decision was made for. Measured against
    Live 12.4.5: a read of ``song.current_song_time`` returned 55.6, the scene was
    fired, and the launch landed at 96 rather than 64, one 8 bar boundary later than
    intended. Nothing in the result said so.

    This does not remove the race, which is Live's and is not reachable from here.
    It makes the landing visible. The position is read immediately before and after
    the call, and the answer names the beat a launch issued at either end of that
    window falls on. Where the two differ, ``certain`` is false and both are given:
    the launch is on one of them and which one is not knowable from outside.

    With quantisation off the launch starts at once, so the window's own ends are
    the answer and the beat is known no better than the window is wide.

    This fires and does not wait. ``is_playing`` read straight afterwards is
    normally false and that is correct, not a failure: nothing has started yet.
ParametersJSON Schema
NameRequiredDescriptionDefault
sceneYesScene index in song.scenes, counted from 0.
confirmNoTrue fires the scene. False reports the launch grid and where a launch issued now would land, and fires nothing.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations are minimal (all false), so the description carries the full burden and does so richly. It discloses the asynchronous fire-and-not-wait behavior, Live's quantisation race with a concrete measured example, the meaning of certain=false and candidate beats, and that is_playing=false immediately after is expected behavior rather than failure. No contradiction with 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?

The purpose is front-loaded and the Returns section is compact. The Note section is lengthy but each part earns its place by explaining real behavioral pitfalls. The measured example adds credibility and concrete context, though it is slightly more detailed than strictly necessary.

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 the tool's complexity—quantisation timing, race conditions, ambiguous landing beats, and async behavior—the description is exceptionally complete. It covers what happens before, during, and after the call, how to interpret ambiguous results, and why immediate is_playing=false is not an error. With an output schema present, return-value details are not 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%, so the baseline is 3. The description clarifies the 'confirm' behavior indirectly through 'This fires and does not wait,' but it does not explicitly map behavior to the confirm parameter or add extra meaning beyond the schema's own description of the two parameters. It neither hurts nor significantly improves schema 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?

The description opens with a specific verb and resource: 'Fire a scene' and adds the distinguishing reporting behavior ('report which beat the launch actually lands on'). This clearly separates it from generic transport tools like play and stop, and the Returns section reinforces the unique output.

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 clear operational context: it explains the race condition, what measure the result is reliable to, and how to interpret is_playing immediately after firing. It does not explicitly name alternatives or say when not to use it, but the context is sufficient for an agent to decide when this tool's reporting adds value.

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

get_clipA
Read-onlyIdempotent

Read one Session clip's properties: length, loop, warp, pitch, markers, flags.

Returns:
    Dictionary with ``has_clip``, and where that is true the clip path, whether
    it is MIDI, and the property fields. An empty slot answers ``has_clip:
    false`` and says so rather than failing.

Note:
    Notes and automation are not properties: use ``read_clip_notes`` and
    ``read_automation``.

    ``warping``, ``warp_mode`` and ``pitch_coarse`` are reachable only through a
    generic path. Each was read, written, read back and restored on 2026-08-29
    against Live 12.4.5, and all three rows are ``verified``. ``pitch_fine`` is
    read-verified only, and the integer mapping behind ``warp_mode`` is still a
    hypothesis: confirm it against ``clip.available_warp_modes``.

    **An audio clip's times are in seconds while warping is off, and in beats while
    it is on.** ``times_in`` says which, and the per-field ``unit`` follows it. A MIDI
    clip is always in beats. Measured 2026-09-19 against Live 12.4.6 on three
    unwarped clips of one 228.792167 s file: ``loop_end`` read 228.79216666666667 on
    all three, and a write of a larger ``end_marker`` clamped to that same number.

    **Toggling ``warping`` rescales the stored markers and does not undo it.** On the
    same clip, turning warping on took ``end_marker`` from 240.918 to 253.682, a
    factor of 1.05298, and turning it back off left it at 253.682 while ``loop_end``
    returned to the file length. The factor is the clip's own warp tempo over 60
    (1.05298 is 63.18 BPM; another clip moved 0.5704 to 1.1408 at 120 BPM and not at
    all at 60). Every toggle multiplies again, so a clip toggled twice carries markers
    well past the end of its own file and nothing reports it. Read the markers after
    any write to ``warping`` and set them back deliberately.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Even with strong annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds substantial behavioral context: the return contract with has_clip for empty slots, the unit system (seconds vs beats) with measured examples, and the critical warning that toggling warping rescales markers and does not undo. These are non-obvious, empirically verified traits that no annotation could convey. There is no contradiction with 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?

The description is front-loaded with the purpose and then organizes key behavioral warnings under bold headings and clear paragraphs. It is long, containing measured values and dates (e.g., 'Measured 2026-09-19', exact numeric factors), which are useful but arguably more detailed than necessary for tool selection and correct invocation. Every sentence does contribute to the behavioral picture, so it earns a '4' rather than a '3', but it is not as lean as it could be.

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 that this tool has an output schema, annotations, and 100% parameter schema coverage, the description still goes beyond the minimum: it covers the has_clip return contract, unit semantics, the marker-rescaling data hazard, and verification status. An agent has everything needed to call the tool correctly and anticipate unusual behavior, even before examining the output schema. Nothing essential 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%, so the baseline is 3. The description does not add meaningful parameter-level detail beyond what the schema already provides; it references the 'generic path' but does not explain path/slot/track relationships beyond the schema's own descriptions. The description focuses on return behavior, not parameter semantics, so it neither compensates nor detracts from the schema. This meets the minimum viable standard.

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 description opens with a specific verb-resource pair: 'Read one Session clip's properties' and enumerates the exact fields (length, loop, warp, pitch, markers, flags). It also explicitly distinguishes itself from read_clip_notes and read_automation, which directly addresses sibling differentiation. An agent can confidently select this tool for reading clip properties without confusing it with the read-note or automation tools.

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 explicit guidance on when not to use it: 'Notes and automation are not properties: use read_clip_notes and read_automation.' It also makes clear via 'Session clip' that this is for Session clips, and the schema reinforces that Arrangement paths are refused. It does not survey all possible sibling alternatives (e.g., get_track, get_session), but the primary exclusions are covered, leaving little ambiguity for the common use case.

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

get_devicesA
Read-onlyIdempotent

List a track's device chain: names, class names, on/off, parameter counts.

Reads the chain and changes nothing in it. The device indices it reports are the
ones set_parameter, delete_device and ``song.move_device`` are addressed by.

Returns:
    Dictionary with the device count and one entry per device carrying its index,
    name, class name, on/off state, parameter count and ``configure_needed`` flag.
    A track with an empty chain answers ``device_count: 0`` rather than an error,
    while an index with no track behind it is refused with ``index_out_of_range``.

Note:
    Read the parameter count first. A third-party plug-in reporting exactly one
    parameter has not been configured, which the ``configure_needed`` flag says
    outright. That is a limit in Live, not in this server, and only Live's GUI
    lifts it. The probe behind that flag settles one question, whether the count
    is exactly one or more than one, so where it could not settle it the count
    arrives as ``parameter_count_at_least`` instead.

    For the parameters themselves, with their ranges and display units, call
    ``describe`` with ``with_parameters=True``: this tool counts them and does
    not list them. For the mixer, sends and clip slots on the same track, call
    get_track instead of adding a second call here.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.track
trackYesTrack index in song.tracks, counted from 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description states it 'changes nothing', discloses edge cases (empty chain returns device_count: 0, invalid index returns index_out_of_range), and explains the configure_needed flag and parameter_count_at_least fallback. This gives an agent a reliable model of side effects and failure behavior.

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 description is front-loaded with the core purpose in one sentence and then organized into Returns and Note sections. It is somewhat verbose, especially the paragraph about the configure_needed probe, but every sentence carries useful information and the structure makes it scannable.

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 an output schema present and 100% input schema coverage, the description still adds necessary context: edge cases, error behavior, relationships to other tools, and a Live-specific limitation. An agent has everything needed to call this tool correctly and interpret its results.

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 the schema already documents both parameters and their meaning. The description adds the behavioral note about invalid track indices but does not significantly enrich the semantics of the kind or track fields beyond what the schema provides, so the baseline 3 is appropriate.

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 first sentence names the exact verb ('List'), resource ('a track's device chain'), and content ('names, class names, on/off, parameter counts'). It also distinguishes itself from siblings by pointing to describe for parameters and get_track for mixer/sends/clip slots, so an agent can tell it apart immediately.

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?

The description explicitly says when to call describe instead ('this tool counts them and does not list them') and when to call get_track ('For the mixer, sends and clip slots on the same track'). It also tells the agent to read the parameter count first and warns about the configuration edge case, giving clear operational guidance.

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

get_sessionA
Read-onlyIdempotent

Survey the running set: script handshake, song fields, tracks, clips, devices.

The call to make first. It proves the Remote Script is answering before anything
else is attempted, and it hands back the track and scene indices every other
tool here is addressed by.

Returns:
    Dictionary with script handshake info, song fields, the track list with its
    indices, group track indices, and clip and device detail where asked for.

Note:
    The round-trip handshake takes about 450 ms, so this is the expensive read. Take
    it once at the start and narrow with get_track, get_clip and get_devices
    afterwards rather than calling this again between edits. Group tracks have no arm
    state ('armed' returns null). If Live collection introspection reports zero
    tracks, index probing is used as a fallback.
ParametersJSON Schema
NameRequiredDescriptionDefault
clipsNoSweep the Session grid for slots that hold a clip. Off, the answer covers tracks and devices but says nothing about clips, and comes back faster because no slots are probed.
devicesNoInclude each track device chain in the answer.
max_scenesNoHow many scenes deep to probe for Session clips. A cap rather than a count: Live collections report no length, so the sweep stops here instead of at the last scene. Ignored when clips is false.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description goes well beyond this by revealing the 450 ms round-trip cost, the group track 'armed' null quirk, and the index-probing fallback when zero tracks are reported. These are non-obvious behavioral traits that materially affect invocation decisions.

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?

The description is efficiently structured: a one-line purpose, a short invocation-placement paragraph, a return summary, and a note consolidating the most important behavioral caveats. Every sentence adds operational value, and the most critical 'call first' guidance 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 read-only session-survey tool with an output schema and rich schema-level parameter descriptions, the description covers everything an agent needs: when to call it, why it is expensive, what it returns at a high level, how to narrow afterwards, and two important quirks (group track arm state and zero-track fallback). Nothing essential 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 description coverage is 100%, and each parameter already has a rich description explaining its effect, defaults, and edge cases (e.g., max_scenes is a cap not a count). The tool description adds contextual linkage ('clip and device detail where asked for') but does not need to restate parameter meanings, so the baseline of 3 is appropriate.

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 description names a specific verb ('Survey'), a specific resource (the running set), and enumerates the content: script handshake, song fields, tracks, clips, and devices. It also explicitly positions itself as the first call and distinguishes itself from get_track, get_clip, and get_devices, making sibling differentiation clear.

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?

The description gives explicit when-to-use guidance: 'The call to make first' and explains why, then directs the agent to 'Take it once at the start and narrow with get_track, get_clip and get_devices afterwards rather than calling this again between edits.' It also notes when the clips parameter can be disabled for speed, giving practical selection context.

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

get_trackA
Read-onlyIdempotent

Read one track's mixer state, flags, device chain, sends and clip slots.

One track in one round trip, where get_session covers the whole set. Use this to
read a mixer before writing it with set_mix, and get_devices when the device
chain is the only thing wanted.

Returns:
    Dictionary with the mixer fields, the arm state and whether arming applies,
    the device names and count, the send values, the clip slot count and the
    indices of the filled ones, and a per-collection flag saying whether each
    count is exact.

Note:
    ``volume`` and ``panning`` are normalised, not dB: 0.85 is 0 dB (measured),
    and the scale is not linear. ``display`` carries the dB reading where Live
    offered one.

    ``arm`` is read only after ``can_be_armed`` says the question applies,
    because reading it on a group track raises inside Live and would break the
    whole batch (measured). It comes back as ``null`` where it does not apply.

    Device names, send values and which clip slots are filled are measured by
    probing indices in one batch, because Live's collections report no length.
    Read ``counts_exact`` before treating any of those counts as complete.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.track
trackYesTrack index in song.tracks, counted from 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already declare readOnly, idempotent, and non-destructive, so they cover the safety profile. The description adds substantial behavioral context beyond that: volume/panning are normalized not dB, arm is conditionally read to avoid Live exceptions, and counts are measured by probing batches and may be inexact. This is exactly the kind of non-obvious behavior an agent needs to trust the result.

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?

The description is front-loaded with a one-sentence summary, followed by scoping guidance, then a structured return list, then a compact notes paragraph. Every section earns its place and is grouped logically. Despite length, the density of useful behavioral caveats makes the complexity justified.

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 the output schema exists and the annotations cover safety, the description fills all remaining gaps: return content, normalization caveats, conditional arm handling, batch-probed counts, and when to prefer sibling tools. An agent has everything needed to invoke get_track correctly and interpret the result without trial and error.

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?

The schema already documents both parameters fully with descriptions and enum values, so schema coverage is 100% and the baseline is 3. The description does not add much directly about the parameters themselves, but it does explain the meaning of 'track' in context and how certain values behave per track type. Since the schema carries the heavy lifting, a 3 is appropriate.

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 first sentence names a specific verb ('Read'), the exact resource ('one track'), and enumerates the content: mixer state, flags, device chain, sends and clip slots. It explicitly contrasts with get_session (whole set) and get_devices (device chain only), so an agent can distinguish it from siblings immediately.

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?

The description gives explicit when-to-use guidance: 'One track in one round trip, where get_session covers the whole set' and 'Use this to read a mixer before writing it with set_mix, and get_devices when the device chain is the only thing wanted.' It also warns against using this tool on group tracks for the arm field, which is a practical usage constraint.

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

load_deviceA
Destructive

Search Live's browser and load a device onto a track: a search step, then a load step.

Returns:
    Dictionary of search candidates and the selected track on the search step,
    or the load result and the resulting device chain on the load step.

Note:
    A load cannot be aimed inside a rack: measured 2026-09-07 against Live 12.4.5,
    ``rack.view.selected_chain`` read back as written and the device still landed on the
    track. An effect is appended; an instrument replaces the one already there and
    discards it silently, with its settings and the clip envelopes pointing at it: check
    with get_devices first. Loading plug-ins in rapid succession can crash Live
    (measured: a batch load during a plug-in rescan with a licence dialog open took Live
    down), so load one at a time. A load also arms the target track and disarms every
    other one (measured 2026-09-19 against Live 12.4.6: of two armed tracks and an
    unarmed target, the target came back armed and the others disarmed), and nothing
    here reports it. An instrument load renames a track that still has Live's default
    name; an effect never renames.

    Success means the call ran, not that the track sounds: a measured Drum Rack load
    reported success on a silent track, and an empty rack is what that looks like, so
    read ``song.tracks[N].devices[i].chains``, which get_devices does not report. A null
    ``selected_track_same``, ``displaced`` or ``configure_needed`` means the comparison
    failed, not ``false``; the first compares name and track count, not identity.
    ``loaded_device_index`` is the position of the new device, computed only where
    the two chains single out exactly one, and null otherwise.
    ``status: incomplete`` with no candidates means the walk stopped early, not that the
    item is absent: retry ``unreached_roots``; only ``complete`` rules it out. The main
    track has no index: write ``song.view.selected_track`` with ``{"__path__":
    "song.master_track"}`` through lom_set, then load.
ParametersJSON Schema
NameRequiredDescriptionDefault
uriNoThe uri of one candidate from a previous search step, copied back verbatim to say which item to load. Resolving it walks the browser a second time, so pass root as well when the item sits deep; item_path avoids the walk altogether and is preferred.
rootNoBrowser category to search inside. Empty searches every category, which is slower and returns more near misses. These are the roots the Remote Script walks; there is no user_folders or legacy_libraries here, although the catalog carries rows for both.
limitNoHow many search candidates to return.
queryNoWhat to look for in the browser, matched against item names, e.g. 'Operator' or 'reverb'. Required for the search step; on the load step it can be dropped once uri or item_path is known.
trackNoTrack to load onto, counted from 0. -1 uses whatever is selected, which is what this did before the argument existed. Naming a track points the selection at it first, so a caller does not have to express the load as two steps and cannot load onto a track that happened to be selected. The selection stays there afterwards and is not put back: the LOM offers nothing to restore it to. 'aimed' reports where it went.
confirmNoFalse searches and loads nothing, reporting the candidates and which track is selected. True loads the item named by uri or item_path.
item_pathNoThe browser item as a LOM path rooted at app, e.g. 'app.browser.instruments.children[3]'. The reliable handle, and the one to prefer: unlike a uri it is not walked for again, so it cannot fail on the walk budget. Every search candidate carries one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only indicate destructiveHint=true and readOnlyHint=false, but the description goes far beyond that: it details side effects like arming/disarming tracks, renaming default tracks, silent replacement of instruments, crash risks with rapid loading, the meaning of success vs. actual sound output, null field semantics, and incomplete status handling. It discloses all known behavioral quirks, providing exceptional transparency.

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 description is long but well-structured: it opens with a clear purpose, then covers returns, caveats, and edge cases in a logical order. Every sentence adds value, though it could be slightly tighter. It is not overly verbose for the complexity it conveys, and the front-loaded purpose helps quick scanning.

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?

The description is exceptionally complete for a complex tool. It covers return values, error states, edge cases (null fields, incomplete status), workarounds (master track handling), and even measured behavioral notes against specific Live versions. With an output schema present, the description need not explain every return field, but it goes beyond that to ensure correct invocation and interpretation.

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%, so the baseline is 3. The description does not add significant new parameter semantics beyond what the schema already provides; the schema already explains uri, root, limit, query, track, confirm, and item_path in detail. The description focuses on workflow and behavioral context rather than parameter details, which is acceptable given full schema coverage.

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 description states a specific verb and resource: 'Search Live's browser and load a device onto a track', and clarifies the two-step search-then-load process. It clearly distinguishes itself from siblings like get_devices by explaining it performs a load, not just inspection. The purpose is unambiguous and directly useful.

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 explicit guidance: it warns to 'check with get_devices first' before loading instruments (to see what will be discarded), advises loading one at a time to avoid crashes, and explains the search step vs. load step. It doesn't explicitly name alternative tools for different scenarios, but it provides clear context on when and how to use this tool safely.

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

lom_batchA

Execute multiple raw LOM operations (get, set, call) in a single round trip.

Returns:
    Dictionary containing ordered results for each operation.

Note:
    A batch runs inside one handler call, synchronously on Live's main thread, and is
    capped at 1000 operations (max_ops=1000): a larger one is rejected upfront and never
    truncated. Measured 2026-09-16 against Live 12.4.5 (macOS 26.6.2, four-track set):
    one request costs about 400 ms whatever its size, with 200 ops at 500 ms, 1600 mixed
    reads at 1506 ms and 3200 song.tempo gets at 1718 ms, error_count 0 throughout; past
    the 200-op point the marginal cost is about 0.72 ms per mixed real read and 0.44 ms
    per song.tempo get. Write and call ops were not measured and cost more.

    Nothing Live recomputes between operations is visible to a later operation in the
    same batch: a read after a transport jump still reports the position from before the
    move, and four jumps interleaved with four reads returned four identical pre-jump
    values and no error. That is the failure shape to expect here. It does not raise. It
    returns a clean set of numbers that look like a measurement of a parameter which
    never changes, and the conclusion drawn from them is wrong. Sample a moving
    transport with one call per position, never inside a batch.

    An end_marker write on an Arrangement clip is refused here rather than sent.
    Observed once, 2026-09-10 against Live 12.4.5: the write was accepted without an
    error and end_time did not move; what it read back was never recorded, and
    docs/limits.md section 5 carries the probe that would settle it. ``atomic`` stops at
    the first error but undoes nothing, so read the state back after a partial failure.
    Prefer a dedicated tool where one exists: get_session, get_track, get_devices and
    set_mix batch their own reads and verify, which this does not.
ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesThe operations to run, in order (at most 1000 operations). Each one declares its own op, path and payload; the item schema carries the field meanings.
atomicNoTrue stops at the first error, leaving the operations before it applied and the ones after it untried. False runs every operation and reports each result. Neither rolls anything back.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

With all annotations set to false, the description carries the full burden of behavioral disclosure. It discloses that the batch runs synchronously on Live's main thread, is capped at 1000 operations, and is rejected upfront if larger. Critically, it explains that operations within a batch do not see recomputed state (e.g., a read after a transport jump returns the pre-jump value), and it describes the failure shape as returning clean but wrong numbers. It also notes atomic stops at the first error but undoes nothing, and that an end_marker write is refused. This is exceptionally transparent and goes far 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?

The description is front-loaded with the purpose and return type, then provides a detailed note. While it is quite long, the length is justified by the critical behavioral caveats (consistency, failure shape, atomic rollback). However, the performance measurements are extraneous for an AI agent's decision-making and could be trimmed without losing essential information. The structure is logical and the key points are early, so it earns a 4 rather than a 5.

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 the tool's complexity, the description is remarkably complete. It covers purpose, usage, behavioral caveats, and even includes failure shapes and advice on when not to use it. Since an output schema is present (as indicated by context), the description does not need to explain return values in detail. It provides everything an agent needs to correctly select and invoke this tool.

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?

The input schema has 100% description coverage for all parameters, including ops (with its nested properties) and atomic. The description does not add extra meaning beyond the schema; it repeats the 1000-op cap (already in the schema) and the atomic behavior (also in the schema). Therefore, the baseline of 3 is appropriate—the schema does the heavy lifting, and the description adds no additional parameter-level context.

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 description clearly states the tool executes multiple raw LOM operations (get, set, call) in a single round trip, using a specific verb and resource. It explicitly differentiates from dedicated siblings by naming get_session, get_track, get_devices, and set_mix and noting they batch their own reads and verify, which this tool does not. This leaves no ambiguity about what the tool does and how it differs.

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?

The description gives explicit guidance on when to use this tool vs alternatives: 'Prefer a dedicated tool where one exists' and names the alternatives. It also provides specific usage warnings, such as not sampling a moving transport inside a batch and noting that atomic stops at the first error but does not roll back. This is clear, actionable, and covers exclusions.

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

lom_callA

Invoke an allowlisted method on a Live object.

The escape hatch for the calls that have no tool of their own, such as
``song.move_device`` for reordering a device chain. What it can reach is bounded
by the Remote Script's allowlist, not by this signature.

Returns:
    Dictionary reporting the call and its return value. A refused call names the
    reason, and where a dedicated tool covers the same ground it comes back with
    ``use_instead`` naming that tool.

Note:
    A method call has no read-back, so nothing here proves the effect the way a
    write through lom_set or set_parameter does. Follow it with the matching read
    (get_devices after a move, get_session after a structural change) rather than
    treating a successful return as evidence.

    Prefer the dedicated tool wherever one exists: create_clip, delete_track,
    set_tempo, play and stop all verify what this cannot. Use lom_get and lom_set
    for properties, which are not reachable as methods, and lom_batch to send
    several calls in one round trip.
ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoPositional arguments, in order. Keyword arguments are not supported. A Live object is passed as a reference dict, {'__path__': 'song.tracks[2]'}, rather than as a name or an index.
pathYesDotted LOM path to the object the method sits on, e.g. 'song' for song.move_device or 'song.tracks[0]' for a track method. The object that owns the method, not the object being acted on.
methodYesMethod name to invoke, e.g. 'move_device'. Only names on the Remote Script's allowlist are accepted; lom_describe lists the ones permitted on a given object.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses a critical limitation: 'a method call has no read-back, so nothing here proves the effect' and recommends following with matching reads. It also explains the return behavior, including refused calls naming the reason and 'use_instead' pointing to a dedicated tool. The annotations are all false and are not contradicted; the description adds substantial behavioral context beyond those booleans.

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?

The description is front-loaded with the core purpose and then uses labeled sections for return behavior and usage notes. Every sentence adds information: the allow list boundary, the no-read-back caveat, the follow-up-read recommendation, and the explicit alternatives. It is longer than a one-liner but earns its length for such a generic escape-hatch tool.

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 generic fallback tool with three parameters and an output schema, the description covers what an agent needs: what it calls, how it is restricted, what the return dictionary contains, how to verify effects, and when to choose a sibling tool. The presence of an output schema means the return-value structure need not be fully repeated here. No critical operational context appears 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?

The input schema already provides 100% coverage with detailed descriptions for path, method, and args, including the reference-dict format for Live objects. The description itself adds contextual examples like 'song.move_device' but does not attempt to redefine the parameters. A baseline score of 3 is appropriate because the schema carries the parameter-semantics load.

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 description immediately states the verb and resource: 'Invoke an allowlisted method on a Live object.' It then clarifies that this is the 'escape hatch' for calls with no dedicated tool, using 'song.move_device' as a concrete example. This clearly distinguishes it from the many sibling tools that cover specific operations.

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?

The description explicitly says to prefer a dedicated tool wherever one exists, names several such tools, and directs property access to lom_get/lom_set and multiple calls to lom_batch. It also instructs the agent to follow up with a matching read because method calls have no read-back. This is explicit, actionable routing guidance.

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

lom_describeA
Read-onlyIdempotent

Reflect on any LOM object: class, properties, children, callable methods.

The raw reflection, reporting what the object itself declares. Use it to find
the property names on an object the catalog does not cover, then read them with
lom_get and write them with lom_set.

Returns:
    Dictionary reporting object class, properties, child collections with their
    counts, and the methods the Remote Script allowlist will let you call.

Note:
    For a device, prefer ``describe`` with ``with_parameters=True``. This tool
    reports a device's ``parameters`` child as a count, and a count is exactly
    what a Live ``Vector`` that refuses ``len()`` fails to give, so a plug-in
    with parameters can be reported as having none. ``describe`` falls back to
    probing indices when that happens and says which answer it is handing back.

    The methods listed here are names, not calls: invoke one through lom_call.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDotted LOM path to the object to reflect on: 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'.
depthNoHow many levels of child collection to walk. 1 reports the children of the addressed object only. Raising it multiplies the work and the cost is unmeasured.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as read-only and idempotent. The description adds important behavior beyond that: it reports child collections as counts, warns that device parameters may be misreported as zero due to Live Vector len() issues, clarifies that describe falls back to index probing, and states that listed methods are names, not calls. This is meaningful, non-obvious 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?

The description is organized with clear sections, front-loads the core purpose, and uses the note only for a genuinely important caveat. There is some redundancy between the opening sentence and the 'Returns' paragraph, both covering class, properties, children, and methods, but overall the structure is deliberate and every major block earns its place.

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 the output schema exists, the description does not need to explain return values in full, but it still covers the key behavioral details: what the dictionary contains, how methods are represented, when to prefer another tool, and an important failure mode. For this tool's complexity, nothing critical 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. The description adds value beyond the schema by warning that raising depth multiplies the work and that the cost is unmeasured, which is not present in the parameter schema. It also reinforces the path semantics with examples already in the schema, but the depth warning is a genuine extra.

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 description opens with a specific verb and resource: 'Reflect on any LOM object: class, properties, children, callable methods.' It clearly distinguishes itself from related tools by explaining that this is raw reflection rather than reading or writing property values, and explicitly names lom_get, lom_set, and lom_call for those actions.

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?

The description gives explicit guidance on when to use this tool: to find property names the catalog does not cover, with follow-up reads via lom_get and writes via lom_set. It also gives a strong exclusion: for devices, prefer 'describe' with with_parameters=True, and explains why. This is clear routing among siblings.

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

lom_enumsA
Read-onlyIdempotent

Look up the integer behind a named Live enum member.

Live stores an enum property as a bare integer, so a write needs the number and
a read hands back a number that means nothing on its own. This is the lookup in
both directions.

Returns:
    Dictionary of member names against their integer values, or the list of enum
    type names when ``type_name`` is empty.

Note:
    Call this before writing an enum-valued property through lom_set or
    set_parameter, rather than guessing that the members run in the order Live
    draws them. This answers what a type's members are. lom_describe answers
    what properties an object has, and neither answers the other.
ParametersJSON Schema
NameRequiredDescriptionDefault
type_nameNoDotted Live enum name, e.g. 'Song.Quantization'. Leave empty to list the enum type names instead of the members of one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context about Live's internal integer representation, the dual lookup direction, and the conditional return shape based on the type_name parameter.

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?

The description is well-organized with a clear opening, a Returns section, and a Note that justifies usage. Every sentence contributes meaning, and the front-loaded verb-resource sentence immediately conveys the tool's core function without waste.

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?

The tool is simple with one optional parameter and an output schema. The description covers why the tool exists, when to use it, how to interpret the result, and which sibling handles the adjacent concern. Nothing essential is missing for correct invocation.

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%, and the schema already explains the dotted name format, the empty-string behavior, and the default value. The description reinforces this and echoes the empty-case behavior in the Returns section, but adds little beyond the 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?

The description clearly states a specific verb and resource: 'Look up the integer behind a named Live enum member.' It also explains the bidirectional nature and distinguishes itself from lom_describe, making the tool's purpose unmistakable.

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?

The description explicitly tells the agent when to call this tool ('Call this before writing an enum-valued property through lom_set or set_parameter') and contrasts it with lom_describe. This provides clear context and excludes the common alternative.

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

lom_getA
Read-onlyIdempotent

Read one property value by LOM path, with its catalogued meaning.

The single-property read behind every getter here, for the field no getter
exposes. Where the catalog knows the path, the answer carries a ``catalog``
hint, and where it knows that a particular value is a sentinel it carries
``means`` as well: a ``scene.tempo`` of -1.0 reads back as "no tempo set for
this scene" rather than as a tempo below the legal minimum.

Returns:
    Dictionary with path, value, type, an optional display string for a device
    parameter, and the catalog hint and meaning where those exist.

Note:
    A path that is not rooted at song, app or song.view is refused here without
    Live being contacted. A path Live rejects comes back as ``ok: false`` with
    Live's own ``code``, so a missing property is an error rather than a null.

    Reach for a getter first where one exists: get_session for the whole set,
    get_track, get_clip and get_devices for one of each, read_clip_notes for
    notes, read_automation for envelopes. All of them cost one round trip for
    many fields, where this costs one per field. Use lom_batch to read several
    paths in a single trip, lom_describe when the property names are not known
    yet, and lom_set to write.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDotted LOM path rooted at song, app or song.view, with integer subscripts for collections: 'song.tempo', 'song.tracks[0].name', 'song.tracks[0].devices[1].parameters[3].value'. Any other root is refused before Live is contacted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/destructive annotations, the description details error semantics (non-song/app/song.view roots refused before contacting Live, Live-rejected paths return ok:false with Live's code), sentinel handling via the 'means' field, and the shape of the return dictionary. This 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.

Conciseness5/5

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

The description is compact and well-organized: purpose, return summary, then a note on edge cases and usage. Each paragraph earns its place with no fluff, and the core purpose 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 one-param read tool with strong annotations and a schema, the description covers the practical invocation concerns: path syntax constraints, error responses, catalog meaning, and fallback positioning relative to sibling getters. Nothing essential 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?

The schema covers the path parameter fully (dotted LOM path, allowed roots, integer subscripts, examples), so the high coverage baseline applies. The description adds context about path-root validation and single-property reading but does not introduce new parameter-level requirements.

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 lead sentence is a precise verb+resource statement: 'Read one property value by LOM path' and immediately differentiates the tool as 'the single-property read behind every getter here, for the field no getter exposes.' This clearly distinguishes lom_get from sibling getters.

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?

The description explicitly directs agents to prefer a dedicated getter: 'Reach for a getter first where one exists,' and frames lom_get as the fallback for fields no getter exposes. It names get_session as an example, giving concrete routing guidance.

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

lom_setA
Idempotent

Write a property value by LOM path and return verification read-back.

The generic write, and the unvalidated one: set_parameter, set_mix and set_tempo check
the catalog first. lom_call takes a method, lom_batch several writes in one round trip.

Returns:
    Dictionary reporting requested, before, after, clamped, and changed status.
    For a device parameter it also carries ``display`` and ``is_quantized``.

Note:
    An out-of-range value is refused out loud and nothing is stored: ``...volume.value =
    1.4`` answers ``live_error "Invalid value. Check the parameters range with
    min/max"`` and leaves 0.85 standing, as do tempo 5000 and panning 5. What the
    read-back catches is quantised snap: ``<Compressor>.parameters[10].value = 0.4``
    (Model: Peak / RMS / Expand) stored 0 and reported ``clamped: true, read_back:
    "clamped", is_quantized: true, display: "Peak"``, so a value between two steps
    silently becomes another. ``is_quantized`` is what separates a snap to a step
    from a clamp to a range.
    A write can apply asynchronously, leaving ``read_back`` at ``not_observed``, which
    is neither ``clamped`` nor a failure; a method call has no read-back at all; and an
    unknown property name is ignored and reported as success, so check ``changed``
    rather than ``ok``. A collection like ``song.tracks`` cannot be assigned: set a
    property on an element instead.

    A Live object cannot travel as a plain value. Where a property holds one
    (``song.view.selected_track``, ``song.view.selected_scene``,
    ``song.view.detail_clip``, ``browser.hotswap_target``, ``clip.groove``, and on a
    device ``input_routing_type`` and ``input_routing_channel``) pass
    ``value={"__path__": "song.tracks[2]"}`` (protocol section 5.4); handed plain JSON
    the first five answer ``not_settable``. The two routing properties take their
    reference out of ``<device>.available_input_routing_types`` and
    ``...available_input_routing_channels``, never a name string.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesSettable dotted LOM path, e.g. 'song.tempo' or 'song.tracks[0].mixer_device.volume.value'. Note the trailing ``.value``: a mixer control is a DeviceParameter object and the number lives one level inside it.
valueYesThe value to store. A number, string or boolean for a scalar property; a reference dict {'__path__': 'song.tracks[2]'} for a property whose value is itself a Live object.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description discloses extensive behavioral nuances far beyond the annotations (readOnlyHint false, idempotentHint true, etc.). It details return semantics, clamping, quantization, asynchronous application (read_back: not_observed), silent success for unknown properties, and the distinction between clamped and quantized. It also warns that Live objects cannot travel as plain values and specifies how to pass them via __path__. No contradictions with annotations.

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?

The description is long but every sentence carries essential behavioral or usage information. It is structured with a concise purpose statement, a 'Returns:' section, and a 'Note:' section that systematically covers edge cases. The most important distinguishing information (write vs. alternatives) is front-loaded. The length is justified by the complexity of the tool and the need to prevent common mistakes.

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 the complexity of LOM and the presence of an output schema, the description is remarkably complete. It explains return fields, handles out-of-range and quantized values, discusses asynchronous behavior, notes that unknown properties are ignored, and covers special cases for Live object references. Nothing an agent needs to call the tool correctly is missing.

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?

Although the schema already describes both parameters with 100% coverage, the description adds crucial semantic details: it explains the trailing .value in paths (e.g., 'a mixer control is a DeviceParameter object and the number lives one level inside it') and specifies the exact structure for Live object values (reference dict with '__path__'). This goes well beyond the schema's generic descriptions, giving the agent the precise syntax needed for correct invocation.

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 description opens with a clear, specific statement: 'Write a property value by LOM path and return verification read-back.' It then explicitly contrasts with sibling tools: 'The generic write, and the unvalidated one: set_parameter, set_mix and set_tempo check the catalog first. lom_call takes a method, lom_batch several writes in one round trip.' This precisely distinguishes lom_set from its siblings, making its purpose unambiguous.

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?

The description gives explicit when-to-use guidance by naming alternatives and the conditions that select them. It states that set_parameter, set_mix, and set_tempo are the unvalidated variants, while lom_set is the generic write that checks the catalog. It also advises against assigning collections ('A collection like song.tracks cannot be assigned') and explains when to use __path__ references for Live objects. These are actionable usage rules, not vague hints.

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

match_soundA
Read-onlyIdempotent

Rank the library by how close each item sounds to a piece of audio you have.

Returns:
    Dictionary with the descriptor taken from the file, the ranked candidates each
    carrying its name, kind, category, library and score, and the call that loads
    the one you pick.

Note:
    A score orders this one answer, lower being closer: not a percentage or a distance,
    and scores from two files do not compare. The order inside one answer is weaker than
    it looks: ``elsewhere_in_the_file`` ranks a second stretch of the same recording to
    show how weak; ``also_elsewhere`` says a candidate came back in both, the one
    reading here that is evidence, not ordering. Measured 2026-09-19 over five separated
    stems in 20 s windows, two windows of one stem shared about one name in ten and the
    descriptor moved by three to six times the whole width of the top thirty. Ranked
    over the whole library, the top candidate shared the probe's family 1 time in 7 at
    20 s and 6 of 20 on 1.5 s slices: a bass stem answers with drum kits and a guitar
    stem with pads; given ``instrument``, the same audio answers with basses and plucked
    guitars. Name the family when you know it: this is a shortlist, not a ranking.

    What is compared is Ableton's preview render of each item, so a busy-riff preview
    describes itself differently from a held-chord one, and nothing here speaks for
    playable range, velocity response or a single note's attack. The match is timbral
    with level removed, so a quiet and a loud take of one sound match exactly; pitch is
    not matched, so a bass line at 50 Hz and the same line at 100 Hz are near
    neighbours. ``analysed`` says where the window landed, with peak and RMS; a silent
    stretch answers ``nothing_to_match``, and without an index this answers
    ``no_index``. To load one, set ``track`` in its ``load_with`` block and call
    ``load_device``: the handle is a name, not a path, so the browser search can return
    more than one item. Check before confirming.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to the audio to match: a stem, a loop, a one shot. Any format the system decoder reads, which is WAVE, AIFF, MP3, Ogg, FLAC and ALAC. Not an Ableton factory sample: those are encrypted and nothing outside Live reads them.
kindsNoWhat to rank. 'loadable' is the default and means presets and racks, the things that go on a track. 'clips' ranks loops instead.loadable
limitNoHow many candidates to return.
windowNoWhich part of the file to describe. 'loudest' is the default and finds the loudest stretch of 'seconds', which is what a stem needs: an instrument that plays a verse and rests through the chorus is silent for most of its own file. Loudest is not busiest: measured over five stems, the loudest window of a pad and of a keys part held no onsets at all. 'whole' averages everything, including the rests. 'at' takes 'seconds' from 'start_s'.loudest
secondsNoHow long a stretch to describe, for 'loudest' and 'at'. Ignored by 'whole'.
start_sNoWhere to start, for window='at' only.
instrumentNoWhat kind of instrument this is, when you know. Set it whenever you do: a stem is usually named or obvious, and telling the tool is worth far more than any ranking. 'drum_kit' is a whole kit and 'drum_hit' is one cymbal or snare, which are never interchangeable. Empty ranks the whole library and is measurably the worse answer.
category_containsNoNarrow further inside the family by browser category text, case insensitive. Empty keeps the whole family.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

The description goes far beyond the annotations by disclosing the score's meaning (lower is closer, not comparable across files), the weakness of ordering within one answer, the use of Ableton's preview render, and error cases like nothing_to_match and no_index. It also explains the load_with block and the name-not-path caveat – all behavioral traits not captured by readOnlyHint or idempotentHint.

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 description is long but well-structured: a one-sentence summary, then Returns, then a Note with measurement caveats and usage warnings. Every sentence carries substantive information; there's no fluff. The length is justified by the tool's complexity, though it could be tightened without losing meaning.

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 eight parameters and an output schema, this description covers everything an agent needs: return format, error cases, how to load the result, and extensive behavioral caveats backed by concrete measurements. It even explains how to safely confirm the selection ('Check before confirming'). No critical context 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?

The input schema already covers all eight parameters (100% coverage), so the baseline is 3. The description adds value by explicitly urging users to set the instrument parameter ('worth far more than any ranking') and by describing how window affects matching (loudest vs whole, with measurement context). This enriches the agent's understanding of parameter choices beyond the 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?

The description opens with 'Rank the library by how close each item sounds to a piece of audio you have.' This is a specific verb (rank) and resource (library) with a clear input, clearly distinguishing it from siblings like find_sound or analyze_audio. The purpose is unmistakable and specific.

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 note section gives clear guidance: set the instrument family when known, warns the result is 'a shortlist, not a ranking,' and explains matching behavior (timbral, level-removed, pitch-agnostic) and how to load the selected item. It doesn't explicitly name alternative tools, but the context is rich enough for an agent to know when to use this tool.

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

playA
Idempotent

Start transport playback and read back the is_playing status.

Returns:
    Dictionary reporting the start call and the read-back is_playing flag.

Note:
    The read-back proves the transport is running, not that anything is audible:
    a muted track, an empty Arrangement or a track with no instrument all play
    silently. Use stop to halt, and set_arrangement_time to move the playhead
    without starting.

    Leave the transport as it was found. Nothing here stops it on its own, and a
    set left playing keeps playing for whoever is at the machine.

    A Session clip that has played leaves its track in Session view, and the
    track then ignores the Arrangement until Live's Back to Arrangement button
    is pressed. ``song.back_to_arranger`` reports that state and clears it
    when written false (applied asynchronously, taking up to 2 read-back
    attempts for ``read_back: "applied"``).
ParametersJSON Schema
NameRequiredDescriptionDefault
from_beatNoCue the playhead to this beat before starting, in beats from the start of the Arrangement. Omit to start from wherever the playhead already sits.
continue_playingNoTrue resumes from the current position instead of restarting. Ignored when from_beat is given, since that sets the position.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only provide high-level flags (not read-only, idempotent, not destructive). The description adds substantial behavioral context beyond those flags: the read-back proves transport running rather than audibility, the transport is left running, and Session clip playback can make a track ignore the Arrangement until Back to Arrangement is triggered.

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 description is longer than minimal, but it is front-loaded with the core purpose and then structured into useful blocks: return value, caveats, transport state, and Session/Arrangement behavior. Each block earns its place, though the last paragraph is detailed enough that a slightly tighter version would be possible.

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 the tool's side effects and edge cases, the description is complete: it states the return dictionary, the non-audibility caveat, the leave-transport-as-found policy, the Session clip interaction, and the asynchronous back_to_arranger behavior. The full input schema and output schema cover the remaining structured details.

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%, with both from_beat and continue_playing already explained in detail, including the interaction where from_beat overrides continue_playing. The tool description does not need to add parameter semantics, so the baseline of 3 is appropriate.

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 description opens with a specific verb and resource: 'Start transport playback and read back the is_playing status.' It also names sibling tools stop and set_arrangement_time, so an agent can distinguish play from related transport operations without opening other definitions.

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?

The description explicitly states when to use alternatives: 'Use stop to halt, and set_arrangement_time to move the playhead without starting.' It also clarifies that playback may be silent, which sets expectations for whether calling this tool is useful in a given context.

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

quantize_clipA
Idempotent

Quantize MIDI clip note positions and lengths to a specified beat grid.

Reads notes, calculates quantized positions, writes back using mode='replace',
and verifies the result.

Returns:
    Dictionary with the write result, the number of notes moved, and how far.

Note:
    Parameter interactions: ``strength`` scales note displacement towards ``grid`` from
    0.0 (raw timing preserved) to 1.0 (full snap). Use partial strength (e.g. 0.5) to
    tighten timing while preserving human groove feel. Setting ``quantize_ends=True``
    snaps note ends to the grid too, adjusting note lengths. In contrast,
    ``quantize_ends=False`` shifts note onsets only and preserves articulation.

    Quantising modifies notes in place and is not undoable. Read the notes first with
    read_clip_notes if the original unquantized timing might be needed later.

    To shift pitch instead of timing, use transpose_clip. To write custom or micro-timed
    notes off-grid, use write_clip_notes.
ParametersJSON Schema
NameRequiredDescriptionDefault
gridNoGrid to snap to, in beats: 1.0 is a quarter note, 0.5 an eighth, 0.25 a sixteenth, and 0.3333 a triplet eighth. Must be positive.
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
strengthNoHow far to move each note towards the grid, 0.0 for not at all and 1.0 for all the way. 0.5 halves the distance and keeps some of the original feel.
quantize_endsNoTrue snaps note ends to the grid too, which changes durations. False moves onsets and leaves every duration as it was.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations provide readOnlyHint=false and destructiveHint=false, but the description goes further by disclosing that quantizing modifies notes in place and is not undoable, and that it writes back using mode='replace' and verifies the result. It also explains the strength scaling and quantize_ends interaction, which is valuable behavioral context beyond the structured fields. No contradiction with annotations is present.

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?

The description is well-organized: the core purpose is front-loaded, then parameter interactions, then behavioral warnings, then alternatives. Every sentence earns its place; no fluff or repetition of schema details.

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 mutating tool with six parameters, the description covers the return format (dictionary with write result, note count, distance), handles edge cases (refusal of arrangement clip paths), and provides usage guidance. Even though an output schema exists, the description's return summary is helpful and not redundant.

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?

Although schema coverage is 100%, the description adds significant meaning: it explains strength as a displacement scale from 0.0 to 1.0 with a practical suggestion (0.5 for groove), and clarifies that quantize_ends=True snaps note ends while False preserves articulation. This goes beyond the schema's brief parameter definitions.

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 description states a specific verb (quantize) and resource (MIDI clip note positions and lengths) against a beat grid. It clearly distinguishes itself from sibling tools by naming transpose_clip for pitch and write_clip_notes for custom off-grid notes, so an agent can tell them 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?

It explicitly says when to use this tool versus alternatives: 'To shift pitch instead of timing, use transpose_clip. To write custom or micro-timed notes off-grid, use write_clip_notes.' It also advises reading notes first with read_clip_notes if original timing might be needed later, covering both selection and prerequisite context.

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

read_automationA
Read-onlyIdempotent

Sample a clip envelope into a list of values and report what it found.

Reads the curve by evaluating it at ``points`` positions, so the answer is a
sampling of the envelope rather than the breakpoints that define it.

Returns:
    Dictionary with the sampled values, the beat range they cover, the value
    range they span, and flags saying whether an envelope exists at all.

Note:
    Automation lives in Session clips, so an Arrangement clip has none to read.
    als_read is the way to see breakpoints in a saved project instead.

    Use write_automation to lay a curve down and clear_automation to remove one.
    A flat result with an envelope flag of false means nothing is automated on
    that parameter, which is not the same as an envelope holding the parameter's
    current value.
ParametersJSON Schema
NameRequiredDescriptionDefault
endNoLast beat to sample, clip-local. Omit to sample to the end of the clip.
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
startNoFirst beat to sample, clip-local, where 0 is the clip start. Omit to start just past beat 0, which steps over the guard that keeps a sample off the envelope edge.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
pointsNoHow many evenly spaced samples to take across the range. Clamped to 2..512. This is the resolution of the answer, not of the stored envelope, which keeps whatever breakpoints it was written with.
parameterYesLOM path to the DeviceParameter the envelope belongs to, e.g. 'song.tracks[0].mixer_device.volume' for track volume or 'song.tracks[0].devices[1].parameters[3]' for a device knob.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

The description goes beyond the readOnly/idempotent annotations by explaining that the result is a sampling at points positions rather than breakpoints, and by clarifying the semantic distinction between 'nothing is automated' and 'an envelope holding the parameter's current value.' It also discloses the return shape: sampled values, beat range, value range, and existence flags. No contradiction with annotations.

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?

The description is front-loaded with the core action and then uses clearly labeled 'Returns' and 'Note' sections for supplementary detail. Every sentence carries information: the sampling distinction, the return dictionary, the Session-vs-Arrangement caveat, and the alternative tools. It is longer than the simplest descriptions, but it is appropriately sized for a tool with 7 parameters and meaningful edge cases.

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?

The description is complete for the tool's complexity: it explains what the tool returns, how it differs from related tools, the Session-clip requirement, and the subtle false-flag meaning. The input schema fully documents parameters, and an output schema exists, so the prose fills the remaining behavioral and contextual gaps. Nothing an agent needs to invoke 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 tool-level meaning that clarifies parameters: 'evaluating it at points positions' explains the role of the points parameter, and 'sampling of the envelope rather than the breakpoints' frames what all parameters collectively produce. It doesn't re-document each parameter, but it adds useful conceptual context beyond the 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?

The description opens with a specific verb and resource: 'Sample a clip envelope into a list of values and report what it found.' It immediately distinguishes itself from related tools by stating that it returns a sampling of the envelope, not the breakpoints, which differentiates it from als_read. This makes the tool's purpose unmistakable.

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?

The description explicitly says when to use this tool versus alternatives: 'als_read is the way to see breakpoints in a saved project instead,' and 'Use write_automation to lay a curve down and clear_automation to remove one.' It also provides a key contextual constraint: automation lives in Session clips, so Arrangement clips have none to read. This is model-level guidance that leaves little to inference.

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

read_clip_notesA
Read-onlyIdempotent

Read MIDI notes of a Session clip, query a specific window, or count notes.

Returns:
    Dictionary containing notes, count, window parameters, and validation report.

Note:
    Times and positions are clip-local beats. Muted notes are included and carry ``mute:
    true``.

    A single drum clip of 384 notes comes back as 57k characters, past the tool-result
    cap, and ``Clip`` has no ``note_count`` in the LOM, so counting from out here
    otherwise means transferring every note. ``count_only=True`` carries back one
    integer instead. ``pitch_min`` and ``pitch_max`` narrow the read the way time does,
    which is what makes a question like "what sits below this guitar's lowest string"
    answerable on a clip too large to read whole. ``get_notes_extended`` through
    ``lom_call`` takes a pitch window too, but answers with opaque note handles that can
    be counted and not read. With ``count_only`` there is nothing to validate, so
    ``check`` is ignored; with a window, ``check`` sees the window and not the clip.

    Returned notes are sorted by time, then pitch. Live hands them back ordered by
    pitch, which is the one order a musical instruction never means: four notes written
    at beats 0, 1, 2, 3 with pitches 72, 60, 67, 62 come back 60, 62, 67, 72, so taking
    every other entry off the raw list picks alternating pitches rather than alternating
    beats, silently and plausibly. For Live's own order call ``get_notes_extended``
    through ``lom_call``.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
checkNoTrue runs validation over the notes that came back and reports what it found. Ignored when count_only is true, since there are no notes to check.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
from_timeNoFirst beat of the window to read, clip-local, where 0 is the clip start. Omit to read from the beginning.
pitch_maxNoHighest MIDI pitch to return, inclusive. Omit for no upper bound.
pitch_minNoLowest MIDI pitch to return, inclusive. Omit for no lower bound. Use it to ask about part of a clip too large to read whole, such as what sits below an instrument's real range.
time_spanNoLength of the window in beats, not the beat it ends on: beats 24 to 32 is from_time=24, time_span=8. Omit to read to the end.
count_onlyNoTrue counts the notes and returns the number without carrying them back, which is the way to ask about a large clip.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses several critical behaviors: times are clip-local beats, muted notes are included with a mute:true flag, notes are sorted by time then pitch (and explains why Live's pitch-first order is problematic), and the effect of count_only on validation. It also explains the 57k character limitation and how count_only solves it. This is rich behavioral context that annotations alone cannot provide.

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 description is long but well-organized: a one-line purpose, a Returns section, then a Note section for caveats. It is dense with useful information and each sentence earns its place. The structure is clear (purpose, returns, behavioral notes) and front-loads the main purpose. While it's not terse, the complexity of the tool (9 params, large-clip pitfalls, ordering quirks) justifies the length. Slight deduction for not being more scannable, but it's well-structured.

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 the tool's complexity, the description covers all essential context: the large-clip size problem and the count_only workaround, pitch windowing for oversized reads, sorting behavior and why it matters, validation interactions, and the alternative tool for Live's ordering. An output schema exists, so return values don't need elaboration. An agent can call this tool correctly across all edge cases after reading this description. Nothing critical 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?

The input schema covers all 9 parameters with detailed descriptions (100% coverage), so the baseline is 3. The description adds value beyond the schema by explaining the rationale and usage context for key parameters: count_only for large clips, pitch_min/max for narrowing, and time_span semantics (length, not end beat). It doesn't re-explain each parameter but adds the 'why' and 'when' that the schema lacks. This pushes it to 4.

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 description opens with a clear, specific verb-resource pair: 'Read MIDI notes of a Session clip, query a specific window, or count notes.' It immediately distinguishes three modes of operation. It also names the alternative tool (get_notes_extended via lom_call) that provides opaque handles, making it obvious this tool returns readable notes. This exceeds the minimum and clearly differentiates from siblings like write_clip_notes.

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?

The description gives explicit guidance on when to use each mode: count_only for large clips that would exceed the result cap, pitch_min/max to narrow the read for large clips, and when to prefer get_notes_extended (when you need Live's native ordering or are okay with opaque handles). It also explains the interaction between count_only and check, and that a window makes check see the window not the clip. This is exemplary usage guidance.

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

set_arrangement_timeA
Idempotent

Move the Arrangement playhead to a beat and read the position back.

Writes ``song.current_song_time``. This moves where playback would start. It
does not start it. Use play to begin, or play with ``from_beat`` to do both in
one call.

Returns:
    Dictionary with the write confirmation and the read-back song time.

Note:
    Writing ``song.current_song_time`` is bounded by ``song.song_length``;
    attempting to set a position past ``song_length`` fails with Live error
    ``"Cannot set the Songtime behind the Songlength"``. Transport playback
    in Session view advances freely past ``song_length``.

    Do not sample a moving transport through lom_batch. A read that follows a
    jump inside the same batch still reports the position from before the move,
    and it reports it without an error (see lom_batch). One call per position.
ParametersJSON Schema
NameRequiredDescriptionDefault
at_beatYesPosition on the Arrangement timeline in beats from the start, where beat 0 is the beginning of the song. Fractional beats are accepted, so 33.5 is the second half of bar 9 in 4/4.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses behaviors well beyond the annotations: it states it writes song.current_song_time, that writes are bounded by song_length, the exact Live error on failure, and the stale-read behavior inside lom_batch. This gives the agent important execution expectations that annotations alone do not convey.

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?

The description is well structured: a front-loaded one-sentence summary, then an expandable note and return statement. The warnings about song_length and lom_batch are necessary behavioral context, not filler, and every sentence earns its place.

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 write-and-read tool, the description covers the primary action, the boundary condition, the failure mode, the batching caveat, and the relationship to playback tools. An agent has enough information to invoke it correctly and anticipate outcomes.

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%, and the schema already defines at_beat including beat origin and fractional beat acceptance. The tool description adds little parameter-specific meaning beyond the schema, so the baseline of 3 is appropriate.

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 description opens with a specific verb and resource: 'Move the Arrangement playhead to a beat and read the position back.' It clearly identifies the operation and distinguishes it from starting playback, explicitly noting that play or play with from_beat handles playback.

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?

The description gives explicit guidance on when to use this tool versus alternatives: 'Use play to begin, or play with from_beat to do both in one call.' It also warns against using lom_batch for sampling a moving transport and prescribes 'One call per position', which is actionable usage advice.

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

set_locatorA

Place or remove an Arrangement cue locator. Requires confirm=True.

This toggles, and that is the whole difficulty with it. Live offers one call,
``song.set_or_delete_cue``, which adds a locator where none exists at that beat
and deletes the one that does, so the same arguments twice leave nothing behind.
Call with confirm=False first to see which of the two would happen.

Returns:
    Dictionary reporting the toggle, and the cue points and their count after it.

Note:
    A locator marks a position for a human reading the Arrangement. It does not
    move the playhead. Use set_arrangement_time to move that, and set_loop to
    mark a region rather than a point.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName for a locator this call creates. Ignored when the call deletes one, because there is nothing left to name.
at_beatYesPosition on the Arrangement timeline in beats from the start, where beat 0 is the beginning of the song. Fractional beats are accepted, so 33.5 is the second half of bar 9 in 4/4.
confirmNoTrue carries the toggle out. False changes nothing and reports the locators that already exist, which is how to tell in advance whether this call would add one or delete one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With sparse annotations, the description carries the behavioral burden and does so thoroughly. It discloses the non-idempotent toggle, the confirm=True requirement, the confirm=False preview behavior, the return dictionary contents, and the fact that locators do not move the playhead. No contradictions with annotations are present.

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?

The essential action and confirm requirement are front-loaded, followed by a compact explanation of the toggling behavior. The Returns and Note sections organize extra context cleanly, with no redundant or filler content.

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?

The definition is complete for the tool's complexity: it explains a subtle toggle behavior, states required confirmation, describes the return value, and differentiates sibling tools. Given the output schema exists, this leaves no important gap for an agent calling the tool 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?

The input schema already provides rich descriptions for all three parameters, so the baseline is 3. The description adds beyond the schema by clarifying the toggle consequence of passing the same arguments twice and reinforcing the confirm=False workflow, which helps an agent reason about the non-idempotent parameter interactions.

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 description opens with a concrete verb and resource: 'Place or remove an Arrangement cue locator.' It immediately distinguishes the tool from related siblings by explaining what it does not do—moving the playhead or marking a region—so an agent can recognize its specific scope.

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?

The description gives explicit operational guidance: call with confirm=False first to preview whether the action will add or delete a locator. It also names alternatives set_arrangement_time and set_loop with the precise conditions for using them instead, which is strong usage-direction.

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

set_loopA
Idempotent

Move the Arrangement loop brace, or switch looping on and off.

Every argument is optional and only the ones given are written, so the brace can
be moved without touching the switch and the reverse.

Returns:
    Dictionary reporting how many writes were made and the before and after
    values for each of enabled, loop_start and loop_length.

Note:
    The brace only loops the Arrangement transport. It has no bearing on Session
    clip looping, which is a clip property. Read that with get_clip. ``length``
    is a duration and not an end position.

    Calling with no arguments at all writes nothing and reports the current
    brace, which is the cheap way to read it.
ParametersJSON Schema
NameRequiredDescriptionDefault
startNoWhere the loop brace begins, in beats from the start of the Arrangement. Omit to leave it where it is.
lengthNoHow long the brace is, in beats, not the beat it ends on: a loop over bars 5 to 9 in 4/4 is start=16, length=16. Omit to leave it.
enabledNoTurn the Arrangement loop on or off. Omit to leave the switch as it is and move the brace only.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Even though annotations already signal idempotent, non-destructive behavior, the description adds meaningful context: only supplied arguments are written, no-argument calls perform no writes, the return dictionary reports write count and before/after values, and length is a duration not an end position. These details go well beyond the structured annotations.

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?

The description is well-structured with clear sections, front-loaded purpose, and no filler. The Returns and Note sections each add necessary behavioral or scoping information, and every sentence earns its place.

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 tool with three optional parameters and an output schema, the description is complete: it explains the write behavior, the read-only no-arg mode, the return shape, the meaning of length, and the boundary between Arrangement looping and Session clip looping. An agent has everything needed 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?

The input schema already covers all three parameters at 100% with clear descriptions. The tool description still adds value by explaining that length is a duration rather than an end position and by emphasizing that omitted parameters are left unchanged, reinforcing the optional-write 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?

The description opens with a specific, action-focused statement: 'Move the Arrangement loop brace, or switch looping on and off.' It clearly identifies the resource (Arrangement loop brace) and distinguishes this tool from Session clip looping by pointing to get_clip as the relevant tool for that case.

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?

The description explicitly explains the optional-argument behavior, clarifies when not to use it ('no bearing on Session clip looping'), names the alternative (get_clip), and even documents the no-argument read mode as the cheap way to inspect the current brace. This gives an agent clear selection and invocation guidance.

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

set_mixA
Idempotent

Set volume, pan, sends, mute and solo on one track in a single round trip.

Every argument is optional and only the ones given are written, so this is the
cheap way to change several mixer controls at once. Read the current state with
get_track first, since the values here are absolute and not relative.

Returns:
    Dictionary reporting each write with its before and after value, and the dB
    display where Live offered one.

Note:
    Volume and pan are normalised, so 0.85 is 0 dB (measured) rather than 85 per
    cent of anything. Read ``display`` in the answer for Live's own dB reading
    instead of converting the normalised number yourself.

    The master track has no mute and no solo. Both are refused there rather than
    silently ignored, and ``track`` is not read at all when kind is master.

    This is the mixer only. For a knob on a device in the chain use
    set_parameter, and for the tempo use set_tempo. To make a mixer control move
    over time rather than jump, write an envelope with write_automation.
ParametersJSON Schema
NameRequiredDescriptionDefault
panNoPan position from -1.0 hard left through 0.0 centre to 1.0 hard right. Omit to leave it alone.
kindNoWhich collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.track
muteNoTrue mutes the track, False unmutes it. Not supported on the master track. Omit to leave it alone.
soloNoTrue solos the track, which silences the others rather than changing anything on this one. Not supported on the master track. Omit to leave it alone.
sendsNoSend levels to write, keyed by send letter as Live labels it ('A', 'B') or by index as a string ('0', '1'), with normalised values 0.0 to 1.0. Only the sends named are written. Omit to leave every send alone.
trackYesTrack index in song.tracks, counted from 0.
volumeNoFader position, normalised 0.0 to 1.0, not decibels. 0.85 is 0 dB (measured) and the scale between is not linear, so 0.425 is not half the level. Omit to leave the fader alone.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false; the description adds meaningful context beyond these: master-track mute/solo 'are refused there rather than silently ignored,' 'track is not read at all when kind is master,' values are absolute rather than relative, volume/pan use a non-linear normalised scale ('0.85 is 0 dB (measured)'), and the return dictionary reports before/after values plus Live's dB display. The description is consistent with the annotations, so there is no contradiction.

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 description is front-loaded with purpose and core behavior, then returns, then normalization notes, then sibling routing. It is longer than average, but the tool genuinely has the complexity to justify it (7 parameters, normalization traps, master-track exceptions). The Note paragraph slightly overlaps the schema's volume description, though it earns its place by extending normalization context to pan and pointing at the display field.

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 7-parameter mutable mixer tool with an output schema and annotations present, nothing an agent needs is missing: prerequisites (get_track first), edge cases (master refusal, track ignored), exclusions (mute/solo unsupported), alternatives (set_parameter, set_tempo, write_automation), and return behavior are all covered. The output schema carries the detailed return structure.

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 description coverage is 100%, so the baseline is 3. The description adds genuine cross-parameter meaning beyond the schema: pan shares the same normalised 0.85=0 dB semantics as volume, the 'display' field in the answer is the authoritative dB reading rather than converting the normalised number, and master rejects mute/solo rather than silently ignoring them. This lifts it above the baseline.

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 sentence states a specific verb and resource: 'Set volume, pan, sends, mute and solo on one track in a single round trip.' It is scoped precisely to the mixer of one track and is immediately distinguishable from siblings like set_parameter, set_tempo, and get_track without opening their 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?

The description explicitly tells the agent when to use this tool ('the cheap way to change several mixer controls at once'), states a prerequisite ('Read the current state with get_track first, since the values here are absolute and not relative'), and names alternatives with routing conditions: 'For a knob on a device in the chain use set_parameter, and for the tempo use set_tempo... write an envelope with write_automation.' 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.

set_parameterA
Idempotent

Set one device parameter by index or name and verify the read-back.

Returns:
    Dictionary reporting the write, the parameter index it resolved to, the
    read-back value, and the display string where the device offered one.

Note:
    Parameter values are normalised, not the unit the device displays. Read ``min``
    and ``max`` (``describe`` with ``with_parameters=True``) rather than assuming
    a range.

    The curve from 0..1 onto the displayed unit is not linear and differs per
    device. On one third-party compressor Attack is ``v^4 * 1000 ms``, so writing
    "10 ms" linearly lands at 316 ms, a factor of 30, silently. Where the device
    reports a display, aim with the display. Where it does not (all VST2), write
    normalised and calibrate by eye once.

    A parameter that shows a display also answers ``str_for_value``: lom_call with the
    parameter path, ``method='str_for_value'`` and one value returns the string that
    value would display, and moves nothing. That maps a unit onto the scale without
    deriving the taper by trial (catalog row param.str_for_value).

    A quantized parameter takes discrete steps, so a written 0.5 can legitimately read
    back as something else, and that is reported as a clamp rather than as a failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.track
trackYesTrack index in song.tracks, counted from 0.
valueYesTarget value in the parameter own units, which are normalised and device-specific rather than the unit the device displays. Read ``min`` and ``max`` with ``describe`` first: the range is whatever the device declares and is often not 0..1.
deviceYesDevice index in that track chain, counted from 0. get_devices lists the chain with its indices.
parameterYesWhich parameter, either its index as a string ('1') or its name, which may be a glob ('Attack*'). A name that matches more than one parameter is refused rather than guessed at. ``describe`` with with_parameters=True lists the names.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses critical behaviors: values are normalized rather than displayed units, the curve is nonlinear and device-specific, quantized parameters can legitimately clamp, and ambiguous names are refused. This is rich, honest behavioral context that prevents silent misconfiguration.

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 description is front-loaded with the core purpose and return summary, then organized into a focused Note section. While lengthy, each sentence addresses a real operational pitfall (normalized units, nonlinear curves, quantization, str_for_value). It is longer than minimal but justified by the tool's subtle failure modes.

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 the tool's complexity and the rich output schema, the description covers all essential operational context: value normalization, how to discover valid ranges, how to handle nonlinearity, quantization behavior, and ambiguous names. An agent has enough to call it correctly and interpret results without missing surprises.

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 adds meaningful semantics beyond the schema: it explains normalization, non-linear scaling, the meaning of the value parameter in device-specific terms, and the glob/refusal behavior of the parameter name. This goes beyond what the schema already states without 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?

The description opens with a specific verb and resource: 'Set one device parameter by index or name and verify the read-back.' This clearly distinguishes it from sibling tools like set_mix, set_tempo, and lom_set by focusing on device parameters and read-back verification. The purpose is unambiguous and immediately actionable.

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 explicit usage guidance: read min/max with describe before writing, use the device display when available, and use str_for_value to map units without trial. It stops short of naming alternatives or saying when not to use this tool, so it lacks explicit exclusions, but the context is strong and practical.

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

set_parameter_displayA
Idempotent

Set a device parameter by the reading it should show, not by its raw value.

Returns:
    Dictionary reporting the value written, the display it produced, the residual
    error against the target, the unit, and how many probes and round trips it
    took. On refusal, why - including the case where the device reports no units.

Note:
    The inverse of ``set_parameter``, and there is no formula to invert: the curve from
    the raw range onto the displayed unit differs per parameter and is rarely linear. On
    one measured third-party compressor Attack is ``v^4 * 1000 ms``, Ratio is ``20^v``
    and Threshold about ``40 * log10(v)``, so writing 10 at a parameter that displays
    milliseconds lands at 316 ms, a factor of 30, and reports success.

    The taper is sampled, not computed: one batch of probes asks what each raw value
    would read as, the answers are bracketed around the target, a second batch refines
    inside that bracket, and only then is a single value written and read back. Two
    round trips, and nothing in the set moves until that last step. Probing with real
    writes has been measured leaving Delay Feedback at 100 % (self-oscillation) and
    Saturator Drive at 100 % across 20 parameters (catalog row
    return_device.str_for_value); the probes here write nothing. They also stay strictly
    inside the range and never ask at ``min`` or ``max``, where a plug-in's own
    formatting code has crashed Live in native code no try/except reaches
    (docs/limits.md, 'Asking for a display string at an endpoint (Live)').

    Where the device reports no unit this refuses instead of aiming: every VST2 reports
    a bare number (0 of 36 measured), so a display-driven search there would walk the
    control to its end stop and call it a result. Use ``set_parameter`` with a
    normalised value for those and calibrate by ear once. The result is the stored value
    and its display, which is not audibility: a parameter on a device that is switched
    off reads back exactly the same.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.track
unitNoWhich unit the target is in: 'dB', 'Hz', 'ms', '%', 'ratio', 'st', 'cents' or 'x'. Give kHz as Hz and seconds as ms. Optional: when omitted the unit the device reports is used, and a device reporting a different unit than you expected is a refusal, not a guess.
trackYesTrack index in song.tracks, counted from 0.
deviceYesDevice index in that track chain, counted from 0. get_devices lists the chain with its indices.
targetYesThe reading you want, as a bare number in the base unit: -26 for -26 dB, 8000 for 8 kHz, 150 for 150 ms, 4 for a 4:1 ratio. Not the normalised value - that is set_parameter.
parameterYesWhich parameter, either its index as a string ('1') or its name, which may be a glob ('Attack*'). A name that matches more than one parameter is refused rather than guessed at.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Very rich behavioral disclosure: probes write nothing, nothing moves until a final single write, range is strictly bounded to avoid crashing Live, refusal occurs when a device reports no unit, and the stored value is not audibility. This far exceeds what annotations (destructiveHint=false, idempotentHint=true) convey and adds critical operational 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?

The description is long but front-loaded with a clear one-sentence purpose. Returns and Note sections are dense, not padded, and almost every sentence earns its place. Some internal references like 'catalog row return_device.str_for_value' and the measured third-party examples are slightly over-specific but still support the safety argument.

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 tool with an output schema, 6 params, and a subtle domain, this is complete. It covers failure modes (no-unit refusal, name ambiguity refusal), safety behavior (range bounds, no writes during probing), helper routing to set_parameter, and the semantics of the returned display. Nothing needed 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. The description adds real extra meaning by clarifying target is a display reading not a normalised value, giving concrete examples like -26 dB and 8000 for 8 kHz, and explaining refusal semantics when units mismatch. The v^4 * 1000 ms example makes the non-linear mapping tangible.

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 sentence states a specific verb+resource+semantic: 'Set a device parameter by the reading it should show, not by its raw value.' This immediately distinguishes the tool from its sibling set_parameter. The Returns section and Note section continue to reinforce what the tool does and what it refuses to do, making the purpose unmistakable.

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?

The description explicitly says when to use this tool (when aiming at display reading, when units are known) and when not to: 'Use set_parameter with a normalised value for those' VST2/no-unit devices. It also names the inverse relationship and explains why the inverse is necessary, giving clear routing between sibling tools.

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

set_tempoA
Idempotent

Set the global song tempo in BPM and read back the stored value.

One tempo governs the whole set, Session and Arrangement alike. There is no
per-track tempo. The one other place a tempo can come from is a scene, below.

Returns:
    Dictionary reporting the write and the read-back tempo.

Note:
    A tempo set here does not survive every scene launch. Firing a scene whose
    ``tempo_enabled`` is on writes ``song.tempo`` again from ``scene.tempo``, so
    read ``song.tempo`` back after a launch rather than assuming this one held
    (catalog rows ``scene.tempo`` and ``scene.tempo_enabled``, both read verified
    2026-08-29 against Live 12.4.5).

    BPM is a real unit, which makes this tool the exception among the setters. A
    device parameter is normalised over whatever range the device declares: reach
    those with set_parameter and read ``min`` and ``max`` through ``describe``
    rather than assuming 0..1 (docs/limits.md). Volume, pan and sends are
    normalised the same way, and set_mix carries them.
ParametersJSON Schema
NameRequiredDescriptionDefault
bpmYesTempo in beats per minute. The catalog validates 20.0 to 999.0.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Discloses behavior well beyond the annotations: the tool writes and reads back the stored value, the set does not survive every scene launch, the exact mechanism (scene.tempo_enabled rewriting song.tempo), and that BPM is a real unit unlike normalized device parameters. The idempotentHint annotation is consistent—setting an absolute tempo is idempotent—and the description adds genuine lifecycle context. No contradiction.

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 main purpose is front-loaded in the first line, with Returns and Note sections structuring the caveats. The parameter-normalization tangent runs a bit long and includes extra set_mix detail, but every sentence carries information useful for correct invocation.

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 tool with an output schema and annotations present, the description covers everything needed: global scope, return shape, the scene-launch override caveat, and cross-references to sibling tools. No material gap remains for an agent 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% and the bpm schema description already gives the unit and validation range, so baseline is 3. The description adds value by flagging that BPM is 'a real unit, which makes this tool the exception among the setters,' warning the agent not to send a normalized 0..1 value. This goes beyond what the schema states.

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: 'Set the global song tempo in BPM and read back the stored value.' The description immediately distinguishes scope ('One tempo governs the whole set, Session and Arrangement alike. There is no per-track tempo'), which prevents confusion with per-track setters like set_parameter or set_mix.

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?

Provides real routing context: names the scene as the 'one other place a tempo can come from' and advises reading song.tempo back after a launch, and points to set_parameter for normalized device parameters plus describe for min/max. Lacks an explicit 'use this over X when...' framing, but the alternatives and conditions are clearly named.

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

sound_index_statusA
Read-onlyIdempotent

Is there an index of how this installation's library sounds, and what is in it?

Call this before ``match_sound``. Without an index that tool has nothing to rank
against, and a fresh session has no way of knowing whether one was ever built.

Returns:
    Dictionary with whether an index exists, where it is, when it was built, how
    many items of each kind it carries, which libraries they came from, and what
    was skipped when it was built.

Note:
    The index is built from the audio Ableton renders for its own browser previews,
    which sits beside the content under ``Ableton Folder Info/Previews``. It is not
    committed and it describes one machine: rebuild it by running
    ``live-maestro-index`` after installing or removing packs.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context: the index is not committed, describes one machine, is built from Ableton preview renders, and lives under a specific path. This is valuable information that annotations do not provide.

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 description is well-structured with a clear question, a usage directive, a returns summary, and a note. It is slightly longer than strictly necessary, but every section adds relevant information and the most important guidance ('Call this before match_sound') 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 zero-parameter read-only status tool with an output schema, the description is complete: it covers what the tool does, when to call it, what it returns, and important environmental caveats. An agent has everything needed to invoke it correctly and interpret its role in the workflow.

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 has zero parameters and the schema is empty, so the baseline is 4. The description does not need to explain parameter semantics since there are none, and it does not introduce any misleading parameter-related claims.

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 description clearly states the tool is a status check for a sound index: it asks and answers whether an index exists and what it contains. It names the specific resource (the installation's library sound index) and differentiates itself from its sibling match_sound by establishing a dependency relationship.

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?

The description gives explicit when-to-use guidance: 'Call this before match_sound' and explains why (without an index, match_sound has nothing to rank against). It also tells the agent when the index needs rebuilding via live-maestro-index, which is practical usage context beyond simple selection.

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

stopA
Idempotent

Stop transport playback, and optionally every playing Session clip.

Returns:
    Dictionary reporting the transport stop and, where asked for, the clip stop.

Note:
    With ``quantized=True`` the clips stop on the next grid point rather than at
    once, so an immediate read can still show a clip playing without anything
    having gone wrong. Use play to resume playback, or set_arrangement_time(at_beat=0)
    to rewind the Arrangement timeline to the beginning.

    Stopping does not restore a parameter a clip envelope was driving. The envelope
    leaves the parameter at its last reached value and Live keeps no static baseline
    underneath to restore.
ParametersJSON Schema
NameRequiredDescriptionDefault
clipsNoTrue also stops every playing Session clip through song.stop_all_clips. False stops the transport only: the flag exists because that alone does not stop the Session clips.
quantizedNoTrue lets the clip stop fall on the global launch quantisation grid, so it can lag the call by up to a bar. False stops the clips immediately. Only read when clips is true.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, it discloses that quantized clip stops are grid-aligned and may not be reflected in an immediate read, and it warns that stopping does not restore envelope-driven parameters. These are non-obvious side effects an agent needs before invoking or interpreting the result.

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 description front-loads the main action, then uses compact Returns/Note sections; the envelope and timing caveats earn their place. It could be slightly tighter, but it is well structured and not padded.

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 2-parameter tool with rich schema descriptions and annotations, the description covers the return value, timing semantics, side effects, and follow-up alternatives. Given an output schema exists, no critical behavioral information appears 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?

The schema already fully documents both clips and quantized, including lag behavior, so the description doesn't add much parameter-level detail. The note about an immediate read still showing playback is a useful consequence but not a substantive expansion beyond the 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?

The description opens with a specific verb and resource: 'Stop transport playback, and optionally every playing Session clip.' This immediately distinguishes it from siblings like play and set_arrangement_time, and the optional clip behavior frames its scope.

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 names relevant alternatives in context: 'Use play to resume playback, or set_arrangement_time(at_beat=0) to rewind the Arrangement timeline to the beginning.' This gives an agent clear follow-up actions, though it doesn't explicitly state when not to use stop.

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

transcribe_stemA
Destructive

Turn a recording of one instrument into notes, cleaned of what it is not.

Returns:
    Dictionary with how many notes were heard and how many survived cleaning, the
    pitch range, the span in beats, a sample of the notes, and the write result
    where one was asked for.

Note:
    **This transcribes pitch, and percussion has no pitch.** A drum kit returns cymbal
    and shell resonances, reporting success: measured on a four minute drum stem, 39
    notes for 488 beats, none of them a kick, and nothing across forty bars of steady
    playing. Never write drums from here. Held material fails the other way: a wavering
    sustained note reads as several, so a pad arrives at the right pitches with a rhythm
    nobody played. Measured 2026-09-19 over four stems in their busiest 20 seconds,
    written attacks ran 3.35 a second against 2.85 onsets on bass, 3.50 against 1.30 on
    a strummed guitar, and 5.35 and 5.30 against 0.10 and 0.55 on pad and keys.

    ``transcription_suspect`` flags that disagreement, ``kind`` says which way, and
    ``transcription_checked`` says whether the comparison ran at all, since it needs a
    macOS-only second decode: elsewhere no warning means nothing. Measured 2026-09-19
    against exported MIDI for five pitched stems, pitch content agreed 93.7 to 96.2
    percent: which notes, not when, the export's own timing having drifted. Harmonics
    are removed where a lower, louder note at the same time explains them;
    ``monophonic`` then leaves nothing sounding at the same time as anything else.
    ``scripts/eval_transcription.py`` recomputes these.

    Writing needs a clip: ``create_clip`` on the target slot first, long enough for the
    whole part, then this with ``confirm=True``. ``span_beats`` runs from beat 0 to the
    last note's end, so a clip of that length rounded up to a bar holds it. Writing
    replaces every note in the clip, with no undo here and no rollback in the LOM: a
    write that fails after the removal leaves nothing.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to the audio to transcribe. A separated stem, one instrument at a time. A whole mix transcribes as one tangle.
slotNoSession clip slot on that track.
tempoYesBeats per minute, to turn seconds into clip beats. Read the set's own tempo unless the recording has a different one. A recording whose tempo drifts will separate from one number over the length of a song.
trackNoTrack to write the notes into. -1 returns them instead of writing, which is the default and is how to look before committing.
confirmNoTrue writes into the clip, replacing every note already in it. False reports what would be written and changes nothing.
previewNoHow many notes to include in the answer.
sustainedNoTrue for material that holds its notes rather than striking them: a pad, a string section, an organ. It joins same-pitch fragments separated by a gap too small to play, which is how one held chord stops arriving as eight notes. Off by default because on struck material it costs agreement on pitch content, between one and ten points measured over five stems, and it does not repair a pad: it took one from 5.35 written attacks a second to 2.25, where the recording started 0.10. See transcription_suspect.
monophonicNoTrue for a part played one note at a time, such as a bass or a sung line. It reduces the result to the lowest note sounding, which is how a bass loses the harmonics a transcriber hears above it, and which throws away the upper voices of anything that plays chords.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark destructiveHint=true, and the description adds substantial context beyond that: writing replaces every note, has no undo and no LOM rollback, and a write that fails after removal leaves nothing. It also discloses nuanced failure modes around percussion and sustained pads, plus measurements behind transcription_suspect, which annotations alone could never convey.

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 description is long, but almost every sentence carries operational weight: measured failure rates, no-undo guarantees, and the macOS-only check caveat. It is front-loaded with purpose, then Returns, then behavioral notes. Some empirical figures could be trimmed without loss, but the structure is logical and dense rather than padded.

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 an 8-parameter, write-capable, destructive transcription tool, the description covers prerequisites, preview behavior, failure modes, output contents, and safety consequences. The output schema and annotations cover machine-readable details, so nothing an agent needs to call this tool correctly and safely 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 schema already documents all parameters in detail. The description adds meaningful operational context on top: 'Writing needs a clip' explains slot/confirm usage, and the span_beats/clip-length note gives practical meaning to tempo and output interpretation. A few parameters like path and preview get no new detail, but the schema fully carries them.

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 line states a specific verb and resource: 'Turn a recording of one instrument into notes, cleaned of what it is not.' This clearly distinguishes it from mix analysis and from clip note reading/writing siblings, especially combined with the path schema contrast between a separated stem and 'a whole mix transcribes as one tangle.'

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 explicit operational guidance: use separated stems, never write drums ('Never write drums from here'), and before writing create a clip and pass confirm=True. It also clarifies that track=-1 previews without writing. It does not explicitly name an alternative tool, but the when-to and when-not-to conditions are clear.

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

transpose_clipA

Transpose a MIDI clip by note pitch or an audio clip via pitch_coarse.

Relative on both paths, so calling it twice with 2 moves the clip by 4 and there
is no absolute target to aim at. A MIDI clip has every note pitch rewritten. An
audio clip is repitched as a whole instead.

Returns:
    Dictionary reporting the transposition, the notes affected, and any that hit
    the range limit.

Note:
    When to use: Shift the overall pitch of an entire clip by a constant semitone offset.
    When NOT to use: Do not use transpose_clip to edit melody contours, re-voice chords,
    or correct scale degrees. Use write_clip_notes instead. Do not use it for timing or
    groove changes, which are handled by quantize_clip.

    An audio clip is transposed by writing clip.pitch_coarse. The write is relative
    there too, because the current value is read first and the semitones added to it,
    so repeated calls do keep climbing. Live documents the bound as -48 to 48 but that
    figure is not from a probe here. The read-back in the answer is the evidence for
    any one write.

    ``out_of_range='clamp'`` and ``'drop'`` both lose information that
    transposing back will not return: clamped notes have collapsed onto one
    pitch and dropped ones are gone. Keep the default 'error' unless the clip
    has been read out with read_clip_notes first.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
semitonesYesHow far to move the pitch, in semitones. 12 is an octave up, -12 an octave down. Relative to where the clip is now, not absolute.
out_of_rangeNoWhat to do with a MIDI note pushed outside 0..127: 'error' refuses the whole call and changes nothing, 'clamp' pins the note to 0 or 127 and keeps it, 'drop' discards it. Only 'error' leaves the clip recoverable by transposing back.error

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description reveals important behavioral traits well beyond the annotations: relative semantics that accumulate across calls, audio clips being repitched via clip.pitch_coarse with read-modify-write behavior, and the information-loss consequences of 'clamp' and 'drop'. It even caveats that the reported -48 to 48 bound is from Live docs, not a local probe. No contradiction with the annotations is present.

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?

The description is long but every sentence earns its place. It is front-loaded with the core operation, structured under 'Returns' and 'Note', and moves from behavior to usage boundaries to implementation caveats without repetition. The density is justified by the tool's complexity.

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 the tool's complexity.Counting all relevant context: what it does, when to use it, when not to, which siblings to prefer, return value shape, parameter semantics, and data-loss caveats are all covered. The output schema exists, so the Returns section is a useful complement rather than duplication. This is complete enough for an agent to invoke the 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?

Although the input schema already covers 100% of parameters, the description adds substantive meaning: it explains why repeated calls with 2 semitones move by 4, how audio clips map to pitch_coarse, and why 'error' is recoverable while 'clamp' and 'drop' are not. This goes well beyond the schema's per-parameter text.

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 description opens with a specific verb and resource: 'Transpose a MIDI clip by note pitch or an audio clip via pitch_coarse.' It clearly distinguishes the operation from the sibling tools by later naming write_clip_notes and quantize_clip as alternatives. An agent can tell exactly what this tool does and what it does not do.

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?

The description provides an explicit 'When to use' section and a 'When NOT to use' section, naming write_clip_notes for melody/chord edits and quantize_clip for timing/groove changes. It also gives operational guidance about the default out_of_range behavior. This is exemplary usage guidance with concrete alternatives.

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

write_automationA

Write an automation envelope into a Session clip and verify the read-back.

Turns a handful of breakpoints into a written curve, then reads it back so the
result reports the stored envelope rather than the requested one.

Returns:
    Dictionary reporting the write, how many points were laid down, and the
    comparison between the stored curve and the generated one.

Note:
    Automation lives in Session clips. There is no way to write an Arrangement
    envelope directly here: write it into the Session clip and then copy the clip
    onto the timeline with arrange, which carries the envelope with it.

    A verified write proves the stored curve, never that it is audible. An
    envelope on a parameter of a device that is switched off, or on a muted
    track, reads back exactly as written and changes nothing anyone can hear.

    With ``clear_first=False`` a repeated call layers points onto the ones
    already there, so a retry after an unclear result can leave a curve that
    matches neither attempt. Read it with read_automation before writing again.
    To explicitly clear an envelope without writing new points, use clear_automation.

    Playing the clip leaves the parameter at the value this curve last reached, and
    stopping does not restore it. Capture the statics you care about before the first
    playthrough: once a curve has run, nothing reports the value it covered.
ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
pointsYesThe breakpoints, as [[beat, value], ...] in clip-local beats where 0 is the clip start. Values are in the parameter own normalised units, the same ones set_parameter takes, so read min and max with ``describe`` rather than assuming 0..1.
verifyNoTrue samples the stored envelope back and compares it against the curve that was generated, at the cost of one extra read.
exponentNoHow hard the non-linear shapes bend. 1.0 is effectively linear and higher is steeper. Ignored by 'linear' and 'hold'.
parameterYesLOM path to the DeviceParameter the envelope belongs to, e.g. 'song.tracks[0].mixer_device.volume' for track volume or 'song.tracks[0].devices[1].parameters[3]' for a device knob.
resolutionNoStep in beats at which the curve is written out between breakpoints, so 0.0625 lays a point every sixteenth of a beat. Finer follows the shape more closely and writes more points; ignored for 'hold', which needs no intermediate points.
clear_firstNoTrue resets the parameter envelope before writing, so the result matches ``points`` exactly. False overlays new breakpoints onto earlier points and mixes the two.
interpolationNoShape between consecutive breakpoints. 'linear' ramps straight, 'hold' steps at each breakpoint and stays flat between them, and the other three bend the ramp using ``exponent``.linear

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses several non-obvious behaviors: verification reports the stored envelope rather than the requested one, clear_first=False layers points on repeated calls, a verified write does not guarantee audibility, and playing the clip permanently moves the parameter to the curve's last value without restoring it on stop. This is rich, honest behavioral context with no contradiction to 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?

The description is longer than average, but every section earns its place: the action is front-loaded, returns are separated, and the note block consolidates four distinct caveats that would otherwise be surprising. The structure is clean, though the length is substantial enough to prevent a perfect score.

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 the tool's high complexity—10 parameters, multiple interpolation modes, and significant side effects—the description is complete. It explains the return value shape, the Session-only targeting limitation, the audibility caveat, clear_first behavior, and the post-play state change, while the output schema handles detailed return structure.

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 schema already describes all 10 parameters at 100% coverage, so the baseline is 3. The description adds meaningful cross-parameter semantics by explaining how clear_first interacts with repeated calls and how the verify step affects the result, going slightly beyond the schema's individual parameter 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?

The description opens with a precise verb and resource: 'Write an automation envelope into a Session clip and verify the read-back.' This clearly distinguishes it from sibling tools like clear_automation, read_automation, and arrange, and explicitly states that Arrangement envelopes cannot be written directly here.

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?

The description gives concrete routing guidance: use arrange to move the clip to the timeline, use read_automation before retrying after an unclear result, and use clear_automation when no new points should be written. It also explains the Session-versus-Arrangement limitation, leaving no ambiguity about when this tool is appropriate.

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

write_clip_notesA
Destructive

Write MIDI notes into a Session clip.

Returns:
    Dictionary containing write confirmation, validation reports, and optional diff.

Note:
    Times are in beats and clip-local, so beat 0 is the clip's own start. ``replace``
    (the default) makes the clip match the list given; Live's own note writing appends,
    so without it a second write duplicates a melody (measured: 63 + 23 = 86 notes). Ask
    for ``append`` by name to layer onto an existing performance. An empty list with
    ``replace`` empties the clip but keeps its length, loop and envelopes; delete_clip
    takes all of them.

    A list straight from ``read_clip_notes`` can be written back: the keys in
    :data:`~live_maestro.music.notes.TOLERATED_NOTE_KEYS`, such as Live's ``note_id``,
    are dropped and reported as ``input_keys_ignored``, and every other unrecognised key
    is an error. ``pitch``, ``start_time`` and ``duration`` are never defaulted, so a
    list spelled with ``pos``/``dur`` is refused before anything is sent instead of
    becoming sixteenths stacked on beat 0.

    Times and durations do not come back bit-identical. They return with a deviation in
    both directions, about 4e-7 relative and reproducible to every digit across runs: a
    sent 0.29 reads back as 0.29000010406260407, a sent 0.18 as 0.17999994796869798 and
    a ``start_time`` of 2.29 as 2.290000104062604, while a duration of 0.5 comes back
    exactly. The cause is not established: it is neither a tick grid of 96, 192, 480
    or 960 per quarter, nor a single float32 conversion (float32 of 0.29 is
    0.28999999). At 124 BPM the error is around
    50 nanoseconds, so it matters only for comparison: never test a note time for
    equality. The diff run here uses a tolerance, which is why it reports ``0 changed``
    for values that differ in the seventh decimal.
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'replace' updates the clip content to match exactly this note list. 'append' adds to what is there, which layers new notes onto existing ones.replace
pathNoLOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.
slotNoClip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
notesYesThe notes to write into the clip. Each item declares its own fields, and the item schema carries their units.
trackNoSession track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none.
verifyNoTrue reads the notes back and reports the difference against what was asked for, at the cost of one extra read.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses the exact behavior of replace (makes clip match the list) and append (layers), the side effect of an empty list with replace (keeps length, loop, envelopes), and the precise floating-point deviation of times (e.g., 0.29 reads back as 0.29000010406260407). It also explains how unknown keys are handled. Annotations declare destructiveHint=true and readOnlyHint=false, and the description aligns with these, adding substantial behavioral detail 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?

The description is lengthy but every section earns its place: the opening sentence states purpose, return value is described, and the note sections cover time semantics, replace/append, input validation, and numerical deviation. The structure is clear and front-loaded with the core purpose. It could be slightly tightened, but the density of useful information justifies the length.

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 the tool's complexity (6 parameters including a nested notes array, an output schema, and subtle numerical behavior), the description is remarkably complete. It covers the local clip coordinate system, the append/replace semantics, the validation rules, and the exact precision caveats. An agent has everything needed to call this tool correctly without referencing external documentation.

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?

Although schema coverage is 100%, the description adds critical semantic detail: times are beat-based and clip-local, replace/append behavior, the handling of tolerated keys like note_id, that pitch/start_time/duration are never defaulted, and the validation consequence of using pos/dur. This goes far beyond the schema's per-parameter descriptions and materially affects how an agent should construct the notes array.

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 description opens with 'Write MIDI notes into a Session clip' – a specific verb, resource, and action. It clearly distinguishes from siblings like read_clip_notes (reading), delete_clip (removes clip entirely), and write_automation (writes automation, not notes). The purpose is unambiguous and immediately differentiates the tool.

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?

The description provides explicit guidance on when to use append vs replace, contrasts with delete_clip (empty list with replace keeps clip attributes, delete_clip removes everything), and notes that lists from read_clip_notes can be written back. It also warns that a list with pos/dur keys is refused. This gives clear context and alternatives, leaving nothing to inference.

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. 18 tool updates
    • Changedanalyze_audio3 fields changed
      • addedInput schema / properties / accumulate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "start",
        +        "read",
        +        "reset"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Accumulate band occupancy and levels over multiple analysis windows. 'start' begins periodic background sampling; 'read' returns the accumulated occupancy percentages and averaged levels across all sampled windows, together with the span they were taken over; 'reset' stops and clears accumulation. Occupancy is a share of time, so it is reported on 'read' alone: a single call measures one window and reports none.",
        +  "title": "Accumulate"
        +}
      • addedInput schema / properties / occupancy_threshold_db
        Added value: +{
        +  "default": 12,
        +  "description": "Threshold in dB relative to the loudest band in each analysis window. A band is counted as occupied if its level is within this threshold of the loudest band. It takes effect on accumulate='start' alone, because that is where the counting happens: an accumulate='read' reports the threshold its own accumulation was started with, and a single call counts no occupancy at all.",
        +  "title": "Occupancy Threshold Db",
        +  "type": "number"
        +}
      • changedInput schema / properties / reset / description
        Previous value: -"Restart the integrated loudness and loudness range before measuring, to integrate one section rather than everything since the audio engine started. The reply that performs the reset reports no integrated figure, because it had just begun."New value: +"Restart the integrated loudness and loudness range before measuring, to integrate one section rather than everything since the audio engine started. The reply that performs the reset reports no integrated figure, because it had just begun. It applies to a call with no 'accumulate' at all: an accumulation samples the device on its own schedule, and accumulate='read' reports the windows already counted rather than taking a fresh measurement, so a call that passes both performs no reset."
    • Changedarrange15 fields changed
      • addedInput schema / properties / at_beat / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / at_beat / default
        Added value: +null
      • changedInput schema / properties / at_beat / description
        Previous value: -"Where the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted."New value: +"Where the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted. Required if placements is omitted."
      • removedInput schema / properties / at_beat / type
        Removed value: -"number"
      • addedInput schema / properties / placements
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "One clip placement from a Session slot onto the Arrangement timeline.",
        +        "properties": {
        +          "at_beat": {
        +            "description": "Where the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted.",
        +            "title": "At Beat",
        +            "type": "number"
        +          },
        +          "slot": {
        +            "description": "Clip slot index in track.clip_slots, counted from 0.",
        +            "minimum": 0,
        +            "title": "Slot",
        +            "type": "integer"
        +          },
        +          "to_track": {
        +            "anyOf": [
        +              {
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "default": null,
        +            "description": "Destination track index. Omit to use the source track, which is the usual case.",
        +            "title": "To Track"
        +          },
        +          "track": {
        +            "description": "Source track index in song.tracks, counted from 0.",
        +            "minimum": 0,
        +            "title": "Track",
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "track",
        +          "slot",
        +          "at_beat"
        +        ],
        +        "title": "PlacementIn",
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "List of placements to duplicate onto the Arrangement timeline, each verified against the destination track it landed on: [{\"track\": 0, \"slot\": 1, \"at_beat\": 64.0, \"to_track\": null}, ...]. A long list is chunked across several round trips rather than refused. When provided, the single-placement parameters (track, slot, at_beat) must be omitted, including to_track, which each placement carries itself.",
        +  "title": "Placements"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down. Required if placements is omitted."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • changedInput schema / properties / to_track / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Track index in song.tracks, counted from 0. Required if placements is omitted."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "track",
        -  "slot",
        -  "at_beat"
        -]
    • Changedclear_automation10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "track",
        -  "slot"
        -]
    • Changeddelete_clip10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "track",
        -  "slot"
        -]
    • Addedfind_sound
    • Addedfire_scene
    • Changedget_clip10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "track",
        -  "slot"
        -]
    • Changedload_device3 fields changed
      • changedInput schema / properties / root / description
        Previous value: -"Browser category to search inside. Empty searches every category, which is slower and returns more near misses."New value: +"Browser category to search inside. Empty searches every category, which is slower and returns more near misses. These are the roots the Remote Script walks; there is no user_folders or legacy_libraries here, although the catalog carries rows for both."
      • changedInput schema / properties / root / enum
        Previous value: -[
        -  "",
        -  "audio_effects",
        -  "clips",
        -  "current_project",
        -  "drums",
        -  "instruments",
        -  "legacy_libraries",
        -  "max_for_live",
        -  "midi_effects",
        -  "packs",
        -  "plugins",
        -  "samples",
        -  "sounds",
        -  "user_folders",
        -  "user_library"
        -]New value: +[
        +  "",
        +  "audio_effects",
        +  "clips",
        +  "current_project",
        +  "drums",
        +  "instruments",
        +  "max_for_live",
        +  "midi_effects",
        +  "packs",
        +  "plugins",
        +  "samples",
        +  "sounds",
        +  "user_library"
        +]
      • addedInput schema / properties / track
        Added value: +{
        +  "default": -1,
        +  "description": "Track to load onto, counted from 0. -1 uses whatever is selected, which is what this did before the argument existed. Naming a track points the selection at it first, so a caller does not have to express the load as two steps and cannot load onto a track that happened to be selected. The selection stays there afterwards and is not put back: the LOM offers nothing to restore it to. 'aimed' reports where it went.",
        +  "minimum": -1,
        +  "title": "Track",
        +  "type": "integer"
        +}
    • Changedlom_batch1 field changed
      • changedInput schema / properties / ops / description
        Previous value: -"The operations to run, in order. Each one declares its own op, path and payload; the item schema carries the field meanings."New value: +"The operations to run, in order (at most 1000 operations). Each one declares its own op, path and payload; the item schema carries the field meanings."
    • Addedmatch_sound
    • Changedquantize_clip10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "track",
        -  "slot"
        -]
    • Changedread_automation10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • changedInput schema / required
        Previous value: -[
        -  "track",
        -  "slot",
        -  "parameter"
        -]New value: +[
        +  "parameter"
        +]
    • Changedread_clip_notes13 fields changed
      • changedInput schema / properties / count_only / description
        Previous value: -"True counts the notes inside Live and returns the number without transferring them, which is the way to ask about a large clip."New value: +"True counts the notes and returns the number without carrying them back, which is the way to ask about a large clip."
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / pitch_max
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maximum": 127,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Highest MIDI pitch to return, inclusive. Omit for no upper bound.",
        +  "title": "Pitch Max"
        +}
      • addedInput schema / properties / pitch_min
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maximum": 127,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Lowest MIDI pitch to return, inclusive. Omit for no lower bound. Use it to ask about part of a clip too large to read whole, such as what sits below an instrument's real range.",
        +  "title": "Pitch Min"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "track",
        -  "slot"
        -]
    • Addedsound_index_status
    • Addedtranscribe_stem
    • Changedtranspose_clip10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • changedInput schema / required
        Previous value: -[
        -  "track",
        -  "slot",
        -  "semitones"
        -]New value: +[
        +  "semitones"
        +]
    • Changedwrite_automation10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • changedInput schema / required
        Previous value: -[
        -  "track",
        -  "slot",
        -  "parameter",
        -  "points"
        -]New value: +[
        +  "parameter",
        +  "points"
        +]
    • Changedwrite_clip_notes10 fields changed
      • addedInput schema / properties / path
        Added value: +{
        +  "default": "",
        +  "description": "LOM path to a Session clip, song.tracks[N].clip_slots[M] with or without a trailing .clip, as an alternative to track and slot. A song.tracks[N].arrangement_clips[i] path is refused with code region_not_addressable.",
        +  "title": "Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / slot / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / slot / default
        Added value: +null
      • changedInput schema / properties / slot / description
        Previous value: -"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."New value: +"Clip slot index in track.clip_slots, counted from 0, which is the scene the clip sits in. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / slot / type
        Removed value: -"integer"
      • addedInput schema / properties / track / anyOf
        Added value: +[
        +  {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / track / default
        Added value: +null
      • changedInput schema / properties / track / description
        Previous value: -"Track index in song.tracks, counted from 0."New value: +"Session track index in song.tracks, counted from 0. Give track and slot, or give path instead. These are Session coordinates; an Arrangement clip has none."
      • removedInput schema / properties / track / type
        Removed value: -"integer"
      • changedInput schema / required
        Previous value: -[
        -  "track",
        -  "slot",
        -  "notes"
        -]New value: +[
        +  "notes"
        +]
  2. 7 tool updatesv0.1.4
    • Changeddelete_device1 field changed
      • addedInput schema / properties / kind
        Added value: +{
        +  "default": "track",
        +  "description": "Which collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored.",
        +  "enum": [
        +    "track",
        +    "return",
        +    "master"
        +  ],
        +  "title": "Kind",
        +  "type": "string"
        +}
    • Changeddescribe1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"LOM path to the object to inspect, e.g. 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'. Path shapes are listed in the ableton://catalog resource."New value: +"LOM path to the object to inspect, e.g. 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'. Path shapes are listed in the live://catalog resource."
    • Changedfind_path1 field changed
      • changedInput schema / properties / area / description
        Previous value: -"Restrict to one catalog area, e.g. 'clip' or 'track'. The areas are listed in the ableton://catalog resource. Empty searches all of them."New value: +"Restrict to one catalog area, e.g. 'clip' or 'track'. The areas are listed in the live://catalog resource. Empty searches all of them."
    • Changedload_device2 fields changed
      • changedInput schema / properties / item_path / description
        Previous value: -"The browser item as a LOM path rooted at app, e.g. 'app.browser.instruments.children[3]'. Use this instead of uri when the search could not reach the item within its walk budget."New value: +"The browser item as a LOM path rooted at app, e.g. 'app.browser.instruments.children[3]'. The reliable handle, and the one to prefer: unlike a uri it is not walked for again, so it cannot fail on the walk budget. Every search candidate carries one."
      • changedInput schema / properties / uri / description
        Previous value: -"The uri of one candidate from a previous search step, copied back verbatim to say which item to load."New value: +"The uri of one candidate from a previous search step, copied back verbatim to say which item to load. Resolving it walks the browser a second time, so pass root as well when the item sits deep; item_path avoids the walk altogether and is preferred."
    • Addedset_parameter_display
    • Changedwrite_automation1 field changed
      • changedInput schema / properties / clear_first / description
        Previous value: -"True removes the existing envelope for that parameter before writing, which is what makes the result match ``points`` exactly. False leaves earlier points in place and mixes the two."New value: +"True resets the parameter envelope before writing, so the result matches ``points`` exactly. False overlays new breakpoints onto earlier points and mixes the two."
    • Changedwrite_clip_notes2 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"'replace' removes the notes already in the clip and writes these instead, so the clip ends up holding exactly this list. 'append' adds to what is there, which doubles a note when the same list is sent twice."New value: +"'replace' updates the clip content to match exactly this note list. 'append' adds to what is there, which layers new notes onto existing ones."
      • changedInput schema / properties / notes / description
        Previous value: -"The notes to write. An empty list with mode='replace' clears the clip. Each item declares its own fields; the item schema carries their units."New value: +"The notes to write into the clip. Each item declares its own fields, and the item schema carries their units."
  3. 37 tool updatesv0.1.1
    • Changedals_read5 fields changed
      • addedInput schema / properties / locate
        Added value: +{
        +  "default": "",
        +  "description": "Answer with the arguments als_write needs to edit a field, instead of the project survey: the ElementTree expression, the attribute, the index that picks the right match, and the value currently there. 'tempo' for the project tempo, 'track_names' for every track's name. These are the fields usually edited on a file. Anything else needs an expression built by hand, which als_write's own confirm=False resolves against the file and reports on before it writes.",
        +  "enum": [
        +    "",
        +    "tempo",
        +    "track_names"
        +  ],
        +  "title": "Locate",
        +  "type": "string"
        +}
      • addedInput schema / properties / path / description
        Added value: +"Filesystem path to a saved .als project or .adg rack. The file is read from disk and is not opened in Live, so it does not have to be the set currently on screen."
      • addedInput schema / properties / report / description
        Added value: +"True adds a formatted summary written for a person to read, alongside the structured answer rather than instead of it."
      • addedInput schema / properties / track / description
        Added value: +"Narrow the read to one track, given either as its name or as its index in a string. Empty reads the whole project."
      • addedInput schema / properties / with_notes / description
        Added value: +"True parses the clip notes and reports note metrics, which is the expensive part of the read on a large project."
    • Changedals_write16 fields changed
      • addedInput schema / properties / allow_live_running / description
        Added value: +"True permits the edit while Live is running at all. The check behind it looks for a running Live process and cannot tell which set that process holds, so it is not a guard against editing the open one: only you know that. What matters is the file, not the process. Live open on a different set is harmless. Live holding this file overwrites the edit from memory when it next saves."
      • addedInput schema / properties / attribute / description
        Added value: +"Which attribute of the selected element to set. Live stores most numbers under 'Value'. Used by 'attribute' only."
      • addedInput schema / properties / backup / description
        Added value: +"Path to the backup file to put back. Required by the 'restore' operation and read by no other."
      • addedInput schema / properties / confirm / description
        Added value: +"True carries the edit out. False changes nothing and reports what the call requires, which is how to check the arguments first."
      • addedInput schema / properties / create / description
        Added value: +"True adds the attribute when the element does not already carry it. False refuses, which catches a misspelled attribute name instead of inventing a field Live will ignore."
      • addedInput schema / properties / device / description
        Added value: +"Device index within the target track chain, counted from 0. Used by 'sidechain' and 'configure'."
      • addedInput schema / properties / expression / description
        Added value: +"ElementTree path selecting the element to edit, e.g. './/MasterTrack/DeviceChain/Mixer/Tempo/Manual'. Used by 'attribute' only. Read the tree with als_read first."
      • addedInput schema / properties / index / description
        Added value: +"Which match to edit when the expression selects more than one element, counted from 0. An ambiguous expression is refused rather than resolved to the first match, so this is how to disambiguate."
      • addedInput schema / properties / operation / description
        Added value: +"What to do. 'sidechain' wires a compressor to a trigger track, 'configure' fills a plug-in parameter strip, 'attribute' sets one XML attribute anywhere in the file, 'restore' puts a backup back. Each one reads a different subset of the arguments below."
      • addedInput schema / properties / operation / enum
        Added value: +[
        +  "sidechain",
        +  "configure",
        +  "attribute",
        +  "restore"
        +]
      • addedInput schema / properties / path / description
        Added value: +"Filesystem path to the .als project to edit. A backup is written first and can be put back with the restore operation."
      • addedInput schema / properties / source_track / description
        Added value: +"Name of the track the compressor should listen to, which is usually the kick. Used by 'sidechain' only."
      • addedInput schema / properties / tap / description
        Added value: +"Where the sidechain listens on the source track: 'pre' before that track's own effects and fader, 'post' after them. Used by 'sidechain' only."
      • addedInput schema / properties / tap / enum
        Added value: +[
        +  "pre",
        +  "post"
        +]
      • addedInput schema / properties / target_track / description
        Added value: +"Name of the track carrying the device to edit, as it appears in Live. Used by 'sidechain' and 'configure'."
      • addedInput schema / properties / value / description
        Added value: +"For 'attribute', the new attribute value. For 'configure', the parameter strip assignment as '<index>=<name>; ...'."
    • Addedanalyze_audio
    • Changedarrange4 fields changed
      • addedInput schema / properties / at_beat / description
        Added value: +"Where the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / to_track / description
        Added value: +"Track index to place the copy on. Omit to use the source track, which is the usual case. A MIDI clip needs a MIDI destination."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedclear_automation5 fields changed
      • addedInput schema / properties / all_envelopes / description
        Added value: +"True clears every envelope on the clip, ignoring ``parameter``. One of this or ``parameter`` has to be given; neither is refused rather than treated as clear everything."
      • addedInput schema / properties / confirm / description
        Added value: +"True carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it."
      • addedInput schema / properties / parameter / description
        Added value: +"LOM path to the one DeviceParameter whose envelope should go, e.g. 'song.tracks[0].mixer_device.volume'. Leave empty only when all_envelopes is true."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedcreate_clip4 fields changed
      • addedInput schema / properties / length_beats / description
        Added value: +"Loop length of the new clip in beats, so 4.0 is one bar in 4/4 and 16.0 is four. Must be greater than 0."
      • addedInput schema / properties / name / description
        Added value: +"Name for the new clip. Empty leaves it unnamed."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedcreate_track4 fields changed
      • addedInput schema / properties / index / description
        Added value: +"Where to insert it in song.tracks. -1 appends at the end, which is the only value that leaves existing track indices alone. Ignored for a return track."
      • addedInput schema / properties / kind / description
        Added value: +"What to create: 'midi' for a MIDI track, 'audio' for an audio track, 'return' for a send return. A return track is appended to song.return_tracks and cannot be named or positioned here."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "midi",
        +  "audio",
        +  "return"
        +]
      • addedInput schema / properties / name / description
        Added value: +"Name for the new MIDI or audio track. Empty leaves Live to name it, which produces a default like '3-MIDI'."
    • Changeddelete_clip3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"True carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changeddelete_device3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"True carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it."
      • addedInput schema / properties / device / description
        Added value: +"Device index in that track chain, counted from 0 left to right as Live draws it. get_devices lists the chain with its indices."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changeddelete_track2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"True carries the removal out. False changes nothing and returns a report of what the call would remove, which is how to look before committing to it."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changeddescribe3 fields changed
      • addedInput schema / properties / depth / description
        Added value: +"How far to descend into child collections. Deep descents over a whole set can be slow and the cost is unmeasured, so raise this deliberately rather than by default."
      • addedInput schema / properties / path / description
        Added value: +"LOM path to the object to inspect, e.g. 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'. Path shapes are listed in the ableton://catalog resource."
      • addedInput schema / properties / with_parameters / description
        Added value: +"For a device path, survey every parameter with its name, value, min, max, quantized steps and display unit, instead of reporting the parameters child as a bare count. This is also what diagnoses an unconfigured third-party plug-in."
    • Addedfind_path
    • Changedget_clip2 fields changed
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedget_devices3 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"Which collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "track",
        +  "return",
        +  "master"
        +]
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedget_session3 fields changed
      • addedInput schema / properties / clips / description
        Added value: +"Sweep the Session grid for slots that hold a clip. Off, the answer covers tracks and devices but says nothing about clips, and comes back faster because no slots are probed."
      • addedInput schema / properties / devices / description
        Added value: +"Include each track device chain in the answer."
      • addedInput schema / properties / max_scenes / description
        Added value: +"How many scenes deep to probe for Session clips. A cap rather than a count: Live collections report no length, so the sweep stops here instead of at the last scene. Ignored when clips is false."
    • Changedget_track3 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"Which collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "track",
        +  "return",
        +  "master"
        +]
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedload_device7 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"False searches and loads nothing, reporting the candidates and which track is selected. True loads the item named by uri or item_path."
      • addedInput schema / properties / item_path / description
        Added value: +"The browser item as a LOM path rooted at app, e.g. 'app.browser.instruments.children[3]'. Use this instead of uri when the search could not reach the item within its walk budget."
      • addedInput schema / properties / limit / description
        Added value: +"How many search candidates to return."
      • addedInput schema / properties / query / description
        Added value: +"What to look for in the browser, matched against item names, e.g. 'Operator' or 'reverb'. Required for the search step; on the load step it can be dropped once uri or item_path is known."
      • addedInput schema / properties / root / description
        Added value: +"Browser category to search inside. Empty searches every category, which is slower and returns more near misses."
      • addedInput schema / properties / root / enum
        Added value: +[
        +  "",
        +  "audio_effects",
        +  "clips",
        +  "current_project",
        +  "drums",
        +  "instruments",
        +  "legacy_libraries",
        +  "max_for_live",
        +  "midi_effects",
        +  "packs",
        +  "plugins",
        +  "samples",
        +  "sounds",
        +  "user_folders",
        +  "user_library"
        +]
      • addedInput schema / properties / uri / description
        Added value: +"The uri of one candidate from a previous search step, copied back verbatim to say which item to load."
    • Changedlom_batch2 fields changed
      • addedInput schema / properties / atomic / description
        Added value: +"True stops at the first error, leaving the operations before it applied and the ones after it untried. False runs every operation and reports each result. Neither rolls anything back."
      • addedInput schema / properties / ops / description
        Added value: +"The operations to run, in order. Each one declares its own op, path and payload; the item schema carries the field meanings."
    • Changedlom_call3 fields changed
      • addedInput schema / properties / args / description
        Added value: +"Positional arguments, in order. Keyword arguments are not supported. A Live object is passed as a reference dict, {'__path__': 'song.tracks[2]'}, rather than as a name or an index."
      • addedInput schema / properties / method / description
        Added value: +"Method name to invoke, e.g. 'move_device'. Only names on the Remote Script's allowlist are accepted; lom_describe lists the ones permitted on a given object."
      • addedInput schema / properties / path / description
        Added value: +"Dotted LOM path to the object the method sits on, e.g. 'song' for song.move_device or 'song.tracks[0]' for a track method. The object that owns the method, not the object being acted on."
    • Changedlom_describe2 fields changed
      • addedInput schema / properties / depth / description
        Added value: +"How many levels of child collection to walk. 1 reports the children of the addressed object only. Raising it multiplies the work and the cost is unmeasured."
      • addedInput schema / properties / path / description
        Added value: +"Dotted LOM path to the object to reflect on: 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'."
    • Changedlom_enums1 field changed
      • addedInput schema / properties / type_name / description
        Added value: +"Dotted Live enum name, e.g. 'Song.Quantization'. Leave empty to list the enum type names instead of the members of one."
    • Changedlom_get1 field changed
      • addedInput schema / properties / path / description
        Added value: +"Dotted LOM path rooted at song, app or song.view, with integer subscripts for collections: 'song.tempo', 'song.tracks[0].name', 'song.tracks[0].devices[1].parameters[3].value'. Any other root is refused before Live is contacted."
    • Changedlom_set2 fields changed
      • addedInput schema / properties / path / description
        Added value: +"Settable dotted LOM path, e.g. 'song.tempo' or 'song.tracks[0].mixer_device.volume.value'. Note the trailing ``.value``: a mixer control is a DeviceParameter object and the number lives one level inside it."
      • addedInput schema / properties / value / description
        Added value: +"The value to store. A number, string or boolean for a scalar property; a reference dict {'__path__': 'song.tracks[2]'} for a property whose value is itself a Live object."
    • Changedplay2 fields changed
      • addedInput schema / properties / continue_playing / description
        Added value: +"True resumes from the current position instead of restarting. Ignored when from_beat is given, since that sets the position."
      • addedInput schema / properties / from_beat / description
        Added value: +"Cue the playhead to this beat before starting, in beats from the start of the Arrangement. Omit to start from wherever the playhead already sits."
    • Changedquantize_clip5 fields changed
      • addedInput schema / properties / grid / description
        Added value: +"Grid to snap to, in beats: 1.0 is a quarter note, 0.5 an eighth, 0.25 a sixteenth, and 0.3333 a triplet eighth. Must be positive."
      • addedInput schema / properties / quantize_ends / description
        Added value: +"True snaps note ends to the grid too, which changes durations. False moves onsets and leaves every duration as it was."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / strength / description
        Added value: +"How far to move each note towards the grid, 0.0 for not at all and 1.0 for all the way. 0.5 halves the distance and keeps some of the original feel."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedread_automation6 fields changed
      • addedInput schema / properties / end / description
        Added value: +"Last beat to sample, clip-local. Omit to sample to the end of the clip."
      • addedInput schema / properties / parameter / description
        Added value: +"LOM path to the DeviceParameter the envelope belongs to, e.g. 'song.tracks[0].mixer_device.volume' for track volume or 'song.tracks[0].devices[1].parameters[3]' for a device knob."
      • addedInput schema / properties / points / description
        Added value: +"How many evenly spaced samples to take across the range. Clamped to 2..512. This is the resolution of the answer, not of the stored envelope, which keeps whatever breakpoints it was written with."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / start / description
        Added value: +"First beat to sample, clip-local, where 0 is the clip start. Omit to start just past beat 0, which steps over the guard that keeps a sample off the envelope edge."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedread_clip_notes6 fields changed
      • addedInput schema / properties / check / description
        Added value: +"True runs validation over the notes that came back and reports what it found. Ignored when count_only is true, since there are no notes to check."
      • addedInput schema / properties / count_only / description
        Added value: +"True counts the notes inside Live and returns the number without transferring them, which is the way to ask about a large clip."
      • addedInput schema / properties / from_time / description
        Added value: +"First beat of the window to read, clip-local, where 0 is the clip start. Omit to read from the beginning."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / time_span / description
        Added value: +"Length of the window in beats, not the beat it ends on: beats 24 to 32 is from_time=24, time_span=8. Omit to read to the end."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedset_arrangement_time1 field changed
      • addedInput schema / properties / at_beat / description
        Added value: +"Position on the Arrangement timeline in beats from the start, where beat 0 is the beginning of the song. Fractional beats are accepted, so 33.5 is the second half of bar 9 in 4/4."
    • Changedset_locator3 fields changed
      • addedInput schema / properties / at_beat / description
        Added value: +"Position on the Arrangement timeline in beats from the start, where beat 0 is the beginning of the song. Fractional beats are accepted, so 33.5 is the second half of bar 9 in 4/4."
      • addedInput schema / properties / confirm / description
        Added value: +"True carries the toggle out. False changes nothing and reports the locators that already exist, which is how to tell in advance whether this call would add one or delete one."
      • addedInput schema / properties / name / description
        Added value: +"Name for a locator this call creates. Ignored when the call deletes one, because there is nothing left to name."
    • Changedset_loop3 fields changed
      • addedInput schema / properties / enabled / description
        Added value: +"Turn the Arrangement loop on or off. Omit to leave the switch as it is and move the brace only."
      • addedInput schema / properties / length / description
        Added value: +"How long the brace is, in beats, not the beat it ends on: a loop over bars 5 to 9 in 4/4 is start=16, length=16. Omit to leave it."
      • addedInput schema / properties / start / description
        Added value: +"Where the loop brace begins, in beats from the start of the Arrangement. Omit to leave it where it is."
    • Changedset_mix8 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"Which collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "track",
        +  "return",
        +  "master"
        +]
      • addedInput schema / properties / mute / description
        Added value: +"True mutes the track, False unmutes it. Not supported on the master track. Omit to leave it alone."
      • addedInput schema / properties / pan / description
        Added value: +"Pan position from -1.0 hard left through 0.0 centre to 1.0 hard right. Omit to leave it alone."
      • addedInput schema / properties / sends / description
        Added value: +"Send levels to write, keyed by send letter as Live labels it ('A', 'B') or by index as a string ('0', '1'), with normalised values 0.0 to 1.0. Only the sends named are written. Omit to leave every send alone."
      • addedInput schema / properties / solo / description
        Added value: +"True solos the track, which silences the others rather than changing anything on this one. Not supported on the master track. Omit to leave it alone."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
      • addedInput schema / properties / volume / description
        Added value: +"Fader position, normalised 0.0 to 1.0, not decibels. 0.85 is 0 dB (measured) and the scale between is not linear, so 0.425 is not half the level. Omit to leave the fader alone."
    • Changedset_parameter6 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Device index in that track chain, counted from 0. get_devices lists the chain with its indices."
      • addedInput schema / properties / kind / description
        Added value: +"Which collection the track index counts in: 'track' for song.tracks, 'return' for song.return_tracks, 'master' for the master track, where the track index is ignored."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "track",
        +  "return",
        +  "master"
        +]
      • addedInput schema / properties / parameter / description
        Added value: +"Which parameter, either its index as a string ('1') or its name, which may be a glob ('Attack*'). A name that matches more than one parameter is refused rather than guessed at. ``describe`` with with_parameters=True lists the names."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
      • addedInput schema / properties / value / description
        Added value: +"Target value in the parameter own units, which are normalised and device-specific rather than the unit the device displays. Read ``min`` and ``max`` with ``describe`` first: the range is whatever the device declares and is often not 0..1."
    • Changedset_tempo1 field changed
      • addedInput schema / properties / bpm / description
        Added value: +"Tempo in beats per minute. The catalog validates 20.0 to 999.0."
    • Changedstop2 fields changed
      • addedInput schema / properties / clips / description
        Added value: +"True also stops every playing Session clip through song.stop_all_clips. False stops the transport only: the flag exists because that alone does not stop the Session clips."
      • addedInput schema / properties / quantized / description
        Added value: +"True lets the clip stop fall on the global launch quantisation grid, so it can lag the call by up to a bar. False stops the clips immediately. Only read when clips is true."
    • Changedtranspose_clip5 fields changed
      • addedInput schema / properties / out_of_range / description
        Added value: +"What to do with a MIDI note pushed outside 0..127: 'error' refuses the whole call and changes nothing, 'clamp' pins the note to 0 or 127 and keeps it, 'drop' discards it. Only 'error' leaves the clip recoverable by transposing back."
      • addedInput schema / properties / out_of_range / enum
        Added value: +[
        +  "error",
        +  "clamp",
        +  "drop"
        +]
      • addedInput schema / properties / semitones / description
        Added value: +"How far to move the pitch, in semitones. 12 is an octave up, -12 an octave down. Relative to where the clip is now, not absolute."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
    • Changedwrite_automation10 fields changed
      • addedInput schema / properties / clear_first / description
        Added value: +"True removes the existing envelope for that parameter before writing, which is what makes the result match ``points`` exactly. False leaves earlier points in place and mixes the two."
      • addedInput schema / properties / exponent / description
        Added value: +"How hard the non-linear shapes bend. 1.0 is effectively linear and higher is steeper. Ignored by 'linear' and 'hold'."
      • addedInput schema / properties / interpolation / description
        Added value: +"Shape between consecutive breakpoints. 'linear' ramps straight, 'hold' steps at each breakpoint and stays flat between them, and the other three bend the ramp using ``exponent``."
      • addedInput schema / properties / interpolation / enum
        Added value: +[
        +  "linear",
        +  "hold",
        +  "exponential",
        +  "ease_in",
        +  "ease_out"
        +]
      • addedInput schema / properties / parameter / description
        Added value: +"LOM path to the DeviceParameter the envelope belongs to, e.g. 'song.tracks[0].mixer_device.volume' for track volume or 'song.tracks[0].devices[1].parameters[3]' for a device knob."
      • addedInput schema / properties / points / description
        Added value: +"The breakpoints, as [[beat, value], ...] in clip-local beats where 0 is the clip start. Values are in the parameter own normalised units, the same ones set_parameter takes, so read min and max with ``describe`` rather than assuming 0..1."
      • addedInput schema / properties / resolution / description
        Added value: +"Step in beats at which the curve is written out between breakpoints, so 0.0625 lays a point every sixteenth of a beat. Finer follows the shape more closely and writes more points; ignored for 'hold', which needs no intermediate points."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
      • addedInput schema / properties / verify / description
        Added value: +"True samples the stored envelope back and compares it against the curve that was generated, at the cost of one extra read."
    • Changedwrite_clip_notes7 fields changed
      • addedInput schema / properties / mode / description
        Added value: +"'replace' removes the notes already in the clip and writes these instead, so the clip ends up holding exactly this list. 'append' adds to what is there, which doubles a note when the same list is sent twice."
      • addedInput schema / properties / mode / enum
        Added value: +[
        +  "replace",
        +  "append"
        +]
      • addedInput schema / properties / notes / description
        Added value: +"The notes to write. An empty list with mode='replace' clears the clip. Each item declares its own fields; the item schema carries their units."
      • changedInput schema / properties / notes / items / properties / velocity / description
        Previous value: -"1..127. Omitted or null both mean unspecified; Live default is 100."New value: +"1..127. Omitted or null both mean unspecified. Live default is 100."
      • addedInput schema / properties / slot / description
        Added value: +"Clip slot index in track.clip_slots, counted from 0. A slot index is the scene the clip sits in, so slot 2 is the third scene down."
      • addedInput schema / properties / track / description
        Added value: +"Track index in song.tracks, counted from 0."
      • addedInput schema / properties / verify / description
        Added value: +"True reads the notes back and reports the difference against what was asked for, at the cost of one extra read."
  4. 35 tool updatesv0.1.0
    • First observedals_read
    • First observedals_write
    • First observedarrange
    • First observedclear_automation
    • First observedcreate_clip
    • First observedcreate_track
    • First observeddelete_clip
    • First observeddelete_device
    • First observeddelete_track
    • First observeddescribe
    • First observedget_clip
    • First observedget_devices
    • First observedget_session
    • First observedget_track
    • First observedload_device
    • First observedlom_batch
    • First observedlom_call
    • First observedlom_describe
    • First observedlom_enums
    • First observedlom_get
    • First observedlom_set
    • First observedplay
    • First observedquantize_clip
    • First observedread_automation
    • First observedread_clip_notes
    • First observedset_arrangement_time
    • First observedset_locator
    • First observedset_loop
    • First observedset_mix
    • First observedset_parameter
    • First observedset_tempo
    • First observedstop
    • First observedtranspose_clip
    • First observedwrite_automation
    • First observedwrite_clip_notes

TDQS

A4.2/5.0

Scored across 43 tools

Disambiguation4/5

The tool set is largely distinct, with a clear layered hierarchy: get_session/get_track/get_clip/get_devices nest cleanly, and read/write pairs (notes, automation) are unambiguous. Two pairs could confuse an agent — describe vs lom_describe and set_parameter vs set_parameter_display — but the descriptions disambiguate them explicitly with cross-references, so the boundary is documented rather than left to inference.

Naming Consistency4/5

The vast majority follow a consistent verb_noun snake_case pattern (get_clip, set_tempo, create_track, delete_device, write_automation), with coherent families: set_*, get_*, read_*/write_*, create_*/delete_*, and a clearly prefixed lom_* raw layer. Minor deviations are the bare verbs arrange, play, stop, and describe without the lom_ prefix, though these read as intentional and do not break the overall pattern.

Tool Count4/5

43 tools is well above the typical 3-15 range and would normally signal bloat, but the domain — full control of a DAW — is genuinely broad, spanning session, tracks, clips, notes, automation, devices, mixer, transport, arrangement, library search, audio analysis, and file formats. Each tool has a distinct job and the 7-tool lom_* raw layer earns its place as an escape hatch that keeps the documented surface finite, so the count is high but reasonable.

Completeness4/5

The surface provides full lifecycle coverage for tracks, clips, devices, notes, automation, and transport, with workflow chains explicitly documented (create_track → load_device → create_clip → write_clip_notes → arrange → play). Minor gaps exist — no dedicated save, undo, or live-record tools — but these are reachable one hop away through the documented lom_call/lom_set layer, making them workarounds rather than dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language control over Ableton Live for generating musical patterns, melodies, and full song arrangements. It also provides tools for sample searching and mixing assistance through an OSC-based connection with Claude Desktop.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    AI copilot for Ableton Live 12 — 104 MCP tools for music production, sound design, and mixing. Talk to your DAW. Create tracks, program MIDI, load instruments, tweak parameters, arrange songs, and mix — all through natural language. LivePilot connects any MCP-compatible AI client (Claude, Cursor, VS Code Copilot) to Ableton Live and gives it full control over your session.
    202 npm
    69
    Business Source 1.1