← WebMCP Directory

Tool tree

loopsmith.lemon.earth

Media & PersonalTools verified
Website
A browser DAW that exposes WebMCP tools so an agent can compose, arrange and actually measure the mix.
Explore capabilities
    get_projectAnswer

    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.

    View tool JSON
    {
      "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": {}
      }
    }
    describe_arrangementAnswer

    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.

    View tool JSON
    {
      "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": {}
      }
    }
    analyze_mixAction

    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.

    View tool JSON
    {
      "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."
          }
        }
      }
    }
    set_tempoAction

    Set the tempo in BPM and/or the swing amount applied to off-beat 16th notes.

    View tool JSON
    {
      "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."
          }
        }
      }
    }
    add_trackAction

    Add an instrument track. Kinds: kick, snare, hat (drum synths, pitch ignored), bass, keys, lead (subtractive synths). Returns the new track id.

    View tool JSON
    {
      "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"
        ]
      }
    }
    remove_trackAction

    Delete a track and its pattern.

    View tool JSON
    {
      "name": "remove_track",
      "kind": "act",
      "impl": "imperative",
      "description": "Delete a track and its pattern.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "trackId": {
            "type": "string"
          }
        },
        "required": [
          "trackId"
        ]
      }
    }
    write_patternAction

    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.

    View tool JSON
    {
      "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"
        ]
      }
    }
    clear_patternAction

    Remove every note from a track, keeping its sound and mixer settings.

    View tool JSON
    {
      "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"
        ]
      }
    }
    set_mixAction

    Set a track's level in dB, stereo pan, mute or solo.

    View tool JSON
    {
      "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"
        ]
      }
    }
    set_eqAction

    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.

    View tool JSON
    {
      "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"
        ]
      }
    }
    transportAction

    Start or stop playback. The loop plays continuously and edits are heard immediately.

    View tool JSON
    {
      "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"
        ]
      }
    }
    select_trackAction

    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.

    View tool JSON
    {
      "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"
        ]
      }
    }
    propose_patternAction

    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.

    View tool JSON
    {
      "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"
        ]
      }
    }
    list_proposalsAnswer

    List proposals and whether the user has accepted, rejected, or not yet answered them.

    View tool JSON
    {
      "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": {}
      }
    }
    resolve_proposalAction

    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.

    View tool JSON
    {
      "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"
        ]
      }
    }
    diff_sinceAnswer

    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.

    View tool JSON
    {
      "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."
          }
        }
      }
    }
    set_synth_paramAction

    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.

    View tool JSON
    {
      "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"
        ]
      }
    }
    audition_selectedAction

    Play the selected track "kick" once on its own, without starting the transport. Useful for letting the user hear a sound change in isolation.

    View tool JSON
    {
      "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": {}
      }
    }