Skip to main content
Glama
romanstark

Ableton Maestro

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

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

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

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_sessionA

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

Args:
    clips: Sweep Session slots for active clips.
    devices: Include device chains for each track.
    max_scenes: Maximum number of scenes to probe for Session clips.

Returns:
    Dictionary with script info, session snapshot, track counts, and notes.

Note:
    Measured 2026-08-29 against Live 12.4.5: Round-trip handshake takes ~450 ms.
    Group tracks do not support arm state ('armed' returns null).
    If Live collection introspection reports zero tracks, index probing is used as a fallback.
get_trackA

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

Args:
    track: index in ``song.tracks`` (or ``song.return_tracks`` for
        ``kind="return"``). Ignored for ``kind="master"``.
    kind: ``track`` | ``return`` | ``master``.

``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
(see ``notes``).
get_clipA

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.

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. Measured
2026-08-30 against Live 12.4.5 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.
get_devicesB

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

The parameter count is worth reading first. A third-party plug-in reporting exactly
one parameter has not been configured; see the ``configure_needed`` flag and the note
it carries. That is a limit in Live, not in this server, and it is lifted only in
Live's GUI.

The parameter probe here only has to settle "exactly one, or more than one",
which is what tells an unconfigured plug-in apart from a configured one. For
the full list call ``describe`` with ``with_parameters=True``.

Device order can be changed, though it is widely assumed to be fixed. The call sits
on the Song rather than on the Device, which is why it reads as missing:
``Song.move_device(device, target_chain, position)``, catalogued as
``song.move_device`` and reachable through ``lom_call``. Measured 2026-08-30 against
Live 12.4.5 on a scratch track: ``['Eq8', 'Compressor2', ...]`` became
``['Compressor2', 'Eq8', ...]``.

Loading order is still worth planning, because it decides what survives. Effects are
appended, and an instrument replaces the instrument already on the track (measured),
taking its settings and its clip envelopes with it. Reordering afterwards is a
convenience; a replaced instrument is not recoverable.
describeA

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

This is 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.

Args:
    path: a LOM path, e.g. ``song``, ``song.tracks[0]``,
        ``song.tracks[0].devices[1]``. Look shapes up in ``ableton://catalog``.
    depth: how far to descend. Deep describes over a whole set can be slow
        and the cost is unmeasured.
    with_parameters: for a device path, survey every parameter (name, value,
        min/max, quantized steps, display unit) instead of just the child
        counts, and diagnose an unconfigured plug-in rather than returning a
        useless one-entry list.

Methods are never callable through a path. Use ``lom_call``, and only names on the
script's own allowlist.

Measured caveat (Live 12.4.5): the parameter survey depends on
``lom_describe`` reporting a ``count`` for the ``parameters`` child, and a
Live ``Vector`` that refuses ``len()`` reports none, so the survey comes back
with zero parameters on a device that has them. 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.
create_trackA

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

Args:
    kind: Track kind ('midi', 'audio', or 'return').
    index: Insertion index (-1 inserts at the end without shifting existing track indices).
        Ignored for return tracks.
    name: Optional track name for MIDI or audio tracks.

Returns:
    Dictionary reporting track creation status and before/after track counts.

Note:
    Inserting before existing tracks renumbers subsequent track indices.
    Measured 2026-08-30 against Live 12.4.5.
load_deviceA

Search Live's browser and load a device onto the currently selected track.

Two-step process: with confirm=False, searches browser and returns candidate items
along with currently selected track info. With confirm=True and a chosen uri or item_path,
loads the item.

Args:
    query: Search string for browser items.
    root: Optional browser root category to search within.
    uri: Browser item URI returned from search step.
    item_path: Direct filesystem or library item path.
    limit: Maximum number of search candidates to return (defaults to 12).
    confirm: Confirmation flag required to execute loading.

Returns:
    Dictionary containing search candidates or device load verification details.

Note:
    Browser.load_item targets the current selection rather than an explicit track argument.
    Target track is determined by song.view.selected_track.
    Inside racks or drum racks, target destination is determined by rack.view.selected_chain
    or rack.view.selected_drum_pad.
    Instruments replace the track instrument, whereas audio/MIDI effects are appended.
create_clipA

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

Args:
    track: Track index in song.tracks (MIDI track required).
    slot: Scene/slot index in track.clip_slots.
    length_beats: Clip loop length in beats (defaults to 4.0).
    name: Optional clip name.

Returns:
    Dictionary containing clip creation status and read-back verification.

Note:
    Does not overwrite occupied slots; call delete_clip first if replacing.
delete_clipA

Delete the clip in a Session slot. Requires confirm=True.

When confirm=False, inspects slot and reports clip details that would be deleted.

Args:
    track: Track index in song.tracks.
    slot: Scene/slot index in track.clip_slots.
    confirm: Confirmation flag required to execute deletion.

Returns:
    Dictionary reporting deletion status or pending loss report.
delete_trackA

Delete a track and renumber subsequent tracks. Requires confirm=True.

When confirm=False, reports track name, devices, filled Session slots,
and Arrangement clips that would be removed.

Args:
    track: Track index in song.tracks.
    confirm: Confirmation flag required to execute deletion.

Returns:
    Dictionary reporting deletion status or pending loss report.

Note:
    Deleting a track shifts all subsequent track indices down by one.
delete_deviceA

Remove a device from a track device chain. Requires confirm=True.

When confirm=False, reports device details and parameter count that would be removed.

Args:
    track: Track index in song.tracks.
    device: Device index within track chain.
    confirm: Confirmation flag required to execute deletion.

Returns:
    Dictionary reporting deletion status or pending loss report.

Note:
    Deleting a device shifts subsequent device indices down by one.
    Measured 2026-08-30 against Live 12.4.5: Devices can be reordered via song.move_device.
write_clip_notesA

Write MIDI notes into a Session clip. Replaces notes by default.

