mcp-arr-suite 1.0.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.
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/dist/clients/arr-client.d.ts +681 -0
- package/dist/clients/arr-client.d.ts.map +1 -0
- package/dist/clients/arr-client.js +367 -0
- package/dist/clients/arr-client.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +16 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +32 -0
- package/dist/registry.js.map +1 -0
- package/dist/services/cross-service.d.ts +8 -0
- package/dist/services/cross-service.d.ts.map +1 -0
- package/dist/services/cross-service.js +113 -0
- package/dist/services/cross-service.js.map +1 -0
- package/dist/services/lidarr.d.ts +6 -0
- package/dist/services/lidarr.d.ts.map +1 -0
- package/dist/services/lidarr.js +263 -0
- package/dist/services/lidarr.js.map +1 -0
- package/dist/services/prowlarr.d.ts +10 -0
- package/dist/services/prowlarr.d.ts.map +1 -0
- package/dist/services/prowlarr.js +140 -0
- package/dist/services/prowlarr.js.map +1 -0
- package/dist/services/radarr.d.ts +9 -0
- package/dist/services/radarr.d.ts.map +1 -0
- package/dist/services/radarr.js +574 -0
- package/dist/services/radarr.js.map +1 -0
- package/dist/services/sonarr.d.ts +9 -0
- package/dist/services/sonarr.d.ts.map +1 -0
- package/dist/services/sonarr.js +696 -0
- package/dist/services/sonarr.js.map +1 -0
- package/dist/shared/config-tools.d.ts +15 -0
- package/dist/shared/config-tools.d.ts.map +1 -0
- package/dist/shared/config-tools.js +225 -0
- package/dist/shared/config-tools.js.map +1 -0
- package/dist/shared/formatting.d.ts +37 -0
- package/dist/shared/formatting.d.ts.map +1 -0
- package/dist/shared/formatting.js +57 -0
- package/dist/shared/formatting.js.map +1 -0
- package/dist/trash/client.d.ts +127 -0
- package/dist/trash/client.d.ts.map +1 -0
- package/dist/trash/client.js +289 -0
- package/dist/trash/client.js.map +1 -0
- package/dist/trash/tools.d.ts +13 -0
- package/dist/trash/tools.d.ts.map +1 -0
- package/dist/trash/tools.js +377 -0
- package/dist/trash/tools.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-service tools: arr_status and arr_search_all
|
|
3
|
+
*
|
|
4
|
+
* These tools operate across all configured services simultaneously.
|
|
5
|
+
*/
|
|
6
|
+
import { ok } from '../types.js';
|
|
7
|
+
import { truncate } from '../shared/formatting.js';
|
|
8
|
+
export const crossServiceModule = {
|
|
9
|
+
tools: [
|
|
10
|
+
{
|
|
11
|
+
name: 'arr_status',
|
|
12
|
+
description: 'Get connection status and version info for all configured *arr services. Use this to verify which services are running and reachable.',
|
|
13
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'arr_search_all',
|
|
17
|
+
description: 'Search across all configured *arr services simultaneously. Returns top 5 results per service. Useful for finding whether something is already tracked in any service.',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
term: { type: 'string', description: 'Search term (title, artist name, etc.)' },
|
|
22
|
+
},
|
|
23
|
+
required: ['term'],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
handlers: {
|
|
28
|
+
arr_status: async (_args, clients) => {
|
|
29
|
+
const results = {};
|
|
30
|
+
for (const [name, client] of Object.entries(clients)) {
|
|
31
|
+
if (!client)
|
|
32
|
+
continue;
|
|
33
|
+
try {
|
|
34
|
+
const status = await client.getStatus();
|
|
35
|
+
results[name] = {
|
|
36
|
+
configured: true,
|
|
37
|
+
connected: true,
|
|
38
|
+
version: status.version,
|
|
39
|
+
appName: status.appName,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
results[name] = {
|
|
44
|
+
configured: true,
|
|
45
|
+
connected: false,
|
|
46
|
+
error: error instanceof Error ? error.message : String(error),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return ok(results);
|
|
51
|
+
},
|
|
52
|
+
arr_search_all: async (args, clients) => {
|
|
53
|
+
const term = args.term;
|
|
54
|
+
const results = {};
|
|
55
|
+
if (clients.sonarr) {
|
|
56
|
+
try {
|
|
57
|
+
const hits = await clients.sonarr.searchSeries(term);
|
|
58
|
+
results['sonarr'] = {
|
|
59
|
+
count: hits.length,
|
|
60
|
+
results: hits.slice(0, 5).map(r => ({
|
|
61
|
+
title: r.title,
|
|
62
|
+
year: r.year,
|
|
63
|
+
tvdbId: r.tvdbId,
|
|
64
|
+
status: r.status,
|
|
65
|
+
overview: truncate(r.overview, 150),
|
|
66
|
+
})),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
results['sonarr'] = { error: e instanceof Error ? e.message : String(e) };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (clients.radarr) {
|
|
74
|
+
try {
|
|
75
|
+
const hits = await clients.radarr.searchMovies(term);
|
|
76
|
+
results['radarr'] = {
|
|
77
|
+
count: hits.length,
|
|
78
|
+
results: hits.slice(0, 5).map(r => ({
|
|
79
|
+
title: r.title,
|
|
80
|
+
year: r.year,
|
|
81
|
+
tmdbId: r.tmdbId,
|
|
82
|
+
imdbId: r.imdbId,
|
|
83
|
+
status: r.status,
|
|
84
|
+
overview: truncate(r.overview, 150),
|
|
85
|
+
})),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
results['radarr'] = { error: e instanceof Error ? e.message : String(e) };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (clients.lidarr) {
|
|
93
|
+
try {
|
|
94
|
+
const hits = await clients.lidarr.searchArtists(term);
|
|
95
|
+
results['lidarr'] = {
|
|
96
|
+
count: hits.length,
|
|
97
|
+
results: hits.slice(0, 5).map(r => ({
|
|
98
|
+
artistName: r.artistName ?? r.title,
|
|
99
|
+
disambiguation: r.disambiguation,
|
|
100
|
+
foreignArtistId: r.foreignArtistId,
|
|
101
|
+
overview: truncate(r.overview, 150),
|
|
102
|
+
})),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
results['lidarr'] = { error: e instanceof Error ? e.message : String(e) };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return ok({ term, results });
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=cross-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-service.js","sourceRoot":"","sources":["../../src/services/cross-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lidarr.d.ts","sourceRoot":"","sources":["../../src/services/lidarr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,eAAO,MAAM,YAAY,EAAE,UA4R1B,CAAC"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lidarr (Music) ToolModule
|
|
3
|
+
*/
|
|
4
|
+
import { ok } from '../types.js';
|
|
5
|
+
import { formatBytes, truncate, paginate, clampLimit, clampOffset, today, daysFromNow } from '../shared/formatting.js';
|
|
6
|
+
export const lidarrModule = {
|
|
7
|
+
tools: [
|
|
8
|
+
{
|
|
9
|
+
name: 'lidarr_get_artists',
|
|
10
|
+
description: 'Get artists from the Lidarr library. Returns summary fields only. Default limit=25 to keep context usage low.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
limit: { type: 'number', description: 'Results per page (default: 25, max: 100)' },
|
|
15
|
+
offset: { type: 'number', description: 'Skip N results (default: 0)' },
|
|
16
|
+
search: { type: 'string', description: 'Case-insensitive name filter' },
|
|
17
|
+
},
|
|
18
|
+
required: [],
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'lidarr_search',
|
|
23
|
+
description: 'Search for artists by name. Returns top 10 results with foreignArtistId needed for lidarr_add_artist.',
|
|
24
|
+
inputSchema: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
term: { type: 'string', description: 'Artist name to search for' },
|
|
28
|
+
},
|
|
29
|
+
required: ['term'],
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'lidarr_get_queue',
|
|
34
|
+
description: 'Get current Lidarr download queue. Shows active downloads and their progress.',
|
|
35
|
+
inputSchema: {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: {
|
|
38
|
+
limit: { type: 'number', description: 'Max queue items to return (default: 10)' },
|
|
39
|
+
},
|
|
40
|
+
required: [],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'lidarr_get_albums',
|
|
45
|
+
description: 'Get albums for an artist. Shows which albums are available and which are missing.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
artistId: { type: 'number', description: 'Artist ID (from lidarr_get_artists)' },
|
|
50
|
+
},
|
|
51
|
+
required: ['artistId'],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'lidarr_search_album',
|
|
56
|
+
description: 'Trigger a download search for a specific album.',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
albumId: { type: 'number', description: 'Album ID (from lidarr_get_albums)' },
|
|
61
|
+
},
|
|
62
|
+
required: ['albumId'],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'lidarr_search_missing',
|
|
67
|
+
description: 'Trigger a search for all missing albums for an artist.',
|
|
68
|
+
inputSchema: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: {
|
|
71
|
+
artistId: { type: 'number', description: 'Artist ID (from lidarr_get_artists)' },
|
|
72
|
+
},
|
|
73
|
+
required: ['artistId'],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'lidarr_get_calendar',
|
|
78
|
+
description: 'Get upcoming album releases from Lidarr.',
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
days: { type: 'number', description: 'Days to look ahead (default: 30)' },
|
|
83
|
+
},
|
|
84
|
+
required: [],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'lidarr_get_metadata_profiles',
|
|
89
|
+
description: 'Get available metadata profiles for Lidarr. Use this to find valid metadataProfileId values when adding an artist.',
|
|
90
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'lidarr_add_artist',
|
|
94
|
+
description: 'Add an artist to Lidarr. Use lidarr_search for foreignArtistId, lidarr_get_root_folders for rootFolderPath, lidarr_get_quality_profiles for qualityProfileId, lidarr_get_metadata_profiles for metadataProfileId, and lidarr_get_tags for tag IDs.',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: {
|
|
98
|
+
foreignArtistId: {
|
|
99
|
+
type: 'string',
|
|
100
|
+
description: 'MusicBrainz artist ID from lidarr_search results',
|
|
101
|
+
},
|
|
102
|
+
artistName: { type: 'string', description: 'Artist name' },
|
|
103
|
+
qualityProfileId: { type: 'number', description: 'Quality profile ID' },
|
|
104
|
+
metadataProfileId: { type: 'number', description: 'Metadata profile ID' },
|
|
105
|
+
rootFolderPath: { type: 'string', description: 'Root folder path' },
|
|
106
|
+
monitored: { type: 'boolean', description: 'Monitor the artist (default: true)' },
|
|
107
|
+
tags: {
|
|
108
|
+
type: 'array',
|
|
109
|
+
items: { type: 'number' },
|
|
110
|
+
description: 'Tag IDs (optional)',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
required: ['foreignArtistId', 'artistName', 'qualityProfileId', 'metadataProfileId', 'rootFolderPath'],
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
handlers: {
|
|
118
|
+
lidarr_get_artists: async (args, clients) => {
|
|
119
|
+
if (!clients.lidarr)
|
|
120
|
+
throw new Error('Lidarr is not configured');
|
|
121
|
+
const limit = clampLimit(args.limit ?? 25);
|
|
122
|
+
const offset = clampOffset(args.offset ?? 0);
|
|
123
|
+
const search = args.search?.trim().toLowerCase();
|
|
124
|
+
const all = await clients.lidarr.getArtists();
|
|
125
|
+
const filtered = search
|
|
126
|
+
? all.filter(a => a.artistName.toLowerCase().includes(search))
|
|
127
|
+
: all;
|
|
128
|
+
const page = filtered.slice(offset, offset + limit);
|
|
129
|
+
return ok({
|
|
130
|
+
...paginate(page.map(a => ({
|
|
131
|
+
id: a.id,
|
|
132
|
+
artistName: a.artistName,
|
|
133
|
+
status: a.status,
|
|
134
|
+
albums: a.statistics?.albumCount,
|
|
135
|
+
tracks: `${a.statistics?.trackFileCount ?? 0}/${a.statistics?.totalTrackCount ?? 0}`,
|
|
136
|
+
sizeOnDisk: formatBytes(a.statistics?.sizeOnDisk ?? 0),
|
|
137
|
+
monitored: a.monitored,
|
|
138
|
+
qualityProfileId: a.qualityProfileId,
|
|
139
|
+
})), filtered.length, offset, limit),
|
|
140
|
+
...(search ? { search } : {}),
|
|
141
|
+
totalLibrary: all.length,
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
lidarr_search: async (args, clients) => {
|
|
145
|
+
if (!clients.lidarr)
|
|
146
|
+
throw new Error('Lidarr is not configured');
|
|
147
|
+
const term = args.term;
|
|
148
|
+
const results = await clients.lidarr.searchArtists(term);
|
|
149
|
+
return ok({
|
|
150
|
+
count: results.length,
|
|
151
|
+
results: results.slice(0, 10).map(r => ({
|
|
152
|
+
artistName: r.artistName ?? r.title,
|
|
153
|
+
disambiguation: r.disambiguation,
|
|
154
|
+
foreignArtistId: r.foreignArtistId,
|
|
155
|
+
overview: truncate(r.overview, 200),
|
|
156
|
+
})),
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
lidarr_get_queue: async (args, clients) => {
|
|
160
|
+
if (!clients.lidarr)
|
|
161
|
+
throw new Error('Lidarr is not configured');
|
|
162
|
+
const limit = clampLimit(args.limit ?? 10);
|
|
163
|
+
const queue = await clients.lidarr.getQueue();
|
|
164
|
+
const items = queue.records.slice(0, limit);
|
|
165
|
+
return ok({
|
|
166
|
+
totalRecords: queue.totalRecords,
|
|
167
|
+
returned: items.length,
|
|
168
|
+
items: items.map(q => ({
|
|
169
|
+
title: q.title,
|
|
170
|
+
status: q.status,
|
|
171
|
+
progress: q.size > 0 ? `${((1 - q.sizeleft / q.size) * 100).toFixed(1)}%` : '0%',
|
|
172
|
+
timeLeft: q.timeleft,
|
|
173
|
+
downloadClient: q.downloadClient,
|
|
174
|
+
})),
|
|
175
|
+
});
|
|
176
|
+
},
|
|
177
|
+
lidarr_get_albums: async (args, clients) => {
|
|
178
|
+
if (!clients.lidarr)
|
|
179
|
+
throw new Error('Lidarr is not configured');
|
|
180
|
+
const artistId = args.artistId;
|
|
181
|
+
const albums = await clients.lidarr.getAlbums(artistId);
|
|
182
|
+
return ok({
|
|
183
|
+
count: albums.length,
|
|
184
|
+
albums: albums.map(a => ({
|
|
185
|
+
id: a.id,
|
|
186
|
+
title: a.title,
|
|
187
|
+
releaseDate: a.releaseDate,
|
|
188
|
+
albumType: a.albumType,
|
|
189
|
+
monitored: a.monitored,
|
|
190
|
+
tracks: a.statistics
|
|
191
|
+
? `${a.statistics.trackFileCount}/${a.statistics.totalTrackCount}`
|
|
192
|
+
: 'unknown',
|
|
193
|
+
sizeOnDisk: formatBytes(a.statistics?.sizeOnDisk ?? 0),
|
|
194
|
+
percentComplete: a.statistics?.percentOfTracks ?? 0,
|
|
195
|
+
grabbed: a.grabbed,
|
|
196
|
+
})),
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
lidarr_search_album: async (args, clients) => {
|
|
200
|
+
if (!clients.lidarr)
|
|
201
|
+
throw new Error('Lidarr is not configured');
|
|
202
|
+
const albumId = args.albumId;
|
|
203
|
+
const result = await clients.lidarr.searchAlbum(albumId);
|
|
204
|
+
return ok({ success: true, message: 'Search triggered for album', commandId: result.id });
|
|
205
|
+
},
|
|
206
|
+
lidarr_search_missing: async (args, clients) => {
|
|
207
|
+
if (!clients.lidarr)
|
|
208
|
+
throw new Error('Lidarr is not configured');
|
|
209
|
+
const artistId = args.artistId;
|
|
210
|
+
const result = await clients.lidarr.searchMissingAlbums(artistId);
|
|
211
|
+
return ok({ success: true, message: 'Search triggered for missing albums', commandId: result.id });
|
|
212
|
+
},
|
|
213
|
+
lidarr_get_calendar: async (args, clients) => {
|
|
214
|
+
if (!clients.lidarr)
|
|
215
|
+
throw new Error('Lidarr is not configured');
|
|
216
|
+
const days = args.days ?? 30;
|
|
217
|
+
const calendar = await clients.lidarr.getCalendar(today(), daysFromNow(days));
|
|
218
|
+
return ok({
|
|
219
|
+
days,
|
|
220
|
+
count: calendar.length,
|
|
221
|
+
albums: calendar.map(a => ({
|
|
222
|
+
id: a.id,
|
|
223
|
+
title: a.title,
|
|
224
|
+
artistId: a.artistId,
|
|
225
|
+
releaseDate: a.releaseDate,
|
|
226
|
+
albumType: a.albumType,
|
|
227
|
+
monitored: a.monitored,
|
|
228
|
+
})),
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
lidarr_get_metadata_profiles: async (_args, clients) => {
|
|
232
|
+
if (!clients.lidarr)
|
|
233
|
+
throw new Error('Lidarr is not configured');
|
|
234
|
+
const profiles = await clients.lidarr.getMetadataProfiles();
|
|
235
|
+
return ok({
|
|
236
|
+
count: profiles.length,
|
|
237
|
+
profiles: profiles.map(p => ({ id: p.id, name: p.name })),
|
|
238
|
+
});
|
|
239
|
+
},
|
|
240
|
+
lidarr_add_artist: async (args, clients) => {
|
|
241
|
+
if (!clients.lidarr)
|
|
242
|
+
throw new Error('Lidarr is not configured');
|
|
243
|
+
const { foreignArtistId, artistName, qualityProfileId, metadataProfileId, rootFolderPath, monitored, tags, } = args;
|
|
244
|
+
const added = await clients.lidarr.addArtist({
|
|
245
|
+
foreignArtistId,
|
|
246
|
+
artistName,
|
|
247
|
+
qualityProfileId,
|
|
248
|
+
metadataProfileId,
|
|
249
|
+
rootFolderPath,
|
|
250
|
+
monitored,
|
|
251
|
+
tags: tags ?? [],
|
|
252
|
+
});
|
|
253
|
+
return ok({
|
|
254
|
+
success: true,
|
|
255
|
+
message: `Added "${added.artistName}" to Lidarr`,
|
|
256
|
+
id: added.id,
|
|
257
|
+
path: added.path,
|
|
258
|
+
monitored: added.monitored,
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=lidarr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lidarr.js","sourceRoot":"","sources":["../../src/services/lidarr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEvH,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,KAAK,EAAE;QACL;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EACT,+GAA+G;YACjH,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;oBAClF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;oBACtE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;iBACxE;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EACT,uGAAuG;YACzG,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;iBACnE;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,+EAA+E;YAC5F,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;iBAClF;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EACT,mFAAmF;YACrF,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;iBACjF;gBACD,QAAQ,EAAE,CAAC,UAAU,CAAC;aACvB;SACF;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,iDAAiD;YAC9D,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;iBAC9E;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EAAE,wDAAwD;YACrE,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;iBACjF;gBACD,QAAQ,EAAE,CAAC,UAAU,CAAC;aACvB;SACF;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,0CAA0C;YACvD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;iBAC1E;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,8BAA8B;YACpC,WAAW,EACT,oHAAoH;YACtH,WAAW,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;SACvE;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EACT,oPAAoP;YACtP,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,kDAAkD;qBAChE;oBACD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;oBAC1D,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;oBACvE,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;oBACzE,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;oBACnE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oCAAoC,EAAE;oBACjF,IAAI,EAAE;wBACJ,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,oBAAoB;qBAClC;iBACF;gBACD,QAAQ,EAAE,CAAC,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;aACvG;SACF;KACF;IAED,QAAQ,EAAE;QACR,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC1C,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,UAAU,CAAE,IAAI,CAAC,KAA4B,IAAI,EAAE,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,WAAW,CAAE,IAAI,CAAC,MAA6B,IAAI,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,GAAI,IAAI,CAAC,MAA6B,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAEzE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM;gBACrB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC9D,CAAC,CAAC,GAAG,CAAC;YACR,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YAEpD,OAAO,EAAE,CAAC;gBACR,GAAG,QAAQ,CACT,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACb,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,UAAU;oBAChC,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,eAAe,IAAI,CAAC,EAAE;oBACpF,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,IAAI,CAAC,CAAC;oBACtD,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;iBACrC,CAAC,CAAC,EACH,QAAQ,CAAC,MAAM,EACf,MAAM,EACN,KAAK,CACN;gBACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,YAAY,EAAE,GAAG,CAAC,MAAM;aACzB,CAAC,CAAC;QACL,CAAC;QAED,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;gBACR,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtC,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK;oBACnC,cAAc,EAAE,CAAC,CAAC,cAAc;oBAChC,eAAe,EAAE,CAAC,CAAC,eAAe;oBAClC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC;iBACpC,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACxC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,UAAU,CAAE,IAAI,CAAC,KAA4B,IAAI,EAAE,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;gBACR,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,QAAQ,EAAE,KAAK,CAAC,MAAM;gBACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACrB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;oBAChF,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,cAAc,EAAE,CAAC,CAAC,cAAc;iBACjC,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;gBACR,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACvB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,MAAM,EAAE,CAAC,CAAC,UAAU;wBAClB,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,CAAC,UAAU,CAAC,eAAe,EAAE;wBAClE,CAAC,CAAC,SAAS;oBACb,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,IAAI,CAAC,CAAC;oBACtD,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE,eAAe,IAAI,CAAC;oBACnD,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC7C,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAClE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,qCAAqC,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACrG,CAAC;QAED,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,IAAI,GAAI,IAAI,CAAC,IAA2B,IAAI,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9E,OAAO,EAAE,CAAC;gBACR,IAAI;gBACJ,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrD,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC5D,OAAO,EAAE,CAAC;gBACR,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;QAED,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjE,MAAM,EACJ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,IAAI,GACL,GAAG,IAQH,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;gBAC3C,eAAe;gBACf,UAAU;gBACV,gBAAgB;gBAChB,iBAAiB;gBACjB,cAAc;gBACd,SAAS;gBACT,IAAI,EAAE,IAAI,IAAI,EAAE;aACjB,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;gBACR,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,KAAK,CAAC,UAAU,aAAa;gBAChD,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prowlarr (Indexer Management) ToolModule
|
|
3
|
+
*
|
|
4
|
+
* Prowlarr has a different config structure — it does not use the standard
|
|
5
|
+
* naming/media-management config, so it skips buildConfigModule and defines
|
|
6
|
+
* all its tools here directly.
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolModule } from '../types.js';
|
|
9
|
+
export declare const prowlarrModule: ToolModule;
|
|
10
|
+
//# sourceMappingURL=prowlarr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prowlarr.d.ts","sourceRoot":"","sources":["../../src/services/prowlarr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,eAAO,MAAM,cAAc,EAAE,UAkI5B,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prowlarr (Indexer Management) ToolModule
|
|
3
|
+
*
|
|
4
|
+
* Prowlarr has a different config structure — it does not use the standard
|
|
5
|
+
* naming/media-management config, so it skips buildConfigModule and defines
|
|
6
|
+
* all its tools here directly.
|
|
7
|
+
*/
|
|
8
|
+
import { ok } from '../types.js';
|
|
9
|
+
export const prowlarrModule = {
|
|
10
|
+
tools: [
|
|
11
|
+
{
|
|
12
|
+
name: 'prowlarr_get_indexers',
|
|
13
|
+
description: 'Get all configured indexers in Prowlarr.',
|
|
14
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'prowlarr_search',
|
|
18
|
+
description: 'Search across all Prowlarr indexers.',
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
term: { type: 'string', description: 'Search term' },
|
|
23
|
+
},
|
|
24
|
+
required: ['term'],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'prowlarr_test_indexers',
|
|
29
|
+
description: 'Test all indexers and return their health status.',
|
|
30
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'prowlarr_get_stats',
|
|
34
|
+
description: 'Get indexer statistics: queries, grabs, failures, and average response times.',
|
|
35
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'prowlarr_get_health',
|
|
39
|
+
description: 'Get health check warnings from Prowlarr.',
|
|
40
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
handlers: {
|
|
44
|
+
prowlarr_get_indexers: async (_args, clients) => {
|
|
45
|
+
if (!clients.prowlarr)
|
|
46
|
+
throw new Error('Prowlarr is not configured');
|
|
47
|
+
const indexers = await clients.prowlarr.getIndexers();
|
|
48
|
+
return ok({
|
|
49
|
+
count: indexers.length,
|
|
50
|
+
indexers: indexers.map(i => ({
|
|
51
|
+
id: i.id,
|
|
52
|
+
name: i.name,
|
|
53
|
+
protocol: i.protocol,
|
|
54
|
+
enableRss: i.enableRss,
|
|
55
|
+
enableAutomaticSearch: i.enableAutomaticSearch,
|
|
56
|
+
enableInteractiveSearch: i.enableInteractiveSearch,
|
|
57
|
+
priority: i.priority,
|
|
58
|
+
})),
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
prowlarr_search: async (args, clients) => {
|
|
62
|
+
if (!clients.prowlarr)
|
|
63
|
+
throw new Error('Prowlarr is not configured');
|
|
64
|
+
const query = args.term;
|
|
65
|
+
const results = await clients.prowlarr.search(query);
|
|
66
|
+
const items = results;
|
|
67
|
+
return ok({
|
|
68
|
+
count: items.length,
|
|
69
|
+
results: items.slice(0, 25).map(r => ({
|
|
70
|
+
title: r['title'],
|
|
71
|
+
indexer: r['indexer'],
|
|
72
|
+
size: r['size'],
|
|
73
|
+
seeders: r['seeders'],
|
|
74
|
+
leechers: r['leechers'],
|
|
75
|
+
publishDate: r['publishDate'],
|
|
76
|
+
downloadUrl: r['downloadUrl'],
|
|
77
|
+
})),
|
|
78
|
+
note: items.length > 25 ? `Showing first 25 of ${items.length} results` : undefined,
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
prowlarr_test_indexers: async (_args, clients) => {
|
|
82
|
+
if (!clients.prowlarr)
|
|
83
|
+
throw new Error('Prowlarr is not configured');
|
|
84
|
+
const [results, indexers] = await Promise.all([
|
|
85
|
+
clients.prowlarr.testAllIndexers(),
|
|
86
|
+
clients.prowlarr.getIndexers(),
|
|
87
|
+
]);
|
|
88
|
+
const indexerMap = new Map(indexers.map(i => [i.id, i.name]));
|
|
89
|
+
return ok({
|
|
90
|
+
count: results.length,
|
|
91
|
+
healthy: results.filter(r => r.isValid).length,
|
|
92
|
+
failed: results.filter(r => !r.isValid).length,
|
|
93
|
+
indexers: results.map(r => ({
|
|
94
|
+
id: r.id,
|
|
95
|
+
name: indexerMap.get(r.id) ?? 'Unknown',
|
|
96
|
+
isValid: r.isValid,
|
|
97
|
+
errors: r.validationFailures.map(f => f.errorMessage),
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
prowlarr_get_stats: async (_args, clients) => {
|
|
102
|
+
if (!clients.prowlarr)
|
|
103
|
+
throw new Error('Prowlarr is not configured');
|
|
104
|
+
const stats = await clients.prowlarr.getIndexerStats();
|
|
105
|
+
return ok({
|
|
106
|
+
count: stats.indexers.length,
|
|
107
|
+
totals: {
|
|
108
|
+
queries: stats.indexers.reduce((s, i) => s + i.numberOfQueries, 0),
|
|
109
|
+
grabs: stats.indexers.reduce((s, i) => s + i.numberOfGrabs, 0),
|
|
110
|
+
failedQueries: stats.indexers.reduce((s, i) => s + i.numberOfFailedQueries, 0),
|
|
111
|
+
failedGrabs: stats.indexers.reduce((s, i) => s + i.numberOfFailedGrabs, 0),
|
|
112
|
+
},
|
|
113
|
+
indexers: stats.indexers.map(s => ({
|
|
114
|
+
name: s.indexerName,
|
|
115
|
+
queries: s.numberOfQueries,
|
|
116
|
+
grabs: s.numberOfGrabs,
|
|
117
|
+
failedQueries: s.numberOfFailedQueries,
|
|
118
|
+
failedGrabs: s.numberOfFailedGrabs,
|
|
119
|
+
avgResponseTime: `${s.averageResponseTime}ms`,
|
|
120
|
+
})),
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
prowlarr_get_health: async (_args, clients) => {
|
|
124
|
+
if (!clients.prowlarr)
|
|
125
|
+
throw new Error('Prowlarr is not configured');
|
|
126
|
+
const health = await clients.prowlarr.getHealth();
|
|
127
|
+
return ok({
|
|
128
|
+
status: health.length === 0 ? 'healthy' : 'issues detected',
|
|
129
|
+
issueCount: health.length,
|
|
130
|
+
issues: health.map(h => ({
|
|
131
|
+
source: h.source,
|
|
132
|
+
type: h.type,
|
|
133
|
+
message: h.message,
|
|
134
|
+
wikiUrl: h.wikiUrl,
|
|
135
|
+
})),
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=prowlarr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prowlarr.js","sourceRoot":"","sources":["../../src/services/prowlarr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Radarr (Movies) ToolModule
|
|
3
|
+
*
|
|
4
|
+
* Tool definitions and handlers live together — scroll down from any
|
|
5
|
+
* tool schema to find its implementation directly below it.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolModule } from '../types.js';
|
|
8
|
+
export declare const radarrModule: ToolModule;
|
|
9
|
+
//# sourceMappingURL=radarr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radarr.d.ts","sourceRoot":"","sources":["../../src/services/radarr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,eAAO,MAAM,YAAY,EAAE,UAolB1B,CAAC"}
|