@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,464 @@
1
+ /**
2
+ * MCP Server Integration Tests
3
+ *
4
+ * These tests run against the real Vybit API when VYBIT_API_KEY is provided.
5
+ * They are skipped in CI when no API key is available.
6
+ *
7
+ * To run:
8
+ * VYBIT_API_KEY=your-key npm test -w @vybit/mcp-server
9
+ */
10
+ import { VybitAPIClient } from '@vybit/api-sdk';
11
+ const API_KEY = process.env.VYBIT_API_KEY;
12
+ const hasApiKey = !!API_KEY && API_KEY !== 'your-api-key-here';
13
+ // Skip all integration tests if no API key
14
+ const describeWithApiKey = hasApiKey ? describe : describe.skip;
15
+ describeWithApiKey('MCP Server Integration Tests (Real API)', () => {
16
+ let client;
17
+ const createdResources = [];
18
+ // Helper to add delay between API calls to avoid rate limiting
19
+ const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
20
+ beforeAll(() => {
21
+ if (!hasApiKey)
22
+ return;
23
+ const baseUrl = process.env.VYBIT_API_URL || 'https://api.vybit.net/v1';
24
+ client = new VybitAPIClient({
25
+ apiKey: API_KEY,
26
+ baseUrl: baseUrl
27
+ });
28
+ console.log('๐Ÿ”‘ Running integration tests with real API key');
29
+ console.log(`๐ŸŒ API URL: ${baseUrl}`);
30
+ console.log('โฑ๏ธ Adding delays between requests to avoid rate limiting...');
31
+ });
32
+ beforeEach(async () => {
33
+ // Add 200ms delay before each test to avoid rate limiting (10 req/sec = 100ms minimum)
34
+ await delay(200);
35
+ });
36
+ afterAll(async () => {
37
+ if (!hasApiKey || !client)
38
+ return;
39
+ // Cleanup any created resources
40
+ console.log('๐Ÿงน Cleaning up test resources...');
41
+ for (const vybitKey of createdResources) {
42
+ try {
43
+ await client.deleteVybit(vybitKey);
44
+ console.log(` โœ… Deleted vybit: ${vybitKey}`);
45
+ }
46
+ catch (error) {
47
+ console.log(` โš ๏ธ Failed to delete vybit ${vybitKey}`);
48
+ }
49
+ }
50
+ });
51
+ describe('vybit_create with minimal params', () => {
52
+ test('should create vybit with only name', async () => {
53
+ const result = await client.createVybit({
54
+ name: 'MCP Test - Minimal Params',
55
+ });
56
+ expect(result).toHaveProperty('key');
57
+ expect(result.name).toBe('MCP Test - Minimal Params');
58
+ expect(result).toHaveProperty('soundKey'); // Should have default
59
+ expect(result).toHaveProperty('triggerType'); // Should have default
60
+ expect(result).toHaveProperty('triggerKey');
61
+ createdResources.push(result.key);
62
+ });
63
+ test('should create vybit with all optional fields', async () => {
64
+ const result = await client.createVybit({
65
+ name: 'MCP Test - Full Params',
66
+ description: 'Test description',
67
+ status: 'off',
68
+ access: 'private',
69
+ message: 'Test message',
70
+ });
71
+ expect(result.name).toBe('MCP Test - Full Params');
72
+ expect(result.description).toBe('Test description');
73
+ expect(result.status).toBe('off');
74
+ expect(result.access).toBe('private');
75
+ expect(result.message).toBe('Test message');
76
+ createdResources.push(result.key);
77
+ });
78
+ });
79
+ describe('vybit_update with status field', () => {
80
+ let testVybitKey;
81
+ beforeAll(async () => {
82
+ if (!hasApiKey)
83
+ return;
84
+ const vybit = await client.createVybit({
85
+ name: 'MCP Test - Update Status',
86
+ });
87
+ testVybitKey = vybit.key;
88
+ createdResources.push(testVybitKey);
89
+ });
90
+ test('should update vybit status to off', async () => {
91
+ const result = await client.patchVybit(testVybitKey, {
92
+ status: 'off',
93
+ });
94
+ expect(result.status).toBe('off');
95
+ });
96
+ test('should update vybit status to on', async () => {
97
+ const result = await client.patchVybit(testVybitKey, {
98
+ status: 'on',
99
+ });
100
+ expect(result.status).toBe('on');
101
+ });
102
+ test('should update multiple fields including status', async () => {
103
+ const result = await client.patchVybit(testVybitKey, {
104
+ name: 'Updated Name',
105
+ status: 'off',
106
+ message: 'Updated message',
107
+ });
108
+ expect(result.name).toBe('Updated Name');
109
+ expect(result.status).toBe('off');
110
+ expect(result.message).toBe('Updated message');
111
+ });
112
+ });
113
+ describe('meter endpoint', () => {
114
+ test('should return meter with all required fields', async () => {
115
+ const meter = await client.getMeter();
116
+ // Check all fields from our fixed Meter interface
117
+ expect(meter).toHaveProperty('tier_id');
118
+ expect(meter).toHaveProperty('cap_vybits');
119
+ expect(meter).toHaveProperty('cap_daily');
120
+ expect(meter).toHaveProperty('cap_monthly');
121
+ expect(meter).toHaveProperty('number_vybits');
122
+ expect(meter).toHaveProperty('count_daily');
123
+ expect(meter).toHaveProperty('count_monthly');
124
+ expect(meter).toHaveProperty('monthly_reset_dts');
125
+ // Verify it does NOT have the old incorrect field
126
+ expect(meter).not.toHaveProperty('count_total');
127
+ // Validate types
128
+ expect(typeof meter.tier_id).toBe('number');
129
+ expect(typeof meter.number_vybits).toBe('number');
130
+ expect(typeof meter.monthly_reset_dts).toBe('string');
131
+ });
132
+ });
133
+ describe('vybit_list with pagination', () => {
134
+ test('should list vybits with limit param', async () => {
135
+ const vybits = await client.listVybits({ limit: 5 });
136
+ expect(Array.isArray(vybits)).toBe(true);
137
+ expect(vybits.length).toBeLessThanOrEqual(5);
138
+ });
139
+ test('should search vybits', async () => {
140
+ const vybits = await client.listVybits({
141
+ search: 'MCP Test',
142
+ limit: 10,
143
+ });
144
+ expect(Array.isArray(vybits)).toBe(true);
145
+ // Should only return vybits matching search
146
+ vybits.forEach(vybit => {
147
+ expect(vybit.name.toLowerCase()).toContain('mcp test');
148
+ });
149
+ });
150
+ });
151
+ describe('sounds endpoints', () => {
152
+ test('should search sounds', async () => {
153
+ const sounds = await client.searchSounds({
154
+ search: 'notification',
155
+ limit: 5,
156
+ });
157
+ expect(Array.isArray(sounds)).toBe(true);
158
+ expect(sounds.length).toBeGreaterThan(0);
159
+ expect(sounds[0]).toHaveProperty('key');
160
+ expect(sounds[0]).toHaveProperty('name');
161
+ expect(sounds[0]).toHaveProperty('url');
162
+ });
163
+ test('should get specific sound', async () => {
164
+ // First get a sound key
165
+ const sounds = await client.searchSounds({ limit: 1 });
166
+ if (sounds.length === 0) {
167
+ console.log('No sounds available, skipping test');
168
+ return;
169
+ }
170
+ const sound = await client.getSound(sounds[0].key);
171
+ expect(sound.key).toBe(sounds[0].key);
172
+ expect(sound).toHaveProperty('name');
173
+ expect(sound).toHaveProperty('type');
174
+ expect(sound).toHaveProperty('status');
175
+ expect(sound).toHaveProperty('url');
176
+ });
177
+ });
178
+ describe('vybit_trigger', () => {
179
+ let testVybit;
180
+ beforeAll(async () => {
181
+ if (!hasApiKey)
182
+ return;
183
+ testVybit = await client.createVybit({
184
+ name: 'MCP Test - Trigger',
185
+ status: 'on',
186
+ });
187
+ createdResources.push(testVybit.key);
188
+ });
189
+ test('should trigger vybit without params', async () => {
190
+ const result = await client.triggerVybit(testVybit.key);
191
+ expect(result).toHaveProperty('result');
192
+ expect(result.result).toBe(1);
193
+ expect(result).toHaveProperty('plk'); // primary log key
194
+ });
195
+ test('should trigger vybit with custom message', async () => {
196
+ const result = await client.triggerVybit(testVybit.key, {
197
+ message: 'Integration test notification',
198
+ });
199
+ expect(result.result).toBe(1);
200
+ expect(result).toHaveProperty('plk');
201
+ });
202
+ test('should trigger vybit with message, imageUrl, and linkUrl', async () => {
203
+ const result = await client.triggerVybit(testVybit.key, {
204
+ message: 'Full params test',
205
+ imageUrl: 'https://example.com/image.jpg',
206
+ linkUrl: 'https://example.com',
207
+ });
208
+ expect(result.result).toBe(1);
209
+ expect(result).toHaveProperty('plk');
210
+ });
211
+ });
212
+ describe('PublicVybit discovery', () => {
213
+ test('should browse public vybits', async () => {
214
+ const publicVybits = await client.listPublicVybits({
215
+ limit: 5,
216
+ });
217
+ expect(Array.isArray(publicVybits)).toBe(true);
218
+ if (publicVybits.length > 0) {
219
+ expect(publicVybits[0]).toHaveProperty('key');
220
+ expect(publicVybits[0]).toHaveProperty('name');
221
+ expect(publicVybits[0]).toHaveProperty('ownerName');
222
+ expect(publicVybits[0]).toHaveProperty('following');
223
+ expect(publicVybits[0]).toHaveProperty('soundKey');
224
+ }
225
+ });
226
+ test('should search public vybits', async () => {
227
+ const publicVybits = await client.listPublicVybits({
228
+ search: 'test',
229
+ limit: 5,
230
+ });
231
+ expect(Array.isArray(publicVybits)).toBe(true);
232
+ // Search may return empty results if no matching public vybits exist
233
+ // Backend now correctly returns 200 with [] instead of 404
234
+ });
235
+ test('should get public vybit details', async () => {
236
+ // First get a public vybit to test with
237
+ const publicVybits = await client.listPublicVybits({ limit: 1 });
238
+ if (publicVybits.length === 0) {
239
+ console.log('No public vybits available, skipping test');
240
+ return;
241
+ }
242
+ const details = await client.getPublicVybit(publicVybits[0].key);
243
+ expect(details).toHaveProperty('key');
244
+ expect(details).toHaveProperty('name');
245
+ expect(details).toHaveProperty('ownerName');
246
+ expect(details).toHaveProperty('following');
247
+ });
248
+ });
249
+ describe('Subscription management', () => {
250
+ let testSubscriptionKey;
251
+ let createdFollowKey = null;
252
+ beforeAll(async () => {
253
+ if (!hasApiKey)
254
+ return;
255
+ // Try to find a public vybit to subscribe to
256
+ const publicVybits = await client.listPublicVybits({ limit: 1 });
257
+ if (publicVybits.length > 0 && !publicVybits[0].following) {
258
+ testSubscriptionKey = publicVybits[0].key;
259
+ }
260
+ });
261
+ afterAll(async () => {
262
+ if (!hasApiKey || !client || !createdFollowKey)
263
+ return;
264
+ try {
265
+ await client.deleteVybitFollow(createdFollowKey);
266
+ console.log(` โœ… Unsubscribed from test subscription`);
267
+ }
268
+ catch (error) {
269
+ console.log(` โš ๏ธ Failed to unsubscribe`);
270
+ }
271
+ });
272
+ test('should create subscription', async () => {
273
+ if (!testSubscriptionKey) {
274
+ console.log('No public vybit available for subscription, skipping test');
275
+ return;
276
+ }
277
+ const follow = await client.createVybitFollow(testSubscriptionKey);
278
+ expect(follow).toHaveProperty('followingKey');
279
+ expect(follow).toHaveProperty('vybName');
280
+ createdFollowKey = follow.followingKey;
281
+ });
282
+ test('should list subscriptions', async () => {
283
+ const follows = await client.listVybitFollows({
284
+ limit: 10,
285
+ });
286
+ expect(Array.isArray(follows)).toBe(true);
287
+ if (follows.length > 0) {
288
+ expect(follows[0]).toHaveProperty('followingKey');
289
+ expect(follows[0]).toHaveProperty('vybName');
290
+ }
291
+ });
292
+ test('should get subscription details', async () => {
293
+ if (!createdFollowKey) {
294
+ console.log('No subscription created, skipping test');
295
+ return;
296
+ }
297
+ const follow = await client.getVybitFollow(createdFollowKey);
298
+ expect(follow.followingKey).toBe(createdFollowKey);
299
+ expect(follow).toHaveProperty('vybName');
300
+ });
301
+ test('should update subscription', async () => {
302
+ if (!createdFollowKey) {
303
+ console.log('No subscription created, skipping test');
304
+ return;
305
+ }
306
+ const updated = await client.updateVybitFollow(createdFollowKey, {
307
+ status: 'off',
308
+ });
309
+ expect(updated.status).toBe('off');
310
+ // Turn it back on
311
+ await client.updateVybitFollow(createdFollowKey, { status: 'on' });
312
+ });
313
+ });
314
+ describe('Notification logs', () => {
315
+ let testVybitForLogs;
316
+ beforeAll(async () => {
317
+ if (!hasApiKey)
318
+ return;
319
+ // Create a test vybit and trigger it to generate logs
320
+ testVybitForLogs = await client.createVybit({
321
+ name: 'MCP Test - Logs',
322
+ status: 'on',
323
+ });
324
+ createdResources.push(testVybitForLogs.key);
325
+ // Trigger to create a log
326
+ await client.triggerVybit(testVybitForLogs.key, {
327
+ message: 'Test log message',
328
+ });
329
+ // Wait a bit for log to be created
330
+ await delay(500);
331
+ });
332
+ test('should list all logs', async () => {
333
+ const logs = await client.listLogs({
334
+ limit: 10,
335
+ });
336
+ expect(Array.isArray(logs)).toBe(true);
337
+ if (logs.length > 0) {
338
+ expect(logs[0]).toHaveProperty('key');
339
+ expect(logs[0]).toHaveProperty('vybName');
340
+ expect(logs[0]).toHaveProperty('createdAt');
341
+ }
342
+ });
343
+ test('should get specific log', async () => {
344
+ const logs = await client.listLogs({ limit: 1 });
345
+ if (logs.length === 0) {
346
+ console.log('No logs available, skipping test');
347
+ return;
348
+ }
349
+ const log = await client.getLog(logs[0].key);
350
+ expect(log.key).toBe(logs[0].key);
351
+ expect(log).toHaveProperty('vybName');
352
+ expect(log).toHaveProperty('createdAt');
353
+ });
354
+ test('should list logs for specific vybit', async () => {
355
+ const logs = await client.listVybitLogs(testVybitForLogs.key, {
356
+ limit: 10,
357
+ });
358
+ expect(Array.isArray(logs)).toBe(true);
359
+ // Should have at least the log we just created
360
+ expect(logs.length).toBeGreaterThan(0);
361
+ expect(logs[0]).toHaveProperty('key');
362
+ });
363
+ test('should list logs for subscription', async () => {
364
+ // Get subscriptions first
365
+ const follows = await client.listVybitFollows({ limit: 1 });
366
+ if (follows.length === 0) {
367
+ console.log('No subscriptions available, skipping test');
368
+ return;
369
+ }
370
+ const logs = await client.listVybitFollowLogs(follows[0].followingKey, {
371
+ limit: 10,
372
+ });
373
+ expect(Array.isArray(logs)).toBe(true);
374
+ });
375
+ });
376
+ describe('Peep management', () => {
377
+ let testVybitForPeeps;
378
+ let createdPeepKey = null;
379
+ beforeAll(async () => {
380
+ if (!hasApiKey)
381
+ return;
382
+ testVybitForPeeps = await client.createVybit({
383
+ name: 'MCP Test - Peeps',
384
+ access: 'private',
385
+ });
386
+ createdResources.push(testVybitForPeeps.key);
387
+ });
388
+ afterAll(async () => {
389
+ if (!hasApiKey || !client || !createdPeepKey)
390
+ return;
391
+ try {
392
+ await client.deletePeep(createdPeepKey);
393
+ console.log(` โœ… Deleted test peep`);
394
+ }
395
+ catch (error) {
396
+ console.log(` โš ๏ธ Failed to delete peep`);
397
+ }
398
+ });
399
+ test('should create peep invitation', async () => {
400
+ const peep = await client.createPeep(testVybitForPeeps.key, 'test-peep@example.com');
401
+ // createPeep returns a simple result: {key, logKey, message, result}
402
+ // Not a full Peep object. Use getPeep() or listPeeps() to get full details
403
+ expect(peep).toHaveProperty('key');
404
+ expect(peep).toHaveProperty('result');
405
+ expect(peep.result).toBe(1);
406
+ createdPeepKey = peep.key;
407
+ });
408
+ test('should list all peeps', async () => {
409
+ const peeps = await client.listPeeps({
410
+ limit: 10,
411
+ });
412
+ expect(Array.isArray(peeps)).toBe(true);
413
+ if (peeps.length > 0) {
414
+ expect(peeps[0]).toHaveProperty('key');
415
+ expect(peeps[0]).toHaveProperty('vybKey');
416
+ expect(peeps[0]).toHaveProperty('name'); // API returns 'name' field, not 'email'
417
+ }
418
+ });
419
+ test('should get specific peep', async () => {
420
+ if (!createdPeepKey) {
421
+ console.log('No peep created, skipping test');
422
+ return;
423
+ }
424
+ const peep = await client.getPeep(createdPeepKey);
425
+ expect(peep.key).toBe(createdPeepKey);
426
+ expect(peep).toHaveProperty('vybKey');
427
+ expect(peep).toHaveProperty('name');
428
+ });
429
+ test('should list peeps for specific vybit', async () => {
430
+ const peeps = await client.listVybitPeeps(testVybitForPeeps.key, {
431
+ limit: 10,
432
+ });
433
+ expect(Array.isArray(peeps)).toBe(true);
434
+ // Should have at least the peep we just created
435
+ expect(peeps.length).toBeGreaterThan(0);
436
+ });
437
+ });
438
+ describe('error scenarios', () => {
439
+ test('should handle 404 for non-existent vybit', async () => {
440
+ await expect(client.getVybit('invalid-key-12345')).rejects.toThrow();
441
+ });
442
+ test('should handle 404 for non-existent sound', async () => {
443
+ await expect(client.getSound('invalid-sound-key')).rejects.toThrow();
444
+ });
445
+ test('should handle 404 for non-existent public vybit', async () => {
446
+ await expect(client.getPublicVybit('invalid-subscription-key')).rejects.toThrow();
447
+ });
448
+ test('should handle 404 for non-existent log', async () => {
449
+ await expect(client.getLog('invalid-log-key')).rejects.toThrow();
450
+ });
451
+ test('should handle 404 for non-existent peep', async () => {
452
+ await expect(client.getPeep('invalid-peep-key')).rejects.toThrow();
453
+ });
454
+ });
455
+ });
456
+ // Show message when tests are skipped
457
+ if (!hasApiKey) {
458
+ describe('MCP Server Integration Tests', () => {
459
+ test.skip('Integration tests skipped - set VYBIT_API_KEY to run', () => {
460
+ console.log('๐Ÿ’ก Tip: Run with VYBIT_API_KEY=your-key npm test -w @vybit/mcp-server');
461
+ });
462
+ });
463
+ }
464
+ //# sourceMappingURL=mcp-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
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
+ export {};
11
+ //# sourceMappingURL=mcp-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}