rewind-mcp-server 0.1.0 → 0.1.1

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 CHANGED
@@ -1,19 +1,15 @@
1
1
  # rewind-mcp-server
2
2
 
3
- MCP (Model Context Protocol) server for the [Rewind](https://rewind.rest) personal data API. Gives Claude natural language access to your listening, running, watching, collecting, and reading data.
3
+ [![CI](https://github.com/pdugan20/rewind/actions/workflows/mcp-server.yml/badge.svg)](https://github.com/pdugan20/rewind/actions/workflows/mcp-server.yml)
4
+ [![npm version](https://img.shields.io/npm/v/rewind-mcp-server?logo=npm)](https://www.npmjs.com/package/rewind-mcp-server)
5
+ [![docs](https://img.shields.io/badge/docs-docs.rewind.rest-blue)](https://docs.rewind.rest/mcp-server)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow?logo=opensourceinitiative&logoColor=white)](https://opensource.org/licenses/MIT)
4
7
 
5
- ## Features
8
+ MCP server for the [Rewind](https://rewind.rest) personal data API. Gives Claude access to your listening, running, watching, collecting, and reading data.
6
9
 
7
- - **26 tools** across 5 domains (listening, running, watching, collecting, reading) + cross-domain search and feed
8
- - **4 resources** for sync status and year-in-review data
9
- - **3 prompt templates** for weekly summaries, year-in-review, and period comparisons
10
- - Works with Claude Desktop, Claude Code, Claude iOS, and claude.ai
10
+ ## Setup
11
11
 
12
- ## Installation
13
-
14
- ### Claude Desktop (Mac)
15
-
16
- Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
12
+ Add to your [Claude Desktop config](https://modelcontextprotocol.io/quickstart/user):
17
13
 
18
14
  ```json
19
15
  {
@@ -29,112 +25,30 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
29
25
  }
30
26
  ```
31
27
 
32
- Restart Claude Desktop after saving.
33
-
34
- ### Claude Code
28
+ Or with Claude Code:
35
29
 
36
30
  ```bash
37
31
  claude mcp add rewind -- npx -y rewind-mcp-server
38
32
  ```
39
33
 
40
- Or add `.mcp.json` to your project root:
41
-
42
- ```json
43
- {
44
- "mcpServers": {
45
- "rewind": {
46
- "command": "npx",
47
- "args": ["-y", "rewind-mcp-server"],
48
- "env": {
49
- "REWIND_API_KEY": "rw_live_your_key_here"
50
- }
51
- }
52
- }
53
- }
54
- ```
55
-
56
- ### Claude iOS / claude.ai (Web)
57
-
58
- These platforms connect to the hosted remote server. Go to Settings > Integrations and add:
34
+ Requires a [Rewind API key](https://docs.rewind.rest/authentication). `REWIND_API_URL` defaults to `https://api.rewind.rest`.
59
35
 
60
- - **URL:** `https://mcp.rewind.rest/mcp`
61
- - **Authorization:** `Bearer rw_live_your_key_here`
36
+ ## Tools
62
37
 
63
- ## Environment Variables
64
-
65
- | Variable | Required | Default | Description |
66
- | ---------------- | -------- | ------------------------- | ----------------------------------- |
67
- | `REWIND_API_KEY` | Yes | -- | Your Rewind API key (`rw_live_...`) |
68
- | `REWIND_API_URL` | No | `https://api.rewind.rest` | API base URL |
69
-
70
- ## Available Tools
71
-
72
- ### Listening (Last.fm)
73
-
74
- | Tool | Description |
75
- | ----------------------- | ---------------------------- |
76
- | `get_now_playing` | Currently playing track |
77
- | `get_recent_listens` | Recent scrobbles |
78
- | `get_listening_stats` | Overall listening statistics |
79
- | `get_top_artists` | Top artists by period |
80
- | `get_top_albums` | Top albums by period |
81
- | `get_top_tracks` | Top tracks by period |
82
- | `get_listening_streaks` | Current and longest streaks |
83
- | `get_artist_details` | Artist info by ID |
84
- | `get_album_details` | Album info by ID |
85
-
86
- ### Running (Strava)
87
-
88
- | Tool | Description |
89
- | ---------------------- | --------------------------- |
90
- | `get_running_stats` | Overall running statistics |
91
- | `get_recent_runs` | Recent activities |
92
- | `get_personal_records` | PRs at standard distances |
93
- | `get_running_streaks` | Current and longest streaks |
94
- | `get_activity_details` | Single run details by ID |
95
-
96
- ### Watching (Plex / Letterboxd)
97
-
98
- | Tool | Description |
99
- | -------------------- | --------------------------- |
100
- | `get_recent_watches` | Recently watched movies/TV |
101
- | `get_movie_details` | Movie info by ID |
102
- | `get_watching_stats` | Overall watching statistics |
103
-
104
- ### Collecting (Discogs)
105
-
106
- | Tool | Description |
107
- | ---------------------- | --------------------- |
108
- | `get_vinyl_collection` | Browse vinyl records |
109
- | `get_collecting_stats` | Collection statistics |
110
-
111
- ### Reading (Instapaper)
112
-
113
- | Tool | Description |
114
- | ------------------------ | ----------------------- |
115
- | `get_recent_reads` | Recently saved articles |
116
- | `get_reading_highlights` | Saved highlights |
117
- | `get_random_highlight` | Random highlight |
118
- | `get_reading_stats` | Reading statistics |
119
-
120
- ### Cross-Domain
121
-
122
- | Tool | Description |
123
- | ----------------- | ----------------------------------- |
124
- | `search` | Full-text search across all domains |
125
- | `get_feed` | Unified activity feed |
126
- | `get_on_this_day` | Historical "on this day" items |
127
- | `get_health` | API and sync health status |
128
-
129
- ## Development
130
-
131
- ```bash
132
- cd mcp-server
133
- npm install
134
- npm run build
135
- REWIND_API_KEY=rw_live_... npm start
136
- ```
38
+ | Domain | Source | Tools |
39
+ | ---------------- | ---------------- | -------------------------------------------------------------------------------------------------- |
40
+ | **Listening** | Last.fm | Now playing, recent scrobbles, stats, top artists/albums/tracks, streaks, artist and album details |
41
+ | **Running** | Strava | Stats, recent runs, personal records, streaks, activity details, per-mile splits |
42
+ | **Watching** | Plex, Letterboxd | Recent watches, movie details, browse by genre/decade/director, stats |
43
+ | **Collecting** | Discogs, Trakt | Vinyl collection, physical media (Blu-ray/4K/HD DVD), collection stats |
44
+ | **Reading** | Instapaper | Recent articles, highlights, random highlight, stats |
45
+ | **Cross-domain** | All | Full-text search, unified feed, on-this-day, health check |
137
46
 
138
- ## License
47
+ ## Example Queries
139
48
 
140
- MIT
49
+ - "What albums have I been listening to the most recently?"
50
+ - "Compare my mile splits from this month vs last month"
51
+ - "When was the last time I watched a film by Wes Anderson?"
52
+ - "What Beastie Boys records are missing from my vinyl collection?"
53
+ - "How many articles did I read last year and stack-rank the top 10 sources"
54
+ - "Can you give me a quick summary of everything I did last week?"
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,614 @@
1
+ import { describe, it, expect, vi, beforeAll, afterAll } from 'vitest';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
4
+ import { createServer } from '../server.js';
5
+ import { RewindClient } from '../client.js';
6
+ /**
7
+ * Creates a connected MCP client + server pair using in-memory transport.
8
+ * The RewindClient is mocked so no real API calls are made.
9
+ */
10
+ async function createTestClient() {
11
+ const rewindClient = new RewindClient('https://api.test', 'rw_test');
12
+ // Mock the HTTP client -- all tools go through client.get()
13
+ vi.spyOn(rewindClient, 'get').mockImplementation(async (path) => {
14
+ return getMockResponse(path);
15
+ });
16
+ const server = createServer(rewindClient);
17
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
18
+ const client = new Client({
19
+ name: 'test-client',
20
+ version: '1.0.0',
21
+ });
22
+ await server.connect(serverTransport);
23
+ await client.connect(clientTransport);
24
+ return { client, server, rewindClient };
25
+ }
26
+ /** Mock responses for each API endpoint. */
27
+ function getMockResponse(path) {
28
+ // Listening
29
+ if (path === '/listening/now-playing') {
30
+ return {
31
+ is_playing: true,
32
+ track: { id: 1, name: 'Sabotage' },
33
+ artist: { name: 'Beastie Boys' },
34
+ album: { name: 'Ill Communication' },
35
+ scrobbled_at: new Date().toISOString(),
36
+ };
37
+ }
38
+ if (path === '/listening/recent') {
39
+ return {
40
+ data: [
41
+ {
42
+ track: { name: 'Sabotage' },
43
+ artist: { name: 'Beastie Boys' },
44
+ album: { name: 'Ill Communication' },
45
+ scrobbled_at: new Date().toISOString(),
46
+ },
47
+ ],
48
+ };
49
+ }
50
+ if (path === '/listening/stats') {
51
+ return {
52
+ total_scrobbles: 45000,
53
+ unique_artists: 2100,
54
+ unique_albums: 3800,
55
+ unique_tracks: 12000,
56
+ scrobbles_per_day: 12.3,
57
+ years_tracking: 18,
58
+ };
59
+ }
60
+ if (path.startsWith('/listening/top/')) {
61
+ return {
62
+ period: '1month',
63
+ data: [
64
+ { rank: 1, name: 'Beastie Boys', detail: 'Artist', playcount: 45 },
65
+ ],
66
+ };
67
+ }
68
+ if (path === '/listening/streaks') {
69
+ return {
70
+ current: { days: 42, start_date: '2025-01-01', total_scrobbles: 500 },
71
+ longest: {
72
+ days: 365,
73
+ start_date: '2020-01-01',
74
+ end_date: '2020-12-31',
75
+ total_scrobbles: 5000,
76
+ },
77
+ };
78
+ }
79
+ if (path.match(/\/listening\/artists\/\d+/)) {
80
+ return {
81
+ name: 'Beastie Boys',
82
+ playcount: 500,
83
+ scrobble_count: 500,
84
+ genre: 'Hip Hop',
85
+ top_albums: [{ name: "Paul's Boutique", playcount: 100 }],
86
+ top_tracks: [{ name: 'Sabotage', scrobble_count: 50 }],
87
+ };
88
+ }
89
+ if (path.match(/\/listening\/albums\/\d+/)) {
90
+ return {
91
+ name: "Paul's Boutique",
92
+ artist: { name: 'Beastie Boys' },
93
+ playcount: 100,
94
+ tracks: [{ name: 'Shake Your Rump', scrobble_count: 20 }],
95
+ };
96
+ }
97
+ // Running
98
+ if (path === '/running/stats') {
99
+ return {
100
+ data: {
101
+ total_runs: 423,
102
+ total_distance_mi: 1892.4,
103
+ total_elevation_ft: 45000,
104
+ total_duration: '312:45:00',
105
+ avg_pace: '8:32/mi',
106
+ years_active: 5,
107
+ first_run: '2021-01-15',
108
+ eddington_number: 12,
109
+ },
110
+ };
111
+ }
112
+ if (path === '/running/recent') {
113
+ return {
114
+ data: [
115
+ {
116
+ id: 17956091264,
117
+ name: 'Thursday Afternoon Run',
118
+ date: new Date().toISOString(),
119
+ distance_mi: 4.39,
120
+ duration: '33:59',
121
+ pace: '7:44/mi',
122
+ elevation_ft: 360,
123
+ city: 'Austin',
124
+ state: 'TX',
125
+ is_race: false,
126
+ },
127
+ ],
128
+ };
129
+ }
130
+ if (path === '/running/prs') {
131
+ return {
132
+ data: [
133
+ {
134
+ distance_label: 'Mile',
135
+ time: '6:12',
136
+ pace: '6:12/mi',
137
+ date: '2026-03-31',
138
+ activity_name: 'Tuesday Run',
139
+ activity_id: 123,
140
+ },
141
+ ],
142
+ };
143
+ }
144
+ if (path === '/running/streaks') {
145
+ return {
146
+ data: {
147
+ current: { days: 3, start: '2026-04-01', end: '2026-04-03' },
148
+ longest: { days: 30, start: '2025-06-01', end: '2025-06-30' },
149
+ },
150
+ };
151
+ }
152
+ if (path.match(/\/running\/activities\/\d+$/)) {
153
+ return {
154
+ name: 'Thursday Afternoon Run',
155
+ date: '2026-04-02T16:20:48Z',
156
+ distance_mi: 4.39,
157
+ duration: '33:59',
158
+ pace: '7:44/mi',
159
+ elevation_ft: 360,
160
+ heartrate_avg: 155,
161
+ heartrate_max: 176,
162
+ cadence: 80,
163
+ calories: 514,
164
+ suffer_score: null,
165
+ city: 'Austin',
166
+ state: 'TX',
167
+ is_race: false,
168
+ workout_type: 'default',
169
+ strava_url: 'https://www.strava.com/activities/123',
170
+ };
171
+ }
172
+ if (path.match(/\/running\/activities\/\d+\/splits/)) {
173
+ return {
174
+ data: [
175
+ {
176
+ split: 1,
177
+ distance_mi: 1,
178
+ moving_time_s: 435,
179
+ elapsed_time_s: 449,
180
+ elevation_ft: -55,
181
+ pace: '7:15/mi',
182
+ heartrate: 145,
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ // Watching
188
+ if (path === '/watching/recent') {
189
+ return {
190
+ data: [
191
+ {
192
+ movie: {
193
+ title: 'The Royal Tenenbaums',
194
+ year: 2001,
195
+ director: 'Wes Anderson',
196
+ },
197
+ watched_at: new Date().toISOString(),
198
+ user_rating: 9,
199
+ rewatch: false,
200
+ source: 'plex',
201
+ },
202
+ ],
203
+ };
204
+ }
205
+ if (path.match(/\/watching\/movies\/\d+/)) {
206
+ return {
207
+ title: 'The Royal Tenenbaums',
208
+ year: 2001,
209
+ director: 'Wes Anderson',
210
+ directors: ['Wes Anderson'],
211
+ genres: ['Comedy', 'Drama'],
212
+ duration_min: 109,
213
+ rating: 'R',
214
+ tmdb_rating: 7.6,
215
+ tagline: "Family isn't a word. It's a sentence.",
216
+ summary: 'A family drama.',
217
+ imdb_id: 'tt0265666',
218
+ watch_history: [],
219
+ };
220
+ }
221
+ if (path === '/watching/stats') {
222
+ return {
223
+ data: {
224
+ total_movies: 312,
225
+ total_watch_time_hours: 520,
226
+ movies_this_year: 28,
227
+ avg_per_month: 8.5,
228
+ top_genre: 'Drama',
229
+ top_decade: 2000,
230
+ top_director: 'Wes Anderson',
231
+ total_shows: 15,
232
+ total_episodes_watched: 234,
233
+ episodes_this_year: 45,
234
+ },
235
+ };
236
+ }
237
+ if (path === '/watching/movies') {
238
+ return {
239
+ data: [
240
+ {
241
+ id: 1,
242
+ title: 'The Royal Tenenbaums',
243
+ year: 2001,
244
+ director: 'Wes Anderson',
245
+ genres: ['Comedy'],
246
+ duration_min: 109,
247
+ tmdb_rating: 7.6,
248
+ },
249
+ ],
250
+ pagination: { page: 1, limit: 10, total: 1, total_pages: 1 },
251
+ };
252
+ }
253
+ // Collecting
254
+ if (path === '/collecting/vinyl') {
255
+ return {
256
+ data: [
257
+ {
258
+ id: 1,
259
+ title: 'Hello Nasty',
260
+ artists: ['Beastie Boys'],
261
+ year: 2009,
262
+ format: 'Vinyl',
263
+ format_detail: 'LP, Reissue',
264
+ label: 'Capitol Records',
265
+ genres: ['Hip Hop'],
266
+ date_added: '2024-01-15',
267
+ },
268
+ ],
269
+ pagination: { page: 1, limit: 10, total: 1, total_pages: 1 },
270
+ };
271
+ }
272
+ if (path === '/collecting/stats') {
273
+ return {
274
+ data: {
275
+ total_items: 150,
276
+ by_format: { vinyl: 120, cd: 25, cassette: 5 },
277
+ wantlist_count: 30,
278
+ unique_artists: 95,
279
+ top_genre: 'Rock',
280
+ oldest_release_year: 1967,
281
+ newest_release_year: 2025,
282
+ added_this_year: 12,
283
+ },
284
+ };
285
+ }
286
+ if (path === '/collecting/media') {
287
+ return {
288
+ data: [
289
+ {
290
+ id: 1,
291
+ title: 'The Killing',
292
+ year: 1956,
293
+ media_type: 'bluray',
294
+ tmdb_rating: 7.6,
295
+ collected_at: '2026-03-26',
296
+ },
297
+ ],
298
+ pagination: { page: 1, limit: 10, total: 1, total_pages: 1 },
299
+ };
300
+ }
301
+ if (path === '/collecting/media/formats') {
302
+ return {
303
+ data: [
304
+ { name: 'bluray', count: 56 },
305
+ { name: 'uhd_bluray', count: 30 },
306
+ { name: 'hddvd', count: 11 },
307
+ ],
308
+ };
309
+ }
310
+ // Reading
311
+ if (path === '/reading/recent') {
312
+ return {
313
+ data: [
314
+ {
315
+ id: 1,
316
+ title: 'How to Build an MCP Server',
317
+ author: 'Anthropic',
318
+ domain: 'anthropic.com',
319
+ estimated_read_min: 12,
320
+ status: 'archived',
321
+ progress: 1,
322
+ saved_at: new Date().toISOString(),
323
+ },
324
+ ],
325
+ };
326
+ }
327
+ if (path === '/reading/highlights') {
328
+ return {
329
+ data: [
330
+ {
331
+ text: 'The best code is no code at all.',
332
+ note: null,
333
+ created_at: '2026-01-15',
334
+ article: {
335
+ title: 'Less is More',
336
+ author: 'Jeff Atwood',
337
+ domain: 'blog.codinghorror.com',
338
+ },
339
+ },
340
+ ],
341
+ pagination: { page: 1, total: 42, total_pages: 5 },
342
+ };
343
+ }
344
+ if (path === '/reading/highlights/random') {
345
+ return {
346
+ text: 'Simplicity is the ultimate sophistication.',
347
+ note: 'Leonardo da Vinci',
348
+ created_at: '2025-06-01',
349
+ article: {
350
+ title: 'Design Principles',
351
+ author: null,
352
+ domain: 'example.com',
353
+ },
354
+ };
355
+ }
356
+ if (path === '/reading/stats') {
357
+ return {
358
+ total_articles: 350,
359
+ finished_count: 280,
360
+ currently_reading_count: 5,
361
+ total_highlights: 420,
362
+ total_word_count: 2500000,
363
+ avg_estimated_read_min: 8,
364
+ };
365
+ }
366
+ // Feed
367
+ if (path.startsWith('/feed/on-this-day')) {
368
+ return {
369
+ month: 4,
370
+ day: 3,
371
+ years: [
372
+ {
373
+ year: 2025,
374
+ items: [
375
+ {
376
+ domain: 'listening',
377
+ event_type: 'discovery',
378
+ title: 'Listened to Radiohead',
379
+ subtitle: 'OK Computer',
380
+ },
381
+ ],
382
+ },
383
+ ],
384
+ };
385
+ }
386
+ if (path.startsWith('/feed')) {
387
+ return {
388
+ data: [
389
+ {
390
+ domain: 'listening',
391
+ event_type: 'scrobble',
392
+ occurred_at: new Date().toISOString(),
393
+ title: 'Sabotage',
394
+ subtitle: 'Beastie Boys',
395
+ },
396
+ ],
397
+ pagination: { has_more: false },
398
+ };
399
+ }
400
+ // Search
401
+ if (path === '/search') {
402
+ return {
403
+ data: [
404
+ {
405
+ domain: 'listening',
406
+ entity_type: 'artist',
407
+ title: 'Beastie Boys',
408
+ subtitle: null,
409
+ },
410
+ ],
411
+ pagination: { total: 1 },
412
+ };
413
+ }
414
+ // Health
415
+ if (path === '/health') {
416
+ return { status: 'ok', timestamp: new Date().toISOString() };
417
+ }
418
+ if (path === '/health/sync') {
419
+ return {
420
+ domains: {
421
+ listening: {
422
+ status: 'healthy',
423
+ last_sync: new Date().toISOString(),
424
+ items_synced: 100,
425
+ },
426
+ running: {
427
+ status: 'healthy',
428
+ last_sync: new Date().toISOString(),
429
+ items_synced: 5,
430
+ },
431
+ },
432
+ };
433
+ }
434
+ throw new Error(`Unmocked endpoint: ${path}`);
435
+ }
436
+ // --- Tests ---
437
+ describe('MCP Server', () => {
438
+ let client;
439
+ beforeAll(async () => {
440
+ const ctx = await createTestClient();
441
+ client = ctx.client;
442
+ });
443
+ afterAll(async () => {
444
+ await client.close();
445
+ });
446
+ describe('initialization', () => {
447
+ it('lists all tools', async () => {
448
+ const { tools } = await client.listTools();
449
+ expect(tools.length).toBeGreaterThanOrEqual(29);
450
+ const names = tools.map((t) => t.name);
451
+ expect(names).toContain('get_health');
452
+ expect(names).toContain('get_now_playing');
453
+ expect(names).toContain('get_recent_listens');
454
+ expect(names).toContain('get_running_stats');
455
+ expect(names).toContain('get_activity_splits');
456
+ expect(names).toContain('browse_movies');
457
+ expect(names).toContain('get_vinyl_collection');
458
+ expect(names).toContain('get_physical_media');
459
+ expect(names).toContain('search');
460
+ expect(names).toContain('get_feed');
461
+ });
462
+ it('all tools have readOnlyHint annotation', async () => {
463
+ const { tools } = await client.listTools();
464
+ for (const tool of tools) {
465
+ expect(tool.annotations?.readOnlyHint).toBe(true);
466
+ expect(tool.annotations?.destructiveHint).toBe(false);
467
+ }
468
+ });
469
+ it('lists resources', async () => {
470
+ const { resources } = await client.listResources();
471
+ expect(resources.length).toBeGreaterThanOrEqual(1);
472
+ });
473
+ it('lists prompts', async () => {
474
+ const { prompts } = await client.listPrompts();
475
+ expect(prompts.length).toBe(3);
476
+ const names = prompts.map((p) => p.name);
477
+ expect(names).toContain('weekly-summary');
478
+ expect(names).toContain('year-in-review');
479
+ expect(names).toContain('compare-periods');
480
+ });
481
+ });
482
+ describe('tool responses are text, not JSON', () => {
483
+ const toolsToTest = [
484
+ { name: 'get_health', args: {} },
485
+ { name: 'get_now_playing', args: {} },
486
+ { name: 'get_recent_listens', args: {} },
487
+ { name: 'get_listening_stats', args: {} },
488
+ { name: 'get_top_artists', args: {} },
489
+ { name: 'get_listening_streaks', args: {} },
490
+ { name: 'get_running_stats', args: {} },
491
+ { name: 'get_recent_runs', args: {} },
492
+ { name: 'get_personal_records', args: {} },
493
+ { name: 'get_running_streaks', args: {} },
494
+ { name: 'get_activity_details', args: { id: 123 } },
495
+ { name: 'get_activity_splits', args: { id: 123 } },
496
+ { name: 'get_recent_watches', args: {} },
497
+ { name: 'get_movie_details', args: { id: 1 } },
498
+ { name: 'get_watching_stats', args: {} },
499
+ { name: 'browse_movies', args: {} },
500
+ { name: 'get_vinyl_collection', args: {} },
501
+ { name: 'get_collecting_stats', args: {} },
502
+ { name: 'get_physical_media', args: {} },
503
+ { name: 'get_physical_media_stats', args: {} },
504
+ { name: 'get_recent_reads', args: {} },
505
+ { name: 'get_reading_highlights', args: {} },
506
+ { name: 'get_random_highlight', args: {} },
507
+ { name: 'get_reading_stats', args: {} },
508
+ { name: 'search', args: { query: 'beastie' } },
509
+ { name: 'get_feed', args: {} },
510
+ { name: 'get_on_this_day', args: {} },
511
+ ];
512
+ for (const { name, args } of toolsToTest) {
513
+ it(`${name} returns text content`, async () => {
514
+ const result = await client.callTool({ name, arguments: args });
515
+ expect(result.content).toBeDefined();
516
+ expect(Array.isArray(result.content)).toBe(true);
517
+ const content = result.content;
518
+ expect(content.length).toBeGreaterThan(0);
519
+ expect(content[0].type).toBe('text');
520
+ expect(typeof content[0].text).toBe('string');
521
+ expect(content[0].text.length).toBeGreaterThan(0);
522
+ // Should NOT be raw JSON
523
+ expect(content[0].text).not.toMatch(/^\s*[\[{]/);
524
+ // Should not have isError
525
+ expect(result.isError).toBeFalsy();
526
+ });
527
+ }
528
+ });
529
+ describe('error handling', () => {
530
+ it('returns isError for failed API calls', async () => {
531
+ // Artist ID 99999 will hit the mock which throws for unknown paths
532
+ const result = await client.callTool({
533
+ name: 'get_artist_details',
534
+ arguments: { id: 99999 },
535
+ });
536
+ expect(result.content).toBeDefined();
537
+ const content = result.content;
538
+ expect(content[0].type).toBe('text');
539
+ // The mock returns data for any /listening/artists/\d+ so this will succeed
540
+ // That's fine -- the error path is tested by the mock throwing for unknown endpoints
541
+ });
542
+ });
543
+ describe('response content quality', () => {
544
+ it('get_now_playing includes track and artist', async () => {
545
+ const result = await client.callTool({
546
+ name: 'get_now_playing',
547
+ arguments: {},
548
+ });
549
+ const text = result.content[0].text;
550
+ expect(text).toContain('Sabotage');
551
+ expect(text).toContain('Beastie Boys');
552
+ });
553
+ it('get_recent_runs includes activity IDs', async () => {
554
+ const result = await client.callTool({
555
+ name: 'get_recent_runs',
556
+ arguments: {},
557
+ });
558
+ const text = result.content[0].text;
559
+ expect(text).toContain('[ID:');
560
+ });
561
+ it('get_personal_records includes activity IDs', async () => {
562
+ const result = await client.callTool({
563
+ name: 'get_personal_records',
564
+ arguments: {},
565
+ });
566
+ const text = result.content[0].text;
567
+ expect(text).toContain('[ID:');
568
+ });
569
+ it('get_activity_splits includes per-mile paces', async () => {
570
+ const result = await client.callTool({
571
+ name: 'get_activity_splits',
572
+ arguments: { id: 123 },
573
+ });
574
+ const text = result.content[0].text;
575
+ expect(text).toContain('Mile 1');
576
+ expect(text).toContain('7:15');
577
+ });
578
+ it('get_vinyl_collection includes pagination info', async () => {
579
+ const result = await client.callTool({
580
+ name: 'get_vinyl_collection',
581
+ arguments: {},
582
+ });
583
+ const text = result.content[0].text;
584
+ expect(text).toContain('page');
585
+ expect(text).toContain('total');
586
+ });
587
+ it('get_physical_media_stats includes format breakdown', async () => {
588
+ const result = await client.callTool({
589
+ name: 'get_physical_media_stats',
590
+ arguments: {},
591
+ });
592
+ const text = result.content[0].text;
593
+ expect(text).toContain('Blu-ray');
594
+ expect(text).toContain('4K UHD');
595
+ });
596
+ it('search returns domain-labeled results', async () => {
597
+ const result = await client.callTool({
598
+ name: 'search',
599
+ arguments: { query: 'beastie' },
600
+ });
601
+ const text = result.content[0].text;
602
+ expect(text).toContain('[listening/');
603
+ });
604
+ it('get_on_this_day groups by year', async () => {
605
+ const result = await client.callTool({
606
+ name: 'get_on_this_day',
607
+ arguments: {},
608
+ });
609
+ const text = result.content[0].text;
610
+ expect(text).toContain('2025');
611
+ });
612
+ });
613
+ });
614
+ //# sourceMappingURL=server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../src/__tests__/server.test.ts"],"names":[],"mappings":"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"}
@@ -88,5 +88,66 @@ export function registerCollectingTools(server, client) {
88
88
  lines.push(`- Added this year: ${data.added_this_year}`);
89
89
  return lines.join('\n');
90
90
  }));
91
+ // get_physical_media
92
+ server.tool('get_physical_media', 'Browse the physical media collection (Blu-ray, 4K UHD, HD DVD). Search by title, filter by format. Supports pagination.', {
93
+ query: z
94
+ .string()
95
+ .optional()
96
+ .describe("Optional: search by title (e.g. 'Princess Bride', 'Kubrick')"),
97
+ media_type: z
98
+ .enum(['bluray', 'uhd_bluray', 'hddvd'])
99
+ .optional()
100
+ .describe('Optional: filter by format (bluray, uhd_bluray, hddvd)'),
101
+ limit: z
102
+ .number()
103
+ .min(1)
104
+ .max(50)
105
+ .default(10)
106
+ .describe('Number of items to return'),
107
+ page: z.number().min(1).default(1).describe('Page number for pagination'),
108
+ }, READ_ONLY_ANNOTATIONS, async ({ query, media_type, limit, page }) => withErrorHandling(async () => {
109
+ const data = await client.get('/collecting/media', { q: query, media_type, limit, page });
110
+ if (!data.data.length)
111
+ return 'No physical media found.';
112
+ const formatLabel = {
113
+ bluray: 'Blu-ray',
114
+ uhd_bluray: '4K UHD',
115
+ hddvd: 'HD DVD',
116
+ };
117
+ const header = media_type
118
+ ? `${formatLabel[media_type] ?? media_type} Collection`
119
+ : 'Physical Media Collection';
120
+ const lines = [
121
+ `${header} (page ${data.pagination.page} of ${data.pagination.total_pages}, ${fmt(data.pagination.total)} total):`,
122
+ ];
123
+ for (const [i, m] of data.data.entries()) {
124
+ const num = (data.pagination.page - 1) * data.pagination.limit + i + 1;
125
+ const year = m.year ? ` (${m.year})` : '';
126
+ const format = ` [${formatLabel[m.media_type] ?? m.media_type}]`;
127
+ const rating = m.tmdb_rating ? ` -- ${m.tmdb_rating}/10` : '';
128
+ lines.push(`${num}. ${m.title}${year}${format}${rating}`);
129
+ }
130
+ return lines.join('\n');
131
+ }));
132
+ // get_physical_media_stats
133
+ server.tool('get_physical_media_stats', 'Get statistics for the physical media collection including total items and breakdown by format (Blu-ray, 4K UHD, HD DVD).', {}, READ_ONLY_ANNOTATIONS, async () => withErrorHandling(async () => {
134
+ const { data } = await client.get('/collecting/media/formats');
135
+ const formatLabel = {
136
+ bluray: 'Blu-ray',
137
+ uhd_bluray: '4K UHD',
138
+ hddvd: 'HD DVD',
139
+ };
140
+ const total = data.reduce((sum, f) => sum + f.count, 0);
141
+ const lines = [
142
+ 'Physical Media Stats:',
143
+ `- Total items: ${fmt(total)}`,
144
+ '',
145
+ 'By format:',
146
+ ];
147
+ for (const f of data) {
148
+ lines.push(` ${formatLabel[f.name] ?? f.name}: ${fmt(f.count)}`);
149
+ }
150
+ return lines.join('\n');
151
+ }));
91
152
  }
92
153
  //# sourceMappingURL=collecting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collecting.js","sourceRoot":"","sources":["../../src/tools/collecting.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collecting.js","sourceRoot":"","sources":["../../src/tools/collecting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,GAAG,EACH,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAoB;IAEpB,uBAAuB;IACvB,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,mKAAmK,EACnK;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,8EAA8E,CAC/E;QACH,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,6DAA6D,CAC9D;QACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACzE,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,sFAAsF,CACvF;QACH,KAAK,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aACrB,QAAQ,EAAE;aACV,QAAQ,CAAC,sCAAsC,CAAC;QACnD,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzE,GAAG,gBAAgB;KACpB,EACD,qBAAqB,EACrB,KAAK,EAAE,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,EAAE,GACH,EAAE,EAAE,CACH,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAkB1B,mBAAmB,EAAE;YACtB,CAAC,EAAE,KAAK;YACR,MAAM;YACN,KAAK;YACL,MAAM;YACN,IAAI;YACJ,KAAK;YACL,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,EAAE;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,yBAAyB,CAAC;QAExD,MAAM,KAAK,GAAG;YACZ,0BAA0B,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU;SAC1H,CAAC;QAEF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GACP,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa;gBAC5B,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG;gBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;YACrB,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,KAAK,GAAG,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CACR,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,cAAc,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,eAAe,CACtH,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CACL,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,uKAAuK,EACvK,EAAE,GAAG,gBAAgB,EAAE,EACvB,qBAAqB,EACrB,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAC3B,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAW9B,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5C,MAAM,KAAK,GAAG;YACZ,mBAAmB;YACnB,kBAAkB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;SAC1C,CAAC;QAEF,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7D,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,KAAK,GAAG,CAAC,KAAe,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,cAAc;YACrB,KAAK,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,cAAc;YACrB,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CACR,iBAAiB,IAAI,CAAC,mBAAmB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAC3E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,eAAe;YACtB,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAE3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CACL,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,yHAAyH,EACzH;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,8DAA8D,CAC/D;QACH,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;aACvC,QAAQ,EAAE;aACV,QAAQ,CAAC,wDAAwD,CAAC;QACrE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,2BAA2B,CAAC;QACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KAC1E,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAC3C,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAe1B,mBAAmB,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,0BAA0B,CAAC;QAEzD,MAAM,WAAW,GAA2B;YAC1C,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,QAAQ;SAChB,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU;YACvB,CAAC,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,UAAU,aAAa;YACvD,CAAC,CAAC,2BAA2B,CAAC;QAEhC,MAAM,KAAK,GAAG;YACZ,GAAG,MAAM,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU;SACnH,CAAC;QAEF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GACP,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC;YACjE,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CACL,CAAC;IAEF,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,2HAA2H,EAC3H,EAAE,EACF,qBAAqB,EACrB,KAAK,IAAI,EAAE,CACT,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAK9B,2BAA2B,CAAC,CAAC;QAEhC,MAAM,WAAW,GAA2B;YAC1C,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,QAAQ;SAChB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG;YACZ,uBAAuB;YACvB,kBAAkB,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,EAAE;YACF,YAAY;SACb,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rewind-mcp-server",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "MCP server for the Rewind personal data API",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,6 +17,9 @@
17
17
  "build": "tsc",
18
18
  "dev": "tsc --watch",
19
19
  "start": "node dist/index.js",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "inspect": "npx @modelcontextprotocol/inspector node dist/index.js",
20
23
  "prepublishOnly": "npm run build"
21
24
  },
22
25
  "keywords": [
@@ -54,6 +57,7 @@
54
57
  "devDependencies": {
55
58
  "@cloudflare/workers-types": "^4.20260403.1",
56
59
  "@types/node": "^22.0.0",
57
- "typescript": "^5.9.3"
60
+ "typescript": "^5.9.3",
61
+ "vitest": "^4.1.2"
58
62
  }
59
63
  }