ReaperMCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REAPER_MCP_PROFILE | No | Defines the tool profile: full (default), composition, mixing, analysis, or minimal. | full |
Capabilities
Features and capabilities supported by this server
| 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 |
|---|---|
| demo_edm_projectA | Scaffold a minimal EDM test project with 7 tracks, ReaSynth on each, and 8 bars of MIDI. Use this to verify Tracks created: Kick Drum, Snare, Closed Hat, Sub Bass, Pad, Lead Synth, Vocal Chop. Each gets REAPER's stock ReaSynth (always available) + a simple 8-bar pattern. Args: clean_first: Wipe existing MIDI + markers first (default True). bpm: Project BPM (default 140 — matches melodic_dubstep's half-time feel). |
| envelope_get_pointsA | Read automation points from a track or FX parameter envelope. Track envelopes: "Volume", "Pan", "Mute", "Width", "Volume (Pre-FX)", "Pan (Pre-FX)", "Width (Pre-FX)". For FX param envelopes: pass Args: track_index: Track. envelope_name: Named track envelope (ignored if fx_index+param_index set). fx_index: FX slot index, -1 to target track envelope instead. param_index: FX parameter index, -1 to target track envelope instead. max_results: Cap on returned points (default 2000, prevents context blow-up). |
| envelope_add_pointsA | Batch-insert automation points into an envelope. Point shape codes: 0=linear, 1=square, 2=slow start/end, 3=fast start, 4=fast end, 5=bezier. Tension -1 to +1 for curve skew. Value units:
Args:
track_index: Track.
points: JSON array of |
| envelope_clear_rangeA | Delete all envelope points in a time range. Args: track_index: Track. start_time: Range start in seconds (>= 0). end_time: Range end in seconds (> start_time). envelope_name: Track envelope name. fx_index / param_index: Target FX param envelope (-1 for track env). |
| fx_addA | Add FX plugin to track. Prefer setup_fx_chain for batch operations. Args: track_index: 0-based track index. fx_name: Plugin name (e.g. "ReaEQ", "ReaComp"). |
| fx_removeB | Remove FX from track chain. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. |
| fx_get_chainC | Get FX chain for a track (names, enabled, presets, param counts). Args: track_index: 0-based track index. |
| fx_get_paramsA | Get all parameters of an FX plugin (names, values, formatted display). Automatically filters out junk params (Internal, MIDI CC, unused FabFilter bands) to keep context size small. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. |
| fx_set_paramA | Set FX parameter by index. Prefer setup_fx_chain for batch operations. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. param_index: 0-based parameter index. value: 0.0-1.0 normalized. |
| fx_set_param_by_nameA | Set FX parameter by name (fuzzy match). Args: track_index: 0-based track index. fx_index: 0-based FX chain index. param_name: Parameter name or partial match. value: 0.0-1.0 normalized. |
| fx_enableA | Enable an FX plugin. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. |
| fx_disableB | Bypass an FX plugin. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. |
| fx_show_uiA | Open FX plugin UI window. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. |
| fx_get_presetA | Get current preset name and count. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. |
| fx_set_presetB | Load preset by name. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. preset_name: Preset name. |
| fx_navigate_presetB | Step to next/previous preset. Args: track_index: 0-based track index. fx_index: 0-based FX chain index. direction: 1=next, -1=previous. |
| fx_get_instrumentA | Find VSTi instrument on track. Returns index + params, or -1 if none. Args: track_index: 0-based track index. |
| fx_moveA | Move FX to different position in chain. Args: track_index: 0-based track index. fx_index: Current FX index. new_index: Target position. |
| fx_renameA | Rename an FX instance's display label (cosmetic — plugin unchanged). Use to tag FX you've added yourself so later cleanup can find them without affecting other FX on the track. The mix engine uses this internally to prefix all its additions with "[MIX] ". Args: track_index: 0-based track index. fx_index: FX slot within the chain. new_name: New display name. Max 1000 characters. Requires REAPER 6.37+ (for TrackFX_SetNamedConfigParm with "renamed_name"). Older REAPER versions will error out cleanly. |
| fx_list_installedA | List every FX plugin installed in REAPER, grouped by category. Uses REAPER's EnumInstalledFX API. Returns:
Use this BEFORE running mix pipelines to know what the user has. If the user has premium plugins (FabFilter, Waves, iZotope, Valhalla, Softube, etc.), prefer those over REAPER stock. Args: category: Optional — filter output to a single category: "eq", "compressor", "limiter", "reverb", "deesser", "gate", "saturator", "multiband", "stereo". Empty returns full inventory. |
| set_fx_preferencesA | Save user FX preferences — per-category plugin overrides. Stored at Args:
preferences: JSON object mapping categories to plugin names, e.g.
Categories: eq, compressor, limiter, reverb, deesser, gate, saturator,
multiband, stereo. Plugin names must match what REAPER
reports (check |
| item_get_allB | Get all media items. Filter by track or -1 for all. Args: track_index: Track filter (-1=all). |
| item_get_infoC | Get detailed info for one item. Args: item_index: Item index. |
| item_selectB | Select/deselect an item. Args: item_index: Item index. selected: True=select. exclusive: Deselect others first. |
| item_splitC | Split item at position. Args: item_index: Item index. position: Split point in seconds. |
| item_deleteC | Delete an item. Args: item_index: Item index. |
| item_moveB | Move item to new position. Args: item_index: Item index. new_position: New start in seconds. |
| item_set_lengthC | Set item length. Args: item_index: Item index. length: Length in seconds. |
| item_set_volumeA | Set item volume in dB. Args: item_index: Item index. volume_db: dB (0=unity). |
| item_set_muteB | Mute/unmute item. Args: item_index: Item index. mute: True=mute. |
| item_set_fadeA | Set fade in/out. -1=unchanged. Args: item_index: Item index. fade_in: Seconds, 0 or more (-1=keep, max 60s). fade_out: Seconds, 0 or more (-1=keep, max 60s). |
| item_insert_mediaB | Insert audio/MIDI file into track. Args: track_index: Target track index. path: Absolute file path. position: Insert position in seconds. |
| item_create_midiA | Create an empty MIDI item on a track. Returns the item's global index. Args: track_index: 0-based track index. position: Item start time in seconds (>= 0). length: Item length in seconds (> 0). |
| item_move_to_trackC | Move item to different track. Args: item_index: Item index. dest_track_index: Destination track index. |
| scan_audio_folderA | Walk a folder for audio loops and parse metadata from filenames. Returns every audio file (.wav, .mp3, .flac, .aif, .aiff, .ogg, .m4a)
with BPM, musical key, and role (kick / bass / pad / lead / fx / …)
extracted from the filename. Plus a Args:
path: Absolute folder path (e.g., Returns a structure with:
Files without parseable metadata are still listed; their fields
are null. Pair with |
| detect_common_bpmA | Given a JSON array of file paths, return the most common BPM parsed from their filenames. Useful after Args: file_paths: JSON array of absolute paths. Returns: detected_bpm: the most common value (int), or None if none found. bpm_votes: full distribution of BPMs across the set. confidence: fraction of files that agreed with the winner. hint: a one-line next-step suggestion. |
| load_loopsA | Batch-load audio loops into REAPER, auto-creating tracks by name. For each entry in the JSON array, find the named track (or create it if missing) and insert the audio file at the given position. Optionally sets the project BPM first so the loops align with the grid. Args: loops: JSON array of entries. Each entry is an object with: - track_name (required): name of the destination track. Case-sensitive match against existing tracks; if no match, a new track is created with this name. - file_path (required): absolute path to the audio file. - position_sec (optional, default 0.0): start position in seconds within the project. project_bpm: If > 0, call transport_set_bpm before inserting media so the project's tempo grid is correct. Returns a summary with tracks created vs reused, loops loaded, and per-entry errors (missing files, invalid entries) so the AI can recover without blowing up the whole batch. |
| marker_get_allB | Get all markers and regions. |
| marker_addA | Add marker. Prefer add_markers_batch for multiple. Args: position: Seconds. name: Label. color_r: Red 0-255. color_g: Green 0-255. color_b: Blue 0-255. |
| marker_add_regionB | Add region. Prefer add_markers_batch for multiple. Args: start: Start seconds. end: End seconds. name: Label. color_r: Red 0-255. color_g: Green 0-255. color_b: Blue 0-255. |
| marker_deleteA | Delete marker/region. Args: marker_index: Index from marker_get_all. |
| marker_editA | Edit marker/region. Args: marker_index: Marker index. position: New seconds, must be >= 0, or -1 to keep current position. name: New name (None=keep). |
| marker_go_toB | Move cursor to marker. Args: marker_number: 1-based marker number. |
| midi_insert_noteA | Insert single note into existing item. For composing use compose_arrangement. Args: item_index: MIDI item index. channel: 0-15. pitch: 0-127 (60=C4). velocity: 1-127. start_position: Start seconds. end_position: End seconds. |
| midi_insert_notes_batchA | Batch-insert notes into a MIDI item. Primary tool for writing MIDI. Args:
track_index: 0-based track index.
item_index: MIDI item index on that track.
notes: JSON array of |
| midi_get_notesA | Get notes in a MIDI item (capped at max_results to limit context size). Args: item_index: MIDI item index. max_results: Max notes to return (default 500, hard ceiling 10000). Use midi_count_events for total count first if unsure. |
| midi_set_noteA | Edit existing note. -1 keeps current value. Args: item_index: MIDI item index. note_index: Note index in item. pitch: 0-127 (-1=keep). velocity: 1-127 (-1=keep). start_position: Seconds (-1=keep). end_position: Seconds (-1=keep). channel: 0-15 (-1=keep). |
| midi_delete_noteC | Delete a note. Args: item_index: MIDI item index. note_index: Note index. |
| midi_select_notesA | Select/deselect all notes in item. Args: item_index: MIDI item index. select_all: True=select, False=deselect. |
| midi_delete_all_notesB | Clear all notes from a MIDI item. Args: item_index: MIDI item index. |
| midi_insert_ccA | Insert single CC event. For composing use cc_curves in compose_arrangement or rewrite_cc. Args: track_index: 0-based track index. item_index: MIDI item index. channel: 0-15. cc_number: 0-127. cc_value: 0-127. position: Seconds. |
| midi_delete_ccB | Delete a CC event. Args: item_index: MIDI item index. cc_index: CC event index. |
| midi_get_note_namesA | Get MIDI note number to name mapping (C4=60, etc.). |
| midi_count_eventsB | Count notes, CCs, and sysex events in item. Args: item_index: MIDI item index. |
| midi_sortC | Sort MIDI events by time. Args: item_index: MIDI item index. |
| midi_set_item_extentsC | Set MIDI item boundaries in quarter notes. Args: item_index: MIDI item index. start_qn: Start in quarter notes. end_qn: End in quarter notes. |
| create_drum_patternA | Create a drum pattern from step-sequencer shorthand. Each line of Example — standard 16-step rock beat: Defaults: 16 steps per bar = 1/16-note grid. Returns the item index and number of notes inserted. |
| create_chord_progressionA | Insert a chord progression as voiced MIDI notes. Accepts chords separated by commas, pipes, dashes, or newlines:
Supported qualities: maj, m/min, dim, dim7, aug, sus2, sus4, 6, m6, 7, m7, maj7, add9, 9, m9, maj9, 11, m11, 13, m13.
Pass Returns the item index, number of chords placed, and any that failed to parse. |
| setup_parallel_compressionA | Create a NY-style parallel compression bus and route source tracks to it. Classic use: crush drums or vocals with a heavy compressor on a parallel bus, then blend the crushed signal back in subtly with the dry. Adds perceived density and power without destroying transients. Args: source_tracks: JSON array of track indices to send to the parallel bus, e.g. "[0,1,2]". bus_name: Display name for the created bus track. send_db: Send level from each source to the bus (0 = unity). return_db: Bus output (return) level. -8 is a typical subtle blend. threshold_db: Compressor threshold. -24 to -30 for heavy crush. ratio: Compression ratio. 10:1 or higher for that "smashed" sound. attack_ms: Fast (1-3 ms) for tight pumping. release_ms: Medium (80-120 ms) typical. |
| setup_drum_busA | Group drum tracks into a dedicated bus with a glue compressor. This is a lighter-touch version of parallel compression — the bus is a full sub-mix of the drums, with gentle comp gluing them together rather than crushing them. Use this to control the drum group's overall level and apply shared processing (additional EQ, saturation) above it. Args: source_tracks: JSON array of drum track indices, e.g. "[0,1,2,3]". bus_name: Display name for the drum bus. return_db: Bus output level (0 = unity, no change vs pre-bus). glue_threshold_db: Glue comp threshold (-10 to -14 typical). glue_ratio: Glue comp ratio (1.5-2.5 for gentle glue). |
| setup_vocal_chainA | One-call vocal-chain setup: HP + compressor + tonal EQ + plate reverb send. Creates (or reuses) a dedicated plate reverb bus and sends the vocal track to it. Designed to give a polished broadcast-ready vocal with one call. Chain applied in order on the vocal track:
Args: track_index: Track to process. hp_freq: High-pass cutoff in Hz. comp_threshold_db / comp_ratio: Compression settings. air_boost_db / mud_cut_db / harsh_cut_db: EQ amounts in dB. plate_bus_name: Bus track name (reused if exists). plate_send_db: Send level from vocal to the plate bus. |
| bounce_stemsA | Render the given tracks as individual audio stems (in-project). Selects the tracks, then invokes REAPER's "Render tracks to stereo stem tracks" action (command ID 40892). Resulting stems are added to the project as new tracks. IMPORTANT SIDE EFFECTS (undocumented by REAPER, confirmed by behavior):
Requires REAPER 5.x or newer. For export to audio files on disk, use
Args: track_indices: JSON array of track indices to stem, e.g. "[0,1,2]". output_dir: Reserved (not currently used — in-project stemming). format: Reserved (not currently used). |
| project_get_infoA | Get project info (name, BPM, time sig, tracks, length, markers, render settings). |
| project_newA | Create a new empty REAPER project. Returns the new project info. |
| project_openB | Open .rpp project file. Args: path: Absolute path to .rpp file. |
| project_saveA | Save the current project. Returns project info confirming the save. |
| project_save_asC | Save project to new path. Args: path: Absolute .rpp path. |
| project_export_audioC | Render project to audio file. Args: path: Output file path. format: wav, mp3, ogg, flac, or aiff. |
| project_undoC | Undo last action. |
| project_redoA | Redo last undone action. |
| project_get_notesB | Get the project notes/description text. |
| project_set_notesB | Set the project notes/description text. Args: notes: The text to set as project notes (max 100 KB). |
| project_set_gridA | Set grid division (1.0=quarter, 0.5=eighth, 0.25=sixteenth). Args: grid_division: Grid size in quarter notes. |
| midi_quantizeA | Quantize notes in a MIDI item to a time grid. Grid math: for 120 BPM, a 16th note = 0.125s, 8th = 0.25s, quarter = 0.5s. At tempo T: grid_sec = (60 / T) * (4 / divisor). For 140 BPM 16ths: (60/140) * (4/16) = 0.107s. Args: item_index: Global item index of the MIDI item. grid_seconds: Grid spacing in seconds (see above). strength: 0.0 (no quantize) to 1.0 (hard snap). 0.5 = pull halfway. |
| midi_humanizeA | Add random timing + velocity jitter to all notes in a MIDI item. Makes programmed MIDI feel less mechanical. Typical values:
Args: item_index: Global item index of the MIDI item. timing_ms: Max random shift in milliseconds (each note ±timing_ms). 0 = off. velocity_amount: Max random velocity offset (each note ±amount). 0 = off. |
| project_set_ripple_modeA | Set REAPER's ripple edit mode. In ripple mode, editing one item shifts everything after it (per-track or across all tracks). Critical for dialogue/podcast editing. Args: mode: 0=off, 1=per-track ripple, 2=all-tracks ripple. |
| selection_set_timeC | Set time selection. Args: start: Start seconds. end: End seconds. |
| selection_get_timeB | Get current time selection. |
| selection_set_loopC | Set loop points. Args: start: Start seconds. end: End seconds. |
| selection_select_all_itemsA | Select all items. |
| selection_deselect_all_itemsA | Deselect all media items. |
| selection_select_all_tracksC | Select all tracks. |
| selection_deselect_all_tracksA | Deselect all tracks. |
| selection_get_selected_tracksA | Get a list of all currently selected tracks with their info. |
| selection_get_selected_itemsA | Get a list of all currently selected media items with their info. |
| send_createA | Create send between tracks. Prefer setup_routing for batch. Args: source_track: Source track index. dest_track: Destination track index. |
| send_removeB | Remove a send. Args: track_index: Source track index. send_index: Send index. |
| send_get_allC | Get all sends/receives on a track. Args: track_index: Track index. |
| send_set_volumeB | Set send volume. Args: track_index: Source track. send_index: Send index. volume_db: dB (0=unity). |
| send_set_panC | Set send pan. Args: track_index: Source track. send_index: Send index. pan: -1.0 to 1.0. |
| send_set_muteA | Mute/unmute send. Args: track_index: Source track. send_index: Send index. mute: True=mute. |
| send_get_routing_diagramA | Get full project routing diagram (sends, receives, outputs). |
| setup_sidechainA | Set up sidechain compression: source pumps/ducks the target. Creates an aux send from source→target on channels 3/4, sets the target track to 4 channels, finds-or-adds a compressor on the target, pin-maps channels 3/4 to the compressor's sidechain input pins, and configures the compressor for pumping character. Use cases:
Args: source_track: Track whose signal drives the ducking (e.g. kick). target_track: Track that gets ducked (e.g. pad, bass). amount: 0.0 (subtle) to 1.0 (heavy pumping). Defaults to 0.7. Translates to threshold/ratio if those are not explicit. attack_ms: Comp attack. Fast (2-10ms) = tight pump. Default 5. release_ms: Comp release. 80-250ms for classic EDM pump. Default 180. ratio: Compression ratio. 0 = derive from amount. Typical 4:1 to 10:1. threshold_db: Threshold in dB. 0 = derive from amount. Typical -15 to -30. compressor_name: "ReaComp" (default), "FabFilter Pro-C 2", or any loaded compressor. fx_index: Use an existing FX by index on the target. -1 = find-or-add by name. send_db: Aux send level in dB (drives how hard the compressor reacts). 0 = unity. Returns: {success, send_index, fx_index, compressor_name, threshold_db, ratio, ...} |
| item_take_listA | List all takes on an item with their active status. Useful for vocal comping (multiple vocal passes as separate takes on one item) or alternate MIDI performances. Args: item_index: Global item index. |
| item_take_set_activeA | Switch which take plays back on an item. Args:
item_index: Global item index.
take_index: 0-based take index (from |
| item_take_addB | Add a new empty take to an item. Returns the new take's index. Args: item_index: Global item index. |
| item_take_delete_activeA | Delete the currently active take from an item. To delete a non-active take, first call Args: item_index: Global item index. |
| track_template_saveA | Save a track's full state (FX chain, sends, volume/pan/color, automation) as a named template on disk. Templates are stored at Args:
track_index: 0-based track index to save.
name: Template name (letters/digits/space/ |
| track_template_applyA | Apply a saved template to a track — replaces its FX chain + settings. Args:
name: Template name (from |
| track_template_listA | List all saved track templates. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/xDarkzx/Reaper-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server