reaper-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REAPER_MCP_DEBUG | No | Set to 1 to enable Lua request log | |
| REAPER_MCP_IPC_DIR | No | Mailbox override (must match on both sides) | |
| REAPER_MCP_TIMEOUT | No | Default 10s | 10s |
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
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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 |
| 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 ( |
| 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 ( |
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
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.
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.
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.
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).