rewind-mcp-server 0.1.0 → 0.3.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 +77 -90
- package/dist/__tests__/helpers.test.d.ts +1 -0
- package/dist/__tests__/helpers.test.js +131 -0
- package/dist/__tests__/helpers.test.js.map +1 -0
- package/dist/__tests__/image-block.live.d.ts +1 -0
- package/dist/__tests__/image-block.live.js +41 -0
- package/dist/__tests__/image-block.live.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +1 -0
- package/dist/__tests__/server.test.js +1308 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/stdio-e2e.live.d.ts +1 -0
- package/dist/__tests__/stdio-e2e.live.js +60 -0
- package/dist/__tests__/stdio-e2e.live.js.map +1 -0
- package/dist/__tests__/ui-resource.live.d.ts +1 -0
- package/dist/__tests__/ui-resource.live.js +71 -0
- package/dist/__tests__/ui-resource.live.js.map +1 -0
- package/dist/client.d.ts +9 -0
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/prompts.js +101 -0
- package/dist/prompts.js.map +1 -1
- package/dist/resources/ui.d.ts +33 -0
- package/dist/resources/ui.js +14 -0
- package/dist/resources/ui.js.map +1 -0
- package/dist/resources.js +128 -0
- package/dist/resources.js.map +1 -1
- package/dist/server.js +55 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/collecting.js +116 -14
- package/dist/tools/collecting.js.map +1 -1
- package/dist/tools/cross-domain.js +74 -17
- package/dist/tools/cross-domain.js.map +1 -1
- package/dist/tools/debug.d.ts +6 -0
- package/dist/tools/debug.js +26 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/helpers.d.ts +81 -5
- package/dist/tools/helpers.js +138 -4
- package/dist/tools/helpers.js.map +1 -1
- package/dist/tools/listening.js +223 -52
- package/dist/tools/listening.js.map +1 -1
- package/dist/tools/reading.js +74 -22
- package/dist/tools/reading.js.map +1 -1
- package/dist/tools/running.js +87 -43
- package/dist/tools/running.js.map +1 -1
- package/dist/tools/watching.js +199 -32
- package/dist/tools/watching.js.map +1 -1
- package/dist/ui-bundles.d.ts +3 -0
- package/dist/ui-bundles.js +8 -0
- package/dist/ui-bundles.js.map +1 -0
- package/dist/worker.d.ts +2 -1
- package/dist/worker.js +55 -30
- package/dist/worker.js.map +1 -1
- package/package.json +18 -3
package/dist/tools/helpers.d.ts
CHANGED
|
@@ -1,32 +1,108 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { RewindClient } from '../client.js';
|
|
3
|
+
export type TextBlock = {
|
|
4
|
+
type: 'text';
|
|
5
|
+
text: string;
|
|
6
|
+
};
|
|
7
|
+
export type ImageBlock = {
|
|
8
|
+
type: 'image';
|
|
9
|
+
data: string;
|
|
10
|
+
mimeType: string;
|
|
11
|
+
};
|
|
12
|
+
export type ResourceLinkBlock = {
|
|
13
|
+
type: 'resource_link';
|
|
14
|
+
uri: string;
|
|
15
|
+
name: string;
|
|
16
|
+
mimeType?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
};
|
|
19
|
+
export type ContentBlock = TextBlock | ImageBlock | ResourceLinkBlock;
|
|
20
|
+
export type ToolResult<S = unknown> = {
|
|
21
|
+
content: ContentBlock[];
|
|
22
|
+
structuredContent?: S;
|
|
23
|
+
isError?: boolean;
|
|
24
|
+
};
|
|
25
|
+
/** Build a text content block. */
|
|
26
|
+
export declare function text(value: string): TextBlock;
|
|
27
|
+
/**
|
|
28
|
+
* Build a resource_link content block.
|
|
29
|
+
* Returns null if the URI is missing/empty so callers can `.filter(Boolean)`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resourceLink(uri: string | null | undefined, name: string, opts?: {
|
|
32
|
+
mimeType?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
}): ResourceLinkBlock | null;
|
|
35
|
+
/**
|
|
36
|
+
* An image attachment as returned by Rewind entity responses.
|
|
37
|
+
* Accepts both `cdn_url` (live API) and `url` (OpenAPI-schema-example field).
|
|
38
|
+
*/
|
|
39
|
+
export type ImageAttachment = {
|
|
40
|
+
cdn_url?: string | null;
|
|
41
|
+
url?: string | null;
|
|
42
|
+
thumbhash?: string | null;
|
|
43
|
+
dominant_color?: string | null;
|
|
44
|
+
accent_color?: string | null;
|
|
45
|
+
} | null | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Build an image content block from an entity's image attachment by fetching
|
|
48
|
+
* the public CDN URL directly. Returns null on any failure or missing URL --
|
|
49
|
+
* never throws. Image blocks are best-effort; we always want to return
|
|
50
|
+
* text/data even if the image fetch breaks.
|
|
51
|
+
*
|
|
52
|
+
* Pass `targetPx` to request a smaller transform -- overrides the `width` and
|
|
53
|
+
* `height` query params on the CDN URL. Useful for list tools that must stay
|
|
54
|
+
* under the client's per-response size budget. Omit for full-size (typically
|
|
55
|
+
* 300x300) detail-tool posters.
|
|
56
|
+
*/
|
|
57
|
+
export declare function imageBlock(client: RewindClient, image: ImageAttachment, targetPx?: number): Promise<ImageBlock | null>;
|
|
58
|
+
/** Target pixel size for list-tool image blocks. Keeps responses under ~250KB. */
|
|
59
|
+
export declare const LIST_IMAGE_PX = 150;
|
|
3
60
|
/**
|
|
4
|
-
* Wrap a tool handler
|
|
61
|
+
* Wrap a tool handler that returns only text.
|
|
5
62
|
* Returns { content, isError: true } on failure.
|
|
6
63
|
*/
|
|
7
64
|
export declare function withErrorHandling(fn: () => Promise<string>): Promise<{
|
|
8
|
-
content:
|
|
9
|
-
type: 'text';
|
|
10
|
-
text: string;
|
|
11
|
-
}[];
|
|
65
|
+
content: TextBlock[];
|
|
12
66
|
isError?: boolean;
|
|
13
67
|
}>;
|
|
68
|
+
/**
|
|
69
|
+
* Wrap a tool handler that returns a rich response (text + images + resource_links + structuredContent).
|
|
70
|
+
* Returns a well-formed error ToolResult on failure.
|
|
71
|
+
*
|
|
72
|
+
* Callers should construct content arrays via the builders above and filter nulls:
|
|
73
|
+
* return {
|
|
74
|
+
* content: [text(summary), ...blocks.filter(Boolean)],
|
|
75
|
+
* structuredContent: data,
|
|
76
|
+
* };
|
|
77
|
+
*/
|
|
78
|
+
export declare function withRichResponse<S = unknown>(fn: () => Promise<ToolResult<S>>): Promise<ToolResult<S>>;
|
|
14
79
|
/** Format a date string as "Jan 15, 2025" */
|
|
15
80
|
export declare function formatDate(iso: string | null | undefined): string;
|
|
16
81
|
/** Format a date string as relative time like "2h ago" */
|
|
17
82
|
export declare function timeAgo(iso: string): string;
|
|
18
83
|
/** Format a number with commas */
|
|
19
84
|
export declare function fmt(n: number | null | undefined): string;
|
|
85
|
+
/**
|
|
86
|
+
* Format a Letterboxd-style 0-5 star user rating. The Rewind API stores
|
|
87
|
+
* these in the 0-5 half-star range (e.g. 4.5 = four and a half stars).
|
|
88
|
+
* Renders as "4.5★" or "4★" -- never "4/10", which is a different scale.
|
|
89
|
+
*/
|
|
90
|
+
export declare function formatStars(r: number | null | undefined): string;
|
|
20
91
|
/** Common date filter params reused across tools. */
|
|
21
92
|
export declare const dateFilterParams: {
|
|
22
93
|
date: z.ZodOptional<z.ZodString>;
|
|
23
94
|
from: z.ZodOptional<z.ZodString>;
|
|
24
95
|
to: z.ZodOptional<z.ZodString>;
|
|
25
96
|
};
|
|
97
|
+
/** Shared optional input for tools that return image content blocks. */
|
|
98
|
+
export declare const includeImagesParam: {
|
|
99
|
+
include_images: z.ZodDefault<z.ZodBoolean>;
|
|
100
|
+
};
|
|
26
101
|
/** Standard annotations for all Rewind tools (read-only, open-world). */
|
|
27
102
|
export declare const READ_ONLY_ANNOTATIONS: {
|
|
28
103
|
readOnlyHint: true;
|
|
29
104
|
destructiveHint: false;
|
|
105
|
+
idempotentHint: true;
|
|
30
106
|
openWorldHint: true;
|
|
31
107
|
};
|
|
32
108
|
export type { RewindClient };
|
package/dist/tools/helpers.js
CHANGED
|
@@ -1,21 +1,136 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
// ─── Content block builders ──────────────────────────────────────────
|
|
3
|
+
/** Build a text content block. */
|
|
4
|
+
export function text(value) {
|
|
5
|
+
return { type: 'text', text: value };
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build a resource_link content block.
|
|
9
|
+
* Returns null if the URI is missing/empty so callers can `.filter(Boolean)`.
|
|
10
|
+
*/
|
|
11
|
+
export function resourceLink(uri, name, opts) {
|
|
12
|
+
if (!uri)
|
|
13
|
+
return null;
|
|
14
|
+
const block = { type: 'resource_link', uri, name };
|
|
15
|
+
if (opts?.mimeType)
|
|
16
|
+
block.mimeType = opts.mimeType;
|
|
17
|
+
if (opts?.description)
|
|
18
|
+
block.description = opts.description;
|
|
19
|
+
return block;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build an image content block from an entity's image attachment by fetching
|
|
23
|
+
* the public CDN URL directly. Returns null on any failure or missing URL --
|
|
24
|
+
* never throws. Image blocks are best-effort; we always want to return
|
|
25
|
+
* text/data even if the image fetch breaks.
|
|
26
|
+
*
|
|
27
|
+
* Pass `targetPx` to request a smaller transform -- overrides the `width` and
|
|
28
|
+
* `height` query params on the CDN URL. Useful for list tools that must stay
|
|
29
|
+
* under the client's per-response size budget. Omit for full-size (typically
|
|
30
|
+
* 300x300) detail-tool posters.
|
|
31
|
+
*/
|
|
32
|
+
export async function imageBlock(client, image, targetPx) {
|
|
33
|
+
if (!image)
|
|
34
|
+
return null;
|
|
35
|
+
let url = image.cdn_url ?? image.url ?? null;
|
|
36
|
+
if (!url)
|
|
37
|
+
return null;
|
|
38
|
+
if (targetPx)
|
|
39
|
+
url = resizeCdnUrl(url, targetPx);
|
|
40
|
+
try {
|
|
41
|
+
const { bytes, mimeType } = await client.getBinaryFromUrl(url);
|
|
42
|
+
return {
|
|
43
|
+
type: 'image',
|
|
44
|
+
data: bytesToBase64(bytes),
|
|
45
|
+
mimeType,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Rewrite a Rewind CDN URL to use the Cloudflare Images transform path
|
|
54
|
+
* (`/cdn-cgi/image/<opts>/<asset>`) at the requested pixel size. The raw
|
|
55
|
+
* `cdn_url` field returned by the API points at the original (full-res) R2
|
|
56
|
+
* object and does not honor width/height query params. Transform URLs do.
|
|
57
|
+
*
|
|
58
|
+
* Input: https://cdn.rewind.rest/watching/movies/707/original.jpg?width=300&height=300&...&v=1
|
|
59
|
+
* Output: https://cdn.rewind.rest/cdn-cgi/image/width=150,height=150,fit=cover,format=auto,quality=85/watching/movies/707/original.jpg?v=1
|
|
60
|
+
*
|
|
61
|
+
* Returns the input unchanged if it is not a valid URL or is already a
|
|
62
|
+
* transform URL.
|
|
63
|
+
*/
|
|
64
|
+
function resizeCdnUrl(url, targetPx) {
|
|
65
|
+
try {
|
|
66
|
+
const u = new URL(url);
|
|
67
|
+
if (u.pathname.startsWith('/cdn-cgi/image/'))
|
|
68
|
+
return url;
|
|
69
|
+
const opts = `width=${targetPx},height=${targetPx},fit=cover,format=auto,quality=85`;
|
|
70
|
+
const version = u.searchParams.get('v');
|
|
71
|
+
const versionSuffix = version ? `?v=${version}` : '';
|
|
72
|
+
return `${u.origin}/cdn-cgi/image/${opts}${u.pathname}${versionSuffix}`;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return url;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Target pixel size for list-tool image blocks. Keeps responses under ~250KB. */
|
|
79
|
+
export const LIST_IMAGE_PX = 150;
|
|
2
80
|
/**
|
|
3
|
-
*
|
|
81
|
+
* Convert bytes to base64. Uses globalThis.Buffer when available (Node / Workers),
|
|
82
|
+
* falls back to a manual encoding that works in any JS runtime.
|
|
83
|
+
*/
|
|
84
|
+
function bytesToBase64(bytes) {
|
|
85
|
+
const g = globalThis;
|
|
86
|
+
if (g.Buffer)
|
|
87
|
+
return g.Buffer.from(bytes).toString('base64');
|
|
88
|
+
let binary = '';
|
|
89
|
+
for (let i = 0; i < bytes.length; i++)
|
|
90
|
+
binary += String.fromCharCode(bytes[i]);
|
|
91
|
+
return btoa(binary);
|
|
92
|
+
}
|
|
93
|
+
// ─── Response wrappers ───────────────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* Wrap a tool handler that returns only text.
|
|
4
96
|
* Returns { content, isError: true } on failure.
|
|
5
97
|
*/
|
|
6
98
|
export async function withErrorHandling(fn) {
|
|
7
99
|
try {
|
|
8
|
-
const
|
|
9
|
-
return { content: [
|
|
100
|
+
const textValue = await fn();
|
|
101
|
+
return { content: [text(textValue)] };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
105
|
+
return {
|
|
106
|
+
content: [text(`Error: ${message}`)],
|
|
107
|
+
isError: true,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Wrap a tool handler that returns a rich response (text + images + resource_links + structuredContent).
|
|
113
|
+
* Returns a well-formed error ToolResult on failure.
|
|
114
|
+
*
|
|
115
|
+
* Callers should construct content arrays via the builders above and filter nulls:
|
|
116
|
+
* return {
|
|
117
|
+
* content: [text(summary), ...blocks.filter(Boolean)],
|
|
118
|
+
* structuredContent: data,
|
|
119
|
+
* };
|
|
120
|
+
*/
|
|
121
|
+
export async function withRichResponse(fn) {
|
|
122
|
+
try {
|
|
123
|
+
return await fn();
|
|
10
124
|
}
|
|
11
125
|
catch (error) {
|
|
12
126
|
const message = error instanceof Error ? error.message : String(error);
|
|
13
127
|
return {
|
|
14
|
-
content: [
|
|
128
|
+
content: [text(`Error: ${message}`)],
|
|
15
129
|
isError: true,
|
|
16
130
|
};
|
|
17
131
|
}
|
|
18
132
|
}
|
|
133
|
+
// ─── Existing utilities (unchanged) ──────────────────────────────────
|
|
19
134
|
/** Format a date string as "Jan 15, 2025" */
|
|
20
135
|
export function formatDate(iso) {
|
|
21
136
|
if (!iso)
|
|
@@ -48,6 +163,17 @@ export function fmt(n) {
|
|
|
48
163
|
return '0';
|
|
49
164
|
return n.toLocaleString('en-US');
|
|
50
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Format a Letterboxd-style 0-5 star user rating. The Rewind API stores
|
|
168
|
+
* these in the 0-5 half-star range (e.g. 4.5 = four and a half stars).
|
|
169
|
+
* Renders as "4.5★" or "4★" -- never "4/10", which is a different scale.
|
|
170
|
+
*/
|
|
171
|
+
export function formatStars(r) {
|
|
172
|
+
if (r === null || r === undefined)
|
|
173
|
+
return '';
|
|
174
|
+
const display = r % 1 === 0 ? r.toFixed(0) : r.toFixed(1);
|
|
175
|
+
return `${display}★`;
|
|
176
|
+
}
|
|
51
177
|
/** Common date filter params reused across tools. */
|
|
52
178
|
export const dateFilterParams = {
|
|
53
179
|
date: z
|
|
@@ -60,10 +186,18 @@ export const dateFilterParams = {
|
|
|
60
186
|
.describe('Optional: start of date range (ISO 8601)'),
|
|
61
187
|
to: z.string().optional().describe('Optional: end of date range (ISO 8601)'),
|
|
62
188
|
};
|
|
189
|
+
/** Shared optional input for tools that return image content blocks. */
|
|
190
|
+
export const includeImagesParam = {
|
|
191
|
+
include_images: z
|
|
192
|
+
.boolean()
|
|
193
|
+
.default(true)
|
|
194
|
+
.describe('Include artwork/poster image content blocks in the response. Default true. Set false to keep responses small.'),
|
|
195
|
+
};
|
|
63
196
|
/** Standard annotations for all Rewind tools (read-only, open-world). */
|
|
64
197
|
export const READ_ONLY_ANNOTATIONS = {
|
|
65
198
|
readOnlyHint: true,
|
|
66
199
|
destructiveHint: false,
|
|
200
|
+
idempotentHint: true,
|
|
67
201
|
openWorldHint: true,
|
|
68
202
|
};
|
|
69
203
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"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"}
|