Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
REAPER_MCP_DEBUGNoSet to 1 to enable Lua request log
REAPER_MCP_IPC_DIRNoMailbox override (must match on both sides)
REAPER_MCP_TIMEOUTNoDefault 10s10s

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
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
statusA

Check the Lua bridge and return project tempo, play state, cursor_beats, tracks (selected=true on selected ones), time_selection {start_beats, end_beats} when there is one, selected_items [{track_index, item_index}], any_solo, master_mute and dirty (unsaved changes). Call first; clear a lingering solo before rendering. detail=true adds arrangement facts (time signature at the start, tempo_map of tempo/meter changes, length in beats, markers, MIDI vs audio per track) without guessing chords.

transportB

Playback control. action: play, stop, pause, record, toggle_repeat, goto_start, goto (edit cursor to position_beats, or to a marker/region by number or name; moves playback too when playing). Returns play_state, position_sec and position_beats.

trackB

Track operations. action: list | add | delete | update | bus. update uses name, volume_db, pan (-1..1), mute, solo. bus creates a submix named name and routes source_indices through it (their direct send to the master/parent is turned off).

midiB

MIDI on a track item. Times are absolute project beats. action: create_item | add | get | replace | update | delete | cc | get_cc. replace rewrites the whole take in one undo step; add only appends. cc inserts CC (cc+value) or program change (program) via ccs[]; get_cc reads CC, program and pitch_bend back in that shape. get omits index (use array offset), channel if 0, muted/selected if false.

fxB

Track FX. action: list | add | params | set | delete | bypass | move | preset. params takes filter (case-insensitive part of the parameter name) to list only matching ones. track_index -1 is the master. set takes value 0..1 (REAPER normalized) or formatted: the value as the plugin displays it (number in its unit, e.g. -18 for dB, 4 for 4:1, 120 for ms; or a label like "3.2k"), resolved by searching the display text. set returns the formatted value actually set.

sendB

Track sends. action: list | add | delete | update. track_index is the source (-1 master). dest_index is the destination track. add/update take volume_db, pan, mute, mode (post_fader | pre_fader | pre_fx) and channel routing: src_channel / dst_channel = first channel of the stereo pair, 0-based (dst_channel 2 = channels 3/4, a compressor's sidechain input; the destination's channel count is raised to fit).

itemA

Media items on a track. action: list | update | import | split | delete | duplicate. Times are beats except fade_in_sec / fade_out_sec (seconds, REAPER native). update: gain_db, fades and fade_*_shape, loop, mute, position_beats (move), length_beats (trim the end), left_edge_beats (trim or extend the start; the content stays in place), dest_track_index (move to another track; returns the new indices), active_take. list shows take name, source file and take count. split cuts at at_beats (inside the item) and returns the pieces' item_indices. delete takes item_index or item_indices. duplicate copies the item (unpooled) to position_beats (default: right after it), optionally on dest_track_index. import uses a path already on the REAPER host; as_new_track=true makes new tracks. Item indices follow position, so re-list after edits that move items.

envelopeA

Track envelopes. action: list | get | set. name is REAPER envelope name (Volume, Pan, Mute, ...). set replaces all points, or with start_beats / end_beats only the points in that range (ends included; every new point must lie inside it); get with a range returns only those points. value is the envelope's value; Volume is linear gain (1.0 = 0 dB, 0.5 = -6 dB), also on fader-scaled envelopes. unit=db reads/writes volume-type envelopes (Volume, Trim Volume, send Volume) in dB. set re-activates an envelope left inactive (ACT 0).

projectB

Project-level edits. action: tempo | time_signature | time_selection | marker | save. save with path creates missing folders and writes a copy (no dialog); an untitled project adopts that path. save without path needs an already-named project.

renderA

Render. No undo. Long timeout. bounds: project | time_selection | custom | items. Default: the master mix. stems=true renders the selected tracks as stems instead (pass track_indices to select them). path is the output folder; the file name comes from pattern. Sets all media online (action 40101) first unless media_online=false. Refuses when a target file already exists (REAPER's overwrite prompt would hang the bridge) and when tracks are soloed (pass allow_solo=true, or solo_indices / mute_indices to solo/mute tracks for this render only; they are restored afterwards). Returns files [{path, bytes, length_sec, peak_db, lufs_i}] and warnings (near-silent, missing file, master muted); measure=false skips the loudness scan. format wav (bit_depth 16 | 24 | 32 = float) or mp3 (320 kbps) sets the file type for this render only; without it the project's render format is used.

actionB

Run a REAPER Main_OnCommand by numeric command id.

reaper_callB

Call any ReaScript function by name. Pointers come back as {"__handle":"hN"} and can be passed back in. Example: func=CountTracks args=[0].

run_luaA

Run a Lua snippet inside REAPER (reaper in scope). Use return to send a value. Best for multi-step work that would otherwise be many round-trips. Errors carry the failing line. timeout (seconds, default 10, max 600): a snippet still running Lua after it is stopped with an error (what it did until then stays done); a call blocked inside REAPER (ExecProcess, a render, a dialog) can't be stopped. REAPER is frozen while it runs, so start long host commands in the background (io.popen('cmd > log 2>&1 &')) and poll instead.

batchA

Many operations in one IPC hop and one undo point. Each call is {func, args} or {func: 'run_lua', code, timeout} or {func, arguments} for a grouped tool name (track/midi/fx/...). Each slot is the inner result, or {error}. There is no rollback: by default one failure does not abort the rest; stop_on_error=true skips the slots after the first failure ({skipped: true}). Handles from earlier calls work later.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.5/5.0

Scored across 14 tools

Disambiguation3/5

Resource tools (track, item, midi, fx, envelope, send, project, transport, render) are mostly distinct, but four generic escape hatches—action, reaper_call, run_lua, and batch—all execute arbitrary commands and could easily be misselected. The descriptions offer guidance on when to use each, but the boundaries between 'run a Main_OnCommand', 'call a ReaScript function', 'run a Lua snippet', and 'batch these together' remain fuzzy.

Naming Consistency4/5

All names are lowercase snake_case and predominantly resource-oriented nouns, which makes the set readable and predictable. Minor deviations: a few generic names (action, status, batch) and a couple of verb forms (render, run_lua) break the pure noun convention.

Tool Count4/5

14 tools is within a reasonable scope for a DAW control server covering tracks, items, MIDI, FX, envelopes, sends, rendering, and project settings. The count is slightly inflated by redundant abstraction layers (action/reaper_call/run_lua/batch) that could arguably be consolidated.

Completeness4/5

Coverage is broad: arrangement state, transport, MIDI, FX, items, envelopes, sends, routing buses, project tempo/markers, rendering, and raw escape hatches. Minor gaps remain—no explicit undo/redo control, limited take management beyond active_take, and marker/region lifecycle is only partially exposed (creation via project, deletion unclear).

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues