Enables comprehensive MIDI manipulation in REAPER, allowing for the creation of MIDI items, batch-editing of notes, and management of CC, pitch-bend, and program-change events.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ReaMCPCreate a new track named 'Vocals' and set the project tempo to 120 BPM"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ReaMCP
ReaMCP is a Reaper MCP for controlling and editing projects in your DAW. Connect this to agentic editors like Claude Desktop, VS Code or Zed to make use of the querying and editing tools in Reaper.
This project is currently in its alpha stage. Keep a backup your projects and report any issues you find. This is tested using Linux but I'd like to make it compatible with all operating systems.
How this differs from similar projects
There are a few other REAPER MCP servers. Here's how they compare:
dschuler36/reaper-mcp-server — Read-only, file-based. Parses .rpp project files directly from disk and does audio analysis on rendered files. No live REAPER connection — REAPER doesn't need to be open. Good for querying existing projects and mix feedback, but can't create or change anything.
itsuzef/reaper-mcp — Live connection via OSC or ReaPy (Python-in-REAPER). OSC is limited to transport and basic fader control; the ReaScript mode is more capable but requires configuring Python inside REAPER. Only a handful of tools (create track, add MIDI note, get project info).
This project — Live connection via a persistent Lua bridge script running inside REAPER, communicating over a local TCP socket. No OSC setup, no Python DLL wiring. Exposes the full reaper.* Lua API surface, giving a much broader and more reliable toolset: full MIDI editing, FX chain management, automation, sends, markers, media item manipulation, and more.
What it does
Read project and track state
Create, duplicate, and delete tracks and media items
Move and resize media items on the timeline
Create MIDI items; read, insert, modify, and delete MIDI notes, CC, pitch bend, and program change events; batch-edit and humanize notes
Insert audio files onto tracks
Control transport and cursor position
Add, list, and remove FX (including on the master track); read/write FX parameters; bypass/enable FX; load presets by name with case-insensitive fallback enumeration
Read and set tempo/time signature and project parameters
Save the project and trigger undo
Add, list, and delete markers and regions
Open project files by path
Create, remove, and adjust track sends (volume and pan)
Set track recording input and input monitoring mode
Read and insert automation envelope points; clear envelopes; insert beat-aligned points
Copy and repeat time ranges (duplicate chorus, extend outro, etc.)
Render a time range to an audio file
Measure loudness (LUFS integrated, short-term, momentary, true peak) for individual tracks or the master mix via non-destructive dry-run render
Normalize track volume to a target LUFS level in one call
Requirements
REAPER (with ReaPack)
Python 3.10+
Setup
1) Install the Python server
pip install -e . # You can also `uv sync` but it's not supported.2) Install mavriq-lua-sockets in REAPER and restart
REAPER's embedded Lua cannot load stock LuaSocket builds in this context. Install mavriq-lua-sockets via ReaPack:
REAPER → Extensions → ReaPack → Import repositories
Add
https://github.com/mavriq-dev/public-reascripts/raw/master/index.xmlREAPER → Extensions → ReaPack → Browse packages
Install mavriq-lua-sockets
Restart REAPER
3) Install and run the bridge script via ReaPack
REAPER → Extensions → ReaPack → Import repositories
Add
https://github.com/danielkinahan/ReaMCP/raw/main/index.xmlREAPER → Extensions → ReaPack → Browse packages
Install ReaMCP Bridge
Run it once via Actions → Show action list → ReaMCP Bridge
Confirm REAPER console shows
Listening on 127.0.0.1:9001Optional: add it to startup actions so it auto-runs on launch
You may also run this manually via Actions -> ReaScript: Run ReaScript (EEL2 or Lua)... and selecting the lua script from this repo.
4) Start the MCP server
python -m reaper_mcpOptional environment variables:
Variable | Default | Description |
|
| Bridge host |
|
| Bridge port |
MCP tools
Tool | Description |
| Verify bridge is reachable |
| Project metadata/state |
| Loop range, cursor, loop-enabled |
| Save the current project to disk |
| Trigger REAPER undo |
| Open a |
| List all tracks |
| Get one track by 0-based index |
| Insert a track |
| Delete a track |
| Duplicate a track (inserts copy after original) |
| Set name/volume/pan/mute/solo/arm |
| Set recording input (audio channel or MIDI) |
| Set input monitoring mode (off/on/not when playing) |
| Move a media item to a new timeline position |
| Change the length of a media item |
| Remove a media item from a track |
| Get position, length, pitch, playrate, etc. of an item |
| Duplicate a media item on its track |
| Create a MIDI item with optional pre-populated notes |
| Read all MIDI notes from a MIDI item |
| Modify an existing MIDI note (pitch, velocity, position, etc.) |
| Delete a MIDI note by index |
| Insert a CC, pitch-bend, or program-change event |
| Insert an audio file at a time position |
|
|
| Add FX/instrument to a track |
| List FX chain entries on a track |
| List all installed FX plugins; optional |
| List all FX parameters |
| Set FX parameter (normalized |
| Enable or bypass an FX plugin |
| Remove an FX from the chain |
| Load a named FX preset; falls back to index-scan with case-insensitive matching. Use |
| List factory and file-based presets for a plugin already on a track |
| Read BPM and time signature |
| Set BPM and optional time signature |
| Set |
| Add a marker or region |
| List all markers and regions |
| Delete a marker or region by enum index |
| Create a send from one track to another |
| Remove a track send |
| Set send volume and pan |
| Read all automation envelope points |
| Insert an automation envelope point |
| Remove all points from an envelope |
| Insert an automation point aligned to a musical beat position |
| List all media items on a track with position, length, and take info |
| Batch-edit multiple MIDI notes in one call |
| Humanize all notes in a MIDI item with random timing and velocity offsets |
| Copy all items in a time range and paste them N times after the selection |
| Render a time range to an audio file using REAPER's render pipeline |
| Measure integrated loudness (LUFS), short-term/momentary max, and true peak for a single track via non-destructive dry-run render |
| Same as above but for the full master mix |
| Measure track loudness and adjust the fader to hit a target LUFS level (default -14 LUFS) |
Limitations
Preset loading — set_fx_preset first tries TrackFX_SetPreset (works for plugins with a standard VST/CLAP program bank), then falls back to enumerating all presets by index with case-insensitive name matching via TrackFX_SetPresetByIndex. This covers most plugins. File-based presets (.ffp, .fxp) can be loaded by passing the absolute file path as preset_name. Use list_fx_presets to discover available factory and file presets.
MCP client configuration
VS Code (.vscode/mcp.json)
{
"servers": {
"reaper": {
"type": "stdio",
"command": "./.venv/bin/python",
"args": ["-m", "reaper_mcp"]
}
}
}Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"reaper": {
"command": "/path/to/venv/bin/python",
"args": ["-m", "reaper_mcp"]
}
}
}Config file location:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Zed (~/.config/zed/settings.json)
{
"context_servers": {
"reaper": {
"command": {
"path": "./.venv/bin/python",
"args": ["-m", "reaper_mcp"]
}
}
}
}ReaPack package in this repo
index.xml ships the bridge script (bridge/reaper_mcp_bridge.lua) as a ReaPack package so users can install and auto-update it directly from REAPER.
Architecture
MCP client (AI / IDE)
│ stdio
▼
Python MCP server ──── JSON-RPC over TCP (127.0.0.1:9001) ────► bridge/reaper_mcp_bridge.lua
(src/reaper_mcp/) └─ reaper.* Lua API (inside REAPER)The Python process is a standard mcp server. REAPER control happens through a persistent Lua bridge script running inside REAPER.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.