reaper-mcp
This MCP server enables AI assistants to control a live REAPER DAW instance, including transport, tracks, FX, MIDI, media, markers, rendering, and project state, with an escape hatch for arbitrary ReaScript commands.
README
reaper-mcp
An MCP server that lets Claude drive a live, running REAPER DAW instance -
transport control, tracks, FX/plugins, MIDI, media items, markers, view/zoom,
rendering, and project state - plus a run_reascript escape hatch for
anything not covered by a dedicated tool.
Unlike file-parsing REAPER integrations, this talks to REAPER while it's running, and includes an engineer-style discovery layer that finds your REAPER install(s), the running REAPER process (with PID), and whether the bridge is actually reachable - so failures are diagnosable, not silent.
Architecture
Claude <--stdio--> reaper-mcp (Python, uv) <--file-based IPC--> reaper_bridge.lua (inside REAPER) --> reaper.* API
The Python server writes one JSON request file per call into a bridge
directory; reaper_bridge.lua picks it up on its next reaper.defer() tick
(REAPER's UI frame rate, so ~16-33ms round trips) and writes a JSON response
back. No REAPER extensions are required - this uses only the standard
io/os Lua libraries and the reaper.* API, both built into vanilla
ReaScript. See docs/ARCHITECTURE.md for details.
Requirements
- uv (Python package/venv manager)
- REAPER (tested on 6.x/7.x) - nothing else. No extensions to install.
Setup
- From this repo's root, run:
This runsbuild_and_run.batuv sync, copieslua/reaper_bridge.luainto your REAPERScriptsfolder, and starts the MCP server over stdio. - In REAPER: Actions -> Show action list -> New action -> Load ReaScript...,
select
reaper_bridge.lua, then Run it. You should see[reaper_mcp] reaper_bridge starting, watching ...in REAPER's console (Extensions -> ReaScript console). Right-click the action and choose "Run on startup" if you want the bridge always live. - Point Claude Code (or Claude Desktop) at the server. Example
.mcp.json/claude_desktop_config.jsonentry:{ "mcpServers": { "reaper": { "command": "uv", "args": ["--directory", "<path-to-this-repo>", "run", "reaper-mcp"] } } }
Testing it end to end
- Open REAPER and load+run
reaper_bridge.luaas described above (step 2 in Setup). Confirm the console printed the "watching ..." line. - Confirm the bridge is actually reachable, independent of the MCP
server, with the CLI diagnostics command:
With REAPER open and the bridge script running,uv run reaper-mcp --statusbridge_reachableshould betrueandrunning_processesshould list REAPER's PID. If it'sfalse, the bridge script either isn't loaded/running in REAPER, or REAPER's resource path doesn't match what was detected - checkbridge_dirin the output against the folder the.luafile actually got copied to. - Run the batch file if you haven't already:
It's stdio-based, so once started it just waits for an MCP client - that's expected, not a hang.build_and_run.bat - Wire it into Claude using the
.mcp.json/Claude Desktop config snippet above, then restart Claude Code/Desktop. - Exercise it from Claude: ask it to call
reaper_statusfirst (sanity check), then something with a visible effect in REAPER, e.g. "add a track named Test" (track_add) or "play" (transport_play), and confirm REAPER actually reacts.track_listis a good read-only check if you want to confirm state without changing anything.
If a tool call errors with "bridge heartbeat not found or stale", the bridge script isn't currently running in REAPER (REAPER was closed, the script was stopped, or it crashed) - reload/rerun it via the Actions list.
Tool overview
| Domain | Examples |
|---|---|
| Status | reaper_status, install_bridge, reaper_info |
| Transport | transport_play/stop/pause/record/seek/set_tempo/get_state |
| Tracks | track_add/remove/rename/set_volume_db/set_pan/set_mute/set_solo/set_color/list |
| FX | fx_add/remove/set_enabled/list/set_param/get_param |
| MIDI | midi_add_item, midi_add_note |
| Items | item_split/move/glue_selected/render_in_place_selected |
| Markers | marker_add, region_add |
| View | view_zoom_to_selection, view_scroll_to, view_set_arrange_zoom |
| Project | project_save, project_undo |
| Render | render_project |
| Escape hatch | run_reascript(code) - arbitrary ReaScript Lua |
Development
uv sync --group dev
uv run pytest
License
Licensed under the MIT License.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.