fLMCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| fl_pingA | Report health of BOTH bridges. Returns: { "midi_bridge": {"online": bool, ...}, "piano_roll": {"installed": bool, ...}, "available_capabilities": [...], } |
| fl_reconnectA | Reset the bridge client (file-bus has no persistent connection, but this clears any client-side state and re-pings). |
| fl_bridge_infoB | Detailed info about the main bridge (fails if it's offline). |
| fl_call_rawB | Escape hatch: invoke any action the main bridge accepts with arbitrary params. |
| fl_test_mac_restrictionsA | Test which operations are blocked by FL Studio's macOS audit hook. FL Studio 2025 on macOS runs Python in a heavily-restricted sub-interpreter. This tool reports which operations are blocked (sockets, threads, subprocess, file I/O restrictions, etc.) and which are allowed. Returns a dict mapping operation names to status strings: "OK" = operation succeeded "BLOCKED: " = audit hook blocked the operation Expected on macOS: sockets, threads, subprocess, mkdir, unlink, rename = BLOCKED file_io = OK |
| transport_playA | Start or toggle playback (FL Studio's Play button). |
| transport_stopB | Stop playback. |
| transport_recordA | Toggle record arm state. |
| transport_statusA | Get is_playing, is_recording, position, loop mode, tempo, signature. |
| transport_set_positionB | Seek to a specific position in the song. |
| transport_song_lengthA | Return song length in ticks, seconds, ms, bars, steps. |
| transport_set_loop_modeA | Set FL Studio's song/pattern loop mode. |
| transport_set_playback_speedA | Set the playback speed multiplier (0.25..4.0). |
| transport_set_tempoA | Set the project tempo in BPM. Uses processRECEvent for proper undo history. |
| transport_tap_tempoA | Send a tap-tempo event (accumulates to set BPM). |
| transport_set_time_signatureB | Set project time signature (e.g. 4/4, 3/4, 7/8). |
| transport_toggle_metronomeA | Toggle metronome on/off. |
| transport_toggle_countdown_before_recordingB | Toggle 'countdown before recording'. |
| transport_jogA | Nudge playhead by |
| pattern_countA | Return total pattern count. |
| pattern_currentA | Return index + name of currently selected pattern. |
| pattern_listA | Return list of all patterns: [{index, name, color, length}]. |
| pattern_selectA | Jump to pattern by index (1-based in FL). |
| pattern_createA | Create a new empty pattern. Returns {index, name}. |
| pattern_renameB | Rename an existing pattern. |
| pattern_set_colorB | Set pattern color. Accepts '#RRGGBB' or 'rgb(r,g,b)'. |
| pattern_cloneC | Clone a pattern (copy all notes & channel grid bits). |
| pattern_deleteB | Delete a pattern by index. |
| pattern_set_lengthC | Set pattern length in bars. |
| pattern_find_by_nameA | Find a pattern by exact name (case-insensitive). Returns {index, name} or null. |
| pattern_jump_to_nextB | Select the next pattern in the list. |
| pattern_jump_to_previousA | Select the previous pattern in the list. |
| pattern_groupsA | List pattern groups (name + member pattern indices) and the active group. |
| pattern_burn_loopA | Burn the pattern's loop-recorded takes into editable note data (current pattern if index omitted). |
| channel_countB | Total channel count (global = across all groups). |
| channel_infoA | Detailed info on one channel: name/volume/pan/pitch/color/mute/solo/fx_route/type. |
| channel_allB | List of all channels with basic info. |
| channel_selectedB | Return currently selected channel (or null). |
| channel_selectB | Select channel (exclusive=True deselects others). |
| channel_set_volumeB | Set channel volume (0.0..1.0, where 0.78 ≈ 0 dB). |
| channel_set_panC | Set channel pan (-1.0..1.0). |
| channel_set_pitchA | Set channel pitch offset in semitones (-120..120). |
| channel_muteB | Mute / unmute / toggle (None = toggle). |
| channel_soloB | Solo / unsolo / toggle (None = toggle). |
| channel_set_nameC | Rename a channel. |
| channel_set_colorB | Set channel color. Accepts '#RRGGBB' or 'rgb(r,g,b)'. |
| channel_route_to_mixerC | Route a channel to a given mixer insert track. |
| channel_trigger_noteA | Trigger a one-shot MIDI note on the channel (live preview, not recorded). |
| channel_get_grid_bitB | Read a single step-sequencer bit (position is 0-based step within the pattern). |
| channel_set_grid_bitC | Set a single step-sequencer bit. |
| channel_get_step_sequenceB | Read the full step sequence for a channel (optionally for a specific pattern). |
| channel_set_step_sequenceB | Overwrite step sequence. |
| channel_clear_step_sequenceA | Clear all step-sequencer bits for the channel (in the current or specified pattern). |
| channel_quick_quantizeC | Quantize the channel's notes in the current pattern. |
| channel_get_step_paramsA | Read per-step graph-editor values for a channel in the current pattern. params: any of velocity, pan, shift, pitch, fine_pitch, release, mod_x, mod_y (default: velocity, pan, shift). Returns one row per active step. |
| channel_set_step_paramsA | Write per-step graph-editor values (velocity/pan/shift/etc.) — adds groove and dynamics beyond on/off grid bits. steps: list of {"step": N, "velocity": 0..127, "pan": 0..127 (64=center), "shift": ticks, "pitch": ..., ...}. Only provided keys are written. pattern defaults to the current pattern. |
| channel_get_activityA | Live activity/VU level per channel (all channels if index omitted). Useful during playback to confirm a channel is actually sounding. |
| mixer_countA | Number of mixer tracks (incl master @ index 0). |
| mixer_track_infoA | Detailed info on a mixer track (name, vol, pan, mute, solo, arm, color, stereosep, sends, fx slots). |
| mixer_all_tracksC | List of all mixer tracks. |
| mixer_set_volumeB | Set mixer track volume (0.0..1.0). |
| mixer_set_panA | Set mixer track pan (-1.0..1.0). |
| mixer_muteB | Mute / unmute / toggle (None = toggle). |
| mixer_soloC | Solo / unsolo / toggle. |
| mixer_armC | Arm track for recording. |
| mixer_set_nameC | Rename a mixer track. |
| mixer_set_colorA | Set mixer track color ('#RRGGBB' or 'rgb(r,g,b)'). |
| mixer_set_stereo_separationB | Set mixer track stereo separation (-1.0..1.0). |
| mixer_set_send_levelB | Set send level from one mixer track to another (0..1). |
| mixer_routeC | Enable or disable a mixer route (send) between two tracks. |
| mixer_fx_slotsA | List plugin IDs in the 10 FX slots of a mixer track (-1 = empty). |
| mixer_selectC | Focus / select a mixer track. |
| mixer_get_eqB | Return 3-band mixer EQ (gains + frequencies). |
| mixer_set_eq_bandA | Set one band of the mixer EQ. band=0|1|2 (low/mid/high). gain -1..1, freq 0..1 (normalised). |
| mixer_link_to_channelC | Link a channel to a mixer track. mode='replace'|'add'. |
| mixer_get_peaksA | Live peak levels (left/right, ~0..1, >1 = clipping) for one mixer track. Only meaningful while playing — start the transport first, poll during playback. Master is track 0. |
| mixer_all_peaksA | Live peak snapshot for every mixer track (master @ 0), for gain staging and clipping checks. Poll a few times during playback for a representative picture; silent tracks are omitted unless include_silent. |
| plugin_is_validB | Check if a plugin slot has a valid plugin loaded. |
| plugin_nameD | Plugin display name. |
| plugin_param_countC | Return number of automatable parameters. |
| plugin_paramsC | List parameters (paginated): [{idx, name, value, value_string}]. |
| plugin_get_paramC | Get value of a single parameter. |
| plugin_set_paramC | Set a single parameter (0.0..1.0 normalised). |
| plugin_find_paramC | Find a parameter by substring (case-insensitive). |
| plugin_preset_countC | Number of built-in presets for plugin. |
| plugin_next_presetC | Advance to the next preset. |
| plugin_prev_presetC | Go back to the previous preset. |
| plugin_set_presetC | Load preset by numeric index. |
| plugin_show_editorC | Show/hide the plugin editor window (None = toggle). |
| plugin_list_mixer_trackA | List all loaded plugins in every FX slot of a mixer track. |
| playlist_track_countC | Playlist track count. |
| playlist_track_infoB | Info on a playlist track: name, color, mute, solo, height, group. |
| playlist_all_tracksB | List of all playlist tracks. |
| playlist_set_track_nameC | Rename a playlist track. |
| playlist_set_track_colorB | Set playlist track color ('#RRGGBB'). |
| playlist_mute_trackC | Mute/unmute a playlist track. |
| playlist_solo_trackC | Solo a playlist track. |
| playlist_list_clipsA | List all clips in the playlist (optionally filter to one track). |
| playlist_place_patternB | Place a pattern clip on a playlist track at a given bar position. |
| playlist_delete_clipA | Delete the clip on a track starting at the given bar position. |
| playlist_refreshA | Force playlist repaint (use after bulk edits). |
| playlist_list_markersA | Return all timeline markers: [{pos_bars, name, mode}]. |
| playlist_add_markerC | Add a playlist marker. |
| playlist_delete_markerB | Remove a playlist marker by index. |
| playlist_track_activityA | Live activity level per playlist track during playback (all active tracks if track omitted) — confirms which lanes are actually sounding. |
| live_statusC | Performance-mode state; with a track, per-block clip status for it. |
| live_triggerA | Trigger a performance-mode live clip (playlist must be in performance mode). Default flags mute the previous clip on the track. |
| arrangement_currentA | Return current arrangement index + name. |
| arrangement_listA | List all arrangements. |
| arrangement_selectC | Switch to a different arrangement. |
| arrangement_jump_markerA | Jump playhead to next (+1) or previous (-1) marker within current arrangement. |
| arrangement_play_timeA | Get current playback time in ticks + bars + seconds. |
| arrangement_selectionA | Current timeline selection (start/end ticks; -1 start = no selection). |
| automation_record_tempoA | Record an automation ramp on the master tempo.
|
| automation_record_channel_volumeC | Record volume automation on a channel. |
| automation_record_channel_panC | Record pan automation on a channel. |
| automation_record_mixer_volumeC | Record volume automation on a mixer track. |
| automation_record_plugin_paramB | Record automation on a plugin parameter. |
| project_metadataB | Project snapshot: tempo, signature, tracks, channels, patterns, selected, title, path. |
| project_newB | Start a new project (optionally from a template path). |
| project_openC | Open an existing .flp project. |
| project_saveB | Save the project. |
| project_save_asB | Save the project to a new path. |
| project_undoB | Undo last action. |
| project_redoB | Redo last undone action. |
| project_undo_historyC | Return undo history stack. |
| project_save_undoA | Push a named entry onto the undo stack before a batch edit. |
| project_renderA | Trigger render to disk (uses FL's render dialog automation; blocks until complete). |
| project_versionA | Return FL Studio version string. |
| project_dump_score_logA | Dump the last N seconds of notes the USER PLAYED (even without recording) into the selected pattern — 'turn what I just jammed into a pattern'. Select/create the target pattern first. |
| ui_focused_windowB | Return info about the currently focused FL Studio window. |
| ui_show_windowA | Open / focus a main window by name. |
| ui_hide_windowC | Close a main window. |
| ui_hintA | Display a transient hint message in FL Studio's status bar. |
| ui_open_piano_roll_for_channelA | Switch the piano roll to show a given channel/pattern without closing the window. In one-channel-per-pattern mode, selecting the pattern causes FL to auto-select its channel and update the piano roll viewport — no openEventEditor call needed (which would cause the window to disappear and reappear). openEventEditor is only called as a last resort when the channel still doesn't match after the pattern switch. |
| ui_selected_channelB | Return selected channel index + name. |
| ui_scroll_to_channelC | Scroll the channel rack to show a channel. |
| ui_get_snap_modeA | Current global snap mode (affects playlist + piano roll editing). |
| ui_set_snap_modeA | Set the global snap mode. Accepts a name ('bar', 'beat', 'half_beat', 'step', 'line', 'cell', 'none', ...) or a numeric midi.Snap_* value. Set this BEFORE any GUI clip placement/moves in the playlist so clicks land on the grid; restore the previous mode afterwards. |
| ui_focused_pluginA | Name/caption of the plugin editor window that currently has focus. |
| browser_focusedA | Caption + file type of the currently focused FL browser node. |
| browser_navigateA | Move the browser selection ('up'/'down'/'left'/'right'; left/right collapse/expand folders). Returns the newly focused node so you can walk the tree without screenshots. |
| browser_tabsA | Cycle browser tabs (negative steps = backwards). |
| browser_previewA | Audition the focused browser node — plays the sample/preset preview through FL's output (combine with fl-listen/metering to hear it). |
| browser_selectA | Activate the focused browser node (like double-click: loads the sample/preset into the project). |
| piano_roll_gotoA | Navigate the piano roll viewport to a specific channel × pattern. Always use this instead of pattern_select / channel_select directly. Uses the sequence: channels.select → patterns.select → ui.openPianoRoll. Does nothing if already on the target pattern. Args: channel: Channel rack index (0-based). pattern: Pattern index (1-based, as returned by patterns.list). |
| piano_roll_statusA | Report whether the file-based piano-roll bridge is installed/reachable. Use this to verify the pyscript is in place before issuing edits. |
| piano_roll_add_notesA | Add notes to the currently-open piano roll (works WITHOUT MIDI).
Before calling, make sure:
|
| piano_roll_add_chordC | Add a chord at a given bar position. |
| piano_roll_add_arpeggioC | Arpeggiate a chord into sequential notes. |
| piano_roll_delete_notesC | Delete notes by {midi, time_bars} match. |
| piano_roll_clearA | Remove every note in the currently-open piano roll. |
| piano_roll_readA | Read back the current piano-roll state (returns all notes). |
| piano_roll_read_patterns_autolocateA | Read notes across patterns using FL's auto-located piano-roll channel. This avoids explicit channel retargeting/openEventEditor. It changes only the selected pattern, triggers ComposeWithLLM, and records the selected channel FL reports after each pattern switch. After the sweep, if navigate_after_pattern is provided, FL is left on that pattern (and optionally channel) so the UI is already showing the edit target while the LLM plans its changes. Use this whenever you know ahead of time which pattern will be edited first. |
| piano_roll_write_patternA | Write notes to a specific channel × pattern using autolocate-style switching. Mirrors piano_roll_read_patterns_autolocate: switches to the target pattern via patterns.select (no openEventEditor, no visual flicker), selects the channel, then stages a clear+add_notes action sequence and fires Cmd+Opt+Y. Args: channel: Channel rack index (0-based). pattern: Pattern index (1-based, as returned by patterns.list). notes: List of notes with midi, time_bars, duration_bars, velocity. clear_first: Clear the pattern before writing (default True). restore_start: Restore the original pattern/channel when done (default False — stays on last edited). Returns: {ok, note_count, hotkey_sent, restored} |
| piano_roll_write_patternsA | Write notes to multiple channel × pattern pairs sequentially, restoring only at the end. Mirrors piano_roll_read_patterns_autolocate: iterates through all writes in order without jumping back between each one, then restores to the original pattern/channel once at the very end. Args: writes: List of {channel: int, pattern: int, notes: [...], current_note_count?: int}. Supply current_note_count from a prior read sweep to skip force_retarget for non-empty patterns. Omit or set to 0/None to always force_retarget (safe default). clear_first: Clear each pattern before writing (default True). restore_start: Restore the original pattern/channel after all writes (default False — stays on last edited). Returns: {results: [{channel, pattern, ok, note_count, hotkey_sent}], restored} |
| piano_roll_quantizeB | Snap existing notes to a grid. |
| piano_roll_transposeC | Shift every note by N semitones. |
| piano_roll_humanizeC | Add subtle timing+velocity randomisation. |
| piano_roll_duplicateC | Copy a time-range of notes to another location. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| status | Bridge + transport quick status. |
| project | Full project metadata: tempo, signature, channels, mixer, patterns, selection. |
| transport | Live transport state (is_playing, position, tempo, loop mode). |
| channels | Full channel rack as JSON. |
| mixer | All mixer tracks as JSON. |
| patterns | All patterns in the project. |
| playlist | Playlist tracks + clips. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/marconadas/MacFLStudioMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server