navidrome-mcp
Provides a descriptive tag vocabulary (e.g. 'nu-disco', 'melancholy', 'shoegaze') used for mood-based playlist generation, with background tag fetching enabled via LASTFM_API_KEY.
navidrome-mcp
An MCP server for Navidrome that builds playlists which actually match a described mood — grounded in what you own, what you have listened to, and how you yourself have labelled your music.
Why this exists
Navidrome's API alone cannot do this, for three concrete reasons:
Its REST filtering is exact-match only.
year=1997works;year=1990-1999silently returns nothing. There are no ranges and no AND/OR, so a query like "90s rock I haven't played in a year, max 2 per artist" is not expressible.It keeps no listen history. Only a
playCountand a lastplayDate. There is no way to ask "what do I put on at 7am on a Tuesday".Nothing in the library says how a track feels. Measured on a real 9,311-track library: 32 genres with Rock alone covering 47%, BPM present on 24 tracks (0.3%), ReplayGain on 222 (2%), MusicBrainz recording IDs on 222 (2%). That last number also rules out AcousticBrainz as a primary mood source — its audio-derived mood models are keyed by MBID, and resolving the rest via ISRC → MusicBrainz (rate-limited to 1 req/s) would still only reach ~23% of the library.
So this server maintains its own index and joins three sources:
Source | Provides |
Navidrome (native + Subsonic APIs) | Authoritative metadata, similarity agents, the playlist write path |
ListenBrainz | Timestamped listen history — time-of-day and weekday habits |
Last.fm | A real descriptive tag vocabulary ( |
It also treats your existing curated playlists as your mood vocabulary. If you have
playlists called golden hour, cranked and slow shreds, those words already mean
something specific in your library — far more than a generic genre ever will.
Related MCP server: Navidrome-MCP
The mood pass
Those playlists cover maybe 40% of a library, so on their own they can only answer mood questions about tracks you already filed. A one-time enrichment pass closes that gap: every track gets energy, valence, intensity, acoustic-vs-electronic, free-form descriptors, the curated vibe it reads as, and the times of day it fits.
The inference is grounded in your own playlists — they're a hand-labelled training set in your own words — so unfiled tracks land in the same space as the ones you filed. Results are cached permanently, so this runs once and afterwards only picks up new music.
Cost stays small through three things: batching ~40 tracks per request, prompt-caching the
large identical taxonomy prefix (the first batch runs alone, so the rest hit a warm cache
instead of all missing it concurrently), and running with thinking disabled — this is
classification, not reasoning. Set ANTHROPIC_API_KEY to enable it and MOOD_MODEL to
trade quality for spend; without a key everything else still works and only the mood
filters go dark.
Design notes
In-memory index, no database. A full library pull is ~20s for ~10k tracks; once local, every compound query is a single array pass. A JSON snapshot on disk makes restarts instant. Deliberately no native dependency, so it installs under
npm ci --ignore-scriptson Node 20.The index is a cache, never a source of truth. If the snapshot is missing or unreadable the server just re-syncs.
Navidrome's own compound engine is still exposed via
create_smart_playlist, for standing playlists that should keep re-evaluating server-side. Note those rules can only see Navidrome's own fields — not ListenBrainz listens or Last.fm tags.
Tools
Tool | Purpose |
| Orientation: size, genres, decades, curated vibes, tag vocabulary |
| The workhorse — full compound filtering, diversity caps, affinity ranking |
| What one of your curated moods actually consists of |
| Expand from seeds via agents + your own playlist co-occurrence |
| recent / top / by_hour / by_weekday / rediscover / trending |
| Read playlists |
| Write playlists |
| Self-updating rules-based playlists |
| Everything needed to generate this hour's daylist |
| Publish the rolling daylist atomically |
| Re-sync from Navidrome / ListenBrainz |
Prompt: daylist — generates a Spotify-style daylist for the current hour.
Configuration
Env var | Required | Notes |
| yes | e.g. |
| yes | Playlists are created as this user |
| no |
|
| no | Listen history is a public read; no token needed |
| no | Defaults to Navidrome's bundled public key |
| no | Default |
| no | Snapshot location. Default |
| no | Default |
| no |
|
Licence
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityDmaintenanceGenerates personalized music playlists based on mood analysis using AI sentiment detection and emoji understanding. Integrates with Last.fm API to create playlists with multi-language support and provides streaming links for Spotify, Apple Music, and YouTube.Last updated1Apache 2.0
- Alicense-qualityAmaintenanceAnalyze listening patterns, create custom playlists, discover missing albums, validate radio streams, and provide personalized recommendations through natural language.Last updated24078AGPL 3.0
- Alicense-qualityBmaintenanceA Model Context Protocol (MCP) server for Last.fm. Gives AI assistants access to your listening history, music discovery, and detailed track/artist/album information.Last updated43MIT
- Alicense-qualityDmaintenanceGenerates .m3u playlists on the user's PC based on their current mood or theme, using metadata from local music files.Last updated5GPL 3.0
Related MCP Connectors
Search MusicBrainz artists, releases, works, labels; resolve ISRC/ISWC/barcode; fetch cover art.
Spotify MCP — Web API via client_credentials OAuth
Recommendations, search, catalogue, analytics, and platform admin tools for NeuronSearchLab
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/312-dev/navidrome-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server