LemonStudioMCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LEMON_PORT | No | Use a local TCP port instead of the socket (the app prints the token). | |
| LEMON_TOKEN | No | Token for connecting to the local TCP port (the app prints the token). | |
| LEMON_SOCKET | No | The app's control socket. | /tmp/lemon.sock |
| LEMON_STUDIO_BIN | No | The Lemon Studio app binary, used by lemon_launch and render_project; defaults to lemonstudio on PATH. | lemonstudio |
| LEMON_CLIENT_NAME | No | The name shown on undo steps. | Claude |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| lemon_launchA | Start Lemon Studio listening on the control socket (does nothing if it already is). project: an .flp file to open. headless: run with no window (--serve) instead of the app with its window. |
| lemon_statusB | Whether Lemon Studio is connected, the app's version, this client's permission level, and the transport. |
| get_project_stateA | The whole project: tempo, ppq, time signature, channels, mixer tracks (with effect slots and sends), patterns, the playlist's clips, the current pattern and song/pattern mode. Positions here are raw ticks. |
| get_notesC | The notes of pattern |
| list_pluginsB | The instrument and effect plugin names that add_channel and add_effect take. |
| get_plugin_paramsC | The parameters (id, name, value 0..1, value text, ...) of the plugin playing channel id or effect slot id |
| get_historyA | The undo history: each step's name and whether it is undone. |
| get_changesA | What changed after event number |
| write_notesA | Write notes into pattern notes: [{"channel": id, "position": 0, "length": 0.5, "key": 60, "velocity": 100, "pan": 64}, ...];
position/length in |
| clear_notesC | Remove the notes of |
| add_channelA | Add a channel played by instrument |
| set_channelA | Change channel |
| delete_channelB | Delete channel |
| load_sampleB | Load audio file |
| add_patternC | Add a pattern. Returns its id. |
| set_patternC | Rename, recolor, or set the length of pattern |
| delete_patternB | Delete pattern |
| place_patternB | Place pattern |
| set_clipC | Move, resize or mute playlist clip |
| delete_clipC | Remove playlist clip |
| add_mixer_trackB | Add a mixer insert (at insert number |
| set_mixer_trackC | Change mixer track |
| route_mixerA | Send mixer track |
| set_eqA | Set band 0..2 of mixer track |
| add_effectA | Add effect |
| set_effectA | Turn effect slot |
| remove_effectB | Remove the effect in slot |
| set_plugin_paramA | Set parameter |
| set_tempoB | Set the tempo (10..522 BPM). |
| set_time_signatureB | Set the time signature (denominator 2, 4, 8 or 16). |
| set_project_settingsC | Swing 0..1, main volume 0..1 (0.8 = unity), main pitch in cents, and the song info. |
| playB | Start playback, as the Play button (resumes when paused). mode: "pattern" loops the current pattern, "song" plays the playlist (default: the app's PAT/SONG switch). pattern: make this pattern (an id) the current one. from_position: where to start. |
| pauseA | Pause playback in place (play resumes). |
| stopA | Stop playback and rewind to where it started. |
| selectA | Change what the user sees, not the music: make |
| transport_statusC | Playing, paused or stopped; pattern or song mode; the current pattern; the playhead position; the tempo. |
| undoA | Undo the last step (anyone's: this client's or the user's). |
| redoB | Redo the last undone step. |
| save_projectB | Save the project (to |
| apply_commandsA | Run raw control-plane commands (Lemon Studio docs/control-plane.md) as ONE undo step, all or nothing. Positions and lengths here are raw ticks. Each command is {"op": ..., fields...}, e.g. {"op": "add_channel", "name": "Bass", "plugin": "Lemon Trio"}. Returns each command's result. |
| propose_commandsB | Like apply_commands, but Lemon Studio asks the user to Apply or Discard. Returns the proposal number and what it would change. |
| render_projectA | Render a saved .flp project to an audio file (.wav), with no window and no audio device. Save the open project first (save_project) to render what is in the app. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 42 tools
Nearly every tool pairs a distinct resource with a distinct action (channel vs pattern vs clip vs mixer track vs effect slot vs plugin param), and descriptions explicitly disambiguate near-pairs like set_clip vs place_pattern and set_effect vs set_plugin_param. The main overlap is apply_commands, which is a raw escape hatch that can do anything the individual tools do, and there is mild redundancy between transport_status, lemon_status and get_project_state on transport/mode info.
The dominant convention is verb_noun (get_notes, write_notes, add_channel, set_mixer_track, delete_pattern, route_mixer, remove_effect, save_project), applied consistently across resources. Deviations are minor and idiomatic: bare transport verbs (play, pause, stop, undo, redo), the select verb, a noun-first transport_status, and the lemon_ prefixed lifecycle pair (lemon_launch, lemon_status).
42 tools is heavy even for a full DAW control surface; the domain (channels, patterns, notes, playlist, mixer, effects, plugins, transport, project, render) justifies breadth, but many setter tools are one-field wrappers that apply_commands already covers generically. The surface could be consolidated (e.g. generic update_* tools or dropping per-field setters) without losing capability.
Coverage is broad and lifecycle-complete for most objects: channels, patterns, notes, clips, mixer tracks, effects and plugin params all have create/read/update/delete, plus transport, undo/redo, save and render. Gaps are moderate rather than blocking: no delete_mixer_track, no tools for automation clips/points despite delete_channel mentioning automation, and no way to open/close a project beyond the lemon_launch argument.