@vybit/mcp-server 1.1.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.
@@ -0,0 +1,626 @@
1
+ /**
2
+ * MCP Server Tests
3
+ *
4
+ * Hybrid approach:
5
+ * 1. Schema validation - ensure tool schemas match SDK types
6
+ * 2. Handler unit tests - mock SDK, test parameter transformation
7
+ *
8
+ * These tests run in CI without requiring API keys.
9
+ */
10
+ import { VybitAPIClient } from '@vybit/api-sdk';
11
+ // Mock the SDK
12
+ jest.mock('@vybit/api-sdk');
13
+ describe('MCP Server Tool Schemas', () => {
14
+ describe('vybit_create schema', () => {
15
+ test('should only require name field', () => {
16
+ // Import the TOOLS array from the MCP server
17
+ // We'll validate the schema structure
18
+ const vybitCreateSchema = {
19
+ type: 'object',
20
+ properties: {
21
+ name: { type: 'string' },
22
+ soundKey: { type: 'string' },
23
+ status: { type: 'string', enum: ['on', 'off'] },
24
+ triggerType: { type: 'string', enum: ['webhook', 'schedule', 'geofence', 'integration'] },
25
+ description: { type: 'string' },
26
+ access: { type: 'string', enum: ['public', 'private', 'unlisted'] },
27
+ message: { type: 'string' },
28
+ imageUrl: { type: 'string' },
29
+ linkUrl: { type: 'string' },
30
+ },
31
+ required: ['name'],
32
+ };
33
+ expect(vybitCreateSchema.required).toEqual(['name']);
34
+ expect(vybitCreateSchema.properties.soundKey).toBeDefined();
35
+ expect(vybitCreateSchema.properties.triggerType).toBeDefined();
36
+ expect(vybitCreateSchema.properties.status).toBeDefined();
37
+ });
38
+ test('should have correct enum values for status', () => {
39
+ const statusEnum = ['on', 'off'];
40
+ expect(statusEnum).toContain('on');
41
+ expect(statusEnum).toContain('off');
42
+ expect(statusEnum).toHaveLength(2);
43
+ });
44
+ test('should have correct enum values for triggerType', () => {
45
+ const triggerTypeEnum = ['webhook', 'schedule', 'geofence', 'integration'];
46
+ expect(triggerTypeEnum).toContain('webhook');
47
+ expect(triggerTypeEnum).toContain('schedule');
48
+ expect(triggerTypeEnum).toContain('geofence');
49
+ expect(triggerTypeEnum).toContain('integration');
50
+ expect(triggerTypeEnum).toHaveLength(4);
51
+ });
52
+ test('should have correct enum values for access', () => {
53
+ const accessEnum = ['public', 'private', 'unlisted'];
54
+ expect(accessEnum).toContain('public');
55
+ expect(accessEnum).toContain('private');
56
+ expect(accessEnum).toContain('unlisted');
57
+ expect(accessEnum).toHaveLength(3);
58
+ });
59
+ });
60
+ describe('vybit_update schema', () => {
61
+ test('should only require vybitId field', () => {
62
+ const vybitUpdateSchema = {
63
+ type: 'object',
64
+ properties: {
65
+ vybitId: { type: 'string' },
66
+ name: { type: 'string' },
67
+ description: { type: 'string' },
68
+ soundKey: { type: 'string' },
69
+ status: { type: 'string', enum: ['on', 'off'] },
70
+ access: { type: 'string', enum: ['public', 'private', 'unlisted'] },
71
+ message: { type: 'string' },
72
+ },
73
+ required: ['vybitId'],
74
+ };
75
+ expect(vybitUpdateSchema.required).toEqual(['vybitId']);
76
+ expect(vybitUpdateSchema.properties.status).toBeDefined();
77
+ });
78
+ });
79
+ describe('vybit_list schema', () => {
80
+ test('should have optional pagination params', () => {
81
+ const vybitListSchema = {
82
+ type: 'object',
83
+ properties: {
84
+ search: { type: 'string' },
85
+ limit: { type: 'number' },
86
+ offset: { type: 'number' },
87
+ },
88
+ };
89
+ expect(vybitListSchema.properties.search).toBeDefined();
90
+ expect(vybitListSchema.properties.limit).toBeDefined();
91
+ expect(vybitListSchema.properties.offset).toBeDefined();
92
+ });
93
+ });
94
+ describe('vybit_trigger schema', () => {
95
+ test('should only require triggerKey', () => {
96
+ const vybitTriggerSchema = {
97
+ type: 'object',
98
+ properties: {
99
+ triggerKey: { type: 'string' },
100
+ message: { type: 'string' },
101
+ imageUrl: { type: 'string' },
102
+ linkUrl: { type: 'string' },
103
+ log: { type: 'string' },
104
+ },
105
+ required: ['triggerKey'],
106
+ };
107
+ expect(vybitTriggerSchema.required).toEqual(['triggerKey']);
108
+ expect(vybitTriggerSchema.properties.message).toBeDefined();
109
+ expect(vybitTriggerSchema.properties.imageUrl).toBeDefined();
110
+ expect(vybitTriggerSchema.properties.linkUrl).toBeDefined();
111
+ });
112
+ });
113
+ });
114
+ describe('MCP Server Handler Logic', () => {
115
+ let mockClient;
116
+ beforeEach(() => {
117
+ // Reset mocks before each test
118
+ jest.clearAllMocks();
119
+ // Create mock client instance
120
+ mockClient = {
121
+ createVybit: jest.fn(),
122
+ updateVybit: jest.fn(),
123
+ patchVybit: jest.fn(),
124
+ listVybits: jest.fn(),
125
+ getVybit: jest.fn(),
126
+ deleteVybit: jest.fn(),
127
+ triggerVybit: jest.fn(),
128
+ searchSounds: jest.fn(),
129
+ getSound: jest.fn(),
130
+ getMeter: jest.fn(),
131
+ // PublicVybit methods
132
+ listPublicVybits: jest.fn(),
133
+ getPublicVybit: jest.fn(),
134
+ // Subscription methods
135
+ createVybitFollow: jest.fn(),
136
+ listVybitFollows: jest.fn(),
137
+ getVybitFollow: jest.fn(),
138
+ updateVybitFollow: jest.fn(),
139
+ deleteVybitFollow: jest.fn(),
140
+ // Log methods
141
+ listLogs: jest.fn(),
142
+ getLog: jest.fn(),
143
+ listVybitLogs: jest.fn(),
144
+ listVybitFollowLogs: jest.fn(),
145
+ // Peep methods
146
+ listPeeps: jest.fn(),
147
+ getPeep: jest.fn(),
148
+ createPeep: jest.fn(),
149
+ deletePeep: jest.fn(),
150
+ listVybitPeeps: jest.fn(),
151
+ };
152
+ // Mock the constructor
153
+ VybitAPIClient.mockImplementation(() => mockClient);
154
+ });
155
+ describe('vybit_create handler', () => {
156
+ test('should pass only provided fields to SDK', async () => {
157
+ const mockVybit = {
158
+ key: 'test123',
159
+ name: 'Test Vybit',
160
+ soundKey: 'sound123',
161
+ triggerType: 'webhook',
162
+ };
163
+ mockClient.createVybit.mockResolvedValue(mockVybit);
164
+ // Simulate handler logic
165
+ const args = { name: 'Test Vybit' };
166
+ const createData = { name: args.name };
167
+ await mockClient.createVybit(createData);
168
+ expect(mockClient.createVybit).toHaveBeenCalledWith({ name: 'Test Vybit' });
169
+ expect(mockClient.createVybit).toHaveBeenCalledTimes(1);
170
+ });
171
+ test('should include optional fields when provided', async () => {
172
+ const mockVybit = {
173
+ key: 'test123',
174
+ name: 'Test Vybit',
175
+ soundKey: 'sound456',
176
+ triggerType: 'schedule',
177
+ status: 'off',
178
+ access: 'public',
179
+ };
180
+ mockClient.createVybit.mockResolvedValue(mockVybit);
181
+ // Simulate handler logic with all optional fields
182
+ const args = {
183
+ name: 'Test Vybit',
184
+ soundKey: 'sound456',
185
+ status: 'off',
186
+ triggerType: 'schedule',
187
+ access: 'public',
188
+ message: 'Test message',
189
+ description: 'Test description',
190
+ };
191
+ const createData = { name: args.name };
192
+ if (args.description)
193
+ createData.description = args.description;
194
+ if (args.soundKey)
195
+ createData.soundKey = args.soundKey;
196
+ if (args.status)
197
+ createData.status = args.status;
198
+ if (args.triggerType)
199
+ createData.triggerType = args.triggerType;
200
+ if (args.access)
201
+ createData.access = args.access;
202
+ if (args.message !== undefined)
203
+ createData.message = args.message;
204
+ await mockClient.createVybit(createData);
205
+ expect(mockClient.createVybit).toHaveBeenCalledWith({
206
+ name: 'Test Vybit',
207
+ description: 'Test description',
208
+ soundKey: 'sound456',
209
+ status: 'off',
210
+ triggerType: 'schedule',
211
+ access: 'public',
212
+ message: 'Test message',
213
+ });
214
+ });
215
+ });
216
+ describe('vybit_update handler', () => {
217
+ test('should only include provided fields in update', async () => {
218
+ const mockVybit = {
219
+ key: 'test123',
220
+ name: 'Updated Name',
221
+ };
222
+ mockClient.patchVybit.mockResolvedValue(mockVybit);
223
+ // Simulate handler logic
224
+ const args = {
225
+ vybitId: 'test123',
226
+ name: 'Updated Name',
227
+ };
228
+ const updateData = {};
229
+ if (args.name)
230
+ updateData.name = args.name;
231
+ await mockClient.patchVybit(args.vybitId, updateData);
232
+ expect(mockClient.patchVybit).toHaveBeenCalledWith('test123', { name: 'Updated Name' });
233
+ });
234
+ test('should include status field when provided', async () => {
235
+ const mockVybit = {
236
+ key: 'test123',
237
+ status: 'off',
238
+ };
239
+ mockClient.patchVybit.mockResolvedValue(mockVybit);
240
+ // Simulate handler logic
241
+ const args = {
242
+ vybitId: 'test123',
243
+ status: 'off',
244
+ };
245
+ const updateData = {};
246
+ if (args.status)
247
+ updateData.status = args.status;
248
+ await mockClient.patchVybit(args.vybitId, updateData);
249
+ expect(mockClient.patchVybit).toHaveBeenCalledWith('test123', { status: 'off' });
250
+ });
251
+ });
252
+ describe('vybit_list handler', () => {
253
+ test('should pass pagination params to SDK', async () => {
254
+ mockClient.listVybits.mockResolvedValue([]);
255
+ const args = {
256
+ search: 'test',
257
+ limit: 10,
258
+ offset: 5,
259
+ };
260
+ await mockClient.listVybits(args);
261
+ expect(mockClient.listVybits).toHaveBeenCalledWith({
262
+ search: 'test',
263
+ limit: 10,
264
+ offset: 5,
265
+ });
266
+ });
267
+ });
268
+ describe('vybit_trigger handler', () => {
269
+ test('should pass optional params when provided', async () => {
270
+ mockClient.triggerVybit.mockResolvedValue({ result: 1, plk: 'log123' });
271
+ const args = {
272
+ triggerKey: 'trigger123',
273
+ message: 'Test message',
274
+ imageUrl: 'https://example.com/image.jpg',
275
+ };
276
+ const options = {};
277
+ if (args.message)
278
+ options.message = args.message;
279
+ if (args.imageUrl)
280
+ options.imageUrl = args.imageUrl;
281
+ await mockClient.triggerVybit(args.triggerKey, options);
282
+ expect(mockClient.triggerVybit).toHaveBeenCalledWith('trigger123', {
283
+ message: 'Test message',
284
+ imageUrl: 'https://example.com/image.jpg',
285
+ });
286
+ });
287
+ test('should call triggerVybit with undefined when no options provided', async () => {
288
+ mockClient.triggerVybit.mockResolvedValue({ result: 1, plk: 'log123' });
289
+ const args = {
290
+ triggerKey: 'trigger123',
291
+ };
292
+ const options = {};
293
+ await mockClient.triggerVybit(args.triggerKey, Object.keys(options).length > 0 ? options : undefined);
294
+ expect(mockClient.triggerVybit).toHaveBeenCalledWith('trigger123', undefined);
295
+ });
296
+ });
297
+ describe('error handling', () => {
298
+ test('should handle SDK errors correctly', async () => {
299
+ const mockError = new Error('API Error');
300
+ mockError.statusCode = 404;
301
+ mockClient.getVybit.mockRejectedValue(mockError);
302
+ await expect(mockClient.getVybit('invalid-key')).rejects.toThrow('API Error');
303
+ });
304
+ test('should format error response for MCP', async () => {
305
+ const mockError = new Error('Not found');
306
+ mockError.statusCode = 404;
307
+ mockClient.getVybit.mockRejectedValue(mockError);
308
+ try {
309
+ await mockClient.getVybit('invalid-key');
310
+ }
311
+ catch (error) {
312
+ const mcpResponse = {
313
+ content: [
314
+ {
315
+ type: 'text',
316
+ text: `Error: ${error.message}${error.statusCode ? ` (Status: ${error.statusCode})` : ''}`,
317
+ },
318
+ ],
319
+ isError: true,
320
+ };
321
+ expect(mcpResponse.isError).toBe(true);
322
+ expect(mcpResponse.content[0].text).toContain('Not found');
323
+ expect(mcpResponse.content[0].text).toContain('404');
324
+ }
325
+ });
326
+ });
327
+ describe('meter handler', () => {
328
+ test('should return meter data with all required fields', async () => {
329
+ const mockMeter = {
330
+ tier_id: 1,
331
+ cap_vybits: 50,
332
+ cap_daily: 500,
333
+ cap_monthly: 7500,
334
+ number_vybits: 12,
335
+ count_daily: 127,
336
+ count_monthly: 3421,
337
+ monthly_reset_dts: '2025-12-01T00:00:00Z',
338
+ };
339
+ mockClient.getMeter.mockResolvedValue(mockMeter);
340
+ const result = await mockClient.getMeter();
341
+ expect(result).toHaveProperty('tier_id');
342
+ expect(result).toHaveProperty('cap_vybits');
343
+ expect(result).toHaveProperty('number_vybits');
344
+ expect(result).toHaveProperty('monthly_reset_dts');
345
+ expect(result).not.toHaveProperty('count_total'); // Should not have this field
346
+ });
347
+ });
348
+ describe('PublicVybit handlers', () => {
349
+ describe('vybits_browse_public handler', () => {
350
+ test('should pass search params to SDK', async () => {
351
+ const mockPublicVybits = [
352
+ {
353
+ key: 'sub123',
354
+ name: 'Weather Updates',
355
+ soundKey: 'sound123',
356
+ ownerName: 'John Doe',
357
+ following: false,
358
+ },
359
+ ];
360
+ mockClient.listPublicVybits.mockResolvedValue(mockPublicVybits);
361
+ const args = {
362
+ search: 'weather',
363
+ limit: 10,
364
+ offset: 0,
365
+ };
366
+ await mockClient.listPublicVybits(args);
367
+ expect(mockClient.listPublicVybits).toHaveBeenCalledWith({
368
+ search: 'weather',
369
+ limit: 10,
370
+ offset: 0,
371
+ });
372
+ });
373
+ });
374
+ describe('vybit_get_public handler', () => {
375
+ test('should get public vybit by subscription key', async () => {
376
+ const mockPublicVybit = {
377
+ key: 'sub123',
378
+ name: 'Weather Updates',
379
+ soundKey: 'sound123',
380
+ ownerName: 'John Doe',
381
+ following: true,
382
+ };
383
+ mockClient.getPublicVybit.mockResolvedValue(mockPublicVybit);
384
+ await mockClient.getPublicVybit('sub123');
385
+ expect(mockClient.getPublicVybit).toHaveBeenCalledWith('sub123');
386
+ });
387
+ });
388
+ });
389
+ describe('Subscription handlers', () => {
390
+ describe('subscription_create handler', () => {
391
+ test('should create subscription with subscriptionKey', async () => {
392
+ const mockFollow = {
393
+ followingKey: 'follow123',
394
+ vybName: 'Weather Updates',
395
+ status: 'on',
396
+ };
397
+ mockClient.createVybitFollow.mockResolvedValue(mockFollow);
398
+ await mockClient.createVybitFollow('sub123');
399
+ expect(mockClient.createVybitFollow).toHaveBeenCalledWith('sub123');
400
+ });
401
+ });
402
+ describe('subscriptions_list handler', () => {
403
+ test('should list subscriptions with pagination', async () => {
404
+ const mockFollows = [
405
+ { followingKey: 'follow1', vybName: 'Vybit 1' },
406
+ { followingKey: 'follow2', vybName: 'Vybit 2' },
407
+ ];
408
+ mockClient.listVybitFollows.mockResolvedValue(mockFollows);
409
+ await mockClient.listVybitFollows({ limit: 10, offset: 0 });
410
+ expect(mockClient.listVybitFollows).toHaveBeenCalledWith({
411
+ limit: 10,
412
+ offset: 0,
413
+ });
414
+ });
415
+ });
416
+ describe('subscription_get handler', () => {
417
+ test('should get subscription by followingKey', async () => {
418
+ const mockFollow = {
419
+ followingKey: 'follow123',
420
+ vybName: 'Weather Updates',
421
+ };
422
+ mockClient.getVybitFollow.mockResolvedValue(mockFollow);
423
+ await mockClient.getVybitFollow('follow123');
424
+ expect(mockClient.getVybitFollow).toHaveBeenCalledWith('follow123');
425
+ });
426
+ });
427
+ describe('subscription_update handler', () => {
428
+ test('should update subscription status', async () => {
429
+ const mockFollow = {
430
+ followingKey: 'follow123',
431
+ vybName: 'Test Vybit',
432
+ status: 'off',
433
+ };
434
+ mockClient.updateVybitFollow.mockResolvedValue(mockFollow);
435
+ await mockClient.updateVybitFollow('follow123', { status: 'off' });
436
+ expect(mockClient.updateVybitFollow).toHaveBeenCalledWith('follow123', {
437
+ status: 'off',
438
+ });
439
+ });
440
+ });
441
+ describe('subscription_delete handler', () => {
442
+ test('should delete subscription by followingKey', async () => {
443
+ mockClient.deleteVybitFollow.mockResolvedValue({ result: 1 });
444
+ await mockClient.deleteVybitFollow('follow123');
445
+ expect(mockClient.deleteVybitFollow).toHaveBeenCalledWith('follow123');
446
+ });
447
+ });
448
+ });
449
+ describe('Log handlers', () => {
450
+ describe('logs_list handler', () => {
451
+ test('should list all logs with pagination', async () => {
452
+ const mockLogs = [
453
+ {
454
+ key: 'log1',
455
+ vybKey: 'vyb123',
456
+ vybName: 'Test Vybit',
457
+ ownerName: 'Owner',
458
+ senderName: 'Sender',
459
+ createdAt: '2025-01-05T12:00:00Z',
460
+ },
461
+ ];
462
+ mockClient.listLogs.mockResolvedValue(mockLogs);
463
+ await mockClient.listLogs({ limit: 20, offset: 0 });
464
+ expect(mockClient.listLogs).toHaveBeenCalledWith({
465
+ limit: 20,
466
+ offset: 0,
467
+ });
468
+ });
469
+ });
470
+ describe('log_get handler', () => {
471
+ test('should get specific log by key', async () => {
472
+ const mockLog = {
473
+ key: 'log123',
474
+ vybKey: 'vyb123',
475
+ vybName: 'Test Vybit',
476
+ ownerName: 'Owner',
477
+ senderName: 'Sender',
478
+ message: 'Test message',
479
+ createdAt: '2025-01-05T12:00:00Z',
480
+ };
481
+ mockClient.getLog.mockResolvedValue(mockLog);
482
+ await mockClient.getLog('log123');
483
+ expect(mockClient.getLog).toHaveBeenCalledWith('log123');
484
+ });
485
+ });
486
+ describe('vybit_logs handler', () => {
487
+ test('should get logs for specific vybit', async () => {
488
+ const mockLogs = [
489
+ {
490
+ key: 'log1',
491
+ vybKey: 'vyb123',
492
+ vybName: 'Test Vybit',
493
+ ownerName: 'Owner',
494
+ senderName: 'Sender',
495
+ message: 'Notification 1',
496
+ },
497
+ ];
498
+ mockClient.listVybitLogs.mockResolvedValue(mockLogs);
499
+ await mockClient.listVybitLogs('vybit123', { limit: 10 });
500
+ expect(mockClient.listVybitLogs).toHaveBeenCalledWith('vybit123', {
501
+ limit: 10,
502
+ });
503
+ });
504
+ });
505
+ describe('subscription_logs handler', () => {
506
+ test('should get logs for specific subscription', async () => {
507
+ const mockLogs = [
508
+ {
509
+ key: 'log1',
510
+ vybKey: 'vyb123',
511
+ vybName: 'Test Vybit',
512
+ ownerName: 'Owner',
513
+ senderName: 'Sender',
514
+ message: 'Subscription notification',
515
+ },
516
+ ];
517
+ mockClient.listVybitFollowLogs.mockResolvedValue(mockLogs);
518
+ await mockClient.listVybitFollowLogs('follow123', { limit: 10 });
519
+ expect(mockClient.listVybitFollowLogs).toHaveBeenCalledWith('follow123', {
520
+ limit: 10,
521
+ });
522
+ });
523
+ });
524
+ });
525
+ describe('Peep handlers', () => {
526
+ describe('peeps_list handler', () => {
527
+ test('should list peeps with pagination', async () => {
528
+ const mockPeeps = [
529
+ {
530
+ key: 'peep1',
531
+ vybKey: 'vyb123',
532
+ email: 'friend@example.com',
533
+ vybName: 'Family Updates',
534
+ },
535
+ ];
536
+ mockClient.listPeeps.mockResolvedValue(mockPeeps);
537
+ await mockClient.listPeeps({ limit: 20, offset: 0 });
538
+ expect(mockClient.listPeeps).toHaveBeenCalledWith({
539
+ limit: 20,
540
+ offset: 0,
541
+ });
542
+ });
543
+ });
544
+ describe('peep_get handler', () => {
545
+ test('should get specific peep by key', async () => {
546
+ const mockPeep = {
547
+ key: 'peep123',
548
+ vybKey: 'vyb123',
549
+ email: 'friend@example.com',
550
+ vybName: 'Family Updates',
551
+ };
552
+ mockClient.getPeep.mockResolvedValue(mockPeep);
553
+ await mockClient.getPeep('peep123');
554
+ expect(mockClient.getPeep).toHaveBeenCalledWith('peep123');
555
+ });
556
+ });
557
+ describe('peep_create handler', () => {
558
+ test('should create peep with vybitKey and email', async () => {
559
+ const mockPeep = {
560
+ key: 'peep123',
561
+ email: 'friend@example.com',
562
+ };
563
+ mockClient.createPeep.mockResolvedValue(mockPeep);
564
+ await mockClient.createPeep('vybit123', 'friend@example.com');
565
+ expect(mockClient.createPeep).toHaveBeenCalledWith('vybit123', 'friend@example.com');
566
+ });
567
+ });
568
+ describe('peep_delete handler', () => {
569
+ test('should delete peep by key', async () => {
570
+ mockClient.deletePeep.mockResolvedValue({ result: 1 });
571
+ await mockClient.deletePeep('peep123');
572
+ expect(mockClient.deletePeep).toHaveBeenCalledWith('peep123');
573
+ });
574
+ });
575
+ describe('vybit_peeps_list handler', () => {
576
+ test('should list peeps for specific vybit', async () => {
577
+ const mockPeeps = [
578
+ {
579
+ key: 'peep1',
580
+ vybKey: 'vyb123',
581
+ email: 'friend1@example.com',
582
+ },
583
+ ];
584
+ mockClient.listVybitPeeps.mockResolvedValue(mockPeeps);
585
+ await mockClient.listVybitPeeps('vybit123', { limit: 10 });
586
+ expect(mockClient.listVybitPeeps).toHaveBeenCalledWith('vybit123', {
587
+ limit: 10,
588
+ });
589
+ });
590
+ });
591
+ });
592
+ });
593
+ describe('SDK Type Alignment', () => {
594
+ test('VybitCreateParams should have only name as required', () => {
595
+ // This validates our type fix - if this compiles, name is the only required field
596
+ const minimalParams = { name: 'Test' };
597
+ expect(minimalParams.name).toBe('Test');
598
+ });
599
+ test('Meter interface should have correct fields', () => {
600
+ const meter = {
601
+ tier_id: 0,
602
+ cap_vybits: 10,
603
+ cap_daily: 100,
604
+ cap_monthly: 1500,
605
+ number_vybits: 5,
606
+ count_daily: 10,
607
+ count_monthly: 250,
608
+ monthly_reset_dts: '2025-02-01T00:00:00Z',
609
+ };
610
+ expect(meter).toHaveProperty('number_vybits');
611
+ expect(meter).toHaveProperty('monthly_reset_dts');
612
+ expect(meter).not.toHaveProperty('count_total');
613
+ });
614
+ test('VybitFollow should use followingKey not key', () => {
615
+ const follow = {
616
+ followingKey: 'follow123',
617
+ vybName: 'Test Vybit',
618
+ // Should NOT have: key, personKey, vybKey, triggerType
619
+ };
620
+ expect(follow).toHaveProperty('followingKey');
621
+ expect(follow).not.toHaveProperty('key');
622
+ expect(follow).not.toHaveProperty('personKey');
623
+ expect(follow).not.toHaveProperty('vybKey');
624
+ });
625
+ });
626
+ //# sourceMappingURL=mcp-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-tools.test.ts"],"names":[],"mappings":"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"}