Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
LEMON_PORTNoUse a local TCP port instead of the socket (the app prints the token).
LEMON_TOKENNoToken for connecting to the local TCP port (the app prints the token).
LEMON_SOCKETNoThe app's control socket./tmp/lemon.sock
LEMON_STUDIO_BINNoThe Lemon Studio app binary, used by lemon_launch and render_project; defaults to lemonstudio on PATH.lemonstudio
LEMON_CLIENT_NAMENoThe 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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 pattern (an id): channel id, position, length, key, velocity, pan.

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 owner.

get_historyA

The undo history: each step's name and whether it is undone.

get_changesA

What changed after event number since (0: all kept), including the user's own edits in the app, and last, the newest event number to pass next time.

write_notesA

Write notes into pattern pattern (an id).

notes: [{"channel": id, "position": 0, "length": 0.5, "key": 60, "velocity": 100, "pan": 64}, ...]; position/length in unit (beats by default). channel fills in notes that leave theirs out. replace=True: these become the notes of channel in the pattern (or all of its notes when channel is None); replace=False: they are added to what is there.

clear_notesC

Remove the notes of channel from pattern pattern (or all of its notes when channel is None).

add_channelA

Add a channel played by instrument plugin (a name from list_plugins, e.g. "Lemon Trio"), or a sampler with sample (an audio file path) loaded. mixer_track: a mixer track id to route it to. Returns its id.

set_channelA

Change channel channel (an id): volume 0..1, pan -1..1, pitch in cents, color "#rrggbb", enabled (False mutes it), mixer_track (a mixer track id). Only the fields given change.

delete_channelB

Delete channel channel (an id), with its notes, clips and automation.

load_sampleB

Load audio file path into sampler channel channel (an empty path clears it).

add_patternC

Add a pattern. Returns its id.

set_patternC

Rename, recolor, or set the length of pattern pattern (an id). length 0 = automatic.

delete_patternB

Delete pattern pattern (an id) and its playlist clips.

place_patternB

Place pattern pattern (an id) in the playlist on track track (1-based) at position. Returns the clip id.

set_clipC

Move, resize or mute playlist clip clip (an id).

delete_clipC

Remove playlist clip clip (an id).

add_mixer_trackB

Add a mixer insert (at insert number at, else after the last). Returns its id.

set_mixer_trackC

Change mixer track track (an id): volume 0..1 (0.8 = unity), pan and stereo -1..1, enabled (False mutes).

route_mixerA

Send mixer track from_track to to_track (ids) at level 0..1; level None removes the route.

set_eqA

Set band 0..2 of mixer track track's built-in 3-band EQ: gain in dB (-18..18), frequency and width as stored (0..65536).

add_effectA

Add effect plugin (a name from list_plugins) to mixer track track (an id), in slot 0..9 or the first free one. Returns the slot plugin's id (for get_plugin_params / set_plugin_param).

set_effectA

Turn effect slot slot (0..9) of mixer track track (an id) on or off, or set its mix 0..1.

remove_effectB

Remove the effect in slot slot (0..9) of mixer track track (an id).

set_plugin_paramA

Set parameter param (an id from get_plugin_params) of the plugin of channel or slot owner to value 0..1.

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 pattern (an id) the current pattern, select channel (an id) in the channel rack, and with piano_roll=True open the piano roll on them (False closes it). While the piano roll is shown it scrolls to the channel's notes. No undo step. Use it after writing notes so the user sees them.

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 path, else its own file). With the app's window open, the user is asked first.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3/5.0

Scored across 42 tools

Disambiguation4/5

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.

Naming Consistency4/5

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).

Tool Count2/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues