navidrome-mcp 2.0.0 → 2.1.0

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.
Files changed (318) hide show
  1. package/README.md +161 -68
  2. package/assets/navidrome-player.icns +0 -0
  3. package/assets/navidrome-player.ico +0 -0
  4. package/assets/navidrome-player.png +0 -0
  5. package/dist/bootstrap.d.ts +43 -0
  6. package/dist/bootstrap.d.ts.map +1 -0
  7. package/dist/bootstrap.js +52 -0
  8. package/dist/bootstrap.js.map +1 -0
  9. package/dist/client/auth-manager.d.ts.map +1 -1
  10. package/dist/client/auth-manager.js +14 -3
  11. package/dist/client/auth-manager.js.map +1 -1
  12. package/dist/client/navidrome-client.d.ts.map +1 -1
  13. package/dist/client/navidrome-client.js +34 -5
  14. package/dist/client/navidrome-client.js.map +1 -1
  15. package/dist/config/map-config.d.ts +29 -0
  16. package/dist/config/map-config.d.ts.map +1 -0
  17. package/dist/config/map-config.js +97 -0
  18. package/dist/config/map-config.js.map +1 -0
  19. package/dist/config/schema.d.ts +65 -0
  20. package/dist/config/schema.d.ts.map +1 -0
  21. package/dist/config/schema.js +95 -0
  22. package/dist/config/schema.js.map +1 -0
  23. package/dist/config/seed.d.ts +58 -0
  24. package/dist/config/seed.d.ts.map +1 -0
  25. package/dist/config/seed.js +190 -0
  26. package/dist/config/seed.js.map +1 -0
  27. package/dist/config/store-path.d.ts +32 -0
  28. package/dist/config/store-path.d.ts.map +1 -0
  29. package/dist/config/store-path.js +57 -0
  30. package/dist/config/store-path.js.map +1 -0
  31. package/dist/config/store.d.ts +84 -0
  32. package/dist/config/store.d.ts.map +1 -0
  33. package/dist/config/store.js +141 -0
  34. package/dist/config/store.js.map +1 -0
  35. package/dist/config-app/degraded-tools.d.ts +27 -0
  36. package/dist/config-app/degraded-tools.d.ts.map +1 -0
  37. package/dist/config-app/degraded-tools.js +61 -0
  38. package/dist/config-app/degraded-tools.js.map +1 -0
  39. package/dist/config-app/main.d.ts +20 -0
  40. package/dist/config-app/main.d.ts.map +1 -0
  41. package/dist/config-app/main.js +38 -0
  42. package/dist/config-app/main.js.map +1 -0
  43. package/dist/config-app/public/app.js +224 -0
  44. package/dist/config-app/public/index.html +137 -0
  45. package/dist/config-app/public/styles.css +120 -0
  46. package/dist/config-app/routes.d.ts +28 -0
  47. package/dist/config-app/routes.d.ts.map +1 -0
  48. package/dist/config-app/routes.js +183 -0
  49. package/dist/config-app/routes.js.map +1 -0
  50. package/dist/config-app/server.d.ts +48 -0
  51. package/dist/config-app/server.d.ts.map +1 -0
  52. package/dist/config-app/server.js +155 -0
  53. package/dist/config-app/server.js.map +1 -0
  54. package/dist/config.d.ts +36 -35
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +47 -204
  57. package/dist/config.js.map +1 -1
  58. package/dist/constants/defaults.d.ts +20 -1
  59. package/dist/constants/defaults.d.ts.map +1 -1
  60. package/dist/constants/defaults.js +20 -1
  61. package/dist/constants/defaults.js.map +1 -1
  62. package/dist/constants/timeouts.d.ts +19 -4
  63. package/dist/constants/timeouts.d.ts.map +1 -1
  64. package/dist/constants/timeouts.js +19 -4
  65. package/dist/constants/timeouts.js.map +1 -1
  66. package/dist/index.js +103 -33
  67. package/dist/index.js.map +1 -1
  68. package/dist/resources/index.js +3 -3
  69. package/dist/resources/index.js.map +1 -1
  70. package/dist/schemas/common.d.ts +10 -7
  71. package/dist/schemas/common.d.ts.map +1 -1
  72. package/dist/schemas/common.js +35 -20
  73. package/dist/schemas/common.js.map +1 -1
  74. package/dist/schemas/pagination.d.ts +5 -0
  75. package/dist/schemas/pagination.d.ts.map +1 -1
  76. package/dist/schemas/pagination.js +22 -10
  77. package/dist/schemas/pagination.js.map +1 -1
  78. package/dist/schemas/validation.d.ts +15 -3
  79. package/dist/schemas/validation.d.ts.map +1 -1
  80. package/dist/schemas/validation.js +43 -12
  81. package/dist/schemas/validation.js.map +1 -1
  82. package/dist/services/filter-cache-manager.d.ts +2 -1
  83. package/dist/services/filter-cache-manager.d.ts.map +1 -1
  84. package/dist/services/filter-cache-manager.js +35 -25
  85. package/dist/services/filter-cache-manager.js.map +1 -1
  86. package/dist/services/library-manager.d.ts +1 -0
  87. package/dist/services/library-manager.d.ts.map +1 -1
  88. package/dist/services/library-manager.js +50 -29
  89. package/dist/services/library-manager.js.map +1 -1
  90. package/dist/services/playback/mpv-process.d.ts +11 -0
  91. package/dist/services/playback/mpv-process.d.ts.map +1 -1
  92. package/dist/services/playback/mpv-process.js +36 -2
  93. package/dist/services/playback/mpv-process.js.map +1 -1
  94. package/dist/services/playback/playback-engine.d.ts +59 -19
  95. package/dist/services/playback/playback-engine.d.ts.map +1 -1
  96. package/dist/services/playback/playback-engine.js +180 -36
  97. package/dist/services/playback/playback-engine.js.map +1 -1
  98. package/dist/services/playback/scrobble-tracker.d.ts +117 -0
  99. package/dist/services/playback/scrobble-tracker.d.ts.map +1 -0
  100. package/dist/services/playback/scrobble-tracker.js +360 -0
  101. package/dist/services/playback/scrobble-tracker.js.map +1 -0
  102. package/dist/tools/handlers/playback-handlers.d.ts.map +1 -1
  103. package/dist/tools/handlers/playback-handlers.js +54 -16
  104. package/dist/tools/handlers/playback-handlers.js.map +1 -1
  105. package/dist/tools/handlers/playlist-handlers.d.ts.map +1 -1
  106. package/dist/tools/handlers/playlist-handlers.js +20 -10
  107. package/dist/tools/handlers/playlist-handlers.js.map +1 -1
  108. package/dist/tools/handlers/queue-handlers.d.ts.map +1 -1
  109. package/dist/tools/handlers/queue-handlers.js +10 -0
  110. package/dist/tools/handlers/queue-handlers.js.map +1 -1
  111. package/dist/tools/handlers/radio-handlers.d.ts.map +1 -1
  112. package/dist/tools/handlers/radio-handlers.js +26 -9
  113. package/dist/tools/handlers/radio-handlers.js.map +1 -1
  114. package/dist/tools/handlers/registry.d.ts.map +1 -1
  115. package/dist/tools/handlers/registry.js +4 -5
  116. package/dist/tools/handlers/registry.js.map +1 -1
  117. package/dist/tools/handlers/search-handlers.d.ts.map +1 -1
  118. package/dist/tools/handlers/search-handlers.js +20 -0
  119. package/dist/tools/handlers/search-handlers.js.map +1 -1
  120. package/dist/tools/handlers/tag-handlers.js +1 -1
  121. package/dist/tools/handlers/tag-handlers.js.map +1 -1
  122. package/dist/tools/handlers/user-preferences-handlers.d.ts.map +1 -1
  123. package/dist/tools/handlers/user-preferences-handlers.js +14 -9
  124. package/dist/tools/handlers/user-preferences-handlers.js.map +1 -1
  125. package/dist/tools/lastfm-discovery.d.ts.map +1 -1
  126. package/dist/tools/lastfm-discovery.js +223 -158
  127. package/dist/tools/lastfm-discovery.js.map +1 -1
  128. package/dist/tools/library.d.ts.map +1 -1
  129. package/dist/tools/library.js +18 -21
  130. package/dist/tools/library.js.map +1 -1
  131. package/dist/tools/listening-history.d.ts.map +1 -1
  132. package/dist/tools/listening-history.js +112 -80
  133. package/dist/tools/listening-history.js.map +1 -1
  134. package/dist/tools/lyrics.d.ts.map +1 -1
  135. package/dist/tools/lyrics.js +35 -39
  136. package/dist/tools/lyrics.js.map +1 -1
  137. package/dist/tools/media-library.d.ts.map +1 -1
  138. package/dist/tools/media-library.js +14 -10
  139. package/dist/tools/media-library.js.map +1 -1
  140. package/dist/tools/playback.d.ts +38 -14
  141. package/dist/tools/playback.d.ts.map +1 -1
  142. package/dist/tools/playback.js +162 -21
  143. package/dist/tools/playback.js.map +1 -1
  144. package/dist/tools/playlist-management/playlist-crud.d.ts.map +1 -1
  145. package/dist/tools/playlist-management/playlist-crud.js +118 -24
  146. package/dist/tools/playlist-management/playlist-crud.js.map +1 -1
  147. package/dist/tools/playlist-management/playlist-export.d.ts.map +1 -1
  148. package/dist/tools/playlist-management/playlist-export.js +23 -10
  149. package/dist/tools/playlist-management/playlist-export.js.map +1 -1
  150. package/dist/tools/playlist-management/track-management.d.ts.map +1 -1
  151. package/dist/tools/playlist-management/track-management.js +24 -11
  152. package/dist/tools/playlist-management/track-management.js.map +1 -1
  153. package/dist/tools/queue-management.d.ts.map +1 -1
  154. package/dist/tools/queue-management.js +80 -64
  155. package/dist/tools/queue-management.js.map +1 -1
  156. package/dist/tools/radio-discovery.d.ts.map +1 -1
  157. package/dist/tools/radio-discovery.js +137 -68
  158. package/dist/tools/radio-discovery.js.map +1 -1
  159. package/dist/tools/radio-validation/index.d.ts +0 -6
  160. package/dist/tools/radio-validation/index.d.ts.map +1 -1
  161. package/dist/tools/radio-validation/index.js +6 -5
  162. package/dist/tools/radio-validation/index.js.map +1 -1
  163. package/dist/tools/radio-validation/network-validator.d.ts +2 -1
  164. package/dist/tools/radio-validation/network-validator.d.ts.map +1 -1
  165. package/dist/tools/radio-validation/network-validator.js +101 -75
  166. package/dist/tools/radio-validation/network-validator.js.map +1 -1
  167. package/dist/tools/radio-validation/recommendation-engine.d.ts.map +1 -1
  168. package/dist/tools/radio-validation/recommendation-engine.js +9 -6
  169. package/dist/tools/radio-validation/recommendation-engine.js.map +1 -1
  170. package/dist/tools/radio-validation/stream-detector.d.ts +2 -3
  171. package/dist/tools/radio-validation/stream-detector.d.ts.map +1 -1
  172. package/dist/tools/radio-validation/stream-detector.js +13 -7
  173. package/dist/tools/radio-validation/stream-detector.js.map +1 -1
  174. package/dist/tools/radio-validation/validation-core.d.ts.map +1 -1
  175. package/dist/tools/radio-validation/validation-core.js +46 -20
  176. package/dist/tools/radio-validation/validation-core.js.map +1 -1
  177. package/dist/tools/radio.d.ts.map +1 -1
  178. package/dist/tools/radio.js +199 -169
  179. package/dist/tools/radio.js.map +1 -1
  180. package/dist/tools/search/filter-resolver.d.ts +13 -0
  181. package/dist/tools/search/filter-resolver.d.ts.map +1 -1
  182. package/dist/tools/search/filter-resolver.js +65 -3
  183. package/dist/tools/search/filter-resolver.js.map +1 -1
  184. package/dist/tools/search/parallel-searcher.js +3 -3
  185. package/dist/tools/search/parallel-searcher.js.map +1 -1
  186. package/dist/tools/search/result-aggregator.d.ts +28 -3
  187. package/dist/tools/search/result-aggregator.d.ts.map +1 -1
  188. package/dist/tools/search/result-aggregator.js +44 -17
  189. package/dist/tools/search/result-aggregator.js.map +1 -1
  190. package/dist/tools/search/search-orchestrator.d.ts +2 -1
  191. package/dist/tools/search/search-orchestrator.d.ts.map +1 -1
  192. package/dist/tools/search/search-orchestrator.js +5 -5
  193. package/dist/tools/search/search-orchestrator.js.map +1 -1
  194. package/dist/tools/tags.d.ts.map +1 -1
  195. package/dist/tools/tags.js +38 -13
  196. package/dist/tools/tags.js.map +1 -1
  197. package/dist/tools/test.js +3 -3
  198. package/dist/tools/test.js.map +1 -1
  199. package/dist/tools/user-preferences.d.ts +24 -0
  200. package/dist/tools/user-preferences.d.ts.map +1 -1
  201. package/dist/tools/user-preferences.js +200 -126
  202. package/dist/tools/user-preferences.js.map +1 -1
  203. package/dist/transformers/album-transformer.d.ts +6 -2
  204. package/dist/transformers/album-transformer.d.ts.map +1 -1
  205. package/dist/transformers/album-transformer.js +44 -25
  206. package/dist/transformers/album-transformer.js.map +1 -1
  207. package/dist/transformers/artist-transformer.d.ts +6 -2
  208. package/dist/transformers/artist-transformer.d.ts.map +1 -1
  209. package/dist/transformers/artist-transformer.js +39 -20
  210. package/dist/transformers/artist-transformer.js.map +1 -1
  211. package/dist/transformers/playlist-transformer.d.ts.map +1 -1
  212. package/dist/transformers/playlist-transformer.js +12 -6
  213. package/dist/transformers/playlist-transformer.js.map +1 -1
  214. package/dist/transformers/shared-transformers.d.ts +27 -0
  215. package/dist/transformers/shared-transformers.d.ts.map +1 -1
  216. package/dist/transformers/shared-transformers.js +31 -7
  217. package/dist/transformers/shared-transformers.js.map +1 -1
  218. package/dist/transformers/song-transformer.d.ts +7 -2
  219. package/dist/transformers/song-transformer.d.ts.map +1 -1
  220. package/dist/transformers/song-transformer.js +55 -25
  221. package/dist/transformers/song-transformer.js.map +1 -1
  222. package/dist/types/core.d.ts +7 -2
  223. package/dist/types/core.d.ts.map +1 -1
  224. package/dist/types/playlists.d.ts +7 -5
  225. package/dist/types/playlists.d.ts.map +1 -1
  226. package/dist/types/tags.d.ts +4 -4
  227. package/dist/types/tags.d.ts.map +1 -1
  228. package/dist/utils/cache.d.ts.map +1 -1
  229. package/dist/utils/cache.js +1 -3
  230. package/dist/utils/cache.js.map +1 -1
  231. package/dist/utils/error-formatter.js +3 -3
  232. package/dist/utils/error-formatter.js.map +1 -1
  233. package/dist/utils/fetch-with-timeout.js +1 -1
  234. package/dist/utils/fetch-with-timeout.js.map +1 -1
  235. package/dist/utils/logger.d.ts +12 -0
  236. package/dist/utils/logger.d.ts.map +1 -1
  237. package/dist/utils/logger.js +24 -9
  238. package/dist/utils/logger.js.map +1 -1
  239. package/dist/utils/message-manager.js +2 -2
  240. package/dist/utils/message-manager.js.map +1 -1
  241. package/dist/utils/network-safety.d.ts.map +1 -1
  242. package/dist/utils/network-safety.js +12 -1
  243. package/dist/utils/network-safety.js.map +1 -1
  244. package/dist/utils/open-browser.d.ts +27 -0
  245. package/dist/utils/open-browser.d.ts.map +1 -0
  246. package/dist/utils/open-browser.js +54 -0
  247. package/dist/utils/open-browser.js.map +1 -0
  248. package/dist/utils/strip-html.js +1 -1
  249. package/dist/utils/strip-html.js.map +1 -1
  250. package/dist/utils/version.d.ts.map +1 -1
  251. package/dist/utils/version.js +10 -6
  252. package/dist/utils/version.js.map +1 -1
  253. package/dist/web/acquire.d.ts +69 -0
  254. package/dist/web/acquire.d.ts.map +1 -0
  255. package/dist/web/acquire.js +134 -0
  256. package/dist/web/acquire.js.map +1 -0
  257. package/dist/web/main.d.ts +20 -0
  258. package/dist/web/main.d.ts.map +1 -0
  259. package/dist/web/main.js +292 -0
  260. package/dist/web/main.js.map +1 -0
  261. package/dist/web/player-runtime.d.ts +48 -0
  262. package/dist/web/player-runtime.d.ts.map +1 -0
  263. package/dist/web/player-runtime.js +62 -0
  264. package/dist/web/player-runtime.js.map +1 -0
  265. package/dist/web/spawn.d.ts +82 -0
  266. package/dist/web/spawn.d.ts.map +1 -0
  267. package/dist/web/spawn.js +184 -0
  268. package/dist/web/spawn.js.map +1 -0
  269. package/dist/webui/broadcaster.d.ts.map +1 -1
  270. package/dist/webui/broadcaster.js +17 -3
  271. package/dist/webui/broadcaster.js.map +1 -1
  272. package/dist/webui/http-helpers.d.ts +7 -0
  273. package/dist/webui/http-helpers.d.ts.map +1 -1
  274. package/dist/webui/http-helpers.js +15 -0
  275. package/dist/webui/http-helpers.js.map +1 -1
  276. package/dist/webui/loopback.d.ts +27 -0
  277. package/dist/webui/loopback.d.ts.map +1 -0
  278. package/dist/webui/loopback.js +34 -0
  279. package/dist/webui/loopback.js.map +1 -0
  280. package/dist/webui/public/app.js +193 -2
  281. package/dist/webui/public/index.html +58 -0
  282. package/dist/webui/public/styles.css +92 -0
  283. package/dist/webui/routes/controls.d.ts +7 -0
  284. package/dist/webui/routes/controls.d.ts.map +1 -1
  285. package/dist/webui/routes/controls.js +11 -17
  286. package/dist/webui/routes/controls.js.map +1 -1
  287. package/dist/webui/routes/cover.d.ts.map +1 -1
  288. package/dist/webui/routes/cover.js +28 -1
  289. package/dist/webui/routes/cover.js.map +1 -1
  290. package/dist/webui/routes/health.d.ts +35 -0
  291. package/dist/webui/routes/health.d.ts.map +1 -0
  292. package/dist/webui/routes/health.js +42 -0
  293. package/dist/webui/routes/health.js.map +1 -0
  294. package/dist/webui/routes/player.d.ts +47 -0
  295. package/dist/webui/routes/player.d.ts.map +1 -0
  296. package/dist/webui/routes/player.js +127 -0
  297. package/dist/webui/routes/player.js.map +1 -0
  298. package/dist/webui/routes/playlists.d.ts +37 -0
  299. package/dist/webui/routes/playlists.d.ts.map +1 -0
  300. package/dist/webui/routes/playlists.js +56 -0
  301. package/dist/webui/routes/playlists.js.map +1 -0
  302. package/dist/webui/routes/snapshot.d.ts +1 -1
  303. package/dist/webui/routes/snapshot.d.ts.map +1 -1
  304. package/dist/webui/routes/snapshot.js +4 -2
  305. package/dist/webui/routes/snapshot.js.map +1 -1
  306. package/dist/webui/routes/static-files.d.ts.map +1 -1
  307. package/dist/webui/routes/static-files.js +6 -1
  308. package/dist/webui/routes/static-files.js.map +1 -1
  309. package/dist/webui/server.d.ts +5 -2
  310. package/dist/webui/server.d.ts.map +1 -1
  311. package/dist/webui/server.js +45 -5
  312. package/dist/webui/server.js.map +1 -1
  313. package/package.json +15 -6
  314. package/scripts/make-launcher.mjs +388 -0
  315. package/dist/webui/index.d.ts +0 -74
  316. package/dist/webui/index.d.ts.map +0 -1
  317. package/dist/webui/index.js +0 -165
  318. package/dist/webui/index.js.map +0 -1
