MCP server for bulk Spotify operations with confidence-scored song matching, batch playlist creation, and library exports
Strong overall quality with 22 well-named tools following consistent verb_noun patterns (get_, create_, add_, etc.). Descriptions are clear and actionable (avg ~150 chars), explaining WHAT each tool does and WHEN to use it. Input schemas are comprehensive with typed parameters and defaults. However, output schemas are not explicitly documented in the code, inferred from descriptions only. Error handling is minimal (no recovery guidance or categorization visible). Security considerations are present (confirm parameters for destructive ops) but not comprehensive. The server demonstrates solid definition quality suitable for production use, though output documentation and error strategies could be stronger.
Add tracks from a reviewed CSV to an existing playlist. The CSV should have an 'action' column: 'approve' (add), 'reject' (skip), or spotify:track:xxx (use specific URI).
Add tracks to a playlist. Handles batching automatically (Spotify allows max 100 per request).
Search for multiple tracks with confidence scoring. Categorizes results into HIGH (auto-add), MEDIUM (review), LOW (needs attention).
Check if Spotify authentication is set up and working. Returns current user info if authenticated.
Create a new Spotify playlist.
Create a playlist from batch search results.
Output schemas not explicitly documented in code. Tool descriptions infer structure but do not formally declare return types, field names, or response structure. This forces LLMs to guess what fields are available and breaks tool chaining when field names don't match expectations.
Error handling lacks recovery guidance. Tools do not return actionable error messages that tell LLMs what to do next (e.g., 'Authentication failed, run setup_auth.py' in check_auth_status is good, but most other tools lack similar guidance). Error categorization (retryable vs. user-fixable vs. fatal) is not visible.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | A | 84 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Follow artists on Spotify.
Find albums where you have N or more saved songs. Great for finding albums worth buying on vinyl!
Get all artists you follow on Spotify.
Get unique artists from your saved songs, sorted by song count. This shows artists you have saved songs from (even if not followed), ranked by how many songs you've saved.
Get information about a playlist.
Get all tracks from a playlist.
Get your recently played tracks.
Get all your liked/saved songs on Spotify. Note: This may take 1-2 minutes for large libraries (10k songs).
Get your top artists based on listening history. Great for understanding your music taste and finding festival lineups.
Get your top tracks based on listening history.
Full workflow: Parse CSV, search all tracks, create playlist. This is the main tool for bulk playlist creation.
Save tracks to your Spotify library.
Search for a single track and return matches with confidence scores.
Unfollow artists on Spotify. For safety, this returns a preview unless confirm=True.
Remove tracks from your Spotify library. For safety, this returns a preview unless confirm=True.
Update playlist details (name, description, public status).
Pagination not documented for tools returning lists. Tools like get_top_artists (max 50), get_saved_tracks, and get_followed_artists may return large result sets. Code does not show whether pagination is supported, if offset/page parameters are accepted, or how to fetch subsequent pages. This risks context window exhaustion if results are capped without clear next-page guidance.
Sensitive fields (Spotify user IDs, URIs, access tokens) may be returned in responses without explicit stripping. Response descriptions do not clarify which fields are safe to log or return to users, risking accidental exposure of PII or internal identifiers. audit trail and privacy considerations not documented.
Confirmation-request pattern only partially implemented. unfollow_artists and unsave_tracks require explicit confirm=True, which is good. However, create_playlist_from_search_results and import_and_create_playlist do not offer a dry-run or preview step before creating playlists or modifying the user's library. An LLM could accidentally create hundreds of playlists from malformed input.
Some parameter descriptions lack constraint details. For example, time_range in get_top_artists lists values in prose ('short_term', 'medium_term', 'long_term') but does not use an enum constraint. Similarly, include_confidence in create_playlist_from_search_results and import_and_create_playlist should be enums (high, high_medium, all) rather than free-form strings. This invites LLMs to hallucinate invalid values.
Rate limiting and timeout behavior not documented. Tools like batch_search_tracks accept delay_seconds (0.2s default) but do not specify overall API rate limits, retry strategies, or timeout thresholds. An LLM calling batch_search_tracks with 1000 songs could hit Spotify's rate limits silently or hang indefinitely without guidance on recovery.