An MCP server that generates Spotify playlists based on user prompts using AI recommendations and Spotify's API
Server has 6 tools with basic descriptions and input schemas, but significant quality gaps. Tool names lack consistent verb-noun structure (e.g., 'validate' is vague; 'authenticate' vs 'complete_auth' creates naming confusion). Most parameter descriptions are present but generic. Output schemas are not documented. Error handling exists but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Descriptions average ~80 chars, below the 194-char baseline for A+ tools. Parameters lack constraints (enums, ranges, formats). No pagination support despite potential for large data returns.
Start Spotify authentication process.
Complete Spotify authentication with authorization code.
Fetch user's Spotify data for better recommendations.
Generate a Spotify playlist based on a prompt. Requires authentication first.
Check if the server is running properly.
Validate configuration.
Tool 'validate' has vague name and unclear purpose. Description says 'Validate configuration' but implementation returns a phone number from env var. Name does not reflect action (get_config_phone or similar would be clearer).
No output schemas documented for any tool. LLMs cannot predict response structure, forcing them to guess at downstream field names. All tools return TextContent but structure of text content is unspecified.
Parameter 'duration_minutes' in generate_playlist lacks enum/range constraint in schema. Description mentions '1-300' but schema has no min/max. LLMs may pass invalid values.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools like 'complete_auth' and 'generate_playlist' modify state but lack destructiveHint. Agents cannot distinguish safe from unsafe operations.
Error messages in code are user-friendly but lack recovery guidance. E.g., 'Authentication failed' does not tell LLM what to do next (retry? check credentials? call authenticate again?).