reaper-mcp-bridge
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REAPER_MCP_BRIDGE_DIR | No | The bridge data directory (where the Lua bridge script and Python server exchange <id>.req.json / <id>.res.json files). By default it lives at <REAPER resource path>/Scripts/reaper_mcp_bridge_data. To relocate it, set REAPER_MCP_BRIDGE_DIR in both the environment REAPER starts from and the env block of your MCP client config. Resolution order: env REAPER_MCP_BRIDGE_DIR > locator file > platform default. |
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 | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pingA | Health check: confirm the REAPER bridge is running. Returns {pong: true, time: } on success. |
| reaper_evalA | Execute arbitrary Lua inside REAPER. The |
| bridge_statusA | Print the bridge directory the Python side is using. Useful when diagnosing setup issues (it must match the Lua side). |
| get_project_infoA | Get an overview of the current REAPER project: file path, sample rate, length in seconds, play state, track count, region count, marker count, time selection. Call this first to orient yourself. |
| list_tracksA | List all tracks with index, name, volume (dB), pan (-1..1), mute, solo, record arm, color (RGB or 0 if none), item count, FX names. |
| list_regionsB | List all regions in the project: {index, name, start_sec, end_sec, color_rgb}. |
| list_markersA | List all markers (not regions): {enum_index, index, name, time_sec, color_rgb}. |
| save_project_asB | Save the current project to a specific path (.rpp). Creates parent dirs if needed. |
| new_projectA | Create a brand-new empty project in a new tab and switch to it. Does NOT save the previous project. |
| add_trackA | Add a new track. |
| delete_trackC | Delete a track by 0-based index. |
| rename_trackC | Rename a track. |
| set_track_volume_dbB | Set track volume in dB. Use -150 for -inf (silent). 0 = unity. Typical mix range: -60..+12. |
| set_track_panC | Set track pan. -1.0 = full left, 0 = center, 1.0 = full right. |
| set_track_muteC | Mute or unmute a track. |
| set_track_soloC | Solo or unsolo a track. |
| set_track_record_armC | Arm or disarm a track for recording. |
| set_track_colorA | Set track color. r/g/b each 0..255. Use r=g=b=0 to clear (revert to default). |
| set_track_folder_depthA | Set folder structure depth for a track. 1 = this track starts a folder, 0 = normal (default), -1 = end of one folder, -2 = end of two folders, etc. Use this to group tracks: e.g. set depth=1 on a 'Drums' track and depth=-1 on the last child. |
| select_tracksA | Select tracks by index list (replacing any previous selection). Pass [] to clear selection. |
| playA | Start playback from the edit cursor. |
| stopB | Stop playback or recording. |
| recordB | Start recording on all armed tracks. |
| set_cursorC | Move the edit cursor to |
| set_time_selectionC | Set the time selection (loop range) in seconds. |
| clear_time_selectionC | Clear the time selection. |
| split_items_at_timeA | Split every item that crosses |
| move_selected_itemsB | Shift the position of all currently selected items by |
| set_selected_item_fadesA | Set fade-in and fade-out (seconds) on every selected media item. Pass -1 for either to leave it unchanged. |
| glue_selected_itemsA | Glue (consolidate) currently selected items. Each contiguous group on a track becomes one item. Useful after a lot of editing. |
| set_record_inputB | Set the record input for a track. |
| select_items_on_trackA | Select items on a track by index range. Pass start=-1, end=-1 to select all items on the track. |
| insert_midi_itemB | Insert an empty MIDI item on a track, spanning [start_sec, end_sec]. Returns the item index on the track. |
| insert_midi_notesA | Insert MIDI notes into an existing MIDI item. Each note: {pitch: 0..127, start_qn: float, length_qn: float, velocity?: 1..127 (default 96), channel?: 0..15 (default 0)}. Positions are quarter-notes relative to the item start. |
| create_chord_progressionA | Convenience: build a chord progression on a track from scratch. Creates a MIDI item and writes one chord per entry. |
| quantize_midi_itemA | Quantize note positions in the active MIDI take of the item at (track_index, item_index) to |
| add_fxA | Add an FX plugin to a track. |
| remove_fxB | Remove an FX from a track by FX index. |
| list_fxA | List FX on a track with their parameters. Each entry: {index, name, enabled, num_params, params: [{index, name, value, value_normalized, min, max}]}. Set |
| set_fx_paramB | Set an FX parameter. |
| set_fx_enabledC | Bypass / enable an FX on a track. |
| set_master_volume_dbB | Set master track volume in dB. 0 = unity. |
| render_with_current_settingsA | Trigger a render using REAPER's current render-dialog settings (non-interactive — no UI popup). Useful if the user has already configured the render dialog. |
| renderA | Render to a directory with the given bounds and file pattern. |
| get_render_settingsA | Get the current render settings: bounds flag, output file/dir, pattern, sample rate, channels. |
| batch_rename_itemsA | Rename items on a track in order. |
| batch_rename_regionsB | Rename ALL regions in the project in time order. Pattern tokens: $num (1-based, zero-padded to pad_width), $idx, $name (original name). |
| batch_export_regionsB | Render every region in the project to its own file. Uses the project's currently-configured render FORMAT (configure it once in REAPER's Render dialog, then this just changes bounds + output dir + pattern). |
| normalize_loudnessA | Normalize the perceived loudness of items by adjusting each item's volume (D_VOL). Doesn't modify audio data. |
| apply_templateA | Build a track layout from a template. |
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 50 tools
Most tools target distinct resources or actions, with clear separation between track, item, MIDI, FX, and render operations. However, the render family (render, render_with_current_settings, batch_export_regions) and the reaper_eval catch-all slightly overlap with typed tools, and ping/bridge_status both serve diagnostic purposes.
Nearly all tools use consistent snake_case with predictable verb_noun patterns (set_track_volume_db, list_tracks, add_fx). A few bare verbs (play, stop, record, render, ping) and new_project deviate slightly, but the overall convention is coherent and readable.
50 tools is an extreme mismatch for a single MCP server; many granular setters (set_track_mute, set_track_solo, set_track_pan, etc.) could be merged into a unified update_track operation. The rubric explicitly flags 50+ tools as requiring a score of 1.
The surface covers core lifecycle operations for projects, tracks, regions, MIDI, FX, rendering, and batch processing, with reaper_eval providing an escape hatch for anything missing. Typed gaps remain for item-level CRUD (delete/copy/trim items), automation envelopes, sends, and tempo/meter, which will force agents to use eval for common tasks.