mcp-arr-suite 1.3.0 → 1.6.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/README.md CHANGED
@@ -1,15 +1,15 @@
1
1
  # mcp-arr-suite
2
2
 
3
- MCP server for the \*arr media management suite — Sonarr, Radarr, Lidarr, and Prowlarr.
3
+ MCP server for the \*arr media management suite — Sonarr, Radarr, Lidarr, Prowlarr, and SABnzbd.
4
4
 
5
- Exposes your \*arr services as MCP tools consumable by Claude or any MCP-capable client.
5
+ Exposes your media services as MCP tools consumable by Claude or any MCP-capable client. 215 tools across 7 modules.
6
6
 
7
7
  <img width="854" height="739" alt="MCP Suite Image Diagram" src="https://github.com/user-attachments/assets/099d2cb3-ff71-4a27-8816-6e0d66f22a7a" />
8
8
 
9
9
  ## Requirements
10
10
 
11
11
  - Node.js >= 18
12
- - At least one \*arr service running and accessible
12
+ - At least one service running and accessible
13
13
 
14
14
  ## Install
15
15
 
@@ -41,10 +41,14 @@ All configuration is via environment variables. Set at least one service pair:
41
41
  | `LIDARR_API_KEY` | Lidarr API key |
42
42
  | `PROWLARR_URL` | Prowlarr base URL (e.g. `http://localhost:9696`) |
43
43
  | `PROWLARR_API_KEY` | Prowlarr API key |
44
+ | `SABNZBD_URL` | SABnzbd base URL (e.g. `http://localhost:8080`) |
45
+ | `SABNZBD_API_KEY` | SABnzbd API key (from `sabnzbd.ini`, field `api_key`) |
46
+
47
+ Tools are only registered for services that are configured.
44
48
 
45
49
  ## MCP Client Setup
46
50
 
47
- Example Claude Desktop config (npm install):
51
+ Example Claude Desktop / Claude Code config (npm install):
48
52
 
