YouTube Music MCP server for searching, playing, downloading songs, managing playlists, and scraping listening history
ytm-mcp has 12 tools with basic schemas and descriptions, but significant gaps prevent production use. All tools have descriptions (10-80 chars, mostly short), and input schemas are present with type definitions. However, parameter descriptions are sparse or missing entirely. Most parameters lack guidance on valid ranges, formats, or dependencies. Output schemas are undocumented, LLMs cannot predict what fields to expect. Error handling is absent; no recovery guidance or actionable error messages. Tool naming is reasonable (verb_noun pattern), but composition issues exist: playback_control conflates 8 distinct actions into one tool, and download_history + download_song could be unified. No security annotations, no idempotency hints, no permission gates. Baseline: 549 production tools average 194 chars for descriptions and 72 chars per param; ytm-mcp averages ~40 chars for descriptions and most params lack any description text.
Add songs to a playlist
Create a new local playlist
Download last N songs from listening history
Download a song by YouTube Music URL
Export a playlist as JSON or CSV
Get the currently playing song
Get YouTube Music listening history (scrapes live or returns cached)
playback_control conflates 8 distinct actions (play, pause, next, previous, shuffle, repeat, like, dislike) into one tool. This violates single-responsibility principle and forces LLMs to reason about which action to invoke. Should split into separate tools: play_song, pause_playback, next_track, previous_track, toggle_shuffle, toggle_repeat, like_song, dislike_song.
Output schemas are completely undocumented. LLMs cannot predict what fields get_history, list_playlists, or search_song return. This forces agents to guess field names for downstream tool calls and risks broken chains. Every tool must document its return type with field names and types.
Parameter descriptions are missing or trivial. 'query' in search_song has no description. 'action' in playback_control has no description. 'format' in download_song lacks guidance on when to use opus vs mp3. Baseline: 100% of A+ tools have descriptions for every parameter.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 44 | 2026-07-28+ | v2 |
List all downloaded songs
List all saved playlists
Search and play a song on YouTube Music
Control playback: play, pause, next, previous, shuffle, repeat, like, dislike
Search YouTube Music for a song
No error handling or recovery guidance. If search_song returns no results, or download_song fails due to network error, the tool provides no actionable next step. Error responses must tell LLMs what to do: 'No results found. Try a broader query or check spelling.' or 'Download failed (network timeout). Retry in 30 seconds or try a different format.'
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. download_song and delete operations should be marked destructiveHint=true; get_history should be marked readOnlyHint=true.