Args:
    track: Track index in song.tracks (MIDI track).
    slot: Scene/slot index in track.clip_slots.
    notes: List of note dictionaries with pitch, start_time, duration, velocity,
        and optional probability, velocity_deviation, release_velocity, mute.
    mode: Write mode, 'replace' (clears prior notes and writes) or 'append'.
    verify: When True, reads back notes and compares with input using diff.

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.

    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:`~ableton_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.

    ``replace`` is remove-then-write inside one handler call. Live's own
    ``set_notes`` appends, so a second write silently doubles a melody instead of
    correcting it (measured: 63 + 23 = 86 notes). Ask for ``append`` by name when
    adding is the intent. An empty list with ``mode="replace"`` clears the clip.

    A note does not come back bit-identical to the note sent. Times and durations
    return with a small deviation in both directions. Measured 2026-09-01 against
    Live 12.4.5: a sent 0.29 read back as 0.29000010406260407 and a sent 0.18 as
    0.17999994796869798, about 4e-7 relative. Re-measured 2026-09-02 against Live
    12.4.5 at 124 BPM: both values reproduced to every digit, a ``start_time`` of
    2.29 came back as 2.290000104062604, and a duration of 0.5 came 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.
read_clip_notesA

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

Args:
    track: Track index in song.tracks.
    slot: Scene/slot index in track.clip_slots.
    from_time: Start beat of window to query. Omit to query from beat 0.
    time_span: Window length in beats. Omit to query to the end of the clip.
    count_only: When True, returns note count without transferring note data.
    check: When True, performs validation checks on queried 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 exist because there was otherwise no way to ask a small
    question. Measured 2026-08-30: surveying note density across 59 drum clips meant
    reading every note of every clip, and one clip alone came back as 384 notes and
    57k characters, past the tool-result cap, so it spilled to a file. The LOM has no
    ``note_count`` on ``Clip`` at all, so counting meant transferring everything in
    order 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.
    Measured 2026-08-30 against Live 12.4.5: four notes written at beats 0, 1, 2, 3
    with pitches 72, 60, 67, 62 came 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``.
quantize_clipA

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.

Args:
    track: Track index in song.tracks.
    slot: Scene/slot index in track.clip_slots.
    grid: Quantization grid in beats (0.25 = sixteenth notes, 0.5 = eighth notes).
    strength: Quantization strength from 0.0 (no change) to 1.0 (full snap).
    quantize_ends: When True, also quantizes note durations / end positions.

Returns:
    Dictionary containing write result and quantization details.
transpose_clipA

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

Args:
    track: Track index in song.tracks.
    slot: Scene/slot index in track.clip_slots.
    semitones: Number of semitones to transpose (positive or negative).
    out_of_range: Action when transposed notes exceed MIDI range 0..127
        ('error', 'clamp', or 'drop').

Returns:
    Dictionary reporting transposition status and details.

Note:
    Measured 2026-08-29 against Live 12.4.5: Audio clips are transposed by setting
    clip.pitch_coarse (-48..48 semitones).
set_mixA

Set mixer parameters (volume, pan, sends, mute, solo) in a single round trip.

Args:
    track: Track index in song.tracks (or song.return_tracks). Ignored for kind="master".
    volume: Normalized volume level 0.0 to 1.0 (0.85 corresponds to 0 dB).
    pan: Panning position from -1.0 (hard left) to 1.0 (hard right).
    sends: Dictionary of send amounts 0.0 to 1.0 keyed by send letter ('A', 'B') or index.
    mute: Track mute state boolean (unsupported on master track).
    solo: Track solo state boolean (unsupported on master track).
    kind: Track kind ('track', 'return', or 'master').

Returns:
    Dictionary reporting mixer adjustments and before/after verification readings.
set_parameterA

Set a device parameter by numeric index or name/glob and verify read-back.

Args:
    track: Track index in song.tracks (or song.return_tracks). Ignored for kind="master".
    device: Device index within track chain.
    parameter: Parameter index (as string e.g. "1") or parameter name/glob pattern.
    value: Parameter target value.
    kind: Track kind ('track', 'return', or 'master').

Returns:
    Dictionary reporting write status, resolved parameter index, and read-back value.

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.

    Measured 2026-08-30 against Live 12.4.5: 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.
write_automationA

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

Args:
    track: Track index in song.tracks (Session clip).
    slot: Scene/slot index in track.clip_slots.
    parameter: LOM path to DeviceParameter (e.g. 'song.tracks[0].mixer_device.volume').
    points: Breakpoint coordinates as [[beat, value], ...] in clip-local beats.
    interpolation: Interpolation mode ('linear', 'hold', 'exponential', 'ease_in', 'ease_out').
    exponent: Exponent for non-linear interpolation shapes.
    resolution: Sampling step size in beats (defaults to 0.0625 = 1/16th note).
    clear_first: When True, clears prior envelope points before writing.
    verify: When True, samples envelope back and compares with generated curve.

Returns:
    Dictionary reporting write status, sampling metrics, and verification comparison.

Note:
    Automation envelopes can be written directly to Session clips;
    subsequently arrange the clip to transfer automation to the Arrangement timeline.
read_automationA

Sample an envelope curve for a parameter on a Session clip.

Args:
    track: Track index in song.tracks.
    slot: Scene/slot index in track.clip_slots.
    parameter: LOM path to the target DeviceParameter.
    start: Optional start position in clip-local beats (default skips initial beat 0 guard).
    end: Optional end position in clip-local beats.
    points: Number of sample points to evaluate (clamped 2 to 512, default 64).

Returns:
    Dictionary with sampled values, range, and envelope presence flags.
clear_automationA

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

When confirm=False, inspects clip and reports envelope existence without deleting.

Args:
    track: Track index in song.tracks.
    slot: Scene/slot index in track.clip_slots.
    parameter: Target DeviceParameter LOM path when clearing a single envelope.
    all_envelopes: When True, clears all envelopes on the clip.
    confirm: Confirmation flag required to execute clearing.

Returns:
    Dictionary reporting clearance status or pending envelope details.
arrangeA

Duplicate a Session clip into the Arrangement timeline at a beat position.

Args:
    track: Source track index in song.tracks.
    slot: Source scene/slot index in track.clip_slots.
    at_beat: Target start position on the Arrangement timeline in beats.
    to_track: Destination track index (defaults to source track).

Returns:
    Dictionary containing placement status and arrangement clip counts.
set_locatorA

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

Live's song.set_or_delete_cue toggles: adds a locator if absent, or deletes if present.
When confirm=False, reports current locator positions and requires confirmation.

Args:
    at_beat: Timeline position in beats.
    name: Optional name for newly created locator.
    confirm: Confirmation flag required to execute locator toggle.

Returns:
    Dictionary reporting locator status and resulting cue points.
set_arrangement_timeA

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

Args:
    at_beat: Target song time in beats from timeline start.

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

Start transport playback and read back is_playing status.

Args:
    from_beat: Optional timeline position in beats to cue before playback.
    continue_playing: When True, resumes from current position rather than restarting.

Returns:
    Dictionary reporting start status and is_playing confirmation.
stopA

Stop transport playback and optionally stop all active Session clips.

Args:
    clips: When True, also stops active Session clips via song.stop_all_clips.
    quantized: Whether clip stop adheres to global launch quantization.

Returns:
    Dictionary reporting stop status and is_playing confirmation.
set_tempoA

Set song tempo in BPM and read back stored value.

Args:
    bpm: Target tempo in beats per minute (catalog validated 20.0 to 999.0).

Returns:
    Dictionary reporting tempo write and read-back result.
set_loopA

Configure Arrangement loop brace parameters (enabled, start, length).

Args:
    enabled: Optional loop enabled state boolean.
    start: Optional loop start position in beats.
    length: Optional loop length in beats.

Returns:
    Dictionary reporting write status and before/after verification values.
als_readA

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

Args:
    path: Filesystem path to .als or .adg file.
    with_notes: When True, parses clip notes and calculates note metrics.
    track: Optional track name or index to query a specific track instead of the entire project.
    report: When True, includes formatted human-readable summary report.

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 174 professional projects: 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.
als_writeA

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

Supported operations: 'sidechain', 'configure', 'attribute', 'restore'.
Target project file must not be currently open in Live unless confirmed.

Args:
    path: Path to target .als project file.
    operation: Modification operation ('sidechain', 'configure', 'attribute', 'restore').
    confirm: Confirmation flag required to execute modifications.
    target_track: Name of track containing target device.
    source_track: Name of track providing trigger source (sidechain operation).
    device: Device index within target track.
    tap: Sidechain tap point ('pre' or 'post').
    expression: ElementTree path expression (attribute operation).
    value: New attribute value or configure assignment string ('<index>=<name>; ...').
    attribute: Attribute name to modify (attribute operation, defaults to 'Value').
    index: Target element match index when expression matches multiple elements.
    create: When True, creates attribute if missing.
    backup: Backup filepath required for restore operation.
    allow_live_running: Allow write when Live runs (auto-enabled if holding another set).

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 in a corpus of 174 projects: 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. Measured 2026-09-01 against Live 12.4.5: 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.
lom_getA

Read a property value by LOM path.

Args:
    path: Dotted LOM path starting with 'song', 'app', or 'song.view'.

Returns:
    Dictionary containing path, value, type, and optional parameter display string.
lom_setA

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

Args:
    path: Settable dotted LOM path.
    value: Value to set, or object reference dict {'__path__': '...'} for object properties.

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. Measured 2026-08-30 against Live 12.4.5: it refuses
    them out loud and stores nothing. ``...mixer_device.volume.value = 1.4`` answers
    ``live_error "Invalid value. Check the parameters range with min/max"`` and the
    value stays at 0.85; ``song.tempo = 5000`` answers "Tempo out of range"; a
    panning of 5 is refused the same way.

    What the read-back really catches, measured the same day, is quantised snap:
    ``<Compressor>.parameters[10].value = 0.4`` (Model: Peak / RMS / Expand) stored 0,
    reporting ``before 1, after 0, clamped: true, changed: 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.

    Two more, measured separately: a write can apply asynchronously, so the first
    read is stale (``read_back: "not_observed"``, which is not ``clamped``), and a
    method call has no read-back at all. Live also ignores an unknown property name
    silently and reports success for a write that did nothing.

    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, and there are two cases behind
    that. ``song.tracks[0].mixer_device.volume`` is a DeviceParameter and the wanted
    value is one level down, so write ``...volume.value``. But a property whose value
    really is an object (``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``) is written by passing
    a reference: ``value={"__path__": "song.tracks[2]"}``, resolved through the same
    resolver and guards as a ``lom_call`` argument (protocol ยง5.4). Handed a plain
    JSON value the first five answer ``not_settable`` (measured 2026-08-29 against
    Live 12.4.5). 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 (measured 2026-08-30, same Live).
lom_callA

Invoke an allowlisted method on a Live object.

Args:
    path: Dotted LOM path to target object.
    method: Allowlisted method name to execute.
    args: Optional list of positional arguments.

Returns:
    Dictionary reporting method execution status.
lom_batchA

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

Args:
    ops: List of operation dictionaries ({'op': 'get'|'set'|'call', 'path': ...}).
    atomic: When True, stops execution on the first encountered error.

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. Measured 2026-09-01 against Live 12.4.5: 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.
lom_describeA

Introspect an object generically by LOM path.

Args:
    path: Target LOM path.
    depth: Traversal depth for nested child collections (defaults to 1).

Returns:
    Dictionary reporting object class, properties, children, and allowed methods.
lom_enumsA

Query member names and integer values for Live enum types.

Args:
    type_name: Dotted Live enum name (e.g. 'Song.Quantization'). Omit to list enum types.

Returns:
    Dictionary of enum member names and mappings.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
catalog_resourceReturn JSON string of entire LOM path catalog with status and metadata.
session_resourceReturn JSON string snapshot of running Live session state.
limits_resourceReturn system limits specification and documentation reference.

Latest Blog Posts

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/ableton-maestro'

If you have feedback or need assistance with the MCP directory API, please join our Discord server