49
53
  ```json
50
54
  {
@@ -52,10 +56,14 @@ Example Claude Desktop config (npm install):
52
56
  "mcp-arr-suite": {
53
57
  "command": "mcp-arr-suite",
54
58
  "env": {
59
+ "SONARR_URL": "http://localhost:8989",
60
+ "SONARR_API_KEY": "...",
55
61
  "RADARR_URL": "http://localhost:7878",
56
62
  "RADARR_API_KEY": "...",
57
- "SONARR_URL": "http://localhost:8989",
58
- "SONARR_API_KEY": "..."
63
+ "PROWLARR_URL": "http://localhost:9696",
64
+ "PROWLARR_API_KEY": "...",
65
+ "SABNZBD_URL": "http://localhost:8080",
66
+ "SABNZBD_API_KEY": "..."
59
67
  }
60
68
  }
61
69
  }
@@ -71,106 +79,77 @@ If running from source, replace `"command": "mcp-arr-suite"` with:
71
79
 
72
80
  ## Tools
73
81
 
74
- Tools are only registered for configured services.
75
-
76
- ### Cross-service
82
+ ### Cross-service (always available)
77
83
  | Tool | Description |
78
84
  |---|---|
79
85
  | `arr_status` | Connection status and version for all configured services |
80
- | `arr_search_all` | Search across all configured services simultaneously |
86
+ | `arr_search_all` | Search across all configured media services simultaneously |
81
87
 
82
- ### Sonarr (TV)
83
- | Tool | Description |
88
+ ### Sonarr — 54 tools
89
+ | Category | Tools |
84
90
  |---|---|
85
- | `sonarr_get_series` | List library with pagination and title filter |
86
- | `sonarr_search` | Search for a series by name (returns tvdbId for adding) |
87
- | `sonarr_add_series` | Add a series |
88
- | `sonarr_delete_series` | Remove a series, optionally deleting files |
89
- | `sonarr_update_series` | Update monitored status, quality profile, tags |
90
- | `sonarr_get_episodes` | List episodes for a series, optionally by season |
91
- | `sonarr_get_episode_files` | File details for all episodes in a series |
92
- | `sonarr_delete_episode_file` | Delete a specific episode file from disk |
93
- | `sonarr_search_missing` | Trigger search for all missing episodes in a series |
94
- | `sonarr_search_episode` | Trigger search for specific episode(s) |
95
- | `sonarr_refresh_series` | Trigger metadata refresh |
96
- | `sonarr_monitor_episodes` | Bulk set monitored/unmonitored on episodes |
97
- | `sonarr_season_pass` | Bulk set monitored status per season |
98
- | `sonarr_get_queue` | Current download queue |
99
- | `sonarr_remove_from_queue` | Remove queue items, optionally blocklisting |
100
- | `sonarr_get_calendar` | Upcoming episode air dates |
101
- | `sonarr_get_history` | Download history, optionally filtered by series |
102
- | `sonarr_get_wanted_missing` | Monitored episodes not yet downloaded |
103
- | `sonarr_get_wanted_cutoff` | Episodes that haven't met the quality cutoff |
104
- | `sonarr_get_blocklist` | Blocked/failed releases |
105
- | `sonarr_delete_from_blocklist` | Remove a blocklist entry |
106
- | `sonarr_get_disk_space` | Disk space for all root folders |
107
- | `sonarr_get_quality_profiles` | Quality profiles |
108
- | `sonarr_get_health` | Health check warnings |
109
- | `sonarr_get_root_folders` | Root folders and free space |
110
- | `sonarr_get_download_clients` | Download client configuration |
111
- | `sonarr_get_naming` | File and folder naming configuration |
112
- | `sonarr_get_tags` | All tags |
113
- | `sonarr_review_setup` | Full configuration review in one call |
114
-
115
- ### Radarr (Movies)
116
- | Tool | Description |
91
+ | Library | `sonarr_get_series`, `sonarr_search`, `sonarr_add_series`, `sonarr_delete_series`, `sonarr_update_series`, `sonarr_bulk_update_series`, `sonarr_bulk_delete_series` |
92
+ | Episodes | `sonarr_get_episodes`, `sonarr_get_episode_files`, `sonarr_delete_episode_file`, `sonarr_delete_episode_files_bulk`, `sonarr_monitor_episodes`, `sonarr_season_pass` |
93
+ | Search & import | `sonarr_search_missing`, `sonarr_search_episode`, `sonarr_search_releases`, `sonarr_grab_release`, `sonarr_get_manual_import`, `sonarr_process_manual_import` |
94
+ | Queue | `sonarr_get_queue`, `sonarr_remove_from_queue`, `sonarr_get_wanted_missing`, `sonarr_get_wanted_cutoff` |
95
+ | History & blocklist | `sonarr_get_history`, `sonarr_get_blocklist`, `sonarr_delete_from_blocklist` |
96
+ | Quality & formats | `sonarr_get_quality_profiles`, `sonarr_get_quality_profile`, `sonarr_update_quality_profile`, `sonarr_update_quality_definition`, `sonarr_list_custom_formats`, `sonarr_get_custom_format`, `sonarr_create_custom_format`, `sonarr_update_custom_format`, `sonarr_delete_custom_format` |
97
+ | Config | `sonarr_get_import_lists`, `sonarr_update_import_list`, `sonarr_get_import_exclusions`, `sonarr_delete_import_exclusion`, `sonarr_get_tags`, `sonarr_create_tag`, `sonarr_delete_tag` |
98
+ | System | `sonarr_get_health`, `sonarr_get_disk_space`, `sonarr_get_root_folders`, `sonarr_get_download_clients`, `sonarr_get_naming`, `sonarr_get_system_tasks`, `sonarr_get_logs`, `sonarr_get_notifications`, `sonarr_get_calendar`, `sonarr_get_command_status` |
99
+ | Commands | `sonarr_refresh_series`, `sonarr_trigger_backup`, `sonarr_trigger_rss_sync`, `sonarr_trigger_refresh_monitored_downloads`, `sonarr_trigger_cutoff_unmet_search`, `sonarr_trigger_rescan_series`, `sonarr_trigger_rename_series`, `sonarr_trigger_downloaded_scan` |
100
+ | Overview | `sonarr_review_setup` |
101
+
102
+ ### Radarr 50 tools
103
+ | Category | Tools |
117
104
  |---|---|
118
- | `radarr_get_movies` | List library with pagination and title filter |
119
- | `radarr_search` | Search for a movie by name (returns tmdbId for adding) |
120
- | `radarr_add_movie` | Add a movie |
121
- | `radarr_delete_movie` | Remove a movie, optionally deleting files |
122
- | `radarr_update_movie` | Update monitored status, quality profile, availability, tags |
123
- | `radarr_get_movie_files` | File details for a movie |
124
- | `radarr_delete_movie_file` | Delete a specific movie file from disk |
125
- | `radarr_search_movie` | Trigger download search for a library movie |
126
- | `radarr_refresh_movie` | Trigger metadata refresh |
127
- | `radarr_get_queue` | Current download queue |
128
- | `radarr_remove_from_queue` | Remove queue items, optionally blocklisting |
129
- | `radarr_get_calendar` | Upcoming movie releases |
130
- | `radarr_get_history` | Download history, optionally filtered by movie |
131
- | `radarr_get_wanted_missing` | Monitored movies not yet downloaded |
132
- | `radarr_get_wanted_cutoff` | Movies that haven't met the quality cutoff |
133
- | `radarr_get_blocklist` | Blocked/failed releases |
134
- | `radarr_delete_from_blocklist` | Remove a blocklist entry |
135
- | `radarr_get_disk_space` | Disk space for all root folders |
136
- | `radarr_get_quality_profiles` | Quality profiles |
137
- | `radarr_get_health` | Health check warnings |
138
- | `radarr_get_root_folders` | Root folders and free space |
139
- | `radarr_get_download_clients` | Download client configuration |
140
- | `radarr_get_naming` | File and folder naming configuration |
141
- | `radarr_get_tags` | All tags |
142
- | `radarr_review_setup` | Full configuration review in one call |
143
-
144
- ### Lidarr (Music)
145
- | Tool | Description |
105
+ | Library | `radarr_get_movies`, `radarr_search`, `radarr_add_movie`, `radarr_delete_movie`, `radarr_update_movie`, `radarr_bulk_update_movies`, `radarr_bulk_delete_movies` |
106
+ | Files | `radarr_get_movie_files`, `radarr_delete_movie_file` |
107
+ | Search & import | `radarr_search_movie`, `radarr_search_releases`, `radarr_grab_release`, `radarr_get_manual_import`, `radarr_process_manual_import` |
108
+ | Queue | `radarr_get_queue`, `radarr_remove_from_queue`, `radarr_get_wanted_missing`, `radarr_get_wanted_cutoff` |
109
+ | History & blocklist | `radarr_get_history`, `radarr_get_blocklist`, `radarr_delete_from_blocklist` |
110
+ | Quality & formats | `radarr_get_quality_profiles`, `radarr_get_quality_profile`, `radarr_update_quality_profile`, `radarr_update_quality_definition`, `radarr_list_custom_formats`, `radarr_get_custom_format`, `radarr_create_custom_format`, `radarr_update_custom_format`, `radarr_delete_custom_format` |
111
+ | Config | `radarr_get_import_lists`, `radarr_update_import_list`, `radarr_get_import_exclusions`, `radarr_delete_import_exclusion`, `radarr_get_tags`, `radarr_create_tag`, `radarr_delete_tag` |
112
+ | System | `radarr_get_health`, `radarr_get_disk_space`, `radarr_get_root_folders`, `radarr_get_download_clients`, `radarr_get_naming`, `radarr_get_system_tasks`, `radarr_get_logs`, `radarr_get_notifications`, `radarr_get_calendar`, `radarr_get_command_status` |
113
+ | Commands | `radarr_refresh_movie`, `radarr_trigger_backup`, `radarr_trigger_rss_sync`, `radarr_trigger_refresh_monitored_downloads`, `radarr_trigger_cutoff_unmet_search`, `radarr_trigger_rescan_movies`, `radarr_trigger_rename_movies`, `radarr_trigger_missing_search`, `radarr_trigger_downloaded_scan` |
114
+ | Overview | `radarr_review_setup` |
115
+
116
+ ### Lidarr 49 tools
117
+ | Category | Tools |
146
118
  |---|---|
147
- | `lidarr_get_artists` | List library with pagination and name filter |
148
- | `lidarr_search` | Search for an artist by name (returns foreignArtistId for adding) |
149
- | `lidarr_add_artist` | Add an artist |
150
- | `lidarr_get_albums` | Albums for an artist with download status |
151
- | `lidarr_search_album` | Trigger download search for a specific album |
152
- | `lidarr_search_missing` | Trigger search for all missing albums for an artist |
153
- | `lidarr_get_queue` | Current download queue |
154
- | `lidarr_get_calendar` | Upcoming album releases |
155
- | `lidarr_get_metadata_profiles` | Metadata profiles (required when adding artists) |
156
- | `lidarr_get_quality_profiles` | Quality profiles |
157
- | `lidarr_get_health` | Health check warnings |
158
- | `lidarr_get_root_folders` | Root folders and free space |
159
- | `lidarr_get_download_clients` | Download client configuration |
160
- | `lidarr_get_naming` | File and folder naming configuration |
161
- | `lidarr_get_tags` | All tags |
162
- | `lidarr_review_setup` | Full configuration review in one call |
163
-
164
- ### Prowlarr (Indexers)
165
- | Tool | Description |
119
+ | Library | `lidarr_get_artists`, `lidarr_search`, `lidarr_add_artist`, `lidarr_delete_artist`, `lidarr_update_artist` |
120
+ | Albums & files | `lidarr_get_albums`, `lidarr_get_album_by_id`, `lidarr_monitor_albums`, `lidarr_get_track_files`, `lidarr_delete_track_file` |
121
+ | Search | `lidarr_search_album`, `lidarr_search_missing` |
122
+ | Queue | `lidarr_get_queue`, `lidarr_remove_from_queue`, `lidarr_get_wanted_missing`, `lidarr_get_wanted_cutoff` |
123
+ | History & blocklist | `lidarr_get_history`, `lidarr_get_blocklist`, `lidarr_delete_from_blocklist` |
124
+ | Quality & formats | `lidarr_get_quality_profiles`, `lidarr_get_quality_profile`, `lidarr_update_quality_profile`, `lidarr_update_quality_definition`, `lidarr_list_custom_formats`, `lidarr_get_custom_format`, `lidarr_create_custom_format`, `lidarr_update_custom_format`, `lidarr_delete_custom_format` |
125
+ | Config | `lidarr_get_metadata_profiles`, `lidarr_get_import_lists`, `lidarr_update_import_list`, `lidarr_get_import_exclusions`, `lidarr_delete_import_exclusion`, `lidarr_get_tags`, `lidarr_create_tag`, `lidarr_delete_tag` |
126
+ | System | `lidarr_get_health`, `lidarr_get_disk_space`, `lidarr_get_root_folders`, `lidarr_get_download_clients`, `lidarr_get_naming`, `lidarr_get_system_tasks`, `lidarr_get_logs`, `lidarr_get_notifications`, `lidarr_get_calendar`, `lidarr_get_command_status` |
127
+ | Commands | `lidarr_refresh_artist`, `lidarr_trigger_backup`, `lidarr_trigger_rss_sync`, `lidarr_trigger_refresh_monitored_downloads`, `lidarr_trigger_cutoff_unmet_search`, `lidarr_trigger_rescan_artists`, `lidarr_trigger_rename_artists`, `lidarr_trigger_refresh_all_artists`, `lidarr_trigger_downloaded_scan` |
128
+ | Overview | `lidarr_review_setup` |
129
+
130
+ ### Prowlarr 24 tools
131
+ | Category | Tools |
166
132
  |---|---|
167
- | `prowlarr_get_indexers` | All configured indexers |
168
- | `prowlarr_search` | Search across all indexers |
169
- | `prowlarr_test_indexers` | Test all indexers and return health status |
170
- | `prowlarr_get_stats` | Indexer query/grab statistics |
171
- | `prowlarr_get_health` | Health check warnings |
172
-
173
- ### TRaSH Guides (always available)
133
+ | Indexers | `prowlarr_get_indexers`, `prowlarr_get_indexer`, `prowlarr_update_indexer`, `prowlarr_test_indexer`, `prowlarr_test_indexers`, `prowlarr_search` |
134
+ | Applications | `prowlarr_get_apps`, `prowlarr_update_app` |
135
+ | Stats & history | `prowlarr_get_stats`, `prowlarr_get_history` |
136
+ | Config | `prowlarr_get_tags`, `prowlarr_create_tag`, `prowlarr_delete_tag`, `prowlarr_get_download_clients`, `prowlarr_get_notifications`, `prowlarr_test_notification` |
137
+ | System | `prowlarr_get_status`, `prowlarr_get_health`, `prowlarr_get_logs`, `prowlarr_get_system_tasks`, `prowlarr_get_command_status` |
138
+ | Commands | `prowlarr_trigger_backup`, `prowlarr_trigger_rss_sync`, `prowlarr_sync_apps` |
139
+
140
+ ### SABnzbd — 29 tools
141
+ | Category | Tools |
142
+ |---|---|
143
+ | Queue | `sabnzbd_get_queue`, `sabnzbd_pause`, `sabnzbd_resume`, `sabnzbd_set_priority`, `sabnzbd_set_speed_limit`, `sabnzbd_change_cat`, `sabnzbd_change_opts` |
144
+ | History | `sabnzbd_get_history`, `sabnzbd_retry`, `sabnzbd_retry_all`, `sabnzbd_mark_completed`, `sabnzbd_purge_failed` |
145
+ | Delete | `sabnzbd_delete`, `sabnzbd_delete_orphans` |
146
+ | Post-processing | `sabnzbd_pause_pp`, `sabnzbd_resume_pp`, `sabnzbd_add_orphans` |
147
+ | Add NZBs | `sabnzbd_add_url` |
148
+ | Config | `sabnzbd_get_cats`, `sabnzbd_get_scripts`, `sabnzbd_get_paths` |
149
+ | System | `sabnzbd_get_status`, `sabnzbd_get_warnings`, `sabnzbd_unblock_server`, `sabnzbd_server_stats`, `sabnzbd_version` |
150
+ | Triggers | `sabnzbd_rss_now`, `sabnzbd_watched_now`, `sabnzbd_get_files` |
151
+
152
+ ### TRaSH Guides — 7 tools (always available)
174
153
  | Tool | Description |
175
154
  |---|---|
176
155
  | `trash_list_profiles` | List recommended quality profiles from TRaSH Guides |
@@ -184,11 +163,13 @@ Tools are only registered for configured services.
184
163
  ## Testing
185
164
 
186
165
  ```bash
