rewind-mcp-server 0.1.1 → 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 +84 -11
- 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.js +710 -16
- package/dist/__tests__/server.test.js.map +1 -1
- 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 +78 -37
- 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 +13 -2
package/dist/tools/running.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { withRichResponse, text, resourceLink, formatDate, timeAgo, fmt, READ_ONLY_ANNOTATIONS, dateFilterParams, } from './helpers.js';
|
|
3
3
|
export function registerRunningTools(server, client) {
|
|
4
|
-
// get_running_stats
|
|
5
|
-
server.tool('get_running_stats', 'Get overall running statistics from Strava including total runs, distance, elevation, duration, average pace, and Eddington number.', {}, READ_ONLY_ANNOTATIONS, async () =>
|
|
4
|
+
// get_running_stats ──────────────────────────────────────────────
|
|
5
|
+
server.tool('get_running_stats', 'Get overall running statistics from Strava including total runs, distance, elevation, duration, average pace, and Eddington number.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
6
6
|
const { data } = await client.get('/running/stats');
|
|
7
|
-
|
|
7
|
+
const summary = [
|
|
8
8
|
'Running Stats:',
|
|
9
9
|
`- Total runs: ${fmt(data.total_runs)}`,
|
|
10
10
|
`- Total distance: ${fmt(Math.round(data.total_distance_mi))} mi`,
|
|
@@ -19,54 +19,67 @@ export function registerRunningTools(server, client) {
|
|
|
19
19
|
]
|
|
20
20
|
.filter((l) => l !== null)
|
|
21
21
|
.join('\n');
|
|
22
|
+
return { content: [text(summary)], structuredContent: data };
|
|
22
23
|
}));
|
|
23
|
-
// get_recent_runs
|
|
24
|
-
server.tool('get_recent_runs', 'Get recent running activities from Strava. Returns
|
|
24
|
+
// get_recent_runs ────────────────────────────────────────────────
|
|
25
|
+
server.tool('get_recent_runs', 'Get recent running activities from Strava. Returns runs with ID, distance, pace, duration, location, and Strava activity resource links for top-N.', {
|
|
25
26
|
limit: z
|
|
26
27
|
.number()
|
|
27
28
|
.min(1)
|
|
28
29
|
.max(50)
|
|
29
30
|
.default(10)
|
|
30
|
-
.describe('Number of recent runs to return'),
|
|
31
|
-
|
|
32
|
-
.
|
|
33
|
-
.
|
|
34
|
-
.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (!data.length)
|
|
46
|
-
return 'No recent runs found.';
|
|
31
|
+
.describe('Number of recent runs to return (max 50)'),
|
|
32
|
+
page: z
|
|
33
|
+
.number()
|
|
34
|
+
.min(1)
|
|
35
|
+
.default(1)
|
|
36
|
+
.describe('Page number for pagination. Combine with limit to page through longer windows.'),
|
|
37
|
+
...dateFilterParams,
|
|
38
|
+
}, READ_ONLY_ANNOTATIONS, async ({ limit, page, date, from, to }) => withRichResponse(async () => {
|
|
39
|
+
const { data } = await client.get('/running/recent', { limit, page, date, from, to });
|
|
40
|
+
if (!data.length) {
|
|
41
|
+
return {
|
|
42
|
+
content: [text('No recent runs found.')],
|
|
43
|
+
structuredContent: { items: [] },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
47
46
|
const lines = ['Recent runs:'];
|
|
48
47
|
for (const [i, r] of data.entries()) {
|
|
49
48
|
const location = r.city && r.state ? ` in ${r.city}, ${r.state}` : '';
|
|
50
49
|
const race = r.is_race ? ' [RACE]' : '';
|
|
51
50
|
lines.push(`${i + 1}. [ID: ${r.id}] ${r.name}${race} -- ${r.distance_mi.toFixed(1)} mi, ${r.pace}/mi, ${r.duration}${location} (${timeAgo(r.date)})`);
|
|
52
51
|
}
|
|
53
|
-
|
|
52
|
+
const topN = data.slice(0, 5);
|
|
53
|
+
const links = topN
|
|
54
|
+
.map((r) => resourceLink(r.strava_url, `Strava -- ${r.name}`, {
|
|
55
|
+
mimeType: 'text/html',
|
|
56
|
+
}))
|
|
57
|
+
.filter((b) => b !== null);
|
|
58
|
+
const content = [text(lines.join('\n')), ...links];
|
|
59
|
+
return { content, structuredContent: { items: data } };
|
|
54
60
|
}));
|
|
55
|
-
// get_personal_records
|
|
56
|
-
server.tool('get_personal_records', 'Get personal running records (PRs) from Strava -- fastest times at standard distances like mile, 5K, 10K, half marathon, marathon.', {}, READ_ONLY_ANNOTATIONS, async () =>
|
|
61
|
+
// get_personal_records ───────────────────────────────────────────
|
|
62
|
+
server.tool('get_personal_records', 'Get personal running records (PRs) from Strava -- fastest times at standard distances like mile, 5K, 10K, half marathon, marathon.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
57
63
|
const { data } = await client.get('/running/prs');
|
|
58
|
-
if (!data.length)
|
|
59
|
-
return
|
|
64
|
+
if (!data.length) {
|
|
65
|
+
return {
|
|
66
|
+
content: [text('No personal records found.')],
|
|
67
|
+
structuredContent: { items: [] },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
60
70
|
const lines = ['Personal Records:'];
|
|
61
71
|
for (const pr of data) {
|
|
62
72
|
lines.push(`- ${pr.distance_label}: ${pr.time} (${pr.pace}/mi) -- ${pr.activity_name} [ID: ${pr.activity_id}], ${formatDate(pr.date)}`);
|
|
63
73
|
}
|
|
64
|
-
return
|
|
74
|
+
return {
|
|
75
|
+
content: [text(lines.join('\n'))],
|
|
76
|
+
structuredContent: { items: data },
|
|
77
|
+
};
|
|
65
78
|
}));
|
|
66
|
-
// get_running_streaks
|
|
67
|
-
server.tool('get_running_streaks', 'Get running streak data from Strava -- current consecutive days with runs and the longest streak ever.', {}, READ_ONLY_ANNOTATIONS, async () =>
|
|
79
|
+
// get_running_streaks ────────────────────────────────────────────
|
|
80
|
+
server.tool('get_running_streaks', 'Get running streak data from Strava -- current consecutive days with runs and the longest streak ever.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
68
81
|
const { data } = await client.get('/running/streaks');
|
|
69
|
-
|
|
82
|
+
const summary = [
|
|
70
83
|
'Running Streaks:',
|
|
71
84
|
'',
|
|
72
85
|
`Current streak: ${data.current.days} days`,
|
|
@@ -81,13 +94,14 @@ export function registerRunningTools(server, client) {
|
|
|
81
94
|
]
|
|
82
95
|
.filter(Boolean)
|
|
83
96
|
.join('\n');
|
|
97
|
+
return { content: [text(summary)], structuredContent: data };
|
|
84
98
|
}));
|
|
85
|
-
// get_activity_details
|
|
86
|
-
server.tool('get_activity_details', 'Get detailed information about a specific running activity by ID, including distance, pace, heart rate, elevation,
|
|
99
|
+
// get_activity_details ───────────────────────────────────────────
|
|
100
|
+
server.tool('get_activity_details', 'Get detailed information about a specific running activity by ID, including distance, pace, heart rate, elevation, calories, and a Strava resource link.', {
|
|
87
101
|
id: z
|
|
88
102
|
.number()
|
|
89
103
|
.describe('Activity ID (from get_recent_runs or get_personal_records)'),
|
|
90
|
-
}, READ_ONLY_ANNOTATIONS, async ({ id }) =>
|
|
104
|
+
}, READ_ONLY_ANNOTATIONS, async ({ id }) => withRichResponse(async () => {
|
|
91
105
|
const data = await client.get(`/running/activities/${id}`);
|
|
92
106
|
const lines = [
|
|
93
107
|
`${data.name}${data.is_race ? ' [RACE]' : ''}`,
|
|
@@ -108,19 +122,28 @@ export function registerRunningTools(server, client) {
|
|
|
108
122
|
lines.push(`Cadence: ${Math.round(data.cadence)} spm`);
|
|
109
123
|
if (data.calories)
|
|
110
124
|
lines.push(`Calories: ${fmt(data.calories)}`);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
125
|
+
const stravaLink = resourceLink(data.strava_url, 'Strava activity', {
|
|
126
|
+
mimeType: 'text/html',
|
|
127
|
+
});
|
|
128
|
+
const content = [
|
|
129
|
+
text(lines.join('\n')),
|
|
130
|
+
...(stravaLink ? [stravaLink] : []),
|
|
131
|
+
];
|
|
132
|
+
return { content, structuredContent: data };
|
|
114
133
|
}));
|
|
115
|
-
// get_activity_splits
|
|
134
|
+
// get_activity_splits ────────────────────────────────────────────
|
|
116
135
|
server.tool('get_activity_splits', 'Get per-mile splits for a running activity. Shows pace, elevation, and heart rate for each mile. Get the activity ID from get_recent_runs.', {
|
|
117
136
|
id: z
|
|
118
137
|
.number()
|
|
119
138
|
.describe('Activity ID (from get_recent_runs or get_personal_records)'),
|
|
120
|
-
}, READ_ONLY_ANNOTATIONS, async ({ id }) =>
|
|
139
|
+
}, READ_ONLY_ANNOTATIONS, async ({ id }) => withRichResponse(async () => {
|
|
121
140
|
const { data } = await client.get(`/running/activities/${id}/splits`);
|
|
122
|
-
if (!data.length)
|
|
123
|
-
return
|
|
141
|
+
if (!data.length) {
|
|
142
|
+
return {
|
|
143
|
+
content: [text('No splits found for this activity.')],
|
|
144
|
+
structuredContent: { activity_id: id, items: [] },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
124
147
|
const lines = [`Mile splits for activity ${id}:`];
|
|
125
148
|
for (const s of data) {
|
|
126
149
|
const hr = s.heartrate ? ` | ${Math.round(s.heartrate)} bpm` : '';
|
|
@@ -129,7 +152,28 @@ export function registerRunningTools(server, client) {
|
|
|
129
152
|
: '';
|
|
130
153
|
lines.push(` Mile ${s.split}: ${s.pace}${elev}${hr}`);
|
|
131
154
|
}
|
|
132
|
-
return
|
|
155
|
+
return {
|
|
156
|
+
content: [text(lines.join('\n'))],
|
|
157
|
+
structuredContent: { activity_id: id, items: data },
|
|
158
|
+
};
|
|
159
|
+
}));
|
|
160
|
+
// get_running_years ──────────────────────────────────────────────
|
|
161
|
+
server.tool('get_running_years', 'Get per-year summary of running activity: total runs, distance, elevation, duration, average pace, longest run, and race count for every year on record.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
162
|
+
const { data } = await client.get('/running/stats/years');
|
|
163
|
+
if (!data.length) {
|
|
164
|
+
return {
|
|
165
|
+
content: [text('No yearly running data available.')],
|
|
166
|
+
structuredContent: { items: [] },
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const lines = ['Running by year:'];
|
|
170
|
+
for (const y of data) {
|
|
171
|
+
lines.push(` ${y.year}: ${fmt(y.total_runs)} runs, ${fmt(Math.round(y.total_distance_mi))} mi, longest ${y.longest_run_mi ?? '-'} mi, races: ${y.race_count}`);
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
content: [text(lines.join('\n'))],
|
|
175
|
+
structuredContent: { items: data },
|
|
176
|
+
};
|
|
133
177
|
}));
|
|
134
178
|
}
|
|
135
179
|
//# sourceMappingURL=running.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"running.js","sourceRoot":"","sources":["../../src/tools/running.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"running.js","sourceRoot":"","sources":["../../src/tools/running.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/watching.js
CHANGED
|
@@ -1,31 +1,95 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { withRichResponse, text, resourceLink, imageBlock, formatDate, timeAgo, fmt, formatStars, READ_ONLY_ANNOTATIONS, dateFilterParams, includeImagesParam, LIST_IMAGE_PX, } from './helpers.js';
|
|
3
|
+
const POSTER_TOP_N = 5;
|
|
3
4
|
export function registerWatchingTools(server, client) {
|
|
4
|
-
// get_recent_watches
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
// get_recent_watches ─────────────────────────────────────────────
|
|
6
|
+
// Registered via the modern server.registerTool so we can attach
|
|
7
|
+
// `_meta.ui.resourceUri`. Hosts that support MCP Apps (Claude Desktop,
|
|
8
|
+
// Claude web, VS Code Copilot) render the poster grid inline; others fall
|
|
9
|
+
// back to the text + image + resource_link response.
|
|
10
|
+
server.registerTool('get_recent_watches', {
|
|
11
|
+
title: 'Recent watches',
|
|
12
|
+
description: 'Get recently watched movies and TV shows from Plex and Letterboxd. Returns titles, ratings, watch dates, top-N posters, and Letterboxd review links where available. In MCP Apps hosts, renders an interactive poster grid inline.',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
limit: z
|
|
15
|
+
.number()
|
|
16
|
+
.min(1)
|
|
17
|
+
.max(50)
|
|
18
|
+
.default(10)
|
|
19
|
+
.describe('Number of recent watches to return (max 50)'),
|
|
20
|
+
page: z
|
|
21
|
+
.number()
|
|
22
|
+
.min(1)
|
|
23
|
+
.default(1)
|
|
24
|
+
.describe('Page number for pagination (1-indexed). Combine with limit to page through longer windows like "last month".'),
|
|
25
|
+
...dateFilterParams,
|
|
26
|
+
...includeImagesParam,
|
|
27
|
+
},
|
|
28
|
+
annotations: READ_ONLY_ANNOTATIONS,
|
|
29
|
+
_meta: {
|
|
30
|
+
ui: { resourceUri: 'ui://rewind/recent-watches.html' },
|
|
31
|
+
'ui/resourceUri': 'ui://rewind/recent-watches.html',
|
|
32
|
+
},
|
|
33
|
+
}, async ({ limit, page, date, from, to, include_images }) => withRichResponse(async () => {
|
|
34
|
+
const { data: raw } = await client.get('/watching/recent', { limit, page, date, from, to });
|
|
35
|
+
// Dedup by movie id, keep the most recent watch event per movie.
|
|
36
|
+
// `/v1/watching/recent` returns every watch event, which produces
|
|
37
|
+
// duplicates when a film has both a Plex record and a Letterboxd
|
|
38
|
+
// log (or a sync created multiple entries).
|
|
39
|
+
const seen = new Map();
|
|
40
|
+
for (const w of raw) {
|
|
41
|
+
const existing = seen.get(w.movie.id);
|
|
42
|
+
if (!existing) {
|
|
43
|
+
seen.set(w.movie.id, w);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const existingTs = Date.parse(existing.watched_at);
|
|
47
|
+
const candidateTs = Date.parse(w.watched_at);
|
|
48
|
+
// Prefer the record with a user_rating; otherwise the most recent.
|
|
49
|
+
const prefer = (w.user_rating !== null && existing.user_rating === null) ||
|
|
50
|
+
candidateTs > existingTs;
|
|
51
|
+
if (prefer)
|
|
52
|
+
seen.set(w.movie.id, w);
|
|
53
|
+
}
|
|
54
|
+
const data = Array.from(seen.values()).sort((a, b) => Date.parse(b.watched_at) - Date.parse(a.watched_at));
|
|
55
|
+
if (!data.length) {
|
|
56
|
+
return {
|
|
57
|
+
content: [text('No recent watches found.')],
|
|
58
|
+
structuredContent: { items: [] },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
17
61
|
const lines = ['Recent watches:'];
|
|
18
62
|
for (const [i, w] of data.entries()) {
|
|
19
63
|
const year = w.movie.year ? ` (${w.movie.year})` : '';
|
|
20
64
|
const director = w.movie.director ? ` dir. ${w.movie.director}` : '';
|
|
21
|
-
const rating = w.user_rating !== null ? ` -- ${w.user_rating}
|
|
65
|
+
const rating = w.user_rating !== null ? ` -- ${formatStars(w.user_rating)}` : '';
|
|
22
66
|
const rewatch = w.rewatch ? ' [rewatch]' : '';
|
|
23
|
-
lines.push(`${i + 1}. ${w.movie.title}${year}${director}${rating}${rewatch} (${timeAgo(w.watched_at)})`);
|
|
67
|
+
lines.push(`${i + 1}. [ID: ${w.movie.id}] ${w.movie.title}${year}${director}${rating}${rewatch} (${timeAgo(w.watched_at)})`);
|
|
24
68
|
}
|
|
25
|
-
|
|
69
|
+
const topN = data.slice(0, POSTER_TOP_N);
|
|
70
|
+
const images = include_images
|
|
71
|
+
? await Promise.all(topN.map((w) => imageBlock(client, w.movie.image, LIST_IMAGE_PX)))
|
|
72
|
+
: [];
|
|
73
|
+
const links = topN
|
|
74
|
+
.map((w) => resourceLink(w.review_url, `Letterboxd -- ${w.movie.title}`, {
|
|
75
|
+
mimeType: 'text/html',
|
|
76
|
+
}))
|
|
77
|
+
.filter((b) => b !== null);
|
|
78
|
+
const content = [
|
|
79
|
+
text(lines.join('\n')),
|
|
80
|
+
...images.filter((b) => b !== null),
|
|
81
|
+
...links,
|
|
82
|
+
];
|
|
83
|
+
return {
|
|
84
|
+
content,
|
|
85
|
+
structuredContent: { items: data },
|
|
86
|
+
};
|
|
26
87
|
}));
|
|
27
|
-
// get_movie_details
|
|
28
|
-
server.tool('get_movie_details', 'Get detailed information about a specific movie by ID, including director, genres, rating, summary,
|
|
88
|
+
// get_movie_details ──────────────────────────────────────────────
|
|
89
|
+
server.tool('get_movie_details', 'Get detailed information about a specific movie by ID, including director, genres, rating, summary, watch history, poster image, and Letterboxd review links for rated watches.', {
|
|
90
|
+
id: z.number().describe('Movie ID'),
|
|
91
|
+
...includeImagesParam,
|
|
92
|
+
}, READ_ONLY_ANNOTATIONS, async ({ id, include_images }) => withRichResponse(async () => {
|
|
29
93
|
const data = await client.get(`/watching/movies/${id}`);
|
|
30
94
|
const lines = [
|
|
31
95
|
`${data.title}${data.year ? ` (${data.year})` : ''}`,
|
|
@@ -37,13 +101,15 @@ export function registerWatchingTools(server, client) {
|
|
|
37
101
|
data.genres.length ? `Genres: ${data.genres.join(', ')}` : null,
|
|
38
102
|
data.duration_min ? `Runtime: ${data.duration_min} min` : null,
|
|
39
103
|
data.rating ? `Rated: ${data.rating}` : null,
|
|
40
|
-
data.tmdb_rating ? `TMDB: ${data.tmdb_rating}/10` : null,
|
|
104
|
+
data.tmdb_rating ? `TMDB: ${data.tmdb_rating.toFixed(1)}/10` : null,
|
|
41
105
|
data.summary ? `\n${data.summary}` : null,
|
|
42
106
|
].filter((l) => l !== null);
|
|
43
107
|
if (data.watch_history.length) {
|
|
44
108
|
lines.push('', 'Watch History:');
|
|
45
109
|
for (const w of data.watch_history) {
|
|
46
|
-
const rating = w.user_rating !== null
|
|
110
|
+
const rating = w.user_rating !== null
|
|
111
|
+
? ` -- rated ${formatStars(w.user_rating)}`
|
|
112
|
+
: '';
|
|
47
113
|
const rewatch = w.rewatch ? ' [rewatch]' : '';
|
|
48
114
|
const source = w.source ? ` via ${w.source}` : '';
|
|
49
115
|
lines.push(` - ${formatDate(w.watched_at)}${rating}${rewatch}${source}`);
|
|
@@ -52,12 +118,30 @@ export function registerWatchingTools(server, client) {
|
|
|
52
118
|
}
|
|
53
119
|
}
|
|
54
120
|
}
|
|
55
|
-
|
|
121
|
+
const poster = include_images
|
|
122
|
+
? await imageBlock(client, data.image)
|
|
123
|
+
: null;
|
|
124
|
+
// Collect unique review URLs across the watch history
|
|
125
|
+
const seen = new Set();
|
|
126
|
+
const reviewLinks = data.watch_history
|
|
127
|
+
.map((w) => {
|
|
128
|
+
if (!w.review_url || seen.has(w.review_url))
|
|
129
|
+
return null;
|
|
130
|
+
seen.add(w.review_url);
|
|
131
|
+
return resourceLink(w.review_url, `Letterboxd review (${formatDate(w.watched_at)})`, { mimeType: 'text/html' });
|
|
132
|
+
})
|
|
133
|
+
.filter((b) => b !== null);
|
|
134
|
+
const content = [
|
|
135
|
+
text(lines.join('\n')),
|
|
136
|
+
...(poster ? [poster] : []),
|
|
137
|
+
...reviewLinks,
|
|
138
|
+
];
|
|
139
|
+
return { content, structuredContent: data };
|
|
56
140
|
}));
|
|
57
|
-
// get_watching_stats
|
|
58
|
-
server.tool('get_watching_stats', 'Get overall watching statistics including total movies, watch time, movies this year, top genre, top director, TV show counts, and episode counts. Supports date filtering.', { ...dateFilterParams }, READ_ONLY_ANNOTATIONS, async ({ date, from, to }) =>
|
|
141
|
+
// get_watching_stats ─────────────────────────────────────────────
|
|
142
|
+
server.tool('get_watching_stats', 'Get overall watching statistics including total movies, watch time, movies this year, top genre, top director, TV show counts, and episode counts. Supports date filtering.', { ...dateFilterParams }, READ_ONLY_ANNOTATIONS, async ({ date, from, to }) => withRichResponse(async () => {
|
|
59
143
|
const { data } = await client.get('/watching/stats', { date, from, to });
|
|
60
|
-
|
|
144
|
+
const summary = [
|
|
61
145
|
'Watching Stats:',
|
|
62
146
|
'',
|
|
63
147
|
'Movies:',
|
|
@@ -76,9 +160,13 @@ export function registerWatchingTools(server, client) {
|
|
|
76
160
|
]
|
|
77
161
|
.filter((l) => l !== null)
|
|
78
162
|
.join('\n');
|
|
163
|
+
return {
|
|
164
|
+
content: [text(summary)],
|
|
165
|
+
structuredContent: data,
|
|
166
|
+
};
|
|
79
167
|
}));
|
|
80
|
-
// browse_movies
|
|
81
|
-
server.tool('browse_movies', 'Browse the movie collection with filters for genre, decade, director, and year. Supports sorting and
|
|
168
|
+
// browse_movies ──────────────────────────────────────────────────
|
|
169
|
+
server.tool('browse_movies', 'Browse the movie collection with filters for genre, decade, director, and year. Supports sorting, pagination, and returns top-N posters.', {
|
|
82
170
|
genre: z
|
|
83
171
|
.string()
|
|
84
172
|
.optional()
|
|
@@ -107,7 +195,8 @@ export function registerWatchingTools(server, client) {
|
|
|
107
195
|
.default(10)
|
|
108
196
|
.describe('Number of movies to return'),
|
|
109
197
|
page: z.number().min(1).default(1).describe('Page number'),
|
|
110
|
-
|
|
198
|
+
...includeImagesParam,
|
|
199
|
+
}, READ_ONLY_ANNOTATIONS, async ({ genre, decade, director, year, sort, order, limit, page, include_images, }) => withRichResponse(async () => {
|
|
111
200
|
const data = await client.get('/watching/movies', {
|
|
112
201
|
genre,
|
|
113
202
|
decade,
|
|
@@ -118,8 +207,12 @@ export function registerWatchingTools(server, client) {
|
|
|
118
207
|
limit,
|
|
119
208
|
page,
|
|
120
209
|
});
|
|
121
|
-
if (!data.data.length)
|
|
122
|
-
return
|
|
210
|
+
if (!data.data.length) {
|
|
211
|
+
return {
|
|
212
|
+
content: [text('No movies found matching those filters.')],
|
|
213
|
+
structuredContent: { items: [], pagination: data.pagination },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
123
216
|
const filters = [genre, decade, director, year].filter(Boolean);
|
|
124
217
|
const header = filters.length
|
|
125
218
|
? `Movies (filtered: ${filters.join(', ')})`
|
|
@@ -129,10 +222,84 @@ export function registerWatchingTools(server, client) {
|
|
|
129
222
|
const num = (data.pagination.page - 1) * data.pagination.limit + i + 1;
|
|
130
223
|
const yr = m.year ? ` (${m.year})` : '';
|
|
131
224
|
const dir = m.director ? ` dir. ${m.director}` : '';
|
|
132
|
-
const rating = m.tmdb_rating
|
|
225
|
+
const rating = m.tmdb_rating
|
|
226
|
+
? ` -- TMDB ${m.tmdb_rating.toFixed(1)}/10`
|
|
227
|
+
: '';
|
|
133
228
|
lines.push(`${num}. [ID: ${m.id}] ${m.title}${yr}${dir}${rating}`);
|
|
134
229
|
}
|
|
135
|
-
|
|
230
|
+
const topN = data.data.slice(0, POSTER_TOP_N);
|
|
231
|
+
const images = include_images
|
|
232
|
+
? await Promise.all(topN.map((m) => imageBlock(client, m.image, LIST_IMAGE_PX)))
|
|
233
|
+
: [];
|
|
234
|
+
const content = [
|
|
235
|
+
text(lines.join('\n')),
|
|
236
|
+
...images.filter((b) => b !== null),
|
|
237
|
+
];
|
|
238
|
+
return {
|
|
239
|
+
content,
|
|
240
|
+
structuredContent: { items: data.data, pagination: data.pagination },
|
|
241
|
+
};
|
|
242
|
+
}));
|
|
243
|
+
// get_watching_genres ────────────────────────────────────────────
|
|
244
|
+
server.tool('get_watching_genres', 'Get genre breakdown across all watched movies. Returns each genre with movie count and percentage of total watches.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
245
|
+
const { data } = await client.get('/watching/stats/genres');
|
|
246
|
+
if (!data.length) {
|
|
247
|
+
return {
|
|
248
|
+
content: [text('No genre data available.')],
|
|
249
|
+
structuredContent: { items: [] },
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
const lines = ['Genre breakdown:'];
|
|
253
|
+
for (const g of data) {
|
|
254
|
+
lines.push(`- ${g.name}: ${fmt(g.count)} (${g.percentage.toFixed(1)}%)`);
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
content: [text(lines.join('\n'))],
|
|
258
|
+
structuredContent: { items: data },
|
|
259
|
+
};
|
|
260
|
+
}));
|
|
261
|
+
// get_watching_decades ───────────────────────────────────────────
|
|
262
|
+
server.tool('get_watching_decades', 'Get decade breakdown across all watched movies. Returns each decade with movie count.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
263
|
+
const { data } = await client.get('/watching/stats/decades');
|
|
264
|
+
if (!data.length) {
|
|
265
|
+
return {
|
|
266
|
+
content: [text('No decade data available.')],
|
|
267
|
+
structuredContent: { items: [] },
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const lines = ['Decade breakdown:'];
|
|
271
|
+
for (const d of data) {
|
|
272
|
+
lines.push(`- ${d.decade}s: ${fmt(d.count)}`);
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
content: [text(lines.join('\n'))],
|
|
276
|
+
structuredContent: { items: data },
|
|
277
|
+
};
|
|
278
|
+
}));
|
|
279
|
+
// get_watching_directors ─────────────────────────────────────────
|
|
280
|
+
server.tool('get_watching_directors', 'Get top directors by watched-movie count. Returns directors ranked by how many of their films you have watched.', {
|
|
281
|
+
limit: z
|
|
282
|
+
.number()
|
|
283
|
+
.min(1)
|
|
284
|
+
.max(100)
|
|
285
|
+
.default(20)
|
|
286
|
+
.describe('Number of directors to return'),
|
|
287
|
+
}, READ_ONLY_ANNOTATIONS, async ({ limit }) => withRichResponse(async () => {
|
|
288
|
+
const { data } = await client.get('/watching/stats/directors', { limit });
|
|
289
|
+
if (!data.length) {
|
|
290
|
+
return {
|
|
291
|
+
content: [text('No director data available.')],
|
|
292
|
+
structuredContent: { items: [] },
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
const lines = ['Top directors:'];
|
|
296
|
+
for (const [i, d] of data.entries()) {
|
|
297
|
+
lines.push(`${i + 1}. ${d.name} -- ${fmt(d.count)}`);
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
content: [text(lines.join('\n'))],
|
|
301
|
+
structuredContent: { items: data },
|
|
302
|
+
};
|
|
136
303
|
}));
|
|
137
304
|
}
|
|
138
305
|
//# sourceMappingURL=watching.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watching.js","sourceRoot":"","sources":["../../src/tools/watching.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"watching.js","sourceRoot":"","sources":["../../src/tools/watching.ts"],"names":[],"mappings":"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"}
|