An agent-native browser DAW. WebMCP gives agents ears. A music studio that runs entirely in the browser and publishes WebMCP tools for agents and humans to collaborate on music loops.
Loopsmith demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive schemas, and detailed descriptions. All 19 tools have explicit input schemas with typed properties and descriptions. Most descriptions are well-crafted (100-300 chars), explaining WHAT the tool does and WHEN to use it. However, output schemas are not documented, responses are returned as text summaries with JSON data appended, making it hard for LLMs to parse structured results. Error handling is minimal; most tools lack recovery guidance. Parameter descriptions are generally good but some lack range/constraint details (e.g., set_eq frequencies lack min/max in descriptions despite being in code). Tool composition is excellent, each tool has one clear responsibility, and output IDs chain properly for downstream calls.
Accept a proposal, applying all its changes.
Add an instrument track. Kinds: kick, snare, hat (drum synths, pitch ignored), bass, keys, lead (subtractive synths). Returns the new track id.
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.
Play one track's pattern once without touching the transport.
Remove every note from a track, keeping its sound and mixer settings.
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.
Output schemas not documented. Tools return text summaries with JSON appended (ok() helper), but LLMs cannot parse the structure. Responses lack typed field definitions, forcing LLMs to extract data via string parsing.
Numeric parameter constraints lack descriptions. set_eq (hpf, peakFreq, lpf) and set_synth (cutoff, envAmount) have range limits in code but descriptions omit min/max values. LLMs cannot infer valid ranges from names alone.
Error handling is minimal. Most tools lack recovery guidance. E.g., if add_track fails due to invalid kind, the error does not suggest valid kinds or next steps. No categorization of retryable vs fatal errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Report what changed since a timestamp (in milliseconds). Useful after the user edits something: ask the page what they touched.
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.
Mute or unmute a track.
Propose a change to one or more tracks as ghost notes. The user must accept it before it takes effect. Returns a proposal id.
Reject a proposal, discarding it.
Delete a track and its pattern.
Adjust a track's EQ: high-pass filter, peaking filter, and low-pass filter.
Adjust a track's volume and pan.
Adjust a track's synth parameters: waveform, filter cutoff, resonance, envelope, and detune.
Set the tempo in BPM and/or the swing amount applied to off-beat 16th notes.
Solo or unsolo a track.
Play or stop the loop.
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.
Destructive operations (remove_track, clear_pattern) lack confirmation or dry-run support. Agents can delete tracks without preview. No idempotency guarantees documented.
Transport mechanism unknown. package.json shows Vite build (browser app), but MCP transport (HTTP, STDIO, SSE) is not declared. Cannot assess protocol readiness without knowing how tools are exposed to agents.