mcp-arr-server 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.
@@ -0,0 +1,291 @@
1
+ /**
2
+ * *arr Suite API Client
3
+ *
4
+ * All *arr applications (Sonarr, Radarr, Lidarr, Readarr, Prowlarr) use
5
+ * the same REST API pattern with X-Api-Key header authentication.
6
+ */
7
+ export class ArrClient {
8
+ config;
9
+ serviceName;
10
+ constructor(serviceName, config) {
11
+ this.serviceName = serviceName;
12
+ this.config = {
13
+ url: config.url.replace(/\/$/, ''),
14
+ apiKey: config.apiKey
15
+ };
16
+ }
17
+ /**
18
+ * Make an API request
19
+ */
20
+ async request(endpoint, options = {}) {
21
+ const url = `${this.config.url}/api/v3${endpoint}`;
22
+ const headers = {
23
+ 'Content-Type': 'application/json',
24
+ 'X-Api-Key': this.config.apiKey,
25
+ ...(options.headers || {}),
26
+ };
27
+ const response = await fetch(url, {
28
+ ...options,
29
+ headers,
30
+ });
31
+ if (!response.ok) {
32
+ const text = await response.text();
33
+ throw new Error(`${this.serviceName} API error: ${response.status} ${response.statusText} - ${text}`);
34
+ }
35
+ return response.json();
36
+ }
37
+ /**
38
+ * Get system status
39
+ */
40
+ async getStatus() {
41
+ return this.request('/system/status');
42
+ }
43
+ /**
44
+ * Get download queue
45
+ */
46
+ async getQueue() {
47
+ return this.request('/queue?includeUnknownSeriesItems=true&includeUnknownMovieItems=true');
48
+ }
49
+ /**
50
+ * Get calendar items (upcoming releases)
51
+ */
52
+ async getCalendar(start, end) {
53
+ const params = new URLSearchParams();
54
+ if (start)
55
+ params.append('start', start);
56
+ if (end)
57
+ params.append('end', end);
58
+ const query = params.toString() ? `?${params.toString()}` : '';
59
+ return this.request(`/calendar${query}`);
60
+ }
61
+ /**
62
+ * Get all root folders
63
+ */
64
+ async getRootFolders() {
65
+ return this.request('/rootfolder');
66
+ }
67
+ /**
68
+ * Get quality profiles
69
+ */
70
+ async getQualityProfiles() {
71
+ return this.request('/qualityprofile');
72
+ }
73
+ /**
74
+ * Test connection
75
+ */
76
+ async testConnection() {
77
+ try {
78
+ await this.getStatus();
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ }
86
+ // Service-specific clients
87
+ export class SonarrClient extends ArrClient {
88
+ constructor(config) {
89
+ super('sonarr', config);
90
+ }
91
+ /**
92
+ * Get all series
93
+ */
94
+ async getSeries() {
95
+ return this['request']('/series');
96
+ }
97
+ /**
98
+ * Get a specific series
99
+ */
100
+ async getSeriesById(id) {
101
+ return this['request'](`/series/${id}`);
102
+ }
103
+ /**
104
+ * Search for series
105
+ */
106
+ async searchSeries(term) {
107
+ return this['request'](`/series/lookup?term=${encodeURIComponent(term)}`);
108
+ }
109
+ /**
110
+ * Add a series
111
+ */
112
+ async addSeries(series) {
113
+ return this['request']('/series', {
114
+ method: 'POST',
115
+ body: JSON.stringify({
116
+ ...series,
117
+ monitored: series.monitored ?? true,
118
+ seasonFolder: series.seasonFolder ?? true,
119
+ addOptions: {
120
+ searchForMissingEpisodes: true,
121
+ },
122
+ }),
123
+ });
124
+ }
125
+ /**
126
+ * Trigger a search for missing episodes
127
+ */
128
+ async searchMissing(seriesId) {
129
+ await this['request']('/command', {
130
+ method: 'POST',
131
+ body: JSON.stringify({
132
+ name: 'SeriesSearch',
133
+ seriesId,
134
+ }),
135
+ });
136
+ }
137
+ }
138
+ export class RadarrClient extends ArrClient {
139
+ constructor(config) {
140
+ super('radarr', config);
141
+ }
142
+ /**
143
+ * Get all movies
144
+ */
145
+ async getMovies() {
146
+ return this['request']('/movie');
147
+ }
148
+ /**
149
+ * Get a specific movie
150
+ */
151
+ async getMovieById(id) {
152
+ return this['request'](`/movie/${id}`);
153
+ }
154
+ /**
155
+ * Search for movies
156
+ */
157
+ async searchMovies(term) {
158
+ return this['request'](`/movie/lookup?term=${encodeURIComponent(term)}`);
159
+ }
160
+ /**
161
+ * Add a movie
162
+ */
163
+ async addMovie(movie) {
164
+ return this['request']('/movie', {
165
+ method: 'POST',
166
+ body: JSON.stringify({
167
+ ...movie,
168
+ monitored: movie.monitored ?? true,
169
+ addOptions: {
170
+ searchForMovie: true,
171
+ },
172
+ }),
173
+ });
174
+ }
175
+ /**
176
+ * Trigger a search for a movie
177
+ */
178
+ async searchMovie(movieId) {
179
+ await this['request']('/command', {
180
+ method: 'POST',
181
+ body: JSON.stringify({
182
+ name: 'MoviesSearch',
183
+ movieIds: [movieId],
184
+ }),
185
+ });
186
+ }
187
+ }
188
+ export class LidarrClient extends ArrClient {
189
+ constructor(config) {
190
+ super('lidarr', config);
191
+ }
192
+ /**
193
+ * Get all artists
194
+ */
195
+ async getArtists() {
196
+ return this['request']('/artist');
197
+ }
198
+ /**
199
+ * Get a specific artist
200
+ */
201
+ async getArtistById(id) {
202
+ return this['request'](`/artist/${id}`);
203
+ }
204
+ /**
205
+ * Search for artists
206
+ */
207
+ async searchArtists(term) {
208
+ return this['request'](`/artist/lookup?term=${encodeURIComponent(term)}`);
209
+ }
210
+ /**
211
+ * Add an artist
212
+ */
213
+ async addArtist(artist) {
214
+ return this['request']('/artist', {
215
+ method: 'POST',
216
+ body: JSON.stringify({
217
+ ...artist,
218
+ monitored: artist.monitored ?? true,
219
+ addOptions: {
220
+ searchForMissingAlbums: true,
221
+ },
222
+ }),
223
+ });
224
+ }
225
+ }
226
+ export class ReadarrClient extends ArrClient {
227
+ constructor(config) {
228
+ super('readarr', config);
229
+ }
230
+ /**
231
+ * Get all authors
232
+ */
233
+ async getAuthors() {
234
+ return this['request']('/author');
235
+ }
236
+ /**
237
+ * Get a specific author
238
+ */
239
+ async getAuthorById(id) {
240
+ return this['request'](`/author/${id}`);
241
+ }
242
+ /**
243
+ * Search for authors
244
+ */
245
+ async searchAuthors(term) {
246
+ return this['request'](`/author/lookup?term=${encodeURIComponent(term)}`);
247
+ }
248
+ /**
249
+ * Add an author
250
+ */
251
+ async addAuthor(author) {
252
+ return this['request']('/author', {
253
+ method: 'POST',
254
+ body: JSON.stringify({
255
+ ...author,
256
+ monitored: author.monitored ?? true,
257
+ addOptions: {
258
+ searchForMissingBooks: true,
259
+ },
260
+ }),
261
+ });
262
+ }
263
+ }
264
+ export class ProwlarrClient extends ArrClient {
265
+ constructor(config) {
266
+ super('prowlarr', config);
267
+ }
268
+ /**
269
+ * Get all indexers
270
+ */
271
+ async getIndexers() {
272
+ return this['request']('/indexer');
273
+ }
274
+ /**
275
+ * Test all indexers
276
+ */
277
+ async testAllIndexers() {
278
+ await this['request']('/indexer/testall', { method: 'POST' });
279
+ }
280
+ /**
281
+ * Search across all indexers
282
+ */
283
+ async search(query, categories) {
284
+ const params = new URLSearchParams({ query });
285
+ if (categories) {
286
+ categories.forEach(c => params.append('categories', c.toString()));
287
+ }
288
+ return this['request'](`/search?${params.toString()}`);
289
+ }
290
+ }
291
+ //# sourceMappingURL=arr-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arr-client.js","sourceRoot":"","sources":["../src/arr-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server for *arr Media Management Suite
4
+ *
5
+ * Provides tools for managing Sonarr (TV), Radarr (Movies), Lidarr (Music),
6
+ * Readarr (Books), and Prowlarr (Indexers) through Claude Code.
7
+ *
8
+ * Environment variables:
9
+ * - SONARR_URL, SONARR_API_KEY
10
+ * - RADARR_URL, RADARR_API_KEY
11
+ * - LIDARR_URL, LIDARR_API_KEY
12
+ * - READARR_URL, READARR_API_KEY
13
+ * - PROWLARR_URL, PROWLARR_API_KEY
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}