187
- # Unit tests (mocked, no services required)
166
+ # Unit tests (MSW mocks, no services required)
188
167
  npm test
189
168
 
190
169
  # Live smoke tests against real services
191
- RADARR_URL=http://localhost:7878 RADARR_API_KEY=... npm run test:live
170
+ SONARR_URL=http://localhost:8989 SONARR_API_KEY=... \
171
+ RADARR_URL=http://localhost:7878 RADARR_API_KEY=... \
172
+ npm run test:live
192
173
  ```
193
174
 
194
175
  Additional live test variables:
@@ -197,9 +178,13 @@ Additional live test variables:
197
178
  |---|---|
198
179
  | `MCP_ARR_LIVE_SEARCH_TERM` | Override default search term (default: `dune`) |
199
180
  | `MCP_ARR_ENABLE_TRASH=1` | Include TRaSH Guides smoke tests |
200
- | `MCP_ARR_ENABLE_COMMAND_SMOKE=1` | Include safe command tests (refresh, search) |
181
+ | `MCP_ARR_ENABLE_COMMAND_SMOKE=1` | Include command tests (refresh, scan, trigger, etc.) |
201
182
  | `RADARR_TEST_MOVIE_ID` | Movie ID for command smoke tests |
183
+ | `RADARR_TEST_DOWNLOADS_PATH` | Downloads path for `radarr_trigger_downloaded_scan` (default: `/downloads/complete`) |
202
184
  | `SONARR_TEST_SERIES_ID` | Series ID for command smoke tests |
185
+ | `SONARR_TEST_EPISODE_ID` | Episode ID for release search tests |
186
+ | `SONARR_TEST_DOWNLOADS_PATH` | Downloads path for `sonarr_trigger_downloaded_scan` (default: `/downloads/complete`) |
187
+ | `SONARR_TEST_IMPORT_FOLDER` | Folder for manual import tests (default: `/tmp`) |
203
188
  | `LIDARR_TEST_ARTIST_ID` | Artist ID for command smoke tests |
204
189
 
205
190
  ## API Documentation
@@ -208,6 +193,7 @@ Additional live test variables:
208
193
  - [Radarr API](https://wiki.servarr.com/radarr/api)
209
194
  - [Lidarr API](https://wiki.servarr.com/lidarr/api)
210
195
  - [Prowlarr API](https://wiki.servarr.com/prowlarr/api)
196
+ - [SABnzbd API](https://sabnzbd.org/wiki/advanced/api)
211
197
  - [TRaSH Guides](https://trash-guides.info)
212
198
 
213
199
  ## License
@@ -345,6 +345,65 @@ export interface MetadataProfile {
345
345
  allowedLanguages?: string;
346
346
  minPages?: number;
347
347
  }
348
+ export interface TrackFile {
349
+ id: number;
350
+ artistId: number;
351
+ albumId: number;
352
+ path: string;
353
+ size: number;
354
+ dateAdded: string;
355
+ quality?: {
356
+ quality?: {
357
+ name: string;
358
+ };
359
+ };
360
+ qualityCutoffNotMet?: boolean;
361
+ mediaInfo?: {
362
+ audioFormat?: string;
363
+ audioBitrate?: number;
364
+ audioChannels?: number;
365
+ audioBits?: number;
366
+ audioSampleRate?: number;
367
+ };
368
+ }
369
+ export interface LidarrHistoryRecord {
370
+ id: number;
371
+ artistId: number;
372
+ albumId: number;
373
+ sourceTitle: string;
374
+ quality: {
375
+ quality: {
376
+ id: number;
377
+ name: string;
378
+ };
379
+ };
380
+ date: string;
381
+ eventType: string;
382
+ data: Record<string, string>;
383
+ }
384
+ export interface LidarrBlocklistRecord {
385
+ id: number;
386
+ artistId: number;
387
+ sourceTitle: string;
388
+ quality: {
389
+ quality: {
390
+ id: number;
391
+ name: string;
392
+ };
393
+ };
394
+ date: string;
395
+ protocol: string;
396
+ indexer: string;
397
+ message: string;
398
+ }
399
+ export interface LidarrWantedRecord {
400
+ page: number;
401
+ pageSize: number;
402
+ sortKey: string;
403
+ sortDirection: string;
404
+ totalRecords: number;
405
+ records: Album[];
406
+ }
348
407
  export interface DiskSpace {
349
408
  path: string;
350
409
  label: string;
@@ -552,6 +611,40 @@ export interface ImportExclusion {
552
611
  tvdbId?: number;
553
612
  tmdbId?: number;
554
613
  }
614
+ export interface ManualImportItem {
615
+ id: number;
616
+ path: string;
617
+ relativePath: string;
618
+ folderName: string;
619
+ name: string;
620
+ size: number;
621
+ movie?: {
622
+ id: number;
623
+ title: string;
624
+ year: number;
625
+ };
626
+ series?: {
627
+ id: number;
628
+ title: string;
629
+ };
630
+ seasonNumber?: number;
631
+ episodes?: Array<{
632
+ id: number;
633
+ title: string;
634
+ }>;
635
+ quality: {
636
+ quality: {
637
+ name: string;
638
+ };
639
+ revision: {
640
+ version: number;
641
+ };
642
+ };
643
+ rejections: Array<{
644
+ reason: string;
645
+ type: string;
646
+ }>;
647
+ }
555
648
  export interface CustomFormat {
556
649
  id: number;
557
650
  name: string;
@@ -569,6 +662,72 @@ export interface CustomFormat {
569
662
  }>;
570
663
  }>;
571
664
  }
665
+ export interface ImportList {
666
+ id: number;
667
+ name: string;
668
+ implementation: string;
669
+ implementationName: string;
670
+ enabled: boolean;
671
+ enableAuto: boolean;
672
+ shouldMonitor: boolean;
673
+ qualityProfileId: number;
674
+ tags: number[];
675
+ fields: Array<{
676
+ name: string;
677
+ value: unknown;
678
+ }>;
679
+ }
680
+ export interface Notification {
681
+ id: number;
682
+ name: string;
683
+ implementation: string;
684
+ implementationName: string;
685
+ onGrab: boolean;
686
+ onDownload: boolean;
687
+ onUpgrade: boolean;
688
+ onRename: boolean;
689
+ onHealthIssue: boolean;
690
+ onApplicationUpdate: boolean;
691
+ supportsOnGrab: boolean;
692
+ supportsOnDownload: boolean;
693
+ supportsOnUpgrade: boolean;
694
+ supportsOnRename: boolean;
695
+ supportsOnHealthIssue: boolean;
696
+ supportsOnApplicationUpdate: boolean;
697
+ tags: number[];
698
+ fields: Array<{
699
+ name: string;
700
+ value: unknown;
701
+ }>;
702
+ }
703
+ export interface SystemTask {
704
+ id: number;
705
+ name: string;
706
+ taskName: string;
707
+ interval: number;
708
+ lastExecution: string;
709
+ lastStartTime: string;
710
+ nextExecution: string;
711
+ lastDuration: string;
712
+ isRunning: boolean;
713
+ }
714
+ export interface LogEntry {
715
+ id: number;
716
+ time: string;
717
+ level: string;
718
+ logger: string;
719
+ message: string;
720
+ exception?: string;
721
+ exceptionType?: string;
722
+ }
723
+ export interface LogPage {
724
+ page: number;
725
+ pageSize: number;
726
+ sortKey: string;
727
+ sortDirection: string;
728
+ totalRecords: number;
729
+ records: LogEntry[];
730
+ }
572
731
  export interface ProwlarrApplication {
573
732
  id: number;
574
733
  name: string;
@@ -648,6 +807,7 @@ export declare class ArrClient {
648
807
  getCalendar(start?: string, end?: string): Promise<unknown[]>;
649
808
  getQualityProfiles(): Promise<QualityProfile[]>;
650
809
  getQualityDefinitions(): Promise<QualityDefinition[]>;
810
+ updateQualityDefinition(id: number, definition: QualityDefinition): Promise<QualityDefinition>;
651
811
  getDownloadClients(): Promise<DownloadClient[]>;
652
812
  getNamingConfig(): Promise<NamingConfig>;
653
813
  getMediaManagement(): Promise<MediaManagementConfig>;
@@ -658,11 +818,31 @@ export declare class ArrClient {
658
818
  getQualityProfile(id: number): Promise<QualityProfile>;
659
819
  updateQualityProfile(id: number, profile: QualityProfile): Promise<QualityProfile>;
660
820
  getCustomFormats(): Promise<CustomFormat[]>;
821
+ getCustomFormat(id: number): Promise<CustomFormat>;
822
+ createCustomFormat(format: Omit<CustomFormat, 'id'>): Promise<CustomFormat>;
823
+ updateCustomFormat(id: number, format: CustomFormat): Promise<CustomFormat>;
824
+ deleteCustomFormat(id: number): Promise<void>;
825
+ getSystemTasks(): Promise<SystemTask[]>;
826
+ getLogs(page: number, pageSize: number, level?: string): Promise<LogPage>;
827
+ triggerBackup(): Promise<{
828
+ id: number;
829
+ }>;
830
+ getNotifications(): Promise<Notification[]>;
831
+ getImportLists(): Promise<ImportList[]>;
832
+ updateImportList(id: number, importList: ImportList): Promise<ImportList>;
661
833
  createTag(label: string): Promise<Tag>;
662
834
  deleteTag(id: number): Promise<void>;
663
835
  runCommand(name: string, extra?: Record<string, unknown>): Promise<{
664
836
  id: number;
665
837
  }>;
838
+ getCommandStatus(commandId: number): Promise<{
839
+ id: number;
840
+ name: string;
841
+ status: string;
842
+ message: string;
843
+ started?: string;
844
+ ended?: string;
845
+ }>;
666
846
  testConnection(): Promise<boolean>;
667
847
  }
668
848
  export declare class SonarrClient extends ArrClient {
@@ -682,11 +862,23 @@ export declare class SonarrClient extends ArrClient {
682
862
  searchEpisode(episodeIds: number[]): Promise<{
683
863
  id: number;
684
864
  }>;
685
- refreshSeries(seriesId: number): Promise<{
865
+ refreshSeries(seriesId?: number): Promise<{
686
866
  id: number;
687
867
  }>;
688
868
  deleteSeries(seriesId: number, deleteFiles?: boolean, addImportListExclusion?: boolean): Promise<void>;
689
869
  updateSeries(seriesId: number, changes: Partial<Series>): Promise<Series>;
870
+ rescanAllSeries(): Promise<{
871
+ id: number;
872
+ }>;
873
+ bulkUpdateSeries(seriesIds: number[], changes: {
874
+ monitored?: boolean;
875
+ qualityProfileId?: number;
876
+ tags?: number[];
877
+ applyTags?: 'add' | 'remove' | 'replace';
878
+ }): Promise<void>;
879
+ bulkDeleteSeries(seriesIds: number[], deleteFiles?: boolean, addImportListExclusion?: boolean): Promise<void>;
880
+ getManualImport(folder: string, filterExistingFiles?: boolean, page?: number, pageSize?: number): Promise<ManualImportItem[]>;
881
+ processManualImport(items: ManualImportItem[]): Promise<void>;
690
882
  getDiskSpace(): Promise<DiskSpace[]>;
691
883
  getHistory(seriesId?: number, page?: number, pageSize?: number): Promise<{
692
884
  records: SeriesHistoryRecord[];
@@ -698,6 +890,7 @@ export declare class SonarrClient extends ArrClient {
698
890
  getWantedCutoff(page?: number, pageSize?: number): Promise<SeriesWantedRecord>;
699
891
  getEpisodeFiles(seriesId: number): Promise<EpisodeFile[]>;
700
892
  deleteEpisodeFile(fileId: number): Promise<void>;
893
+ deleteEpisodeFiles(ids: number[]): Promise<void>;
701
894
  getBlocklist(page?: number, pageSize?: number): Promise<{
702
895
  records: SeriesBlocklistRecord[];
703
896
  totalRecords: number;
@@ -730,11 +923,23 @@ export declare class RadarrClient extends ArrClient {
730
923
  searchMovie(movieId: number): Promise<{
731
924
  id: number;
732
925
  }>;
733
- refreshMovie(movieId: number): Promise<{
926
+ refreshMovie(movieId?: number): Promise<{
734
927
  id: number;
735
928
  }>;
736
929
  deleteMovie(movieId: number, deleteFiles?: boolean, addImportExclusion?: boolean): Promise<void>;
737
930
  updateMovie(movieId: number, changes: Partial<Movie>): Promise<Movie>;
931
+ rescanAllMovies(): Promise<{
932
+ id: number;
933
+ }>;
934
+ bulkUpdateMovies(movieIds: number[], changes: {
935
+ monitored?: boolean;
936
+ qualityProfileId?: number;
937
+ tags?: number[];
938
+ applyTags?: 'add' | 'remove' | 'replace';
939
+ }): Promise<void>;
940
+ bulkDeleteMovies(movieIds: number[], deleteFiles?: boolean, addImportExclusion?: boolean): Promise<void>;
941
+ getManualImport(folder: string, filterExistingFiles?: boolean, page?: number, pageSize?: number): Promise<ManualImportItem[]>;
942
+ processManualImport(items: ManualImportItem[]): Promise<void>;
738
943
  getDiskSpace(): Promise<DiskSpace[]>;
739
944
  getHistory(movieId?: number, page?: number, pageSize?: number): Promise<{
740
945
  records: HistoryRecord[];
@@ -777,6 +982,30 @@ export declare class LidarrClient extends ArrClient {
777
982
  }>;
778
983
  getCalendar(start?: string, end?: string): Promise<Album[]>;
779
984
  getMetadataProfiles(): Promise<MetadataProfile[]>;
985
+ deleteArtist(artistId: number, deleteFiles?: boolean, addImportListExclusion?: boolean): Promise<void>;
986
+ updateArtist(artistId: number, changes: Partial<Artist>): Promise<Artist>;
987
+ refreshArtist(artistId: number): Promise<{
988
+ id: number;
989
+ }>;
990
+ getTrackFiles(artistId: number): Promise<TrackFile[]>;
991
+ deleteTrackFile(fileId: number): Promise<void>;
992
+ removeFromQueue(queueId: number, blocklist?: boolean, removeFromClient?: boolean): Promise<void>;
993
+ removeFromQueueBulk(ids: number[], blocklist?: boolean, removeFromClient?: boolean): Promise<void>;
994
+ getWantedMissing(page?: number, pageSize?: number): Promise<LidarrWantedRecord>;
995
+ getWantedCutoff(page?: number, pageSize?: number): Promise<LidarrWantedRecord>;
996
+ getHistory(artistId?: number, page?: number, pageSize?: number): Promise<{
997
+ records: LidarrHistoryRecord[];
998
+ totalRecords: number;
999
+ }>;
1000
+ getBlocklist(page?: number, pageSize?: number): Promise<{
1001
+ records: LidarrBlocklistRecord[];
1002
+ totalRecords: number;
1003
+ }>;
1004
+ deleteFromBlocklist(blocklistId: number): Promise<void>;
1005
+ getDiskSpace(): Promise<DiskSpace[]>;
1006
+ monitorAlbums(albumIds: number[], monitored: boolean): Promise<void>;
1007
+ getImportExclusions(): Promise<ImportExclusion[]>;
1008
+ deleteImportExclusion(id: number): Promise<void>;
780
1009
  }
781
1010
  export declare class ProwlarrClient extends ArrClient {
782
1011
  constructor(config: ArrConfig);
@@ -800,5 +1029,19 @@ export declare class ProwlarrClient extends ArrClient {
800
1029
  getTags(): Promise<Tag[]>;
801
1030
  getDownloadClients(): Promise<DownloadClient[]>;
802
1031
  getApplications(): Promise<ProwlarrApplication[]>;
1032
+ getIndexer(id: number): Promise<Indexer & Record<string, unknown>>;
1033
+ testIndexer(indexer: Indexer & Record<string, unknown>): Promise<{
1034
+ id: number;
1035
+ isValid: boolean;
1036
+ validationFailures: Array<{
1037
+ propertyName: string;
1038
+ errorMessage: string;
1039
+ }>;
1040
+ }>;
1041
+ updateIndexer(id: number, patch: Partial<Pick<Indexer, 'enableRss' | 'enableAutomaticSearch' | 'enableInteractiveSearch' | 'priority'>>): Promise<Indexer & Record<string, unknown>>;
1042
+ getApplication(id: number): Promise<ProwlarrApplication>;
1043
+ updateApplication(id: number, patch: {
1044
+ syncLevel: string;
1045
+ }): Promise<ProwlarrApplication>;
803
1046
  }
804
1047
  //# sourceMappingURL=arr-client.d.ts.map