{"ok":true,"site":{"host":"loopsmith.lemon.earth","url":"https://loopsmith.lemon.earth/","type":"live","desc":"A browser DAW that exposes WebMCP tools so an agent can compose, arrange and actually measure the mix.","tools":[{"name":"get_project","kind":"answer","impl":"imperative","description":"Read the full state of the session: tempo, swing, loop length, every track with its mixer settings, synth settings and note pattern. Call this first to learn track ids.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"describe_arrangement","kind":"answer","impl":"imperative","description":"Musical summary of the loop: detected key and confidence, note density per bar, which bars each track is active in, pitch ranges, and notes about empty or muted tracks. Use this to reason about structure without reading every note.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"analyze_mix","kind":"act","impl":"imperative","description":"LISTEN to the current mix. Renders the loop offline and measures it: per-track loudness (LUFS), true peak, crest factor, spectral centroid, energy per frequency band, plus frequency-masking conflicts between tracks and mix-bus headroom. Use this whenever the user asks how something sounds ('is it muddy?', 'is the bass too loud?') or before changing EQ or levels. This information is not available from the page's HTML.","inputSchema":{"type":"object","properties":{"trackIds":{"type":"array","items":{"type":"string"},"description":"Optional subset of track ids. Omit to analyze everything."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_tempo","kind":"act","impl":"imperative","description":"Set the tempo in BPM and/or the swing amount applied to off-beat 16th notes.","inputSchema":{"type":"object","properties":{"bpm":{"type":"number","description":"Beats per minute, 40-220."},"swing":{"type":"number","description":"Swing 0 (straight) to 1 (heavily swung)."},"bars":{"type":"number","description":"Loop length in bars, 1-8."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_track","kind":"act","impl":"imperative","description":"Add an instrument track. Kinds: kick, snare, hat (drum synths, pitch ignored), bass, keys, lead (subtractive synths). Returns the new track id.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["kick","snare","hat","bass","keys","lead"],"description":"Instrument type."},"name":{"type":"string","description":"Display name, defaults to the kind."},"notes":{"type":"array","description":"Optional starting pattern.","items":{"type":"object","properties":{"step":{"type":"number","description":"Step index, 0-based."},"midi":{"type":"number","description":"MIDI note number, e.g. 60 for C4."},"note":{"type":"string","description":"Alternative to midi, e.g. \"C3\" or \"F#4\"."},"vel":{"type":"number","description":"Velocity 0..1, default 0.85."},"len":{"type":"number","description":"Length in steps, default 1."}},"required":["step"]}}},"required":["kind"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_track","kind":"act","impl":"imperative","description":"Delete a track and its pattern.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"write_pattern","kind":"act","impl":"imperative","description":"Write notes onto a track. mode 'replace' clears the track first; mode 'merge' adds to what is already there. Changes are applied immediately and are audible on the next loop.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"notes":{"type":"array","description":"Notes to place. `step` is a 16th-note index from 0; there are 16 steps per bar. Drum tracks ignore pitch.","items":{"type":"object","properties":{"step":{"type":"number","description":"Step index, 0-based."},"midi":{"type":"number","description":"MIDI note number, e.g. 60 for C4."},"note":{"type":"string","description":"Alternative to midi, e.g. \"C3\" or \"F#4\"."},"vel":{"type":"number","description":"Velocity 0..1, default 0.85."},"len":{"type":"number","description":"Length in steps, default 1."}},"required":["step"]}},"mode":{"type":"string","enum":["replace","merge"],"description":"Default 'replace'."}},"required":["trackId","notes"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_pattern","kind":"act","impl":"imperative","description":"Remove every note from a track, keeping its sound and mixer settings.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_mix","kind":"act","impl":"imperative","description":"Set a track's level in dB, stereo pan, mute or solo.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"gainDb":{"type":"number","description":"-60 to +6 dB."},"pan":{"type":"number","description":"-1 (left) to 1 (right)."},"muted":{"type":"boolean"},"solo":{"type":"boolean"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_eq","kind":"act","impl":"imperative","description":"Set a track's EQ: high-pass corner, low-pass corner, and one peaking band. Use analyze_mix first to find out which band actually needs work.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"},"hpf":{"type":"number","description":"High-pass corner in Hz, 20 = off."},"lpf":{"type":"number","description":"Low-pass corner in Hz, 20000 = off."},"peakFreq":{"type":"number","description":"Centre frequency of the peaking band in Hz."},"peakGainDb":{"type":"number","description":"Boost or cut at that frequency, -24 to +24 dB."},"peakQ":{"type":"number","description":"Bandwidth of the peaking band, 0.3 to 12."}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"transport","kind":"act","impl":"imperative","description":"Start or stop playback. The loop plays continuously and edits are heard immediately.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["play","stop","toggle"]},"fromStep":{"type":"number","description":"Step to start from when playing. Default 0."}},"required":["action"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"select_track","kind":"act","impl":"imperative","description":"Focus a track in the UI. Selecting a track also registers extra tools for editing that specific instrument's sound, so call this before trying to change synth parameters.","inputSchema":{"type":"object","properties":{"trackId":{"type":"string"}},"required":["trackId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_pattern","kind":"act","impl":"imperative","description":"Suggest a pattern WITHOUT applying it. It appears in the UI as ghost notes with Accept / Reject / Preview buttons so the user stays in control. Use this for creative variations, alternative arrangements, or anything the user should audition before committing. Use write_pattern instead when the user asked for the change directly.","inputSchema":{"type":"object","properties":{"label":{"type":"string","description":"Short description shown to the user."},"ops":{"type":"array","description":"One entry per track this proposal would change.","items":{"type":"object","properties":{"trackId":{"type":"string"},"notes":{"type":"array","description":"Notes to place. `step` is a 16th-note index from 0; there are 16 steps per bar. Drum tracks ignore pitch.","items":{"type":"object","properties":{"step":{"type":"number","description":"Step index, 0-based."},"midi":{"type":"number","description":"MIDI note number, e.g. 60 for C4."},"note":{"type":"string","description":"Alternative to midi, e.g. \"C3\" or \"F#4\"."},"vel":{"type":"number","description":"Velocity 0..1, default 0.85."},"len":{"type":"number","description":"Length in steps, default 1."}},"required":["step"]}}},"required":["trackId","notes"]}}},"required":["label","ops"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_proposals","kind":"answer","impl":"imperative","description":"List proposals and whether the user has accepted, rejected, or not yet answered them.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resolve_proposal","kind":"act","impl":"imperative","description":"Accept or reject a proposal on the user's behalf. Only do this when the user has said clearly which one they want; otherwise leave it for them to click.","inputSchema":{"type":"object","properties":{"proposalId":{"type":"string"},"decision":{"type":"string","enum":["accept","reject"]}},"required":["proposalId","decision"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"diff_since","kind":"answer","impl":"imperative","description":"What changed in the session since a moment in time, and who changed it (user or agent). Call this after the user has been editing to catch up before making further changes — the user can turn knobs and draw notes while you are thinking.","inputSchema":{"type":"object","properties":{"sinceMs":{"type":"number","description":"Unix milliseconds. Use the `now` value from a previous call to chain."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_synth_param","kind":"act","impl":"imperative","description":"Change the sound of the selected track \"kick\" (kick). Parameters: wave (sawtooth/square/triangle/sine), detune (cents), attack/decay/release (seconds), sustain (0..1), cutoff (Hz), resonance (Q), envAmount (Hz of filter sweep). This tool only exists while a track is selected.","inputSchema":{"type":"object","properties":{"param":{"type":"string","enum":["wave","detune","attack","decay","sustain","release","cutoff","resonance","envAmount"]},"value":{"type":["number","string"],"description":"Numeric value, or the waveform name for `wave`."}},"required":["param","value"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"audition_selected","kind":"act","impl":"imperative","description":"Play the selected track \"kick\" once on its own, without starting the transport. Useful for letting the user hear a sound change in isolation.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Media & Personal","favicon":"/favicons/loopsmith.lemon.earth.png","apiSurface":"spec","toolCount":18}}