@cyanheads/seerr-mcp-server 0.1.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.
Files changed (73) hide show
  1. package/AGENTS.md +407 -0
  2. package/CLAUDE.md +407 -0
  3. package/Dockerfile +121 -0
  4. package/LICENSE +201 -0
  5. package/README.md +302 -0
  6. package/changelog/0.1.x/0.1.0.md +26 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +27 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +45 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +9 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +24 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/index.d.ts +47 -0
  17. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/index.js +8 -0
  19. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/request.resource.d.ts +53 -0
  21. package/dist/mcp-server/resources/definitions/request.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/request.resource.js +70 -0
  23. package/dist/mcp-server/resources/definitions/request.resource.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/get-media.tool.d.ts +66 -0
  25. package/dist/mcp-server/tools/definitions/get-media.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/get-media.tool.js +197 -0
  27. package/dist/mcp-server/tools/definitions/get-media.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/index.d.ts +341 -0
  29. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/index.js +22 -0
  31. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/list-requests.tool.d.ts +76 -0
  33. package/dist/mcp-server/tools/definitions/list-requests.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/list-requests.tool.js +187 -0
  35. package/dist/mcp-server/tools/definitions/list-requests.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/request-media.tool.d.ts +117 -0
  37. package/dist/mcp-server/tools/definitions/request-media.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/request-media.tool.js +347 -0
  39. package/dist/mcp-server/tools/definitions/request-media.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/request-status.tool.d.ts +55 -0
  41. package/dist/mcp-server/tools/definitions/request-status.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/request-status.tool.js +111 -0
  43. package/dist/mcp-server/tools/definitions/request-status.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/search-media.tool.d.ts +51 -0
  45. package/dist/mcp-server/tools/definitions/search-media.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/search-media.tool.js +167 -0
  47. package/dist/mcp-server/tools/definitions/search-media.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/service-options.tool.d.ts +51 -0
  49. package/dist/mcp-server/tools/definitions/service-options.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/service-options.tool.js +195 -0
  51. package/dist/mcp-server/tools/definitions/service-options.tool.js.map +1 -0
  52. package/dist/services/seerr/errors.d.ts +33 -0
  53. package/dist/services/seerr/errors.d.ts.map +1 -0
  54. package/dist/services/seerr/errors.js +74 -0
  55. package/dist/services/seerr/errors.js.map +1 -0
  56. package/dist/services/seerr/normalizers.d.ts +111 -0
  57. package/dist/services/seerr/normalizers.d.ts.map +1 -0
  58. package/dist/services/seerr/normalizers.js +179 -0
  59. package/dist/services/seerr/normalizers.js.map +1 -0
  60. package/dist/services/seerr/seerr-service.d.ts +92 -0
  61. package/dist/services/seerr/seerr-service.d.ts.map +1 -0
  62. package/dist/services/seerr/seerr-service.js +187 -0
  63. package/dist/services/seerr/seerr-service.js.map +1 -0
  64. package/dist/services/seerr/status.d.ts +27 -0
  65. package/dist/services/seerr/status.d.ts.map +1 -0
  66. package/dist/services/seerr/status.js +70 -0
  67. package/dist/services/seerr/status.js.map +1 -0
  68. package/dist/services/seerr/types.d.ts +221 -0
  69. package/dist/services/seerr/types.d.ts.map +1 -0
  70. package/dist/services/seerr/types.js +11 -0
  71. package/dist/services/seerr/types.js.map +1 -0
  72. package/package.json +86 -0
  73. package/server.json +137 -0
