Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
MOOD_MODELNoModel to trade quality for spend for mood enrichment
NAVIDROME_TZNoTime-of-day analysis depends on thisAmerica/Chicago
NAVIDROME_URLYesNavidrome server URL, e.g. http://host:4533
LASTFM_API_KEYNoDefaults to Navidrome's bundled public key
NAVIDROME_PROXYNosocks5://host:port if Navidrome is only reachable via a proxy hop
NAVIDROME_ENRICHNo0 disables background Last.fm tag fetching
ANTHROPIC_API_KEYNoAPI key to enable mood enrichment via Anthropic; without a key everything else still works and only the mood filters go dark
LISTENBRAINZ_USERNoListen history is a public read; no token needed
NAVIDROME_DATA_DIRNoSnapshot location/data/navidrome-mcp
NAVIDROME_PASSWORDYesNavidrome password.
NAVIDROME_USERNAMEYesNavidrome username. Playlists are created as this user.
DAYLIST_PLAYLIST_NAMENoDefault playlist name for daylistdaylist

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 mood_vibes / moods / the axis ranges over vibes: vibes matches only the ~3,800 tracks actually on a curated playlist, while the mood fields cover all 9,000+.

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

NameDescription
daylistSpotify-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

NameDescription

No resources

Latest Blog Posts

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