Mood-based Spotify playlist creator — builds playlists from your liked library using community-sourced audio features (Spotify's audio-features API is deprecated).
mood-mixer demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive parameter schemas, and detailed descriptions. All 9 tools have explicit input schemas with typed parameters and descriptions. Tool names are action-oriented (list_, get_, preview_, create_, add_, remove_, refresh_, enrich_). Descriptions average ~180 chars and explain WHAT, WHEN, and side effects. However, output schemas are not formally documented, responses are inferred from code. Error handling is minimal (only preset validation in preview_mix). No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Parameter descriptions are strong but could benefit from explicit constraints (e.g., limit ranges, cooldown_days bounds). Composition is clean: each tool has one responsibility, and outputs chain well (e.g., list_moods → preset → preview_mix/create_playlist).
Save a standing 'skip from now on' rule — the cross-session memory that makes mood-mixer personal. Exclude specific `track_ids` (e.g. the Mount Eerie songs about death you named — you identify them, this remembers them), `artists`, or `genres` (e.g. "lullaby"). `note` records the rule in plain English. Applied to every preview/create automatically; override per-request via the allow_* params.
Build the mood mix AND save it as a real (private) Spotify playlist — the payoff (the side effect plain Claude can't do). Optionally pass `name` for the playlist's title (defaults to the mood label). Honors saved exclusions and a recent-play `cooldown_days` (default 7, so back-to-back playlists don't repeat tracks; 0 to ignore); `exclude_*` adds more, `allow_*` overrides a saved rule for this request. Pass `replace_playlist_id` to REBUILD an existing playlist in place (keeps its name + URL, swaps the tracks). The tracks used are remembered to feed the cooldown. Needs Spotify authorization (run `python -m moodmixer.cli authorize` once). Returns the URL.
Backfill community audio features for the cache. Queries AcousticBrainz and GetSongBPM to fill in missing energy/valence/tempo data for tracks in the library.
How many tracks are available to mix, where they came from (your refreshed cache vs. the bundled sample), and how many have real audio features vs. a genre estimate. Low real-feature coverage → run enrich_features.
Output schemas not formally documented. Code infers response structure (e.g., preview_mix returns {mood, strict_matches, selected, tracks}), but no JSON Schema or type hints in tool definitions. LLMs cannot plan downstream operations without knowing return field names and types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools have clear risk levels (READ_ONLY vs WRITE), but these are not exposed in the MCP schema. Agents cannot distinguish safe reads from destructive writes without parsing descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
The available mood presets and the audio-feature thresholds that define each — the menu for preview_mix / create_playlist.
Show your saved exclusions (track ids, artists, genres) and the plain-English notes behind them.
Show the tracks a mood would select from your library — WITHOUT creating a playlist (the grounding step). Tracks are ranked by FIT, so you always get a full list (the closest N), not just exact matches; `strict_matches` reports how many fully fit, `selected` how many were returned. Honors your saved exclusions (add_exclusion) and a recent-play `cooldown_days` (default 7 → skip tracks used in playlists in the last week, so back-to-back mixes vary; set 0 to ignore). Use `exclude_artists/genres/track_ids` to drop more just this time, or `allow_artists/genres` to override a saved rule for this one request (e.g. lullabies are off by default — include them now). `preset` is one of list_moods.
Pull your liked songs into the local cache. Fetches all liked tracks from Spotify and stores them locally for mood-mixer to work with.
Drop standing exclusions (undo). Removes specific track IDs, artists, or genres from the saved exclusion list.
Minimal error handling and recovery guidance. Only preset validation in preview_mix returns an error dict. Other tools (refresh_library, enrich_features, create_playlist) lack explicit error responses or recovery hints. If Spotify auth fails or library is empty, agents have no guidance.
Parameter constraints not explicitly stated. cooldown_days, limit, and shuffle_seed lack min/max bounds in descriptions. LLMs may pass negative limits, huge cooldown values, or invalid seeds without validation.
Spotify authorization is a CLI prerequisite, not a tool. Users must run 'python -m moodmixer.cli authorize' before create_playlist works. No tool exposes auth status or guides the agent to authorize. If auth fails, create_playlist silently fails.