← WebMCP Directory

Tool tree

listen-synth.netlify.app

Media & PersonalTools verified
Website
A Web Audio synthesizer your AI agent can actually listen to — analyze its own output in real time, then shape the sound with you, in natural language. Accessible sound design for everyone.
Explore capabilities
    get_current_patchAnswer

    Get the full current synthesizer patch: every oscillator, filter, envelope, LFO and FX setting. Call this before changing anything so you know the starting point.

    View tool JSON
    {
      "name": "get_current_patch",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the full current synthesizer patch: every oscillator, filter, envelope, LFO and FX setting. Call this before changing anything so you know the starting point.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    analyze_soundAction

    LISTEN to the synth's live output. Runs real-time FFT + time-domain analysis and returns structured audio features (brightness, bass/mid/high balance, harmonicity, envelope, movement) plus a plain-language summary. Best called WHILE a note is playing — use play_note first, then listen, then adjust.

    View tool JSON
    {
      "name": "analyze_sound",
      "kind": "act",
      "impl": "imperative",
      "description": "LISTEN to the synth's live output. Runs real-time FFT + time-domain analysis and returns structured audio features (brightness, bass/mid/high balance, harmonicity, envelope, movement) plus a plain-language summary. Best called WHILE a note is playing — use play_note first, then listen, then adjust.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    set_paramsAction

    Change MANY synth parameters in ONE call (the whole point: coordinated sound design). Provide a flat map of param paths to values. Paths: oscA/oscB.{wave,octave,detune,level}, sub.level, filter.{cutoff,resonance,envAmount}, env.{attack,decay,sustain,release}, lfo.{wave,rate,toCutoff,toPitch}, fx.{delayTime,delayFeedback,delayMix,reverbMix}, master. Waves: sawtooth,square,triangle,sine.

    View tool JSON
    {
      "name": "set_params",
      "kind": "act",
      "impl": "imperative",
      "description": "Change MANY synth parameters in ONE call (the whole point: coordinated sound design). Provide a flat map of param paths to values. Paths: oscA/oscB.{wave,octave,detune,level}, sub.level, filter.{cutoff,resonance,envAmount}, env.{attack,decay,sustain,release}, lfo.{wave,rate,toCutoff,toPitch}, fx.{delayTime,delayFeedback,delayMix,reverbMix}, master. Waves: sawtooth,square,triangle,sine.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "description": "Flat map of param path → value, e.g. {\"filter.cutoff\": 800, \"env.attack\": 0.002}"
          }
        },
        "required": [
          "params"
        ]
      }
    }
    shape_soundAction

    Translate a natural-language sound goal into coordinated synth moves. Understands words like: darker, brighter, warmer, thicker, thinner, glassy, punchier, smoother, wobblier, womp, spacier, drier, 80s, aggressive, airy, pluckier. Use this when the user describes a vibe rather than exact parameters.

    View tool JSON
    {
      "name": "shape_sound",
      "kind": "act",
      "impl": "imperative",
      "description": "Translate a natural-language sound goal into coordinated synth moves. Understands words like: darker, brighter, warmer, thicker, thinner, glassy, punchier, smoother, wobblier, womp, spacier, drier, 80s, aggressive, airy, pluckier. Use this when the user describes a vibe rather than exact parameters.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "e.g. 'darker and thicker but keep the punch', or 'glassy 80s pad'"
          }
        },
        "required": [
          "description"
        ]
      }
    }
    play_noteAction

    Play a single note. Accepts a MIDI number (60 = middle C) or a note name like 'C4', 'A2', 'F#3'. Hold it long enough to analyze the sound.

    View tool JSON
    {
      "name": "play_note",
      "kind": "act",
      "impl": "imperative",
      "description": "Play a single note. Accepts a MIDI number (60 = middle C) or a note name like 'C4', 'A2', 'F#3'. Hold it long enough to analyze the sound.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "note": {
            "type": [
              "number",
              "string"
            ],
            "description": "MIDI number (e.g. 60) or name (e.g. 'C4')."
          },
          "durationMs": {
            "type": "integer",
            "description": "How long to hold, ms (default 900). Longer is better for analysis."
          }
        },
        "required": [
          "note"
        ]
      }
    }
    play_chordAction

    Play a chord (strummed). Provide 2-5 notes as MIDI numbers or names, or a chord name like 'Cmaj7', 'Am', 'G7'.

    View tool JSON
    {
      "name": "play_chord",
      "kind": "act",
      "impl": "imperative",
      "description": "Play a chord (strummed). Provide 2-5 notes as MIDI numbers or names, or a chord name like 'Cmaj7', 'Am', 'G7'.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "notes": {
            "type": "array",
            "items": {
              "type": [
                "number",
                "string"
              ]
            },
            "description": "e.g. ['C4','E4','G4'] or [60,64,67]"
          },
          "chord": {
            "type": "string",
            "description": "Alternatively a chord name like 'Cmaj7', 'Am', 'F#m7'."
          },
          "durationMs": {
            "type": "integer"
          }
        }
      }
    }
    describe_current_soundAnswer

    Get a producer's description of the current patch WITHOUT needing audio — derived from the parameter values themselves. Useful when audio isn't playing.

    View tool JSON
    {
      "name": "describe_current_sound",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get a producer's description of the current patch WITHOUT needing audio — derived from the parameter values themselves. Useful when audio isn't playing.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    save_presetAction

    Save the current sound as a named preset. The preset AUTOMATICALLY becomes a new agent tool (load_preset__<name>) that you or the user can call later. This is dynamic tool registration in action.

    View tool JSON
    {
      "name": "save_preset",
      "kind": "act",
      "impl": "imperative",
      "description": "Save the current sound as a named preset. The preset AUTOMATICALLY becomes a new agent tool (load_preset__<name>) that you or the user can call later. This is dynamic tool registration in action.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "A short name, e.g. 'dark_pluck' or 'Glass Pad'"
          }
        },
        "required": [
          "name"
        ]
      }
    }
    list_presetsAnswer

    List all available presets (built-in + user-saved) and which are currently exposed as tools.

    View tool JSON
    {
      "name": "list_presets",
      "kind": "answer",
      "impl": "imperative",
      "description": "List all available presets (built-in + user-saved) and which are currently exposed as tools.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    randomize_patchAction

    Randomize the patch within a musical vibe for inspiration. Great starting point for a sound-hunt.

    View tool JSON
    {
      "name": "randomize_patch",
      "kind": "act",
      "impl": "imperative",
      "description": "Randomize the patch within a musical vibe for inspiration. Great starting point for a sound-hunt.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "vibe": {
            "type": "string",
            "description": "bass | pad | pluck | lead (default: any)"
          }
        }
      }
    }
    watch_for_changesAnswer

    Ask what the HUMAN has changed by hand since a given time (or since your last tool call). Returns which knobs they turned, old→new values, so you can respond to their intent — the heart of two-way collaboration. Call this before big moves, or when the user says 'what did I just do?'.

    View tool JSON
    {
      "name": "watch_for_changes",
      "kind": "answer",
      "impl": "imperative",
      "description": "Ask what the HUMAN has changed by hand since a given time (or since your last tool call). Returns which knobs they turned, old→new values, so you can respond to their intent — the heart of two-way collaboration. Call this before big moves, or when the user says 'what did I just do?'.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sinceMs": {
            "type": "integer",
            "description": "Unix ms timestamp. Omit to use the time of the last analyze_sound call."
          }
        }
      }
    }
    compare_to_targetAction

    Score how close the CURRENT sound is to a described target (e.g. 'dark, thick, punchy'), and suggest the single next best move. Use this to iterate toward a vibe with the user: analyze → compare → adjust → repeat.

    View tool JSON
    {
      "name": "compare_to_target",
      "kind": "act",
      "impl": "imperative",
      "description": "Score how close the CURRENT sound is to a described target (e.g. 'dark, thick, punchy'), and suggest the single next best move. Use this to iterate toward a vibe with the user: analyze → compare → adjust → repeat.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "Target description, e.g. 'dark and punchy' or 'bright glassy pad'"
          }
        },
        "required": [
          "target"
        ]
      }
    }
    explain_sound_in_plain_wordsAction

    Explain the current sound in everyday, non-technical language — for users who don't know synthesis or who use a screen reader. Returns a friendly paragraph plus per-knob plain descriptions. Use this to make sound design accessible to everyone.

    View tool JSON
    {
      "name": "explain_sound_in_plain_words",
      "kind": "act",
      "impl": "imperative",
      "description": "Explain the current sound in everyday, non-technical language — for users who don't know synthesis or who use a screen reader. Returns a friendly paragraph plus per-knob plain descriptions. Use this to make sound design accessible to everyone.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    compose_patternAction

    Compose a musical loop (bassline / arp / pad / lead) that fits the CURRENT sound you designed. You provide the vibe; this builds a 16-step-per-bar pattern and loads it. Then play_pattern to hear it, and render_to_wav to export it. Call after you're happy with the sound.

    View tool JSON
    {
      "name": "compose_pattern",
      "kind": "act",
      "impl": "imperative",
      "description": "Compose a musical loop (bassline / arp / pad / lead) that fits the CURRENT sound you designed. You provide the vibe; this builds a 16-step-per-bar pattern and loads it. Then play_pattern to hear it, and render_to_wav to export it. Call after you're happy with the sound.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "vibe": {
            "type": "string",
            "description": "e.g. 'dark techno bassline', 'dreamy arp', 'sparse minimal'"
          },
          "bars": {
            "type": "integer",
            "description": "1-4 bars (default 2)"
          },
          "root": {
            "type": "integer",
            "description": "MIDI root note (default 45 = A2)"
          },
          "scale": {
            "type": "string",
            "enum": [
              "minor",
              "major",
              "dorian",
              "pentatonic",
              "chromatic"
            ]
          },
          "bpm": {
            "type": "integer",
            "description": "70-180 (default inferred from vibe)"
          },
          "density": {
            "type": "number",
            "description": "0-1, how busy (default from vibe)"
          },
          "rhythmStyle": {
            "type": "string",
            "enum": [
              "bass",
              "arp",
              "pad",
              "lead"
            ],
            "description": "Pattern archetype (default from vibe)"
          }
        },
        "required": [
          "vibe"
        ]
      }
    }
    play_patternAction

    Play the currently composed pattern as a loop through the synth. Stop with stop_pattern.

    View tool JSON
    {
      "name": "play_pattern",
      "kind": "act",
      "impl": "imperative",
      "description": "Play the currently composed pattern as a loop through the synth. Stop with stop_pattern.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    stop_patternAction

    Stop the looping pattern.

    View tool JSON
    {
      "name": "stop_pattern",
      "kind": "act",
      "impl": "imperative",
      "description": "Stop the looping pattern.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    render_to_wavAction

    BOUNCE the current sound + composed pattern to a downloadable WAV file (44.1kHz stereo 16-bit). This produces a real audio artifact the user keeps. Call after composing a pattern and confirming the sound with analyze_sound.

    View tool JSON
    {
      "name": "render_to_wav",
      "kind": "act",
      "impl": "imperative",
      "description": "BOUNCE the current sound + composed pattern to a downloadable WAV file (44.1kHz stereo 16-bit). This produces a real audio artifact the user keeps. Call after composing a pattern and confirming the sound with analyze_sound.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bars": {
            "type": "integer",
            "description": "1-16 bars to render (default: the pattern's length)"
          },
          "name": {
            "type": "string",
            "description": "File name base, e.g. 'dark-techno-bass' (default from vibe)"
          }
        }
      }
    }
    generate_sound_cardAction

    Generate a 'Sound DNA' card: a shareable PNG that captures what you (the agent) HEARD — your own descriptive words, the waveform, spectrum, and the full patch recipe. A reproducible artifact of the sound. Call after analyze_sound.

    View tool JSON
    {
      "name": "generate_sound_card",
      "kind": "act",
      "impl": "imperative",
      "description": "Generate a 'Sound DNA' card: a shareable PNG that captures what you (the agent) HEARD — your own descriptive words, the waveform, spectrum, and the full patch recipe. A reproducible artifact of the sound. Call after analyze_sound.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Sound name, e.g. 'midnight_bass'"
          },
          "vibe": {
            "type": "string",
            "description": "Short descriptor; defaults to your analyze_sound summary"
          }
        }
      }
    }
    export_vital_presetAction

    Export the CURRENT sound as a production-ready VITAL preset (.vital) — the free, most popular Serum alternative — that producers can load straight into their DAW. The sound you designed together becomes a real studio instrument, not just a browser demo. Use after the sound is finalized.

    View tool JSON
    {
      "name": "export_vital_preset",
      "kind": "act",
      "impl": "imperative",
      "description": "Export the CURRENT sound as a production-ready VITAL preset (.vital) — the free, most popular Serum alternative — that producers can load straight into their DAW. The sound you designed together becomes a real studio instrument, not just a browser demo. Use after the sound is finalized.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Preset name, e.g. 'dark_techno_bass'"
          },
          "style": {
            "type": "string",
            "description": "Optional style tag, e.g. 'bass', 'pad', 'lead'"
          }
        },
        "required": [
          "name"
        ]
      }
    }
    describe_capabilitiesAnswer

    Explain what this agent-native synth lets humans and agents do together, and the recommended listen-adjust loop.

    View tool JSON
    {
      "name": "describe_capabilities",
      "kind": "answer",
      "impl": "imperative",
      "description": "Explain what this agent-native synth lets humans and agents do together, and the recommended listen-adjust loop.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }