fl-studio-mcp
An MCP server that connects Claude to FL Studio, enabling natural language control of transport, mixer, channel rack, and piano roll operations.
README
fl-studio-mcp
An open-source MCP server that connects Claude (Claude Desktop or Claude Code) to Image-Line FL Studio. Ask Claude in plain language to start playback, set the tempo, gain-stage your mixer, program drum patterns, write chord progressions into the piano roll, or audit your mix for clipping.
Built by sorkthropic. MIT licensed.
How it works
FL Studio has no external API — only two Python environments inside it:
| Environment | Runs | Can touch |
|---|---|---|
MIDI device scripts (device_*.py) |
continuously | transport, mixer, channels, patterns, general |
Piano roll scripts (.pyscript) |
on demand from the piano roll menu | notes, markers, score |
So this project bridges the gap with files + a virtual MIDI cable:
Claude ──MCP──▶ fl-studio-mcp server
│ 1. writes ~/.fl-studio-mcp/request.json
│ 2. sends MIDI CC 110 through the virtual cable ("doorbell")
▼
FL Studio device script (device_FLStudioMCP.py)
│ 3. reads the request, calls the FL Studio Python API
│ 4. writes ~/.fl-studio-mcp/response.json
▼
fl-studio-mcp server reads the response ──▶ Claude
Piano roll edits are special: FL Studio only allows note editing from
on-demand piano roll scripts. Claude's note tools therefore queue the
notes to ~/.fl-studio-mcp/pianoroll_queue.json, and you apply them by
running Tools ▸ Scripts ▸ MCP PianoRoll inside the piano roll (one click;
undo works normally).
Note: the mailbox lives in
~/.fl-studio-mcp/rather than/tmpbecause/tmpdoesn't exist on Windows and temp paths can differ per process on macOS — the home folder is the one path both sides always agree on.
Setup
1. Install this package
git clone https://github.com/alansork/fl-studio-mcp
cd fl-studio-mcp
pip install -e . # or: uv sync
2. Create the virtual MIDI cable
Windows — loopMIDI
- Install loopMIDI.
- Open it and create a port named FL MCP (any name works; this one is auto-detected).
- Leave loopMIDI running — the port only exists while it runs.
macOS — nothing to do
The server creates its own virtual port named FL MCP automatically the first time it needs one. FL Studio lists it as an input while the server is running. (If you prefer an always-on port that exists even when the server is down, enable the IAC Driver in Audio MIDI Setup — Window ▸ Show MIDI Studio ▸ double-click IAC Driver ▸ tick Device is online — and it will be used instead.)
If auto-detection picks the wrong port, set the environment variable
FL_MCP_MIDI_PORT to (part of) the right port's name.
3. Install the FL Studio scripts
python3 install.py
This copies:
device_FLStudioMCP.py→.../FL Studio/Settings/Hardware/FLStudioMCP/MCP_PianoRoll.pyscript→.../FL Studio/Settings/Piano roll scripts/
and offers to register the server in Claude Desktop's config.
4. Wire it up inside FL Studio
- Restart FL Studio (it scans for scripts at startup).
- Options ▸ MIDI Settings.
- In the Input list, select your virtual port (FL MCP / loopMIDI / IAC).
- Set Controller type to FL Studio MCP Bridge and click Enable.
- You should see
FL Studio MCP Bridge v0.1.0 readyin the script output (View ▸ Script output).
5. Register with Claude
Claude Desktop — install.py can do this for you, or add manually to
claude_desktop_config.json:
{
"mcpServers": {
"fl-studio-mcp": {
"command": "uv",
"args": ["run", "--directory", "/path/to/fl-studio-mcp", "fl-studio-mcp"]
}
}
}
Claude Code:
claude mcp add fl-studio-mcp -- uv run --directory /path/to/fl-studio-mcp fl-studio-mcp
Then ask Claude: "Run fl_check_bridge_status" — it should report the MIDI port and FL Studio answering the ping.
Tools
Transport (transport_tools.py)
| Tool | What it does |
|---|---|
fl_play / fl_stop / fl_pause |
Playback control |
fl_set_tempo(bpm) |
Set tempo (10–520 BPM) |
fl_set_loop_mode(mode) |
"pattern" or "song" mode |
fl_toggle_record |
Arm/disarm recording |
fl_get_transport_state |
BPM, play/record state, song position |
Mixer (mixer_tools.py)
| Tool | What it does |
|---|---|
fl_get_mixer_summary |
Table of names, volumes, pans, mutes, colors |
fl_set_track_volume(track, volume) |
Fader (0–1; 0.8 = 0 dB) |
fl_set_track_pan(track, pan) |
Pan (-1 to 1) |
fl_mute_track(track, state) |
Mute/unmute |
fl_solo_track(track, mode) |
Solo with isolation options |
fl_set_track_name_color(track, name, hex) |
Label + color |
fl_route_track(source, target, enable) |
Bus/sidechain routing |
Channel rack (channel_tools.py)
| Tool | What it does |
|---|---|
fl_list_channels |
Channels + their mixer assignments |
fl_set_channel_pitch_pan_vol(...) |
Per-channel vol/pan/pitch |
fl_set_step_sequencer(channel, "1000100010001000") |
Program drum steps |
fl_assign_channel_to_mixer(channel, track) |
Route channel → insert |
fl_mute_channel(channel, state) |
Mute/unmute a channel |
Piano roll (pianoroll_tools.py) — queued; apply with the MCP PianoRoll script
| Tool | What it does |
|---|---|
fl_add_chord_progression("C", "major", ["I","V","vi","IV"], ...) |
Music theory → notes |
fl_add_notes([{pitch, start, length, velocity}, ...]) |
Arbitrary notes |
fl_quantize_piano_roll("1/16") |
Snap notes to a grid |
fl_clear_piano_roll |
Remove all notes (undoable) |
Diagnostics (diagnostic_tools.py)
| Tool | What it does |
|---|---|
fl_diagnose_mix |
Clipping / headroom / L-R imbalance report (run during playback) |
fl_get_project_info |
Tempo, PPQ, channel/pattern/track counts |
fl_check_bridge_status |
Health-check the whole bridge — run this first when debugging |
Development
Run the test suite (no FL Studio or MIDI hardware needed):
python3 -m unittest discover -s tests
Troubleshooting
| Symptom | Fix |
|---|---|
| "No virtual MIDI cable found" | Start loopMIDI (Win) / enable IAC (macOS); check FL_MCP_MIDI_PORT |
| "FL Studio did not respond" | FL open? Script enabled in MIDI Settings? Right input port? |
| Notes don't appear | Piano roll tools only queue — run Tools ▸ Scripts ▸ MCP PianoRoll |
fl_diagnose_mix shows all zeros |
Peaks are only measured during playback — press play first |
License
MIT © sorkthropic
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.