mcp-flstudio 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. mcp_flstudio-0.1.0/.gitignore +10 -0
  2. mcp_flstudio-0.1.0/LICENSE +23 -0
  3. mcp_flstudio-0.1.0/PKG-INFO +484 -0
  4. mcp_flstudio-0.1.0/README.md +450 -0
  5. mcp_flstudio-0.1.0/apply-melody.sh +34 -0
  6. mcp_flstudio-0.1.0/build-track.sh +161 -0
  7. mcp_flstudio-0.1.0/install.ps1 +130 -0
  8. mcp_flstudio-0.1.0/install.sh +117 -0
  9. mcp_flstudio-0.1.0/presets/README.md +140 -0
  10. mcp_flstudio-0.1.0/presets/beats/afrobeats.json +93 -0
  11. mcp_flstudio-0.1.0/presets/beats/boom-bap.json +25 -0
  12. mcp_flstudio-0.1.0/presets/beats/drill-displaced.json +94 -0
  13. mcp_flstudio-0.1.0/presets/beats/drill.json +26 -0
  14. mcp_flstudio-0.1.0/presets/beats/drum-and-bass.json +93 -0
  15. mcp_flstudio-0.1.0/presets/beats/dubstep.json +93 -0
  16. mcp_flstudio-0.1.0/presets/beats/future-bass.json +93 -0
  17. mcp_flstudio-0.1.0/presets/beats/hip-hop.json +93 -0
  18. mcp_flstudio-0.1.0/presets/beats/house.json +25 -0
  19. mcp_flstudio-0.1.0/presets/beats/lofi.json +25 -0
  20. mcp_flstudio-0.1.0/presets/beats/nursery-beat.json +25 -0
  21. mcp_flstudio-0.1.0/presets/beats/phonk.json +93 -0
  22. mcp_flstudio-0.1.0/presets/beats/pop.json +93 -0
  23. mcp_flstudio-0.1.0/presets/beats/punjabi-banger.json +25 -0
  24. mcp_flstudio-0.1.0/presets/beats/reggaeton.json +21 -0
  25. mcp_flstudio-0.1.0/presets/beats/rnb.json +93 -0
  26. mcp_flstudio-0.1.0/presets/beats/romantic-minimal.json +93 -0
  27. mcp_flstudio-0.1.0/presets/beats/techno.json +93 -0
  28. mcp_flstudio-0.1.0/presets/beats/trap.json +25 -0
  29. mcp_flstudio-0.1.0/presets/genres/afrobeats.json +32 -0
  30. mcp_flstudio-0.1.0/presets/genres/boom-bap.json +30 -0
  31. mcp_flstudio-0.1.0/presets/genres/drill.json +32 -0
  32. mcp_flstudio-0.1.0/presets/genres/drum-and-bass.json +32 -0
  33. mcp_flstudio-0.1.0/presets/genres/dubstep.json +30 -0
  34. mcp_flstudio-0.1.0/presets/genres/future-bass.json +32 -0
  35. mcp_flstudio-0.1.0/presets/genres/hip-hop.json +32 -0
  36. mcp_flstudio-0.1.0/presets/genres/house.json +32 -0
  37. mcp_flstudio-0.1.0/presets/genres/lofi.json +30 -0
  38. mcp_flstudio-0.1.0/presets/genres/phonk.json +30 -0
  39. mcp_flstudio-0.1.0/presets/genres/pop.json +32 -0
  40. mcp_flstudio-0.1.0/presets/genres/punjabi.json +32 -0
  41. mcp_flstudio-0.1.0/presets/genres/reggaeton.json +32 -0
  42. mcp_flstudio-0.1.0/presets/genres/rnb.json +32 -0
  43. mcp_flstudio-0.1.0/presets/genres/techno.json +29 -0
  44. mcp_flstudio-0.1.0/presets/genres/trap.json +32 -0
  45. mcp_flstudio-0.1.0/presets/kits/afrobeats.json +152 -0
  46. mcp_flstudio-0.1.0/presets/kits/boom-bap.json +80 -0
  47. mcp_flstudio-0.1.0/presets/kits/drill.json +116 -0
  48. mcp_flstudio-0.1.0/presets/kits/drum-and-bass.json +116 -0
  49. mcp_flstudio-0.1.0/presets/kits/dubstep.json +80 -0
  50. mcp_flstudio-0.1.0/presets/kits/future-bass.json +80 -0
  51. mcp_flstudio-0.1.0/presets/kits/hip-hop.json +80 -0
  52. mcp_flstudio-0.1.0/presets/kits/house.json +152 -0
  53. mcp_flstudio-0.1.0/presets/kits/lofi.json +134 -0
  54. mcp_flstudio-0.1.0/presets/kits/phonk.json +116 -0
  55. mcp_flstudio-0.1.0/presets/kits/pop.json +116 -0
  56. mcp_flstudio-0.1.0/presets/kits/punjabi.json +116 -0
  57. mcp_flstudio-0.1.0/presets/kits/reggaeton.json +98 -0
  58. mcp_flstudio-0.1.0/presets/kits/rnb.json +116 -0
  59. mcp_flstudio-0.1.0/presets/kits/techno.json +116 -0
  60. mcp_flstudio-0.1.0/presets/kits/trap.json +116 -0
  61. mcp_flstudio-0.1.0/presets/melodies/a-minor-pop.json +33 -0
  62. mcp_flstudio-0.1.0/presets/melodies/dm-soothing-piano.json +97 -0
  63. mcp_flstudio-0.1.0/presets/melodies/drill-808-c-minor.json +80 -0
  64. mcp_flstudio-0.1.0/presets/melodies/drill-c-minor.json +96 -0
  65. mcp_flstudio-0.1.0/presets/melodies/drill-keys-c-minor.json +153 -0
  66. mcp_flstudio-0.1.0/presets/melodies/lofi-a-minor.json +39 -0
  67. mcp_flstudio-0.1.0/presets/melodies/nursery-baby.json +34 -0
  68. mcp_flstudio-0.1.0/presets/melodies/punjabi-hook.json +35 -0
  69. mcp_flstudio-0.1.0/presets/melodies/raga-yaman.json +33 -0
  70. mcp_flstudio-0.1.0/presets/melodies/synthwave-hook.json +25 -0
  71. mcp_flstudio-0.1.0/presets/validate.py +301 -0
  72. mcp_flstudio-0.1.0/presets/variations.py +467 -0
  73. mcp_flstudio-0.1.0/presets/vocal/knobs/emphasizer.json +35 -0
  74. mcp_flstudio-0.1.0/presets/vocal/knobs/fruitydelay3.json +135 -0
  75. mcp_flstudio-0.1.0/presets/vocal/knobs/fruitylimiter.json +95 -0
  76. mcp_flstudio-0.1.0/presets/vocal/knobs/fruityparametriceq2.json +185 -0
  77. mcp_flstudio-0.1.0/presets/vocal/knobs/fruityreeverb2.json +80 -0
  78. mcp_flstudio-0.1.0/presets/vocal/knobs/maximus.json +300 -0
  79. mcp_flstudio-0.1.0/presets/vocal/knobs/patcher.json +4 -0
  80. mcp_flstudio-0.1.0/presets/vocal/knobs/pitcher.json +10 -0
  81. mcp_flstudio-0.1.0/presets/vocal/knobs/preset_fingerprints.json +65 -0
  82. mcp_flstudio-0.1.0/presets/vocal/master-stock.json +18 -0
  83. mcp_flstudio-0.1.0/presets/vocal/vocal-buses.json +84 -0
  84. mcp_flstudio-0.1.0/presets/vocal/vocal-clean-stock.json +150 -0
  85. mcp_flstudio-0.1.0/presets/vocal/vocal-natural-light.json +19 -0
  86. mcp_flstudio-0.1.0/pyproject.toml +124 -0
  87. mcp_flstudio-0.1.0/recipes/README.md +84 -0
  88. mcp_flstudio-0.1.0/scripts/0MCP-Workbench.pyscript +58 -0
  89. mcp_flstudio-0.1.0/scripts/ComposeWithLLM.pyscript +279 -0
  90. mcp_flstudio-0.1.0/scripts/build_drumkits.py +42 -0
  91. mcp_flstudio-0.1.0/scripts/edison_run.py +69 -0
  92. mcp_flstudio-0.1.0/scripts/fl-add.sh +115 -0
  93. mcp_flstudio-0.1.0/scripts/gen-inventory.py +247 -0
  94. mcp_flstudio-0.1.0/scripts/install-midi-loop.sh +68 -0
  95. mcp_flstudio-0.1.0/scripts/install_mcp_for_claude.ps1 +187 -0
  96. mcp_flstudio-0.1.0/scripts/install_mcp_for_claude.sh +213 -0
  97. mcp_flstudio-0.1.0/scripts/ocr_text.swift +40 -0
  98. mcp_flstudio-0.1.0/scripts/render_track.py +151 -0
  99. mcp_flstudio-0.1.0/scripts/s0_probe.py +190 -0
  100. mcp_flstudio-0.1.0/scripts/screen.py +230 -0
  101. mcp_flstudio-0.1.0/scripts/setup.sh +181 -0
  102. mcp_flstudio-0.1.0/scripts/skill_tool_refs.py +77 -0
  103. mcp_flstudio-0.1.0/src/fl_studio_mcp/__init__.py +3 -0
  104. mcp_flstudio-0.1.0/src/fl_studio_mcp/audio/__init__.py +1 -0
  105. mcp_flstudio-0.1.0/src/fl_studio_mcp/audio/analysis.py +169 -0
  106. mcp_flstudio-0.1.0/src/fl_studio_mcp/audio/slicer.py +283 -0
  107. mcp_flstudio-0.1.0/src/fl_studio_mcp/dispatcher.py +386 -0
  108. mcp_flstudio-0.1.0/src/fl_studio_mcp/pilot_a6.py +302 -0
  109. mcp_flstudio-0.1.0/src/fl_studio_mcp/pilot_a6_run.py +99 -0
  110. mcp_flstudio-0.1.0/src/fl_studio_mcp/preset_paths.py +87 -0
  111. mcp_flstudio-0.1.0/src/fl_studio_mcp/safety.py +437 -0
  112. mcp_flstudio-0.1.0/src/fl_studio_mcp/server.py +285 -0
  113. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/__init__.py +29 -0
  114. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/audio_v2.py +287 -0
  115. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/batch.py +234 -0
  116. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/channel_v2.py +384 -0
  117. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/channels.py +454 -0
  118. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/delete.py +194 -0
  119. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/edison_v2.py +161 -0
  120. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/exec_python.py +153 -0
  121. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/file_v2.py +152 -0
  122. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/genre_v2.py +306 -0
  123. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/help_v2.py +369 -0
  124. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/launchpad.py +418 -0
  125. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/lifecycle_v2.py +757 -0
  126. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/markers.py +91 -0
  127. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/mixer.py +294 -0
  128. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/mixer_tracks.py +199 -0
  129. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/mixer_v2.py +723 -0
  130. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/notes_v2.py +507 -0
  131. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/pattern_v2.py +417 -0
  132. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/patterns.py +83 -0
  133. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/piano_roll.py +478 -0
  134. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/plugin_dial.py +305 -0
  135. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/plugin_v2.py +433 -0
  136. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/plugins.py +407 -0
  137. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/preset_v2.py +438 -0
  138. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/probe_v2.py +78 -0
  139. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/recipe_v2.py +1353 -0
  140. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/screen_v2.py +159 -0
  141. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/select_script.py +1064 -0
  142. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/shortcut_v2.py +493 -0
  143. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/slice_v2.py +81 -0
  144. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/song_builder.py +378 -0
  145. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/state.py +224 -0
  146. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/transport.py +218 -0
  147. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/transport_v2.py +247 -0
  148. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/ui_screen_v2.py +148 -0
  149. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/ui_script_v2.py +334 -0
  150. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/variations_v2.py +139 -0
  151. mcp_flstudio-0.1.0/src/fl_studio_mcp/tools/vocal_v2.py +673 -0
  152. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/__init__.py +13 -0
  153. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/add_channel.py +105 -0
  154. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/add_effect.py +375 -0
  155. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/channel_group.py +127 -0
  156. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/chords.py +178 -0
  157. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/clone_channel.py +141 -0
  158. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/connection.py +92 -0
  159. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/custom_menu.py +495 -0
  160. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/drumkits.py +294 -0
  161. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/edison_bridge.py +143 -0
  162. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/edison_flow.py +291 -0
  163. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/fl_panels.py +125 -0
  164. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/fl_trigger.py +279 -0
  165. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/humanize.py +63 -0
  166. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/import_midi.py +245 -0
  167. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/ledger.py +274 -0
  168. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/midi_connection.py +350 -0
  169. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/open_panel.py +109 -0
  170. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/picker_index.py +222 -0
  171. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/plugin_options.py +228 -0
  172. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/plugin_preset_ui.py +511 -0
  173. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/remove_effect.py +126 -0
  174. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/roll_session.py +426 -0
  175. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/sampler_load.py +130 -0
  176. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/save_panel.py +109 -0
  177. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/score_log.py +61 -0
  178. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/song_loader.py +202 -0
  179. mcp_flstudio-0.1.0/src/fl_studio_mcp/utils/ui_guard.py +250 -0
  180. mcp_flstudio-0.1.0/tests/conftest.py +53 -0
  181. mcp_flstudio-0.1.0/tests/fixtures/roll_title/808-astronomic-truncated.txt +74 -0
  182. mcp_flstudio-0.1.0/tests/fixtures/roll_title/bells.txt +72 -0
  183. mcp_flstudio-0.1.0/tests/fixtures/roll_title/discord.txt +74 -0
  184. mcp_flstudio-0.1.0/tests/fixtures/roll_title/pad.txt +75 -0
  185. mcp_flstudio-0.1.0/tests/fixtures/roll_title/playlist-front-no-roll.txt +63 -0
  186. mcp_flstudio-0.1.0/tests/fixtures/roll_title/riser.txt +73 -0
  187. mcp_flstudio-0.1.0/tests/fixtures/roll_title/roll-closed-playlist.txt +77 -0
  188. mcp_flstudio-0.1.0/tests/test_add_channel.py +57 -0
  189. mcp_flstudio-0.1.0/tests/test_audio.py +154 -0
  190. mcp_flstudio-0.1.0/tests/test_b10_surface.py +109 -0
  191. mcp_flstudio-0.1.0/tests/test_batch.py +216 -0
  192. mcp_flstudio-0.1.0/tests/test_channel_v2.py +244 -0
  193. mcp_flstudio-0.1.0/tests/test_clone_channel.py +136 -0
  194. mcp_flstudio-0.1.0/tests/test_controller_key_drift.py +100 -0
  195. mcp_flstudio-0.1.0/tests/test_controller_proto2.py +420 -0
  196. mcp_flstudio-0.1.0/tests/test_controller_safety.py +243 -0
  197. mcp_flstudio-0.1.0/tests/test_custom_menu.py +114 -0
  198. mcp_flstudio-0.1.0/tests/test_delete.py +98 -0
  199. mcp_flstudio-0.1.0/tests/test_dispatcher.py +127 -0
  200. mcp_flstudio-0.1.0/tests/test_drumkits.py +124 -0
  201. mcp_flstudio-0.1.0/tests/test_edison_bridge.py +166 -0
  202. mcp_flstudio-0.1.0/tests/test_edison_tool.py +193 -0
  203. mcp_flstudio-0.1.0/tests/test_exec_gate.py +59 -0
  204. mcp_flstudio-0.1.0/tests/test_file_v2.py +105 -0
  205. mcp_flstudio-0.1.0/tests/test_genre.py +147 -0
  206. mcp_flstudio-0.1.0/tests/test_help_v2.py +104 -0
  207. mcp_flstudio-0.1.0/tests/test_humanize.py +63 -0
  208. mcp_flstudio-0.1.0/tests/test_import_midi.py +106 -0
  209. mcp_flstudio-0.1.0/tests/test_launchpad.py +157 -0
  210. mcp_flstudio-0.1.0/tests/test_lifecycle_v2.py +276 -0
  211. mcp_flstudio-0.1.0/tests/test_load_beat_params.py +101 -0
  212. mcp_flstudio-0.1.0/tests/test_midi_lock.py +112 -0
  213. mcp_flstudio-0.1.0/tests/test_mixer_eq.py +200 -0
  214. mcp_flstudio-0.1.0/tests/test_mixer_peaks.py +136 -0
  215. mcp_flstudio-0.1.0/tests/test_mixer_v2.py +219 -0
  216. mcp_flstudio-0.1.0/tests/test_notes_v2.py +180 -0
  217. mcp_flstudio-0.1.0/tests/test_panels_and_load_sample.py +44 -0
  218. mcp_flstudio-0.1.0/tests/test_pattern_chain.py +386 -0
  219. mcp_flstudio-0.1.0/tests/test_pattern_v2.py +167 -0
  220. mcp_flstudio-0.1.0/tests/test_picker_index.py +38 -0
  221. mcp_flstudio-0.1.0/tests/test_pilot_a6.py +108 -0
  222. mcp_flstudio-0.1.0/tests/test_plugin_fx.py +165 -0
  223. mcp_flstudio-0.1.0/tests/test_plugin_v2.py +156 -0
  224. mcp_flstudio-0.1.0/tests/test_preset_paths.py +82 -0
  225. mcp_flstudio-0.1.0/tests/test_preset_v2.py +293 -0
  226. mcp_flstudio-0.1.0/tests/test_presets.py +167 -0
  227. mcp_flstudio-0.1.0/tests/test_probe_v2.py +21 -0
  228. mcp_flstudio-0.1.0/tests/test_protocol.py +104 -0
  229. mcp_flstudio-0.1.0/tests/test_recipe.py +510 -0
  230. mcp_flstudio-0.1.0/tests/test_remove_effect.py +157 -0
  231. mcp_flstudio-0.1.0/tests/test_roll_session.py +222 -0
  232. mcp_flstudio-0.1.0/tests/test_roll_title.py +77 -0
  233. mcp_flstudio-0.1.0/tests/test_safety.py +280 -0
  234. mcp_flstudio-0.1.0/tests/test_select_script.py +253 -0
  235. mcp_flstudio-0.1.0/tests/test_shortcut.py +236 -0
  236. mcp_flstudio-0.1.0/tests/test_skill_refs.py +244 -0
  237. mcp_flstudio-0.1.0/tests/test_skills.py +60 -0
  238. mcp_flstudio-0.1.0/tests/test_slice_audio.py +201 -0
  239. mcp_flstudio-0.1.0/tests/test_song_builder.py +109 -0
  240. mcp_flstudio-0.1.0/tests/test_song_loader.py +106 -0
  241. mcp_flstudio-0.1.0/tests/test_sprint_s_inputs.py +94 -0
  242. mcp_flstudio-0.1.0/tests/test_state.py +252 -0
  243. mcp_flstudio-0.1.0/tests/test_tools.py +47 -0
  244. mcp_flstudio-0.1.0/tests/test_transport_v2.py +176 -0
  245. mcp_flstudio-0.1.0/tests/test_ui_guard.py +103 -0
  246. mcp_flstudio-0.1.0/tests/test_ui_keyseq.py +208 -0
  247. mcp_flstudio-0.1.0/tests/test_ui_screen.py +161 -0
  248. mcp_flstudio-0.1.0/tests/test_ui_script.py +198 -0
  249. mcp_flstudio-0.1.0/tests/test_variation.py +306 -0
  250. mcp_flstudio-0.1.0/tests/test_version.py +37 -0
  251. mcp_flstudio-0.1.0/tests/test_vocal.py +538 -0