@@ -0,0 +1,341 @@
1
+ /**
2
+ * @fileoverview Barrel collecting every tool definition into `allToolDefinitions`
3
+ * for `createApp()`. The agent workflow is: discover (search) → confirm (get) →
4
+ * understand routing (service_options) → request (request_media) → track
5
+ * (request_status / list_requests).
6
+ * @module mcp-server/tools/definitions/index
7
+ */
8
+ export declare const allToolDefinitions: (import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
9
+ mediaType: import("zod").ZodEnum<{
10
+ movie: "movie";
11
+ tv: "tv";
12
+ }>;
13
+ tmdbId: import("zod").ZodNumber;
14
+ seasonNumber: import("zod").ZodOptional<import("zod").ZodNumber>;
15
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
16
+ tmdbId: import("zod").ZodNumber;
17
+ mediaType: import("zod").ZodEnum<{
18
+ movie: "movie";
19
+ tv: "tv";
20
+ }>;
21
+ title: import("zod").ZodString;
22
+ year: import("zod").ZodOptional<import("zod").ZodNumber>;
23
+ overview: import("zod").ZodOptional<import("zod").ZodString>;
24
+ runtimeMinutes: import("zod").ZodOptional<import("zod").ZodNumber>;
25
+ productionStatus: import("zod").ZodOptional<import("zod").ZodString>;
26
+ availability: import("zod").ZodObject<{
27
+ tracked: import("zod").ZodBoolean;
28
+ status: import("zod").ZodObject<{
29
+ raw: import("zod").ZodNumber;
30
+ label: import("zod").ZodString;
31
+ }, import("zod/v4/core").$strip>;
32
+ status4k: import("zod").ZodOptional<import("zod").ZodObject<{
33
+ raw: import("zod").ZodNumber;
34
+ label: import("zod").ZodString;
35
+ }, import("zod/v4/core").$strip>>;
36
+ openRequest: import("zod").ZodOptional<import("zod").ZodObject<{
37
+ requestId: import("zod").ZodNumber;
38
+ status: import("zod").ZodObject<{
39
+ raw: import("zod").ZodNumber;
40
+ label: import("zod").ZodString;
41
+ }, import("zod/v4/core").$strip>;
42
+ is4k: import("zod").ZodBoolean;
43
+ }, import("zod/v4/core").$strip>>;
44
+ }, import("zod/v4/core").$strip>;
45
+ seasons: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
46
+ seasonNumber: import("zod").ZodNumber;
47
+ name: import("zod").ZodString;
48
+ episodeCount: import("zod").ZodNumber;
49
+ airDate: import("zod").ZodNullable<import("zod").ZodString>;
50
+ }, import("zod/v4/core").$strip>>>;
51
+ episodes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
52
+ episodeNumber: import("zod").ZodNumber;
53
+ name: import("zod").ZodString;
54
+ airDate: import("zod").ZodNullable<import("zod").ZodString>;
55
+ overview: import("zod").ZodOptional<import("zod").ZodString>;
56
+ }, import("zod/v4/core").$strip>>>;
57
+ }, import("zod/v4/core").$strip>, readonly [{
58
+ readonly reason: "media_not_found";
59
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
60
+ readonly when: "The TMDB ID does not resolve to a movie/show (Seerr returns HTTP 500 \"Unable to retrieve movie.\").";
61
+ readonly recovery: "Call seerr_search_media to find the correct tmdbId, then retry with the exact ID and matching mediaType.";
62
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
63
+ filter: import("zod").ZodDefault<import("zod").ZodEnum<{
64
+ pending: "pending";
65
+ approved: "approved";
66
+ failed: "failed";
67
+ completed: "completed";
68
+ processing: "processing";
69
+ available: "available";
70
+ deleted: "deleted";
71
+ all: "all";
72
+ unavailable: "unavailable";
73
+ }>>;
74
+ mediaType: import("zod").ZodDefault<import("zod").ZodEnum<{
75
+ movie: "movie";
76
+ tv: "tv";
77
+ all: "all";
78
+ }>>;
79
+ requestedById: import("zod").ZodOptional<import("zod").ZodNumber>;
80
+ sort: import("zod").ZodDefault<import("zod").ZodEnum<{
81
+ added: "added";
82
+ modified: "modified";
83
+ }>>;
84
+ sortDirection: import("zod").ZodDefault<import("zod").ZodEnum<{
85
+ asc: "asc";
86
+ desc: "desc";
87
+ }>>;
88
+ take: import("zod").ZodDefault<import("zod").ZodNumber>;
89
+ skip: import("zod").ZodDefault<import("zod").ZodNumber>;
90
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
91
+ requests: import("zod").ZodArray<import("zod").ZodObject<{
92
+ requestId: import("zod").ZodNumber;
93
+ mediaType: import("zod").ZodEnum<{
94
+ movie: "movie";
95
+ tv: "tv";
96
+ }>;
97
+ title: import("zod").ZodOptional<import("zod").ZodString>;
98
+ tmdbId: import("zod").ZodOptional<import("zod").ZodNumber>;
99
+ requestStatus: import("zod").ZodObject<{
100
+ raw: import("zod").ZodNumber;
101
+ label: import("zod").ZodString;
102
+ }, import("zod/v4/core").$strip>;
103
+ mediaStatus: import("zod").ZodOptional<import("zod").ZodObject<{
104
+ raw: import("zod").ZodNumber;
105
+ label: import("zod").ZodString;
106
+ }, import("zod/v4/core").$strip>>;
107
+ is4k: import("zod").ZodBoolean;
108
+ seasons: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodNumber>>;
109
+ requestedBy: import("zod").ZodObject<{
110
+ id: import("zod").ZodNumber;
111
+ displayName: import("zod").ZodString;
112
+ }, import("zod/v4/core").$strip>;
113
+ createdAt: import("zod").ZodString;
114
+ }, import("zod/v4/core").$strip>>;
115
+ }, import("zod/v4/core").$strip>, undefined, {
116
+ readonly totalCount: import("zod").ZodNumber;
117
+ readonly appliedFilters: import("zod").ZodObject<{
118
+ filter: import("zod").ZodString;
119
+ mediaType: import("zod").ZodString;
120
+ sort: import("zod").ZodString;
121
+ }, import("zod/v4/core").$strip>;
122
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
123
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
124
+ readonly cap: import("zod").ZodOptional<import("zod").ZodNumber>;
125
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
126
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
127
+ mediaType: import("zod").ZodEnum<{
128
+ movie: "movie";
129
+ tv: "tv";
130
+ }>;
131
+ tmdbId: import("zod").ZodNumber;
132
+ mode: import("zod").ZodDefault<import("zod").ZodEnum<{
133
+ request: "request";
134
+ preview: "preview";
135
+ }>>;
136
+ is4k: import("zod").ZodDefault<import("zod").ZodBoolean>;
137
+ seasons: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"all">, import("zod").ZodArray<import("zod").ZodNumber>]>>;
138
+ serverId: import("zod").ZodOptional<import("zod").ZodNumber>;
139
+ profileId: import("zod").ZodOptional<import("zod").ZodNumber>;
140
+ rootFolder: import("zod").ZodOptional<import("zod").ZodString>;
141
+ languageProfileId: import("zod").ZodOptional<import("zod").ZodNumber>;
142
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
143
+ mode: import("zod").ZodEnum<{
144
+ request: "request";
145
+ preview: "preview";
146
+ }>;
147
+ resolved: import("zod").ZodObject<{
148
+ tmdbId: import("zod").ZodNumber;
149
+ mediaType: import("zod").ZodEnum<{
150
+ movie: "movie";
151
+ tv: "tv";
152
+ }>;
153
+ title: import("zod").ZodString;
154
+ year: import("zod").ZodOptional<import("zod").ZodNumber>;
155
+ }, import("zod/v4/core").$strip>;
156
+ capability: import("zod").ZodObject<{
157
+ is4kEnabled: import("zod").ZodBoolean;
158
+ partialRequestsEnabled: import("zod").ZodBoolean;
159
+ }, import("zod/v4/core").$strip>;
160
+ payload: import("zod").ZodObject<{
161
+ mediaType: import("zod").ZodEnum<{
162
+ movie: "movie";
163
+ tv: "tv";
164
+ }>;
165
+ mediaId: import("zod").ZodNumber;
166
+ is4k: import("zod").ZodBoolean;
167
+ seasons: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<"all">, import("zod").ZodArray<import("zod").ZodNumber>]>>;
168
+ serverId: import("zod").ZodOptional<import("zod").ZodNumber>;
169
+ profileId: import("zod").ZodOptional<import("zod").ZodNumber>;
170
+ rootFolder: import("zod").ZodOptional<import("zod").ZodString>;
171
+ languageProfileId: import("zod").ZodOptional<import("zod").ZodNumber>;
172
+ }, import("zod/v4/core").$strip>;
173
+ existingRequest: import("zod").ZodOptional<import("zod").ZodObject<{
174
+ requestId: import("zod").ZodNumber;
175
+ status: import("zod").ZodObject<{
176
+ raw: import("zod").ZodNumber;
177
+ label: import("zod").ZodString;
178
+ }, import("zod/v4/core").$strip>;
179
+ is4k: import("zod").ZodBoolean;
180
+ }, import("zod/v4/core").$strip>>;
181
+ created: import("zod").ZodOptional<import("zod").ZodObject<{
182
+ requestId: import("zod").ZodNumber;
183
+ requestStatus: import("zod").ZodObject<{
184
+ raw: import("zod").ZodNumber;
185
+ label: import("zod").ZodString;
186
+ }, import("zod/v4/core").$strip>;
187
+ mediaStatus: import("zod").ZodOptional<import("zod").ZodObject<{
188
+ raw: import("zod").ZodNumber;
189
+ label: import("zod").ZodString;
190
+ }, import("zod/v4/core").$strip>>;
191
+ }, import("zod/v4/core").$strip>>;
192
+ }, import("zod/v4/core").$strip>, readonly [{
193
+ readonly reason: "media_not_found";
194
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
195
+ readonly when: "tmdbId does not resolve to a movie/show (Seerr 500 \"Unable to retrieve movie.\").";
196
+ readonly recovery: "Run seerr_search_media to get the correct tmdbId and retry with the matching mediaType.";
197
+ }, {
198
+ readonly reason: "seasons_required";
199
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
200
+ readonly when: "mediaType is tv but no seasons were provided.";
201
+ readonly recovery: "Provide seasons: \"all\" for the whole series or an explicit list like [1,2].";
202
+ }, {
203
+ readonly reason: "four_k_not_enabled";
204
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
205
+ readonly when: "is4k:true but the instance has no 4K configured for this media type.";
206
+ readonly recovery: "Resubmit with is4k:false, or check seerr_service_options for 4K availability first.";
207
+ }, {
208
+ readonly reason: "partial_requests_disabled";
209
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
210
+ readonly when: "an explicit season list was given but the instance disallows partial requests.";
211
+ readonly recovery: "Use seasons:\"all\" to request the full series instead of specific seasons.";
212
+ }, {
213
+ readonly reason: "duplicate_request";
214
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
215
+ readonly when: "Seerr rejects the POST because an identical request already exists.";
216
+ readonly recovery: "Check the existingRequest in this output; track it with seerr_request_status instead of re-requesting.";
217
+ }, {
218
+ readonly reason: "request_cancelled";
219
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.InvalidParams;
220
+ readonly when: "the user declined the elicit confirmation.";
221
+ readonly recovery: "Re-run with mode:request and confirm the prompt if you intend to submit the request.";
222
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
223
+ requestId: import("zod").ZodNumber;
224
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
225
+ requestId: import("zod").ZodNumber;
226
+ mediaType: import("zod").ZodEnum<{
227
+ movie: "movie";
228
+ tv: "tv";
229
+ }>;
230
+ title: import("zod").ZodOptional<import("zod").ZodString>;
231
+ tmdbId: import("zod").ZodOptional<import("zod").ZodNumber>;
232
+ requestStatus: import("zod").ZodObject<{
233
+ raw: import("zod").ZodNumber;
234
+ label: import("zod").ZodString;
235
+ }, import("zod/v4/core").$strip>;
236
+ mediaStatus: import("zod").ZodOptional<import("zod").ZodObject<{
237
+ raw: import("zod").ZodNumber;
238
+ label: import("zod").ZodString;
239
+ }, import("zod/v4/core").$strip>>;
240
+ mediaStatus4k: import("zod").ZodOptional<import("zod").ZodObject<{
241
+ raw: import("zod").ZodNumber;
242
+ label: import("zod").ZodString;
243
+ }, import("zod/v4/core").$strip>>;
244
+ is4k: import("zod").ZodBoolean;
245
+ seasons: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodNumber>>;
246
+ requestedBy: import("zod").ZodObject<{
247
+ id: import("zod").ZodNumber;
248
+ displayName: import("zod").ZodString;
249
+ }, import("zod/v4/core").$strip>;
250
+ routing: import("zod").ZodObject<{
251
+ serverId: import("zod").ZodOptional<import("zod").ZodNumber>;
252
+ profileName: import("zod").ZodOptional<import("zod").ZodString>;
253
+ is4k: import("zod").ZodBoolean;
254
+ }, import("zod/v4/core").$strip>;
255
+ createdAt: import("zod").ZodString;
256
+ updatedAt: import("zod").ZodString;
257
+ stateGuidance: import("zod").ZodOptional<import("zod").ZodString>;
258
+ }, import("zod/v4/core").$strip>, readonly [{
259
+ readonly reason: "request_not_found";
260
+ readonly code: import("@cyanheads/mcp-ts-core/errors").JsonRpcErrorCode.NotFound;
261
+ readonly when: "No request exists with the given ID (Seerr returns HTTP 404 \"Request not found.\").";
262
+ readonly recovery: "List requests with seerr_list_requests to find a valid requestId, then retry.";
263
+ }], undefined> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
264
+ query: import("zod").ZodString;
265
+ mediaType: import("zod").ZodDefault<import("zod").ZodEnum<{
266
+ movie: "movie";
267
+ tv: "tv";
268
+ all: "all";
269
+ }>>;
270
+ page: import("zod").ZodDefault<import("zod").ZodNumber>;
271
+ language: import("zod").ZodOptional<import("zod").ZodString>;
272
+ limit: import("zod").ZodDefault<import("zod").ZodNumber>;
273
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
274
+ results: import("zod").ZodArray<import("zod").ZodObject<{
275
+ tmdbId: import("zod").ZodNumber;
276
+ mediaType: import("zod").ZodEnum<{
277
+ movie: "movie";
278
+ tv: "tv";
279
+ }>;
280
+ title: import("zod").ZodString;
281
+ year: import("zod").ZodOptional<import("zod").ZodNumber>;
282
+ overview: import("zod").ZodOptional<import("zod").ZodString>;
283
+ voteAverage: import("zod").ZodOptional<import("zod").ZodNumber>;
284
+ tracked: import("zod").ZodBoolean;
285
+ availability: import("zod").ZodOptional<import("zod").ZodObject<{
286
+ status: import("zod").ZodObject<{
287
+ raw: import("zod").ZodNumber;
288
+ label: import("zod").ZodString;
289
+ }, import("zod/v4/core").$strip>;
290
+ status4k: import("zod").ZodOptional<import("zod").ZodObject<{
291
+ raw: import("zod").ZodNumber;
292
+ label: import("zod").ZodString;
293
+ }, import("zod/v4/core").$strip>>;
294
+ }, import("zod/v4/core").$strip>>;
295
+ }, import("zod/v4/core").$strip>>;
296
+ }, import("zod/v4/core").$strip>, undefined, {
297
+ readonly effectiveQuery: import("zod").ZodString;
298
+ readonly totalCount: import("zod").ZodNumber;
299
+ readonly truncated: import("zod").ZodOptional<import("zod").ZodBoolean>;
300
+ readonly shown: import("zod").ZodOptional<import("zod").ZodNumber>;
301
+ readonly cap: import("zod").ZodOptional<import("zod").ZodNumber>;
302
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
303
+ }> | import("@cyanheads/mcp-ts-core").ToolDefinition<import("zod").ZodObject<{
304
+ service: import("zod").ZodDefault<import("zod").ZodEnum<{
305
+ all: "all";
306
+ radarr: "radarr";
307
+ sonarr: "sonarr";
308
+ }>>;
309
+ includePaths: import("zod").ZodDefault<import("zod").ZodBoolean>;
310
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
311
+ instance: import("zod").ZodObject<{
312
+ version: import("zod").ZodString;
313
+ mediaServer: import("zod").ZodString;
314
+ movie4kEnabled: import("zod").ZodBoolean;
315
+ series4kEnabled: import("zod").ZodBoolean;
316
+ partialRequestsEnabled: import("zod").ZodBoolean;
317
+ specialEpisodesEnabled: import("zod").ZodBoolean;
318
+ }, import("zod/v4/core").$strip>;
319
+ services: import("zod").ZodArray<import("zod").ZodObject<{
320
+ kind: import("zod").ZodEnum<{
321
+ radarr: "radarr";
322
+ sonarr: "sonarr";
323
+ }>;
324
+ serverId: import("zod").ZodNumber;
325
+ name: import("zod").ZodString;
326
+ isDefault: import("zod").ZodBoolean;
327
+ is4k: import("zod").ZodBoolean;
328
+ activeProfileId: import("zod").ZodNumber;
329
+ profiles: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
330
+ id: import("zod").ZodNumber;
331
+ name: import("zod").ZodString;
332
+ }, import("zod/v4/core").$strip>>>;
333
+ rootFolders: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
334
+ path: import("zod").ZodString;
335
+ freeSpace: import("zod").ZodOptional<import("zod").ZodNumber>;
336
+ }, import("zod/v4/core").$strip>>>;
337
+ }, import("zod/v4/core").$strip>>;
338
+ }, import("zod/v4/core").$strip>, undefined, {
339
+ readonly notice: import("zod").ZodOptional<import("zod").ZodString>;
340
+ }>)[];
341
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAO9B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Barrel collecting every tool definition into `allToolDefinitions`
3
+ * for `createApp()`. The agent workflow is: discover (search) → confirm (get) →
4
+ * understand routing (service_options) → request (request_media) → track
5
+ * (request_status / list_requests).
6
+ * @module mcp-server/tools/definitions/index
7
+ */
8
+ import { getMediaTool } from './get-media.tool.js';
9
+ import { listRequestsTool } from './list-requests.tool.js';
10
+ import { requestMediaTool } from './request-media.tool.js';
11
+ import { requestStatusTool } from './request-status.tool.js';
12
+ import { searchMediaTool } from './search-media.tool.js';
13
+ import { serviceOptionsTool } from './service-options.tool.js';
14
+ export const allToolDefinitions = [
15
+ searchMediaTool,
16
+ getMediaTool,
17
+ listRequestsTool,
18
+ requestMediaTool,
19
+ requestStatusTool,
20
+ serviceOptionsTool,
21
+ ];
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;CACnB,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @fileoverview seerr_list_requests — review recent requests and their lifecycle.
3
+ * Wraps `GET /request`. Echoes the applied filters and decodes every numeric
4
+ * status. The media-type discriminator is the raw `type` field (not `mediaType`);
5
+ * `requestedBy` is PII-redacted; `title` is left unpopulated by default (the
6
+ * request object has no title field — resolving it would cost one media fetch per
7
+ * row). The total count comes from `pageInfo.results`.
8
+ * @module mcp-server/tools/definitions/list-requests.tool
9
+ */
10
+ import { z } from '@cyanheads/mcp-ts-core';
11
+ export declare const listRequestsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
12
+ filter: z.ZodDefault<z.ZodEnum<{
13
+ pending: "pending";
14
+ approved: "approved";
15
+ failed: "failed";
16
+ completed: "completed";
17
+ processing: "processing";
18
+ available: "available";
19
+ deleted: "deleted";
20
+ all: "all";
21
+ unavailable: "unavailable";
22
+ }>>;
23
+ mediaType: z.ZodDefault<z.ZodEnum<{
24
+ movie: "movie";
25
+ tv: "tv";
26
+ all: "all";
27
+ }>>;
28
+ requestedById: z.ZodOptional<z.ZodNumber>;
29
+ sort: z.ZodDefault<z.ZodEnum<{
30
+ added: "added";
31
+ modified: "modified";
32
+ }>>;
33
+ sortDirection: z.ZodDefault<z.ZodEnum<{
34
+ asc: "asc";
35
+ desc: "desc";
36
+ }>>;
37
+ take: z.ZodDefault<z.ZodNumber>;
38
+ skip: z.ZodDefault<z.ZodNumber>;
39
+ }, z.core.$strip>, z.ZodObject<{
40
+ requests: z.ZodArray<z.ZodObject<{
41
+ requestId: z.ZodNumber;
42
+ mediaType: z.ZodEnum<{
43
+ movie: "movie";
44
+ tv: "tv";
45
+ }>;
46
+ title: z.ZodOptional<z.ZodString>;
47
+ tmdbId: z.ZodOptional<z.ZodNumber>;
48
+ requestStatus: z.ZodObject<{
49
+ raw: z.ZodNumber;
50
+ label: z.ZodString;
51
+ }, z.core.$strip>;
52
+ mediaStatus: z.ZodOptional<z.ZodObject<{
53
+ raw: z.ZodNumber;
54
+ label: z.ZodString;
55
+ }, z.core.$strip>>;
56
+ is4k: z.ZodBoolean;
57
+ seasons: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
58
+ requestedBy: z.ZodObject<{
59
+ id: z.ZodNumber;
60
+ displayName: z.ZodString;
61
+ }, z.core.$strip>;
62
+ createdAt: z.ZodString;
63
+ }, z.core.$strip>>;
64
+ }, z.core.$strip>, undefined, {
65
+ readonly totalCount: z.ZodNumber;
66
+ readonly appliedFilters: z.ZodObject<{
67
+ filter: z.ZodString;
68
+ mediaType: z.ZodString;
69
+ sort: z.ZodString;
70
+ }, z.core.$strip>;
71
+ readonly truncated: z.ZodOptional<z.ZodBoolean>;
72
+ readonly shown: z.ZodOptional<z.ZodNumber>;
73
+ readonly cap: z.ZodOptional<z.ZodNumber>;
74
+ readonly notice: z.ZodOptional<z.ZodString>;
75
+ }>;
76
+ //# sourceMappingURL=list-requests.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-requests.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/list-requests.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAUjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoM3B,CAAC"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * @fileoverview seerr_list_requests — review recent requests and their lifecycle.
3
+ * Wraps `GET /request`. Echoes the applied filters and decodes every numeric
4
+ * status. The media-type discriminator is the raw `type` field (not `mediaType`);
5
+ * `requestedBy` is PII-redacted; `title` is left unpopulated by default (the
6
+ * request object has no title field — resolving it would cost one media fetch per
7
+ * row). The total count comes from `pageInfo.results`.
8
+ * @module mcp-server/tools/definitions/list-requests.tool
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { normalizeSeasons, redactUser } from '../../../services/seerr/normalizers.js';
12
+ import { getSeerrService } from '../../../services/seerr/seerr-service.js';
13
+ import { decodeMediaStatus, decodeRequestStatus, StatusRef, statusText, } from '../../../services/seerr/status.js';
14
+ export const listRequestsTool = tool('seerr_list_requests', {
15
+ title: 'seerr-mcp-server: list requests',
16
+ description: 'List recent media requests with their lifecycle status. Filter by status, media type, and requester; echoes the applied filters and decodes every numeric status. Pass a requestId from the results to seerr_request_status for full detail. Titles are not on request objects, so they are omitted here — fetch a title with seerr_get_media when needed.',
17
+ annotations: { readOnlyHint: true, openWorldHint: true },
18
+ input: z.object({
19
+ filter: z
20
+ .enum([
21
+ 'all',
22
+ 'approved',
23
+ 'available',
24
+ 'pending',
25
+ 'processing',
26
+ 'unavailable',
27
+ 'failed',
28
+ 'deleted',
29
+ 'completed',
30
+ ])
31
+ .default('all')
32
+ .describe('Lifecycle filter. "pending" = awaiting approval; "processing" = downloading; "available" = ready to watch; "failed" = needs retry in Seerr.'),
33
+ mediaType: z
34
+ .enum(['movie', 'tv', 'all'])
35
+ .default('all')
36
+ .describe('Restrict to movies, TV, or both.'),
37
+ requestedById: z
38
+ .number()
39
+ .int()
40
+ .positive()
41
+ .optional()
42
+ .describe("Seerr numeric user ID to show only one requester's requests. Omit for all requesters."),
43
+ sort: z
44
+ .enum(['added', 'modified'])
45
+ .default('added')
46
+ .describe('Sort key: when the request was created ("added") or last changed ("modified").'),
47
+ sortDirection: z
48
+ .enum(['asc', 'desc'])
49
+ .default('desc')
50
+ .describe('Sort direction. Default desc shows the most recent first.'),
51
+ take: z
52
+ .number()
53
+ .int()
54
+ .min(1)
55
+ .max(100)
56
+ .default(20)
57
+ .describe('Page size — max requests to return in one call.'),
58
+ skip: z
59
+ .number()
60
+ .int()
61
+ .min(0)
62
+ .default(0)
63
+ .describe('Number of requests to skip for pagination (offset). Use take+skip to page.'),
64
+ }),
65
+ output: z.object({
66
+ requests: z
67
+ .array(z
68
+ .object({
69
+ requestId: z.number().describe('Request ID — pass to seerr_request_status.'),
70
+ mediaType: z.enum(['movie', 'tv']).describe('Movie or TV.'),
71
+ title: z
72
+ .string()
73
+ .optional()
74
+ .describe('Title of the requested media; absent because request objects carry no title field.'),
75
+ tmdbId: z.number().optional().describe('TMDB ID of the requested media.'),
76
+ requestStatus: StatusRef.describe('Decoded request status {raw,label}.'),
77
+ mediaStatus: StatusRef.optional().describe('Decoded availability of the underlying media {raw,label} (from media.status).'),
78
+ is4k: z.boolean().describe('Whether this is a 4K request.'),
79
+ seasons: z
80
+ .array(z.number())
81
+ .optional()
82
+ .describe('Requested season numbers (TV); empty array or omitted for movies or full-series requests.'),
83
+ requestedBy: z
84
+ .object({
85
+ id: z.number().describe('Requester user ID.'),
86
+ displayName: z.string().describe('Requester display name (no email/tokens).'),
87
+ })
88
+ .describe('Who requested it — id + display name only.'),
89
+ createdAt: z.string().describe('ISO timestamp the request was created.'),
90
+ })
91
+ .describe('A single media request and its decoded lifecycle state.'))
92
+ .describe('Matching requests, most-recent first by default.'),
93
+ }),
94
+ enrichment: {
95
+ totalCount: z.number().describe('Total requests matching the filter, before pagination.'),
96
+ appliedFilters: z
97
+ .object({
98
+ filter: z.string().describe('The lifecycle filter applied.'),
99
+ mediaType: z.string().describe('The media-type filter applied.'),
100
+ sort: z.string().describe('The sort key applied.'),
101
+ })
102
+ .describe('The filter set the server applied to the request list.'),
103
+ truncated: z
104
+ .boolean()
105
+ .optional()
106
+ .describe('True when the page filled to the take limit (more may exist).'),
107
+ shown: z.number().optional().describe('Number of requests returned.'),
108
+ cap: z.number().optional().describe('The take limit that was applied.'),
109
+ notice: z.string().optional().describe('Guidance when no requests matched.'),
110
+ },
111
+ enrichmentTrailer: {
112
+ appliedFilters: {
113
+ render: (f) => `**Filters:** status=${f.filter}, media=${f.mediaType}, sort=${f.sort}`,
114
+ },
115
+ },
116
+ async handler(input, ctx) {
117
+ const seerr = getSeerrService();
118
+ const response = await seerr.listRequests({
119
+ filter: input.filter,
120
+ mediaType: input.mediaType,
121
+ sort: input.sort,
122
+ sortDirection: input.sortDirection,
123
+ take: input.take,
124
+ skip: input.skip,
125
+ ...(typeof input.requestedById === 'number' ? { requestedById: input.requestedById } : {}),
126
+ }, ctx);
127
+ const rows = response.results ?? [];
128
+ const requests = rows.map((r) => {
129
+ const mediaType = r.type === 'tv' ? 'tv' : 'movie';
130
+ const seasons = normalizeSeasons(r);
131
+ const tmdbId = r.media?.tmdbId;
132
+ const mediaStatus = typeof r.media?.status === 'number' ? decodeMediaStatus(r.media.status) : undefined;
133
+ return {
134
+ requestId: r.id,
135
+ mediaType,
136
+ ...(typeof tmdbId === 'number' ? { tmdbId } : {}),
137
+ requestStatus: decodeRequestStatus(r.status ?? 1),
138
+ ...(mediaStatus ? { mediaStatus } : {}),
139
+ is4k: r.is4k === true,
140
+ ...(seasons.length > 0 ? { seasons } : {}),
141
+ requestedBy: r.requestedBy ? redactUser(r.requestedBy) : { id: 0, displayName: 'Unknown' },
142
+ createdAt: r.createdAt ?? '',
143
+ };
144
+ });
145
+ const total = response.pageInfo?.results ?? requests.length;
146
+ ctx.enrich.total(total);
147
+ ctx.enrich({
148
+ appliedFilters: { filter: input.filter, mediaType: input.mediaType, sort: input.sort },
149
+ });
150
+ if (requests.length >= input.take && requests.length < total) {
151
+ ctx.enrich.truncated({ shown: requests.length, cap: input.take });
152
+ }
153
+ if (requests.length === 0) {
154
+ ctx.enrich.notice(`No requests matched filter="${input.filter}", mediaType="${input.mediaType}". Try filter="all" or a different mediaType.`);
155
+ }
156
+ ctx.log.info('Seerr request list fetched', {
157
+ filter: input.filter,
158
+ returned: requests.length,
159
+ total,
160
+ });
161
+ return { requests };
162
+ },
163
+ format: (result) => {
164
+ if (result.requests.length === 0) {
165
+ return [{ type: 'text', text: 'No requests matched the filter.' }];
166
+ }
167
+ const lines = [];
168
+ for (const r of result.requests) {
169
+ lines.push(`## Request #${r.requestId} — ${r.title ?? 'Untitled'} (${r.mediaType}, 4K=${r.is4k})`);
170
+ const facts = [
171
+ `**TMDB ID:** ${r.tmdbId ?? 'n/a'}`,
172
+ `**Status:** ${statusText(r.requestStatus)}`,
173
+ ];
174
+ if (r.mediaStatus)
175
+ facts.push(`**Media:** ${statusText(r.mediaStatus)}`);
176
+ facts.push(`**Requested by:** ${r.requestedBy.displayName} (id ${r.requestedBy.id})`);
177
+ if (r.createdAt)
178
+ facts.push(`**Created:** ${r.createdAt}`);
179
+ lines.push(facts.join(' | '));
180
+ if (r.seasons && r.seasons.length > 0)
181
+ lines.push(`**Seasons:** ${r.seasons.join(', ')}`);
182
+ lines.push('');
183
+ }
184
+ return [{ type: 'text', text: lines.join('\n').trimEnd() }];
185
+ },
186
+ });
187
+ //# sourceMappingURL=list-requests.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-requests.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/list-requests.tool.ts"],"names":[],"mappings":"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"}