MCP server for Yandex Music: search, playlists, and headless local playback via a persistent player daemon.
15 tools with clear naming (verb_noun pattern) and mostly complete descriptions (avg 156 chars). All tools have input schemas with type definitions and parameter descriptions. However, output schemas are undocumented, LLMs cannot predict response structure for chaining. Error handling is minimal (generic fail() wrapper). No tool annotations (readOnlyHint/destructiveHint). Parameter constraints are present but some descriptions lack actionable guidance (e.g., trackId format unknown). Composition is sound, tools are single-responsibility and chainable via IDs.
Explain how the user logs in. Use when ym_auth_status reports no token or an expired one. There is no automatic flow — relay these steps and let the user run them; do not ask them to paste the token into the chat.
Verify the stored Yandex Music token works, and report the account and whether Plus (required for full-length playback) is active.
Pause, resume, skip, go back, or stop playback.
Mark a track as disliked in your Yandex Music library.
Mark a track as liked in your Yandex Music library.
Current track, position, and remaining seconds. Use when the user asks what is on — not as a polling loop, since the daemon advances by itself.
Output schemas undocumented. Tools return plain text via text() helper, but LLMs cannot predict structure for downstream chaining. E.g., ym_search returns formatted strings with 'id=' fields, but no schema declares the response format.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. ym_like, ym_dislike, ym_play_set, ym_control are WRITE but unmarked.
Error handling is generic. fail() returns 'Error: <message>' with isError=true, but does not categorize errors as retryable/user-fixable/fatal or provide recovery guidance. E.g., 'Token EXPIRED' should suggest 'run ym auth' (already done in ym_auth_status, but not in other tools).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Bring up the macOS player window: artwork, transport, scrubber, like/dislike, and the full queue. Same window you get by clicking the Now Playing widget in Control Center.
Interrupt the current track and play this one, then continue the existing queue.
Replace the queue with a list of tracks and start playing. THIS IS THE MAIN TOOL. The daemon auto-advances between tracks on its own, so queue the whole set at once and do not poll — you do not need to wake up between tracks. Optionally schedule the set to begin later.
Add tracks to a playlist.
Create a new playlist.
List your Yandex Music playlists.
Add tracks to the end of the current queue without interrupting playback.
List the current queue and which track is playing.
Search the Yandex Music catalogue for tracks. Use to confirm a track exists or pick between versions before queueing.
Parameter descriptions lack actionable constraints. trackId in ym_like/ym_dislike is described as 'Yandex Music track ID' but format is not specified (numeric? alphanumeric? length?). ym_search limit defaults to 8 but max=25 is not mentioned in description.
No pagination support. ym_playlists and ym_queue_show return full lists without limit/offset. If a user has 500 playlists, the response bloats context. ym_search has limit but no offset/cursor for result sets > 25.