rewind-mcp-server 0.9.0 → 0.11.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/dist/__tests__/helpers/build-client.d.ts +2 -0
- package/dist/__tests__/helpers/build-client.js +24 -0
- package/dist/__tests__/helpers/build-client.js.map +1 -0
- package/dist/__tests__/helpers.test.js +11 -0
- package/dist/__tests__/helpers.test.js.map +1 -1
- package/dist/__tests__/image-block.live.js +1 -1
- package/dist/__tests__/image-block.live.js.map +1 -1
- package/dist/__tests__/manifest-snapshot.test.js +1 -0
- package/dist/__tests__/manifest-snapshot.test.js.map +1 -1
- package/dist/__tests__/output-schema-attending.test.d.ts +1 -0
- package/dist/__tests__/output-schema-attending.test.js +353 -0
- package/dist/__tests__/output-schema-attending.test.js.map +1 -0
- package/dist/__tests__/output-schema-collecting.test.d.ts +1 -0
- package/dist/__tests__/output-schema-collecting.test.js +155 -0
- package/dist/__tests__/output-schema-collecting.test.js.map +1 -0
- package/dist/__tests__/output-schema-cross-domain.test.d.ts +1 -0
- package/dist/__tests__/output-schema-cross-domain.test.js +142 -0
- package/dist/__tests__/output-schema-cross-domain.test.js.map +1 -0
- package/dist/__tests__/output-schema-listening.test.d.ts +1 -0
- package/dist/__tests__/output-schema-listening.test.js +235 -0
- package/dist/__tests__/output-schema-listening.test.js.map +1 -0
- package/dist/__tests__/output-schema-reading.test.d.ts +1 -0
- package/dist/__tests__/output-schema-reading.test.js +181 -0
- package/dist/__tests__/output-schema-reading.test.js.map +1 -0
- package/dist/__tests__/output-schema-running.test.d.ts +1 -0
- package/dist/__tests__/output-schema-running.test.js +185 -0
- package/dist/__tests__/output-schema-running.test.js.map +1 -0
- package/dist/__tests__/output-schema-watching.test.d.ts +1 -0
- package/dist/__tests__/output-schema-watching.test.js +190 -0
- package/dist/__tests__/output-schema-watching.test.js.map +1 -0
- package/dist/__tests__/output-schema.live.d.ts +1 -0
- package/dist/__tests__/output-schema.live.js +180 -0
- package/dist/__tests__/output-schema.live.js.map +1 -0
- package/dist/__tests__/output-schema.test.d.ts +1 -0
- package/dist/__tests__/output-schema.test.js +38 -0
- package/dist/__tests__/output-schema.test.js.map +1 -0
- package/dist/__tests__/server.test.js +1 -1
- package/dist/prompts.js +60 -32
- package/dist/prompts.js.map +1 -1
- package/dist/resources.js +26 -13
- package/dist/resources.js.map +1 -1
- package/dist/server.js +16 -13
- package/dist/server.js.map +1 -1
- package/dist/tools/attending.js +124 -90
- package/dist/tools/attending.js.map +1 -1
- package/dist/tools/collecting.js +85 -49
- package/dist/tools/collecting.js.map +1 -1
- package/dist/tools/cross-domain.js +103 -66
- package/dist/tools/cross-domain.js.map +1 -1
- package/dist/tools/helpers.d.ts +6 -2
- package/dist/tools/helpers.js +20 -11
- package/dist/tools/helpers.js.map +1 -1
- package/dist/tools/listening.js +94 -42
- package/dist/tools/listening.js.map +1 -1
- package/dist/tools/reading.js +53 -26
- package/dist/tools/reading.js.map +1 -1
- package/dist/tools/running.js +71 -28
- package/dist/tools/running.js.map +1 -1
- package/dist/tools/schemas/attending.d.ts +8225 -0
- package/dist/tools/schemas/attending.js +404 -0
- package/dist/tools/schemas/attending.js.map +1 -0
- package/dist/tools/schemas/collecting.d.ts +1011 -0
- package/dist/tools/schemas/collecting.js +108 -0
- package/dist/tools/schemas/collecting.js.map +1 -0
- package/dist/tools/schemas/cross-domain.d.ts +1001 -0
- package/dist/tools/schemas/cross-domain.js +107 -0
- package/dist/tools/schemas/cross-domain.js.map +1 -0
- package/dist/tools/schemas/listening.d.ts +4298 -0
- package/dist/tools/schemas/listening.js +255 -0
- package/dist/tools/schemas/listening.js.map +1 -0
- package/dist/tools/schemas/reading.d.ts +1421 -0
- package/dist/tools/schemas/reading.js +151 -0
- package/dist/tools/schemas/reading.js.map +1 -0
- package/dist/tools/schemas/running.d.ts +680 -0
- package/dist/tools/schemas/running.js +154 -0
- package/dist/tools/schemas/running.js.map +1 -0
- package/dist/tools/schemas/shared.d.ts +98 -0
- package/dist/tools/schemas/shared.js +74 -0
- package/dist/tools/schemas/shared.js.map +1 -0
- package/dist/tools/schemas/system.d.ts +57 -0
- package/dist/tools/schemas/system.js +22 -0
- package/dist/tools/schemas/system.js.map +1 -0
- package/dist/tools/schemas/watching.d.ts +1821 -0
- package/dist/tools/schemas/watching.js +167 -0
- package/dist/tools/schemas/watching.js.map +1 -0
- package/dist/tools/watching.js +87 -46
- package/dist/tools/watching.js.map +1 -1
- package/dist/ui-bundles.d.ts +10 -11
- package/dist/ui-bundles.js +20 -22
- package/dist/ui-bundles.js.map +1 -1
- package/package.json +1 -1
- package/dist/tools/debug.d.ts +0 -6
- package/dist/tools/debug.js +0 -26
- package/dist/tools/debug.js.map +0 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live output-schema audit (issue #110).
|
|
3
|
+
*
|
|
4
|
+
* Drives every MCP tool against the REAL Rewind API and lets the SDK's
|
|
5
|
+
* validateToolOutput check the returned structuredContent against each
|
|
6
|
+
* tool's declared outputSchema. A schema that does not match real data
|
|
7
|
+
* makes callTool reject -- this surfaces every such mismatch at once.
|
|
8
|
+
*
|
|
9
|
+
* Unlike the per-domain conformance tests (hand-authored fixtures, which
|
|
10
|
+
* can be circular), this checks against ground truth.
|
|
11
|
+
*
|
|
12
|
+
* Run:
|
|
13
|
+
* REWIND_MCP_KEY=rw_... npx tsx src/__tests__/output-schema.live.ts
|
|
14
|
+
* (REWIND_API_URL overrides the default https://api.rewind.rest)
|
|
15
|
+
*/
|
|
16
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
17
|
+
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
18
|
+
import { createServer } from '../server.js';
|
|
19
|
+
import { RewindClient } from '../client.js';
|
|
20
|
+
const API_URL = process.env.REWIND_API_URL ?? 'https://api.rewind.rest';
|
|
21
|
+
const KEY = process.env.REWIND_MCP_KEY;
|
|
22
|
+
if (!KEY) {
|
|
23
|
+
console.error('REWIND_MCP_KEY not set -- skipping live audit.');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
function resultText(res) {
|
|
28
|
+
const block = (res?.content ?? []).find(
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
(b) => b?.type === 'text');
|
|
31
|
+
return String(block?.text ?? '');
|
|
32
|
+
}
|
|
33
|
+
async function main() {
|
|
34
|
+
const rewind = new RewindClient(API_URL, KEY);
|
|
35
|
+
const server = createServer(rewind);
|
|
36
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
37
|
+
const client = new Client({ name: 'output-schema-live', version: '1.0.0' });
|
|
38
|
+
await server.connect(serverTransport);
|
|
39
|
+
await client.connect(clientTransport);
|
|
40
|
+
const results = [];
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
+
const captured = {};
|
|
43
|
+
// Pace calls -- the API rate-limits on a 60s sliding window, and the
|
|
44
|
+
// audit makes ~50 calls. ~1.2s between keeps a run comfortably under.
|
|
45
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
46
|
+
async function audit(tool, args) {
|
|
47
|
+
await sleep(1200);
|
|
48
|
+
try {
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
|
+
const res = await client.callTool({ name: tool, arguments: args });
|
|
51
|
+
if (res.isError) {
|
|
52
|
+
// A failed outputSchema validation comes back as an isError result
|
|
53
|
+
// with "Output validation error" in the text -- that is a schema
|
|
54
|
+
// FAIL. Any other isError is a handler/API error (skip).
|
|
55
|
+
const txt = resultText(res);
|
|
56
|
+
if (txt.includes('Output validation error')) {
|
|
57
|
+
results.push({ tool, status: 'FAIL', note: txt });
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
results.push({
|
|
61
|
+
tool,
|
|
62
|
+
status: 'skip',
|
|
63
|
+
note: `handler error: ${txt.slice(0, 160)}`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
captured[tool] = res.structuredContent;
|
|
69
|
+
results.push({ tool, status: 'ok' });
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
// A failed outputSchema validation rejects callTool -- caught here.
|
|
73
|
+
results.push({
|
|
74
|
+
tool,
|
|
75
|
+
status: 'FAIL',
|
|
76
|
+
note: e instanceof Error ? e.message : String(e),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Phase 1 -- discovery: tools callable with no chained id.
|
|
81
|
+
const noImg = { include_images: false };
|
|
82
|
+
const discovery = [
|
|
83
|
+
['get_health', {}],
|
|
84
|
+
['get_now_playing', noImg],
|
|
85
|
+
['get_recent_listens', noImg],
|
|
86
|
+
['get_listening_stats', {}],
|
|
87
|
+
['get_top_artists', noImg],
|
|
88
|
+
['get_top_albums', noImg],
|
|
89
|
+
['get_top_tracks', {}],
|
|
90
|
+
['get_listening_streaks', {}],
|
|
91
|
+
['get_listening_genres', {}],
|
|
92
|
+
['get_running_stats', {}],
|
|
93
|
+
['get_recent_runs', {}],
|
|
94
|
+
['get_personal_records', {}],
|
|
95
|
+
['get_running_streaks', {}],
|
|
96
|
+
['get_running_years', {}],
|
|
97
|
+
['get_watching_stats', {}],
|
|
98
|
+
['browse_movies', noImg],
|
|
99
|
+
['get_watching_genres', {}],
|
|
100
|
+
['get_watching_decades', {}],
|
|
101
|
+
['get_watching_directors', {}],
|
|
102
|
+
['get_recent_watches', noImg],
|
|
103
|
+
['get_reading_highlights', {}],
|
|
104
|
+
['get_random_highlight', {}],
|
|
105
|
+
['get_reading_stats', {}],
|
|
106
|
+
['get_recent_reads', {}],
|
|
107
|
+
['get_attended_events', {}],
|
|
108
|
+
['get_attended_players', {}],
|
|
109
|
+
['get_attending_stats', {}],
|
|
110
|
+
['get_attending_year_in_review', { year: 2024 }],
|
|
111
|
+
['get_vinyl_collection', {}],
|
|
112
|
+
['get_collecting_stats', {}],
|
|
113
|
+
['get_physical_media', {}],
|
|
114
|
+
['get_physical_media_stats', {}],
|
|
115
|
+
['search', { query: 'the' }],
|
|
116
|
+
['semantic_search', { query: 'technology' }],
|
|
117
|
+
['get_feed', {}],
|
|
118
|
+
['get_on_this_day', {}],
|
|
119
|
+
];
|
|
120
|
+
for (const [tool, args] of discovery)
|
|
121
|
+
await audit(tool, args);
|
|
122
|
+
// Phase 2 -- detail tools, ids chained from discovery results.
|
|
123
|
+
const idFrom = (tool, path) => {
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
125
|
+
let v = captured[tool];
|
|
126
|
+
for (const key of path.split('.')) {
|
|
127
|
+
if (v == null)
|
|
128
|
+
return undefined;
|
|
129
|
+
v = /^\d+$/.test(key) ? v[Number(key)] : v[key];
|
|
130
|
+
}
|
|
131
|
+
return v;
|
|
132
|
+
};
|
|
133
|
+
async function detail(tool, idArg, id, extra = {}) {
|
|
134
|
+
if (id == null) {
|
|
135
|
+
results.push({ tool, status: 'skip', note: 'no source id in archive' });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
await audit(tool, { [idArg]: id, ...extra });
|
|
139
|
+
}
|
|
140
|
+
await detail('get_artist_details', 'id', idFrom('get_top_artists', 'data.0.id'), noImg);
|
|
141
|
+
await detail('get_album_details', 'id', idFrom('get_top_albums', 'data.0.id'), noImg);
|
|
142
|
+
await detail('get_movie_details', 'id', idFrom('browse_movies', 'items.0.id'), noImg);
|
|
143
|
+
await detail('get_activity_details', 'id', idFrom('get_recent_runs', 'items.0.id'));
|
|
144
|
+
await detail('get_activity_splits', 'id', idFrom('get_recent_runs', 'items.0.id'));
|
|
145
|
+
await detail('get_article', 'id', idFrom('get_recent_reads', 'items.0.id'));
|
|
146
|
+
await detail('find_similar_articles', 'article_id', idFrom('get_recent_reads', 'items.0.id'));
|
|
147
|
+
await detail('get_attended_event', 'id', idFrom('get_attended_events', 'data.0.id'));
|
|
148
|
+
await detail('get_attended_player', 'id', idFrom('get_attended_players', 'data.0.id'), noImg);
|
|
149
|
+
await detail('get_attended_player_stats', 'id', idFrom('get_attended_players', 'data.0.id'));
|
|
150
|
+
const league = idFrom('get_attended_players', 'data.0.league');
|
|
151
|
+
if (league != null)
|
|
152
|
+
await audit('get_attended_season', { league, season: 2024 });
|
|
153
|
+
else
|
|
154
|
+
results.push({
|
|
155
|
+
tool: 'get_attended_season',
|
|
156
|
+
status: 'skip',
|
|
157
|
+
note: 'no league in archive',
|
|
158
|
+
});
|
|
159
|
+
// Report.
|
|
160
|
+
const fails = results.filter((r) => r.status === 'FAIL');
|
|
161
|
+
const skips = results.filter((r) => r.status === 'skip');
|
|
162
|
+
const oks = results.filter((r) => r.status === 'ok');
|
|
163
|
+
console.log('\n=== Live output-schema audit ===');
|
|
164
|
+
console.log(`API: ${API_URL}`);
|
|
165
|
+
console.log(`OK ${oks.length} / FAIL ${fails.length} / skip ${skips.length} (of ${results.length})\n`);
|
|
166
|
+
for (const r of skips)
|
|
167
|
+
console.log(` skip ${r.tool} -- ${r.note}`);
|
|
168
|
+
if (skips.length)
|
|
169
|
+
console.log('');
|
|
170
|
+
for (const r of fails)
|
|
171
|
+
console.log(` FAIL ${r.tool}\n ${r.note}\n`);
|
|
172
|
+
if (!fails.length)
|
|
173
|
+
console.log('All audited tools conform to their outputSchema.');
|
|
174
|
+
process.exit(fails.length ? 1 : 0);
|
|
175
|
+
}
|
|
176
|
+
main().catch((e) => {
|
|
177
|
+
console.error(e);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=output-schema.live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-schema.live.js","sourceRoot":"","sources":["../../src/__tests__/output-schema.live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global output-schema guards (issue #105).
|
|
3
|
+
*
|
|
4
|
+
* Domain-agnostic invariants over EVERY registered tool. These catch a
|
|
5
|
+
* future tool added without an `outputSchema`, or one whose advertised
|
|
6
|
+
* JSON Schema regresses to `$ref` / `$defs` / `additionalProperties:false`
|
|
7
|
+
* -- regardless of which domain it lives in.
|
|
8
|
+
*
|
|
9
|
+
* The per-domain `output-schema-*.test.ts` files cover `structuredContent`
|
|
10
|
+
* conformance against fixtures; this file covers the advertised schema.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect } from 'vitest';
|
|
13
|
+
import { buildTestClient } from './helpers/build-client.js';
|
|
14
|
+
describe('output-schema — global guards', () => {
|
|
15
|
+
it('every registered tool declares an outputSchema', async () => {
|
|
16
|
+
const client = await buildTestClient();
|
|
17
|
+
const { tools } = await client.listTools();
|
|
18
|
+
const missing = tools.filter((t) => !t.outputSchema).map((t) => t.name);
|
|
19
|
+
expect(missing, `tools missing outputSchema: ${missing.join(', ') || '(none)'}`).toEqual([]);
|
|
20
|
+
});
|
|
21
|
+
it('no advertised outputSchema uses $ref/$defs or closed additionalProperties', async () => {
|
|
22
|
+
const client = await buildTestClient();
|
|
23
|
+
const { tools } = await client.listTools();
|
|
24
|
+
for (const t of tools) {
|
|
25
|
+
if (!t.outputSchema)
|
|
26
|
+
continue;
|
|
27
|
+
const json = JSON.stringify(t.outputSchema);
|
|
28
|
+
// $ref/$defs: older Claude Desktop builds failed to compile them --
|
|
29
|
+
// shared schema fragments must be factory functions so each use
|
|
30
|
+
// inlines. additionalProperties:false would reject any field the
|
|
31
|
+
// Rewind API adds later -- every object schema must be .passthrough().
|
|
32
|
+
expect(json, `${t.name}: $ref`).not.toContain('$ref');
|
|
33
|
+
expect(json, `${t.name}: $defs`).not.toContain('$defs');
|
|
34
|
+
expect(json, `${t.name}: additionalProperties:false`).not.toContain('"additionalProperties":false');
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=output-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-schema.test.js","sourceRoot":"","sources":["../../src/__tests__/output-schema.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,CACJ,OAAO,EACP,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAChE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,YAAY;gBAAE,SAAS;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC5C,oEAAoE;YACpE,gEAAgE;YAChE,iEAAiE;YACjE,uEAAuE;YACvE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,8BAA8B,CAAC,CAAC,GAAG,CAAC,SAAS,CACjE,8BAA8B,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -778,7 +778,7 @@ describe('MCP Server', () => {
|
|
|
778
778
|
// an accompanying docs update. See manifest-snapshot.test.ts for
|
|
779
779
|
// the structural snapshot and scripts/check-docs.mjs for the
|
|
780
780
|
// MDX cross-check.
|
|
781
|
-
expect(tools.length).toBe(
|
|
781
|
+
expect(tools.length).toBe(47);
|
|
782
782
|
const names = tools.map((t) => t.name);
|
|
783
783
|
expect(names).toContain('get_health');
|
|
784
784
|
expect(names).toContain('get_now_playing');
|
package/dist/prompts.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export function registerPrompts(server) {
|
|
3
3
|
// Weekly summary prompt
|
|
4
|
-
server.
|
|
4
|
+
server.registerPrompt('weekly-summary', {
|
|
5
|
+
title: 'Weekly summary',
|
|
6
|
+
description: 'Generate a summary of activity across all domains for the past week',
|
|
7
|
+
argsSchema: {},
|
|
8
|
+
}, () => ({
|
|
5
9
|
messages: [
|
|
6
10
|
{
|
|
7
11
|
role: 'user',
|
|
@@ -24,8 +28,12 @@ export function registerPrompts(server) {
|
|
|
24
28
|
],
|
|
25
29
|
}));
|
|
26
30
|
// Year in review prompt
|
|
27
|
-
server.
|
|
28
|
-
|
|
31
|
+
server.registerPrompt('year-in-review', {
|
|
32
|
+
title: 'Year in review',
|
|
33
|
+
description: 'Generate a comprehensive year-in-review for a given year across all domains',
|
|
34
|
+
argsSchema: {
|
|
35
|
+
year: z.string().describe('The year to review (e.g. 2025)'),
|
|
36
|
+
},
|
|
29
37
|
}, ({ year }) => ({
|
|
30
38
|
messages: [
|
|
31
39
|
{
|
|
@@ -56,11 +64,15 @@ export function registerPrompts(server) {
|
|
|
56
64
|
],
|
|
57
65
|
}));
|
|
58
66
|
// Letterboxd review draft
|
|
59
|
-
server.
|
|
60
|
-
title:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
server.registerPrompt('letterboxd-review-draft', {
|
|
68
|
+
title: 'Letterboxd review draft',
|
|
69
|
+
description: 'Draft a Letterboxd-style review for a recently watched film that I have rated but not yet reviewed.',
|
|
70
|
+
argsSchema: {
|
|
71
|
+
title: z
|
|
72
|
+
.string()
|
|
73
|
+
.optional()
|
|
74
|
+
.describe('Optional film title to review. If omitted, picks the most recent unreviewed watch.'),
|
|
75
|
+
},
|
|
64
76
|
}, ({ title }) => ({
|
|
65
77
|
messages: [
|
|
66
78
|
{
|
|
@@ -87,11 +99,15 @@ export function registerPrompts(server) {
|
|
|
87
99
|
],
|
|
88
100
|
}));
|
|
89
101
|
// Training report
|
|
90
|
-
server.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
102
|
+
server.registerPrompt('training-report', {
|
|
103
|
+
title: 'Training report',
|
|
104
|
+
description: 'Analyze the past 7-14 days of running activity and produce a coach-style training report.',
|
|
105
|
+
argsSchema: {
|
|
106
|
+
days: z
|
|
107
|
+
.string()
|
|
108
|
+
.optional()
|
|
109
|
+
.describe('Number of days to analyze (default 7).'),
|
|
110
|
+
},
|
|
95
111
|
}, ({ days }) => ({
|
|
96
112
|
messages: [
|
|
97
113
|
{
|
|
@@ -123,11 +139,15 @@ export function registerPrompts(server) {
|
|
|
123
139
|
],
|
|
124
140
|
}));
|
|
125
141
|
// Film diet
|
|
126
|
-
server.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
142
|
+
server.registerPrompt('film-diet', {
|
|
143
|
+
title: 'Film diet',
|
|
144
|
+
description: 'Characterize the shape of my movie-watching taste: genre mix, decade distribution, top directors, rewatch rate, and where I lean vs drift.',
|
|
145
|
+
argsSchema: {
|
|
146
|
+
period: z
|
|
147
|
+
.string()
|
|
148
|
+
.optional()
|
|
149
|
+
.describe("Optional period scope (e.g. '12month', '2025'). Default: lifetime."),
|
|
150
|
+
},
|
|
131
151
|
}, ({ period }) => ({
|
|
132
152
|
messages: [
|
|
133
153
|
{
|
|
@@ -157,16 +177,20 @@ export function registerPrompts(server) {
|
|
|
157
177
|
],
|
|
158
178
|
}));
|
|
159
179
|
// Compare periods prompt
|
|
160
|
-
server.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
180
|
+
server.registerPrompt('compare-periods', {
|
|
181
|
+
title: 'Compare periods',
|
|
182
|
+
description: 'Compare activity between two time periods for a specific domain',
|
|
183
|
+
argsSchema: {
|
|
184
|
+
domain: z
|
|
185
|
+
.string()
|
|
186
|
+
.describe('Domain to compare (listening, running, watching, collecting, reading)'),
|
|
187
|
+
period1: z
|
|
188
|
+
.string()
|
|
189
|
+
.describe("First period description (e.g. 'January 2025', 'last month')"),
|
|
190
|
+
period2: z
|
|
191
|
+
.string()
|
|
192
|
+
.describe("Second period description (e.g. 'January 2024', 'this month')"),
|
|
193
|
+
},
|
|
170
194
|
}, ({ domain, period1, period2 }) => ({
|
|
171
195
|
messages: [
|
|
172
196
|
{
|
|
@@ -191,10 +215,14 @@ export function registerPrompts(server) {
|
|
|
191
215
|
],
|
|
192
216
|
}));
|
|
193
217
|
// Find a half-remembered article
|
|
194
|
-
server.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
218
|
+
server.registerPrompt('find-article', {
|
|
219
|
+
title: 'Find an article',
|
|
220
|
+
description: 'Recover an article the user only half-remembers, using hybrid keyword + semantic search, then surface related pieces',
|
|
221
|
+
argsSchema: {
|
|
222
|
+
description: z
|
|
223
|
+
.string()
|
|
224
|
+
.describe('Whatever the user remembers about the article: topic, person mentioned, feeling, rough time period, etc.'),
|
|
225
|
+
},
|
|
198
226
|
}, ({ description }) => ({
|
|
199
227
|
messages: [
|
|
200
228
|
{
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,wBAAwB;IACxB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/resources.js
CHANGED
|
@@ -2,7 +2,8 @@ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import { fmt } from './tools/helpers.js';
|
|
3
3
|
export function registerResources(server, client) {
|
|
4
4
|
// Sync status resource
|
|
5
|
-
server.
|
|
5
|
+
server.registerResource('sync-status', 'rewind://sync/status', {
|
|
6
|
+
title: 'Sync status',
|
|
6
7
|
description: 'Current sync health and last sync times for each data domain',
|
|
7
8
|
}, async (uri) => {
|
|
8
9
|
const data = await client.get('/health/sync');
|
|
@@ -23,9 +24,10 @@ export function registerResources(server, client) {
|
|
|
23
24
|
};
|
|
24
25
|
});
|
|
25
26
|
// Listening year-in-review
|
|
26
|
-
server.
|
|
27
|
+
server.registerResource('listening-year', new ResourceTemplate('rewind://listening/year/{year}', {
|
|
27
28
|
list: undefined,
|
|
28
29
|
}), {
|
|
30
|
+
title: 'Listening — year in review',
|
|
29
31
|
description: 'Listening year-in-review statistics for a given year',
|
|
30
32
|
}, async (uri, params) => {
|
|
31
33
|
const year = params.year;
|
|
@@ -41,9 +43,10 @@ export function registerResources(server, client) {
|
|
|
41
43
|
};
|
|
42
44
|
});
|
|
43
45
|
// Running year-in-review
|
|
44
|
-
server.
|
|
46
|
+
server.registerResource('running-year', new ResourceTemplate('rewind://running/year/{year}', {
|
|
45
47
|
list: undefined,
|
|
46
48
|
}), {
|
|
49
|
+
title: 'Running — year in review',
|
|
47
50
|
description: 'Running year-in-review statistics for a given year',
|
|
48
51
|
}, async (uri, params) => {
|
|
49
52
|
const year = params.year;
|
|
@@ -59,9 +62,10 @@ export function registerResources(server, client) {
|
|
|
59
62
|
};
|
|
60
63
|
});
|
|
61
64
|
// Watching year-in-review
|
|
62
|
-
server.
|
|
65
|
+
server.registerResource('watching-year', new ResourceTemplate('rewind://watching/year/{year}', {
|
|
63
66
|
list: undefined,
|
|
64
67
|
}), {
|
|
68
|
+
title: 'Watching — year in review',
|
|
65
69
|
description: 'Watching year-in-review statistics for a given year',
|
|
66
70
|
}, async (uri, params) => {
|
|
67
71
|
const year = params.year;
|
|
@@ -77,7 +81,8 @@ export function registerResources(server, client) {
|
|
|
77
81
|
};
|
|
78
82
|
});
|
|
79
83
|
// Movie entity
|
|
80
|
-
server.
|
|
84
|
+
server.registerResource('movie', new ResourceTemplate('rewind://movie/{id}', { list: undefined }), {
|
|
85
|
+
title: 'Movie',
|
|
81
86
|
description: 'Full detail for a single movie by internal Rewind id: metadata, watch history, ratings, and Letterboxd review URLs.',
|
|
82
87
|
}, async (uri, params) => {
|
|
83
88
|
const id = params.id;
|
|
@@ -93,7 +98,8 @@ export function registerResources(server, client) {
|
|
|
93
98
|
};
|
|
94
99
|
});
|
|
95
100
|
// Show entity
|
|
96
|
-
server.
|
|
101
|
+
server.registerResource('show', new ResourceTemplate('rewind://show/{id}', { list: undefined }), {
|
|
102
|
+
title: 'TV show',
|
|
97
103
|
description: 'Full detail for a single TV show by internal Rewind id: metadata, seasons, and watched-episode counts.',
|
|
98
104
|
}, async (uri, params) => {
|
|
99
105
|
const id = params.id;
|
|
@@ -109,7 +115,8 @@ export function registerResources(server, client) {
|
|
|
109
115
|
};
|
|
110
116
|
});
|
|
111
117
|
// Album entity
|
|
112
|
-
server.
|
|
118
|
+
server.registerResource('album', new ResourceTemplate('rewind://album/{id}', { list: undefined }), {
|
|
119
|
+
title: 'Album',
|
|
113
120
|
description: 'Full detail for a single album by internal Rewind id: artist, play count, track listing, cover art metadata, and Apple Music URL.',
|
|
114
121
|
}, async (uri, params) => {
|
|
115
122
|
const id = params.id;
|
|
@@ -125,7 +132,8 @@ export function registerResources(server, client) {
|
|
|
125
132
|
};
|
|
126
133
|
});
|
|
127
134
|
// Artist entity
|
|
128
|
-
server.
|
|
135
|
+
server.registerResource('artist', new ResourceTemplate('rewind://artist/{id}', { list: undefined }), {
|
|
136
|
+
title: 'Artist',
|
|
129
137
|
description: 'Full detail for a single artist by internal Rewind id: play count, genre, top albums, top tracks, image metadata, and Apple Music URL.',
|
|
130
138
|
}, async (uri, params) => {
|
|
131
139
|
const id = params.id;
|
|
@@ -141,7 +149,8 @@ export function registerResources(server, client) {
|
|
|
141
149
|
};
|
|
142
150
|
});
|
|
143
151
|
// Vinyl record entity
|
|
144
|
-
server.
|
|
152
|
+
server.registerResource('vinyl', new ResourceTemplate('rewind://vinyl/{id}', { list: undefined }), {
|
|
153
|
+
title: 'Vinyl record',
|
|
145
154
|
description: 'Full detail for a single vinyl record (or other Discogs collection item) by internal Rewind id: title, artists, formats, genres, cover art, Discogs URL, community stats.',
|
|
146
155
|
}, async (uri, params) => {
|
|
147
156
|
const id = params.id;
|
|
@@ -157,7 +166,8 @@ export function registerResources(server, client) {
|
|
|
157
166
|
};
|
|
158
167
|
});
|
|
159
168
|
// Physical media entity
|
|
160
|
-
server.
|
|
169
|
+
server.registerResource('physical-media', new ResourceTemplate('rewind://physical-media/{id}', { list: undefined }), {
|
|
170
|
+
title: 'Physical media',
|
|
161
171
|
description: 'Full detail for a single physical media item (Blu-ray / 4K UHD / HD DVD) by internal Rewind id: title, year, format, resolution, HDR, audio, watch history.',
|
|
162
172
|
}, async (uri, params) => {
|
|
163
173
|
const id = params.id;
|
|
@@ -173,7 +183,8 @@ export function registerResources(server, client) {
|
|
|
173
183
|
};
|
|
174
184
|
});
|
|
175
185
|
// Article entity
|
|
176
|
-
server.
|
|
186
|
+
server.registerResource('article', new ResourceTemplate('rewind://article/{id}', { list: undefined }), {
|
|
187
|
+
title: 'Article',
|
|
177
188
|
description: 'Full detail for a saved Instapaper article: title, author, domain, word count, read progress, tags, source URL, Instapaper URLs, embedded highlights, AND the full article body. The `content` field is the complete plain-text body (HTML-stripped, typically 5-30 KB); `excerpt` is the first ~3000 chars. Fetch this resource whenever the user asks about article specifics past the excerpt — do NOT fall back to web search or try to fetch the source URL (often paywalled). The `content` field has the full article text including for paywalled sources.',
|
|
178
189
|
}, async (uri, params) => {
|
|
179
190
|
const id = params.id;
|
|
@@ -189,7 +200,8 @@ export function registerResources(server, client) {
|
|
|
189
200
|
};
|
|
190
201
|
});
|
|
191
202
|
// Activity entity
|
|
192
|
-
server.
|
|
203
|
+
server.registerResource('activity', new ResourceTemplate('rewind://activity/{id}', { list: undefined }), {
|
|
204
|
+
title: 'Run',
|
|
193
205
|
description: 'Full detail for a single running activity by internal Rewind id: distance, pace, elevation, HR, cadence, calories, location, and Strava URL.',
|
|
194
206
|
}, async (uri, params) => {
|
|
195
207
|
const id = params.id;
|
|
@@ -205,7 +217,8 @@ export function registerResources(server, client) {
|
|
|
205
217
|
};
|
|
206
218
|
});
|
|
207
219
|
// Highlight entity
|
|
208
|
-
server.
|
|
220
|
+
server.registerResource('highlight', new ResourceTemplate('rewind://highlight/{id}', { list: undefined }), {
|
|
221
|
+
title: 'Highlight',
|
|
209
222
|
description: 'Full detail for a single Instapaper highlight by internal Rewind id: highlighted text, optional note, and nested parent-article context (title, author, domain, source URL).',
|
|
210
223
|
}, async (uri, params) => {
|
|
211
224
|
const id = params.id;
|
package/dist/resources.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAG3E,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,MAAoB;IAEpB,uBAAuB;IACvB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
|