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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。