Skip to main content
Glama

messier-live

Agent-driven live sets in Ableton Live. An MCP server that gives an AI a real DJ rig: two decks over Session View, a beat clock it can actually hear, performance FX macros, and a crate that knows every track's BPM and key.

Spun out of KOTOPIA9X/kaios's kaios_music, stripped to the live-performance core.

Architecture

Claude / any MCP client
        │ MCP (stdio)
messier-live server (Python)
        │ TCP :9877 (commands)          UDP :9878 (telemetry, 10 Hz)
        ▼                                ▲
MessierLive Remote Script ── inside Ableton Live

Telemetry is the point: the Remote Script pushes transport, bar/beat, playing clips, and levels ten times a second, so the agent fires clips on the downbeat, crossfades in bars instead of seconds — and the same stream later feeds a website visualizer.

Related MCP server: Ableton Live MCP Ultra v2

Install

# 1. the server
pip install -e ".[analysis]"

# 2. the remote script
cp -r remote_script/MessierLive "~/Music/Ableton/User Library/Remote Scripts/"
# Ableton > Settings > Link/MIDI > Control Surface: MessierLive

# 3. register with Claude Code
claude mcp add messier-live -- messier-live

Prepare a set

# analyze your tracks (BPM, key -> Camelot, energy) into ~/.messier-live/crate.json
python -m messier_live.crate.analyze ~/Music/dj-crate

Build the Live set template — two deck tracks with an EQ Three and a PERF FX rack each (templates/README.md).

Tools

Layer

Tools

session

diagnose, live_status, get_session_info, play, stop, set_tempo, save_project

decks

setup_decks, deck_status, load_to_deck, fire_deck (bar-quantized), stop_deck, set_deck_volume, crossfade, eq_kill

fx

set_fx_macro, fx_sweep, fx_pulse, kill_all_fx, list_deck_devices, get_device_parameters, set_device_parameter

crate

crate_list, suggest_next_track (BPM ±8% + Camelot + energy), prepare_deck

A set, from the agent's side:

diagnose() → deck_status()
suggest_next_track(bpm=140, camelot="7A", energy_direction="up")
prepare_deck("B", "<file>", match_tempo=False)
crossfade(to_deck="B", bars=8)
fx_pulse("A", "Glitch", bars=1)   # on the way out
eq_kill("B", "low"); eq_kill("B", "low", restore=True)  # drop trick

See USAGE.md for the full manual: set prep, tagging, running sets, and the human/agent collaboration contract (touch detection, 16-bar ownership, modes).

Collaboration layer

Telemetry v2 reports every shared control (macros, EQ, faders, clips) at 10 Hz. The agent journals its own writes; unexplained drift = a human hand. Touched controls become human-owned (16 bars for FX/EQ/faders, until-stop for clips), all agent tools yield on them, and a fired clip re-routes the set plan through the human's choice. Modes: solo / copilot / crew.

