Model Context Protocol local Node server for Spotify API
The server demonstrates competent schema coverage with Zod-based input validation and structured tool definitions. 11 tools are all explicitly registered with names, descriptions, and schemas. However, there are meaningful gaps: (1) descriptions vary significantly in quality, some are detailed (searchSpotify at ~350 chars) while others are minimal (playbackAction at ~87 chars, getNowPlaying at ~61 chars); (2) parameter descriptions are inconsistent, many are clear (searchSpotify's query field has a 300+ char guide), but several tools have terse param docs that assume LLM context (playMusic's deviceId is just 'The Spotify device ID to play on' with no guidance on how to find one); (3) output schemas are NOT documented, the code shows handlers return {content: [{type: 'text', text: '...'}]} but there's no schema document explaining what fields agents should expect, making chaining difficult; (4) error handling returns isError flags but no recovery guidance or actionable next steps. The server excels at input constraint validation (enums for type/action, min/max on numeric params) and follows verb_noun naming conventions well. Parameter naming is mostly clear (playlistId, trackIds, deviceId) but occasionally ambiguous (uri, type, id in playMusic are overloaded, accepts URI, type+id pair, or just type, and the dependency is documented in description but not enforced). No security gaps detected (no secrets in params, uses handleSpotifyRequest wrapper for API calls). Tool composition is sound, each tool has one responsibility and outputs contain IDs for chaining. Idempotency is not explicitly addressed, risking duplicate operations on retries.
Adds a track, album, artist or playlist to the playback queue
Add tracks to a Spotify playlist
Create a new playlist on Spotify
Get information about the currently playing track on Spotify
Get a list of tracks in a Spotify playlist
Get a list of recently played tracks on Spotify
Get a list of the current user's playlists on Spotify
Output schemas not documented. Handlers return {content: [{type, text}]} but there is no formal schema definition for return types. Agents cannot reliably chain results or extract structured data downstream.
Minimal error recovery guidance. Error responses use isError flags but provide no actionable next steps (e.g., 'User not found. Try search_users() first'). LLM cannot self-correct without user prompting.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Start playing a Spotify track, album, artist, or playlist
Perform a playback action (pause, resume, skip to next, skip to previous)
Remove tracks from a Spotify playlist
Search Spotify by keyword and field filters (e.g. artist, track, playlist, tag:new, tag:hipster) and return items of the given type
Overloaded parameters in playMusic and addToQueue. Parameters (uri, type, id) accept multiple input modes (URI string, type+id pair, or just type) with conditional logic. Parameter descriptions document dependencies but the schema does not enforce mutual exclusivity or clarify which combinations are valid.
Description quality variance. getNowPlaying (61 chars) and playbackAction (87 chars) have minimal descriptions that lack context for LLM selection. searchSpotify (350+ chars) sets a better example. Descriptions below 50 chars fail the baseline and should be expanded.
Idempotency not specified. WRITE and DESTRUCTIVE tools (playMusic, createPlaylist, removeTracksFromPlaylist) lack guidance on retry behavior. If an agent retries after a network timeout, duplicate operations (duplicate playlist creation, duplicate track removal) may occur.
deviceId parameter guidance missing. Multiple tools accept optional deviceId but provide no direction on how to discover or provide a device ID (e.g., call a get_devices tool first or pass 'current_device'). Users cannot easily invoke these tools.