Postfader
An AI copilot for FL Studio
Inspect a running project, measure your bounces, and make verified mixer and plug-in changes — from Claude or any MCP client.
Setup · Tools · Plug-ins · Architecture · Security
A local Model Context Protocol server and MIDI bridge for FL Studio 2026 on macOS. Reads are always available. Writes are off until you turn them on, and every one of them is read back from FL Studio and reported honestly.
An illustration of the shape of a session — not a captured transcript:
You: the vocal is fighting the synth around 3k
Client: → fl_list_mixer_tracks reads the mixer and its routing
→ audio_analyze_masking measures the overlap between two bounces
→ fl_set_track_eq cuts one EQ band on one track
verified: true
Why another FL Studio MCP server
FL Studio accepts scripted writes and then silently ignores some of them. Most
connectors report the write as sent. Postfader reads the control back on a later
idle tick and tells you verified: true or verified: false — and treats a
false as the headline of the result, not a footnote.
A write does repeat its setter call within its own attempt, because FL drops a lone one — but a write that comes back unproven is never replayed for you, a write that landed is never rolled back, and where FL's own undo cannot be relied on the response says so instead of assuming.
| Verified writes | Every change is read back from FL and reported |
| Read-only by default | Writes need a flag set on the FL Studio process itself |
| Narrow on purpose | 24 tools, each with a defined contract, not a generic API bridge |
| No plug-in database | Parameters are discovered at runtime; nothing to add per plug-in |
| Hermetic tests | 582 checks with a fake FL API — no DAW, no MIDI device, no user audio |
Status
A macOS-only beta, validated on Apple silicon with FL Studio 2026 Producer Edition 26.1.3 build 5336, MIDI scripting API 44, and Python 3.10 or newer. Other FL Studio editions and Intel Macs may work but are not currently validated; Windows is not supported by this release.
This repository contains no user-created FL Studio projects, recordings, stems, samples, presets, mix exports, or session-derived evidence. Its three audio fixtures are deterministic and generated by a script in the repository.
What it provides
The server exposes 24 MCP tools:
- 10 inspection tools for capabilities, project and transport state, Playlist selection observations, mixer tracks and routing, loaded effects, and bounded plug-in parameter maps.
- 10 opt-in write tools for mixer volume, pan, mute, name, built-in EQ, sends, send levels, and plug-in parameters by normalized value, displayed number, or option text.
- 4 audio tools for file analysis, reference comparison, vocal/instrument masking measurements, and recent-bounce discovery.
The FL Studio scripting API exposes controls but no live audio buffers. Audio tools therefore operate on files you explicitly export or record to disk.
Safety model
Writes are disabled by default. When enabled, mutating tools apply changes immediately to the open FL Studio project. Readback verifies whether a control moved; it is not an automatic rollback, and FL may not create a usable undo point. Work on a copy until you trust the workflow.
The write surface is intentionally narrow:
- Each write states one absolute target rather than nudging or toggling.
- FL Studio is read back on a later idle tick and the result reports
verified: trueorverified: false. - Mixer track 0 (Master) is refused unless
allow_masteris explicitly true. - Each write requests an undo point and reports whether one was observed.
- The bridge never calls
saveProject; changes can still be saved later by FL Studio or by the user. - Writes are absent from the active bridge allowlist unless FL Studio itself
was launched with
FL_BRIDGE_ENABLE_WRITES=1.
fl_set_plugin_param_option must sweep an enumerated control to discover the
available option text because FL Studio exposes no enumeration API. Do not use
write tools while recording or on irreplaceable material.
Plug-in compatibility
There is no supported-plug-in list and no per-plug-in profiles: parameters are discovered at runtime, so a plug-in needs no support added for it. What varies is how much of a large parameter map a bounded scan can see, and whether FL reports a given control at all. See Plug-in support for those bounds, how to raise them, and how to add your own plug-in to the validated-against table.
Requirements
- macOS with CoreMIDI and an enabled IAC Driver bus
- FL Studio 2026 version 26.1.3 build 5336 or newer
- MIDI scripting API 44 or newer
- Python 3.10 or newer
- An MCP-compatible client
Launch FL Studio once before installing so its user settings folders exist.
Install
Two paths. Both put the same bridge in the same place — scripts/install.sh
calls the same installer the console command does, so they cannot drift.
From PyPI, if you just want to use it:
pip install postfader-fl-studio-mcp
postfader-install-bridge
From a clone, if you want the test suite and the validation scripts:
git clone https://github.com/synopsys0/postfader-fl-studio-mcp.git
cd postfader-fl-studio-mcp
./scripts/install.sh
If FL Studio's user-data folder is somewhere other than
~/Documents/Image-Line/FL Studio, say so — every entry point honours it:
postfader-install-bridge --user-data-dir "/absolute/path/to/FL Studio"
FL_STUDIO_USER_DATA_DIR="/absolute/path/to/FL Studio" ./scripts/install.sh
Then, in FL Studio:
-
Open Audio MIDI Setup → Window → Show MIDI Studio.
-
Open IAC Driver, enable Device is online, and apply the change.
-
In FL Studio, open Options → MIDI settings → Input.
-
Select the IAC port, enable it, and set Controller type to
Universal Bridge. Note the Port number it is given. -
In the same dialog, under Output, select the same IAC port and give it the same Port number. The bridge replies over MIDI, so it refuses to start without this and Script output will say so.
-
Open View → Script output and press Reload script. The output should end with
ready: MIDI SysEx. -
Verify the installation:
postfader-doctor
From a clone,
./.venv/bin/python scripts/doctor.pyruns the same checks, and./scripts/inspect_readonly.py --capabilitiesprints what the server can currently see.
See Setup and usage for detailed client configuration and troubleshooting.
MCP client configuration
The installer writes a .mcp.json inside this checkout, with relative
paths. That is deliberately the narrow case: it works when your client is
launched from the connector directory, and it is the quickest way to try the
server. It is not how you would normally live with it.
Using it from your own projects
To reach FL Studio while working anywhere else, register the server once at user scope with absolute paths. For Claude Code:
claude mcp add fl-studio --scope user \
--env FL_BRIDGE_ENABLE_MIDI=1 \
-- /absolute/path/to/postfader-fl-studio-mcp/.venv/bin/python \
-m fl_studio_mcp.mcp_server
--scope user is the part that matters: a project-scoped entry only loads
inside the directory it belongs to, which is why the installer's .mcp.json
does not follow you around. Substitute your real checkout path — the venv
interpreter must be named absolutely, because a relative command resolves
against wherever the client happened to start.
For a client with no CLI, put the same absolute-path block in whichever config file that client treats as global rather than per-project:
{
"mcpServers": {
"fl-studio": {
"command": "/absolute/path/to/postfader-fl-studio-mcp/.venv/bin/python",
"args": ["-m", "fl_studio_mcp.mcp_server"],
"cwd": "/absolute/path/to/postfader-fl-studio-mcp",
"env": {
"FL_BRIDGE_ENABLE_MIDI": "1"
}
}
}
}
Do not assume that an MCP client expands ~ or shell variables in JSON paths;
write them out in full. .mcp.json.example in this repository shows the same
shape with relative paths, for the launched-from-the-checkout case only.
The Python distribution is postfader-fl-studio-mcp. The import path remains
fl_studio_mcp, the console command remains fl-studio-mcp, and the MCP
server ID is fl-studio.
Only one process can own the IAC port at a time, so if you register the server at user scope, close any project-scoped copy of it first.
Enabling writes
Quit FL Studio, then launch it from Terminal with:
FL_BRIDGE_ENABLE_WRITES=1 open -a "FL Studio 2026"
The bridge reads this variable once when its script loads. In write mode,
ping reports bridge_mode: "write_test" and
verified_writes_enabled: true. Launch FL Studio normally to return to its
read-only mode. Do not put FL_BRIDGE_ENABLE_WRITES in the MCP server's
environment; it must be present in the FL Studio process.
Important limitations
- The bridge cannot insert, remove, or reorder plug-ins.
- FL Studio's scripted per-slot bypass and wet/dry setters are not reliable on the validated host and are not exposed as MCP tools.
- The bridge cannot render or access live audio; audio analysis requires a file on disk.
- Playlist selection endpoints are returned as raw observations and are marked unsafe for automated rendering.
- Unprofiled plug-in parameters are readable, but the bridge does not claim to know their musical meaning or whether a target value is appropriate.
- Readback verifies observed control movement, not audible correctness.
- The local IAC transport is shared and unauthenticated, and only one bridge client can own it at a time.
See FL Studio constraints for the technical details.
Privacy and security
The MCP server and bridge run locally and implement no telemetry or hosted service. Your MCP client may send tool arguments and results to its model provider; review that client's privacy policy.
Audio measurement tools can read an absolute audio-file path supplied by the MCP client. Results include measurements, a canonical path, and a file hash, but not the audio samples themselves. Recent-bounce discovery searches a bounded set of FL Studio output folders. Run the bridge only with a trusted MCP client on a trusted, single-user Mac. See SECURITY.md for the complete trust model.
Documentation
- Setup and usage
- Tool and command reference
- Plug-in support
- Architecture
- FL Studio constraints
- Security policy
- Contributing
Development
Run the hermetic safe suite with:
./.venv/bin/python scripts/run_safe_tests.py
The safe suite uses a fake FL API and deterministic synthetic audio. It does not require FL Studio, a MIDI device, a user project, or user audio, and it does not touch the physical IAC bus.
Non-affiliation
FL Studio is a trademark of Image-Line Software. Postfader is an independent, unofficial project and is not affiliated with, endorsed by, or sponsored by Image-Line Software. FL Studio is not distributed with this repository.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file postfader_fl_studio_mcp-0.10.0.tar.gz.
File metadata
- Download URL: postfader_fl_studio_mcp-0.10.0.tar.gz
- Upload date:
- Size: 282.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3df9239b466663aa2b096772b0368c6566bb53953aa72af2e2ca2e25518d466b
|
|
| MD5 |
c8ccb73b83aa2110450578e15be3b2fa
|
|
| BLAKE2b-256 |
31f754cc3331afed040db7fcc32a5f0699f32de2735a83c4363dd8641232aef8
|
Provenance
The following attestation bundles were made for postfader_fl_studio_mcp-0.10.0.tar.gz:
Publisher:
release.yml on synopsys0/postfader-fl-studio-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
postfader_fl_studio_mcp-0.10.0.tar.gz -
Subject digest:
3df9239b466663aa2b096772b0368c6566bb53953aa72af2e2ca2e25518d466b - Sigstore transparency entry: 2429164208
- Sigstore integration time:
-
Permalink:
synopsys0/postfader-fl-studio-mcp@c441ce3adec9082bedebf62288b755ce21ca966d -
Branch / Tag:
refs/tags/v0.10.0 - Owner: https://github.com/synopsys0
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c441ce3adec9082bedebf62288b755ce21ca966d -
Trigger Event:
push
-
Statement type:
File details
Details for the file postfader_fl_studio_mcp-0.10.0-py3-none-any.whl.
File metadata
- Download URL: postfader_fl_studio_mcp-0.10.0-py3-none-any.whl
- Upload date:
- Size: 120.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e346042fb19fc0f11dd8c0c562c7b140c237d60ac7a959e6ced04e518cb3606e
|
|
| MD5 |
494fa8ec7b89c62864f322997ffd4efb
|
|
| BLAKE2b-256 |
1d73f8ce27e5c54ab168ebaf07c0419e01b5b98ada77635d5ab7c079fa312e81
|
Provenance
The following attestation bundles were made for postfader_fl_studio_mcp-0.10.0-py3-none-any.whl:
Publisher:
release.yml on synopsys0/postfader-fl-studio-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
postfader_fl_studio_mcp-0.10.0-py3-none-any.whl -
Subject digest:
e346042fb19fc0f11dd8c0c562c7b140c237d60ac7a959e6ced04e518cb3606e - Sigstore transparency entry: 2429164251
- Sigstore integration time:
-
Permalink:
synopsys0/postfader-fl-studio-mcp@c441ce3adec9082bedebf62288b755ce21ca966d -
Branch / Tag:
refs/tags/v0.10.0 - Owner: https://github.com/synopsys0
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c441ce3adec9082bedebf62288b755ce21ca966d -
Trigger Event:
push
-
Statement type: