@cyanheads/seerr-mcp-server 0.1.1 → 0.1.3

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 (41) hide show
  1. package/AGENTS.md +11 -8
  2. package/CLAUDE.md +11 -8
  3. package/Dockerfile +14 -5
  4. package/README.md +12 -9
  5. package/changelog/0.1.x/0.1.2.md +22 -0
  6. package/changelog/0.1.x/0.1.3.md +36 -0
  7. package/changelog/template.md +55 -16
  8. package/dist/mcp-server/resources/definitions/index.d.ts +1 -0
  9. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -1
  10. package/dist/mcp-server/resources/definitions/request.resource.d.ts +7 -3
  11. package/dist/mcp-server/resources/definitions/request.resource.d.ts.map +1 -1
  12. package/dist/mcp-server/resources/definitions/request.resource.js +17 -5
  13. package/dist/mcp-server/resources/definitions/request.resource.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/index.d.ts +2 -1
  15. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/list-requests.tool.d.ts +6 -3
  17. package/dist/mcp-server/tools/definitions/list-requests.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/list-requests.tool.js +68 -10
  19. package/dist/mcp-server/tools/definitions/list-requests.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/request-media.tool.d.ts +8 -5
  21. package/dist/mcp-server/tools/definitions/request-media.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/request-media.tool.js +46 -16
  23. package/dist/mcp-server/tools/definitions/request-media.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/request-status.tool.d.ts +4 -2
  25. package/dist/mcp-server/tools/definitions/request-status.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/request-status.tool.js +11 -4
  27. package/dist/mcp-server/tools/definitions/request-status.tool.js.map +1 -1
  28. package/dist/services/seerr/normalizers.d.ts +4 -1
  29. package/dist/services/seerr/normalizers.d.ts.map +1 -1
  30. package/dist/services/seerr/normalizers.js +3 -1
  31. package/dist/services/seerr/normalizers.js.map +1 -1
  32. package/dist/services/seerr/seerr-service.d.ts +12 -2
  33. package/dist/services/seerr/seerr-service.d.ts.map +1 -1
  34. package/dist/services/seerr/seerr-service.js +13 -6
  35. package/dist/services/seerr/seerr-service.js.map +1 -1
  36. package/dist/services/seerr/titles.d.ts +47 -0
  37. package/dist/services/seerr/titles.d.ts.map +1 -0
  38. package/dist/services/seerr/titles.js +107 -0
  39. package/dist/services/seerr/titles.js.map +1 -0
  40. package/package.json +7 -7
  41. package/server.json +3 -3
@@ -17,7 +17,8 @@ import { withRetry } from '@cyanheads/mcp-ts-core/utils';
17
17
  import { getServerConfig } from '../../config/server-config.js';
18
18
  import { throwClassifiedSeerrError } from './errors.js';
19
19
  const SERVICE_NAME = 'Seerr';
20
- const SETTINGS_CACHE_KEY = 'seerr:settings:public';
20
+ /** `ctx.state` restricts keys to `[a-zA-Z0-9_.\-/]`; a colon-separated key is rejected outright. */
21
+ const SETTINGS_CACHE_KEY = 'seerr/settings/public';
21
22
  const SETTINGS_CACHE_TTL_SECONDS = 300;
22
23
  /**
23
24
  * Percent-encode a query key or value for Seerr. Seerr validates the UNDECODED
@@ -64,12 +65,15 @@ export class SeerrService {
64
65
  return this.request(`/search?${qs}`, ctx);
65
66
  }
66
67
  /** `GET /movie/{id}` — movie detail. 500 "Unable to retrieve movie." → media_not_found. */
67
- getMovie(tmdbId, ctx) {
68
- return this.request(`/movie/${tmdbId}`, ctx, { notFoundKind: 'media' });
68
+ getMovie(tmdbId, ctx, options = {}) {
69
+ return this.request(`/movie/${tmdbId}`, ctx, {
70
+ notFoundKind: 'media',
71
+ ...options,
72
+ });
69
73
  }
70
74
  /** `GET /tv/{id}` — TV detail. */
71
- getTv(tmdbId, ctx) {
72
- return this.request(`/tv/${tmdbId}`, ctx, { notFoundKind: 'media' });
75
+ getTv(tmdbId, ctx, options = {}) {
76
+ return this.request(`/tv/${tmdbId}`, ctx, { notFoundKind: 'media', ...options });
73
77
  }
74
78
  /** `GET /tv/{id}/season/{n}` — episode list for one season. */
75
79
  getSeason(tmdbId, seasonNumber, ctx) {
@@ -182,8 +186,11 @@ export class SeerrService {
182
186
  }
183
187
  }, {
184
188
  operation: `SeerrService.request ${method} ${path}`,
185
- context: { requestId: ctx.requestId, timestamp: ctx.timestamp },
189
+ // `Context extends RequestContext`, so the handler ctx passes through whole —
190
+ // a hand-rolled slice would drop traceId, spanId, tenantId, and extra.
191
+ context: ctx,
186
192
  baseDelayMs: options.baseDelayMs ?? 300,
193
+ ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),
187
194
  signal: ctx.signal,
188
195
  });
189
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"seerr-service.js","sourceRoot":"","sources":["../../../src/services/seerr/seerr-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seerr-service.js","sourceRoot":"","sources":["../../../src/services/seerr/seerr-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview Title hydration for request-shaped output. Seerr's `MediaRequest`
3
+ * objects carry no title field — only `media.tmdbId` — so a readable request row
4
+ * costs one extra `GET /movie/{id}` or `GET /tv/{id}` per distinct title. This
5
+ * module owns that join and the three properties it needs:
6
+ *
7
+ * - **De-duplication.** A 4K and a non-4K request for one film, or several
8
+ * seasons of one show, share a `(mediaType, tmdbId)` and resolve once.
9
+ * - **Bounded fan-out.** Lookups run through a fixed-size worker pool, never
10
+ * one-shot `Promise.all` over an entire page. Each leg is single-attempt, so
11
+ * the pool's width is also the real ceiling on upstream calls.
12
+ * - **Degradation.** A lookup that throws, returns an empty title, or has no
13
+ * `tmdbId` to look up yields no title and no error — the row keeps every
14
+ * other field. Callers disclose the count; nothing here throws.
15
+ * @module services/seerr/titles
16
+ */
17
+ import type { Context } from '@cyanheads/mcp-ts-core';
18
+ import type { DomainRequestDetail } from './normalizers.js';
19
+ import type { SeerrService } from './seerr-service.js';
20
+ /** The identity of one title lookup — the pair that de-duplicates a request page. */
21
+ export interface TitleKey {
22
+ mediaType: 'movie' | 'tv';
23
+ tmdbId: number;
24
+ }
25
+ /** Outcome of one hydration pass. */
26
+ export interface TitleLookup {
27
+ /** Resolved titles, keyed by {@link titleKeyOf}. A key absent here did not resolve. */
28
+ titles: Map<string, string>;
29
+ /** Distinct pairs looked up — the number of upstream detail calls this pass made. */
30
+ uniqueKeys: number;
31
+ }
32
+ /** Map key for a resolved title. */
33
+ export declare function titleKeyOf(mediaType: 'movie' | 'tv', tmdbId: number): string;
34
+ /**
35
+ * Resolve titles for a batch of `(mediaType, tmdbId)` pairs. Duplicates collapse
36
+ * before any fetch, so N rows sharing a title cost one call. Never throws — a
37
+ * failed leg is absorbed, leaving its key absent from `titles`.
38
+ */
39
+ export declare function resolveTitles(keys: readonly TitleKey[], seerr: SeerrService, ctx: Context): Promise<TitleLookup>;
40
+ /**
41
+ * Attach a resolved title to a single projected request detail. Returns the
42
+ * detail untouched when there is no `tmdbId` to look up or the lookup fails —
43
+ * the shared path behind seerr_request_status and the request resource, both of
44
+ * which hydrate unconditionally (one request, one extra call).
45
+ */
46
+ export declare function hydrateRequestTitle(detail: DomainRequestDetail, seerr: SeerrService, ctx: Context): Promise<DomainRequestDetail>;
47
+ //# sourceMappingURL=titles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titles.d.ts","sourceRoot":"","sources":["../../../src/services/seerr/titles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAmBvD,qFAAqF;AACrF,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,QAAQ,EAAE,EACzB,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,WAAW,CAAC,CAyBtB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @fileoverview Title hydration for request-shaped output. Seerr's `MediaRequest`
3
+ * objects carry no title field — only `media.tmdbId` — so a readable request row
4
+ * costs one extra `GET /movie/{id}` or `GET /tv/{id}` per distinct title. This
5
+ * module owns that join and the three properties it needs:
6
+ *
7
+ * - **De-duplication.** A 4K and a non-4K request for one film, or several
8
+ * seasons of one show, share a `(mediaType, tmdbId)` and resolve once.
9
+ * - **Bounded fan-out.** Lookups run through a fixed-size worker pool, never
10
+ * one-shot `Promise.all` over an entire page. Each leg is single-attempt, so
11
+ * the pool's width is also the real ceiling on upstream calls.
12
+ * - **Degradation.** A lookup that throws, returns an empty title, or has no
13
+ * `tmdbId` to look up yields no title and no error — the row keeps every
14
+ * other field. Callers disclose the count; nothing here throws.
15
+ * @module services/seerr/titles
16
+ */
17
+ import { McpError } from '@cyanheads/mcp-ts-core/errors';
18
+ /**
19
+ * Simultaneous detail lookups per hydration pass. Seerr is a single-node app
20
+ * proxying TMDB on a self-hosted LAN host, so a 100-row page must not open 100
21
+ * sockets against it; 6 matches the per-origin connection budget browsers have
22
+ * long used against one host, and drains a full page in ~17 sequential waves.
23
+ */
24
+ const TITLE_LOOKUP_CONCURRENCY = 6;
25
+ /**
26
+ * A title is cosmetic, so a leg that fails is absorbed — which makes the default
27
+ * retry budget actively harmful here: a transient-classified detail read would
28
+ * burn four upstream calls and seconds of backoff to produce the same absent
29
+ * title, occupying a worker and multiplying load on the single-node instance the
30
+ * pool exists to protect. One attempt, then degrade.
31
+ */
32
+ const BEST_EFFORT = { maxRetries: 0 };
33
+ /** Map key for a resolved title. */
34
+ export function titleKeyOf(mediaType, tmdbId) {
35
+ return `${mediaType}:${tmdbId}`;
36
+ }
37
+ /**
38
+ * Resolve titles for a batch of `(mediaType, tmdbId)` pairs. Duplicates collapse
39
+ * before any fetch, so N rows sharing a title cost one call. Never throws — a
40
+ * failed leg is absorbed, leaving its key absent from `titles`.
41
+ */
42
+ export async function resolveTitles(keys, seerr, ctx) {
43
+ const distinct = new Map();
44
+ for (const key of keys)
45
+ distinct.set(titleKeyOf(key.mediaType, key.tmdbId), key);
46
+ const entries = [...distinct];
47
+ const titles = new Map();
48
+ let cursor = 0;
49
+ /**
50
+ * Pull-based worker: each pulls the next index and runs to exhaustion, so a
51
+ * slow lookup delays only itself rather than stalling a fixed-size chunk.
52
+ */
53
+ const worker = async () => {
54
+ for (let entry = entries[cursor++]; entry !== undefined; entry = entries[cursor++]) {
55
+ const [key, { mediaType, tmdbId }] = entry;
56
+ const title = await fetchTitle(mediaType, tmdbId, seerr, ctx);
57
+ if (title)
58
+ titles.set(key, title);
59
+ }
60
+ };
61
+ await Promise.all(Array.from({ length: Math.min(TITLE_LOOKUP_CONCURRENCY, entries.length) }, worker));
62
+ return { titles, uniqueKeys: entries.length };
63
+ }
64
+ /**
65
+ * Attach a resolved title to a single projected request detail. Returns the
66
+ * detail untouched when there is no `tmdbId` to look up or the lookup fails —
67
+ * the shared path behind seerr_request_status and the request resource, both of
68
+ * which hydrate unconditionally (one request, one extra call).
69
+ */
70
+ export async function hydrateRequestTitle(detail, seerr, ctx) {
71
+ if (typeof detail.tmdbId !== 'number')
72
+ return detail;
73
+ const title = await fetchTitle(detail.mediaType, detail.tmdbId, seerr, ctx);
74
+ return title ? { ...detail, title } : detail;
75
+ }
76
+ /**
77
+ * One detail fetch reduced to its title. `RawMovieDetail.title` / `RawTvDetail.name`
78
+ * are the same fields seerr_get_media reads. Upstream failures (including Seerr's
79
+ * 500-flavored not-found) resolve to `undefined` rather than throwing.
80
+ */
81
+ async function fetchTitle(mediaType, tmdbId, seerr, ctx) {
82
+ try {
83
+ const title = mediaType === 'tv'
84
+ ? (await seerr.getTv(tmdbId, ctx, BEST_EFFORT)).name
85
+ : (await seerr.getMovie(tmdbId, ctx, BEST_EFFORT)).title;
86
+ return title?.trim() || undefined;
87
+ }
88
+ catch (error) {
89
+ ctx.log.debug('Seerr title lookup failed', { mediaType, tmdbId, cause: causeOf(error) });
90
+ return;
91
+ }
92
+ }
93
+ /**
94
+ * A classified label for a swallowed lookup failure. `ctx.log` is dual-sink — every
95
+ * call also reaches the client as `notifications/message` — and a raw upstream or
96
+ * network message can echo the instance host or a root-folder path, neither of which
97
+ * passes through the `normalizers.ts` choke point. The classifier's own reason (or
98
+ * the error's constructor name) carries the diagnostic without the free text.
99
+ */
100
+ function causeOf(error) {
101
+ if (error instanceof McpError) {
102
+ const reason = error.data?.reason;
103
+ return typeof reason === 'string' ? reason : `McpError(${error.code})`;
104
+ }
105
+ return error instanceof Error ? error.name : 'unknown';
106
+ }
107
+ //# sourceMappingURL=titles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"titles.js","sourceRoot":"","sources":["../../../src/services/seerr/titles.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/seerr-mcp-server",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Search Jellyseerr/Overseerr, check availability, and create guarded media requests via MCP. STDIO or Streamable HTTP.",
5
5
  "mcpName": "io.github.cyanheads/seerr-mcp-server",
6
6
  "type": "module",
@@ -62,7 +62,7 @@
62
62
  "url": "https://github.com/cyanheads/seerr-mcp-server/issues"
63
63
  },
64
64
  "license": "Apache-2.0",
65
- "packageManager": "bun@1.3.14",
65
+ "packageManager": "bun@1.4.0",
66
66
  "engines": {
67
67
  "bun": ">=1.3.0",
68
68
  "node": ">=24.0.0"
@@ -71,18 +71,18 @@
71
71
  "access": "public"
72
72
  },
73
73
  "dependencies": {
74
- "@cyanheads/mcp-ts-core": "^0.11.0",
74
+ "@cyanheads/mcp-ts-core": "^0.12.3",
75
75
  "pino-pretty": "^13.1.3",
76
76
  "zod": "^4.4.3"
77
77
  },
78
78
  "devDependencies": {
79
- "@biomejs/biome": "2.5.5",
79
+ "@biomejs/biome": "2.5.10",
80
80
  "@socketsecurity/bun-security-scanner": "^1.1.2",
81
- "@types/node": "26.1.1",
81
+ "@types/node": "26.2.0",
82
82
  "depcheck": "^1.4.7",
83
83
  "ignore": "^7.0.6",
84
- "tsc-alias": "^1.9.1",
84
+ "tsc-alias": "^1.9.2",
85
85
  "typescript": "^7.0.2",
86
- "vitest": "^4.1.10"
86
+ "vitest": "^4.1.11"
87
87
  }
88
88
  }
package/server.json CHANGED
@@ -6,14 +6,14 @@
6
6
  "url": "https://github.com/cyanheads/seerr-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.1.1",
9
+ "version": "0.1.3",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "registryBaseUrl": "https://registry.npmjs.org",
14
14
  "identifier": "@cyanheads/seerr-mcp-server",
15
15
  "runtimeHint": "bun",
16
- "version": "0.1.1",
16
+ "version": "0.1.3",
17
17
  "packageArguments": [
18
18
  {
19
19
  "type": "positional",
@@ -61,7 +61,7 @@
61
61
  "registryBaseUrl": "https://registry.npmjs.org",
62
62
  "identifier": "@cyanheads/seerr-mcp-server",
63
63
  "runtimeHint": "bun",
64
- "version": "0.1.1",
64
+ "version": "0.1.3",
65
65
  "packageArguments": [
66
66
  {
67
67
  "type": "positional",