navidrome-mcp 1.0.2 → 1.0.4
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 +9 -0
- package/dist/client/auth-manager.d.ts +1 -1
- package/dist/client/auth-manager.d.ts.map +1 -1
- package/dist/client/auth-manager.js +2 -2
- package/dist/client/auth-manager.js.map +1 -1
- package/dist/client/navidrome-client.d.ts +3 -3
- package/dist/client/navidrome-client.d.ts.map +1 -1
- package/dist/client/navidrome-client.js +2 -2
- package/dist/client/navidrome-client.js.map +1 -1
- package/dist/config.js +12 -12
- package/dist/config.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/resources/index.js +1 -1
- package/dist/resources/index.js.map +1 -1
- package/dist/schemas/common.js +3 -3
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/pagination.js +1 -1
- package/dist/schemas/pagination.js.map +1 -1
- package/dist/tools/handlers/registry.d.ts +2 -2
- package/dist/tools/handlers/registry.d.ts.map +1 -1
- package/dist/tools/handlers/registry.js.map +1 -1
- package/dist/tools/lastfm-discovery.js +51 -51
- package/dist/tools/lastfm-discovery.js.map +1 -1
- package/dist/tools/listening-history.js +7 -7
- package/dist/tools/listening-history.js.map +1 -1
- package/dist/tools/lyrics.d.ts.map +1 -1
- package/dist/tools/lyrics.js +28 -27
- package/dist/tools/lyrics.js.map +1 -1
- package/dist/tools/media-library.js +5 -5
- package/dist/tools/playlist-management.js +14 -14
- package/dist/tools/playlist-management.js.map +1 -1
- package/dist/tools/queue-management.js +10 -10
- package/dist/tools/queue-management.js.map +1 -1
- package/dist/tools/radio-discovery.js +28 -28
- package/dist/tools/radio-discovery.js.map +1 -1
- package/dist/tools/radio-validation.js +16 -16
- package/dist/tools/radio-validation.js.map +1 -1
- package/dist/tools/radio.js +13 -13
- package/dist/tools/radio.js.map +1 -1
- package/dist/tools/search.js +10 -10
- package/dist/tools/tags.js +7 -7
- package/dist/tools/tags.js.map +1 -1
- package/dist/tools/user-preferences.js +25 -25
- package/dist/tools/user-preferences.js.map +1 -1
- package/dist/transformers/song-transformer.js +6 -6
- package/dist/transformers/song-transformer.js.map +1 -1
- package/dist/utils/cache.d.ts +3 -3
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +1 -1
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/error-formatter.js +6 -6
- package/dist/utils/error-formatter.js.map +1 -1
- package/dist/utils/message-manager.d.ts +2 -2
- package/dist/utils/message-manager.d.ts.map +1 -1
- package/dist/utils/message-manager.js +4 -6
- package/dist/utils/message-manager.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -278,6 +278,7 @@ Add the Navidrome MCP server:
|
|
|
278
278
|
| `get_song` | Detailed song information |
|
|
279
279
|
| `get_album` | Detailed album information |
|
|
280
280
|
| `get_artist` | Detailed artist information |
|
|
281
|
+
| `get_song_playlists` | Get all playlists that contain a specific song |
|
|
281
282
|
|
|
282
283
|
### 🔍 Search & Discovery
|
|
283
284
|
|
|
@@ -290,6 +291,7 @@ Add the Navidrome MCP server:
|
|
|
290
291
|
| `get_similar_artists` | Find similar artists (Last.fm) |
|
|
291
292
|
| `get_similar_tracks` | Find similar tracks (Last.fm) |
|
|
292
293
|
| `get_artist_info` | Artist biography and tags |
|
|
294
|
+
| `get_top_tracks_by_artist` | Get top tracks for an artist from Last.fm |
|
|
293
295
|
| `get_trending_music` | Global music trends |
|
|
294
296
|
|
|
295
297
|
### 🎵 Playlist Operations
|
|
@@ -297,6 +299,7 @@ Add the Navidrome MCP server:
|
|
|
297
299
|
| Tool | Description |
|
|
298
300
|
|------|-------------|
|
|
299
301
|
| `list_playlists` | View all playlists |
|
|
302
|
+
| `get_playlist` | Get detailed information about a specific playlist by ID |
|
|
300
303
|
| `create_playlist` | Create new playlist |
|
|
301
304
|
| `update_playlist` | Update playlist metadata |
|
|
302
305
|
| `delete_playlist` | Remove playlist |
|
|
@@ -324,6 +327,7 @@ Add the Navidrome MCP server:
|
|
|
324
327
|
| `list_most_played` | Find most played content |
|
|
325
328
|
| `get_queue` | View playback queue |
|
|
326
329
|
| `set_queue` | Set playback queue |
|
|
330
|
+
| `clear_queue` | Clear the playback queue |
|
|
327
331
|
|
|
328
332
|
### 📻 Radio Management
|
|
329
333
|
|
|
@@ -331,9 +335,12 @@ Add the Navidrome MCP server:
|
|
|
331
335
|
|------|-------------|
|
|
332
336
|
| `validate_radio_stream` | Test stream URL validity |
|
|
333
337
|
| `list_radio_stations` | View all stations |
|
|
338
|
+
| `get_radio_station` | Get detailed information about a specific radio station by ID |
|
|
334
339
|
| `create_radio_station` | Add new station (with optional validation*) |
|
|
340
|
+
| `delete_radio_station` | Delete an internet radio station by ID |
|
|
335
341
|
| `batch_create_radio_stations` | Batch add multiple stations (with optional validation*) |
|
|
336
342
|
| `play_radio_station` | Start radio playback |
|
|
343
|
+
| `get_current_radio_info` | Get information about currently playing radio station and stream metadata |
|
|
337
344
|
| `discover_radio_stations` | Find internet radio stations globally |
|
|
338
345
|
| `get_radio_filters` | Get available search filters (genres, countries, etc.) |
|
|
339
346
|
| `get_station_by_uuid` | Get detailed station information |
|
|
@@ -353,8 +360,10 @@ Add the Navidrome MCP server:
|
|
|
353
360
|
| Tool | Description |
|
|
354
361
|
|------|-------------|
|
|
355
362
|
| `list_tags` | Browse all metadata tags |
|
|
363
|
+
| `get_tag` | Get detailed information about a specific tag by ID |
|
|
356
364
|
| `search_by_tags` | Search by specific tags |
|
|
357
365
|
| `get_tag_distribution` | Analyze tag usage |
|
|
366
|
+
| `list_unique_tags` | List all unique tag names with statistics (how many unique values, total usage) |
|
|
358
367
|
|
|
359
368
|
## Troubleshooting
|
|
360
369
|
|
|
@@ -19,7 +19,7 @@ import type { Config } from '../config.js';
|
|
|
19
19
|
export declare class AuthManager {
|
|
20
20
|
private token;
|
|
21
21
|
private tokenExpiry;
|
|
22
|
-
private config;
|
|
22
|
+
private readonly config;
|
|
23
23
|
constructor(config: Config);
|
|
24
24
|
authenticate(): Promise<void>;
|
|
25
25
|
getToken(): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/client/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/client/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAIpB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB7B,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;CAWlC"}
|
|
@@ -42,10 +42,10 @@ export class AuthManager {
|
|
|
42
42
|
logger.debug('Authentication successful');
|
|
43
43
|
}
|
|
44
44
|
async getToken() {
|
|
45
|
-
if (
|
|
45
|
+
if (this.token === null || this.token === undefined || this.token === '' || this.tokenExpiry === null || this.tokenExpiry === undefined || this.tokenExpiry <= new Date()) {
|
|
46
46
|
await this.authenticate();
|
|
47
47
|
}
|
|
48
|
-
if (
|
|
48
|
+
if (this.token === null || this.token === undefined || this.token === '') {
|
|
49
49
|
throw new Error(ErrorFormatter.authentication('token not available after authentication'));
|
|
50
50
|
}
|
|
51
51
|
return this.token;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/client/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,OAAO,WAAW;IACd,KAAK,GAAkB,IAAI,CAAC;IAC5B,WAAW,GAAgB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/client/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,OAAO,WAAW;IACd,KAAK,GAAkB,IAAI,CAAC;IAC5B,WAAW,GAAgB,IAAI,CAAC;IACvB,MAAM,CAAS;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,aAAa,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;gBACvC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;aACxC,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,kCAAkC;QAC5G,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YAC1K,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import type { Config } from '../config.js';
|
|
19
19
|
export declare class NavidromeClient {
|
|
20
|
-
private authManager;
|
|
21
|
-
private baseUrl;
|
|
22
|
-
private config;
|
|
20
|
+
private readonly authManager;
|
|
21
|
+
private readonly baseUrl;
|
|
22
|
+
private readonly config;
|
|
23
23
|
constructor(config: Config);
|
|
24
24
|
initialize(): Promise<void>;
|
|
25
25
|
request<T>(endpoint: string, options?: RequestInit): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navidrome-client.d.ts","sourceRoot":"","sources":["../../src/client/navidrome-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAK3C,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;
|
|
1
|
+
{"version":3,"file":"navidrome-client.d.ts","sourceRoot":"","sources":["../../src/client/navidrome-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAK3C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAMpB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IAkCnE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAyB/F"}
|
|
@@ -37,7 +37,7 @@ export class NavidromeClient {
|
|
|
37
37
|
'X-ND-Authorization': `Bearer ${token}`,
|
|
38
38
|
};
|
|
39
39
|
// Only set Content-Type for non-GET requests
|
|
40
|
-
if (options.method && options.method !== 'GET') {
|
|
40
|
+
if (options.method !== null && options.method !== undefined && options.method !== 'GET') {
|
|
41
41
|
defaultHeaders['Content-Type'] = 'application/json';
|
|
42
42
|
}
|
|
43
43
|
const response = await fetch(`${this.baseUrl}/api${endpoint}`, {
|
|
@@ -53,7 +53,7 @@ export class NavidromeClient {
|
|
|
53
53
|
}
|
|
54
54
|
// Handle different content types
|
|
55
55
|
const contentType = response.headers.get('content-type');
|
|
56
|
-
if (contentType
|
|
56
|
+
if (contentType?.includes('application/json') === true) {
|
|
57
57
|
return response.json();
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navidrome-client.js","sourceRoot":"","sources":["../../src/client/navidrome-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"navidrome-client.js","sourceRoot":"","sources":["../../src/client/navidrome-client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -66,7 +66,7 @@ const ConfigSchema = z.object({
|
|
|
66
66
|
export async function loadConfig() {
|
|
67
67
|
// Try to safely load .env file only in development mode
|
|
68
68
|
// MCP servers get their environment from the host application
|
|
69
|
-
if (
|
|
69
|
+
if (process.env['NAVIDROME_URL'] === null || process.env['NAVIDROME_URL'] === undefined || process.env['NAVIDROME_URL'] === '') {
|
|
70
70
|
// Only attempt to load .env if we're missing required environment variables
|
|
71
71
|
// This suggests we're in development mode
|
|
72
72
|
try {
|
|
@@ -92,31 +92,31 @@ export async function loadConfig() {
|
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
// Centralized environment variable access
|
|
95
|
-
const lastFmApiKey = process.env['LASTFM_API_KEY']
|
|
96
|
-
const radioBrowserUserAgent = process.env['RADIO_BROWSER_USER_AGENT']
|
|
97
|
-
const lyricsProvider = process.env['LYRICS_PROVIDER']
|
|
98
|
-
const lrclibUserAgent = process.env['LRCLIB_USER_AGENT']
|
|
95
|
+
const lastFmApiKey = process.env['LASTFM_API_KEY'] ?? undefined;
|
|
96
|
+
const radioBrowserUserAgent = process.env['RADIO_BROWSER_USER_AGENT'] ?? undefined;
|
|
97
|
+
const lyricsProvider = process.env['LYRICS_PROVIDER'] ?? undefined;
|
|
98
|
+
const lrclibUserAgent = process.env['LRCLIB_USER_AGENT'] ?? undefined;
|
|
99
99
|
const rawConfig = {
|
|
100
100
|
navidromeUrl: process.env['NAVIDROME_URL'],
|
|
101
101
|
navidromeUsername: process.env['NAVIDROME_USERNAME'],
|
|
102
102
|
navidromePassword: process.env['NAVIDROME_PASSWORD'],
|
|
103
103
|
debug: process.env['DEBUG'] === 'true',
|
|
104
|
-
cacheTtl: process.env['CACHE_TTL'] ? parseInt(process.env['CACHE_TTL'], 10) : 300,
|
|
105
|
-
tokenExpiry: process.env['TOKEN_EXPIRY'] ? parseInt(process.env['TOKEN_EXPIRY'], 10) : 86400,
|
|
104
|
+
cacheTtl: (process.env['CACHE_TTL'] !== null && process.env['CACHE_TTL'] !== undefined && process.env['CACHE_TTL'] !== '') ? parseInt(process.env['CACHE_TTL'], 10) : 300,
|
|
105
|
+
tokenExpiry: (process.env['TOKEN_EXPIRY'] !== null && process.env['TOKEN_EXPIRY'] !== undefined && process.env['TOKEN_EXPIRY'] !== '') ? parseInt(process.env['TOKEN_EXPIRY'], 10) : 86400,
|
|
106
106
|
// Feature detection based on available configuration
|
|
107
107
|
features: {
|
|
108
|
-
lastfm:
|
|
109
|
-
radioBrowser:
|
|
110
|
-
lyrics:
|
|
108
|
+
lastfm: (lastFmApiKey !== null && lastFmApiKey !== undefined && lastFmApiKey.trim() !== ''),
|
|
109
|
+
radioBrowser: (radioBrowserUserAgent !== null && radioBrowserUserAgent !== undefined && radioBrowserUserAgent.trim() !== ''),
|
|
110
|
+
lyrics: (lyricsProvider !== null && lyricsProvider !== undefined && lyricsProvider.trim() !== '') && (lrclibUserAgent !== null && lrclibUserAgent !== undefined && lrclibUserAgent.trim() !== ''),
|
|
111
111
|
},
|
|
112
112
|
// API Keys and External Service Configuration
|
|
113
113
|
lastFmApiKey,
|
|
114
114
|
radioBrowserUserAgent,
|
|
115
|
-
radioBrowserBase: process.env['RADIO_BROWSER_BASE']
|
|
115
|
+
radioBrowserBase: process.env['RADIO_BROWSER_BASE'] ?? 'https://de1.api.radio-browser.info',
|
|
116
116
|
// Lyrics Configuration
|
|
117
117
|
lyricsProvider,
|
|
118
118
|
lrclibUserAgent,
|
|
119
|
-
lrclibBase: process.env['LRCLIB_BASE']
|
|
119
|
+
lrclibBase: process.env['LRCLIB_BASE'] ?? 'https://lrclib.net',
|
|
120
120
|
};
|
|
121
121
|
try {
|
|
122
122
|
return ConfigSchema.parse(rawConfig);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -34,9 +34,9 @@ async function main() {
|
|
|
34
34
|
logger.debug('Node version:', process.version);
|
|
35
35
|
logger.debug('Platform:', process.platform);
|
|
36
36
|
logger.debug('Environment variables present:', {
|
|
37
|
-
NAVIDROME_URL:
|
|
38
|
-
NAVIDROME_USERNAME:
|
|
39
|
-
NAVIDROME_PASSWORD:
|
|
37
|
+
NAVIDROME_URL: (process.env['NAVIDROME_URL'] !== null && process.env['NAVIDROME_URL'] !== undefined && process.env['NAVIDROME_URL'] !== ''),
|
|
38
|
+
NAVIDROME_USERNAME: (process.env['NAVIDROME_USERNAME'] !== null && process.env['NAVIDROME_USERNAME'] !== undefined && process.env['NAVIDROME_USERNAME'] !== ''),
|
|
39
|
+
NAVIDROME_PASSWORD: (process.env['NAVIDROME_PASSWORD'] !== null && process.env['NAVIDROME_PASSWORD'] !== undefined && process.env['NAVIDROME_PASSWORD'] !== ''),
|
|
40
40
|
});
|
|
41
41
|
const server = new Server({
|
|
42
42
|
name: 'navidrome-mcp',
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9B,8CAA8C;QAC9C,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;YAC7C,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9B,8CAA8C;QAC9C,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;YAC7C,aAAa,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC3I,kBAAkB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;YAC/J,kBAAkB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;SAChK,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;YACE,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,iBAAiB,EAAE;SAC7B,EACD;YACE,YAAY,EAAE,gBAAgB;SAC/B,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAE1B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mDAAmD;QACnD,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,KAAK,CAAC,CAAC,yCAAyC;IACxD,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/resources/index.js
CHANGED
|
@@ -77,7 +77,7 @@ export function registerResources(server, client) {
|
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
-
throw new Error(ErrorFormatter.unknownResource(baseUri
|
|
80
|
+
throw new Error(ErrorFormatter.unknownResource(baseUri !== null && baseUri !== undefined && baseUri !== '' ? baseUri : uri));
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAE1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAuB;IACvE,6BAA6B;IAC7B,MAAM,SAAS,GAAe;QAC5B;YACE,GAAG,EAAE,2BAA2B;YAChC,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,kBAAkB;SAC7B;KACF,CAAC;IAEF,kCAAkC;IAClC,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,SAAS;KACV,CAAC,CAAC,CAAC;IAEJ,iCAAiC;IACjC,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE/B,uCAAuC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAGlC,IAAI,OAAO,KAAK,2BAA2B,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,0EAA0E;gBAC1E,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;oBACtC,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,GAAG,EAAE,uCAAuC;iBACnD,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxD,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,GAAG;4BACH,QAAQ,EAAE,kBAAkB;4BAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,MAAM,EAAE,WAAW;gCACnB,MAAM,EAAE,WAAW;gCACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACnC,OAAO,EAAE,4CAA4C;6BACtD,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,GAAG;4BACH,QAAQ,EAAE,kBAAkB;4BAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,MAAM,EAAE,OAAO;gCACf,MAAM,EAAE,WAAW;gCACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACnC,KAAK,EAAE,uCAAuC;gCAC9C,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;6BAClE,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAE1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAuB;IACvE,6BAA6B;IAC7B,MAAM,SAAS,GAAe;QAC5B;YACE,GAAG,EAAE,2BAA2B;YAChC,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,kBAAkB;SAC7B;KACF,CAAC;IAEF,kCAAkC;IAClC,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,SAAS;KACV,CAAC,CAAC,CAAC;IAEJ,iCAAiC;IACjC,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE/B,uCAAuC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAGlC,IAAI,OAAO,KAAK,2BAA2B,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,0EAA0E;gBAC1E,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;oBACtC,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,GAAG,EAAE,uCAAuC;iBACnD,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxD,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,GAAG;4BACH,QAAQ,EAAE,kBAAkB;4BAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,MAAM,EAAE,WAAW;gCACnB,MAAM,EAAE,WAAW;gCACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACnC,OAAO,EAAE,4CAA4C;6BACtD,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,GAAG;4BACH,QAAQ,EAAE,kBAAkB;4BAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,MAAM,EAAE,OAAO;gCACf,MAAM,EAAE,WAAW;gCACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACnC,KAAK,EAAE,uCAAuC;gCAC9C,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;6BAClE,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/H,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/schemas/common.js
CHANGED
|
@@ -21,7 +21,7 @@ export const IdSchema = z.object({
|
|
|
21
21
|
id: z.string().min(1, 'ID is required'),
|
|
22
22
|
});
|
|
23
23
|
// Required ID with custom message
|
|
24
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type,@typescript-eslint/explicit-module-boundary-types
|
|
25
25
|
export const createIdSchema = (resourceType) => z.object({
|
|
26
26
|
id: z.string().min(1, `${resourceType} ID is required`),
|
|
27
27
|
});
|
|
@@ -33,7 +33,7 @@ export const SearchQuerySchema = z.object({
|
|
|
33
33
|
export const ItemTypeSchema = z.enum(['song', 'album', 'artist']);
|
|
34
34
|
export const ItemListTypeSchema = z.enum(['songs', 'albums', 'artists']);
|
|
35
35
|
// Common limit validation patterns
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type,@typescript-eslint/explicit-module-boundary-types
|
|
37
37
|
export const createLimitSchema = (min = 1, max = 500, defaultValue) => {
|
|
38
38
|
if (defaultValue !== undefined) {
|
|
39
39
|
return z.number().min(min).max(max).optional().default(defaultValue);
|
|
@@ -52,7 +52,7 @@ export const RequiredBooleanSchema = z.boolean();
|
|
|
52
52
|
// Rating validation
|
|
53
53
|
export const RatingSchema = z.number().min(0).max(5);
|
|
54
54
|
// Duration validation for timeouts
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type,@typescript-eslint/explicit-module-boundary-types
|
|
56
56
|
export const createTimeoutSchema = (min, max, defaultValue) => z.number().min(min).max(max).optional().default(defaultValue);
|
|
57
57
|
// URL validation
|
|
58
58
|
export const UrlSchema = z.string().url('URL must be a valid URL');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6BAA6B;AAC7B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC;CACxC,CAAC,CAAC;AAEH,kCAAkC;AAClC,
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ import { DEFAULT_VALUES } from '../constants/defaults.js';
|
|
|
20
20
|
import { createLimitSchema, OffsetSchema, OrderSchema } from './common.js';
|
|
21
21
|
// Base pagination schema factory
|
|
22
22
|
export const createPaginationSchema = (limitDefault, maxLimit = 500, sortDefault = 'name'
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type,@typescript-eslint/explicit-module-boundary-types
|
|
24
24
|
) => z.object({
|
|
25
25
|
limit: createLimitSchema(1, maxLimit, limitDefault),
|
|
26
26
|
offset: OffsetSchema,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/schemas/pagination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3E,iCAAiC;AACjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,YAAoB,EACpB,QAAQ,GAAG,GAAG,EACd,WAAW,GAAG,MAAM;AACtB,
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/schemas/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ export interface ToolHandler {
|
|
|
10
10
|
(client: NavidromeClient, config: Config, name: string, args: unknown): Promise<unknown>;
|
|
11
11
|
}
|
|
12
12
|
export declare class ToolRegistry {
|
|
13
|
-
private categories;
|
|
14
|
-
private allTools;
|
|
13
|
+
private readonly categories;
|
|
14
|
+
private readonly allTools;
|
|
15
15
|
register(categoryName: string, category: ToolCategory): void;
|
|
16
16
|
getAllTools(): Tool[];
|
|
17
17
|
handleToolCall(name: string, args: unknown): Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAGD,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAwC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAGD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IAEvC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAK5D,WAAW,IAAI,IAAI,EAAE;IAIf,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CASpE;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CASjG;AAeD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoC3F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/handlers/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAenG,mCAAmC;AACnC,MAAM,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/handlers/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ async function callLastFmApi(method, params, apiKey) {
|
|
|
34
34
|
throw new Error(ErrorFormatter.lastfmApi(response));
|
|
35
35
|
}
|
|
36
36
|
const data = await response.json();
|
|
37
|
-
if (data['error']) {
|
|
37
|
+
if (data['error'] !== null && data['error'] !== undefined) {
|
|
38
38
|
throw new Error(ErrorFormatter.lastfmResponse(data['message']));
|
|
39
39
|
}
|
|
40
40
|
return data;
|
|
@@ -45,7 +45,7 @@ const SimilarArtistsSchema = z.object({
|
|
|
45
45
|
});
|
|
46
46
|
export async function getSimilarArtists(config, args) {
|
|
47
47
|
const { artist, limit = 20 } = SimilarArtistsSchema.parse(args);
|
|
48
|
-
if (
|
|
48
|
+
if (config.lastFmApiKey === null || config.lastFmApiKey === undefined || config.lastFmApiKey === '') {
|
|
49
49
|
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
50
50
|
}
|
|
51
51
|
logger.info(`Getting similar artists for: ${artist}`);
|
|
@@ -54,17 +54,17 @@ export async function getSimilarArtists(config, args) {
|
|
|
54
54
|
limit: limit.toString(),
|
|
55
55
|
autocorrect: '1',
|
|
56
56
|
}, config.lastFmApiKey);
|
|
57
|
-
const similarArtists = data['similarartists']?.artist
|
|
57
|
+
const similarArtists = data['similarartists']?.artist ?? [];
|
|
58
58
|
return {
|
|
59
59
|
artist,
|
|
60
60
|
count: similarArtists.length,
|
|
61
61
|
similarArtists: similarArtists.map((a) => {
|
|
62
62
|
const artist = a;
|
|
63
63
|
return {
|
|
64
|
-
name: String(artist['name']
|
|
65
|
-
match: parseFloat(String(artist['match']
|
|
66
|
-
url: String(artist['url']
|
|
67
|
-
mbid: artist['mbid']
|
|
64
|
+
name: String(artist['name'] ?? ''),
|
|
65
|
+
match: parseFloat(String(artist['match'] ?? 0)),
|
|
66
|
+
url: String(artist['url'] ?? ''),
|
|
67
|
+
mbid: artist['mbid'] ?? null,
|
|
68
68
|
};
|
|
69
69
|
}),
|
|
70
70
|
};
|
|
@@ -76,7 +76,7 @@ const SimilarTracksSchema = z.object({
|
|
|
76
76
|
});
|
|
77
77
|
export async function getSimilarTracks(config, args) {
|
|
78
78
|
const { artist, track, limit = 20 } = SimilarTracksSchema.parse(args);
|
|
79
|
-
if (
|
|
79
|
+
if (config.lastFmApiKey === null || config.lastFmApiKey === undefined || config.lastFmApiKey === '') {
|
|
80
80
|
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
81
81
|
}
|
|
82
82
|
logger.info(`Getting similar tracks for: ${artist} - ${track}`);
|
|
@@ -86,7 +86,7 @@ export async function getSimilarTracks(config, args) {
|
|
|
86
86
|
limit: limit.toString(),
|
|
87
87
|
autocorrect: '1',
|
|
88
88
|
}, config.lastFmApiKey);
|
|
89
|
-
const similarTracks = data['similartracks']?.track
|
|
89
|
+
const similarTracks = data['similartracks']?.track ?? [];
|
|
90
90
|
return {
|
|
91
91
|
originalTrack: { artist, track },
|
|
92
92
|
count: similarTracks.length,
|
|
@@ -94,11 +94,11 @@ export async function getSimilarTracks(config, args) {
|
|
|
94
94
|
const track = t;
|
|
95
95
|
const trackArtist = track['artist'];
|
|
96
96
|
return {
|
|
97
|
-
name: String(track['name']
|
|
98
|
-
artist: String(trackArtist?.['name']
|
|
99
|
-
match: parseFloat(String(track['match']
|
|
100
|
-
url: String(track['url']
|
|
101
|
-
mbid: track['mbid']
|
|
97
|
+
name: String(track['name'] ?? ''),
|
|
98
|
+
artist: String(trackArtist?.['name'] ?? trackArtist?.['#text'] ?? 'Unknown'),
|
|
99
|
+
match: parseFloat(String(track['match'] ?? 0)),
|
|
100
|
+
url: String(track['url'] ?? ''),
|
|
101
|
+
mbid: track['mbid'] ?? null,
|
|
102
102
|
};
|
|
103
103
|
}),
|
|
104
104
|
};
|
|
@@ -109,7 +109,7 @@ const ArtistInfoSchema = z.object({
|
|
|
109
109
|
});
|
|
110
110
|
export async function getArtistInfo(config, args) {
|
|
111
111
|
const { artist, lang = 'en' } = ArtistInfoSchema.parse(args);
|
|
112
|
-
if (
|
|
112
|
+
if (config.lastFmApiKey === null || config.lastFmApiKey === undefined || config.lastFmApiKey === '') {
|
|
113
113
|
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
114
114
|
}
|
|
115
115
|
logger.info(`Getting artist info for: ${artist}`);
|
|
@@ -118,23 +118,23 @@ export async function getArtistInfo(config, args) {
|
|
|
118
118
|
lang,
|
|
119
119
|
autocorrect: '1',
|
|
120
120
|
}, config.lastFmApiKey);
|
|
121
|
-
const artistInfo = data['artist']
|
|
121
|
+
const artistInfo = data['artist'] ?? {};
|
|
122
122
|
const stats = artistInfo['stats'];
|
|
123
123
|
const bio = artistInfo['bio'];
|
|
124
124
|
const tags = artistInfo['tags'];
|
|
125
125
|
const similar = artistInfo['similar'];
|
|
126
126
|
return {
|
|
127
|
-
name: String(artistInfo['name']
|
|
128
|
-
mbid: artistInfo['mbid']
|
|
129
|
-
url: String(artistInfo['url']
|
|
130
|
-
listeners: parseInt(String(stats?.['listeners']
|
|
131
|
-
playcount: parseInt(String(stats?.['playcount']
|
|
132
|
-
biography: bio?.['summary'] ? String(bio['summary']).replace(/<[^>]*>/g, '') : null,
|
|
133
|
-
tags: (tags?.['tag']
|
|
134
|
-
name: String(t['name']
|
|
135
|
-
url: String(t['url']
|
|
127
|
+
name: String(artistInfo['name'] ?? ''),
|
|
128
|
+
mbid: artistInfo['mbid'] ?? null,
|
|
129
|
+
url: String(artistInfo['url'] ?? ''),
|
|
130
|
+
listeners: parseInt(String(stats?.['listeners'] ?? '0'), 10),
|
|
131
|
+
playcount: parseInt(String(stats?.['playcount'] ?? '0'), 10),
|
|
132
|
+
biography: bio?.['summary'] !== null && bio?.['summary'] !== undefined ? String(bio['summary']).replace(/<[^>]*>/g, '') : null,
|
|
133
|
+
tags: (tags?.['tag'] ?? []).map((t) => ({
|
|
134
|
+
name: String(t['name'] ?? ''),
|
|
135
|
+
url: String(t['url'] ?? ''),
|
|
136
136
|
})),
|
|
137
|
-
similar: (similar?.['artist']
|
|
137
|
+
similar: (similar?.['artist'] ?? []).slice(0, 5).map((a) => String(a['name'] ?? '')),
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
const TopTracksByArtistSchema = z.object({
|
|
@@ -143,7 +143,7 @@ const TopTracksByArtistSchema = z.object({
|
|
|
143
143
|
});
|
|
144
144
|
export async function getTopTracksByArtist(config, args) {
|
|
145
145
|
const { artist, limit = 10 } = TopTracksByArtistSchema.parse(args);
|
|
146
|
-
if (
|
|
146
|
+
if (config.lastFmApiKey === null || config.lastFmApiKey === undefined || config.lastFmApiKey === '') {
|
|
147
147
|
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
148
148
|
}
|
|
149
149
|
logger.info(`Getting top tracks for artist: ${artist}`);
|
|
@@ -152,17 +152,17 @@ export async function getTopTracksByArtist(config, args) {
|
|
|
152
152
|
limit: limit.toString(),
|
|
153
153
|
autocorrect: '1',
|
|
154
154
|
}, config.lastFmApiKey);
|
|
155
|
-
const topTracks = data['toptracks']?.['track']
|
|
155
|
+
const topTracks = data['toptracks']?.['track'] ?? [];
|
|
156
156
|
return {
|
|
157
157
|
artist,
|
|
158
158
|
count: topTracks.length,
|
|
159
159
|
tracks: topTracks.map((t, index) => ({
|
|
160
160
|
rank: index + 1,
|
|
161
|
-
name: String(t['name']
|
|
162
|
-
playcount: parseInt(String(t['playcount']
|
|
163
|
-
listeners: parseInt(String(t['listeners']
|
|
164
|
-
url: String(t['url']
|
|
165
|
-
mbid: t['mbid']
|
|
161
|
+
name: String(t['name'] ?? ''),
|
|
162
|
+
playcount: parseInt(String(t['playcount'] ?? '0'), 10),
|
|
163
|
+
listeners: parseInt(String(t['listeners'] ?? '0'), 10),
|
|
164
|
+
url: String(t['url'] ?? ''),
|
|
165
|
+
mbid: t['mbid'] ?? null,
|
|
166
166
|
})),
|
|
167
167
|
};
|
|
168
168
|
}
|
|
@@ -173,7 +173,7 @@ const GlobalChartsSchema = z.object({
|
|
|
173
173
|
});
|
|
174
174
|
export async function getTrendingMusic(config, args) {
|
|
175
175
|
const { type, limit = 20, page = 1 } = GlobalChartsSchema.parse(args);
|
|
176
|
-
if (
|
|
176
|
+
if (config.lastFmApiKey === null || config.lastFmApiKey === undefined || config.lastFmApiKey === '') {
|
|
177
177
|
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
178
178
|
}
|
|
179
179
|
logger.info(`Getting global ${type} chart`);
|
|
@@ -185,13 +185,13 @@ export async function getTrendingMusic(config, args) {
|
|
|
185
185
|
page: page.toString(),
|
|
186
186
|
}, config.lastFmApiKey);
|
|
187
187
|
if (type === 'artists') {
|
|
188
|
-
const artists = (data['artists']?.['artist']
|
|
188
|
+
const artists = (data['artists']?.['artist'] ?? []).map((a, index) => ({
|
|
189
189
|
rank: (page - 1) * limit + index + 1,
|
|
190
|
-
name: String(a['name']
|
|
191
|
-
playcount: parseInt(String(a['playcount']
|
|
192
|
-
listeners: parseInt(String(a['listeners']
|
|
193
|
-
url: String(a['url']
|
|
194
|
-
mbid: a['mbid']
|
|
190
|
+
name: String(a['name'] ?? ''),
|
|
191
|
+
playcount: parseInt(String(a['playcount'] ?? '0'), 10),
|
|
192
|
+
listeners: parseInt(String(a['listeners'] ?? '0'), 10),
|
|
193
|
+
url: String(a['url'] ?? ''),
|
|
194
|
+
mbid: a['mbid'] ?? null,
|
|
195
195
|
}));
|
|
196
196
|
return {
|
|
197
197
|
type,
|
|
@@ -202,14 +202,14 @@ export async function getTrendingMusic(config, args) {
|
|
|
202
202
|
};
|
|
203
203
|
}
|
|
204
204
|
else if (type === 'tracks') {
|
|
205
|
-
const tracks = (data['tracks']?.['track']
|
|
205
|
+
const tracks = (data['tracks']?.['track'] ?? []).map((t, index) => ({
|
|
206
206
|
rank: (page - 1) * limit + index + 1,
|
|
207
|
-
name: String(t['name']
|
|
208
|
-
artist: String((t['artist']?.['name'])
|
|
209
|
-
playcount: parseInt(String(t['playcount']
|
|
210
|
-
listeners: parseInt(String(t['listeners']
|
|
211
|
-
url: String(t['url']
|
|
212
|
-
mbid: t['mbid']
|
|
207
|
+
name: String(t['name'] ?? ''),
|
|
208
|
+
artist: String((t['artist']?.['name']) ?? 'Unknown'),
|
|
209
|
+
playcount: parseInt(String(t['playcount'] ?? '0'), 10),
|
|
210
|
+
listeners: parseInt(String(t['listeners'] ?? '0'), 10),
|
|
211
|
+
url: String(t['url'] ?? ''),
|
|
212
|
+
mbid: t['mbid'] ?? null,
|
|
213
213
|
}));
|
|
214
214
|
return {
|
|
215
215
|
type,
|
|
@@ -220,11 +220,11 @@ export async function getTrendingMusic(config, args) {
|
|
|
220
220
|
};
|
|
221
221
|
}
|
|
222
222
|
else {
|
|
223
|
-
const tags = (data['tags']?.['tag']
|
|
223
|
+
const tags = (data['tags']?.['tag'] ?? []).map((t, index) => ({
|
|
224
224
|
rank: (page - 1) * limit + index + 1,
|
|
225
|
-
name: String(t['name']
|
|
226
|
-
count: parseInt(String(t['count']
|
|
227
|
-
url: String(t['url']
|
|
225
|
+
name: String(t['name'] ?? ''),
|
|
226
|
+
count: parseInt(String(t['count'] ?? '0'), 10),
|
|
227
|
+
url: String(t['url'] ?? ''),
|
|
228
228
|
}));
|
|
229
229
|
return {
|
|
230
230
|
type,
|