A Model Context Protocol server for Spotify integration
18 tools with consistent verb-noun naming (get*, create*, update*, remove*, search*, skip*). All tools have descriptions (avg 156 chars, within 10-1024 baseline). Input schemas present for all tools with type definitions and constraints (enums, min/max). However, parameter descriptions are sparse, many lack actionable guidance on format/range. Output schemas are not documented; responses are free-text markdown rather than structured JSON. Error handling returns plain text errors without recovery guidance or categorization. No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Alias parameters (e.g., albumIds/ids, deviceId/device_id) add cognitive load without clear benefit.
Add tracks or podcast episodes to a Spotify playlist. Accepts Spotify track IDs, episode IDs, or full Spotify URIs (e.g. spotify:episode:xxx).
Check if albums are saved in the user's "Your Music" library
Create a new playlist on Spotify
Get tracks from a specific album with pagination support
Get detailed information about one or more albums by their Spotify IDs
Get a list of the current user's playlists on Spotify
Output schemas not documented. All tools return free-text markdown responses instead of structured JSON. LLMs cannot reliably extract fields for downstream tool chaining (e.g., after searchSpotify, agent cannot extract track_id for playMusic without parsing markdown).
Error handling returns plain text without recovery guidance or error classification. Example: 'Error getting albums: ...' does not tell LLM whether to retry, ask user, or abandon. No actionable next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Get information about the currently playing track on Spotify, including device and volume info
Get details of a specific Spotify playlist including tracks count, description and owner
Pause Spotify playback on the active device
Start playing a Spotify track, album, artist, or playlist. Pass a Spotify URI (e.g. spotify:track:xxx, spotify:album:xxx) via "uri". For albums/playlists you can also use "context_uri". Device is selected automatically — "deviceId" or "device_id" are optional.
Remove one or more tracks from a Spotify playlist (max 100 tracks per request)
Reorder a range of tracks within a Spotify playlist by moving them to a new position
Save or remove albums from the user's "Your Music" library
Search for tracks, albums, artists, playlists, podcast episodes, or shows on Spotify. For episodes and shows, the query matches against title, description, and publisher. Use type "episode" to find individual podcast episodes by topic or guest name, and type "show" to find podcast series.
Skip to the next track in the current Spotify playback queue
Skip to the previous track in the current Spotify playback queue
Remove a playlist from the current user's library (unfollow). Note: Spotify does not allow permanent deletion of playlists via the API.
Update the details of a Spotify playlist (name, description, public/private, collaborative)
Alias parameters (albumIds/ids, deviceId/device_id, album_id/albumId) create ambiguity and cognitive load. LLMs must reason about which to use; no clear guidance on precedence. Violates single-parameter-per-concept principle.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without parsing descriptions. Destructive tools (removeTracksFromPlaylist, unfollowPlaylist) lack explicit warnings.
Parameter descriptions lack actionable format/range guidance. Example: playMusic 'uri' param says 'Spotify URI to play' but does not explain format (spotify:track:xxx vs spotify:album:xxx). LLMs must infer from examples in description text.