← WebMCP Directory

Tool tree

mrinkl.github.io

Media & PersonalTools verified
Website
You play. Your agent arranges. A four-track loop sequencer that exposes its state as WebMCP tools, so ChatGPT or Chrome can add drums, chords and bass under what you just played — and ask your ears…
Explore capabilities
    get_sessionAnswer

    Read the whole session in one call: key, tempo, swing, style, mode, position, per-track note counts split human/agent, the progression, recent human actions, undo depth and any open audition. Use when you need context before acting or after the human changed something. Returns a summary under 700 characters, not the notes; call get_track for those.

    View tool JSON
    {
      "name": "get_session",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the whole session in one call: key, tempo, swing, style, mode, position, per-track note counts split human/agent, the progression, recent human actions, undo depth and any open audition. Use when you need context before acting or after the human changed something. Returns a summary under 700 characters, not the notes; call get_track for those.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    get_trackAnswer

    Read one track as compact per-bar text: scale degree@step for bass, chords and lead, or 16-character lane patterns for drums, with human and agent note counts. Use when the human asks what they just played or you need exact pitches before harmonising or editing. Pass bars to read a subset; the reply stays under 1500 characters.

    View tool JSON
    {
      "name": "get_track",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read one track as compact per-bar text: scale degree@step for bass, chords and lead, or 16-character lane patterns for drums, with human and agent note counts. Use when the human asks what they just played or you need exact pitches before harmonising or editing. Pass bars to read a subset; the reply stays under 1500 characters.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "enum": [
              "drums",
              "bass",
              "chords",
              "lead"
            ],
            "description": "Track to read: drums, bass, chords, lead."
          },
          "bars": {
            "type": "array",
            "description": "Bars to include, 1 to 4 (1 to 4 entries). Omit for all four bars.",
            "minItems": 1,
            "maxItems": 4,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4,
              "description": "Bar number, 1 to 4."
            }
          }
        },
        "required": [
          "track"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    suggest_chordsAction

    Analyse the human melody on the lead track and rank 4-bar chord progressions that fit it, with detected key candidates and a reason per suggestion; writes nothing. Use when the human asks what chords or harmony go under what they played, before calling add_chords. Needs notes on the lead track; returns error no_melody otherwise.

    View tool JSON
    {
      "name": "suggest_chords",
      "kind": "act",
      "impl": "imperative",
      "description": "Analyse the human melody on the lead track and rank 4-bar chord progressions that fit it, with detected key candidates and a reason per suggestion; writes nothing. Use when the human asks what chords or harmony go under what they played, before calling add_chords. Needs notes on the lead track; returns error no_melody otherwise.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "n": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 3,
            "description": "How many suggestions to return, 1 to 5. Default 3."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    auditionAction

    Play the human 2 or 3 variants (progression, rhythm, bass pattern, drum density, tempo, swing) in the tab and wait for them to keep one; the pick is applied as one undoable action. Use when the human asks to hear or compare options, or you cannot pick between two ideas by theory. Waits up to wait_seconds, then returns awaiting_human, card open.

    View tool JSON
    {
      "name": "audition",
      "kind": "act",
      "impl": "imperative",
      "description": "Play the human 2 or 3 variants (progression, rhythm, bass pattern, drum density, tempo, swing) in the tab and wait for them to keep one; the pick is applied as one undoable action. Use when the human asks to hear or compare options, or you cannot pick between two ideas by theory. Waits up to wait_seconds, then returns awaiting_human, card open.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "question": {
            "type": "string",
            "maxLength": 120,
            "description": "Question shown above the options, up to 120 characters, e.g. \"Walking or octave bass?\"."
          },
          "options": {
            "type": "array",
            "minItems": 2,
            "maxItems": 3,
            "description": "2 or 3 variants to compare. Each has a label, an optional why, and the changes it applies.",
            "items": {
              "type": "object",
              "description": "One variant the human can preview and keep.",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 40,
                  "description": "Short name on the button, 1 to 40 characters, e.g. \"Walking\"."
                },
                "why": {
                  "type": "string",
                  "maxLength": 80,
                  "description": "One-line reason to consider it, up to 80 characters."
                },
                "changes": {
                  "type": "object",
                  "description": "What this variant changes versus the current session. Omitted fields stay as they are.",
                  "properties": {
                    "progression": {
                      "type": "array",
                      "description": "Chord progression, 1 to 4 chords (numerals or names), written to the chords track.",
                      "minItems": 1,
                      "maxItems": 4,
                      "items": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 12,
                        "description": "One chord as a Roman numeral (i, VI, bVII, V7, iiø7) or a chord name (Am, Fmaj7, G7, Bb)."
                      }
                    },
                    "rhythm": {
                      "type": "string",
                      "enum": [
                        "pad",
                        "stab",
                        "arp",
                        "pulse",
                        "offbeat"
                      ],
                      "description": "Chord rhythm: pad, stab, arp, pulse or offbeat."
                    },
                    "bass_pattern": {
                      "type": "string",
                      "enum": [
                        "root",
                        "root_fifth",
                        "octave",
                        "walking",
                        "follow_kick"
                      ],
                      "description": "Bass pattern: root, root_fifth, octave, walking or follow_kick."
                    },
                    "drum_density": {
                      "type": "string",
                      "enum": [
                        "sparse",
                        "medium",
                        "busy"
                      ],
                      "description": "Drum density: sparse, medium or busy."
                    },
                    "tempo": {
                      "type": "integer",
                      "minimum": 60,
                      "maximum": 180,
                      "description": "Tempo in BPM, 60 to 180."
                    },
                    "swing": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 60,
                      "description": "Swing amount, 0 to 60."
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              },
              "required": [
                "label",
                "changes"
              ],
              "additionalProperties": false
            }
          },
          "wait_seconds": {
            "type": "integer",
            "minimum": 5,
            "maximum": 60,
            "default": 25,
            "description": "How long to wait for the human to choose, 5 to 60 seconds. Default 25."
          }
        },
        "required": [
          "options"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    undoAction

    Revert the most recent agent actions, one or more steps, or everything back to a given undo_id. Use when the human says undo, revert, go back, or dislikes what you just added. Refuses with reason top_is_human_action when the newest change is the human's own work (they undo with Cmd+Z).

    View tool JSON
    {
      "name": "undo",
      "kind": "act",
      "impl": "imperative",
      "description": "Revert the most recent agent actions, one or more steps, or everything back to a given undo_id. Use when the human says undo, revert, go back, or dislikes what you just added. Refuses with reason top_is_human_action when the newest change is the human's own work (they undo with Cmd+Z).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "undo_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40,
            "description": "Revert to just before this undo_id (as returned by a writer). Overrides steps."
          },
          "steps": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 1,
            "description": "How many agent actions to undo, 1 to 5. Default 1."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    transportAction

    Start or stop loop playback, optionally from a given bar, and report the playhead position and audio state. Use when the human asks to play, start, stop, pause, or hear it from bar 3. Before the first tap in the tab, play returns audio muted_until_user_taps; ask the human to press Play once.

    View tool JSON
    {
      "name": "transport",
      "kind": "act",
      "impl": "imperative",
      "description": "Start or stop loop playback, optionally from a given bar, and report the playhead position and audio state. Use when the human asks to play, start, stop, pause, or hear it from bar 3. Before the first tap in the tab, play returns audio muted_until_user_taps; ask the human to press Play once.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "play",
              "stop"
            ],
            "description": "play starts the loop (or keeps it running); stop halts it."
          },
          "from_bar": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4,
            "description": "Bar to start from when playing, 1 to 4. Default: bar 1."
          }
        },
        "required": [
          "action"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    export_midiAction

    Build a Standard MIDI File of all four tracks and arm the Download button in the header with it; nothing downloads until the human clicks. Use when the human wants to export, save, or take the loop into a DAW such as Logic, Ableton or GarageBand. Filename is letters, digits, _ or - only, 1 to 40 characters; the .mid extension is added.

    View tool JSON
    {
      "name": "export_midi",
      "kind": "act",
      "impl": "imperative",
      "description": "Build a Standard MIDI File of all four tracks and arm the Download button in the header with it; nothing downloads until the human clicks. Use when the human wants to export, save, or take the loop into a DAW such as Logic, Ableton or GarageBand. Filename is letters, digits, _ or - only, 1 to 40 characters; the .mid extension is added.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40,
            "pattern": "^[A-Za-z0-9_-]{1,40}$",
            "description": "File name without extension: letters, digits, _ or -, 1 to 40 characters. Default bandmate."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    set_grooveAction

    Set tempo, key, mode, swing, style or metronome in one call; notes transpose to a new key unless transpose_content is false. Use when the human wants it faster, slower, in another key, more swing, or another sound (lofi, house, synthwave). Only the fields you pass change. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "set_groove",
      "kind": "act",
      "impl": "imperative",
      "description": "Set tempo, key, mode, swing, style or metronome in one call; notes transpose to a new key unless transpose_content is false. Use when the human wants it faster, slower, in another key, more swing, or another sound (lofi, house, synthwave). Only the fields you pass change. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tempo": {
            "type": "integer",
            "minimum": 60,
            "maximum": 180,
            "description": "Tempo in BPM, 60 to 180."
          },
          "key": {
            "type": "string",
            "enum": [
              "C",
              "C#",
              "Db",
              "D",
              "D#",
              "Eb",
              "E",
              "F",
              "F#",
              "Gb",
              "G",
              "G#",
              "Ab",
              "A",
              "A#",
              "Bb",
              "B"
            ],
            "description": "Tonic, sharps or flats: C, C#, Db, D, D#, Eb, E, F, F#, Gb, G, G#, Ab, A, A#, Bb, B. Flats are normalised to sharps."
          },
          "mode": {
            "type": "string",
            "enum": [
              "major",
              "minor"
            ],
            "description": "Scale mode: major or minor."
          },
          "swing": {
            "type": "integer",
            "minimum": 0,
            "maximum": 60,
            "description": "Swing amount, 0 to 60 (0 straight, 30 is a classic MPC feel, 60 heavy)."
          },
          "style": {
            "type": "string",
            "enum": [
              "lofi",
              "house",
              "synthwave"
            ],
            "description": "Sound preset: lofi, house or synthwave. Changes drum tables, filter, reverb and defaults."
          },
          "metronome": {
            "type": "boolean",
            "description": "true turns the metronome click on, false turns it off."
          },
          "transpose_content": {
            "type": "boolean",
            "default": true,
            "description": "When key or mode changes: true (default) transposes existing notes, false leaves them as they are."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    add_chordsAction

    Write a 4-bar chord progression to the chords track from Roman numerals or chord names (1 or 2 repeat to fill 4 bars), voiced smoothly. Use when the human wants chords, harmony or a progression under a melody; for single notes use write_notes. Replaces the chords track. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "add_chords",
      "kind": "act",
      "impl": "imperative",
      "description": "Write a 4-bar chord progression to the chords track from Roman numerals or chord names (1 or 2 repeat to fill 4 bars), voiced smoothly. Use when the human wants chords, harmony or a progression under a melody; for single notes use write_notes. Replaces the chords track. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "progression": {
            "type": "array",
            "description": "One chord per bar, 1 to 4 entries: numerals (i, VI, III, VII, bVII, V7) or names (Am, F, Bb, G7).",
            "minItems": 1,
            "maxItems": 4,
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 12,
              "description": "One chord as a Roman numeral (i, VI, bVII, V7, iiø7) or a chord name (Am, Fmaj7, G7, Bb)."
            }
          },
          "rhythm": {
            "type": "string",
            "enum": [
              "pad",
              "stab",
              "arp",
              "pulse",
              "offbeat"
            ],
            "description": "Articulation: pad (held), stab (short hits), arp (arpeggio), pulse (8ths), offbeat. Default per style."
          }
        },
        "required": [
          "progression"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    add_bassAction

    Generate a bass line on the bass track that follows the current chord progression using a named pattern. Use when the human asks for bass, a bassline or low end under the chords. Requires chords first (call add_chords); otherwise returns error needs_chords. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "add_bass",
      "kind": "act",
      "impl": "imperative",
      "description": "Generate a bass line on the bass track that follows the current chord progression using a named pattern. Use when the human asks for bass, a bassline or low end under the chords. Requires chords first (call add_chords); otherwise returns error needs_chords. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pattern": {
            "type": "string",
            "enum": [
              "root",
              "root_fifth",
              "octave",
              "walking",
              "follow_kick"
            ],
            "description": "Bass pattern: root, root_fifth, octave, walking, or follow_kick (root on every kick). Default root."
          },
          "octave": {
            "type": "integer",
            "enum": [
              1,
              2
            ],
            "default": 2,
            "description": "Register: 2 (default, D2 to D3) or 1 (an octave lower, sub bass)."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    add_drumsAction

    Write a whole drum beat (kick, snare or clap, hats, percussion) for all 4 bars from the style tables at a chosen density, with an optional bar-4 fill. Use when the human asks for drums, a beat or a groove; to change one lane use set_drum_steps. Replaces the drum track. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "add_drums",
      "kind": "act",
      "impl": "imperative",
      "description": "Write a whole drum beat (kick, snare or clap, hats, percussion) for all 4 bars from the style tables at a chosen density, with an optional bar-4 fill. Use when the human asks for drums, a beat or a groove; to change one lane use set_drum_steps. Replaces the drum track. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "density": {
            "type": "string",
            "enum": [
              "sparse",
              "medium",
              "busy"
            ],
            "description": "Busyness: sparse (kick and snare only), medium (default) or busy (16th hats, ghosts)."
          },
          "fill": {
            "type": "boolean",
            "default": true,
            "description": "true (default) adds a snare fill in bar 4; false keeps bar 4 plain."
          },
          "style": {
            "type": "string",
            "enum": [
              "lofi",
              "house",
              "synthwave"
            ],
            "description": "Pattern table to use: lofi, house or synthwave. Defaults to the session style."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    write_notesAction

    Write single notes (note names or scale degrees at bar/step) to bass, chords or lead, merging with or replacing what is there. Use when the human wants a melody, riff, hook or note edit; for a chord progression use add_chords. Max 64 notes; pitches clamp to the track range. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "write_notes",
      "kind": "act",
      "impl": "imperative",
      "description": "Write single notes (note names or scale degrees at bar/step) to bass, chords or lead, merging with or replacing what is there. Use when the human wants a melody, riff, hook or note edit; for a chord progression use add_chords. Max 64 notes; pitches clamp to the track range. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "enum": [
              "bass",
              "chords",
              "lead"
            ],
            "description": "Melodic track to write: bass, chords, lead. Drums use set_drum_steps."
          },
          "notes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 64,
            "description": "Notes to write, 1 to 64. Each has bar, step, note and optional octave, length, velocity.",
            "items": {
              "type": "object",
              "description": "One note placed at a bar and 16th step.",
              "properties": {
                "bar": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 4,
                  "description": "Bar, 1 to 4."
                },
                "step": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16,
                  "description": "16th step within the bar, 1 to 16 (1 is the downbeat)."
                },
                "note": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 4,
                  "pattern": "^([A-G][#b]?[0-8]|[#b]?[1-7])$",
                  "description": "Note name with octave, upper-case (C4, F#3, Bb2), or scale degree 1 to 7 with b or # prefix (b3, #4)."
                },
                "octave": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 7,
                  "description": "Octave for a scale degree, 1 to 7. Default: the track home octave (bass 2, chords 4, lead 4)."
                },
                "length": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16,
                  "default": 1,
                  "description": "Length in 16th steps, 1 to 16. Default 1."
                },
                "velocity": {
                  "type": "number",
                  "minimum": 0.1,
                  "maximum": 1,
                  "default": 0.8,
                  "description": "Loudness 0.1 to 1. Default 0.8; 0.9 and above renders as an accent."
                }
              },
              "required": [
                "bar",
                "step",
                "note"
              ],
              "additionalProperties": false
            }
          },
          "mode": {
            "type": "string",
            "enum": [
              "merge",
              "replace"
            ],
            "default": "merge",
            "description": "merge (default) adds to existing notes; replace clears the track first (asks if human notes go)."
          }
        },
        "required": [
          "track",
          "notes"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    set_drum_stepsAction

    Set one drum lane to a 16-step pattern of X (accent), x (hit), o (ghost) and . (rest), for all or given bars. Use when the human wants to tweak one lane (more hats, kick on every beat, ghost snares); for a whole beat use add_drums. The pattern is exactly 16 characters. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "set_drum_steps",
      "kind": "act",
      "impl": "imperative",
      "description": "Set one drum lane to a 16-step pattern of X (accent), x (hit), o (ghost) and . (rest), for all or given bars. Use when the human wants to tweak one lane (more hats, kick on every beat, ghost snares); for a whole beat use add_drums. The pattern is exactly 16 characters. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lane": {
            "type": "string",
            "enum": [
              "kick",
              "snare",
              "clap",
              "hat",
              "openhat",
              "perc"
            ],
            "description": "Drum lane: kick, snare, clap, hat, openhat, perc."
          },
          "pattern": {
            "type": "string",
            "minLength": 16,
            "maxLength": 16,
            "pattern": "^[Xxo.\\-01]{16}$",
            "description": "16 characters, one per 16th: X accent, x hit, o ghost, . rest (- and 0 rest, 1 hit). E.g. x.o.x.o.x.o.x.o."
          },
          "bars": {
            "type": "array",
            "description": "Bars to write, 1 to 4 (1 to 4 entries). Omit to write all four bars.",
            "minItems": 1,
            "maxItems": 4,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4,
              "description": "Bar number, 1 to 4."
            }
          }
        },
        "required": [
          "lane",
          "pattern"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    set_trackAction

    Mute, unmute, solo or set the volume of one track without touching its notes; idempotent. Use when the human asks to silence, bring back, isolate, turn up or turn down a track. Only the fields you pass change. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "set_track",
      "kind": "act",
      "impl": "imperative",
      "description": "Mute, unmute, solo or set the volume of one track without touching its notes; idempotent. Use when the human asks to silence, bring back, isolate, turn up or turn down a track. Only the fields you pass change. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "enum": [
              "drums",
              "bass",
              "chords",
              "lead"
            ],
            "description": "Track to change: drums, bass, chords, lead."
          },
          "muted": {
            "type": "boolean",
            "description": "true mutes the track, false unmutes it."
          },
          "solo": {
            "type": "boolean",
            "description": "true solos the track (others go quiet), false clears solo."
          },
          "volume_db": {
            "type": "number",
            "minimum": -24,
            "maximum": 6,
            "description": "Track gain in dB, -24 to 6. Defaults: drums -4, bass -8, chords -12, lead -10."
          }
        },
        "required": [
          "track"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }
    clear_trackAction

    Remove every note or hit from one track, human and agent alike; the human confirms first when the track is not empty. Use when the human explicitly says to wipe, clear, delete or empty a track. Never call it to make room before writing; other writers replace on their own. Visible in the grid immediately; the loop keeps playing; returns undo_id.

    View tool JSON
    {
      "name": "clear_track",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove every note or hit from one track, human and agent alike; the human confirms first when the track is not empty. Use when the human explicitly says to wipe, clear, delete or empty a track. Never call it to make room before writing; other writers replace on their own. Visible in the grid immediately; the loop keeps playing; returns undo_id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "track": {
            "type": "string",
            "enum": [
              "drums",
              "bass",
              "chords",
              "lead"
            ],
            "description": "Track to empty: drums, bass, chords, lead."
          }
        },
        "required": [
          "track"
        ],
        "additionalProperties": false
      },
      "page": "/bandmate/"
    }