navidrome-mcp 1.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/LICENSE +661 -0
- package/README.md +397 -0
- package/dist/capabilities.d.ts +20 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +25 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/client/auth-manager.d.ts +27 -0
- package/dist/client/auth-manager.d.ts.map +1 -0
- package/dist/client/auth-manager.js +54 -0
- package/dist/client/auth-manager.js.map +1 -0
- package/dist/client/navidrome-client.d.ts +28 -0
- package/dist/client/navidrome-client.d.ts.map +1 -0
- package/dist/client/navidrome-client.js +84 -0
- package/dist/client/navidrome-client.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +132 -0
- package/dist/config.js.map +1 -0
- package/dist/constants/defaults.d.ts +29 -0
- package/dist/constants/defaults.d.ts.map +1 -0
- package/dist/constants/defaults.js +37 -0
- package/dist/constants/defaults.js.map +1 -0
- package/dist/constants/timeouts.d.ts +66 -0
- package/dist/constants/timeouts.d.ts.map +1 -0
- package/dist/constants/timeouts.js +66 -0
- package/dist/constants/timeouts.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +21 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +83 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/common.d.ts +68 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +69 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/index.d.ts +21 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +24 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/pagination.d.ts +153 -0
- package/dist/schemas/pagination.d.ts.map +1 -0
- package/dist/schemas/pagination.js +93 -0
- package/dist/schemas/pagination.js.map +1 -0
- package/dist/schemas/validation.d.ts +147 -0
- package/dist/schemas/validation.d.ts.map +1 -0
- package/dist/schemas/validation.js +143 -0
- package/dist/schemas/validation.js.map +1 -0
- package/dist/tools/handlers/lastfm-handlers.d.ts +5 -0
- package/dist/tools/handlers/lastfm-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/lastfm-handlers.js +143 -0
- package/dist/tools/handlers/lastfm-handlers.js.map +1 -0
- package/dist/tools/handlers/lyrics-handlers.d.ts +5 -0
- package/dist/tools/handlers/lyrics-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/lyrics-handlers.js +51 -0
- package/dist/tools/handlers/lyrics-handlers.js.map +1 -0
- package/dist/tools/handlers/playlist-handlers.d.ts +5 -0
- package/dist/tools/handlers/playlist-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/playlist-handlers.js +316 -0
- package/dist/tools/handlers/playlist-handlers.js.map +1 -0
- package/dist/tools/handlers/queue-handlers.d.ts +5 -0
- package/dist/tools/handlers/queue-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/queue-handlers.js +135 -0
- package/dist/tools/handlers/queue-handlers.js.map +1 -0
- package/dist/tools/handlers/radio-handlers.d.ts +5 -0
- package/dist/tools/handlers/radio-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/radio-handlers.js +323 -0
- package/dist/tools/handlers/radio-handlers.js.map +1 -0
- package/dist/tools/handlers/registry.d.ts +26 -0
- package/dist/tools/handlers/registry.d.ts.map +1 -0
- package/dist/tools/handlers/registry.js +77 -0
- package/dist/tools/handlers/registry.js.map +1 -0
- package/dist/tools/handlers/search-handlers.d.ts +5 -0
- package/dist/tools/handlers/search-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/search-handlers.js +125 -0
- package/dist/tools/handlers/search-handlers.js.map +1 -0
- package/dist/tools/handlers/tag-handlers.d.ts +5 -0
- package/dist/tools/handlers/tag-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/tag-handlers.js +155 -0
- package/dist/tools/handlers/tag-handlers.js.map +1 -0
- package/dist/tools/handlers/user-preferences-handlers.d.ts +5 -0
- package/dist/tools/handlers/user-preferences-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/user-preferences-handlers.js +155 -0
- package/dist/tools/handlers/user-preferences-handlers.js.map +1 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lastfm-discovery.d.ts +107 -0
- package/dist/tools/lastfm-discovery.d.ts.map +1 -0
- package/dist/tools/lastfm-discovery.js +238 -0
- package/dist/tools/lastfm-discovery.js.map +1 -0
- package/dist/tools/library.d.ts +31 -0
- package/dist/tools/library.d.ts.map +1 -0
- package/dist/tools/library.js +272 -0
- package/dist/tools/library.js.map +1 -0
- package/dist/tools/listening-history.d.ts +51 -0
- package/dist/tools/listening-history.d.ts.map +1 -0
- package/dist/tools/listening-history.js +126 -0
- package/dist/tools/listening-history.js.map +1 -0
- package/dist/tools/lyrics.d.ts +35 -0
- package/dist/tools/lyrics.d.ts.map +1 -0
- package/dist/tools/lyrics.js +222 -0
- package/dist/tools/lyrics.js.map +1 -0
- package/dist/tools/media-library.d.ts +46 -0
- package/dist/tools/media-library.d.ts.map +1 -0
- package/dist/tools/media-library.js +179 -0
- package/dist/tools/media-library.js.map +1 -0
- package/dist/tools/playlist-management.d.ts +80 -0
- package/dist/tools/playlist-management.d.ts.map +1 -0
- package/dist/tools/playlist-management.js +384 -0
- package/dist/tools/playlist-management.js.map +1 -0
- package/dist/tools/queue-management.d.ts +48 -0
- package/dist/tools/queue-management.d.ts.map +1 -0
- package/dist/tools/queue-management.js +83 -0
- package/dist/tools/queue-management.js.map +1 -0
- package/dist/tools/radio-discovery.d.ts +95 -0
- package/dist/tools/radio-discovery.d.ts.map +1 -0
- package/dist/tools/radio-discovery.js +352 -0
- package/dist/tools/radio-discovery.js.map +1 -0
- package/dist/tools/radio-validation.d.ts +49 -0
- package/dist/tools/radio-validation.d.ts.map +1 -0
- package/dist/tools/radio-validation.js +463 -0
- package/dist/tools/radio-validation.js.map +1 -0
- package/dist/tools/radio.d.ts +38 -0
- package/dist/tools/radio.d.ts.map +1 -0
- package/dist/tools/radio.js +315 -0
- package/dist/tools/radio.js.map +1 -0
- package/dist/tools/search.d.ts +54 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +165 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tags.d.ts +63 -0
- package/dist/tools/tags.d.ts.map +1 -0
- package/dist/tools/tags.js +260 -0
- package/dist/tools/tags.js.map +1 -0
- package/dist/tools/test.d.ts +50 -0
- package/dist/tools/test.d.ts.map +1 -0
- package/dist/tools/test.js +121 -0
- package/dist/tools/test.js.map +1 -0
- package/dist/tools/user-preferences.d.ts +73 -0
- package/dist/tools/user-preferences.d.ts.map +1 -0
- package/dist/tools/user-preferences.js +231 -0
- package/dist/tools/user-preferences.js.map +1 -0
- package/dist/transformers/song-transformer.d.ts +122 -0
- package/dist/transformers/song-transformer.d.ts.map +1 -0
- package/dist/transformers/song-transformer.js +232 -0
- package/dist/transformers/song-transformer.js.map +1 -0
- package/dist/types/core.d.ts +147 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +19 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lyrics.d.ts +58 -0
- package/dist/types/lyrics.d.ts.map +1 -0
- package/dist/types/lyrics.js +19 -0
- package/dist/types/lyrics.js.map +1 -0
- package/dist/types/playlists.d.ts +150 -0
- package/dist/types/playlists.d.ts.map +1 -0
- package/dist/types/playlists.js +19 -0
- package/dist/types/playlists.js.map +1 -0
- package/dist/types/radio.d.ts +192 -0
- package/dist/types/radio.d.ts.map +1 -0
- package/dist/types/radio.js +19 -0
- package/dist/types/radio.js.map +1 -0
- package/dist/types/tags.d.ts +72 -0
- package/dist/types/tags.d.ts.map +1 -0
- package/dist/types/tags.js +19 -0
- package/dist/types/tags.js.map +1 -0
- package/dist/utils/cache.d.ts +32 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +84 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +108 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/error-formatter.js +161 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +33 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/message-manager.d.ts +74 -0
- package/dist/utils/message-manager.d.ts.map +1 -0
- package/dist/utils/message-manager.js +134 -0
- package/dist/utils/message-manager.js.map +1 -0
- package/dist/utils/version.d.ts +5 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +19 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navidrome MCP Server - Last.fm Music Discovery Tools
|
|
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 { logger } from '../utils/logger.js';
|
|
20
|
+
import { DEFAULT_VALUES } from '../constants/defaults.js';
|
|
21
|
+
import { ErrorFormatter } from '../utils/error-formatter.js';
|
|
22
|
+
const LASTFM_API_BASE = 'http://ws.audioscrobbler.com/2.0/';
|
|
23
|
+
async function callLastFmApi(method, params, apiKey) {
|
|
24
|
+
const url = new URL(LASTFM_API_BASE);
|
|
25
|
+
url.searchParams.append('method', method);
|
|
26
|
+
url.searchParams.append('api_key', apiKey);
|
|
27
|
+
url.searchParams.append('format', 'json');
|
|
28
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
29
|
+
url.searchParams.append(key, value);
|
|
30
|
+
});
|
|
31
|
+
logger.debug(`Calling Last.fm API: ${method}`, params);
|
|
32
|
+
const response = await fetch(url.toString());
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(ErrorFormatter.lastfmApi(response));
|
|
35
|
+
}
|
|
36
|
+
const data = await response.json();
|
|
37
|
+
if (data['error']) {
|
|
38
|
+
throw new Error(ErrorFormatter.lastfmResponse(data['message']));
|
|
39
|
+
}
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
const SimilarArtistsSchema = z.object({
|
|
43
|
+
artist: z.string().min(1),
|
|
44
|
+
limit: z.number().min(1).max(100).optional().default(DEFAULT_VALUES.SIMILAR_ARTISTS_LIMIT),
|
|
45
|
+
});
|
|
46
|
+
export async function getSimilarArtists(config, args) {
|
|
47
|
+
const { artist, limit = 20 } = SimilarArtistsSchema.parse(args);
|
|
48
|
+
if (!config.lastFmApiKey) {
|
|
49
|
+
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
50
|
+
}
|
|
51
|
+
logger.info(`Getting similar artists for: ${artist}`);
|
|
52
|
+
const data = await callLastFmApi('artist.getSimilar', {
|
|
53
|
+
artist,
|
|
54
|
+
limit: limit.toString(),
|
|
55
|
+
autocorrect: '1',
|
|
56
|
+
}, config.lastFmApiKey);
|
|
57
|
+
const similarArtists = data['similarartists']?.artist || [];
|
|
58
|
+
return {
|
|
59
|
+
artist,
|
|
60
|
+
count: similarArtists.length,
|
|
61
|
+
similarArtists: similarArtists.map((a) => {
|
|
62
|
+
const artist = a;
|
|
63
|
+
return {
|
|
64
|
+
name: String(artist['name'] || ''),
|
|
65
|
+
match: parseFloat(String(artist['match'] || 0)),
|
|
66
|
+
url: String(artist['url'] || ''),
|
|
67
|
+
mbid: artist['mbid'] || null,
|
|
68
|
+
};
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const SimilarTracksSchema = z.object({
|
|
73
|
+
artist: z.string().min(1),
|
|
74
|
+
track: z.string().min(1),
|
|
75
|
+
limit: z.number().min(1).max(100).optional().default(DEFAULT_VALUES.SIMILAR_TRACKS_LIMIT),
|
|
76
|
+
});
|
|
77
|
+
export async function getSimilarTracks(config, args) {
|
|
78
|
+
const { artist, track, limit = 20 } = SimilarTracksSchema.parse(args);
|
|
79
|
+
if (!config.lastFmApiKey) {
|
|
80
|
+
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
81
|
+
}
|
|
82
|
+
logger.info(`Getting similar tracks for: ${artist} - ${track}`);
|
|
83
|
+
const data = await callLastFmApi('track.getSimilar', {
|
|
84
|
+
artist,
|
|
85
|
+
track,
|
|
86
|
+
limit: limit.toString(),
|
|
87
|
+
autocorrect: '1',
|
|
88
|
+
}, config.lastFmApiKey);
|
|
89
|
+
const similarTracks = data['similartracks']?.track || [];
|
|
90
|
+
return {
|
|
91
|
+
originalTrack: { artist, track },
|
|
92
|
+
count: similarTracks.length,
|
|
93
|
+
similarTracks: similarTracks.map((t) => {
|
|
94
|
+
const track = t;
|
|
95
|
+
const trackArtist = track['artist'];
|
|
96
|
+
return {
|
|
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
|
+
};
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const ArtistInfoSchema = z.object({
|
|
107
|
+
artist: z.string().min(1),
|
|
108
|
+
lang: z.string().optional().default('en'),
|
|
109
|
+
});
|
|
110
|
+
export async function getArtistInfo(config, args) {
|
|
111
|
+
const { artist, lang = 'en' } = ArtistInfoSchema.parse(args);
|
|
112
|
+
if (!config.lastFmApiKey) {
|
|
113
|
+
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
114
|
+
}
|
|
115
|
+
logger.info(`Getting artist info for: ${artist}`);
|
|
116
|
+
const data = await callLastFmApi('artist.getInfo', {
|
|
117
|
+
artist,
|
|
118
|
+
lang,
|
|
119
|
+
autocorrect: '1',
|
|
120
|
+
}, config.lastFmApiKey);
|
|
121
|
+
const artistInfo = data['artist'] || {};
|
|
122
|
+
const stats = artistInfo['stats'];
|
|
123
|
+
const bio = artistInfo['bio'];
|
|
124
|
+
const tags = artistInfo['tags'];
|
|
125
|
+
const similar = artistInfo['similar'];
|
|
126
|
+
return {
|
|
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'] ? String(bio['summary']).replace(/<[^>]*>/g, '') : null,
|
|
133
|
+
tags: (tags?.['tag'] || []).map((t) => ({
|
|
134
|
+
name: String(t['name'] || ''),
|
|
135
|
+
url: String(t['url'] || ''),
|
|
136
|
+
})),
|
|
137
|
+
similar: (similar?.['artist'] || []).slice(0, 5).map((a) => String(a['name'] || '')),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const TopTracksByArtistSchema = z.object({
|
|
141
|
+
artist: z.string().min(1),
|
|
142
|
+
limit: z.number().min(1).max(50).optional().default(DEFAULT_VALUES.TOP_TRACKS_BY_ARTIST_LIMIT),
|
|
143
|
+
});
|
|
144
|
+
export async function getTopTracksByArtist(config, args) {
|
|
145
|
+
const { artist, limit = 10 } = TopTracksByArtistSchema.parse(args);
|
|
146
|
+
if (!config.lastFmApiKey) {
|
|
147
|
+
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
148
|
+
}
|
|
149
|
+
logger.info(`Getting top tracks for artist: ${artist}`);
|
|
150
|
+
const data = await callLastFmApi('artist.getTopTracks', {
|
|
151
|
+
artist,
|
|
152
|
+
limit: limit.toString(),
|
|
153
|
+
autocorrect: '1',
|
|
154
|
+
}, config.lastFmApiKey);
|
|
155
|
+
const topTracks = data['toptracks']?.['track'] || [];
|
|
156
|
+
return {
|
|
157
|
+
artist,
|
|
158
|
+
count: topTracks.length,
|
|
159
|
+
tracks: topTracks.map((t, index) => ({
|
|
160
|
+
rank: index + 1,
|
|
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
|
+
})),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const GlobalChartsSchema = z.object({
|
|
170
|
+
type: z.enum(['artists', 'tracks', 'tags']),
|
|
171
|
+
limit: z.number().min(1).max(100).optional().default(DEFAULT_VALUES.TRENDING_MUSIC_LIMIT),
|
|
172
|
+
page: z.number().min(1).optional().default(1),
|
|
173
|
+
});
|
|
174
|
+
export async function getTrendingMusic(config, args) {
|
|
175
|
+
const { type, limit = 20, page = 1 } = GlobalChartsSchema.parse(args);
|
|
176
|
+
if (!config.lastFmApiKey) {
|
|
177
|
+
throw new Error(ErrorFormatter.configMissing('Last.fm', 'LASTFM_API_KEY'));
|
|
178
|
+
}
|
|
179
|
+
logger.info(`Getting global ${type} chart`);
|
|
180
|
+
const method = type === 'artists' ? 'chart.getTopArtists' :
|
|
181
|
+
type === 'tracks' ? 'chart.getTopTracks' :
|
|
182
|
+
'chart.getTopTags';
|
|
183
|
+
const data = await callLastFmApi(method, {
|
|
184
|
+
limit: limit.toString(),
|
|
185
|
+
page: page.toString(),
|
|
186
|
+
}, config.lastFmApiKey);
|
|
187
|
+
if (type === 'artists') {
|
|
188
|
+
const artists = (data['artists']?.['artist'] || []).map((a, index) => ({
|
|
189
|
+
rank: (page - 1) * limit + index + 1,
|
|
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
|
+
}));
|
|
196
|
+
return {
|
|
197
|
+
type,
|
|
198
|
+
page,
|
|
199
|
+
perPage: limit,
|
|
200
|
+
count: artists.length,
|
|
201
|
+
items: artists,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
else if (type === 'tracks') {
|
|
205
|
+
const tracks = (data['tracks']?.['track'] || []).map((t, index) => ({
|
|
206
|
+
rank: (page - 1) * limit + index + 1,
|
|
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
|
+
}));
|
|
214
|
+
return {
|
|
215
|
+
type,
|
|
216
|
+
page,
|
|
217
|
+
perPage: limit,
|
|
218
|
+
count: tracks.length,
|
|
219
|
+
items: tracks,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
const tags = (data['tags']?.['tag'] || []).map((t, index) => ({
|
|
224
|
+
rank: (page - 1) * limit + index + 1,
|
|
225
|
+
name: String(t['name'] || ''),
|
|
226
|
+
count: parseInt(String(t['count'] || '0'), 10),
|
|
227
|
+
url: String(t['url'] || ''),
|
|
228
|
+
}));
|
|
229
|
+
return {
|
|
230
|
+
type,
|
|
231
|
+
page,
|
|
232
|
+
perPage: limit,
|
|
233
|
+
count: tags.length,
|
|
234
|
+
items: tags,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=lastfm-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lastfm-discovery.js","sourceRoot":"","sources":["../../src/tools/lastfm-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navidrome MCP Server - Library Tools
|
|
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 { NavidromeClient } from '../client/navidrome-client.js';
|
|
19
|
+
import type { Config } from '../config.js';
|
|
20
|
+
import type { SongDTO } from '../types/index.js';
|
|
21
|
+
import type { ToolCategory } from './handlers/registry.js';
|
|
22
|
+
export type Song = SongDTO;
|
|
23
|
+
export interface ListSongsResult {
|
|
24
|
+
songs: SongDTO[];
|
|
25
|
+
total: number;
|
|
26
|
+
offset: number;
|
|
27
|
+
limit: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function listSongs(client: NavidromeClient, args: unknown): Promise<ListSongsResult>;
|
|
30
|
+
export declare function createLibraryToolCategory(client: NavidromeClient, config: Config): ToolCategory;
|
|
31
|
+
//# sourceMappingURL=library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../src/tools/library.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAa3D,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC;AAE3B,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CA8BhG;AAwMD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CA0B/F"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navidrome MCP Server - Library Tools
|
|
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 { transformSongsToDTO } from '../transformers/song-transformer.js';
|
|
19
|
+
import { DEFAULT_VALUES } from '../constants/defaults.js';
|
|
20
|
+
import { listAlbums, listArtists, listGenres, getSong, getAlbum, getArtist, getSongPlaylists, } from './media-library.js';
|
|
21
|
+
import { SongPaginationSchema } from '../schemas/index.js';
|
|
22
|
+
export async function listSongs(client, args) {
|
|
23
|
+
const params = SongPaginationSchema.parse(args);
|
|
24
|
+
try {
|
|
25
|
+
// Build query parameters for Navidrome API
|
|
26
|
+
const queryParams = new URLSearchParams({
|
|
27
|
+
_start: params.offset.toString(),
|
|
28
|
+
_end: (params.offset + params.limit).toString(),
|
|
29
|
+
_sort: params.sort,
|
|
30
|
+
_order: params.order,
|
|
31
|
+
});
|
|
32
|
+
if (params.starred !== undefined) {
|
|
33
|
+
queryParams.set('starred', params.starred.toString());
|
|
34
|
+
}
|
|
35
|
+
const rawSongs = await client.request(`/song?${queryParams.toString()}`);
|
|
36
|
+
const songs = transformSongsToDTO(rawSongs);
|
|
37
|
+
return {
|
|
38
|
+
songs,
|
|
39
|
+
total: songs.length, // Note: Navidrome doesn't return total count in this endpoint
|
|
40
|
+
offset: params.offset,
|
|
41
|
+
limit: params.limit,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw new Error(`Failed to fetch songs: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Tool definitions for library category
|
|
49
|
+
const tools = [
|
|
50
|
+
{
|
|
51
|
+
name: 'list_songs',
|
|
52
|
+
description: 'List songs from the Navidrome music library with clean, LLM-friendly data (filtering and pagination supported)',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
limit: {
|
|
57
|
+
type: 'number',
|
|
58
|
+
description: 'Maximum number of songs to return (1-500)',
|
|
59
|
+
minimum: 1,
|
|
60
|
+
maximum: 500,
|
|
61
|
+
default: DEFAULT_VALUES.SONGS_LIMIT,
|
|
62
|
+
},
|
|
63
|
+
offset: {
|
|
64
|
+
type: 'number',
|
|
65
|
+
description: 'Number of songs to skip for pagination',
|
|
66
|
+
minimum: 0,
|
|
67
|
+
default: 0,
|
|
68
|
+
},
|
|
69
|
+
sort: {
|
|
70
|
+
type: 'string',
|
|
71
|
+
description: 'Field to sort by',
|
|
72
|
+
enum: ['title', 'artist', 'album', 'year', 'duration', 'playCount', 'rating'],
|
|
73
|
+
default: 'title',
|
|
74
|
+
},
|
|
75
|
+
order: {
|
|
76
|
+
type: 'string',
|
|
77
|
+
description: 'Sort order',
|
|
78
|
+
enum: ['ASC', 'DESC'],
|
|
79
|
+
default: 'ASC',
|
|
80
|
+
},
|
|
81
|
+
starred: {
|
|
82
|
+
type: 'boolean',
|
|
83
|
+
description: 'Filter for starred songs only',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'list_albums',
|
|
90
|
+
description: 'List albums from the Navidrome music library with clean, LLM-friendly data',
|
|
91
|
+
inputSchema: {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {
|
|
94
|
+
limit: {
|
|
95
|
+
type: 'number',
|
|
96
|
+
description: 'Maximum number of albums to return (1-500)',
|
|
97
|
+
minimum: 1,
|
|
98
|
+
maximum: 500,
|
|
99
|
+
default: DEFAULT_VALUES.ALBUMS_LIMIT,
|
|
100
|
+
},
|
|
101
|
+
offset: {
|
|
102
|
+
type: 'number',
|
|
103
|
+
description: 'Number of albums to skip for pagination',
|
|
104
|
+
minimum: 0,
|
|
105
|
+
default: 0,
|
|
106
|
+
},
|
|
107
|
+
sort: {
|
|
108
|
+
type: 'string',
|
|
109
|
+
description: 'Field to sort by',
|
|
110
|
+
default: 'name',
|
|
111
|
+
},
|
|
112
|
+
order: {
|
|
113
|
+
type: 'string',
|
|
114
|
+
description: 'Sort order',
|
|
115
|
+
enum: ['ASC', 'DESC'],
|
|
116
|
+
default: 'ASC',
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'list_artists',
|
|
123
|
+
description: 'List artists from the Navidrome music library with clean, LLM-friendly data',
|
|
124
|
+
inputSchema: {
|
|
125
|
+
type: 'object',
|
|
126
|
+
properties: {
|
|
127
|
+
limit: {
|
|
128
|
+
type: 'number',
|
|
129
|
+
description: 'Maximum number of artists to return (1-500)',
|
|
130
|
+
minimum: 1,
|
|
131
|
+
maximum: 500,
|
|
132
|
+
default: 100,
|
|
133
|
+
},
|
|
134
|
+
offset: {
|
|
135
|
+
type: 'number',
|
|
136
|
+
description: 'Number of artists to skip for pagination',
|
|
137
|
+
minimum: 0,
|
|
138
|
+
default: 0,
|
|
139
|
+
},
|
|
140
|
+
sort: {
|
|
141
|
+
type: 'string',
|
|
142
|
+
description: 'Field to sort by',
|
|
143
|
+
default: 'name',
|
|
144
|
+
},
|
|
145
|
+
order: {
|
|
146
|
+
type: 'string',
|
|
147
|
+
description: 'Sort order',
|
|
148
|
+
enum: ['ASC', 'DESC'],
|
|
149
|
+
default: 'ASC',
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'list_genres',
|
|
156
|
+
description: 'List all genres from the Navidrome music library',
|
|
157
|
+
inputSchema: {
|
|
158
|
+
type: 'object',
|
|
159
|
+
properties: {
|
|
160
|
+
limit: {
|
|
161
|
+
type: 'number',
|
|
162
|
+
description: 'Maximum number of genres to return (1-500)',
|
|
163
|
+
minimum: 1,
|
|
164
|
+
maximum: 500,
|
|
165
|
+
default: 100,
|
|
166
|
+
},
|
|
167
|
+
offset: {
|
|
168
|
+
type: 'number',
|
|
169
|
+
description: 'Number of genres to skip for pagination',
|
|
170
|
+
minimum: 0,
|
|
171
|
+
default: 0,
|
|
172
|
+
},
|
|
173
|
+
sort: {
|
|
174
|
+
type: 'string',
|
|
175
|
+
description: 'Field to sort by',
|
|
176
|
+
default: 'name',
|
|
177
|
+
},
|
|
178
|
+
order: {
|
|
179
|
+
type: 'string',
|
|
180
|
+
description: 'Sort order',
|
|
181
|
+
enum: ['ASC', 'DESC'],
|
|
182
|
+
default: 'ASC',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'get_song',
|
|
189
|
+
description: 'Get detailed information about a specific song by ID',
|
|
190
|
+
inputSchema: {
|
|
191
|
+
type: 'object',
|
|
192
|
+
properties: {
|
|
193
|
+
id: {
|
|
194
|
+
type: 'string',
|
|
195
|
+
description: 'The unique ID of the song',
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
required: ['id'],
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
name: 'get_album',
|
|
203
|
+
description: 'Get detailed information about a specific album by ID',
|
|
204
|
+
inputSchema: {
|
|
205
|
+
type: 'object',
|
|
206
|
+
properties: {
|
|
207
|
+
id: {
|
|
208
|
+
type: 'string',
|
|
209
|
+
description: 'The unique ID of the album',
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
required: ['id'],
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'get_artist',
|
|
217
|
+
description: 'Get detailed information about a specific artist by ID',
|
|
218
|
+
inputSchema: {
|
|
219
|
+
type: 'object',
|
|
220
|
+
properties: {
|
|
221
|
+
id: {
|
|
222
|
+
type: 'string',
|
|
223
|
+
description: 'The unique ID of the artist',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
required: ['id'],
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
name: 'get_song_playlists',
|
|
231
|
+
description: 'Get all playlists that contain a specific song',
|
|
232
|
+
inputSchema: {
|
|
233
|
+
type: 'object',
|
|
234
|
+
properties: {
|
|
235
|
+
songId: {
|
|
236
|
+
type: 'string',
|
|
237
|
+
description: 'The unique ID of the song',
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
required: ['songId'],
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
];
|
|
244
|
+
// Factory function for creating library tool category with dependencies
|
|
245
|
+
export function createLibraryToolCategory(client, config) {
|
|
246
|
+
return {
|
|
247
|
+
tools,
|
|
248
|
+
async handleToolCall(name, args) {
|
|
249
|
+
switch (name) {
|
|
250
|
+
case 'list_songs':
|
|
251
|
+
return await listSongs(client, args);
|
|
252
|
+
case 'list_albums':
|
|
253
|
+
return await listAlbums(client, args);
|
|
254
|
+
case 'list_artists':
|
|
255
|
+
return await listArtists(client, args);
|
|
256
|
+
case 'list_genres':
|
|
257
|
+
return await listGenres(client, config, args);
|
|
258
|
+
case 'get_song':
|
|
259
|
+
return await getSong(client, args);
|
|
260
|
+
case 'get_album':
|
|
261
|
+
return await getAlbum(client, args);
|
|
262
|
+
case 'get_artist':
|
|
263
|
+
return await getArtist(client, args);
|
|
264
|
+
case 'get_song_playlists':
|
|
265
|
+
return await getSongPlaylists(client, args);
|
|
266
|
+
default:
|
|
267
|
+
throw new Error(`Unknown library tool: ${name}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/tools/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navidrome MCP Server - Listening History Tools
|
|
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 { NavidromeClient } from '../client/navidrome-client.js';
|
|
19
|
+
export interface RecentlyPlayedTrack {
|
|
20
|
+
id: string;
|
|
21
|
+
title: string;
|
|
22
|
+
artist: string;
|
|
23
|
+
album: string;
|
|
24
|
+
playCount: number;
|
|
25
|
+
lastPlayed?: string;
|
|
26
|
+
duration: number;
|
|
27
|
+
}
|
|
28
|
+
export interface RecentlyPlayedResult {
|
|
29
|
+
timeRange: string;
|
|
30
|
+
count: number;
|
|
31
|
+
tracks: RecentlyPlayedTrack[];
|
|
32
|
+
}
|
|
33
|
+
export interface MostPlayedItem {
|
|
34
|
+
id: string;
|
|
35
|
+
title?: string;
|
|
36
|
+
name?: string;
|
|
37
|
+
artist?: string;
|
|
38
|
+
album?: string;
|
|
39
|
+
playCount: number;
|
|
40
|
+
songCount?: number;
|
|
41
|
+
albumCount?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface MostPlayedResult {
|
|
44
|
+
type: string;
|
|
45
|
+
minPlayCount: number;
|
|
46
|
+
count: number;
|
|
47
|
+
items: MostPlayedItem[];
|
|
48
|
+
}
|
|
49
|
+
export declare function listRecentlyPlayed(client: NavidromeClient, args: unknown): Promise<RecentlyPlayedResult>;
|
|
50
|
+
export declare function listMostPlayed(client: NavidromeClient, args: unknown): Promise<MostPlayedResult>;
|
|
51
|
+
//# sourceMappingURL=listening-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listening-history.d.ts","sourceRoot":"","sources":["../../src/tools/listening-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAgBrE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAQD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyC9G;AASD,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyDtG"}
|