vcv-rack-mcp-server lets AI clients control a live VCV Rack 2 patch through a dedicated Rack module that exposes both HTTP and MCP endpoints. The screenshot above shows the MCP Server module running alongside a simple ambient drone patch created through the server and saved back to Rack.
Connect AI clients to VCV Rack 2 through a module that exposes Rack over HTTP and MCP.
With the MCP Server module loaded in a patch, an MCP client can inspect the patch, add modules, connect cables, set parameters, and save or load .vcv files.
The plugin adds one VCV Rack module:
MCP Server(RackMcpServer)
When the module is enabled, it starts a local server on 127.0.0.1 using the configured port (default 2600) and exposes:
POST /mcpfor MCP JSON-RPC requestsGET /statusand other REST endpoints for scripts and debugging
Typical uses:
- control a Rack patch from Claude Desktop, Cursor, or another MCP client
- script patch-building from the terminal
- inspect installed plugins and module slugs before creating patches programmatically
- save and load patches from automation tools
Claude Desktop / Cursor / any MCP client
|
| JSON-RPC 2.0 (POST http://127.0.0.1:2600/mcp)
v
MCP Server module inside VCV Rack
|
| Rack engine API
v
Current patch: modules, cables, params, save/load
The server only works while:
- VCV Rack is open
- the
MCP Servermodule is present in the patch - the module is switched on
Once the plugin is approved in the VCV Library:
- Open VCV Rack 2.
- Sign in to your VCV account.
- Open the Library and subscribe to
MCP ServerbyNeural Harmonics. - Restart Rack if needed.
- Add the module from the browser under
Utility.
- Open the GitHub Releases page.
- Download the
.zipfile for your platform. - Unzip it. You should get a folder named
VCVRackMcpServer. - Move that folder into your Rack 2 plugins folder:
macOS Apple Silicon: ~/Library/Application Support/Rack2/plugins-mac-arm64/
macOS Intel: ~/Library/Application Support/Rack2/plugins-mac-x64/
Linux x64: ~/.local/share/Rack2/plugins-lin-x64/
- Restart Rack and add the module from the browser.
If you are building from source and want the same installable artifact used on GitHub Releases:
make distThis creates a .zip archive in dist/, for example:
dist/VCVRackMcpServer-2.1.0-mac-arm64.zip
Unzip that file and move the extracted VCVRackMcpServer folder into your Rack plugins directory.
- Open VCV Rack 2.
- Create or open a patch.
- Add the
MCP Servermodule. - Leave the port at
2600unless you need a different port. - Toggle
ON/OFFuntil the status LED turns green. - Keep this patch open while your client connects.
The server will now listen at:
http://127.0.0.1:2600
If you want a quick smoke test, build this minimal patch:
Fundamental VCO -> Core AudioInterface2
- Start VCV Rack and add
MCP Server. - Turn the module on and confirm the LED is green.
- Add a
Core AudioInterface2module in Rack so audio has somewhere to go. - Configure your audio driver and output device manually in Rack if you have not done that already.
- Use one of the commands below to add a
Fundamental VCO. - Connect the VCO output to the left and right inputs on
AudioInterface2. - Lower your system volume before testing, then adjust the oscillator frequency to taste.
Using the included CLI helper, the flow looks like this:
python3 skills/vcvrack_client.py status
python3 skills/vcvrack_client.py library Fundamental
python3 skills/vcvrack_client.py library Core
python3 skills/vcvrack_client.py add Fundamental VCO
python3 skills/vcvrack_client.py add Core AudioInterface2
python3 skills/vcvrack_client.py modules
python3 skills/vcvrack_client.py connect <vco_id> 0 <audio_id> 0
python3 skills/vcvrack_client.py connect <vco_id> 0 <audio_id> 1A reliable workflow is:
Start Rack -> add MCP Server -> turn it on -> verify /status -> connect your AI client -> search library -> add modules -> inspect module IDs and params -> connect cables
Two practical rules matter a lot for AI-driven patch building:
- Rack edits are executed on Rack's UI thread. If Rack is busy, hidden behind a modal, or otherwise not stepping normally, MCP calls can time out even when the request is valid.
- Parameter values are often raw knob positions, not musical units. Always inspect a module's parameter metadata before trying to set "65 Hz", "200 ms", "saw", or similar concepts directly.
From a terminal:
curl -s http://127.0.0.1:2600/status | python3 -m json.toolYou should get a JSON response with sample rate and module count.
Ask the server what plugins and modules are installed:
curl -s "http://127.0.0.1:2600/library?q=oscillator" | python3 -m json.tool
curl -s "http://127.0.0.1:2600/library/Fundamental" | python3 -m json.toolThis is important because VCV Rack automation depends on exact plugin and module slugs.
Example: add a VCO and inspect its details.
curl -s -X POST http://127.0.0.1:2600/modules/add \
-H "Content-Type: application/json" \
-d '{"plugin":"Fundamental","slug":"VCO"}' | python3 -m json.tool
curl -s http://127.0.0.1:2600/modules | python3 -m json.tool
curl -s http://127.0.0.1:2600/modules/1 | python3 -m json.toolUse the returned module IDs when wiring cables or setting parameters.
Example requests:
curl -s -X POST http://127.0.0.1:2600/cables \
-H "Content-Type: application/json" \
-d '{"outputModuleId":1,"outputId":0,"inputModuleId":2,"inputId":0}' | python3 -m json.tool
curl -s -X POST http://127.0.0.1:2600/modules/1/params \
-H "Content-Type: application/json" \
-d '{"params":[{"id":0,"value":0.0}]}' | python3 -m json.toolImportant notes for parameter automation:
- Call
GET /modules/:id/paramsfirst and use the returnedname,min,max,value,displayValue, and optionaloptionsfields as the source of truth. - Do not assume parameter
0means frequency in Hz or that a value like65means 65 Hz. Many modules expose normalized or module-specific control ranges. - Prefer small
POST /modules/:id/paramsbatches, then read the params again to confirm the change before continuing. - If a write times out, first confirm Rack is responsive and the
MCP Servermodule is still enabled, then retry with a smaller step.
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, or the equivalent config path on your platform:
{
"mcpServers": {
"vcvrack": {
"type": "http",
"url": "http://127.0.0.1:2600/mcp"
}
}
}Then:
- restart Claude Desktop
- open VCV Rack with the
MCP Servermodule enabled - ask Claude to inspect or build a patch
Example prompts:
List the modules currently in my Rack patch.Search the installed Rack library for oscillators and add a good starting VCO.Build a simple subtractive synth with VCO, VCF, VCA, ADSR, and Audio.Build a simple ambient drone. Inspect each module's params before setting them, and treat displayed param values as authoritative instead of guessing in Hz.
If an MCP tool such as vcvrack_set_params reports a timeout:
- Make sure VCV Rack is still open, the patch is active, and the
MCP Servermodule LED is green. - Check that Rack is responsive and not blocked by a dialog, browser search field, menu, or file picker.
- Retry the workflow in this order:
vcvrack_get_status->vcvrack_get_module->vcvrack_get_params->vcvrack_set_params. - Write one or two params at a time and keep values inside the reported
minandmaxrange. - Re-read params after each write instead of assuming the model guessed the control mapping correctly.
Use the same server URL:
{
"servers": {
"vcvrack": {
"type": "http",
"url": "http://127.0.0.1:2600/mcp"
}
}
}This repo includes skills/vcvrack_client.py, a small Python CLI for talking to the local Rack server.
Check connectivity:
python3 skills/vcvrack_client.py statusCommand format:
python3 skills/vcvrack_client.py [--port PORT] <command> [args...]Common commands:
| Command | Example | What it does |
|---|---|---|
status |
python3 skills/vcvrack_client.py status |
Check server health |
modules |
python3 skills/vcvrack_client.py modules |
List modules in the patch |
module <id> |
python3 skills/vcvrack_client.py module 42 |
Inspect one module |
library |
python3 skills/vcvrack_client.py library |
List installed plugins |
library <plugin> |
python3 skills/vcvrack_client.py library Fundamental |
List modules in one plugin |
add <plugin> <slug> |
python3 skills/vcvrack_client.py add Fundamental VCO |
Add a module |
remove <id> |
python3 skills/vcvrack_client.py remove 42 |
Remove a module |
params <id> |
python3 skills/vcvrack_client.py params 42 |
List parameters |
set-param <id> <paramId> <value> ... |
python3 skills/vcvrack_client.py set-param 42 0 0.0 |
Set parameters |
cables |
python3 skills/vcvrack_client.py cables |
List cable connections |
connect <outMod> <outPort> <inMod> <inPort> |
python3 skills/vcvrack_client.py connect 1 0 2 0 |
Create a cable |
disconnect <cableId> |
python3 skills/vcvrack_client.py disconnect 7 |
Remove a cable |
Ready-made walkthroughs live in skills/examples/.
All responses use one of these envelopes:
{ "status": "ok", "data": ... }{ "status": "error", "message": "..." }| Method | Endpoint | Body / Query | Description |
|---|---|---|---|
GET |
/status |
- | Server info, sample rate, module count |
GET |
/modules |
- | List all modules |
GET |
/modules/:id |
- | Inspect one module |
POST |
/modules/add |
{plugin, slug, x?, y?, nearModuleId?} |
Add a module |
DELETE |
/modules/:id |
- | Remove a module |
GET |
/modules/:id/params |
- | List parameter values |
POST |
/modules/:id/params |
{params:[{id,value}]} |
Set parameters |
GET |
/cables |
- | List cables |
POST |
/cables |
{outputModuleId, outputId, inputModuleId, inputId} |
Create a cable |
DELETE |
/cables/:id |
- | Remove a cable |
GET |
/sample-rate |
- | Return sample rate |
GET |
/library |
?q=&tags= |
Search installed plugins/modules |
GET |
/library/:plugin |
- | List one plugin's modules |
POST |
/mcp |
JSON-RPC body | MCP endpoint |
GET |
/mcp |
- | SSE stream |
- CMake 3.21+ or GNU Make
- a C++17 compiler
curlorwgetif you use theMakefilepathjqandzipformake dist
make
make install
make distUse an existing Rack SDK if you already have one:
make RACK_DIR=/path/to/Rack-SDKcmake -B build
cmake --build build --parallel
cmake --install build- Update
plugin.jsonto the new version. - Commit and push.
- Build release artifacts or let CI build them.
- Create a GitHub release for that version.
If you tag releases from git, keep the tag aligned with plugin.json, for example:
git tag v2.1.0
git push origin v2.1.0For an open-source plugin, the normal path is through the VCVRack/library repository.
- Open an issue in
VCVRack/library. - Use the plugin slug as the issue title:
VCVRackMcpServer. - Include the source repository URL:
https://github.com/Neural-Harmonics/vcv-rack-plugin-mcp-server. - Wait for the maintainer to review and add the plugin.
- For later updates, comment on the same issue with the new version and commit SHA.
The metadata used for approval comes primarily from plugin.json, so keep its URLs, version, and module information current.
- The plugin controls the Rack patch, not Rack application settings.
- Audio driver and device selection still need to be configured manually in Rack.
- The server is local-only by default and intended for use on the same machine.
- Exact plugin/module slugs depend on what is installed in your Rack library.
MIT. See LICENSE.
This project also uses cpp-httplib, which is MIT-licensed.
