Spotify Model Context Protocol Server for controlling playback, managing playlists, and searching Spotify content
Spotify MCP has well-structured schemas for most tools, but suffers from critical gaps in parameter descriptions and output documentation. 7 of 9 tools lack parameter descriptions entirely (e.g., search tool has empty input schema with no guidance). Tool descriptions are present but generic (avg 45 chars, well below 194-char baseline). No output schemas documented. Error handling is absent, no recovery guidance or actionable error messages. Naming is verb-first and clear (get_, create_, add_, search_), which is good. However, the lack of parameter documentation and missing output schemas severely limit LLM reasoning and tool composition.
Add tracks to a playlist
Create a new playlist
Get the currently playing track
Get full playback status
Get all valid tracks/items from a playlist. Invalid, deleted, or null tracks are automatically filtered out on the server side. Pagination is handled automatically.
List user playlists
search tool has empty input schema with no parameter documentation. LLM cannot determine what to search for (track name? artist? album?) or how to filter results.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., does get_user_playlists return playlist_id for use in add_to_playlist?).
Parameter descriptions missing or minimal. 'action' in play_pause lacks context (does it toggle or set state?). 'trackUris' in add_to_playlist lacks format guidance (Spotify URI format?). LLMs cannot infer correct usage.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | <=2025-11-25 | v2 |
Toggle play/pause
Search Spotify content
Set volume (0-100)
No error handling or recovery guidance. If a tool fails (e.g., invalid playlist ID, auth expired), LLM receives no actionable error message or retry strategy.
Pagination parameters (limit, offset) in get_user_playlists lack constraints (min/max values, defaults). No total_count or next_cursor returned, making pagination planning impossible.