Streetlight
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., "@StreetlightCreate 8 impact variations from the selected item"
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.
Streetlight
Streetlight is an open-source REAPER agent kernel.
The first goal is deliberately small: let any MCP-capable agent control REAPER through safe, typed, testable, undoable operations. Game audio is the first official workflow pack, not the limit of the system.
What It Does
Streetlight exposes a compact tool surface for agents:
inspect the current REAPER project state
import and arrange audio
create variations for selected items
apply common game-audio edits such as pitch, rate, reverse, trim, fades, regions, and renders
run tested Lua templates instead of asking an LLM to invent ReaScript from scratch
expose capabilities with schemas, risk levels, logs, and verification
The intended first workflow:
Select or provide a source sound, ask an agent for impact/weapon/UI/foley variations, then let Streetlight create edited items, regions, and rendered WAV files in REAPER.
Related MCP server: ReaMCP
Why This Shape
LLMs are useful at planning sound design work, but unreliable when they freely write REAPER Lua. Streetlight keeps the creative planning in the agent and moves DAW manipulation into tested templates with explicit schemas.
That gives the project three useful properties:
agent-neutral: works with Codex, Claude Code, Cursor, or any MCP client
REAPER-native: uses ReaScript and the user's local REAPER installation
extensible: new workflows can be added as templates and recipes without rebuilding the whole app
How To Run The Impact-Variations Demo
This is the v0.1 acceptance demo: from one selected media item, Streetlight produces 8 named variations on a new track, wraps each in a region, and renders them to 8 WAV files.
Prerequisites
Before the first run, confirm each of these — a miss here is the usual cause of a demo that fails partway through with a typed error.
First-time install on this Mac: double-click install.command, or run
npm install && npm run build && npm run setup from the repo root.
Then register the generated launcher in REAPER (Actions → Show action
list → ReaScript: Load... →
~/Library/Application Support/REAPER/Scripts/Streetlight/start_bridge.lua)
and copy the snippet from setup-out/<your-client>.* into your MCP
client config. Windows has install.cmd / install.ps1 as an
experimental convenience path, but v0.1 live verification is macOS.
Full details in docs/INSTALL.md; cross-Mac
reproducer in docs/CROSS_MAC_SMOKE.md.
REAPER 7.x is running with the Streetlight bridge loaded. The console (
View → Show console) showsbridge ready (generation N) — templates: …. See docs/INSTALL.md."Render in background" is ON.
REAPER → Preferences → Audio → Rendering → "Render in background (does not apply to queued renders)"checked. Required forrender_region— see INSTALL.md § Requirements.Pick a FRESH or empty output directory (e.g.
~/Desktop/streetlight-demo/). Must be absolute (Lua'sio.opendoes not expand~— use the resolved path, e.g./Users/you/Desktop/streetlight-demo/). The directory must exist and be writable; the demo refuses to overwrite existing files (OUTPUT_FILE_EXISTS).Pick a FRESH project, or at minimum confirm no existing regions are named
var_01..var_08. The demo creates regions with those names; a collision surfacesREGION_NAME_TAKENand stops the run.Select exactly one media item in REAPER — this is the source the variations are derived from. The recipe binds that item's GUID up front and reuses it for every duplicate; the agent is instructed to abort before any mutating call if the initial selection count is not exactly 1.
MCP server is registered with your agent client (Codex / Claude Code).
pingshould round-trip in under a second.
The Prompt
In your MCP-capable agent, send:
Use Streetlight to make 8 impact variations from the selected item.
First call list_recipes and follow impact_variations step by step,
rendering all 8 WAVs to /absolute/path/to/your/output_dir.Substitute the absolute path you confirmed in prerequisite #3.
What Should Happen
one new track named
Streetlight - Impact Variationsappears8 items duplicated from the source land on that track (
var_01..var_08), each with the recipe's pitch/rate/fade applied8 regions wrap those items
8 WAV files appear in your output directory, named
var_01.wav..var_08.wav(24-bit PCM, project sample rate, stereo)the output directory contains exactly those 8 WAVs and nothing else — in particular, no
<region>.wav.RPP/<region>.wav.RPP-bakproject-copy sidecars. v0.1 enforces this WAV-only artifact contract through guarded cleanup, not REAPER-config suppression: before each renderrender_regionrefuses to start if a.wav,.wav.RPP, or.wav.RPP-bakalready exists at the target (typedOUTPUT_FILE_EXISTS), and after a successful render it deletes any sidecar REAPER auto-wrote alongside the WAV. (Config-var suppression was ruled out in Step 7 —reaper.set_config_var_stringis absent on stock REAPER 7.71/macOS-arm64; see PROGRESS.md for the post-mortem.) A.RPPor.RPP-baksidecar showing up in the output dir means the guarded-cleanup contract regressed; report it.the agent reports back the 8 file paths and the per-variation parameters
Total wall-clock on typical hardware: under 3 minutes.
Cmd+Z walks back the project changes one template at a time (about 30 steps
to fully revert items, tracks, and regions). The rendered WAV files on disk
are not part of the project state and are not removed by undo.
If It Stops Partway
Recoverable errors the agent will see and can usually retry past:
OUTPUT_DIR_MISSING/OUTPUT_DIR_NOT_WRITABLE— fix prerequisite #3OUTPUT_FILE_EXISTS— choose a fresh output dir or delete oldvar_*.wavREGION_NAME_TAKEN— fresh project, or delete oldvar_01..var_08regionsBRIDGE_NOT_RUNNINGonrender_region— usually means "Render in background" is OFF; see prerequisite #2
list_recipes is a doc — Streetlight does NOT execute the recipe for you.
The agent reads the YAML and issues one call_template per step. If you'd
prefer to drive the loop yourself, the templates and parameters are all
listed in recipes/impact_variations.yaml.
Architecture
MCP-capable agent
Codex / Claude Code / Cursor / future desktop UI
|
v
streetlight-mcp
typed tools and schemas
|
v
streetlight-core
operation validation, templates, recipes
|
v
streetlight-bridge.lua
runs inside REAPERSee docs/ARCHITECTURE.md for the full v0.1 specification.
See docs/KERNEL_DESIGN.md for the longer foundation design and analogies behind the kernel model.
MVP
The MVP is one polished loop, not a feature catalog:
connect an MCP agent to a running REAPER session
read selected items and project context
create 6-10 usable variations from one source sound
place variations on tracks with clear names
create regions
render WAV files to an output folder
return a structured report of what changed
See docs/MVP.md.
For the concrete file-by-file build plan, see docs/IMPLEMENTATION_PLAN.md.
For the render mechanics that the MVP demo lives or dies on, see docs/RENDER_NOTES.md.
Roadmap
See docs/ROADMAP.md for what should wait until after the first reliable workflow.
Internal planning, rough strategy, and private notes should live outside this public repository.
Non-Goals For v0.1
standalone desktop UI
semantic sound library search
Wwise integration
ElevenLabs or other generation services
automatic SWS/ReaPack installation
universal DAW support
unrestricted remote code execution
License
TBD before first public release.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/hexingyuofficial/streetlight-reaper-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server