@@ -0,0 +1,10 @@
1
+ .venv/
2
+ .claude/
3
+ fl_controller/__pycache__/
4
+ src/fl_studio_mcp/__pycache__/
5
+ src/fl_studio_mcp/tools/__pycache__
6
+ src/fl_studio_mcp/utils/__pycache__/
7
+ .generated/
8
+ # bridge-generated (to_fl_presets) song-derived presets — rule 10: not committed
9
+ presets/beats/*-s[0-9]*.json
10
+ presets/melodies/*-s[0-9]*.json
@@ -0,0 +1,23 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 calvinw
4
+ Copyright (c) 2025 Karl Andres
5
+ Copyright (c) 2026 jagdeep Singh
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
@@ -0,0 +1,484 @@
1
+ Metadata-Version: 2.5
2
+ Name: mcp-flstudio
3
+ Version: 0.1.0
4
+ Summary: MCP server for controlling FL Studio - mixer, transport, channels, plugins, and piano roll
5
+ Project-URL: Homepage, https://github.com/jagdeepsinghdev/fl-studio-mcp
6
+ Project-URL: Repository, https://github.com/jagdeepsinghdev/fl-studio-mcp
7
+ Project-URL: Issues, https://github.com/jagdeepsinghdev/fl-studio-mcp/issues
8
+ Project-URL: Changelog, https://github.com/jagdeepsinghdev/fl-studio-mcp/blob/main/CHANGELOG.md
9
+ Project-URL: Upstream, https://github.com/karl-andres/fl-studio-mcp
10
+ Author: jagdeep Singh, Karl Andres
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: daw,fl-studio,mcp,midi,music-production,piano-roll
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: MacOS
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Multimedia :: Sound/Audio
23
+ Requires-Python: >=3.10
24
+ Requires-Dist: fastmcp>=2.0
25
+ Requires-Dist: mido>=1.3.0
26
+ Requires-Dist: numpy>=1.26
27
+ Requires-Dist: pynput>=1.7
28
+ Requires-Dist: python-rtmidi>=1.5.0
29
+ Provides-Extra: dev
30
+ Requires-Dist: fl-studio-api-stubs>=37.0; extra == 'dev'
31
+ Requires-Dist: pytest>=8.0; extra == 'dev'
32
+ Requires-Dist: ruff>=0.8; extra == 'dev'
33
+ Description-Content-Type: text/markdown
34
+
35
+ <!-- mcp-name: io.github.jagdeepsinghdev/fl-studio-mcp -->
36
+ # FL Studio MCP Server
37
+
38
+ An [MCP](https://modelcontextprotocol.io) server that lets an AI assistant control **FL Studio**: transport,
39
+ mixer, channels, patterns, the piano roll, plugins, presets, genre packs, vocal chains and audio files.
40
+ It runs locally next to FL Studio (stdio) and talks to it through FL's own Python scripting API over
41
+ virtual MIDI ports, plus, on macOS, the screen and keyboard for the things the API cannot do.
42
+
43
+ > **Fork of [karl-andres/fl-studio-mcp](https://github.com/karl-andres/fl-studio-mcp), with thanks.** The original provided the transport/mixer/channel/plugin/piano-roll foundation (MIT license, retained). This fork extends it: session-safe note writing (roll handshake + title OCR), full pattern/channel/file management, in-engine UI automation, one-call track/song building, and a request-id protocol with audit + controller rollback.
44
+
45
+ > **Status: alpha.** Built and tested on **macOS** with **FL Studio 2026 Producer Edition**. Windows is
46
+ > untested beyond the original tools. See the [project page](https://github.com/jagdeepsinghdev/fl-studio-mcp) for releases and the changelog.
47
+
48
+ ## Features
49
+
50
+ 29 tools, each with several actions (`fl_help(domain)` prints the parameters of one). Highlights:
51
+
52
+ - **Transport and mixer**: play/stop/record, tempo, time signature, swing, loop; volume, pan, sends,
53
+ routing, effects, peak meters, automatic clipping fix.
54
+ - **Channels and patterns**: list, add instruments, clone, group, rename, route; create, clone,
55
+ select and resize patterns; step-sequencer rows with per-step velocity/pitch/pan.
56
+ - **Piano roll, safely**: notes and chords from text (`"Am F C G"`), melodies as note tokens, MIDI import,
57
+ capture of what you played. Every write first proves which roll is open by reading its on-screen title.
58
+ - **Plugins and presets**: list and set parameters, load presets by name, built-in echo/reverb/chorus;
59
+ JSON beat and melody presets (drop in a file, no code).
60
+ - **One-call setups**: 16 genre packs with drum kits (`fl_genre`), a vocal chain with buses and sends
61
+ (`fl_vocal`), a whole song folder (`fl_preset load_song`), multi-step recipes with undo (`fl_recipe`).
62
+ - **Audio files** (`fl_audio`): tempo, key, chords and 808 root note; cut a section, isolate left/right,
63
+ load into a new Sampler.
64
+ - **Seeing and recovering**: `fl_screen` (OCR), FL's own keyboard shortcuts (`fl_shortcut`),
65
+ `fl_connect` `doctor` / `recover` / `tidy` when FL gets stuck.
66
+ - **Optional Claude skills** with FL workflows and a music-theory knowledge base (see [Skills](#skills-optional)).
67
+
68
+ ## Important Limitations
69
+
70
+ - **macOS-only UI automation.** Adding instruments and effects, loading samples, exporting audio and
71
+ selecting the piano-roll script are done by driving FL's menus (OCR, System Events), because FL's
72
+ scripting API cannot do them. FL must be in front and the mouse left alone while they run.
73
+ Needs Accessibility and Screen Recording permission.
74
+ - **No playlist clips.** The API cannot place patterns on the playlist, so songs are built one pattern per
75
+ section. Markers can be added and listed, not deleted or renamed.
76
+ - **Never jump onto an *empty* pattern by other means** than `fl_pattern(action="select")`: FL opens a
77
+ modal "Pattern N name" dialog that blocks the controller until a human closes it. `fl_pattern create`
78
+ names the next free slot without jumping.
79
+ - **The piano-roll script selection resets on every FL launch.** The server redoes it automatically on
80
+ the first note write (`fl_select_script` is the manual call).
81
+ - **One call at a time.** The server and FL share one command/response file pair; never run two FL tool
82
+ calls in parallel.
83
+ - FL Studio itself is not included, and other editions may lack features the automation relies on.
84
+
85
+ ## Requirements
86
+
87
+ - **FL Studio 20.7+** (MIDI Controller Scripting API)
88
+ - **Python 3.10+**
89
+ - **ffmpeg** on your PATH (`brew install ffmpeg`), used by `fl_audio` and the sample tools
90
+ - **macOS** or **Windows**
91
+ - macOS: IAC Driver (built-in, needs to be enabled)
92
+ - Windows: [loopMIDI](https://www.tobias-erichsen.de/software/loopmidi.html)
93
+ - **The fork's UI automation is macOS-only** (roll-title OCR via Vision, System
94
+ Events clicks/keys, automatic piano-roll script selection, `fl_screen`,
95
+ `fl_shortcut`, `fl_channel add`). On Windows only the original
96
+ transport/mixer/channel/plugin tools are expected to work (untested).
97
+ - **Screen Recording + Accessibility permission** for the process running the server (macOS)
98
+
99
+ ## Which AI Clients Work With This?
100
+
101
+ This is a standard [MCP](https://modelcontextprotocol.io) server that talks to clients over stdio — it isn't hardcoded to any one AI vendor. In principle, **any MCP-compatible client can connect**: Claude Desktop, Claude Code, Cursor, Windsurf, Gemini CLI/Gemini's MCP support, OpenAI's Codex CLI/Agents SDK MCP support, etc.
102
+
103
+ **What's actually tested and auto-configured:** only **Claude Desktop** and **Claude Code**, via `scripts/install_mcp_for_claude.sh` (macOS/Linux) and `scripts/install_mcp_for_claude.ps1` (Windows). Other clients (Gemini, OpenAI-based tools, etc.) are not tested against this server and have no installer support — you'd need to manually add an equivalent MCP server entry to that client's own config, pointing at:
104
+
105
+ ```json
106
+ {
107
+ "command": "uv",
108
+ "args": ["run", "--directory", "/path/to/fl-studio-mcp", "fl-studio-mcp"]
109
+ }
110
+ ```
111
+
112
+ (adjust `/path/to/fl-studio-mcp` to your local clone). If you try this with a non-Claude client, please open an issue with what worked/didn't — the protocol should support it, but it hasn't been verified here.
113
+
114
+ ## Quick Installation
115
+
116
+ The easiest way to install is using the provided setup script for your platform.
117
+
118
+ ### macOS / Linux
119
+
120
+ ```bash
121
+ # Clone the repository
122
+ git clone https://github.com/jagdeepsinghdev/fl-studio-mcp.git
123
+ cd fl-studio-mcp/fl-studio-mcp # the server lives in this subfolder
124
+
125
+ # Run the one-command installer
126
+ ./install.sh
127
+ ```
128
+
129
+ ### Windows
130
+
131
+ ```powershell
132
+ # Clone the repository
133
+ git clone https://github.com/jagdeepsinghdev/fl-studio-mcp.git
134
+ cd fl-studio-mcp/fl-studio-mcp # the server lives in this subfolder
135
+
136
+ # Allow running local scripts for this user (one-time)
137
+ Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force
138
+
139
+ # Run the one-command installer
140
+ .\install.ps1
141
+ ```
142
+
143
+ `install.ps1` is the Windows counterpart to `install.sh` — same steps, PowerShell instead of bash, and it installs Python 3.12 specifically (required for prebuilt `python-rtmidi` wheels on Windows).
144
+
145
+ Both installers will:
146
+
147
+ 1. Install [uv](https://github.com/astral-sh/uv) if not present
148
+ 2. Install Python dependencies
149
+ 3. Guide you through enabling virtual MIDI ports (IAC Driver on Mac, loopMIDI on Windows)
150
+ 4. Install the FL Studio MIDI controller script
151
+ 5. Install the Piano Roll script (ComposeWithLLM)
152
+ 6. Configure Claude Desktop or Claude Code automatically (`scripts/install_mcp_for_claude.sh` / `scripts/install_mcp_for_claude.ps1`)
153
+
154
+ > **Windows piano-roll auto-trigger note:** the Piano Roll script is launched by sending FL Studio a keystroke (`Ctrl+Alt+Y`). On Windows this requires briefly foregrounding the FL Studio window, so **FL Studio will pop to the front for a moment** each time a note-writing tool runs. This is expected. See [Piano Roll script not triggering](#piano-roll-script-not-triggering) if it doesn't fire at all.
155
+
156
+ ## Manual Installation
157
+
158
+ ### 1. Install Python Dependencies
159
+
160
+ ```bash
161
+ # Using uv (recommended)
162
+ uv sync
163
+
164
+ # Or using pip
165
+ pip install -e .
166
+ ```
167
+
168
+ ### 2. Enable Virtual MIDI Ports
169
+
170
+ #### macOS (IAC Driver)
171
+
172
+ 1. Open **Audio MIDI Setup** (search in Spotlight)
173
+ 2. Press **Cmd+2** or go to **Window > Show MIDI Studio**
174
+ 3. Double-click on **IAC Driver**
175
+ 4. Check **"Device is online"**
176
+ 5. Click **Apply**
177
+
178
+ #### macOS without a working IAC Driver (macOS 26 "Tahoe")
179
+
180
+ On macOS 26 the IAC Driver can stay **Offline** in the new *MIDI Studio* view, and the server then fails with
181
+ "No MIDI output ports found". You don't need IAC: any process can create virtual CoreMIDI ports (macOS starts
182
+ its MIDI server on demand), and FL Studio lists them like any other device.
183
+
184
+ 1. Start the loopback helper (creates `FL Studio MCP`, `FL Studio MCP Bus`, `FL Studio MCP Out`):
185
+ ```bash
186
+ .venv/bin/python fl_controller/fl_midi_loop.py &
187
+ ```
188
+ Virtual ports exist **only while this process runs**. Start it **before** launching FL Studio, and keep it running.
189
+ 2. In FL Studio: **Options > MIDI settings > Input** > select `FL Studio MCP Bus` > Controller type
190
+ **FL Studio MCP Controller** > turn **Enable** on. (Saved by FL; you do this once.)
191
+ 3. The server picks the port named exactly `FL Studio MCP` automatically.
192
+ 4. If the helper restarts while FL is open, FL's port connection goes stale (commands time out). Click
193
+ **Refresh device list** in the MIDI settings.
194
+
195
+ To start the helper at login, use a LaunchAgent (`RunAtLoad` + `KeepAlive`) that runs the command above with
196
+ `WorkingDirectory` set to this repo. Keep the plist minimal: no `EnvironmentVariables` block needed.
197
+
198
+ #### Windows (loopMIDI)
199
+
200
+ 1. Download and install [loopMIDI](https://www.tobias-erichsen.de/software/loopmidi.html)
201
+ 2. Create a virtual port (any name works)
202
+ 3. Keep loopMIDI running while using FL Studio
203
+
204
+ ### 3. Install FL Studio Scripts
205
+
206
+ Copy the controller script to FL Studio's Hardware folder:
207
+
208
+ ```bash
209
+ # macOS
210
+ mkdir -p ~/Documents/Image-Line/FL\ Studio/Settings/Hardware/FLStudioMCP
211
+ cp fl_controller/device_FLStudioMCP.py ~/Documents/Image-Line/FL\ Studio/Settings/Hardware/FLStudioMCP/
212
+
213
+ # Windows
214
+ mkdir "%USERPROFILE%\Documents\Image-Line\FL Studio\Settings\Hardware\FLStudioMCP"
215
+ copy fl_controller\device_FLStudioMCP.py "%USERPROFILE%\Documents\Image-Line\FL Studio\Settings\Hardware\FLStudioMCP\"
216
+ ```
217
+
218
+ Copy the Piano Roll script:
219
+
220
+ ```bash
221
+ # macOS
222
+ cp scripts/ComposeWithLLM.pyscript ~/Documents/Image-Line/FL\ Studio/Settings/Piano\ roll\ scripts/
223
+
224
+ # Windows
225
+ copy scripts\ComposeWithLLM.pyscript "%USERPROFILE%\Documents\Image-Line\FL Studio\Settings\Piano roll scripts\"
226
+ ```
227
+
228
+ ### 4. Configure FL Studio
229
+
230
+ 1. **Restart FL Studio** (if it's running)
231
+ 2. Go to **Options > MIDI Settings**
232
+ 3. Under **Input**, find your virtual MIDI port (e.g., "IAC Driver Bus 1")
233
+ 4. Set the **Controller type** to **FLStudioMCP**
234
+ 5. Enable the port (click to highlight it)
235
+
236
+ ### 5. Configure Claude (or another MCP client)
237
+
238
+ Add to your Claude Desktop config:
239
+
240
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
241
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
242
+
243
+ ```json
244
+ {
245
+ "mcpServers": {
246
+ "fl-studio": {
247
+ "command": "uv",
248
+ "args": ["run", "--directory", "/path/to/fl-studio-mcp", "fl-studio-mcp"]
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ Or for Claude Code, add to your MCP settings (`~/.claude.json`, or run `claude mcp add`).
255
+
256
+ Using a different MCP-compatible client (Gemini, an OpenAI-based tool, Cursor, etc.)? The same `command`/`args` pair above is all any MCP host needs — add it to that client's own MCP config in whatever format it expects. See [Which AI Clients Work With This?](#which-ai-clients-work-with-this) for what's actually been tested.
257
+
258
+ ### Skills (optional)
259
+
260
+ The server is complete without them. The repo also ships an **optional** skill pack for Claude
261
+ in [`skills/`](https://github.com/jagdeepsinghdev/fl-studio-mcp/blob/main/skills/README.md): FL workflows and gotchas (setup, patterns, piano roll,
262
+ mixing, plugins, genres, whole-song building) and a standalone **music-theory** skill (harmony,
263
+ rhythm, 808 writing, form, ragas, ear training). None are installed by default. Pick them by name:
264
+
265
+ ```bash
266
+ ../skills/install.sh # list them with descriptions
267
+ ../skills/install.sh fl-studio fl-melody music-theory # -> ~/.claude/skills (symlinks)
268
+ ```
269
+
270
+ The table in [`skills/README.md`](https://github.com/jagdeepsinghdev/fl-studio-mcp/blob/main/skills/README.md) says what each one adds and when to install it.
271
+
272
+ ## Usage
273
+
274
+ ### Running the server manually
275
+
276
+ ```bash
277
+ uv run fl-studio-mcp # from this folder; MCP clients normally start it for you
278
+ ```
279
+
280
+ ### Writing notes
281
+
282
+ Ask for notes in plain words ("a minor 4-bar hook on the piano channel"). The server selects the right
283
+ piano-roll script once per FL launch, opens the target channel's roll, checks the roll title on screen,
284
+ writes the notes, and reads them back. If notes do not land, see
285
+ [Troubleshooting](#piano-roll-script-not-triggering).
286
+
287
+ ## Available Tools
288
+
289
+ Every domain tool takes an `action`; `fl_help(domain)` shows its parameters. The full generated list of
290
+ tools, skills and presets is in [`INVENTORY.md`]({R}/blob/main/INVENTORY.md).
291
+
292
+ | Tool | What it does |
293
+ |---|---|
294
+ | `fl_state` | read-only snapshot: tempo, transport, patterns, channels, selected channel, piano-roll notes |
295
+ | `fl_transport` | `play`, `stop`, `record`, `set_bpm`, `set_timesig`, `set_speed`, `set_swing`, `loop`, `position` |
296
+ | `fl_mixer` | `set_vol`, `set_pan`, `route`, `sends`, `add_fx`, `get_info`, `get_sends`, `get_peaks`, `fix_clipping`, `get_eq`, `set_eq` |
297
+ | `fl_channel` | `list`, `add`, `clone`, `group`, `rename`, `route`, `mute`, `solo`, `set_vol`, `set_pan`, `set_steps`, `get_steps`, `get_step_param`, `set_step_param`, `load_sample` |
298
+ | `fl_pattern` | `create`, `select`, `rename`, `set_len`, `clone`, `chain` |
299
+ | `fl_notes` | `write_steps`, `write_chords`, `read_steps`, `clear`, `clear_queue`, `import_midi`, `capture` |
300
+ | `fl_select_script` | select the piano-roll script (automatic on the first note write) |
301
+ | `fl_plugin` | `list_params`, `set_param`, `load_preset`, `echo`, `reverb`, `chorus`, `get_fx` |
302
+ | `fl_preset` | `list`, `load_beat`, `load_melody`, `load_song` |
303
+ | `fl_genre` | `list`, `show`, `load`, `load_kit`: one call per genre |
304
+ | `fl_vocal` | `setup`, `apply`, `buses`, `loudness`, `recipes`, `show`, `status`, `learn`, `run`, `onboard` |
305
+ | `fl_audio` | `analyze`, `extract`, `split`, `load`, `recorder` (needs `ffmpeg`) |
306
+ | `fl_recipe` | `validate`, `plan`, `apply`, `status`, `undo`, `export` |
307
+ | `fl_file` | `save`, `save_as`, `export`, `open` |
308
+ | `fl_delete` | destructive: `channel`, `pattern`, `pattern_data`, `fx`, `roll_notes` |
309
+ | `fl_batch` | many controller actions in one MIDI round trip |
310
+ | `fl_connect` | FL lifecycle: `status`, `open`, `close`, `save`, `force`, `dismiss_modal`, `doctor`, `recover`, `tidy` |
311
+ | `fl_screen` / `fl_shortcut` | see the screen (`look`, `ocr`, `find`, `hint`, `click_text`) / press FL's own shortcuts, guarded |
312
+ | `fl_launchpad` | 8x8 grid controller to step sequencer |
313
+ | `fl_edison` / `fl_slice_audio` | Edison audio-region flow / slice a file into onset or grid samples |
314
+ | `fl_variations` / `fl_list_generated` | rule-based beat variations / list generated presets |
315
+ | `fl_probe` / `fl_ui_screen` / `fl_ui_script` / `fl_connection_status` / `fl_help` | discovery, allowlisted `ui.*` calls, UI routines, connection check, docs |
316
+
317
+ The older single-purpose tools (`fl_play`, `fl_set_bpm`, `fl_send_notes`, ...) are **legacy**: they are
318
+ registered only with `LEGACY_TOOLS=1`.
319
+
320
+ ## Example Workflows
321
+
322
+ Say these to your assistant; the tool calls are what it runs.
323
+
324
+ **A beat and a hook in one go**
325
+ ```
326
+ fl_genre(action="load", genre="trap") # tempo, kit, beat, Keys + Bass, chords, levels
327
+ fl_notes(action="write_chords", text="Am F C G", channel_index=5)
328
+ ```
329
+
330
+ **Drums by hand**
331
+ ```
332
+ fl_pattern(action="set_len", pattern=1, beats=4)
333
+ fl_channel(action="set_steps", index=0, steps=[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0])
334
+ ```
335
+
336
+ **A melody on a new instrument**
337
+ ```
338
+ fl_channel(action="add", plugin="FLEX", name="Piano")
339
+ fl_notes(action="write_steps", channel_index=<piano idx>, melody=[["C4","E4","G4","E4"]])
340
+ ```
341
+
342
+ **Mix check**
343
+ ```
344
+ fl_mixer(action="get_peaks", track=0)
345
+ fl_mixer(action="fix_clipping") # lowers the master fader just enough
346
+ ```
347
+
348
+ **Know a sample before you use it**
349
+ ```
350
+ fl_audio(action="analyze", path="loop.wav") # tempo (+ whether the estimators agree), key, chords, root
351
+ ```
352
+
353
+ ## Troubleshooting
354
+
355
+ ### "Not connected to FL Studio"
356
+
357
+ 1. Ensure FL Studio is running
358
+ 2. Check that the FLStudioMCP controller is enabled in MIDI Settings
359
+ 3. On Mac, verify IAC Driver is enabled in Audio MIDI Setup, or (macOS 26) that `fl_controller/fl_midi_loop.py` is running (see above)
360
+ 4. On Windows, verify loopMIDI is running
361
+ 5. Restart FL Studio after enabling the controller
362
+
363
+ ### "Timeout waiting for FL Studio response"
364
+
365
+ 0. If you use the virtual-port loopback: it restarted after FL started, or FL was launched before it. Click **Refresh device list** in FL's MIDI settings (or restart FL). Also check the server opened `FL Studio MCP`, not `FL Studio MCP Out` (`fl_connection_status`).
366
+ 1. Make sure FL Studio is in focus
367
+ 2. Check the Script output window in FL Studio (View > Script output)
368
+ 3. Verify the controller is receiving MIDI (look for activity in MIDI Settings)
369
+
370
+ ### Piano Roll script not triggering
371
+
372
+ 1. The server selects the script itself on the first note write after each FL launch. If notes still do not land, run `fl_select_script(channel_index=N)` and check `fl_state` shows the channel's notes
373
+ 2. On macOS: grant Accessibility permissions when prompted
374
+ 3. On Windows: the MCP server foregrounds the FL Studio window automatically before sending the hotkey — if FL Studio isn't running or is minimized to the system tray, the trigger can't find it and will fall back to a warning telling you to press the hotkey manually
375
+ 4. Try pressing Cmd+Opt+Y (macOS) or Ctrl+Alt+Y (Windows) manually to confirm the hotkey itself is bound to the script in FL Studio
376
+ 5. If you just updated the server code (e.g. pulled a fix to the trigger logic), **fully restart** your MCP client (Claude Desktop/Code) — reconnecting the MCP server alone does not respawn the underlying process, so it can keep running stale code
377
+
378
+ ### No MIDI ports available
379
+
380
+ - **macOS**: Enable IAC Driver in Audio MIDI Setup
381
+ - **Windows**: Install and run loopMIDI
382
+
383
+ ## Architecture
384
+
385
+ This MCP server uses a hybrid approach:
386
+
387
+ ```text
388
+ ┌─────────────────┐ ┌─────────────────────────────────────────┐
389
+ │ MCP Client │────▶│ FastMCP Server │
390
+ │ (Claude, etc) │ │ │
391
+ └─────────────────┘ │ ┌─────────────────┐ ┌──────────────┐ │
392
+ │ │ MIDI + JSON │ │ Piano Roll │ │
393
+ │ │ Tools │ │ Tools (JSON) │ │
394
+ │ └────────┬────────┘ └──────┬───────┘ │
395
+ └───────────┼──────────────────┼──────────┘
396
+ │ │
397
+ MIDI + JSON JSON Files +
398
+ │ Keystroke
399
+ ▼ ▼
400
+ ┌─────────────────────────────────────────┐
401
+ │ FL Studio │
402
+ │ ┌──────────────┐ ┌──────────────────┐ │
403
+ │ │FLStudioMCP │ │ Piano Roll Script│ │
404
+ │ │(MIDI Ctrl) │ │ (ComposeWithLLM) │ │
405
+ │ └──────────────┘ └──────────────────┘ │
406
+ └─────────────────────────────────────────┘
407
+ ```
408
+
409
+ ### How It Works
410
+
411
+ 1. **Transport/Mixer/Channels/Plugins**:
412
+ - MCP server writes command to JSON file
413
+ - Sends MIDI trigger note to FL Studio
414
+ - FL Studio controller script reads JSON, executes API, writes response
415
+ - MCP server reads response
416
+
417
+ 2. **Piano Roll**:
418
+ - MCP server writes note requests to JSON file
419
+ - Sends keystroke (Cmd+Opt+Y on macOS, Ctrl+Alt+Y on Windows) to trigger FL Studio script — on Windows, the FL Studio window is foregrounded first so the keystroke actually reaches it
420
+ - Piano Roll script reads JSON and modifies notes
421
+
422
+ ## Development
423
+
424
+ ### Prerequisites
425
+
426
+ - Python 3.10+
427
+ - [uv](https://github.com/astral-sh/uv) (recommended)
428
+
429
+ ### Setup
430
+
431
+ ```bash
432
+ # Install all dependencies including dev extras
433
+ uv sync --dev
434
+
435
+ # Or with pip
436
+ pip install -e ".[dev]"
437
+ ```
438
+
439
+ ### Available Commands
440
+
441
+ | Command | Description |
442
+ |---------|-------------|
443
+ | `uv run fl-studio-mcp` | Run the MCP server |
444
+ | `uv run ruff check .` | Lint the codebase |
445
+ | `uv run ruff check --fix .` | Lint and auto-fix |
446
+ | `uv run pytest` | Run tests |
447
+
448
+ ### Project Structure
449
+
450
+ ```
451
+ fl-studio-mcp/
452
+ ├── src/fl_studio_mcp/
453
+ │ ├── server.py # FastMCP entry point, registers the tools
454
+ │ ├── tools/ # one module per domain tool (transport_v2.py, mixer_v2.py, notes_v2.py, ...)
455
+ │ ├── audio/ # numpy tempo/key/chord analysis, slicer
456
+ │ └── utils/ # connection, UI automation, roll session, loaders
457
+ ├── fl_controller/ # runs INSIDE FL: device_FLStudioMCP.py, fl_midi_loop.py (macOS MIDI ports)
458
+ ├── scripts/ # setup.sh, install-midi-loop.sh, install_mcp_for_claude.*, ComposeWithLLM.pyscript
459
+ ├── presets/ # beats, melodies, genres, kits, vocal (JSON; drop in a file, no code)
460
+ ├── recipes/ shortcuts/ ui_routines/ docs/ tests/
461
+ └── install.sh / install.ps1
462
+ ```
463
+
464
+ The repository root also has the optional `skills/`, `CHANGELOG.md`, `INVENTORY.md` and the CI/release
465
+ workflows: see the [project page](https://github.com/jagdeepsinghdev/fl-studio-mcp).
466
+
467
+ ## Credits
468
+
469
+ This project is a fork of, and builds directly on:
470
+
471
+ - **[karl-andres/fl-studio-mcp](https://github.com/karl-andres/fl-studio-mcp)** (MIT) by Karl Andres — the original FL Studio MCP server: transport, mixer, channel, plugin and piano-roll tools, the MIDI controller script, and the ComposeWithLLM piano-roll integration. Thanks for the foundation!
472
+ - The original project's demo video: see [its README](https://github.com/karl-andres/fl-studio-mcp#readme).
473
+ - [calvinw/fl-studio-mcp](https://github.com/calvinw/fl-studio-mcp) — upstream reference the original is based on (Piano Roll integration approach)
474
+
475
+ Other dependencies:
476
+
477
+ - [FL Studio API Stubs](https://github.com/IL-Group/FL-Studio-API-Stubs) - API documentation
478
+ - [FastMCP](https://github.com/jlowin/fastmcp) - MCP server framework
479
+ - [mido](https://github.com/mido/mido) - MIDI library for Python
480
+ - [Image-Line](https://www.image-line.com/) - FL Studio
481
+
482
+ ## License
483
+
484
+ MIT