navidrome-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MOOD_MODEL | No | Model to trade quality for spend for mood enrichment | |
| NAVIDROME_TZ | No | Time-of-day analysis depends on this | America/Chicago |
| NAVIDROME_URL | Yes | Navidrome server URL, e.g. http://host:4533 | |
| LASTFM_API_KEY | No | Defaults to Navidrome's bundled public key | |
| NAVIDROME_PROXY | No | socks5://host:port if Navidrome is only reachable via a proxy hop | |
| NAVIDROME_ENRICH | No | 0 disables background Last.fm tag fetching | |
| ANTHROPIC_API_KEY | No | API key to enable mood enrichment via Anthropic; without a key everything else still works and only the mood filters go dark | |
| LISTENBRAINZ_USER | No | Listen history is a public read; no token needed | |
| NAVIDROME_DATA_DIR | No | Snapshot location | /data/navidrome-mcp |
| NAVIDROME_PASSWORD | Yes | Navidrome password. | |
| NAVIDROME_USERNAME | Yes | Navidrome username. Playlists are created as this user. | |
| DAYLIST_PLAYLIST_NAME | No | Default playlist name for daylist | daylist |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| describe_libraryA | Orientation for the whole library: size, genre and decade distribution, the user's own curated mood playlists (his personal vibe vocabulary), the Last.fm tag vocabulary available for filtering, and listening-history coverage. Call this FIRST when you need to build a playlist and do not yet know what the library contains. |
| search_tracksA | The main query tool, over the WHOLE library. Every filter composes: real year/date ranges, play and listen recency, inferred mood axes (energy/valence/intensity/organic), mood descriptors, curated OR inferred vibe membership, Last.fm tags, duration, time-of-day fit, plus per-artist diversity caps and personal-affinity ranking. For mood requests prefer |
| get_vibe_profileA | What one of the user's own mood playlists actually consists of: top artists, genres, tags, era and tempo, when during the day he plays it, and representative tracks. Use this to ground an abstract mood request in what that word means in HIS library. |
| similar_tracksA | Expand from seed tracks or artists. Combines Navidrome's agent-backed similarity (Last.fm/Deezer/ListenBrainz) with co-occurrence in the user's own curated playlists — tracks he himself repeatedly files alongside the seed. Results are restricted to what is actually in the library. |
| listening_historyA | Query the ListenBrainz history: recent plays, top artists/tracks over a window, hour-of-day and weekday habits, rising/falling trends, and long-loved-but-forgotten tracks worth resurfacing. This is the only source of timestamped history — Navidrome itself keeps only a play count and a last-played time. |
| list_playlistsA | All playlists in Navidrome, including which are curated mood playlists and which are smart (self-updating). |
| get_playlistA | Full track list of one playlist, by id or name. |
| create_playlistA | Create a new playlist from an explicit list of track ids (use search_tracks to source them). |
| update_playlistA | Rename a playlist, change its description, and/or replace or append its tracks. Replacing is the normal way to refresh a rolling playlist in place. |
| delete_playlistB | Permanently delete a playlist. Does not touch the audio files. |
| create_smart_playlistA | Create a playlist defined by RULES rather than a fixed track list. Navidrome re-evaluates it continuously, so it stays current without regeneration — ideal for standing playlists like '90s rock I haven't played in a year'. Rules are Navidrome's native criteria format: {"all":[{"is":{"genre":"Rock"}},{"inTheRange":{"year":[1990,1999]}},{"notInTheLast":{"lastPlayed":365}}],"sort":"playCount","order":"desc","limit":100} Operators: is, isNot, gt, lt, contains, notContains, startsWith, endsWith, inTheRange, before, after, inTheLast, notInTheLast. Combine with all (AND) / any (OR), which may nest. Fields include: title, album, artist, albumartist, genre, year, dateadded, datemodified, lastplayed, playcount, rating, starred, loved, comment, bpm, length, filepath, filetype. Note: rules operate on Navidrome's own fields only — ListenBrainz listen counts and Last.fm tags are NOT available here. For those, use search_tracks plus create_playlist. |
| daylist_contextA | Everything needed to generate this hour's daylist: local time and part of day, which of his curated moods he actually reaches for at this hour (measured as lift over that mood's own average, so it is not just playlist size), the artists/genres/tags that dominate this hour historically, what he has heard in the last few days, and the titles of recent daylists so the new one does not repeat them. |
| commit_daylistA | Write the daylist in one atomic step: replace the rolling daylist playlist's tracks, rename it to the new title, set its description, and record the run so future daylists can avoid repeating these tracks. Creates the playlist on first use. |
| enrich_moodsA | Run (or check) the one-time pass that gives EVERY track a mood: energy, valence, intensity, acoustic-vs-electronic, feeling descriptors, which curated vibe it reads as, and what times of day it fits. This is what makes mood search work across the whole library rather than only the tracks already on a playlist. The library's own metadata cannot support it — genres are a few dozen coarse buckets, and BPM/ReplayGain/MusicBrainz IDs are present on under 3% of files. Results are cached permanently, so this normally runs once and then only picks up newly-added music. |
| refresh_indexA | Re-sync from Navidrome and/or ListenBrainz. The index is a cache: the library is pulled in full (~20s) and listens incrementally. Call this if the library changed and results look stale. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| daylist | Spotify-style daylist: read the hour's context, pick a mood grounded in his own playlists, source ~25 tracks that fit, name it in his voice, and publish it to the rolling daylist playlist. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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