Live Maestro
Ableton Maestro is an MCP server that acts as an AI copilot for Ableton Live, letting you control and edit live sets through natural language or direct tool calls.
Session inspection: survey tracks, clips, devices, mixer state, and the Live object model
Track and device management: create/delete tracks, load/delete devices, adjust device parameters
Clip and MIDI editing: create/delete clips, write/read MIDI notes, quantize and transpose clips
Sound design and automation: set mixer levels/pan/sends/mute/solo, write/read/clear automation envelopes
Arrangement and transport: arrange clips into the timeline, set locators, move playhead, play/stop, set tempo and loop
Audio analysis: measure loudness, true peak, stereo correlation, and frequency-band energy via an optional Max for Live device
Offline project editing: read and safely modify .als project files on disk, including sidechain routing, plugin configuration, and XML attributes
Low-level LOM access: get/set/call/batch/describe Live Object Model paths, plus enum inspection
Smart path discovery: find_path maps natural-language producer terms to Live catalog paths efficiently
Safety and verification: dry-run confirms, read-back verification, clamped/async detection, and change-baseline checks
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.
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.alsproject 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 reportsdevice_not_foundwith the steps to load it.
MCP Tools & Resources
Maestro exposes 38 tools and 4 resources over the Model Context Protocol (MCP):
Intent Tools (Production Workflows)
Session & Inspection:
get_session,get_track,get_clip,get_devices,describeTracks & Devices:
create_track,delete_track,load_device,delete_device,set_parameter,set_parameter_displayClips & MIDI Notes:
create_clip,delete_clip,write_clip_notes,read_clip_notes,quantize_clip,transpose_clipMixing & Automation:
set_mix,write_automation,read_automation,clear_automationAudio Measurement (Channel C):
analyze_audioArrangement & Transport:
arrange,set_locator,set_arrangement_time,play,stop,set_tempo,set_loopOffline Projects (Channel B):
als_read,als_write
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.
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,als_write) require explicitconfirm=True. Without confirmation, Maestro performs a safe dry run and reports exactly what would be removed or altered.Read-Back Verification: Parameter updates via
lom_setread the stored value back from Live and report the exact state:applied(exact match),clamped(quantized or bounded by Live), ornot_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.git2. Set up Live
live-maestro-installThis 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:
python -m live_maestro.client ping4. 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.
Three environment variables change where the server looks, and none of them is normally needed:
Variable | Default | What it changes |
|
| The TCP port the Remote Script listens on. Change it in the Remote Script too, or nothing answers. |
|
| 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. |
|
| The UDP port the analyzer device listens on. Change it in the device too. |
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 .venvActivate 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.pyThe [dev] extra adds pytest, ruff and pyright, and is only needed for the tests and the linter. 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:
docs/architecture.md: Internal architecture and Live Object Model integration
docs/protocol.md: Wire protocol and communication specification
docs/catalog.md: LOM catalog schema and verification rules
docs/limits.md: Technical constraints and API boundary measurements
docs/upgrading_live.md: Runbook for re-verifying the catalog against a new Live release
CONTRIBUTING.md: Contribution guidelines and developer setup
THIRD-PARTY.md: Third-party notices, dependencies, and trademark attributions
LICENSE: AGPL-3.0 License
Legal & Trademarks
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
38 toolsals_readARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 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. | |
| track | No | Narrow the read to one track, given either as its name or as its index in a string. Empty reads the whole project. | |
| locate | No | 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. | |
| report | No | True adds a formatted summary written for a person to read, alongside the structured answer rather than instead of it. | |
| with_notes | No | True parses the clip notes and reports note metrics, which is the expensive part of the read on a large project. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_writeADestructive
Edit a saved .als project file on disk. Requires confirm=True.
Supported operations: 'sidechain', 'configure', 'attribute', 'restore'.
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`` is here for the set Live is not holding, someone else's project
wired on disk. Measured across the 174-project corpus (docs/limits.md section 9):
74 of 82 in the house/trance BPM window use sidechain compression, median 6
wirings each. For
the set on screen use ``lom_set`` and keep the read-back.
``configure`` fills a plugin's parameter strip, which no LOM call can do 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.
Where the expression comes from: ``als_read`` with ``locate='tempo'`` or
``locate='track_names'`` answers with the expression, the attribute and the
index for those fields, which are the ones usually edited on a file. For
anything else the expression is built by hand, and ``confirm=False`` resolves
it against the file first and reports what it selects, so a wrong one is
caught before it writes rather than after.
Choosing between the four: ``sidechain`` and ``configure`` for the two things
the LOM cannot do at all, ``attribute`` for anything else in the file, and
``restore`` to undo any of them. For
the set open in Live, none of these: use lom_set, set_parameter or set_mix
and keep the read-back.
| Name | Required | Description | Default |
|---|---|---|---|
| tap | No | Where the sidechain listens on the source track: 'pre' before that track's own effects and fader, 'post' after them. Used by 'sidechain' only. | post |
| path | Yes | Filesystem path to the .als project to edit. A backup is written first and can be put back with the restore operation. | |
| index | No | 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. | |
| value | No | For 'attribute', the new attribute value. For 'configure', the parameter strip assignment as '<index>=<name>; ...'. | |
| backup | No | Path to the backup file to put back. Required by the 'restore' operation and read by no other. | |
| create | No | 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. | |
| device | No | Device index within the target track chain, counted from 0. Used by 'sidechain' and 'configure'. | |
| confirm | No | True carries the edit out. False changes nothing and reports what the call requires, which is how to check the arguments first. | |
| attribute | No | Which attribute of the selected element to set. Live stores most numbers under 'Value'. Used by 'attribute' only. | Value |
| operation | Yes | 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. | |
| expression | No | 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. | |
| source_track | No | Name of the track the compressor should listen to, which is usually the kick. Used by 'sidechain' only. | |
| target_track | No | Name of the track carrying the device to edit, as it appears in Live. Used by 'sidechain' and 'configure'. | |
| allow_live_running | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description warns that Live will overwrite edits from memory on next save, that confirm=False performs a dry run, that ambiguous expressions are refused, and that index counts expression matches rather than project tracks. It also discloses that a backup is written first. These are significant behavioral facts an agent needs before calling a file-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and confirm requirement, and the paragraphs are structured by operation. However, it is quite long and includes tangential material such as the 174-project corpus statistics and the sidechain wiring median, which do not help an agent invoke the tool correctly. The 'use lom_set for the open set' guidance is also repeated, adding redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 14 parameters, and destructive nature, the description is remarkably complete: it covers the return shape, operation-specific behavior, dry-run semantics, backup/restore flow, expression sourcing, Live-process caveats, and escape hatches to sibling tools. An agent has enough context to call this tool safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all 14 parameters with 100% coverage, so the baseline is 3. The description adds value beyond the schema by explaining which parameters each operation reads, clarifying that index counts match occurrences rather than tracks, and showing where expressions come from via als_read. This is useful semantic context, though some of it does overlap with the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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.' It then enumerates the four supported operations, making the tool's scope immediately clear. It also distinguishes itself from sibling tools by explicitly saying 'for the set open in Live, none of these: use lom_set, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit selection guidance: sidechain and configure for things LOM cannot do, attribute for anything else in the file, restore for undo, and als_read for generating expressions. It also clearly warns when not to use the tool: when Live holds the target file, use lom_set-family tools instead. This is model guidance for routing an agent to the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_audioARead-onlyIdempotent
Measure the audio itself: loudness, true peak, stereo phase and band balance.
Reads the LiveMaestro Analyzer Max for Live device over loopback OSC. This
is the only tool that needs that device. Without it every other tool works and
this one reports device_not_found with the steps to load it.
What comes back, and what each figure is:
- Loudness to EBU R128, from Max's loudness~: momentary (400 ms), short term
(3 s), gated integrated since the last reset, and loudness range.
- True peak, oversampled, so peaks between two samples count. Sample peak and
RMS beside it, and the crest factor between peak and RMS.
- Stereo correlation over the whole band and below 120 Hz, and whether the low
end survives being summed to mono.
- Energy in seven bands on the mono sum, plus their energy weighted centre.
That centre is a centre of mass over seven band levels, not an FFT centroid.
Where it measures matters. The device reads the signal at its own position in
the chain, so it belongs last on the track: an effect loaded after it is not
in what it reports. A master track's device chain sits before the master
fader, so a master reading matches the set's output only while that fader is
at 0.0 dB.
The two peak figures are maxima since the meter was last reset and only rise.
To measure a peak, call once with reset=true, let at least one pass of the
material through, then call again. The averaged figures need no reset.
A read-back proves the stored value and never audibility: this proves what the
signal measured as it passed the device, which is a different and stronger
claim than any parameter value, and still not a claim about the room.
| Name | Required | Description | Default |
|---|---|---|---|
| reset | No | 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. | |
| track | No | Which 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_ms | No | How 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses far more than the annotations already provide: device dependency and failure mode, measurement position in the chain, dependence on master fader, peak maxima that only rise, reset semantics, and the important caveat that this proves signal values but never audibility. There is no contradiction with the readOnly/idempotent hints, since reading the analyzer is non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but earns its length: dedicated sections for output meaning, measurement position, and reset behavior are front-loaded after a one-sentence purpose. The bulleted list and bold lead-ins make it scannable, and no sentence is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a measurement tool with three parameters and an output schema, the description covers everything necessary: required device, failure path, return-value semantics, placement caveats, reset workflow, and interpretation limits. The presence of the output schema means the 'what comes back' section is supplementary, not required, but it is still richly provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 context beyond the schema by explaining how peaks integrate since reset, why reset=true is needed for peak measurement, and how window_ms affects only averaged figures while loudness keeps its own EBU windows. This strengthens the agent's understanding of parameter behavior without merely repeating schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource: 'Measure the audio itself' and then enumerates the exact quantities measured (loudness, true peak, stereo phase, band balance). It also names the mechanism (LiveMaestro Analyzer over loopback OSC), which clearly separates it from siblings that read set state such as get_session or lom_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context: it is the only tool requiring the LiveMaestro device, reports device_not_found with loading steps when absent, and every other tool works without it. It also gives a precise procedure for measuring peaks: call with reset=true, let material pass, then call again. This is actionable guidance beyond generalities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arrangeA
Copy a Session clip onto the Arrangement timeline at a beat position.
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:
Dictionary with the placement status, the destination track, and the
Arrangement clip count before and after.
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.
Use create_clip and write_clip_notes to build the source clip, and
set_arrangement_time then play to hear where it landed.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| at_beat | Yes | Where the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted. | |
| to_track | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the copy-not-move semantics, that editing one clip leaves the other alone, that repeated calls add another copy rather than replacing the first, and that the response includes clip counts for verification. This complements the idempotentHint=false annotation with concrete behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation, then adds behavioral nuance, return-value context, and a practical note. Every sentence earns its place; there is no filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the rich input schema and the presence of an output schema, the description covers the operation, its non-idempotent behavior, prerequisites via create_clip and write_clip_notes, and a verification strategy using the returned clip count. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a clear description. The tool description reinforces at_beat and to_track indirectly but adds no new parameter-level 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise operation: 'Copy a Session clip onto the Arrangement timeline at a beat position.' It immediately clarifies this is a copy, not a move, and explains its role in turning Session ideas into arrangement material, distinguishing it from related clip tools like create_clip and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context: to bring a Session clip into the Arrangement timeline and to get write_automation output there. It also provides a workflow with create_clip, write_clip_notes, set_arrangement_time, and play. It does not explicitly name alternatives or when-not-to-use conditions, so it misses the top bar by a small margin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_automationADestructive
Delete automation envelopes on a Session clip. Requires confirm=True.
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 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.
This tool is for leaving the parameter unautomated.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| confirm | No | 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. | |
| parameter | No | 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. | |
| all_envelopes | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds substantial behavioral context: confirm=True is required for actual deletion, confirm=False is a dry run, a cleared envelope falls back to the outside-clip value rather than the first breakpoint, and the dry run's sampling can miss narrow features. This goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with Returns and Note sections, but it repeats 'Requires confirm=True' verbatim in consecutive paragraphs, which is avoidable waste. The remaining detail is dense but mostly necessary, so it is more verbose than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with 5 parameters, the description covers the action, prerequisites, dry-run semantics, return shape, irreversibility, sampling limitations, and alternatives. The presence of an output schema means the return value does not need further elaboration, so nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningful parameter behavior: it explains the interaction between parameter and all_envelopes, clarifies what the confirm flag does, and warns about the difference between one named parameter versus whole-clip has_envelopes reporting. This supplements the schema without repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Delete automation envelopes on a Session clip.' It clearly distinguishes this from sibling tools like write_automation and read_automation by framing the action as removal, not modification or inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing: 'To change a curve rather than remove it, write_automation with clear_first=True... This tool is for leaving the parameter unautomated.' It also advises sampling with read_automation before destructive clearing and using als_read for exact breakpoints, so the agent knows when to pick alternatives.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the new clip. Empty leaves it unnamed. | |
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| length_beats | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behaviors beyond the annotations: occupied slots are refused rather than overwritten, the clip arrives empty, and the return value includes creation status, clip path, and read-back length. This meaningfully informs an agent about side effects and failure mode, and it is consistent 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then organized into useful Returns and Note sections. It is somewhat detailed, but every paragraph adds value: type restriction, alternative call, return summary, occupied-slot behavior, and next-step workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, target type, alternative path, safety behavior, return shape, and follow-up workflow. Combined with a rich input schema and output schema, an agent has everything needed to decide when and how to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 important parameter context not in the schema: the track must be a MIDI track, and the slot on an audio track calls a different method. This goes beyond what the input schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create an empty MIDI clip of a given length in a Session slot.' It also distinguishes this from the audio-slot equivalent by explicitly naming lom_call with method='create_audio_clip', making the tool's scope and type constraint clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use this for MIDI tracks only, and use a different lom_call for audio slots. It also provides workflow direction ('Fill it with write_clip_notes... arrange'), and tells the agent to call delete_clip first when replacing a clip.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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. | midi |
| name | No | Name for the new MIDI or audio track. Empty leaves Live to name it, which produces a default like '3-MIDI'. | |
| index | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_clipADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| confirm | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description substantially expands on the destructiveHint annotation by explaining exactly what is removed, that confirm=True is required, that confirm=False changes nothing and returns a loss report, that slot indices do not shift, and that clips already arranged survive. These are meaningful behavioral disclosures beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise opening, a clear confirm/return section, and a note section for important caveats. Every sentence earns its place; the text is thorough without being bloated, and the most important behavioral facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool, the description covers the key operational questions: what gets deleted, what must be passed to actually delete, what happens without confirmation, whether indices shift, how it differs from the main alternative, and how it interacts with arrangement copies. Given the annotations and output schema already exist, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for all three parameters, including the confirm parameter's true/false behavior. The description restates the confirm requirement but adds no new parameter-level meaning beyond the schema. This matches the baseline expected when schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Delete the clip in a Session slot, its notes and envelopes with it.' It clearly distinguishes this from related operations by explaining that emptying a clip is not the same as deleting it, and by contrasting with write_clip_notes. This leaves no ambiguity about what the tool does or how it differs from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to prefer an alternative: 'Prefer write_clip_notes with an empty list and mode="replace" where the slot should stay filled.' It also clarifies the confirm=False flow as a dry-run/look-before-committing option. This is concrete, actionable routing guidance rather than vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_deviceADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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. | track |
| track | Yes | Track index in song.tracks, counted from 0. | |
| device | Yes | Device index in that track chain, counted from 0 left to right as Live draws it. get_devices lists the chain with its indices. | |
| confirm | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_trackADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track index in song.tracks, counted from 0. | |
| confirm | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
describeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 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. | |
| depth | No | 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. | |
| with_parameters | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_pathARead-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:
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: what a device exposes depends on the device. Filter
cutoff, resonance, attack, threshold and every other parameter behind a device
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. ``unmatched`` lists the words that found
nothing, which is usually where the query went wrong.
This exists so that finding a path costs about 1.5k tokens instead of reading the
whole catalog. It does not touch Live: it reads the catalog only, so nothing here
proves anything about the set that is open.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Restrict to one catalog area, e.g. 'clip' or 'track'. The areas are listed in the live://catalog resource. Empty searches all of them. | |
| limit | No | How many rows to return. Six is about 1.5k tokens. | |
| query | Yes | What 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. | |
| access | No | Restrict 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly=true, idempotent=true, destructive=false, and the description reinforces and extends this with genuinely additive context: token cost per call, the fact that it reads the catalog only and therefore 'nothing here proves anything about the set that is open,' the behavior of the writes field for read-only parameter objects, and the exact semantics of all six route types. There is no contradiction between the annotations and the described behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~350 words) but well-structured: purpose first, then Returns summary, then a route-by-route Note. Every section earns its place โ the device_parameter examples (filter cutoff, resonance, attack) and the arrangement_clip twin explanation prevent real ambiguity. It could be tightened slightly, but the complexity of six route types justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters, six route types, and an output schema, the description is complete: it explains the output dictionary's top-level contents, every route's meaning, the scopes field, the writes field, the token cost, and the catalog-only limitation. Because an output schema exists, the description need not enumerate exact return keys, and the semantic meaning of each route โ exactly what a schema cannot convey โ is fully covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 (query, area, limit, access) with meaningful examples. The description adds modest complementary value โ the writes field explanation connects to the access param's 'use set to filter out read-only parameter objects,' and the 1.5k-token figure ties to the limit default of 6 โ but these are indirect return-value relationships rather than parameter-level guidance. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb+resource pair: 'Find the mechanism that serves an intent, and the catalog rows when rows serve it.' This clearly distinguishes the tool as a discovery/routing lookup rather than a direct accessor like get_track, lom_get, or set_parameter. The route taxonomy (catalog_row, device_parameter, blocked, intent_tool, unresolved) further sharpens what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: 'This exists so that finding a path costs about 1.5k tokens instead of reading the whole catalog,' and it scopes the tool as catalog-only ('It does not touch Live'). The route descriptions function as conditional usage guidance: intent_tool tells the caller a sibling tool is the better route, and blocked tells the caller to do something in Live instead. However, it never explicitly names alternatives ('use lom_get when...'), so it falls one notch 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.
get_clipARead-onlyIdempotent
Read one Session clip's properties: length, loop, warp, pitch, markers, flags.
Checks the slot is filled first, because a clip only exists while its slot
has one and every property read would otherwise fail one by one.
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 are not properties. Use ``read_clip_notes``. Automation is not a
property either. Use ``read_automation``.
``warping``, ``warp_mode`` and ``pitch_coarse`` are reachable only through a
generic path, because a per-command bridge has no command for them and a
missing command is easily mistaken for a missing capability
(docs/architecture.md, 'the restart tax'). 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, with no write attempted
on it, and the integer mapping behind ``warp_mode`` is still a hypothesis:
confirm it against ``clip.available_warp_modes``, which is the authoritative
per-clip list.
Writing ``warping`` invalidates every time field this tool just returned. On a
1.14-unit audio clip at 120 BPM, turning warping on took ``loop_end`` from 0.5704
to 1.1408 and ``end_marker`` from 1.1408 to 2.2816, both doubled, while ``length``
did not follow. At 60 BPM the same toggle moved neither. The mechanism is not
established and is not claimed. What is established is that the numbers move and
that the factor tracks the tempo. Call this again after any write to ``warping``
rather than reusing what it said before.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only and idempotent, but the description adds material behaviors: slot-empty handling returns has_clip:false instead of failing, and property reads are guarded by a filled-slot check. It also discloses verification status of returned fields and the time-field invalidation caveat after warping writes, which annotations could not convey. No contradiction with readOnlyHint=true exists because the description describes an external write, not the tool writing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the core purpose is front-loaded in the first sentence, followed by clearly separated return and note sections. While every section is relevant, the detailed empirical warping example and verification history add notable length and could be trimmed without losing the essential warning. It remains well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisite behavior (filled slot check), exact return semantics including empty-slot handling, adjacent data routes, and the only significant stale-data hazard with a concrete directive to re-call. Given the tool's moderate complexity and the presence of an output schema, nothing needed for correct agent invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both track and slot parameters with clear semantics and 100% coverage, including the 0-based indexing and slot-as-scene meaning. The description adds no new parameter-level detail, so it stands at the schema-covered baseline. It references 'slot' in the filled-check context but not in a way that deepens parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence specifies a concrete read operation on a Session clip and lists the exact property groups returned. It also names the sibling tools for adjacent data (read_clip_notes, read_automation), directly distinguishing this tool from those. This makes the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use read_clip_notes for notes and read_automation for automation, which are the closest alternatives, and clarifies what get_clip is not responsible for. It also advises re-calling after a warp write because cached property values may be stale. 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.
get_devicesARead-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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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. | track |
| track | Yes | Track index in song.tracks, counted from 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description's 'Reads the chain and changes nothing in it' aligns with them. Beyond annotations it adds substantial behavior: the empty-chain case returns device_count: 0 rather than an error, the configure_needed flag semantics for third-party plug-ins, the parameter_count_at_least sentinel when the probe cannot settle, and the note that only Live's GUI lifts the configuration limitation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the one-sentence purpose followed by the one-line safety statement, and uses clear Returns/Note sections. It is long, but the Note's content about configure_needed and parameter_count_at_least is substantive and necessary for correct interpretation. The Returns section slightly overlaps with the existing output schema, which keeps it from a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with 100% schema coverage, an output schema, and safety annotations, the description covers everything an agent needs: purpose, non-mutating behavior, return-shape narrative, edge case handling, the configure_needed caveat, and routing to sibling tools. No critical gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'kind' (with its enum of track/return/master) and 'track' (index in song.tracks counted from 0) are fully documented in the schema. The description adds no parameter-specific meaning beyond the schema, which is acceptable per the baseline-3 rule when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('List a track's device chain') and enumerates the exact fields returned ('names, class names, on/off, parameter counts'). It differentiates itself from siblings by explicitly stating it counts parameters but does not list them (that is describe's job) and that mixer/sends/clip slots belong to get_track.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing: 'call ``describe`` with ``with_parameters=True``' for parameter details, and 'call get_track instead of adding a second call here' for mixer/sends/clip slots. It also provides sequencing guidance ('Read the parameter count first') and explains that reported device indices are the addressing scheme used by set_parameter, delete_device, and song.move_device, telling the agent exactly when this tool's output is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sessionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| clips | No | 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. | |
| devices | No | Include each track device chain in the answer. | |
| max_scenes | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_trackARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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. | track |
| track | Yes | Track index in song.tracks, counted from 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_deviceADestructive
Search Live's browser and load a device onto the currently selected track.
Two steps, and the first one is not optional in practice: call with confirm=False
to search and to see which track is selected, then call again with confirm=True
and the uri or item_path of the item you chose.
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:
Loading an instrument is destructive. ``Browser.load_item`` takes no track
argument: it loads onto whatever ``song.view.selected_track`` points at.
It cannot be aimed inside a rack from here. Measured 2026-09-07 against
Live 12.4.5: writing ``rack.view.selected_chain`` reads back as the chain
that was asked for, and a device loaded afterwards still lands on the
track. The chain kept its six devices and the track went from one device
to two. Live's browser follows the selection in its own interface, which
no write over this channel drives. An effect is appended to the end of the
chain, but an instrument replaces the instrument already on the track and
discards it silently, together with every parameter configured on it and
every clip envelope pointing at it. Check the selection and the existing
chain with get_devices before confirming.
Loading plug-ins in rapid succession can crash Live (measured: a batch load
during a background plug-in rescan, with a licence dialog open, took the
whole application down). Load one at a time, check the connection between
loads, and save the set first.
A successful return proves the call ran, not that the track makes a sound: a
measured Drum Rack load reported success on a silent track. Read the chain
back with get_devices, and for a rack check that ``chains`` is not empty.
An instrument load renames the track while the track still carries Live's default
name, so a track name cached from an earlier get_session is stale afterwards. An
effect never renames. To reorder what is already loaded, call ``song.move_device``
through lom_call rather than loading again.
Three things about the search step are worth knowing before trusting it.
An empty ``candidates`` with ``truncated: true`` is not proof that the item is
absent. The walk ran out of budget before it reached the item, and a search
narrowed with ``root`` can find on the first try what an unrooted search missed
entirely. Narrow before concluding something is not installed.
A ``uri`` from the search step can fail to resolve on the load step for the same
reason, with ``stopped by node_budget``: resolving one walks the browser again,
and a uri carries no hint about where to look. The ``item_path`` in that same
candidate addresses the item directly and cannot run out of budget, so prefer
it. Where the uri is what you have, pass ``root`` with it and the second walk
is narrowed to that one category the same way the search was.
Loading onto the main track works and is reached the same way as any other
target, by pointing the selection at it first: write ``song.view.selected_track``
with ``{"__path__": "song.master_track"}`` through lom_set, then load. There is no
track index for the main track, which is why the usual index does not apply.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | 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. | |
| root | No | Browser category to search inside. Empty searches every category, which is slower and returns more near misses. | |
| limit | No | How many search candidates to return. | |
| query | No | 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. | |
| confirm | No | False searches and loads nothing, reporting the candidates and which track is selected. True loads the item named by uri or item_path. | |
| item_path | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by detailing exactly what is destructive: instrument loads replace and silently discard the previous instrument, track names go stale after instrument loads, and rapid plug-in loads can crash Live. It also discloses measured failure modes and the need to verify results with get_devices, adding 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured and front-loaded: the core two-step usage appears immediately, followed by warnings and edge cases in clear sections. Some details could be trimmed or moved to a separate troubleshooting note, but for a destructive tool with this many failure modes the length is largely justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive tool with six parameters, multiple failure modes, and a two-step protocol, the description is near-exhaustive. It covers prerequisites, selection behavior, return semantics, alternatives, and verification steps, leaving an agent with everything needed to call the tool safely and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the input schema already covers all parameters, the description adds critical operational semantics: item_path is preferred over uri because uri resolution can run out of walk budget, root narrows the second walk after a failed uri, and query is required for the search step but can be dropped for the load step. This meaningfully extends what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Search Live's browser and load a device onto the currently selected track.' It also clearly distinguishes the tool's two-step behavior from the read-only get_devices and destructive delete_device siblings by stating its precise job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit procedural guidance: call with confirm=False first, inspect the selection, then call with confirm=True. It names get_devices as the tool to use before confirming and for reading the chain back, and recommends song.move_device via lom_call instead of reloading for reordering. This is strong when-to-use and when-not-to-use guidance.
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.
One trip instead of many, which is what makes a wide read affordable at roughly
450 ms per round trip.
Returns:
Dictionary containing ordered results for each operation.
Note:
A batch runs inside one handler call, so nothing Live recomputes between
operations is visible to a later operation in the same batch. A read that follows
a transport jump in the same batch still reports the position from before the
move. Four jumps interleaved with four reads returned four identical pre-jump
values and no error at all. 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.
``atomic`` is a stop switch and not a transaction: nothing is undone. After a
partial failure, read the state back rather than assuming either all or none
of the batch landed.
Prefer a dedicated tool for anything it covers. get_session, get_track and
get_devices already batch their own reads, and set_mix writes a whole mixer
in one trip, each with verification this does not perform.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | The operations to run, in order. Each one declares its own op, path and payload; the item schema carries the field meanings. | |
| atomic | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently explains the atomic parameter's effects: '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.' It also notes the absence of verification, which is a behavioral trait. This does not contradict 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately verbose and includes a somewhat meandering example about 'Four jumps interleaved with four reads' that does not add meaningful guidance. The core information is present, but it could be tightened without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main aspects needed: batching, atomic behavior, no rollback, and preference for dedicated tools. It does not detail the exact return format, but the output schema likely handles that. Given the tool's complexity, the description is largely complete, though slightly lacking in explicit error handling details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers parameter meanings extensively (100% coverage). The description adds context about 'raw' operations and the lack of rollback, but does not introduce new parameter semantics beyond what the schema and the atomic explanation provide. Thus a strong score but not a perfect 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: 'Execute multiple raw LOM operations (get, set, call) in a single round trip.' It also distinguishes itself from sibling tools by advising to prefer dedicated tools for covered functionality, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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: 'Prefer a dedicated tool for anything it covers. get_session, get_track and get_devices already batch their own reads, and set_mix writes a whole mixer in one trip, each with verification this does not perform.' It also clarifies the atomic flag behavior, giving clear usage direction.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | 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. | |
| path | Yes | 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. | |
| method | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_describeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Dotted LOM path to the object to reflect on: 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'. | |
| depth | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_enumsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| type_name | No | Dotted Live enum name, e.g. 'Song.Quantization'. Leave empty to list the enum type names instead of the members of one. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_setAIdempotent
Write a property value by LOM path and return verification read-back.
The generic write, for the property no dedicated tool covers. Prefer
set_parameter for a device knob, set_mix for a mixer control and set_tempo for
the tempo: each validates against the catalog before writing, which this does
not. Use lom_call for a method, which is not reachable as a property, and
lom_batch to send 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:
Live does not accept an out-of-range value silently, however often that is given
as the reason to read back. It refuses out loud and stores nothing, so
``...volume.value = 1.4`` answers
``live_error "Invalid value. Check the parameters range with min/max"`` and leaves
0.85 standing. A tempo of 5000 and a panning of 5 are refused the same way.
What the read-back really catches is quantised snap.
``<Compressor>.parameters[10].value = 0.4`` (Model: Peak / RMS / Expand)
stored 0 and reported ``clamped: true, read_back: "clamped", display:
"Peak", is_quantized: true``. A caller who asks for a value between two steps
gets a different one and is told nowhere else.
Three more, measured separately. A write can apply asynchronously, so the
first read is stale and comes back ``read_back: "not_observed"``, which is
not ``clamped`` and not a failure. A method call has no read-back at all.
And Live ignores an unknown property name silently, reporting success for a
write that did nothing, so check ``changed`` rather than ``ok``.
A collection (``song.tracks``, ``device.parameters``) cannot be assigned.
Address an element and set one of its properties.
A Live object cannot travel as a plain value. Where a property really 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]"}``, resolved through the same guards as
a lom_call argument (protocol section 5.4). Handed a plain JSON value the
first five answer ``not_settable``.
The two routing properties, a compressor's sidechain source and its tap
point, take their reference out of ``<device>.available_input_routing_types``
and ``...available_input_routing_channels``, never a name string, because
RoutingType carries ``category`` and ``display_name`` read-only and an
``attached_object`` pointing at the Track.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | 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. | |
| value | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint: false, idempotentHint: true, destructiveHint: false), the description discloses major behavioral traits: Live rejects out-of-range values loudly, quantized values clamp, writes can apply asynchronously causing stale reads, unknown properties are silently ignored, collections are not assignable, and object-valued properties need special __path__ references. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized: purpose, sibling routing, return shape, then a sequence of concrete behavior warnings with examples. Each paragraph earns its place by preventing a distinct failure mode. The most actionable guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the return dictionary fields, device-parameter extras, out-of-range behavior, quantized snapping, async writes, silent failures, collection assignment, object-valued properties, and routing-property constraints. With an output schema present and no missing operational guidance, nothing critical is left undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description substantially enriches parameter understanding: it explains the trailing .value convention for mixer controls, the plain scalar forms of value, the {'__path__': ...} dict form for Live-object properties, and the routing-property reference restrictions. These are essential semantics not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Write a property value by LOM path and return verification read-back.' It then names the sibling tools it is not (set_parameter, set_mix, set_tempo, lom_call, lom_batch), making the tool's role as the generic property write unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to avoid this tool: prefer set_parameter for a device knob, set_mix for a mixer control, set_tempo for tempo, lom_call for a method, and lom_batch for multiple writes. This is direct routing guidance with no reliance on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
playAIdempotent
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 cannot clear
it: measured 2026-09-07 against Live 12.4.5, writing it false reads back
``not_observed`` and the value stays true.
| Name | Required | Description | Default |
|---|---|---|---|
| from_beat | No | 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. | |
| continue_playing | No | True resumes from the current position instead of restarting. Ignored when from_beat is given, since that sets the position. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral traits: the read-back proves transport running but not audibility, the transport is left as found, nothing stops it automatically, and a played Session clip can change Arrangement behavior until back_to_arranger is pressed. This substantially exceeds what the annotations already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections: purpose, return value, and behavioral notes. It is longer than a minimal description, but each paragraph earns its place by conveying non-obvious information. Only minor trimming would be possible without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is thorough for a transport-control tool with an output schema and annotations. It covers side effects, edge cases, alternative tools, and state transitions, so an agent has enough context to decide when to invoke it and what to expect afterward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters with full descriptions, so the description does not need to repeat parameter semantics. The description does add context about from_beat by mentioning set_arrangement_time as an alternative way to move the playhead, but that is more usage guidance than parameter semantics. Schema coverage is 100%, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Start transport playback' and read back is_playing. It clearly distinguishes the tool's function from related siblings by naming stop and set_arrangement_time as alternatives, and by describing its return value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: 'Use stop to halt, and set_arrangement_time to move the playhead without starting.' It also warns about the Session-clip behavior and the Back to Arrangement button, so the agent knows when this tool is appropriate and what follow-up actions may be needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quantize_clipAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grid | No | 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. | |
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| strength | No | 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. | |
| quantize_ends | No | True snaps note ends to the grid too, which changes durations. False moves onsets and leaves every duration as it was. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the full behavioral pipeline: reads notes, calculates quantized positions, writes back using mode='replace', and verifies the result. It also warns that quantizing modifies notes in place and is not undoable, adding important safety context beyond the annotations. There is no contradiction with readOnlyHint=false or idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured and front-loaded: purpose, process, return value, parameter notes, side-effect warning, and alternatives. Every section earns its place, and the language is tight without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 complete: it explains return contents, irreversible in-place modification, parameter interactions, and alternative tools. Required parameters track and slot are fully covered by the input schema, so nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds value by explaining parameter interactions: strength scales displacement from 0.0 to 1.0 with partial-use guidance, and quantize_ends behavior is clarified with articulation-preservation context. This goes beyond the schema without needing to repeat basic field meanings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Quantize MIDI clip note positions and lengths to a specified beat grid.' It clearly distinguishes itself from siblings by explicitly naming transpose_clip for pitch shifts and write_clip_notes for custom off-grid notes, so an agent can select the right tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance and alternatives: use transpose_clip to shift pitch instead of timing, and write_clip_notes for custom or micro-timed off-grid notes. It also instructs the agent to call read_clip_notes first if original unquantized timing may be needed, which is clear prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_automationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last beat to sample, clip-local. Omit to sample to the end of the clip. | |
| slot | Yes | 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. | |
| start | No | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| points | No | 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. | |
| parameter | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: it evaluates at 'points' positions rather than exposing breakpoints, returns a dictionary with specific contents, and warns that Session-clip automation is invisible in Arrangement clips. This complements the readOnlyHint/idempotentHint annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and result, then adds only high-value distinctions and caveats. Each paragraph earns its place: sampling semantics, return contents, session/arrangement contrast, and the false-envelope nuance. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, full schema coverage, and presence of an output schema, the description covers all non-obvious context an agent needs: what the tool returns, how sampling differs from breakpoints, when no envelope exists, and which sibling tools to use instead. It is complete for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 reinforces that 'points' controls sampling resolution and that the answer is a sampling rather than the stored breakpoints, but it does not materially extend the already-detailed per-parameter schema descriptions for start, end, track, slot, or parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a precise action and resource: 'Sample a clip envelope into a list of values and report what it found.' It also distinguishes itself from breakpoint-based reading by explicitly saying the result is a sampling, and it names als_read as the alternative for breakpoints, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when not to use it ('an Arrangement clip has none to read'), names the alternative for saved-project breakpoints ('als_read'), and identifies companion mutation tools ('write_automation' and 'clear_automation'). It also clarifies a subtle interpretation trap: a flat result with envelope flag false is not the same as an envelope holding the current value.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_clip_notesARead-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 expressed in clip-local beats. Muted notes are included
and carry ``mute: true``. ``time_span`` is a length in beats, not an end beat:
beats 24 to 32 is ``from_time=24, time_span=8``.
Windowing and counting keep a small question small. A single drum clip of 384
notes comes back as 57k characters, past the tool-result cap, so a survey across
59 clips cannot be a full read of each. The LOM has no ``note_count`` on ``Clip``
at all, so a count taken out here means transferring every note to measure it.
``count_only=True`` counts inside Live and carries back one integer.
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 its notes back ordered
by pitch, which is the one order a musical instruction never means: "the third
note", "every other note" and "the last note" are all about when a note sounds.
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``.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| check | No | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| from_time | No | First beat of the window to read, clip-local, where 0 is the clip start. Omit to read from the beginning. | |
| time_span | No | 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. | |
| count_only | No | True counts the notes inside Live and returns the number without transferring them, which is the way to ask about a large clip. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a safe read-only operation, and the description adds substantial behavioral detail: muted notes are included with mute:true, time_span is a length not an endpoint, results are sorted by time then pitch, returned data can exceed the tool-result cap, and count_only executes inside Live. This goes far beyond what the annotations or schema convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized with Returns and Note sections, and every paragraph carries load-bearing information about behavior, performance, ordering, or parameter semantics. The core purpose is stated up front, and the detailed caveats are front-loaded where they matter most.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, an output schema, and subtle ordering and windowing behavior, the description is complete. It covers return values, validation behavior, performance constraints, note ordering, and the right way to count notes in large clips, so an agent can select and invoke it correctly without additional probing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds critical semantic nuance: time_span is defined as a duration, count_only transfers only an integer, check is ignored with count_only, and windowed reads validate only the window. The slot and track parameters are already clear from the schema, so the description layers extra meaning where needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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, 'Read MIDI notes of a Session clip', and further distinguishes three modes: full read, windowed query, and note counting. This clearly separates it from write_clip_notes and other siblings while establishing the exact scope of the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 count_only for large clips, explains how windowing changes the check behavior, and directs users to get_notes_extended through lom_call when Live's native note order is required. This is strong routing advice with concrete alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_arrangement_timeAIdempotent
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:
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.
| Name | Required | Description | Default |
|---|---|---|---|
| at_beat | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it writes song.current_song_time, that it moves the playhead without starting playback, and includes a specific caveat about batch reads reporting stale positions. This goes beyond the annotations by explaining side effects and 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and well-organized: a clear main action, a brief elaboration on the side effect, an alternative guidance, and a note about batching. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description covers the action, side effects, alternatives, and a critical batch caveat. It provides enough context for an agent to decide when and how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'at_beat' has a thorough schema description covering fractional beats and bar references, fully clarifying its meaning. The tool description also reinforces its purpose by mentioning 'to a beat'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Move the Arrangement playhead to a beat') and the resource ('Arrangement playhead'), with an additional readback. It also distinguishes this tool from 'play' and 'play with from_beat' by explaining what it does not do (start playback).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool versus alternatives: 'Use play to begin, or play with from_beat to do both in one call.' The note about lom_batch further advises against using it in batch scenarios, providing clear usage context.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for a locator this call creates. Ignored when the call deletes one, because there is nothing left to name. | |
| at_beat | Yes | 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. | |
| confirm | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_loopAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| start | No | Where the loop brace begins, in beats from the start of the Arrangement. Omit to leave it where it is. | |
| length | No | 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. | |
| enabled | No | Turn the Arrangement loop on or off. Omit to leave the switch as it is and move the brace only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_mixAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pan | No | Pan position from -1.0 hard left through 0.0 centre to 1.0 hard right. Omit to leave it alone. | |
| kind | No | 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. | track |
| mute | No | True mutes the track, False unmutes it. Not supported on the master track. Omit to leave it alone. | |
| solo | No | 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. | |
| sends | No | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| volume | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_parameterAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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. | track |
| track | Yes | Track index in song.tracks, counted from 0. | |
| value | Yes | 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. | |
| device | Yes | Device index in that track chain, counted from 0. get_devices lists the chain with its indices. | |
| parameter | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_displayAIdempotent
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:
This is the inverse of ``set_parameter``, and it exists because 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)``. Writing "10" at a parameter that displays milliseconds
lands at 316 ms there, a factor of 30, and reports success.
So the taper is sampled rather than computed: one batch of probes asks the
device 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 the last step.
That last point is the reason not to bisect with real writes instead. A
probing bisection that does not restore what it touched 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 at all.
The probes stay strictly inside the range and never ask at ``min`` or
``max``: an endpoint has crashed Live inside a plugin's own formatting code,
which is 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), which is formally a number and
physically meaningless, so a display-driven search there would walk the
control to its end stop and call it a result. For those, use ``set_parameter``
with a normalised value 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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 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. | track |
| unit | No | Which 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| device | Yes | Device index in that track chain, counted from 0. get_devices lists the chain with its indices. | |
| target | Yes | The 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. | |
| parameter | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses that probes write nothing, only a single final value is written, two round trips occur, endpoints are never probed because they can crash Live, and the returned value is not audibility. This is rich behavioral context and is consistent with readOnlyHint=false, destructiveHint=false, and idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is front-loaded with the essential purpose and return shape, then uses structured paragraphs to explain rationale, safety, edge cases, and alternatives. Every paragraph earns its place and the text is dense with useful information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, inverse-search tool with an output schema and 100% parameter documentation, the description covers the critical extra context: why sampling is used, why real-write bisection is dangerous, endpoint crash risk, no-unit refusal, and sibling tool routing. Nothing needed for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds meaningful semantic context on top: target is a display reading, not a normalised value, and unit handling clarifies refusal on mismatched units. It also explains why probes avoid min/max, which informs the parameter boundaries implied by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a device parameter by the reading it should show, not by its raw value.' It immediately differentiates the tool from set_parameter by naming it as the inverse, so an agent can recognize which tool to use 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus set_parameter: it exists because there is no invertible formula, and for devices that report no unit it says 'use set_parameter with a normalised value and calibrate by ear once.' It also provides a concrete failure mode of write-based bisection, giving strong situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_tempoAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | Yes | Tempo in beats per minute. The catalog validates 20.0 to 999.0. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
stopAIdempotent
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(time=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.
| Name | Required | Description | Default |
|---|---|---|---|
| clips | No | 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. | |
| quantized | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the quantized stop timing (clips may lag up to the next grid point), the fact that an immediate read may still show a clip playing, and the envelope side effect that stopping does not restore a parameter to a baseline. These are non-obvious behavioral traits that an agent needs to interpret results correctly, and they do not contradict 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: one opening sentence, a short Returns note, and a focused behavioral note. Each paragraph earns its place; the envelope side effect is not padding and the usage alternatives are integrated naturally.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema for both parameters and the presence of an output schema, the description covers all essential behavioral context: stop scope, quantized timing, return value, resume/rewind alternatives, and the envelope side effect. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes both boolean parameters thoroughly (100% coverage), so the baseline is adequate. The description adds value by explaining the quantized=True behavior in terms of grid timing and the implication for immediate reads, complementing rather than repeating the schema exactly. The clips parameter is only summarized, but the schema carries its detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Stop transport playback, and optionally every playing Session clip.' It clearly distinguishes the action from siblings like play and set_arrangement_time by naming those tools for resume/rewind in the note, so an agent can tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for stopping playback and explains that play should be used to resume and set_arrangement_time(time=0) to rewind. It does not spell out explicit when-not-to-use conditions, but the alternative routing is present and sufficient for this tool.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| semitones | Yes | 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. | |
| out_of_range | No | 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. | error |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations by explaining relative cumulative behavior on both MIDI and audio paths, the pitch_coarse write mechanism, the bound uncertainty, and the information-loss consequences of clamp/drop. This is rich behavioral context that annotations alone 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, front-loads the core behavior, and every sentence earns its place. The guidance about clamps/drops and read-back evidence is dense but directly useful for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 is complete: it covers MIDI vs audio behavior, relative semantics, out_of_range trade-offs, and when to use alternatives. Since an output schema exists, the return-value note is a bonus rather than a requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, particularly the cumulative relative effect ('calling it twice with 2 moves the clip by 4') and the recoverability guidance tied to out_of_range. This elevates it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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.' This clearly distinguishes the tool's two target modes and states exactly what it operates on. It also differentiates from write_clip_notes and quantize_clip through explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'When to use' and 'When NOT to use' section, naming concrete alternatives: write_clip_notes for melody/voicing edits and quantize_clip for timing/groove changes. This gives an agent unambiguous routing guidance.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | 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. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| points | Yes | 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. | |
| verify | No | True samples the stored envelope back and compares it against the curve that was generated, at the cost of one extra read. | |
| exponent | No | How hard the non-linear shapes bend. 1.0 is effectively linear and higher is steeper. Ignored by 'linear' and 'hold'. | |
| parameter | Yes | 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. | |
| resolution | No | 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. | |
| clear_first | No | True resets the parameter envelope before writing, so the result matches ``points`` exactly. False overlays new breakpoints onto earlier points and mixes the two. | |
| interpolation | No | 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``. | linear |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only false-valued annotations, the description carries the full burden of behavioral disclosure, and it excels: it reveals that verification compares stored vs generated curves, that audible output is not guaranteed on disabled devices or muted tracks, that clear_first=False layers points and can create mixed curves, and that playing leaves the parameter at the curve's last value. This is rich, honest, and actionable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: a one-line summary, a return-value note, and focused warnings about audible verification, retry behavior, and playhead side effects. The most important scoping statement is front-loaded, and the notes are grouped for skimmability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 9-parameter tool with side effects and no meaningful annotation context, this description is remarkably complete. It covers purpose, return behavior, alternatives, retry dangers, audibility caveats, and playback side effects, while an output schema exists to handle return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningful behavior around specific parameters: it explains the consequence of clear_first=False in terms of failed retries, and it clarifies the verify read-back semantics by stating the result reports the stored envelope rather than the requested one. This goes beyond the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Write an automation envelope into a Session clip and verify the read-back.' It clearly distinguishes itself from siblings like read_automation and clear_automation by describing the write-and-verify workflow rather than merely restating the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: it explains that Arrangement envelopes cannot be written directly and must go through a Session clip plus arrange, and it names clear_automation for clearing and read_automation for inspecting before retrying. This is strong routing behavior beyond what the schema or annotations provide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_clip_notesA
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.
With mode='replace' (the default), the clip is updated to match the provided note
list. Live's native note writing appends by default, so mode='replace' ensures a
second write updates rather than duplicates a melody (measured: 63 + 23 = 86 notes).
Ask for 'append' by name when layering notes into an existing performance. To
empty a clip without writing new notes, use delete_clip.
Use read_clip_notes to inspect existing notes before rewriting them. Use
quantize_clip to adjust timing to a grid, and transpose_clip to shift pitch
without altering rhythm.
A list straight from ``read_clip_notes`` can be written back. Live adds
``note_id`` to every note it hands out, which is identity rather than content,
so the keys in :data:`~live_maestro.music.notes.TOLERATED_NOTE_KEYS` are
dropped instead of refused and reported as ``input_keys_ignored``. Every other
unrecognised key is an error.
``pitch``, ``start_time`` and ``duration`` are never defaulted. A reader that
substitutes ``start_time=0.0`` and ``duration=0.25`` for missing keys turns a
list built with ``pos``/``dur`` (the humanise spelling) into a pile of
sixteenths stacked on beat 0, and reports success while doing it. Wrong keys are
refused before anything is sent.
A note does not come back bit-identical to the note sent. Times and durations
return with a small deviation in both directions: a sent 0.29 reads back as
0.29000010406260407 and a sent 0.18 as 0.17999994796869798, about 4e-7 relative,
and both reproduce to every digit across runs. A ``start_time`` of 2.29 comes back
as 2.290000104062604, and a duration of 0.5 comes back exactly. The cause is not
established: it is not a tick grid (no grid of 96, 192, 480 or 960 per quarter
produces those numbers) and not a single float32 conversion (float32 of 0.29 is
0.28999999). That 0.5 survives while 0.29 does not is consistent with a
binary-representable value passing through untouched, but the mechanism is not
claimed here. At 124 BPM the error is around 50 nanoseconds, so musically it is
nothing. It matters only for comparison: never test a note time for equality. The
diff run here already uses a tolerance, which is why it reports ``0 changed`` for
values that differ in the seventh decimal.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | '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 |
| slot | Yes | 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. | |
| notes | Yes | The notes to write into the clip. Each item declares its own fields, and the item schema carries their units. | |
| track | Yes | Track index in song.tracks, counted from 0. | |
| verify | No | True reads the notes back and reports the difference against what was asked for, at the cost of one extra read. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations supplying almost no behavioral signal (all false), the description carries the burden and does so thoroughly. It discloses clip-local beat timing, the replace-vs-append semantics with measured evidence, note_id tolerance and key rejection behavior, the absence of defaulting, and floating-point round-trip deviations with a clear warning never to compare for equality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with purpose, returns, usage notes, and behavioral warnings front-loaded. It is somewhat verbose in the floating-point precision narrative, which could be trimmed without losing the core warning, but the detail is informative rather than redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with five parameters and an output schema, the description covers all essential context: units, mode semantics, note object key handling, verification behavior, and precision pitfalls. An agent has enough information to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial input-construction guidance: note_id and tolerated keys are dropped, unrecognized keys are refused, pitch/start_time/duration are never defaulted, and the 'pos'/'dur' spelling is explicitly not accepted. This goes well beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Write MIDI notes into a Session clip.' It clearly differentiates from siblings like read_clip_notes and delete_clip, and the description of replace vs append modes further clarifies what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use alternatives: read_clip_notes for inspecting before rewriting, quantize_clip for timing, transpose_clip for pitch, and delete_clip for emptying a clip. It also gives a concrete rule for choosing mode='append' when layering notes.
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. Dates show when Glama detected each change.
7 tool updates
v0.1.4- Changed
delete_device1 field changed- added
Input schema / properties / kindAdded 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" +}
- Changed
describe1 field changed- changed
Input schema / properties / path / descriptionPrevious 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."
- Changed
find_path1 field changed- changed
Input schema / properties / area / descriptionPrevious 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."
- Changed
load_device2 fields changed- changed
Input schema / properties / item_path / descriptionPrevious 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." - changed
Input schema / properties / uri / descriptionPrevious 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."
- Added
set_parameter_display - Changed
write_automation1 field changed- changed
Input schema / properties / clear_first / descriptionPrevious 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."
- Changed
write_clip_notes2 fields changed- changed
Input schema / properties / mode / descriptionPrevious 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." - changed
Input schema / properties / notes / descriptionPrevious 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."
37 tool updates
v0.1.1- Changed
als_read5 fields changed- added
Input schema / properties / locateAdded 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" +} - added
Input schema / properties / path / descriptionAdded 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." - added
Input schema / properties / report / descriptionAdded value: +"True adds a formatted summary written for a person to read, alongside the structured answer rather than instead of it." - added
Input schema / properties / track / descriptionAdded value: +"Narrow the read to one track, given either as its name or as its index in a string. Empty reads the whole project." - added
Input schema / properties / with_notes / descriptionAdded value: +"True parses the clip notes and reports note metrics, which is the expensive part of the read on a large project."
- Changed
als_write16 fields changed- added
Input schema / properties / allow_live_running / descriptionAdded 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." - added
Input schema / properties / attribute / descriptionAdded value: +"Which attribute of the selected element to set. Live stores most numbers under 'Value'. Used by 'attribute' only." - added
Input schema / properties / backup / descriptionAdded value: +"Path to the backup file to put back. Required by the 'restore' operation and read by no other." - added
Input schema / properties / confirm / descriptionAdded value: +"True carries the edit out. False changes nothing and reports what the call requires, which is how to check the arguments first." - added
Input schema / properties / create / descriptionAdded 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." - added
Input schema / properties / device / descriptionAdded value: +"Device index within the target track chain, counted from 0. Used by 'sidechain' and 'configure'." - added
Input schema / properties / expression / descriptionAdded 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." - added
Input schema / properties / index / descriptionAdded 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." - added
Input schema / properties / operation / descriptionAdded 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." - added
Input schema / properties / operation / enumAdded value: +[ + "sidechain", + "configure", + "attribute", + "restore" +] - added
Input schema / properties / path / descriptionAdded value: +"Filesystem path to the .als project to edit. A backup is written first and can be put back with the restore operation." - added
Input schema / properties / source_track / descriptionAdded value: +"Name of the track the compressor should listen to, which is usually the kick. Used by 'sidechain' only." - added
Input schema / properties / tap / descriptionAdded 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." - added
Input schema / properties / tap / enumAdded value: +[ + "pre", + "post" +] - added
Input schema / properties / target_track / descriptionAdded value: +"Name of the track carrying the device to edit, as it appears in Live. Used by 'sidechain' and 'configure'." - added
Input schema / properties / value / descriptionAdded value: +"For 'attribute', the new attribute value. For 'configure', the parameter strip assignment as '<index>=<name>; ...'."
- Added
analyze_audio - Changed
arrange4 fields changed- added
Input schema / properties / at_beat / descriptionAdded value: +"Where the copy starts on the Arrangement timeline, in beats from the start of the song. Fractional beats are accepted." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / to_track / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
clear_automation5 fields changed- added
Input schema / properties / all_envelopes / descriptionAdded 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." - added
Input schema / properties / confirm / descriptionAdded 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." - added
Input schema / properties / parameter / descriptionAdded 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." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
create_clip4 fields changed- added
Input schema / properties / length_beats / descriptionAdded 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." - added
Input schema / properties / name / descriptionAdded value: +"Name for the new clip. Empty leaves it unnamed." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
create_track4 fields changed- added
Input schema / properties / index / descriptionAdded 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." - added
Input schema / properties / kind / descriptionAdded 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." - added
Input schema / properties / kind / enumAdded value: +[ + "midi", + "audio", + "return" +] - added
Input schema / properties / name / descriptionAdded value: +"Name for the new MIDI or audio track. Empty leaves Live to name it, which produces a default like '3-MIDI'."
- Changed
delete_clip3 fields changed- added
Input schema / properties / confirm / descriptionAdded 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." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
delete_device3 fields changed- added
Input schema / properties / confirm / descriptionAdded 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." - added
Input schema / properties / device / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
delete_track2 fields changed- added
Input schema / properties / confirm / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
describe3 fields changed- added
Input schema / properties / depth / descriptionAdded 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." - added
Input schema / properties / path / descriptionAdded 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." - added
Input schema / properties / with_parameters / descriptionAdded 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."
- Added
find_path - Changed
get_clip2 fields changed- added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
get_devices3 fields changed- added
Input schema / properties / kind / descriptionAdded 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." - added
Input schema / properties / kind / enumAdded value: +[ + "track", + "return", + "master" +] - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
get_session3 fields changed- added
Input schema / properties / clips / descriptionAdded 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." - added
Input schema / properties / devices / descriptionAdded value: +"Include each track device chain in the answer." - added
Input schema / properties / max_scenes / descriptionAdded 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."
- Changed
get_track3 fields changed- added
Input schema / properties / kind / descriptionAdded 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." - added
Input schema / properties / kind / enumAdded value: +[ + "track", + "return", + "master" +] - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
load_device7 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"False searches and loads nothing, reporting the candidates and which track is selected. True loads the item named by uri or item_path." - added
Input schema / properties / item_path / descriptionAdded 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." - added
Input schema / properties / limit / descriptionAdded value: +"How many search candidates to return." - added
Input schema / properties / query / descriptionAdded 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." - added
Input schema / properties / root / descriptionAdded value: +"Browser category to search inside. Empty searches every category, which is slower and returns more near misses." - added
Input schema / properties / root / enumAdded value: +[ + "", + "audio_effects", + "clips", + "current_project", + "drums", + "instruments", + "legacy_libraries", + "max_for_live", + "midi_effects", + "packs", + "plugins", + "samples", + "sounds", + "user_folders", + "user_library" +] - added
Input schema / properties / uri / descriptionAdded value: +"The uri of one candidate from a previous search step, copied back verbatim to say which item to load."
- Changed
lom_batch2 fields changed- added
Input schema / properties / atomic / descriptionAdded 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." - added
Input schema / properties / ops / descriptionAdded value: +"The operations to run, in order. Each one declares its own op, path and payload; the item schema carries the field meanings."
- Changed
lom_call3 fields changed- added
Input schema / properties / args / descriptionAdded 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." - added
Input schema / properties / method / descriptionAdded 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." - added
Input schema / properties / path / descriptionAdded 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."
- Changed
lom_describe2 fields changed- added
Input schema / properties / depth / descriptionAdded 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." - added
Input schema / properties / path / descriptionAdded value: +"Dotted LOM path to the object to reflect on: 'song', 'song.tracks[0]', 'song.tracks[0].devices[1]'."
- Changed
lom_enums1 field changed- added
Input schema / properties / type_name / descriptionAdded value: +"Dotted Live enum name, e.g. 'Song.Quantization'. Leave empty to list the enum type names instead of the members of one."
- Changed
lom_get1 field changed- added
Input schema / properties / path / descriptionAdded 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."
- Changed
lom_set2 fields changed- added
Input schema / properties / path / descriptionAdded 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." - added
Input schema / properties / value / descriptionAdded 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."
- Changed
play2 fields changed- added
Input schema / properties / continue_playing / descriptionAdded value: +"True resumes from the current position instead of restarting. Ignored when from_beat is given, since that sets the position." - added
Input schema / properties / from_beat / descriptionAdded 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."
- Changed
quantize_clip5 fields changed- added
Input schema / properties / grid / descriptionAdded 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." - added
Input schema / properties / quantize_ends / descriptionAdded value: +"True snaps note ends to the grid too, which changes durations. False moves onsets and leaves every duration as it was." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / strength / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
read_automation6 fields changed- added
Input schema / properties / end / descriptionAdded value: +"Last beat to sample, clip-local. Omit to sample to the end of the clip." - added
Input schema / properties / parameter / descriptionAdded 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." - added
Input schema / properties / points / descriptionAdded 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." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / start / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
read_clip_notes6 fields changed- added
Input schema / properties / check / descriptionAdded 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." - added
Input schema / properties / count_only / descriptionAdded value: +"True counts the notes inside Live and returns the number without transferring them, which is the way to ask about a large clip." - added
Input schema / properties / from_time / descriptionAdded value: +"First beat of the window to read, clip-local, where 0 is the clip start. Omit to read from the beginning." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / time_span / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
set_arrangement_time1 field changed- added
Input schema / properties / at_beat / descriptionAdded 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."
- Changed
set_locator3 fields changed- added
Input schema / properties / at_beat / descriptionAdded 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." - added
Input schema / properties / confirm / descriptionAdded 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." - added
Input schema / properties / name / descriptionAdded value: +"Name for a locator this call creates. Ignored when the call deletes one, because there is nothing left to name."
- Changed
set_loop3 fields changed- added
Input schema / properties / enabled / descriptionAdded value: +"Turn the Arrangement loop on or off. Omit to leave the switch as it is and move the brace only." - added
Input schema / properties / length / descriptionAdded 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." - added
Input schema / properties / start / descriptionAdded value: +"Where the loop brace begins, in beats from the start of the Arrangement. Omit to leave it where it is."
- Changed
set_mix8 fields changed- added
Input schema / properties / kind / descriptionAdded 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." - added
Input schema / properties / kind / enumAdded value: +[ + "track", + "return", + "master" +] - added
Input schema / properties / mute / descriptionAdded value: +"True mutes the track, False unmutes it. Not supported on the master track. Omit to leave it alone." - added
Input schema / properties / pan / descriptionAdded value: +"Pan position from -1.0 hard left through 0.0 centre to 1.0 hard right. Omit to leave it alone." - added
Input schema / properties / sends / descriptionAdded 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." - added
Input schema / properties / solo / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0." - added
Input schema / properties / volume / descriptionAdded 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."
- Changed
set_parameter6 fields changed- added
Input schema / properties / device / descriptionAdded value: +"Device index in that track chain, counted from 0. get_devices lists the chain with its indices." - added
Input schema / properties / kind / descriptionAdded 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." - added
Input schema / properties / kind / enumAdded value: +[ + "track", + "return", + "master" +] - added
Input schema / properties / parameter / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0." - added
Input schema / properties / value / descriptionAdded 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."
- Changed
set_tempo1 field changed- added
Input schema / properties / bpm / descriptionAdded value: +"Tempo in beats per minute. The catalog validates 20.0 to 999.0."
- Changed
stop2 fields changed- added
Input schema / properties / clips / descriptionAdded 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." - added
Input schema / properties / quantized / descriptionAdded 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."
- Changed
transpose_clip5 fields changed- added
Input schema / properties / out_of_range / descriptionAdded 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." - added
Input schema / properties / out_of_range / enumAdded value: +[ + "error", + "clamp", + "drop" +] - added
Input schema / properties / semitones / descriptionAdded 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." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0."
- Changed
write_automation10 fields changed- added
Input schema / properties / clear_first / descriptionAdded 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." - added
Input schema / properties / exponent / descriptionAdded value: +"How hard the non-linear shapes bend. 1.0 is effectively linear and higher is steeper. Ignored by 'linear' and 'hold'." - added
Input schema / properties / interpolation / descriptionAdded 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``." - added
Input schema / properties / interpolation / enumAdded value: +[ + "linear", + "hold", + "exponential", + "ease_in", + "ease_out" +] - added
Input schema / properties / parameter / descriptionAdded 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." - added
Input schema / properties / points / descriptionAdded 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." - added
Input schema / properties / resolution / descriptionAdded 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." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0." - added
Input schema / properties / verify / descriptionAdded value: +"True samples the stored envelope back and compares it against the curve that was generated, at the cost of one extra read."
- Changed
write_clip_notes7 fields changed- added
Input schema / properties / mode / descriptionAdded 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." - added
Input schema / properties / mode / enumAdded value: +[ + "replace", + "append" +] - added
Input schema / properties / notes / descriptionAdded 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." - changed
Input schema / properties / notes / items / properties / velocity / descriptionPrevious 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." - added
Input schema / properties / slot / descriptionAdded 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." - added
Input schema / properties / track / descriptionAdded value: +"Track index in song.tracks, counted from 0." - added
Input schema / properties / verify / descriptionAdded value: +"True reads the notes back and reports the difference against what was asked for, at the cost of one extra read."
35 tool updates
v0.1.0- First observed
als_read - First observed
als_write - First observed
arrange - First observed
clear_automation - First observed
create_clip - First observed
create_track - First observed
delete_clip - First observed
delete_device - First observed
delete_track - First observed
describe - First observed
get_clip - First observed
get_devices - First observed
get_session - First observed
get_track - First observed
load_device - First observed
lom_batch - First observed
lom_call - First observed
lom_describe - First observed
lom_enums - First observed
lom_get - First observed
lom_set - First observed
play - First observed
quantize_clip - First observed
read_automation - First observed
read_clip_notes - First observed
set_arrangement_time - First observed
set_locator - First observed
set_loop - First observed
set_mix - First observed
set_parameter - First observed
set_tempo - First observed
stop - First observed
transpose_clip - First observed
write_automation - First observed
write_clip_notes
TDQS
Scored across 38 tools
Most tools map cleanly to one resource and action, and the descriptions repeatedly direct callers to sibling tools (e.g., get_track rather than get_devices for mixer state). The only real ambiguity is between set_parameter and set_parameter_display, and between describe and lom_describe, though both pairs are carefully differentiated in their docs.
The set follows a consistent verb_noun convention: get_*, set_*, create_*, delete_*, read_*, and write_* families are immediately recognizable, and the lom_*/als_* prefixes mark the generic and file-level layers. A few one-word verbs (play, stop, arrange, describe) and the slightly awkward set_parameter_display are minor deviations, not pattern breaks.
At 38 tools the surface is heavy, but the toolset is organized into clear subdomains and nearly every tool addresses a distinct workflow. The generic lom_* layer and dedicated wrappers overlap somewhat, so the count is justified by breadth rather than well-scoped minimalism.
Dedicated tools cover CRUD/lifecycle for tracks, clips, devices, notes, automation, mixer, transport, and project files, and the lom_get/set/call/batch layer provides a general escape hatch for anything not wrapped. Gaps such as arm-state writes, scene control, or arrangement-clip deletion are reachable only through that generic layer, so coverage is strong but not exhaustive.
Maintenance
Related MCP Connectors
Convert projects between Logic, Ableton, FL Studio and REAPER; generate, separate, transcribe
- mozonicOAuthcom.mozonic
AI mixing and mastering: analyze your mixes, run DSP autofix, render stems, and master tracks.
AI music production assistant โ audio profiling, AI mixing sessions, and service inquiries.
- VocunoOAuthcom.vocuno
AI music studio: song generation with vocals, covers, stems, voice conversion, mastering, editing.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects Ableton Live to AI assistants through Model Context Protocol (MCP), enabling natural language control of music production tasks like track creation, MIDI editing, instrument loading, and playback control.15MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language control over Ableton Live for generating musical patterns, melodies, and full song arrangements. It also provides tools for sample searching and mixing assistance through an OSC-based connection with Claude Desktop.1MIT
- AlicenseNot gradedqualityAmaintenanceAI 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.45465Business Source 1.1
- AlicenseNot gradedqualityDmaintenanceControl Ableton Live using natural language via AI assistants like Claude or Cursor.9MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/romanstark/live-maestro'
If you have feedback or need assistance with the MCP directory API, please join our Discord server