navidrome-mcp 1.1.2 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -289
- package/dist/client/auth-manager.d.ts +7 -0
- package/dist/client/auth-manager.d.ts.map +1 -1
- package/dist/client/auth-manager.js +42 -10
- package/dist/client/auth-manager.js.map +1 -1
- package/dist/client/navidrome-client.d.ts +65 -3
- package/dist/client/navidrome-client.d.ts.map +1 -1
- package/dist/client/navidrome-client.js +176 -47
- package/dist/client/navidrome-client.js.map +1 -1
- package/dist/config.d.ts +12 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +88 -5
- package/dist/config.js.map +1 -1
- package/dist/constants/defaults.d.ts +30 -0
- package/dist/constants/defaults.d.ts.map +1 -1
- package/dist/constants/defaults.js +30 -0
- package/dist/constants/defaults.js.map +1 -1
- package/dist/constants/timeouts.d.ts +66 -0
- package/dist/constants/timeouts.d.ts.map +1 -1
- package/dist/constants/timeouts.js +70 -0
- package/dist/constants/timeouts.js.map +1 -1
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +3 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/schemas/common.d.ts +20 -105
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +52 -69
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/pagination.d.ts +17 -8
- package/dist/schemas/pagination.d.ts.map +1 -1
- package/dist/schemas/pagination.js +5 -5
- package/dist/schemas/pagination.js.map +1 -1
- package/dist/schemas/validation.d.ts +23 -13
- package/dist/schemas/validation.d.ts.map +1 -1
- package/dist/schemas/validation.js +28 -10
- package/dist/schemas/validation.js.map +1 -1
- package/dist/services/filter-cache-manager.d.ts +34 -7
- package/dist/services/filter-cache-manager.d.ts.map +1 -1
- package/dist/services/filter-cache-manager.js +84 -22
- package/dist/services/filter-cache-manager.js.map +1 -1
- package/dist/services/library-manager.d.ts +32 -2
- package/dist/services/library-manager.d.ts.map +1 -1
- package/dist/services/library-manager.js +97 -19
- package/dist/services/library-manager.js.map +1 -1
- package/dist/services/playback/mpv-ipc.d.ts +123 -0
- package/dist/services/playback/mpv-ipc.d.ts.map +1 -0
- package/dist/services/playback/mpv-ipc.js +345 -0
- package/dist/services/playback/mpv-ipc.js.map +1 -0
- package/dist/services/playback/mpv-process.d.ts +58 -0
- package/dist/services/playback/mpv-process.d.ts.map +1 -0
- package/dist/services/playback/mpv-process.js +210 -0
- package/dist/services/playback/mpv-process.js.map +1 -0
- package/dist/services/playback/playback-engine.d.ts +453 -0
- package/dist/services/playback/playback-engine.d.ts.map +1 -0
- package/dist/services/playback/playback-engine.js +1093 -0
- package/dist/services/playback/playback-engine.js.map +1 -0
- package/dist/services/playback/scrobble-tracker.d.ts +98 -0
- package/dist/services/playback/scrobble-tracker.d.ts.map +1 -0
- package/dist/services/playback/scrobble-tracker.js +284 -0
- package/dist/services/playback/scrobble-tracker.js.map +1 -0
- package/dist/tools/handlers/lastfm-handlers.d.ts +17 -0
- package/dist/tools/handlers/lastfm-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/lastfm-handlers.js +17 -0
- package/dist/tools/handlers/lastfm-handlers.js.map +1 -1
- package/dist/tools/handlers/lyrics-handlers.d.ts +17 -0
- package/dist/tools/handlers/lyrics-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/lyrics-handlers.js +19 -1
- package/dist/tools/handlers/lyrics-handlers.js.map +1 -1
- package/dist/tools/handlers/playback-handlers.d.ts +28 -0
- package/dist/tools/handlers/playback-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/playback-handlers.js +523 -0
- package/dist/tools/handlers/playback-handlers.js.map +1 -0
- package/dist/tools/handlers/playlist-handlers.d.ts +17 -0
- package/dist/tools/handlers/playlist-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/playlist-handlers.js +22 -5
- package/dist/tools/handlers/playlist-handlers.js.map +1 -1
- package/dist/tools/handlers/queue-handlers.d.ts +17 -0
- package/dist/tools/handlers/queue-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/queue-handlers.js +31 -14
- package/dist/tools/handlers/queue-handlers.js.map +1 -1
- package/dist/tools/handlers/radio-handlers.d.ts +17 -0
- package/dist/tools/handlers/radio-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/radio-handlers.js +44 -32
- package/dist/tools/handlers/radio-handlers.js.map +1 -1
- package/dist/tools/handlers/registry.d.ts +17 -0
- package/dist/tools/handlers/registry.d.ts.map +1 -1
- package/dist/tools/handlers/registry.js +38 -1
- package/dist/tools/handlers/registry.js.map +1 -1
- package/dist/tools/handlers/search-handlers.d.ts +17 -0
- package/dist/tools/handlers/search-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/search-handlers.js +54 -59
- package/dist/tools/handlers/search-handlers.js.map +1 -1
- package/dist/tools/handlers/tag-handlers.d.ts +17 -0
- package/dist/tools/handlers/tag-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/tag-handlers.js +28 -4
- package/dist/tools/handlers/tag-handlers.js.map +1 -1
- package/dist/tools/handlers/user-preferences-handlers.d.ts +17 -0
- package/dist/tools/handlers/user-preferences-handlers.d.ts.map +1 -1
- package/dist/tools/handlers/user-preferences-handlers.js +18 -1
- package/dist/tools/handlers/user-preferences-handlers.js.map +1 -1
- package/dist/tools/lastfm-discovery.d.ts +1 -9
- package/dist/tools/lastfm-discovery.d.ts.map +1 -1
- package/dist/tools/lastfm-discovery.js +37 -51
- package/dist/tools/lastfm-discovery.js.map +1 -1
- package/dist/tools/library.d.ts.map +1 -1
- package/dist/tools/library.js +21 -25
- package/dist/tools/library.js.map +1 -1
- package/dist/tools/listening-history.d.ts +12 -22
- package/dist/tools/listening-history.d.ts.map +1 -1
- package/dist/tools/listening-history.js +65 -82
- package/dist/tools/listening-history.js.map +1 -1
- package/dist/tools/lyrics.d.ts.map +1 -1
- package/dist/tools/lyrics.js +96 -84
- package/dist/tools/lyrics.js.map +1 -1
- package/dist/tools/media-library.d.ts +0 -1
- package/dist/tools/media-library.d.ts.map +1 -1
- package/dist/tools/media-library.js +18 -24
- package/dist/tools/media-library.js.map +1 -1
- package/dist/tools/playback.d.ts +271 -0
- package/dist/tools/playback.d.ts.map +1 -0
- package/dist/tools/playback.js +1044 -0
- package/dist/tools/playback.js.map +1 -0
- package/dist/tools/playlist-management/playlist-crud.d.ts +7 -5
- package/dist/tools/playlist-management/playlist-crud.d.ts.map +1 -1
- package/dist/tools/playlist-management/playlist-crud.js +38 -20
- package/dist/tools/playlist-management/playlist-crud.js.map +1 -1
- package/dist/tools/playlist-management/playlist-export.d.ts +25 -8
- package/dist/tools/playlist-management/playlist-export.d.ts.map +1 -1
- package/dist/tools/playlist-management/playlist-export.js +15 -19
- package/dist/tools/playlist-management/playlist-export.js.map +1 -1
- package/dist/tools/playlist-management/track-management.d.ts +7 -1
- package/dist/tools/playlist-management/track-management.d.ts.map +1 -1
- package/dist/tools/playlist-management/track-management.js +41 -40
- package/dist/tools/playlist-management/track-management.js.map +1 -1
- package/dist/tools/queue-management.d.ts +15 -9
- package/dist/tools/queue-management.d.ts.map +1 -1
- package/dist/tools/queue-management.js +41 -30
- package/dist/tools/queue-management.js.map +1 -1
- package/dist/tools/radio-discovery.d.ts +13 -2
- package/dist/tools/radio-discovery.d.ts.map +1 -1
- package/dist/tools/radio-discovery.js +221 -74
- package/dist/tools/radio-discovery.js.map +1 -1
- package/dist/tools/radio-validation/network-validator.d.ts +3 -1
- package/dist/tools/radio-validation/network-validator.d.ts.map +1 -1
- package/dist/tools/radio-validation/network-validator.js +125 -45
- package/dist/tools/radio-validation/network-validator.js.map +1 -1
- package/dist/tools/radio-validation/recommendation-engine.js +15 -15
- package/dist/tools/radio-validation/recommendation-engine.js.map +1 -1
- package/dist/tools/radio-validation/stream-detector.d.ts +8 -1
- package/dist/tools/radio-validation/stream-detector.d.ts.map +1 -1
- package/dist/tools/radio-validation/stream-detector.js +10 -2
- package/dist/tools/radio-validation/stream-detector.js.map +1 -1
- package/dist/tools/radio-validation/validation-core.d.ts.map +1 -1
- package/dist/tools/radio-validation/validation-core.js +43 -13
- package/dist/tools/radio-validation/validation-core.js.map +1 -1
- package/dist/tools/radio.d.ts +60 -18
- package/dist/tools/radio.d.ts.map +1 -1
- package/dist/tools/radio.js +299 -161
- package/dist/tools/radio.js.map +1 -1
- package/dist/tools/search/filter-resolver.d.ts +21 -8
- package/dist/tools/search/filter-resolver.d.ts.map +1 -1
- package/dist/tools/search/filter-resolver.js +29 -15
- package/dist/tools/search/filter-resolver.js.map +1 -1
- package/dist/tools/search/parallel-searcher.d.ts +0 -9
- package/dist/tools/search/parallel-searcher.d.ts.map +1 -1
- package/dist/tools/search/parallel-searcher.js +32 -45
- package/dist/tools/search/parallel-searcher.js.map +1 -1
- package/dist/tools/search/result-aggregator.d.ts +23 -6
- package/dist/tools/search/result-aggregator.d.ts.map +1 -1
- package/dist/tools/search/result-aggregator.js +39 -25
- package/dist/tools/search/result-aggregator.js.map +1 -1
- package/dist/tools/search/search-orchestrator.d.ts +3 -1
- package/dist/tools/search/search-orchestrator.d.ts.map +1 -1
- package/dist/tools/search/search-orchestrator.js +38 -15
- package/dist/tools/search/search-orchestrator.js.map +1 -1
- package/dist/tools/tags.d.ts +0 -2
- package/dist/tools/tags.d.ts.map +1 -1
- package/dist/tools/tags.js +129 -41
- package/dist/tools/tags.js.map +1 -1
- package/dist/tools/test.d.ts.map +1 -1
- package/dist/tools/test.js +6 -6
- package/dist/tools/test.js.map +1 -1
- package/dist/tools/user-preferences.d.ts +2 -21
- package/dist/tools/user-preferences.d.ts.map +1 -1
- package/dist/tools/user-preferences.js +20 -90
- package/dist/tools/user-preferences.js.map +1 -1
- package/dist/transformers/album-transformer.d.ts +17 -3
- package/dist/transformers/album-transformer.d.ts.map +1 -1
- package/dist/transformers/album-transformer.js +54 -6
- package/dist/transformers/album-transformer.js.map +1 -1
- package/dist/transformers/artist-transformer.d.ts +2 -1
- package/dist/transformers/artist-transformer.d.ts.map +1 -1
- package/dist/transformers/artist-transformer.js +18 -5
- package/dist/transformers/artist-transformer.js.map +1 -1
- package/dist/transformers/index.d.ts.map +1 -1
- package/dist/transformers/index.js +3 -1
- package/dist/transformers/index.js.map +1 -1
- package/dist/transformers/playlist-transformer.d.ts +11 -2
- package/dist/transformers/playlist-transformer.d.ts.map +1 -1
- package/dist/transformers/playlist-transformer.js +15 -1
- package/dist/transformers/playlist-transformer.js.map +1 -1
- package/dist/transformers/shared-transformers.d.ts +8 -0
- package/dist/transformers/shared-transformers.d.ts.map +1 -1
- package/dist/transformers/shared-transformers.js +16 -0
- package/dist/transformers/shared-transformers.js.map +1 -1
- package/dist/transformers/song-transformer.d.ts +3 -1
- package/dist/transformers/song-transformer.d.ts.map +1 -1
- package/dist/transformers/song-transformer.js +15 -2
- package/dist/transformers/song-transformer.js.map +1 -1
- package/dist/types/core.d.ts +8 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/library.d.ts +6 -8
- package/dist/types/library.d.ts.map +1 -1
- package/dist/types/playlists.d.ts +17 -2
- package/dist/types/playlists.d.ts.map +1 -1
- package/dist/types/radio.d.ts +10 -28
- package/dist/types/radio.d.ts.map +1 -1
- package/dist/utils/fetch-with-timeout.d.ts +60 -0
- package/dist/utils/fetch-with-timeout.d.ts.map +1 -0
- package/dist/utils/fetch-with-timeout.js +142 -0
- package/dist/utils/fetch-with-timeout.js.map +1 -0
- package/dist/utils/go-time.d.ts +24 -0
- package/dist/utils/go-time.d.ts.map +1 -0
- package/dist/utils/go-time.js +36 -0
- package/dist/utils/go-time.js.map +1 -0
- package/dist/utils/jwt-decode.d.ts +72 -0
- package/dist/utils/jwt-decode.d.ts.map +1 -0
- package/dist/utils/jwt-decode.js +123 -0
- package/dist/utils/jwt-decode.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -5
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +144 -17
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/message-manager.js +7 -7
- package/dist/utils/message-manager.js.map +1 -1
- package/dist/utils/network-safety.d.ts +52 -0
- package/dist/utils/network-safety.d.ts.map +1 -0
- package/dist/utils/network-safety.js +145 -0
- package/dist/utils/network-safety.js.map +1 -0
- package/dist/utils/radio-browser-rate-limit.d.ts +27 -0
- package/dist/utils/radio-browser-rate-limit.d.ts.map +1 -0
- package/dist/utils/radio-browser-rate-limit.js +59 -0
- package/dist/utils/radio-browser-rate-limit.js.map +1 -0
- package/dist/utils/radio-browser-resolver.d.ts +41 -0
- package/dist/utils/radio-browser-resolver.d.ts.map +1 -0
- package/dist/utils/radio-browser-resolver.js +131 -0
- package/dist/utils/radio-browser-resolver.js.map +1 -0
- package/dist/utils/safe-number.d.ts +28 -0
- package/dist/utils/safe-number.d.ts.map +1 -0
- package/dist/utils/safe-number.js +31 -0
- package/dist/utils/safe-number.js.map +1 -0
- package/dist/utils/sanitize-url.d.ts +29 -0
- package/dist/utils/sanitize-url.d.ts.map +1 -0
- package/dist/utils/sanitize-url.js +47 -0
- package/dist/utils/sanitize-url.js.map +1 -0
- package/dist/utils/strip-html.d.ts +33 -0
- package/dist/utils/strip-html.d.ts.map +1 -0
- package/dist/utils/strip-html.js +60 -0
- package/dist/utils/strip-html.js.map +1 -0
- package/dist/utils/subsonic-auth.d.ts +31 -0
- package/dist/utils/subsonic-auth.d.ts.map +1 -0
- package/dist/utils/subsonic-auth.js +45 -0
- package/dist/utils/subsonic-auth.js.map +1 -0
- package/dist/webui/broadcaster.d.ts +64 -0
- package/dist/webui/broadcaster.d.ts.map +1 -0
- package/dist/webui/broadcaster.js +227 -0
- package/dist/webui/broadcaster.js.map +1 -0
- package/dist/webui/http-helpers.d.ts +28 -0
- package/dist/webui/http-helpers.d.ts.map +1 -0
- package/dist/webui/http-helpers.js +85 -0
- package/dist/webui/http-helpers.js.map +1 -0
- package/dist/webui/index.d.ts +74 -0
- package/dist/webui/index.d.ts.map +1 -0
- package/dist/webui/index.js +165 -0
- package/dist/webui/index.js.map +1 -0
- package/dist/webui/network.d.ts +39 -0
- package/dist/webui/network.d.ts.map +1 -0
- package/dist/webui/network.js +50 -0
- package/dist/webui/network.js.map +1 -0
- package/dist/webui/public/app.js +629 -0
- package/dist/webui/public/index.html +141 -0
- package/dist/webui/public/styles.css +634 -0
- package/dist/webui/routes/controls.d.ts +41 -0
- package/dist/webui/routes/controls.d.ts.map +1 -0
- package/dist/webui/routes/controls.js +95 -0
- package/dist/webui/routes/controls.js.map +1 -0
- package/dist/webui/routes/cover.d.ts +36 -0
- package/dist/webui/routes/cover.d.ts.map +1 -0
- package/dist/webui/routes/cover.js +93 -0
- package/dist/webui/routes/cover.js.map +1 -0
- package/dist/webui/routes/events.d.ts +27 -0
- package/dist/webui/routes/events.d.ts.map +1 -0
- package/dist/webui/routes/events.js +27 -0
- package/dist/webui/routes/events.js.map +1 -0
- package/dist/webui/routes/network-info.d.ts +30 -0
- package/dist/webui/routes/network-info.d.ts.map +1 -0
- package/dist/webui/routes/network-info.js +43 -0
- package/dist/webui/routes/network-info.js.map +1 -0
- package/dist/webui/routes/snapshot.d.ts +30 -0
- package/dist/webui/routes/snapshot.d.ts.map +1 -0
- package/dist/webui/routes/snapshot.js +46 -0
- package/dist/webui/routes/snapshot.js.map +1 -0
- package/dist/webui/routes/static-files.d.ts +25 -0
- package/dist/webui/routes/static-files.d.ts.map +1 -0
- package/dist/webui/routes/static-files.js +120 -0
- package/dist/webui/routes/static-files.js.map +1 -0
- package/dist/webui/server.d.ts +39 -0
- package/dist/webui/server.d.ts.map +1 -0
- package/dist/webui/server.js +106 -0
- package/dist/webui/server.js.map +1 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,153 +1,104 @@
|
|
|
1
1
|
# Navidrome MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Turn your Navidrome music server into a conversational music assistant. This MCP (Model Context Protocol) server lets Claude Desktop, Claude Code, Cursor, and other MCP-compatible clients browse and curate your library, build playlists, discover new music, and play audio directly through your machine's speakers.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
7
|
-
- [Why Navidrome MCP?](#why-navidrome-mcp)
|
|
8
7
|
- [Features](#features)
|
|
9
|
-
- [Music Library Management](#-music-library-management)
|
|
10
|
-
- [Intelligent Playlist Creation](#-intelligent-playlist-creation)
|
|
11
|
-
- [Personalized Music Discovery](#-personalized-music-discovery)
|
|
12
|
-
- [Smart Radio Management](#-smart-radio-management)
|
|
13
|
-
- [Analytics & Insights](#-analytics--insights)
|
|
14
8
|
- [Installation](#installation)
|
|
15
|
-
|
|
16
|
-
- [Quick Setup](#quick-setup)
|
|
17
|
-
- [Configure Claude Desktop](#configure-claude-desktop)
|
|
18
|
-
- [Configure ChatGPT Desktop](#configure-chatgpt-desktop)
|
|
19
|
-
- [Powerful Usage Examples](#powerful-usage-examples)
|
|
9
|
+
- [MPV Remote (Web UI)](#mpv-remote-web-ui)
|
|
20
10
|
- [Available Tools](#available-tools)
|
|
21
11
|
- [Troubleshooting](#troubleshooting)
|
|
22
12
|
- [Development](#development)
|
|
23
13
|
- [License](#license)
|
|
24
14
|
|
|
25
|
-
##
|
|
15
|
+
## Features
|
|
26
16
|
|
|
27
|
-
|
|
17
|
+
### 🎵 Music Library
|
|
28
18
|
|
|
29
|
-
-
|
|
30
|
-
- **Discover hidden gems** in your library based on your mood or activity
|
|
31
|
-
- **Build custom radio stations** from your favorite tracks
|
|
32
|
-
- **Find music similar to what you love** using Last.fm's recommendation engine
|
|
33
|
-
- **Discover internet radio stations** from around the world with advanced filtering
|
|
34
|
-
- **Get synchronized lyrics** with millisecond-precision timestamps for your favorite tracks
|
|
35
|
-
- **Manage your library** with simple conversational commands
|
|
19
|
+
Browse and search songs, albums, artists, genres, and tags with rich filtering: query, starred status, year range, sort order, tag values, and more. Combine filters to ask things like *"all my starred jazz albums from the 90s, sorted by year"* or *"every song tagged Soundtrack with a 5-star rating"*. Tag analysis tools surface what's actually in your library so you don't have to guess at filter values.
|
|
36
20
|
|
|
37
|
-
|
|
21
|
+
### 🔊 Local Audio Playback
|
|
38
22
|
|
|
39
|
-
|
|
23
|
+
> Requires [`mpv`](https://mpv.io/) on the host running the MCP server (see [Installing mpv](#installing-mpv-optional)).
|
|
24
|
+
|
|
25
|
+
Audio plays through your machine's speakers, no browser or Navidrome web UI needed. Search and play in a single step: *"play 5 random starred albums"*, *"queue everything I've starred from the 90s sorted by year"*, *"add 10 random rock songs to whatever's already playing, shuffled"*. Three shuffle modes for albums (keep order, randomize album order, fully interleave tracks).
|
|
40
26
|
|
|
41
|
-
|
|
27
|
+
The live queue is actively manipulable: move a track to the front and it starts playing, shuffle and the new top plays, remove the current track and the next one auto-advances. Saved Navidrome radio stations (Icecast, SHOUTcast, etc.) stream through mpv with ICY metadata flowing through so you can see what the station is currently playing. Plays scrobble back to Navidrome so your recently-played and play counts stay in sync with what you actually listen to through mpv. mpv is lazy-spawned on first use, survives MCP client restarts via a per-user socket, and works on Linux, macOS, and Windows 11.
|
|
42
28
|
|
|
43
|
-
|
|
44
|
-
* **Deep Search**: Full-text search across all metadata or targeted searches for specific content
|
|
45
|
-
* **Rich Metadata**: Access detailed information about tracks, albums, and artists
|
|
46
|
-
* **Tag Analysis**: Explore and analyze metadata tags (genre, composer, label, year, and more)
|
|
47
|
-
* **Clean Responses**: Optimized data transfer with only essential fields (~10 properties vs 50+ raw)
|
|
29
|
+
This design is built for conversational control and pairs cleanly with voice transports (Whisper STT + TTS) to build a hands-free music device on a Raspberry Pi or always-on machine.
|
|
48
30
|
|
|
49
|
-
###
|
|
31
|
+
### 🎛️ MPV Remote (Web Control Panel)
|
|
50
32
|
|
|
51
|
-
|
|
52
|
-
* **Smart Management**: Create, update, and organize playlists conversationally
|
|
53
|
-
* **Flexible Track Addition**: Add songs by ID, entire albums, artist discographies, or specific discs
|
|
54
|
-
* **Dynamic Reordering**: Rearrange tracks with simple commands
|
|
55
|
-
* **Cross-Reference**: Find which playlists contain specific songs
|
|
33
|
+
> Requires `mpv` (same as Local Audio Playback). On by default; lazy-binds once playback starts.
|
|
56
34
|
|
|
57
|
-
|
|
35
|
+
A companion web UI at `http://localhost:8808` for controlling local mpv playback from any browser. Now-playing card with cover art, transport controls (previous / pause-resume / next), seek bar, volume slider, and a queue list with click-to-jump. Updates live via Server-Sent Events so a phone laid on the desk stays in sync as the assistant feeds the queue. Defaults to localhost-only; flip one env var to expose it on your LAN and use a phone or tablet as a music remote. See [MPV Remote (Web UI)](#mpv-remote-web-ui) for setup and the security note.
|
|
58
36
|
|
|
59
|
-
|
|
60
|
-
* **Similar Artist/Track Finding**: Discover music similar to your favorites via Last.fm
|
|
61
|
-
* **Artist Deep Dives**: Get biographies, popular tracks, and related artists
|
|
62
|
-
* **Global Trends**: Browse worldwide music charts and trending genres
|
|
63
|
-
* **Library Analysis Tools**: Access data to help AI assistants find overlooked tracks in your library
|
|
37
|
+
### 🎶 Playlists
|
|
64
38
|
|
|
65
|
-
|
|
39
|
+
Create, update, reorder, and delete playlists conversationally. Add content flexibly in one operation: single songs, entire albums, whole artist discographies, or specific discs. Find which playlists contain a given song. Build dynamic playlists from listening data: *"a 'Hidden Gems' playlist of 5-star songs with under 5 plays"*, *"one top track from each album of my top 10 artists, in chronological order"*.
|
|
66
40
|
|
|
67
|
-
|
|
68
|
-
* **Format Detection**: Automatic detection of MP3, AAC, OGG, FLAC streams
|
|
69
|
-
* **Metadata Extraction**: Pull station info from SHOUTcast/Icecast headers
|
|
70
|
-
* **Custom Station Creation**: Build radio stations from your collection
|
|
71
|
-
* **One-Time Setup Tips**: Smart contextual help that appears only when needed
|
|
41
|
+
### 🎼 Music Discovery (Last.fm)
|
|
72
42
|
|
|
73
|
-
|
|
43
|
+
> Requires `LASTFM_API_KEY`. Free key at [last.fm/api](https://www.last.fm/api/account/create).
|
|
74
44
|
|
|
75
|
-
*
|
|
76
|
-
* **Advanced Filtering**: Search by genre, country, language, codec, bitrate, and more
|
|
77
|
-
* **Automatic Validation**: Discovered stations are tested for availability
|
|
78
|
-
* **Quality Control**: Filter out broken stations and focus on high-quality streams
|
|
79
|
-
* **Popularity Metrics**: Discover stations by vote count and listener engagement
|
|
80
|
-
* **Station Management**: Tools for AI assistants to add discovered stations to your collection
|
|
45
|
+
Find similar artists and tracks, fetch biographies and top tracks, and browse global music charts. Combine with your library to do gap analysis (*"albums missing from my top 5 artists, ranked by popularity"*), rediscover overlooked music (*"tracks similar to my favorites that I own but never play"*), or build curated "Best Of" playlists scoped to what you actually own.
|
|
81
46
|
|
|
82
47
|
### 🎤 Synchronized Lyrics
|
|
83
48
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
49
|
+
> Requires `LYRICS_PROVIDER=lrclib` and `LRCLIB_USER_AGENT`. No API key needed.
|
|
50
|
+
|
|
51
|
+
Fetch time-synced lyrics with millisecond-precision timestamps (LRC format) and plain-text fallbacks from LRCLIB's community database. Matched automatically by title, artist, album, and duration.
|
|
52
|
+
|
|
53
|
+
### 📻 Internet Radio
|
|
89
54
|
|
|
90
|
-
|
|
55
|
+
Manage Navidrome radio stations and discover new ones globally. Stream URLs are validated before adding (MP3, AAC, OGG, FLAC detection) and SHOUTcast/Icecast metadata is extracted automatically. Bulk maintenance is supported: *"validate all my stations and remove the broken ones"* or *"test these 10 URLs and add the working ones"*.
|
|
56
|
+
|
|
57
|
+
Global station discovery via Radio Browser (requires `RADIO_BROWSER_USER_AGENT`) covers thousands of stations filterable by genre, country, language, codec, bitrate, and popularity, with vote and click registration so your usage feeds the community ranking.
|
|
58
|
+
|
|
59
|
+
### 📊 Listening Analytics
|
|
60
|
+
|
|
61
|
+
Access play counts, recently-played activity, top-rated and most-played listings, and tag distribution across your library. Use this to drive taste analysis (*"genres I'm playing more vs. less this year"*), discover forgotten favorites, identify one-hit-wonders in your collection, or build mood-based playlists from your listening patterns.
|
|
62
|
+
|
|
63
|
+
### ⭐ Ratings & Favorites
|
|
91
64
|
|
|
92
|
-
|
|
93
|
-
* **Taste Evolution**: Track how your preferences change over time
|
|
94
|
-
* **Most/Least Played**: Discover your true favorites and forgotten tracks
|
|
95
|
-
* **Genre Distribution**: Access data about your library's composition for analysis
|
|
96
|
-
* **Recommendation Data**: Provides data for AI assistants to generate suggestions based on your history
|
|
65
|
+
Star/unstar songs, albums, and artists, set 0-5 star ratings, and list everything starred or top-rated. Read and write the saved Navidrome queue used by the web UI for cross-device sync.
|
|
97
66
|
|
|
98
|
-
###
|
|
67
|
+
### 📚 Multi-Library Support
|
|
99
68
|
|
|
100
|
-
|
|
101
|
-
* **5-Star Ratings**: Rate content for better recommendations
|
|
102
|
-
* **Queue Control**: Manage playback queues across devices
|
|
103
|
-
* **Data Access for Organization**: Provides preference data for AI assistants to help organize your collection
|
|
69
|
+
Filter all operations to a subset of your Navidrome libraries, either by setting a default in your client config (`NAVIDROME_DEFAULT_LIBRARIES`) or by switching active libraries at runtime.
|
|
104
70
|
|
|
105
71
|
## Installation
|
|
106
72
|
|
|
107
73
|
### Prerequisites
|
|
108
74
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
**Additional for manual build:**
|
|
114
|
-
* **pnpm** package manager ([Install instructions](https://pnpm.io/installation))
|
|
75
|
+
- **Node.js 20+** ([download](https://nodejs.org/))
|
|
76
|
+
- **A running Navidrome server**
|
|
77
|
+
- **An MCP-compatible client** (Claude Desktop, Claude Code, Cursor, or another MCP client with local stdio support)
|
|
78
|
+
- **Optional: [mpv](https://mpv.io/)** for local audio playback
|
|
115
79
|
|
|
116
80
|
### Quick Setup
|
|
117
81
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
The easiest way to get started is using the published npm package, which auto-updates on launch:
|
|
82
|
+
Install the published package (auto-updates on launch):
|
|
121
83
|
|
|
122
84
|
```bash
|
|
123
85
|
npm install -g navidrome-mcp
|
|
124
86
|
```
|
|
125
87
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
This installs the MCP server globally and keeps it up-to-date automatically.
|
|
88
|
+
Package: [navidrome-mcp on npm](https://www.npmjs.com/package/navidrome-mcp).
|
|
129
89
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
For development or custom builds:
|
|
90
|
+
For a development build:
|
|
133
91
|
|
|
134
92
|
```bash
|
|
135
93
|
git clone https://github.com/Blakeem/Navidrome-MCP.git
|
|
136
|
-
cd
|
|
94
|
+
cd Navidrome-MCP
|
|
137
95
|
pnpm install
|
|
138
96
|
pnpm build
|
|
139
97
|
```
|
|
140
98
|
|
|
141
|
-
### Configure
|
|
142
|
-
|
|
143
|
-
Find your configuration file:
|
|
144
|
-
* **Windows**: `%APPDATA%/Claude/claude_desktop_config.json`
|
|
145
|
-
* **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
146
|
-
* **Linux**: `~/.config/Claude/claude_desktop_config.json`
|
|
99
|
+
### Configure Your MCP Client
|
|
147
100
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
#### Using NPM Package (Recommended)
|
|
101
|
+
For Claude Desktop, edit `claude_desktop_config.json` (locations: `%APPDATA%/Claude/` on Windows, `~/Library/Application Support/Claude/` on macOS, `~/.config/Claude/` on Linux). Other MCP clients use the same JSON shape.
|
|
151
102
|
|
|
152
103
|
```json
|
|
153
104
|
{
|
|
@@ -159,294 +110,310 @@ Add the Navidrome MCP server:
|
|
|
159
110
|
"NAVIDROME_URL": "http://your-server:4533",
|
|
160
111
|
"NAVIDROME_USERNAME": "your_username",
|
|
161
112
|
"NAVIDROME_PASSWORD": "your_password",
|
|
162
|
-
"
|
|
163
|
-
"
|
|
113
|
+
"NAVIDROME_DEFAULT_LIBRARIES": "1,2",
|
|
114
|
+
"LASTFM_API_KEY": "your_api_key",
|
|
115
|
+
"RADIO_BROWSER_USER_AGENT": "Navidrome-MCP/2.0 (+https://github.com/Blakeem/Navidrome-MCP)",
|
|
164
116
|
"LYRICS_PROVIDER": "lrclib",
|
|
165
|
-
"LRCLIB_USER_AGENT": "Navidrome-MCP/
|
|
117
|
+
"LRCLIB_USER_AGENT": "Navidrome-MCP/2.0 (+https://github.com/Blakeem/Navidrome-MCP)"
|
|
166
118
|
}
|
|
167
119
|
}
|
|
168
120
|
}
|
|
169
121
|
}
|
|
170
122
|
```
|
|
171
123
|
|
|
172
|
-
|
|
124
|
+
For a manual build, replace `command`/`args` with:
|
|
173
125
|
|
|
174
126
|
```json
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
"navidrome": {
|
|
178
|
-
"command": "node",
|
|
179
|
-
"args": ["/absolute/path/to/navidrome-mcp/dist/index.js"],
|
|
180
|
-
"env": {
|
|
181
|
-
"NAVIDROME_URL": "http://your-server:4533",
|
|
182
|
-
"NAVIDROME_USERNAME": "your_username",
|
|
183
|
-
"NAVIDROME_PASSWORD": "your_password",
|
|
184
|
-
"LASTFM_API_KEY": "your_api_key", // Get your own at https://www.last.fm/api/account/create
|
|
185
|
-
"RADIO_BROWSER_USER_AGENT": "Navidrome-MCP/1.0 (+https://github.com/Blakeem/Navidrome-MCP)",
|
|
186
|
-
"LYRICS_PROVIDER": "lrclib",
|
|
187
|
-
"LRCLIB_USER_AGENT": "Navidrome-MCP/1.0 (+https://github.com/Blakeem/Navidrome-MCP)"
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
127
|
+
"command": "node",
|
|
128
|
+
"args": ["/absolute/path/to/Navidrome-MCP/dist/index.js"]
|
|
192
129
|
```
|
|
193
130
|
|
|
194
|
-
**
|
|
195
|
-
- **NPM method**: Uses `npx navidrome-mcp` which auto-updates on each launch
|
|
196
|
-
- **Manual method**: Requires absolute paths (full path from root) and manual updates
|
|
197
|
-
- Get a free Last.fm API key at [Last.fm](https://www.last.fm/api) (optional - enables music discovery)
|
|
198
|
-
- Radio Browser integration requires a User-Agent string (enables station discovery)
|
|
199
|
-
- Lyrics integration works without API keys (LRCLIB is free)
|
|
200
|
-
- Features are automatically enabled/disabled based on available configuration
|
|
201
|
-
- Restart Claude Desktop after saving
|
|
131
|
+
**Required:** `NAVIDROME_URL`, `NAVIDROME_USERNAME`, `NAVIDROME_PASSWORD`.
|
|
202
132
|
|
|
203
|
-
|
|
133
|
+
**Optional:**
|
|
134
|
+
- `NAVIDROME_DEFAULT_LIBRARIES`: comma-separated library IDs to activate by default; omit for all libraries.
|
|
135
|
+
- `LASTFM_API_KEY`: enables Last.fm discovery features.
|
|
136
|
+
- `RADIO_BROWSER_USER_AGENT`: enables Radio Browser global station discovery. Replace the project URL with your own.
|
|
137
|
+
- `LYRICS_PROVIDER=lrclib` + `LRCLIB_USER_AGENT`: enables lyrics fetching.
|
|
138
|
+
- `MPV_PATH`: point at the mpv binary if it's not on `PATH` (e.g. `"C:\\Program Files\\mpv\\mpv.exe"`).
|
|
139
|
+
- `WEBUI_PORT` / `WEBUI_HOST` / `WEBUI_EXPOSE` / `WEBUI_ENABLED`: configure the [MPV Remote web UI](#mpv-remote-web-ui) — defaults to `localhost:8808` and lazy-binds once mpv is playing.
|
|
204
140
|
|
|
205
|
-
|
|
141
|
+
Features turn on automatically when their config is present. Restart your MCP client after changing the config.
|
|
206
142
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
143
|
+
### Installing mpv (optional)
|
|
144
|
+
|
|
145
|
+
mpv is a lightweight, cross-platform media player. When detected at startup, the server registers an additional set of playback tools so audio streams through your machine's speakers. Without it, the server still manages your library and Navidrome's saved queue; it just doesn't produce audio.
|
|
146
|
+
|
|
147
|
+
**macOS** (via [Homebrew](https://brew.sh/)):
|
|
148
|
+
```bash
|
|
149
|
+
brew install mpv
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Linux:**
|
|
153
|
+
```bash
|
|
154
|
+
sudo apt install mpv # Debian / Ubuntu / Mint / PopOS
|
|
155
|
+
sudo dnf install mpv # Fedora / RHEL / CentOS Stream
|
|
156
|
+
sudo pacman -S mpv # Arch / Manjaro
|
|
157
|
+
sudo zypper install mpv # openSUSE
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Windows:**
|
|
161
|
+
```powershell
|
|
162
|
+
winget install shinchiro.mpv # winget is included on Windows 11
|
|
163
|
+
scoop install mpv
|
|
164
|
+
choco install mpv
|
|
165
|
+
```
|
|
214
166
|
|
|
215
|
-
|
|
167
|
+
> Use the full package ID `shinchiro.mpv` to skip the disambiguation prompt; the Microsoft Store also lists an unofficial third-party `mpv` package, and plain `winget install mpv` will ask you to pick. The shinchiro build is the community standard that [mpv.io](https://mpv.io/installation/) itself points to for Windows.
|
|
168
|
+
>
|
|
169
|
+
> **Windows `PATH` note.** The `shinchiro.mpv` winget package installs to `C:\Program Files\MPV Player\` on Windows 11 and does **not** add itself to `PATH`. You have two options:
|
|
170
|
+
> - Add the install folder to your user or system `PATH` (System Properties → Environment Variables → Path → New → `C:\Program Files\MPV Player`), then open a new terminal so the change takes effect.
|
|
171
|
+
> - Or set `MPV_PATH` in your MCP client config to the full `mpv.exe` path, e.g. `"MPV_PATH": "C:\\Program Files\\MPV Player\\mpv.exe"`.
|
|
172
|
+
>
|
|
173
|
+
> Other install methods (scoop, chocolatey, manual zip from mpv.io) drop `mpv.exe` in a different folder. If `mpv --version` doesn't work in a fresh terminal after install, locate `mpv.exe` and apply one of the two fixes above.
|
|
216
174
|
|
|
217
|
-
|
|
218
|
-
2. Go to **Settings → Connectors**
|
|
219
|
-
3. Click **Create** and add:
|
|
220
|
-
- **Command**: `node`
|
|
221
|
-
- **Args**: `/absolute/path/to/navidrome-mcp/dist/index.js`
|
|
222
|
-
- **Environment variables**: Same as above
|
|
223
|
-
4. Save and restart
|
|
175
|
+
Or a pre-built binary from [mpv.io](https://mpv.io/installation/). Verify with `mpv --version`, then restart your MCP client so the server re-detects mpv.
|
|
224
176
|
|
|
225
|
-
|
|
177
|
+
### A Note on ChatGPT Desktop
|
|
226
178
|
|
|
227
|
-
|
|
179
|
+
ChatGPT's MCP support (web and desktop) requires a hosted HTTPS endpoint and is not currently compatible with local stdio servers like this one. If you really want to make it work with ChatGPT, you can wrap a stdio server in HTTPS using a bridge like [`mcp-remote`](https://www.npmjs.com/package/mcp-remote), but that adds operational complexity for a self-hosted music server. Otherwise, use Claude Desktop, Claude Code, Cursor, or another client with native stdio support. Re-check once OpenAI adds first-party stdio MCP support.
|
|
228
180
|
|
|
229
|
-
|
|
230
|
-
* **"Create a 'Best of Pink Floyd' playlist using Last.fm's top tracks data, but only with songs I actually own"**
|
|
231
|
-
* **"Analyze my recently played songs, find similar tracks in my library I haven't played in 6 months, and create a rediscovery playlist"**
|
|
232
|
-
* **"Build me a playlist mixing my top 10 most played songs with similar tracks from artists I own but rarely listen to"**
|
|
181
|
+
## MPV Remote (Web UI)
|
|
233
182
|
|
|
234
|
-
|
|
183
|
+
When local audio playback is active, the MCP server runs a companion web interface that doubles as a now-playing display and a transport-control remote. Open it in any browser on the host (or anywhere on your LAN once exposed).
|
|
235
184
|
|
|
236
|
-
|
|
237
|
-
* **"Find artists where I only own singles or compilations, not their main albums"**
|
|
238
|
-
* **"Identify my favorite genres, then show me highly-rated albums in those genres that I don't own"**
|
|
239
|
-
* **"Look at artists similar to my favorites and tell me which ones I already have in my library but never play"**
|
|
185
|
+
[](navidome-mcp-mpv-remote-large.png)
|
|
240
186
|
|
|
241
|
-
###
|
|
187
|
+
### What it does
|
|
242
188
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
189
|
+
- **Now-playing card** — cover art, title, artist, album, and queue position. A `Live` indicator confirms the SSE stream is healthy.
|
|
190
|
+
- **Transport controls** — previous / pause-resume / next, with a seek bar showing current position and remaining time.
|
|
191
|
+
- **Volume slider** — drives mpv's internal volume control (independent of your OS volume).
|
|
192
|
+
- **Queue list** — every track in the current mpv queue with title, artist · album, and duration. Click any row to jump to it.
|
|
193
|
+
- **Live state updates** — Server-Sent Events push state changes the instant they happen, throttled to ~1 Hz so the progress bar runs smoothly without flooding the network. Connections auto-reconnect on disconnect.
|
|
247
194
|
|
|
248
|
-
###
|
|
195
|
+
### Enabling
|
|
249
196
|
|
|
250
|
-
|
|
251
|
-
* **"Build weekly playlists based on what I listened to most each month of last year"**
|
|
252
|
-
* **"Make a 'Complete Artist Journey' playlist with one top track from each album of my top 10 artists, in chronological order"**
|
|
253
|
-
* **"Generate mood playlists by analyzing my listening patterns: what I play in mornings vs evenings vs weekends"**
|
|
197
|
+
The web UI is **on by default** and binds **lazily**: the port only opens once mpv has something playing, OR when the server reattaches to a pre-existing mpv queue across MCP restarts. Hosts without mpv installed see no listener at all.
|
|
254
198
|
|
|
255
|
-
|
|
199
|
+
To turn it off entirely, set `WEBUI_ENABLED=false` in your MCP client's env block.
|
|
256
200
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
201
|
+
### Configuration
|
|
202
|
+
|
|
203
|
+
All variables are optional. Add them alongside `NAVIDROME_URL` etc. in your MCP client's `env` block, then restart the client.
|
|
204
|
+
|
|
205
|
+
| Variable | Default | Effect |
|
|
206
|
+
|---|---|---|
|
|
207
|
+
| `WEBUI_ENABLED` | `true` | Set to `false` to disable the panel entirely. |
|
|
208
|
+
| `WEBUI_PORT` | `8808` | Port the HTTP server listens on. Pick a free port if 8808 is taken on your host. |
|
|
209
|
+
| `WEBUI_HOST` | `127.0.0.1` | Bind address. Override only if you know which interface you want — usually `WEBUI_EXPOSE` is the right knob. |
|
|
210
|
+
| `WEBUI_EXPOSE` | `false` | Set to `true` to bind on `0.0.0.0` so other devices on your LAN can reach the panel. |
|
|
211
|
+
|
|
212
|
+
When `WEBUI_EXPOSE=true`, the MCP server logs the LAN URLs it's reachable on at bind time (e.g. `http://192.168.1.42:8808`). Open one of those on your phone or tablet.
|
|
213
|
+
|
|
214
|
+
### Using it as a phone/tablet remote
|
|
215
|
+
|
|
216
|
+
1. Set `"WEBUI_EXPOSE": "true"` in your MCP client's env block.
|
|
217
|
+
2. Restart the MCP client.
|
|
218
|
+
3. Trigger any playback (e.g. ask the assistant to *"play all my starred songs"*) — this is what causes the web UI to bind.
|
|
219
|
+
4. Open the LAN URL from the startup log on your phone's browser. Bookmark it for one-tap access — the page is a single static HTML/CSS/JS bundle, no install required.
|
|
220
|
+
|
|
221
|
+
### Security note
|
|
222
|
+
|
|
223
|
+
The web UI has **no authentication** — anyone who can reach the port can pause, skip, seek, change volume, and jump around the queue.
|
|
224
|
+
|
|
225
|
+
- On `WEBUI_HOST=127.0.0.1` (the default) it's only reachable from the host machine, which is safe.
|
|
226
|
+
- On `WEBUI_EXPOSE=true` it's reachable from anything on the LAN. That's usually fine on a trusted home network, but **do not expose it directly to the public internet**. There's no rate-limiting, no auth, and the control API allows queue manipulation.
|
|
261
227
|
|
|
262
228
|
## Available Tools
|
|
263
229
|
|
|
264
|
-
|
|
230
|
+
Tools marked **conditional** are only registered when the corresponding configuration is present.
|
|
231
|
+
|
|
232
|
+
### Core System
|
|
265
233
|
|
|
266
234
|
| Tool | Description |
|
|
267
235
|
|------|-------------|
|
|
268
|
-
| `test_connection` | Verify Navidrome
|
|
236
|
+
| `test_connection` | Verify Navidrome connectivity and report feature/tool availability |
|
|
269
237
|
|
|
270
|
-
###
|
|
238
|
+
### Library Management
|
|
271
239
|
|
|
272
240
|
| Tool | Description |
|
|
273
241
|
|------|-------------|
|
|
274
|
-
| `get_song` | Detailed song
|
|
275
|
-
| `get_album` | Detailed album
|
|
276
|
-
| `get_artist` | Detailed artist
|
|
277
|
-
| `get_song_playlists` |
|
|
278
|
-
| `get_user_details` |
|
|
279
|
-
| `set_active_libraries` | Set which libraries are active for
|
|
242
|
+
| `get_song` | Detailed song metadata by ID |
|
|
243
|
+
| `get_album` | Detailed album metadata by ID |
|
|
244
|
+
| `get_artist` | Detailed artist metadata by ID |
|
|
245
|
+
| `get_song_playlists` | List all playlists containing a given song |
|
|
246
|
+
| `get_user_details` | User profile, available libraries, and active-library status |
|
|
247
|
+
| `set_active_libraries` | Set which libraries are active for all search/list operations |
|
|
280
248
|
|
|
281
|
-
###
|
|
249
|
+
### Search
|
|
282
250
|
|
|
283
251
|
| Tool | Description |
|
|
284
252
|
|------|-------------|
|
|
285
|
-
| `search_all` | Search across
|
|
286
|
-
| `search_songs` | Search
|
|
287
|
-
| `search_albums` | Search
|
|
288
|
-
| `search_artists` | Search
|
|
289
|
-
| `get_similar_artists` | Find similar artists (Last.fm) |
|
|
290
|
-
| `get_similar_tracks` | Find similar tracks (Last.fm) |
|
|
291
|
-
| `get_artist_info` | Artist biography and tags |
|
|
292
|
-
| `get_top_tracks_by_artist` | Get top tracks for an artist from Last.fm |
|
|
293
|
-
| `get_trending_music` | Global music trends |
|
|
253
|
+
| `search_all` | Search across artists, albums, and songs with filters and sorting |
|
|
254
|
+
| `search_songs` | Search songs with advanced filters and sorting |
|
|
255
|
+
| `search_albums` | Search albums with advanced filters and sorting |
|
|
256
|
+
| `search_artists` | Search artists with advanced filters and sorting |
|
|
294
257
|
|
|
295
|
-
###
|
|
258
|
+
### Playlists
|
|
296
259
|
|
|
297
260
|
| Tool | Description |
|
|
298
261
|
|------|-------------|
|
|
299
|
-
| `list_playlists` | View all playlists |
|
|
300
|
-
| `get_playlist` | Get
|
|
301
|
-
| `create_playlist` | Create new playlist |
|
|
302
|
-
| `update_playlist` | Update
|
|
303
|
-
| `delete_playlist` |
|
|
304
|
-
| `get_playlist_tracks` | Get playlist contents |
|
|
305
|
-
| `add_tracks_to_playlist` | Add
|
|
306
|
-
| `remove_tracks_from_playlist` | Remove
|
|
307
|
-
| `reorder_playlist_track` |
|
|
262
|
+
| `list_playlists` | View all accessible playlists |
|
|
263
|
+
| `get_playlist` | Get playlist metadata by ID |
|
|
264
|
+
| `create_playlist` | Create a new playlist |
|
|
265
|
+
| `update_playlist` | Update name, description, or visibility |
|
|
266
|
+
| `delete_playlist` | Delete a playlist |
|
|
267
|
+
| `get_playlist_tracks` | Get playlist contents (JSON or M3U) |
|
|
268
|
+
| `add_tracks_to_playlist` | Add songs, albums, artist discographies, or specific discs in one operation |
|
|
269
|
+
| `remove_tracks_from_playlist` | Remove tracks by position |
|
|
270
|
+
| `reorder_playlist_track` | Move a track to a new position |
|
|
271
|
+
|
|
272
|
+
### Ratings & Favorites
|
|
308
273
|
|
|
309
|
-
|
|
274
|
+
| Tool | Description |
|
|
275
|
+
|------|-------------|
|
|
276
|
+
| `star_item` | Star a song, album, or artist |
|
|
277
|
+
| `unstar_item` | Remove a star |
|
|
278
|
+
| `set_rating` | Set a 0-5 star rating |
|
|
279
|
+
| `list_starred_items` | View starred songs, albums, or artists |
|
|
280
|
+
| `list_top_rated` | View highest-rated items |
|
|
281
|
+
|
|
282
|
+
### Listening History & Saved Queue
|
|
310
283
|
|
|
311
284
|
| Tool | Description |
|
|
312
285
|
|------|-------------|
|
|
313
|
-
| `
|
|
314
|
-
| `
|
|
315
|
-
| `
|
|
316
|
-
| `
|
|
317
|
-
| `
|
|
286
|
+
| `list_recently_played` | Recent listening activity with optional time-range filter |
|
|
287
|
+
| `list_most_played` | Most-played songs, albums, or artists |
|
|
288
|
+
| `get_saved_queue` | Read the Navidrome saved queue (web UI sync) |
|
|
289
|
+
| `save_queue` | Save a queue to Navidrome for web UI sync |
|
|
290
|
+
| `clear_saved_queue` | Clear the Navidrome saved queue |
|
|
318
291
|
|
|
319
|
-
###
|
|
292
|
+
### Metadata & Tags
|
|
320
293
|
|
|
321
294
|
| Tool | Description |
|
|
322
295
|
|------|-------------|
|
|
323
|
-
| `
|
|
324
|
-
| `
|
|
325
|
-
| `
|
|
326
|
-
| `set_queue` | Set playback queue |
|
|
327
|
-
| `clear_queue` | Clear the playback queue |
|
|
296
|
+
| `search_by_tags` | Search by tag values (genre, releasetype, media, etc.) |
|
|
297
|
+
| `get_tag_distribution` | Tag usage counts across the library |
|
|
298
|
+
| `get_filter_options` | Discover available filter values for search operations |
|
|
328
299
|
|
|
329
|
-
###
|
|
300
|
+
### Last.fm Discovery (requires `LASTFM_API_KEY`)
|
|
330
301
|
|
|
331
302
|
| Tool | Description |
|
|
332
303
|
|------|-------------|
|
|
333
|
-
| `
|
|
334
|
-
| `
|
|
335
|
-
| `
|
|
336
|
-
| `
|
|
337
|
-
| `
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
| `discover_radio_stations` | Find internet radio stations globally |
|
|
341
|
-
| `get_radio_filters` | Get available search filters (genres, countries, etc.) |
|
|
342
|
-
| `get_station_by_uuid` | Get detailed station information |
|
|
343
|
-
| `click_station` | Register play click for popularity metrics |
|
|
344
|
-
| `vote_station` | Vote for a radio station |
|
|
345
|
-
|
|
346
|
-
*Note: `create_radio_station` supports an optional `validateBeforeAdd` parameter that will test stream URLs before adding them to Navidrome.
|
|
347
|
-
|
|
348
|
-
### 🎤 Lyrics & Timestamps
|
|
304
|
+
| `get_similar_artists` | Find artists similar to a given artist |
|
|
305
|
+
| `get_similar_tracks` | Find tracks similar to a given track |
|
|
306
|
+
| `get_artist_info` | Artist biography and tags |
|
|
307
|
+
| `get_top_tracks_by_artist` | Top tracks for an artist |
|
|
308
|
+
| `get_trending_music` | Trending artists, tracks, and tags from Last.fm charts |
|
|
309
|
+
|
|
310
|
+
### Lyrics (requires `LYRICS_PROVIDER=lrclib` + `LRCLIB_USER_AGENT`)
|
|
349
311
|
|
|
350
312
|
| Tool | Description |
|
|
351
313
|
|------|-------------|
|
|
352
|
-
| `get_lyrics` |
|
|
314
|
+
| `get_lyrics` | Time-synced (LRC) and plain-text lyrics, matched by title/artist/album/duration |
|
|
353
315
|
|
|
354
|
-
###
|
|
316
|
+
### Radio Management
|
|
355
317
|
|
|
356
318
|
| Tool | Description |
|
|
357
319
|
|------|-------------|
|
|
358
|
-
| `
|
|
359
|
-
| `
|
|
360
|
-
| `
|
|
320
|
+
| `list_radio_stations` | List all saved Navidrome radio stations |
|
|
321
|
+
| `get_radio_station` | Detailed info for a station by ID |
|
|
322
|
+
| `create_radio_station` | Create one or more stations (JSON array, optional `validateBeforeAdd`) |
|
|
323
|
+
| `delete_radio_station` | Delete a station |
|
|
324
|
+
| `validate_radio_stream` | Test an http(s) stream URL for accessibility and audio content |
|
|
361
325
|
|
|
362
|
-
|
|
326
|
+
### Global Radio Discovery (requires `RADIO_BROWSER_USER_AGENT`)
|
|
327
|
+
|
|
328
|
+
| Tool | Description |
|
|
329
|
+
|------|-------------|
|
|
330
|
+
| `discover_radio_stations` | Find stations globally via Radio Browser |
|
|
331
|
+
| `get_radio_filters` | Available filter values (tags, countries, languages, codecs) |
|
|
332
|
+
| `get_station_by_uuid` | Detailed Radio Browser station info |
|
|
333
|
+
| `click_station` | Register a play click for popularity metrics |
|
|
334
|
+
| `vote_station` | Vote for a station |
|
|
363
335
|
|
|
364
|
-
###
|
|
336
|
+
### Local Playback (requires [`mpv`](https://mpv.io/))
|
|
365
337
|
|
|
366
|
-
|
|
367
|
-
- Verify Navidrome server is running
|
|
368
|
-
- Check URL includes protocol (http:// or https://)
|
|
369
|
-
- Ensure credentials are correct
|
|
370
|
-
- Test with `curl` or browser first
|
|
338
|
+
Audio plays through the host's speakers. mpv is lazy-spawned on first use and survives MCP client restarts via a per-user IPC socket.
|
|
371
339
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
340
|
+
| Tool | Description |
|
|
341
|
+
|------|-------------|
|
|
342
|
+
| `play_songs` | Play one or many songs; `mode: 'replace' \| 'append'`, optional `shuffle` |
|
|
343
|
+
| `play_albums` | Play one or many albums; `mode` plus `shuffle: 'none' \| 'albums' \| 'songs'` (preserve, randomize album order, or fully interleave) |
|
|
344
|
+
| `play_albums_search` | One-shot filter-driven album playback; accepts all `search_albums` filters plus `mode`/`shuffle` |
|
|
345
|
+
| `play_songs_search` | One-shot filter-driven song playback; accepts all `search_songs` filters plus `mode`/`shuffle` |
|
|
346
|
+
| `play_playlist` | One-shot load every track of a Navidrome playlist into the queue by `playlistId`; supports `mode` and `shuffle` |
|
|
347
|
+
| `play_radio_station` | Play a saved Navidrome radio station; replaces the queue (mutually exclusive with songs/albums) |
|
|
348
|
+
| `pause` | Pause playback (position preserved) |
|
|
349
|
+
| `resume` | Resume playback |
|
|
350
|
+
| `next` | Skip to the next track |
|
|
351
|
+
| `previous` | Skip to the previous track |
|
|
352
|
+
| `seek` | Move within the current track (absolute or relative) |
|
|
353
|
+
| `set_volume` | Set mpv's internal volume (0-100) |
|
|
354
|
+
| `now_playing` | Current title/artist/album/position/duration and queue index (or station + ICY metadata for radio) |
|
|
355
|
+
| `playback_status` | Engine health probe (running, mpv version, idle) without spawning mpv |
|
|
356
|
+
| `get_play_queue` | Snapshot of the live queue with metadata and current-track index |
|
|
357
|
+
| `clear_play_queue` | Clear the queue and stop playback |
|
|
358
|
+
| `shuffle_play_queue` | Randomize queue order (membership unchanged) |
|
|
359
|
+
| `move_in_play_queue` | Move a queue entry between indices |
|
|
360
|
+
| `remove_from_play_queue` | Remove an entry; mpv auto-advances if the current track is removed |
|
|
361
|
+
| `play_queue_index` | Jump directly to the queue entry at the given index; does not reorder |
|
|
376
362
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
-
|
|
381
|
-
-
|
|
363
|
+
## Troubleshooting
|
|
364
|
+
|
|
365
|
+
**Connection problems**
|
|
366
|
+
- Verify Navidrome is running and reachable
|
|
367
|
+
- Ensure `NAVIDROME_URL` includes the protocol (`http://` or `https://`)
|
|
368
|
+
- Test credentials with `curl` or a browser first
|
|
382
369
|
|
|
383
|
-
|
|
370
|
+
**macOS-specific**
|
|
371
|
+
- See the [macOS Troubleshooting Guide](docs/MACOS_TROUBLESHOOTING.md) (commonly: Node.js path not found; fix with symlinks or full paths)
|
|
384
372
|
|
|
385
|
-
**
|
|
373
|
+
**Configuration**
|
|
374
|
+
- Use absolute paths in config files
|
|
375
|
+
- Validate JSON (no trailing commas)
|
|
376
|
+
- Restart your MCP client after changes
|
|
386
377
|
|
|
387
|
-
|
|
378
|
+
### Known Limitations
|
|
388
379
|
|
|
389
|
-
**
|
|
380
|
+
- **No audio without mpv.** When mpv isn't installed the library and saved-queue tools still work, but audio playback isn't available; use the Navidrome web UI or a Subsonic client.
|
|
381
|
+
- **Recently-played has no timestamps.** Navidrome exposes play counts and completion status, not last-played times.
|
|
382
|
+
- **Saved queue ≠ live queue.** The `*_saved_queue` tools operate on Navidrome's server-side advisory queue (web UI sync). The `*_play_queue` tools operate on the local mpv playlist. They are independent.
|
|
390
383
|
|
|
391
384
|
## Development
|
|
392
385
|
|
|
393
|
-
### Setup for Contributors
|
|
394
|
-
|
|
395
386
|
```bash
|
|
396
|
-
# Clone and setup
|
|
397
387
|
git clone https://github.com/Blakeem/Navidrome-MCP.git
|
|
398
|
-
cd
|
|
388
|
+
cd Navidrome-MCP
|
|
399
389
|
cp .env.example .env
|
|
400
390
|
# Edit .env with your credentials
|
|
401
391
|
|
|
402
|
-
#
|
|
403
|
-
pnpm
|
|
404
|
-
pnpm test
|
|
405
|
-
pnpm
|
|
406
|
-
pnpm
|
|
392
|
+
pnpm dev # hot reload
|
|
393
|
+
pnpm test # watch-mode tests
|
|
394
|
+
pnpm test:run # one-shot tests
|
|
395
|
+
pnpm check:all # lint + typecheck + dead-code
|
|
396
|
+
pnpm build # production bundle
|
|
407
397
|
```
|
|
408
398
|
|
|
409
|
-
|
|
399
|
+
Testing with [MCP Inspector](https://github.com/modelcontextprotocol/inspector):
|
|
410
400
|
|
|
411
401
|
```bash
|
|
412
|
-
# Build first
|
|
413
402
|
pnpm build
|
|
414
|
-
|
|
415
|
-
# Web UI testing
|
|
416
|
-
npx @modelcontextprotocol/inspector node dist/index.js
|
|
417
|
-
|
|
418
|
-
# CLI testing
|
|
403
|
+
npx @modelcontextprotocol/inspector node dist/index.js # web UI
|
|
419
404
|
npx @modelcontextprotocol/inspector --cli node dist/index.js \
|
|
420
|
-
--method tools/call
|
|
421
|
-
--tool-name search_all \
|
|
422
|
-
--tool-arg query="jazz"
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
### Project Structure
|
|
426
|
-
|
|
427
|
-
```
|
|
428
|
-
navidrome-mcp/
|
|
429
|
-
├── src/ # TypeScript source
|
|
430
|
-
├── dist/ # Compiled JavaScript
|
|
431
|
-
├── docs/ # Documentation
|
|
432
|
-
├── tests/ # Test suites
|
|
433
|
-
└── CLAUDE.md # AI assistant instructions
|
|
405
|
+
--method tools/call --tool-name search_all --tool-arg query="jazz" # CLI
|
|
434
406
|
```
|
|
435
407
|
|
|
436
408
|
## License
|
|
437
409
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
Source code is licensed under GNU Affero General Public License v3.0. See [LICENSE](LICENSE).
|
|
441
|
-
|
|
442
|
-
### Documentation: CC-BY-SA-4.0
|
|
443
|
-
|
|
444
|
-
Documentation is licensed under Creative Commons Attribution-ShareAlike 4.0 International.
|
|
410
|
+
- **Code:** [AGPL-3.0](LICENSE)
|
|
411
|
+
- **Documentation:** CC-BY-SA-4.0
|
|
445
412
|
|
|
446
413
|
## Support
|
|
447
414
|
|
|
448
|
-
-
|
|
449
|
-
-
|
|
415
|
+
- [GitHub Issues](https://github.com/Blakeem/Navidrome-MCP/issues)
|
|
416
|
+
- [GitHub Discussions](https://github.com/Blakeem/Navidrome-MCP/discussions)
|
|
450
417
|
|
|
451
418
|
---
|
|
452
419
|
|