@@ -176,6 +176,20 @@ export class NavidromeClient {
176
176
  if (endpoint.includes('..')) {
177
177
  throw new Error('Endpoint must not contain path-traversal segments');
178
178
  }
179
+ // URL-encoded traversal (`%2e%2e`) survives the literal check above but
180
+ // Node normalizes it back to `..` before the request leaves the process.
181
+ // Decode and re-check; a malformed escape sequence is itself suspect, so
182
+ // reject it rather than letting it through.
183
+ let decoded;
184
+ try {
185
+ decoded = decodeURIComponent(endpoint);
186
+ }
187
+ catch {
188
+ throw new Error('Endpoint contains a malformed percent-encoding sequence');
189
+ }
190
+ if (decoded.includes('..')) {
191
+ throw new Error('Endpoint must not contain path-traversal segments');
192
+ }
179
193
  if (/^https?:\/\//i.test(endpoint)) {
180
194
  throw new Error('Endpoint must be a path, not an absolute URL');
181
195
  }
@@ -186,7 +200,7 @@ export class NavidromeClient {
186
200
  'X-ND-Authorization': `Bearer ${token}`,
187
201
  };
188
202
  // Only set Content-Type for non-GET requests
189
- if (options.method !== null && options.method !== undefined && options.method !== 'GET') {
203
+ if (options.method !== undefined && options.method !== 'GET') {
190
204
  defaultHeaders['Content-Type'] = 'application/json';
191
205
  }
192
206
  // Only retry idempotent methods. POST/PUT/DELETE may have side effects
@@ -197,12 +211,20 @@ export class NavidromeClient {
197
211
  // to GET in fetch().
198
212
  const method = options.method ?? 'GET';
199
213
  const isIdempotent = method === 'GET' || method === 'HEAD';
214
+ // RequestInit.headers is HeadersInit, which can be a Headers instance, a
215
+ // [k, v][] tuple array, or a plain object. Object-spreading a Headers
216
+ // instance yields `{}` and silently drops the caller's headers, so merge
217
+ // via the Headers API to preserve every form. Caller headers win on
218
+ // collision (last write).
219
+ const merged = new Headers(defaultHeaders);
220
+ if (options.headers !== undefined) {
221
+ new Headers(options.headers).forEach((value, key) => {
222
+ merged.set(key, value);
223
+ });
224
+ }
200
225
  return fetchWithTimeout(`${this.baseUrl}/api${endpoint}`, {
201
226
  ...options,
202
- headers: {
203
- ...defaultHeaders,
204
- ...options.headers,
205
- },
227
+ headers: merged,
206
228
  }, {
207
229
  timeoutMs: getNavidromeRequestTimeoutMs(),
208
230
  retryPolicy: isIdempotent ? 'safe' : 'never',
@@ -232,6 +254,13 @@ export class NavidromeClient {
232
254
  // Body looked like JSON but didn't parse — fall through to text.
233
255
  }
234
256
  }
257
+ // KNOWN LATENT TRAP (left as-is per maintainer decision): this cast is only
258
+ // sound when `T` is `string` or `unknown` — i.e. callers that genuinely want
259
+ // the raw text/plain body (M3U export, etc.). A future typed caller such as
260
+ // `request<AlbumDTO[]>()` whose endpoint returns a non-JSON text/plain body
261
+ // would silently receive a raw string typed as `AlbumDTO[]`, with no parse
262
+ // error. No current caller hits that path; revisit if a typed JSON caller
263
+ // starts relying on the text/plain fallthrough.
235
264
  return text;
236
265
  }
237
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"navidrome-client.js","sourceRoot":"","sources":["../../src/client/navidrome-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navidrome-client.js","sourceRoot":"","sources":["../../src/client/navidrome-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Navidrome MCP Server - Settings store → flat Config projection
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import type { RawConfigInput } from './schema.js';
19
+ import type { SettingsFile } from './store.js';
20
+ /**
21
+ * Project the nested store into the flat `RawConfigInput` that `ConfigSchema`
22
+ * validates. The single place the nested→flat translation lives, shared by
23
+ * `loadConfig()` and the settings server's "test connection" route.
24
+ *
25
+ * Performs mpv detection (so `features.playback` and `mpvPath` are correct),
26
+ * which means it is not side-effect-free (it may shell out via `command -v`).
27
+ */
28
+ export declare function mapStoreToConfig(settings: SettingsFile): RawConfigInput;
29
+ //# sourceMappingURL=map-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-config.d.ts","sourceRoot":"","sources":["../../src/config/map-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAsEvE"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Navidrome MCP Server - Settings store → flat Config projection
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import { resolveMpvBinary } from '../services/playback/mpv-process.js';
19
+ import { DEFAULT_LRCLIB_BASE } from '../constants/defaults.js';
20
+ // Kept in its own module (separate from store.ts's file I/O) so that the
21
+ // read/write path does NOT transitively import the playback subsystem. Only the
22
+ // config-resolution path (which legitimately needs mpv detection) pulls it in.
23
+ /** Coerce null/undefined/blank strings to `undefined`; trim otherwise. */
24
+ function nonEmpty(value) {
25
+ if (value === null || value === undefined)
26
+ return undefined;
27
+ const trimmed = value.trim();
28
+ return trimmed === '' ? undefined : trimmed;
29
+ }
30
+ /**
31
+ * Project the nested store into the flat `RawConfigInput` that `ConfigSchema`
32
+ * validates. The single place the nested→flat translation lives, shared by
33
+ * `loadConfig()` and the settings server's "test connection" route.
34
+ *
35
+ * Performs mpv detection (so `features.playback` and `mpvPath` are correct),
36
+ * which means it is not side-effect-free (it may shell out via `command -v`).
37
+ */
38
+ export function mapStoreToConfig(settings) {
39
+ const nav = settings.navidrome ?? {};
40
+ const features = settings.features ?? {};
41
+ const playback = settings.playback ?? {};
42
+ const webui = settings.webui ?? {};
43
+ const advanced = settings.advanced ?? {};
44
+ const library = settings.library ?? {};
45
+ const lastFmApiKey = nonEmpty(features.lastFmApiKey);
46
+ const radioBrowserUserAgent = nonEmpty(features.radioBrowserUserAgent);
47
+ const lyricsProvider = nonEmpty(features.lyricsProvider);
48
+ const lrclibUserAgent = nonEmpty(features.lrclibUserAgent);
49
+ // mpv: explicit store path wins; null/empty → auto-detect. Drives the
50
+ // playback feature flag (and is omitted entirely when unresolved, matching
51
+ // the legacy behavior of only setting `mpvPath` when a binary exists).
52
+ const resolvedMpvPath = resolveMpvBinary(playback.mpvPath);
53
+ // defaultLibraryIds: an empty array means "all libraries" — same as unset.
54
+ const libIds = library.defaultLibraryIds;
55
+ const defaultLibraryIds = libIds !== undefined && libIds.length > 0 ? libIds : undefined;
56
+ // webui host: explicit host wins; otherwise `expose` flips the bind to
57
+ // 0.0.0.0 (replaces the legacy env-only buildWebUiConfig()).
58
+ const expose = webui.expose ?? false;
59
+ const explicitHost = nonEmpty(webui.host);
60
+ const host = explicitHost ?? (expose ? '0.0.0.0' : '127.0.0.1');
61
+ return {
62
+ navidromeUrl: nav.url ?? '',
63
+ navidromeUsername: nav.username ?? '',
64
+ navidromePassword: nav.password ?? '',
65
+ debug: advanced.debug ?? false,
66
+ cacheTtl: advanced.cacheTtl ?? 300,
67
+ tokenExpiry: advanced.tokenExpiry ?? 86400,
68
+ defaultLibraryIds,
69
+ features: {
70
+ lastfm: lastFmApiKey !== undefined,
71
+ radioBrowser: radioBrowserUserAgent !== undefined,
72
+ lyrics: lyricsProvider !== undefined && lrclibUserAgent !== undefined,
73
+ playback: resolvedMpvPath !== null,
74
+ },
75
+ lastFmApiKey,
76
+ radioBrowserUserAgent,
77
+ // Only an explicit, real URL pins the mirror; null/blank keeps SRV resolution.
78
+ radioBrowserBaseOverride: nonEmpty(features.radioBrowserBase),
79
+ lyricsProvider,
80
+ lrclibUserAgent,
81
+ // null/blank falls through to the canonical LRCLIB endpoint.
82
+ lrclibBase: nonEmpty(features.lrclibBase) ?? DEFAULT_LRCLIB_BASE,
83
+ ...(resolvedMpvPath !== null ? { mpvPath: resolvedMpvPath } : {}),
84
+ playbackTranscodeFormat: nonEmpty(playback.transcodeFormat) ?? 'raw',
85
+ playbackTranscodeBitrate: nonEmpty(playback.transcodeBitrate) ?? '192',
86
+ filterCacheEnabled: library.filterCacheEnabled ?? true,
87
+ webui: {
88
+ enabled: webui.enabled ?? true,
89
+ host,
90
+ port: webui.port ?? 8808,
91
+ expose,
92
+ autoOpenBrowser: webui.autoOpenBrowser ?? false,
93
+ persistAfterMcpExit: webui.persistAfterMcpExit ?? false,
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=map-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-config.js","sourceRoot":"","sources":["../../src/config/map-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Navidrome MCP Server - Configuration Schema
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import { z } from 'zod';
19
+ /**
20
+ * The canonical runtime configuration shape. This is a *flat* projection of the
21
+ * nested `settings.json` store (see `src/config/store.ts`), kept flat because
22
+ * `NavidromeClient`, the playback engine, the managers, and every tool category
23
+ * read fields like `config.navidromeUrl` / `config.features.*` directly.
24
+ *
25
+ * Extracted into its own module (rather than living in `src/config.ts`) so that
26
+ * `store.ts` can map the nested store into this shape without a circular import
27
+ * back through `config.ts`.
28
+ */
29
+ export declare const ConfigSchema: z.ZodObject<{
30
+ navidromeUrl: z.ZodString;
31
+ navidromeUsername: z.ZodString;
32
+ navidromePassword: z.ZodString;
33
+ debug: z.ZodDefault<z.ZodBoolean>;
34
+ cacheTtl: z.ZodDefault<z.ZodNumber>;
35
+ tokenExpiry: z.ZodDefault<z.ZodNumber>;
36
+ defaultLibraryIds: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
37
+ features: z.ZodObject<{
38
+ lastfm: z.ZodDefault<z.ZodBoolean>;
39
+ radioBrowser: z.ZodDefault<z.ZodBoolean>;
40
+ lyrics: z.ZodDefault<z.ZodBoolean>;
41
+ playback: z.ZodDefault<z.ZodBoolean>;
42
+ }, z.core.$strip>;
43
+ lastFmApiKey: z.ZodOptional<z.ZodString>;
44
+ radioBrowserUserAgent: z.ZodOptional<z.ZodString>;
45
+ radioBrowserBaseOverride: z.ZodOptional<z.ZodString>;
46
+ lyricsProvider: z.ZodOptional<z.ZodString>;
47
+ lrclibUserAgent: z.ZodOptional<z.ZodString>;
48
+ lrclibBase: z.ZodDefault<z.ZodString>;
49
+ mpvPath: z.ZodOptional<z.ZodString>;
50
+ playbackTranscodeFormat: z.ZodDefault<z.ZodString>;
51
+ playbackTranscodeBitrate: z.ZodDefault<z.ZodString>;
52
+ filterCacheEnabled: z.ZodDefault<z.ZodBoolean>;
53
+ webui: z.ZodObject<{
54
+ enabled: z.ZodDefault<z.ZodBoolean>;
55
+ host: z.ZodDefault<z.ZodString>;
56
+ port: z.ZodDefault<z.ZodNumber>;
57
+ expose: z.ZodDefault<z.ZodBoolean>;
58
+ autoOpenBrowser: z.ZodDefault<z.ZodBoolean>;
59
+ persistAfterMcpExit: z.ZodDefault<z.ZodBoolean>;
60
+ }, z.core.$strip>;
61
+ }, z.core.$strip>;
62
+ export type Config = z.infer<typeof ConfigSchema>;
63
+ /** The pre-validation input shape (fields with defaults are optional). */
64
+ export type RawConfigInput = z.input<typeof ConfigSchema>;
65
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuEvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Navidrome MCP Server - Configuration Schema
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import { z } from 'zod';
19
+ import { DEFAULT_LRCLIB_BASE } from '../constants/defaults.js';
20
+ /**
21
+ * The canonical runtime configuration shape. This is a *flat* projection of the
22
+ * nested `settings.json` store (see `src/config/store.ts`), kept flat because
23
+ * `NavidromeClient`, the playback engine, the managers, and every tool category
24
+ * read fields like `config.navidromeUrl` / `config.features.*` directly.
25
+ *
26
+ * Extracted into its own module (rather than living in `src/config.ts`) so that
27
+ * `store.ts` can map the nested store into this shape without a circular import
28
+ * back through `config.ts`.
29
+ */
30
+ export const ConfigSchema = z.object({
31
+ navidromeUrl: z.string().url('NAVIDROME_URL must be a valid URL'),
32
+ navidromeUsername: z.string().min(1, 'NAVIDROME_USERNAME is required'),
33
+ navidromePassword: z.string().min(1, 'NAVIDROME_PASSWORD is required'),
34
+ debug: z.boolean().default(false),
35
+ cacheTtl: z.number().positive().default(300),
36
+ tokenExpiry: z.number().positive().default(86400), // Default 24 hours in seconds
37
+ // Library Configuration
38
+ defaultLibraryIds: z.array(z.number()).optional(),
39
+ // Feature Configuration
40
+ features: z.object({
41
+ lastfm: z.boolean().default(false),
42
+ radioBrowser: z.boolean().default(false),
43
+ lyrics: z.boolean().default(false),
44
+ playback: z.boolean().default(false),
45
+ }),
46
+ // API Keys and External Service Configuration
47
+ lastFmApiKey: z.string().optional(),
48
+ radioBrowserUserAgent: z.string().optional(),
49
+ // Set only when the user explicitly provides a Radio Browser base in the
50
+ // store — bypasses SRV resolution and pins to the chosen mirror. Production
51
+ // base resolution otherwise flows through `getRadioBrowserBase()` which does
52
+ // SRV-record lookup + caching, with a hardcoded fallback in
53
+ // `RADIO_BROWSER_FALLBACK_BASE`.
54
+ radioBrowserBaseOverride: z.string().url().optional(),
55
+ // Lyrics Configuration
56
+ lyricsProvider: z.string().optional(),
57
+ lrclibUserAgent: z.string().optional(),
58
+ lrclibBase: z.string().url().default(DEFAULT_LRCLIB_BASE),
59
+ // Playback (mpv) Configuration
60
+ mpvPath: z.string().optional(),
61
+ // 'raw' (default) streams the original file untouched: highest quality and
62
+ // fully seekable. Set a codec (e.g. 'mp3', 'opus') to transcode for limited
63
+ // bandwidth — `playbackTranscodeBitrate` then applies.
64
+ playbackTranscodeFormat: z.string().default('raw'),
65
+ playbackTranscodeBitrate: z.string().default('192'),
66
+ // Filter cache — when false, re-fetches tag/genre lists on every filter resolution
67
+ // instead of using the startup snapshot. Set to false if you curate your library
68
+ // mid-session and need newly-added genres/labels/moods to be immediately visible.
69
+ filterCacheEnabled: z.boolean().default(true),
70
+ // Web UI Configuration — companion HTTP control panel for mpv playback.
71
+ // The web UI is implicitly gated by the playback feature: it only ever
72
+ // initializes when mpv is detected. Even when `enabled` is true, the
73
+ // server does not bind a port until something has been queued.
74
+ // `host=127.0.0.1` keeps the panel on localhost only. Setting `expose=true`
75
+ // forces the bind to `0.0.0.0` so a phone on the same LAN can reach it;
76
+ // explicit `host` overrides this.
77
+ webui: z.object({
78
+ enabled: z.boolean().default(true),
79
+ host: z.string().default('127.0.0.1'),
80
+ port: z.number().int().min(1).max(65535).default(8808),
81
+ expose: z.boolean().default(false),
82
+ // When true, the player opens in the user's browser automatically when the
83
+ // MCP server starts (the standalone `navidrome-web` bin always opens, since
84
+ // the user ran it explicitly). Default false to avoid popping a tab on every
85
+ // headless Claude Desktop launch.
86
+ autoOpenBrowser: z.boolean().default(false),
87
+ // When true, a player spawned by the MCP server keeps running (and mpv keeps
88
+ // playing) after the MCP server closes/restarts. Default false: the spawned
89
+ // player and mpv stop with the MCP server, so nothing lingers. A player you
90
+ // launch yourself (`navidrome-web`) always persists regardless. Can be
91
+ // toggled live in the player's loopback-only settings modal.
92
+ persistAfterMcpExit: z.boolean().default(false),
93
+ }),
94
+ });
95
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Navidrome MCP Server - Settings form seed (pre-fill source)
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import { type SettingsFile } from './store.js';
19
+ /**
20
+ * Recommended values for the optional radio/lyrics fields that gate a feature
21
+ * on. Single source for two behaviours, keyed by the form's dotted field path
22
+ * (see `app.js` FIELDS):
23
+ *
24
+ * - First run (no settings.json): `importFromLegacyEnv` pre-fills these into
25
+ * the seed, so a fresh install gets working radio + lyrics without the user
26
+ * hunting for what to type.
27
+ * - Later runs (settings.json exists): the file is returned verbatim, and the
28
+ * form surfaces these as non-intrusive "suggested" hints *beside* any field
29
+ * the user left blank — never auto-filling, so a deliberate blank (e.g.
30
+ * radio turned off) is preserved.
31
+ *
32
+ * `features.radioBrowserBase` is intentionally absent: blank there means
33
+ * SRV-based auto mirror selection, which is more robust than pinning a mirror.
34
+ */
35
+ export declare const FORM_SUGGESTIONS: {
36
+ readonly 'features.radioBrowserUserAgent': "Navidrome-MCP";
37
+ readonly 'features.lyricsProvider': "lrclib";
38
+ readonly 'features.lrclibUserAgent': "Navidrome-MCP";
39
+ readonly 'features.lrclibBase': "https://lrclib.net";
40
+ };
41
+ /**
42
+ * Compute the seed used to pre-fill the settings form.
43
+ *
44
+ * - If a `settings.json` already exists, it IS the seed (pre-fill from the file
45
+ * so the user edits what they have).
46
+ * - Otherwise, import a partial config from legacy sources so existing users
47
+ * only have to verify + submit rather than re-type: `process.env` (covers the
48
+ * MCP-client JSON env and the shell) merged with a legacy project-root `.env`
49
+ * (covers dev installs). Optional radio/lyrics fields that gate a feature on
50
+ * are pre-filled with working defaults (see `importFromLegacyEnv`) so a
51
+ * fresh install gets functional features without hunting for values.
52
+ *
53
+ * This is import-only and never on the normal runtime path — `loadConfig()`
54
+ * reads `settings.json` exclusively. Returns REAL values (including secrets);
55
+ * masking for display happens at the HTTP layer.
56
+ */
57
+ export declare function buildFormSeed(): SettingsFile;
58
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/config/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AAEX;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,IAAI,YAAY,CAM5C"}