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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Jim Christian
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,244 @@
1
+ # MCP *arr Server
2
+
3
+ [![npm version](https://img.shields.io/npm/v/mcp-arr-server.svg)](https://www.npmjs.com/package/mcp-arr-server)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![MCP](https://img.shields.io/badge/MCP-Compatible-blue)](https://modelcontextprotocol.io)
6
+
7
+ MCP server for the [*arr media management suite](https://wiki.servarr.com/) - Sonarr, Radarr, Lidarr, Readarr, and Prowlarr.
8
+
9
+ ## Why Use This?
10
+
11
+ - **Unified media management** - Control all your *arr applications from one interface
12
+ - **Natural language queries** - Ask about your library in plain English
13
+ - **Cross-service search** - Find content across TV, movies, music, and books simultaneously
14
+ - **Download monitoring** - Check queue status and progress across all services
15
+ - **Calendar integration** - See upcoming releases for all media types
16
+ - **Flexible configuration** - Enable only the services you use
17
+
18
+ ## Features
19
+
20
+ | Category | Capabilities |
21
+ |----------|-------------|
22
+ | **Sonarr (TV)** | List series, search shows, check queue, view calendar |
23
+ | **Radarr (Movies)** | List movies, search films, check queue, view releases |
24
+ | **Lidarr (Music)** | List artists, search musicians, check queue |
25
+ | **Readarr (Books)** | List authors, search writers, check queue |
26
+ | **Prowlarr (Indexers)** | List indexers, search across all trackers |
27
+ | **Cross-Service** | Status check, unified search across all configured services |
28
+
29
+ ## Prerequisites
30
+
31
+ - Node.js 18+
32
+ - At least one *arr application running with API access:
33
+ - [Sonarr](https://sonarr.tv/) for TV series
34
+ - [Radarr](https://radarr.video/) for movies
35
+ - [Lidarr](https://lidarr.audio/) for music
36
+ - [Readarr](https://readarr.com/) for books
37
+ - [Prowlarr](https://prowlarr.com/) for indexer management
38
+
39
+ ## Installation
40
+
41
+ ### Using npm (Recommended)
42
+
43
+ ```bash
44
+ npx mcp-arr-server
45
+ ```
46
+
47
+ ### From Source
48
+
49
+ ```bash
50
+ git clone https://github.com/aplaceforallmystuff/mcp-arr.git
51
+ cd mcp-arr
52
+ npm install
53
+ npm run build
54
+ ```
55
+
56
+ ## Configuration
57
+
58
+ ### Getting API Keys
59
+
60
+ Each *arr application has an API key in Settings > General > Security:
61
+
62
+ 1. Open your *arr application's web interface
63
+ 2. Go to **Settings** > **General**
64
+ 3. Find the **API Key** under the Security section
65
+ 4. Copy the API key for use in configuration
66
+
67
+ ### For Claude Desktop
68
+
69
+ Add to your Claude Desktop config file:
70
+
71
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
72
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
73
+
74
+ ```json
75
+ {
76
+ "mcpServers": {
77
+ "arr": {
78
+ "command": "npx",
79
+ "args": ["-y", "mcp-arr-server"],
80
+ "env": {
81
+ "SONARR_URL": "http://localhost:8989",
82
+ "SONARR_API_KEY": "your-sonarr-api-key",
83
+ "RADARR_URL": "http://localhost:7878",
84
+ "RADARR_API_KEY": "your-radarr-api-key",
85
+ "LIDARR_URL": "http://localhost:8686",
86
+ "LIDARR_API_KEY": "your-lidarr-api-key",
87
+ "READARR_URL": "http://localhost:8787",
88
+ "READARR_API_KEY": "your-readarr-api-key",
89
+ "PROWLARR_URL": "http://localhost:9696",
90
+ "PROWLARR_API_KEY": "your-prowlarr-api-key"
91
+ }
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ### For Claude Code
98
+
99
+ Add to `~/.claude.json`:
100
+
101
+ ```json
102
+ {
103
+ "mcpServers": {
104
+ "arr": {
105
+ "command": "npx",
106
+ "args": ["-y", "mcp-arr-server"],
107
+ "env": {
108
+ "SONARR_URL": "http://localhost:8989",
109
+ "SONARR_API_KEY": "your-sonarr-api-key",
110
+ "RADARR_URL": "http://localhost:7878",
111
+ "RADARR_API_KEY": "your-radarr-api-key"
112
+ }
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ **Note**: Only configure the services you have running. The server automatically detects which services are available based on the environment variables you provide.
119
+
120
+ ## Usage Examples
121
+
122
+ ### Library Management
123
+ - "Show me all my TV series"
124
+ - "What movies do I have in Radarr?"
125
+ - "List all artists in my music library"
126
+ - "How many books do I have by Stephen King?"
127
+
128
+ ### Searching for Content
129
+ - "Search for Breaking Bad on Sonarr"
130
+ - "Find the movie Inception"
131
+ - "Search for Taylor Swift albums"
132
+ - "Look up books by Brandon Sanderson"
133
+
134
+ ### Download Queue
135
+ - "What's downloading right now?"
136
+ - "Check the Sonarr queue"
137
+ - "Show Radarr download progress"
138
+
139
+ ### Upcoming Releases
140
+ - "What TV episodes are coming this week?"
141
+ - "Show upcoming movie releases"
142
+
143
+ ### Cross-Service
144
+ - "Check status of all my *arr services"
145
+ - "Search for 'The Office' across all services"
146
+
147
+ ## Available Tools
148
+
149
+ ### General Tools
150
+
151
+ | Tool | Description |
152
+ |------|-------------|
153
+ | `arr_status` | Get connection status for all configured *arr services |
154
+ | `arr_search_all` | Search across all configured services simultaneously |
155
+
156
+ ### Sonarr Tools (TV)
157
+
158
+ | Tool | Description |
159
+ |------|-------------|
160
+ | `sonarr_get_series` | List all TV series in your library |
161
+ | `sonarr_search` | Search for TV series to add |
162
+ | `sonarr_get_queue` | View current download queue |
163
+ | `sonarr_get_calendar` | See upcoming episodes |
164
+
165
+ ### Radarr Tools (Movies)
166
+
167
+ | Tool | Description |
168
+ |------|-------------|
169
+ | `radarr_get_movies` | List all movies in your library |
170
+ | `radarr_search` | Search for movies to add |
171
+ | `radarr_get_queue` | View current download queue |
172
+ | `radarr_get_calendar` | See upcoming releases |
173
+
174
+ ### Lidarr Tools (Music)
175
+
176
+ | Tool | Description |
177
+ |------|-------------|
178
+ | `lidarr_get_artists` | List all artists in your library |
179
+ | `lidarr_search` | Search for artists to add |
180
+ | `lidarr_get_queue` | View current download queue |
181
+
182
+ ### Readarr Tools (Books)
183
+
184
+ | Tool | Description |
185
+ |------|-------------|
186
+ | `readarr_get_authors` | List all authors in your library |
187
+ | `readarr_search` | Search for authors to add |
188
+ | `readarr_get_queue` | View current download queue |
189
+
190
+ ### Prowlarr Tools (Indexers)
191
+
192
+ | Tool | Description |
193
+ |------|-------------|
194
+ | `prowlarr_get_indexers` | List all configured indexers |
195
+ | `prowlarr_search` | Search across all indexers |
196
+
197
+ ## Development
198
+
199
+ ```bash
200
+ # Watch mode for development
201
+ npm run watch
202
+
203
+ # Build TypeScript
204
+ npm run build
205
+
206
+ # Run locally
207
+ SONARR_URL="http://localhost:8989" SONARR_API_KEY="your-key" node dist/index.js
208
+ ```
209
+
210
+ ## Troubleshooting
211
+
212
+ ### "No *arr services configured"
213
+ Ensure you have set at least one pair of URL and API_KEY environment variables:
214
+ ```bash
215
+ SONARR_URL="http://localhost:8989"
216
+ SONARR_API_KEY="your-api-key"
217
+ ```
218
+
219
+ ### "API error: 401 Unauthorized"
220
+ The API key is incorrect. Verify it in your *arr application under Settings > General > Security.
221
+
222
+ ### "fetch failed" or "ECONNREFUSED"
223
+ The *arr application is not running or the URL is incorrect. Verify:
224
+ - The application is running
225
+ - The URL and port are correct
226
+ - There's no firewall blocking the connection
227
+
228
+ ### "Sonarr/Radarr/etc not configured"
229
+ You tried to use a tool for a service that isn't configured. Add the corresponding URL and API_KEY environment variables.
230
+
231
+ ## Contributing
232
+
233
+ Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
234
+
235
+ ## License
236
+
237
+ MIT - see [LICENSE](LICENSE) for details.
238
+
239
+ ## Links
240
+
241
+ - [Servarr Wiki](https://wiki.servarr.com/) - Documentation for all *arr applications
242
+ - [Sonarr API Docs](https://sonarr.tv/docs/api/)
243
+ - [Model Context Protocol](https://modelcontextprotocol.io)
244
+ - [GitHub Repository](https://github.com/aplaceforallmystuff/mcp-arr)
@@ -0,0 +1,407 @@
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 type ArrService = 'sonarr' | 'radarr' | 'lidarr' | 'readarr' | 'prowlarr';
8
+ export interface ArrConfig {
9
+ url: string;
10
+ apiKey: string;
11
+ }
12
+ export interface SystemStatus {
13
+ appName: string;
14
+ version: string;
15
+ buildTime: string;
16
+ isDebug: boolean;
17
+ isProduction: boolean;
18
+ isAdmin: boolean;
19
+ isUserInteractive: boolean;
20
+ startupPath: string;
21
+ appData: string;
22
+ osName: string;
23
+ isDocker: boolean;
24
+ isLinux: boolean;
25
+ isOsx: boolean;
26
+ isWindows: boolean;
27
+ }
28
+ export interface QueueItem {
29
+ id: number;
30
+ title: string;
31
+ status: string;
32
+ trackedDownloadStatus: string;
33
+ trackedDownloadState: string;
34
+ statusMessages: Array<{
35
+ title: string;
36
+ messages: string[];
37
+ }>;
38
+ downloadId: string;
39
+ protocol: string;
40
+ downloadClient: string;
41
+ outputPath: string;
42
+ sizeleft: number;
43
+ size: number;
44
+ timeleft: string;
45
+ estimatedCompletionTime: string;
46
+ }
47
+ export interface Series {
48
+ id: number;
49
+ title: string;
50
+ sortTitle: string;
51
+ status: string;
52
+ overview: string;
53
+ network: string;
54
+ airTime: string;
55
+ images: Array<{
56
+ coverType: string;
57
+ url: string;
58
+ }>;
59
+ seasons: Array<{
60
+ seasonNumber: number;
61
+ monitored: boolean;
62
+ }>;
63
+ year: number;
64
+ path: string;
65
+ qualityProfileId: number;
66
+ seasonFolder: boolean;
67
+ monitored: boolean;
68
+ runtime: number;
69
+ tvdbId: number;
70
+ tvRageId: number;
71
+ tvMazeId: number;
72
+ firstAired: string;
73
+ seriesType: string;
74
+ cleanTitle: string;
75
+ imdbId: string;
76
+ titleSlug: string;
77
+ genres: string[];
78
+ tags: number[];
79
+ added: string;
80
+ ratings: {
81
+ votes: number;
82
+ value: number;
83
+ };
84
+ statistics: {
85
+ seasonCount: number;
86
+ episodeFileCount: number;
87
+ episodeCount: number;
88
+ totalEpisodeCount: number;
89
+ sizeOnDisk: number;
90
+ percentOfEpisodes: number;
91
+ };
92
+ }
93
+ export interface Movie {
94
+ id: number;
95
+ title: string;
96
+ sortTitle: string;
97
+ sizeOnDisk: number;
98
+ status: string;
99
+ overview: string;
100
+ inCinemas: string;
101
+ physicalRelease: string;
102
+ digitalRelease: string;
103
+ images: Array<{
104
+ coverType: string;
105
+ url: string;
106
+ }>;
107
+ website: string;
108
+ year: number;
109
+ hasFile: boolean;
110
+ youTubeTrailerId: string;
111
+ studio: string;
112
+ path: string;
113
+ qualityProfileId: number;
114
+ monitored: boolean;
115
+ minimumAvailability: string;
116
+ isAvailable: boolean;
117
+ folderName: string;
118
+ runtime: number;
119
+ cleanTitle: string;
120
+ imdbId: string;
121
+ tmdbId: number;
122
+ titleSlug: string;
123
+ genres: string[];
124
+ tags: number[];
125
+ added: string;
126
+ ratings: {
127
+ votes: number;
128
+ value: number;
129
+ };
130
+ movieFile?: {
131
+ id: number;
132
+ relativePath: string;
133
+ path: string;
134
+ size: number;
135
+ dateAdded: string;
136
+ quality: {
137
+ quality: {
138
+ id: number;
139
+ name: string;
140
+ };
141
+ };
142
+ };
143
+ }
144
+ export interface Artist {
145
+ id: number;
146
+ artistName: string;
147
+ sortName: string;
148
+ status: string;
149
+ overview: string;
150
+ artistType: string;
151
+ disambiguation: string;
152
+ links: Array<{
153
+ url: string;
154
+ name: string;
155
+ }>;
156
+ images: Array<{
157
+ coverType: string;
158
+ url: string;
159
+ }>;
160
+ path: string;
161
+ qualityProfileId: number;
162
+ metadataProfileId: number;
163
+ monitored: boolean;
164
+ monitorNewItems: string;
165
+ genres: string[];
166
+ cleanName: string;
167
+ foreignArtistId: string;
168
+ tags: number[];
169
+ added: string;
170
+ ratings: {
171
+ votes: number;
172
+ value: number;
173
+ };
174
+ statistics: {
175
+ albumCount: number;
176
+ trackFileCount: number;
177
+ trackCount: number;
178
+ totalTrackCount: number;
179
+ sizeOnDisk: number;
180
+ percentOfTracks: number;
181
+ };
182
+ }
183
+ export interface Author {
184
+ id: number;
185
+ authorName: string;
186
+ sortName: string;
187
+ status: string;
188
+ overview: string;
189
+ links: Array<{
190
+ url: string;
191
+ name: string;
192
+ }>;
193
+ images: Array<{
194
+ coverType: string;
195
+ url: string;
196
+ }>;
197
+ path: string;
198
+ qualityProfileId: number;
199
+ metadataProfileId: number;
200
+ monitored: boolean;
201
+ monitorNewItems: string;
202
+ genres: string[];
203
+ cleanName: string;
204
+ foreignAuthorId: string;
205
+ tags: number[];
206
+ added: string;
207
+ ratings: {
208
+ votes: number;
209
+ value: number;
210
+ popularity: number;
211
+ };
212
+ statistics: {
213
+ bookFileCount: number;
214
+ bookCount: number;
215
+ totalBookCount: number;
216
+ sizeOnDisk: number;
217
+ percentOfBooks: number;
218
+ };
219
+ }
220
+ export interface Indexer {
221
+ id: number;
222
+ name: string;
223
+ enableRss: boolean;
224
+ enableAutomaticSearch: boolean;
225
+ enableInteractiveSearch: boolean;
226
+ protocol: string;
227
+ priority: number;
228
+ added: string;
229
+ }
230
+ export interface SearchResult {
231
+ title: string;
232
+ sortTitle: string;
233
+ status: string;
234
+ overview: string;
235
+ year: number;
236
+ images: Array<{
237
+ coverType: string;
238
+ url: string;
239
+ }>;
240
+ remotePoster?: string;
241
+ tvdbId?: number;
242
+ tmdbId?: number;
243
+ imdbId?: string;
244
+ foreignArtistId?: string;
245
+ foreignAuthorId?: string;
246
+ }
247
+ export declare class ArrClient {
248
+ private config;
249
+ private serviceName;
250
+ constructor(serviceName: ArrService, config: ArrConfig);
251
+ /**
252
+ * Make an API request
253
+ */
254
+ private request;
255
+ /**
256
+ * Get system status
257
+ */
258
+ getStatus(): Promise<SystemStatus>;
259
+ /**
260
+ * Get download queue
261
+ */
262
+ getQueue(): Promise<{
263
+ records: QueueItem[];
264
+ totalRecords: number;
265
+ }>;
266
+ /**
267
+ * Get calendar items (upcoming releases)
268
+ */
269
+ getCalendar(start?: string, end?: string): Promise<unknown[]>;
270
+ /**
271
+ * Get all root folders
272
+ */
273
+ getRootFolders(): Promise<Array<{
274
+ id: number;
275
+ path: string;
276
+ freeSpace: number;
277
+ }>>;
278
+ /**
279
+ * Get quality profiles
280
+ */
281
+ getQualityProfiles(): Promise<Array<{
282
+ id: number;
283
+ name: string;
284
+ }>>;
285
+ /**
286
+ * Test connection
287
+ */
288
+ testConnection(): Promise<boolean>;
289
+ }
290
+ export declare class SonarrClient extends ArrClient {
291
+ constructor(config: ArrConfig);
292
+ /**
293
+ * Get all series
294
+ */
295
+ getSeries(): Promise<Series[]>;
296
+ /**
297
+ * Get a specific series
298
+ */
299
+ getSeriesById(id: number): Promise<Series>;
300
+ /**
301
+ * Search for series
302
+ */
303
+ searchSeries(term: string): Promise<SearchResult[]>;
304
+ /**
305
+ * Add a series
306
+ */
307
+ addSeries(series: Partial<Series> & {
308
+ tvdbId: number;
309
+ rootFolderPath: string;
310
+ qualityProfileId: number;
311
+ }): Promise<Series>;
312
+ /**
313
+ * Trigger a search for missing episodes
314
+ */
315
+ searchMissing(seriesId: number): Promise<void>;
316
+ }
317
+ export declare class RadarrClient extends ArrClient {
318
+ constructor(config: ArrConfig);
319
+ /**
320
+ * Get all movies
321
+ */
322
+ getMovies(): Promise<Movie[]>;
323
+ /**
324
+ * Get a specific movie
325
+ */
326
+ getMovieById(id: number): Promise<Movie>;
327
+ /**
328
+ * Search for movies
329
+ */
330
+ searchMovies(term: string): Promise<SearchResult[]>;
331
+ /**
332
+ * Add a movie
333
+ */
334
+ addMovie(movie: Partial<Movie> & {
335
+ tmdbId: number;
336
+ rootFolderPath: string;
337
+ qualityProfileId: number;
338
+ }): Promise<Movie>;
339
+ /**
340
+ * Trigger a search for a movie
341
+ */
342
+ searchMovie(movieId: number): Promise<void>;
343
+ }
344
+ export declare class LidarrClient extends ArrClient {
345
+ constructor(config: ArrConfig);
346
+ /**
347
+ * Get all artists
348
+ */
349
+ getArtists(): Promise<Artist[]>;
350
+ /**
351
+ * Get a specific artist
352
+ */
353
+ getArtistById(id: number): Promise<Artist>;
354
+ /**
355
+ * Search for artists
356
+ */
357
+ searchArtists(term: string): Promise<SearchResult[]>;
358
+ /**
359
+ * Add an artist
360
+ */
361
+ addArtist(artist: Partial<Artist> & {
362
+ foreignArtistId: string;
363
+ rootFolderPath: string;
364
+ qualityProfileId: number;
365
+ metadataProfileId: number;
366
+ }): Promise<Artist>;
367
+ }
368
+ export declare class ReadarrClient extends ArrClient {
369
+ constructor(config: ArrConfig);
370
+ /**
371
+ * Get all authors
372
+ */
373
+ getAuthors(): Promise<Author[]>;
374
+ /**
375
+ * Get a specific author
376
+ */
377
+ getAuthorById(id: number): Promise<Author>;
378
+ /**
379
+ * Search for authors
380
+ */
381
+ searchAuthors(term: string): Promise<SearchResult[]>;
382
+ /**
383
+ * Add an author
384
+ */
385
+ addAuthor(author: Partial<Author> & {
386
+ foreignAuthorId: string;
387
+ rootFolderPath: string;
388
+ qualityProfileId: number;
389
+ metadataProfileId: number;
390
+ }): Promise<Author>;
391
+ }
392
+ export declare class ProwlarrClient extends ArrClient {
393
+ constructor(config: ArrConfig);
394
+ /**
395
+ * Get all indexers
396
+ */
397
+ getIndexers(): Promise<Indexer[]>;
398
+ /**
399
+ * Test all indexers
400
+ */
401
+ testAllIndexers(): Promise<void>;
402
+ /**
403
+ * Search across all indexers
404
+ */
405
+ search(query: string, categories?: number[]): Promise<unknown[]>;
406
+ }
407
+ //# sourceMappingURL=arr-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arr-client.d.ts","sourceRoot":"","sources":["../src/arr-client.ts"],"names":[],"mappings":"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"}