Roadmap

  • WebSocket relay: rebroadcast telemetry + agent narration for a live website visualizer

  • Serum2 track: agent-composed stabs/risers between tracks

  • Preset hotswap (load_preset by name via browser API)

  • Recorded set replay logs (for the visualizer's offline mode)

  • Global set optimizer (current planner is greedy with lookahead-0)

Available Tools

25 tools
crate_listCrate ListB

List analyzed tracks in the crate (title, BPM, key, energy).

Inputs: limit. Returns: object

crossfadeCrossfadeA

Beat-synced crossfade: fire the incoming deck on the next bar, then ramp the incoming deck up and the outgoing deck down over bars bars.

Inputs: to_deck (required), bars, fire_incoming. Returns: object

deck_statusDeck StatusA

Current deck mapping, what's playing on each deck, and transport state.

Inputs: no named parameters. Returns: object

diagnoseDiagnoseA

Check both channels to Ableton: TCP command port and UDP telemetry.

Inputs: no named parameters. Returns: object

eq_killEq KillA

Kill (or restore) an EQ band on a deck. Needs an 'EQ Three' device on the deck track. band: low | mid | high.

Inputs: deck (required), band, restore. Returns: object

fire_deckFire DeckA

Fire a deck's clip. quantize='next_bar' waits for the downbeat via telemetry; 'global' fires immediately and lets Live's launch quantization align it.

Inputs: deck (required), quantize, clip_index. Returns: object

fx_pulseFx PulseC

Punch a PERF macro to intensity for N bars, then cut it — glitch rolls, echo stabs, one-bar granular washes.

Inputs: deck (required), macro (required), bars, intensity. Returns: object

fx_sweepFx SweepA

Ramp a PERF macro over N bars (a filter sweep, a building glitch, a riser). direction 'up' ramps 0→1, 'down' ramps 1→0. With release=True the macro snaps back to 0 at the end (classic build-and-drop).

Inputs: deck (required), macro (required), bars, release, +1 more. Returns: object

get_device_parametersGet Device ParametersA

Dump a device's parameter list (names, values, ranges) on a deck's track — for exploring a plugin (Serum2, Infiltrator, ...) before automating it.

Inputs: deck (required), device_index (required). Returns: object

get_session_infoGet Session InfoA

Full session snapshot from Live: tracks, clips, tempo.

Inputs: no named parameters. Returns: object

kill_all_fxKill All FxB

Zero all PERF-rack macros on a deck (clean slate). Works with renamed macros.

Inputs: deck (required). Returns: object

list_deck_devicesList Deck DevicesA

List devices (and their indices) on a deck's track, so FX tools can be pointed at the right rack/plugin.

Inputs: deck (required). Returns: object

live_statusLive StatusA

Realtime transport state from telemetry: playing, tempo, bar/beat, levels. Cheap — use this for 'where are we in the music' instead of get_session_info.

Inputs: no named parameters. Returns: object

load_to_deckLoad To DeckA

Load an audio file into a deck's clip slot (does not start playback).

Inputs: deck (required), file_path (required), clip_index. Returns: object

playPlayB

Start Live's transport.

Inputs: no named parameters. Returns: object

prepare_deckPrepare DeckA

Load a crate track onto a deck; with match_tempo=True also set Live's tempo to the track's analyzed BPM (use when starting a set, not mid-mix).

Inputs: deck (required), file_path (required), match_tempo. Returns: object

save_projectSave ProjectC

Save the current Live set.

Inputs: project_name. Returns: object

set_deck_volumeSet Deck VolumeA

Set a deck's fader (0.0–1.0, where 0.85 is 0 dB).

Inputs: deck (required), volume (required). Returns: object

set_device_parameterSet Device ParameterA

Set any raw device parameter by name on a deck's track (escape hatch when a macro doesn't cover it).

Inputs: deck (required), value (required), device_index (required), parameter_name (required). Returns: object

set_fx_macroSet Fx MacroC

Set a PERF-rack macro on a deck by name (e.g. 'Glitch', 'Space', 'Crush'). value 0.0–1.0.

Inputs: deck (required), macro (required), value (required). Returns: object

set_tempoSet TempoB

Set the session tempo in BPM.

Inputs: bpm (required). Returns: object

setup_decksSetup DecksA

Map decks A and B onto Session View track indices and persist the mapping.

Inputs: deck_a_track, deck_b_track. Returns: object

stopStopA

Stop Live's transport.

Inputs: no named parameters. Returns: object

stop_deckStop DeckC

Stop the clip playing on a deck.

Inputs: deck (required), clip_index. Returns: object

suggest_next_trackSuggest Next TrackA

Rank crate tracks that mix well next: BPM within ±8%, Camelot-compatible key, energy 'up' | 'down' | 'hold'. Give either the current file path or bpm+camelot.

Inputs: bpm, limit, camelot, current_file, +1 more. Returns: object

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 25 tools

    Disambiguation4/5

    Tools are mostly distinct: live_status is explicitly described as the cheap telemetry option versus get_session_info, and set_fx_macro, fx_sweep, and fx_pulse are differentiated as set/ramp/punch. Minor overlap exists between load_to_deck and prepare_deck, but descriptions clarify the intended use case.

    Naming Consistency4/5

    Most tools follow a predictable verb_noun snake_case pattern like set_fx_macro, fire_deck, and set_device_parameter. There are minor deviations with noun-style names like live_status, deck_status, and crate_list, plus bare verbs like play, stop, and diagnose, but the overall convention remains readable.

    Tool Count3/5

    At 25 tools, this is on the heavy borderline for an MCP server. The broad scope—transport, deck management, FX automation, device parameter control, and crate library—largely justifies each tool, but the set feels slightly bloated and some tools could plausibly be consolidated.

    Completeness4/5

    The core DJ performance workflow is well covered: transport, deck load/fire/stop, volume and crossfade control, FX sweeps and pulses, device parameter escape hatches, and crate-based track suggestions. Minor gaps exist such as no open_project, no direct crossfader position control, and limited non-deck track manipulation, but these do not block the primary use case.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables programmatic control of Ableton Live using natural language to manage session transport, tracks, MIDI clips, and device parameters. It also integrates ElevenLabs for AI-generated audio and provides a high-performance framework for real-time performance tools.
      16
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      Enables AI agents to control Ableton Live 12 for music production, including generating grooves, basslines, and percussion, and executing live set operations through MCP.
      3
      2
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to connect to Ableton Live, inspect the arrangement, compose and edit MIDI, manage tracks/scenes/clips, insert and tweak devices, and control the mixer.
      MIT