MCP server for a guitar practice app with YouTube video playback control, loop engine, metronome, and practice library management
16 tools with mostly complete schemas and descriptions, but significant gaps in parameter documentation and error handling guidance. Tool names follow verb_noun convention well (save_video, find_videos, loop_section). Descriptions average ~120 chars, within acceptable range but often lack context on when to use vs. similar tools. Input schemas present for all tools with type info, but many parameters lack descriptions or constraints. Output schemas not documented. Error recovery guidance absent. No tool annotations (readOnlyHint/destructiveHint). Composition is sound, tools are single-purpose and chainable.
Delete a saved timestamp by label. Defaults to the currently open video.
Search the practice library by title (case-insensitive substring). Omit query to list the 10 most recent videos.
Get the full current state: player (video, position, speed, volume, pause, active loop, ad status) and metronome. Works even when the extension is disconnected (reports that instead of failing).
List all saved timestamps/sections for a video. Defaults to the currently open video.
Loop a section of the current video N times, optionally at a different speed each pass (e.g. speeds=[0.5,0.75,1.0]). Give either `label` (a saved section, or a "...start"/"...end" timestamp pair) or explicit `start`+`end`. Returns IMMEDIATELY while looping continues in the background — do NOT wait, sleep, or poll for completion; just tell the user the ETA. The user can interrupt anytime with stop_loop.
Start (or retune) the standalone metronome — a detached audio process independent of the browser. Idempotent: calling while running changes tempo/signature live without a restart. BPM = clicks per minute; the time signature numerator = clicks per bar, with beat 1 accented (so "3/2 at 50" means 50 half-note clicks/min, 3 per bar).
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields without knowing response structure (e.g., what does find_videos return? list of objects with which fields?).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools marked with Risk=WRITE/DESTRUCTIVE in metadata but not in schema. LLMs cannot distinguish safe reads from destructive writes without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Stop the metronome.
Open a video in the managed YouTube tab (reuses the existing tab). Accepts a saved title (fuzzy matched) or a raw YouTube URL. If multiple library entries match, returns the candidates instead of guessing.
Pause video playback.
Resume playback, optionally from a position. `from` accepts a time ("1:30", "90", "1m30s") or a saved timestamp label ("intro solo start").
Save a named timestamp on a video. Omit `time` to capture the CURRENT playback position ("save this spot as ..."). Provide `end_time` to make it a loopable section. Defaults to the currently open video; saving the same label overwrites it.
Save a YouTube video to the practice library under a memorable title. Accepts any YouTube URL form. Upserts: saving the same video again just updates its title.
Jump to a position without changing play/pause state. Accepts a time or a saved timestamp label.
Set playback speed. Accepts 0.25–2.0, with or without an "x" suffix (e.g. "0.75x").
Set the video volume (the player element only, not system volume). Absolute 0–100, or relative "+10"/"-10".
Cancel the active loop (playback pauses and the pre-loop speed is restored).
Parameter descriptions missing or minimal for several tools. E.g., set_speed accepts 'string|number' but description does not clarify format (0.75 vs 0.75x vs 75%). set_volume accepts relative changes (+10/-10) but constraint not stated in description.
No error recovery guidance. Tools like open_video state 'returns candidates instead of guessing' but do not document what error response looks like or how LLM should handle ambiguity. delete_timestamp has no guidance on 'label not found' case.
Destructive operations (delete_timestamp) lack confirmation/dry-run pattern. No mention of undo capability or confirmation step before permanent deletion.