virtualsms-mcp 1.0.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/ARCHITECTURE.md +140 -0
- package/LICENSE +21 -0
- package/README.md +270 -0
- package/ROADMAP.md +48 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +109 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +285 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +602 -0
- package/dist/tools.js.map +1 -0
- package/package.json +56 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import WebSocket from 'ws';
|
|
3
|
+
// ─── Input Schemas ───────────────────────────────────────────────────────────
|
|
4
|
+
export const CheckPriceInput = z.object({
|
|
5
|
+
service: z.string().describe('Service code (e.g. "telegram", "whatsapp", "google")'),
|
|
6
|
+
country: z.string().describe('Country ISO code (e.g. "US", "GB", "RU") or country name'),
|
|
7
|
+
});
|
|
8
|
+
export const BuyNumberInput = z.object({
|
|
9
|
+
service: z.string().describe('Service code (e.g. "telegram", "whatsapp", "google")'),
|
|
10
|
+
country: z.string().describe('Country ISO code (e.g. "US", "GB", "RU")'),
|
|
11
|
+
});
|
|
12
|
+
export const CheckSmsInput = z.object({
|
|
13
|
+
order_id: z.string().describe('Order ID returned from buy_number'),
|
|
14
|
+
});
|
|
15
|
+
export const CancelOrderInput = z.object({
|
|
16
|
+
order_id: z.string().describe('Order ID to cancel'),
|
|
17
|
+
});
|
|
18
|
+
export const WaitForCodeInput = z.object({
|
|
19
|
+
service: z.string().describe('Service code (e.g. "telegram", "whatsapp", "google")'),
|
|
20
|
+
country: z.string().describe('Country ISO code (e.g. "US", "GB", "RU")'),
|
|
21
|
+
timeout_seconds: z.number()
|
|
22
|
+
.int()
|
|
23
|
+
.min(10)
|
|
24
|
+
.max(600)
|
|
25
|
+
.default(120)
|
|
26
|
+
.describe('How long to wait for SMS code in seconds (default: 120, max: 600)'),
|
|
27
|
+
});
|
|
28
|
+
export const FindCheapestInput = z.object({
|
|
29
|
+
service: z.string().describe('Service code (e.g. "telegram", "whatsapp", "google")'),
|
|
30
|
+
limit: z.number().int().min(1).max(50).default(5).describe('Number of cheapest options to return (default: 5)'),
|
|
31
|
+
});
|
|
32
|
+
export const SearchServiceInput = z.object({
|
|
33
|
+
query: z.string().describe('Natural language search query (e.g. "uber", "whatsapp", "binance", "steam")'),
|
|
34
|
+
});
|
|
35
|
+
export const ActiveOrdersInput = z.object({
|
|
36
|
+
status: z.string().optional().describe('Optional status filter: "pending", "sms_received", "cancelled", "completed"'),
|
|
37
|
+
});
|
|
38
|
+
// ─── Tool Definitions ────────────────────────────────────────────────────────
|
|
39
|
+
export const TOOL_DEFINITIONS = [
|
|
40
|
+
{
|
|
41
|
+
name: 'list_services',
|
|
42
|
+
description: 'Get all available SMS verification services (Telegram, WhatsApp, Google, etc.). ' +
|
|
43
|
+
'Use this to discover valid service codes before buying a number.',
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: {},
|
|
47
|
+
required: [],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'list_countries',
|
|
52
|
+
description: 'Get all available countries for SMS verification. ' +
|
|
53
|
+
'Use this to discover valid country codes before buying a number.',
|
|
54
|
+
inputSchema: {
|
|
55
|
+
type: 'object',
|
|
56
|
+
properties: {},
|
|
57
|
+
required: [],
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'check_price',
|
|
62
|
+
description: 'Check the price and availability for a specific service + country combination. ' +
|
|
63
|
+
'Always check price before buying to confirm availability.',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
service: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
description: 'Service code (e.g. "telegram", "whatsapp", "google")',
|
|
70
|
+
},
|
|
71
|
+
country: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
description: 'Country ISO code (e.g. "US", "GB", "RU")',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
required: ['service', 'country'],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'get_balance',
|
|
81
|
+
description: 'Check your VirtualSMS account balance in USD. ' +
|
|
82
|
+
'Requires VIRTUALSMS_API_KEY to be set.',
|
|
83
|
+
inputSchema: {
|
|
84
|
+
type: 'object',
|
|
85
|
+
properties: {},
|
|
86
|
+
required: [],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'buy_number',
|
|
91
|
+
description: 'Purchase a virtual phone number for SMS verification. ' +
|
|
92
|
+
'Returns order_id and phone_number. ' +
|
|
93
|
+
'Use check_sms to poll for the verification code, or use wait_for_code to do it automatically.',
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
properties: {
|
|
97
|
+
service: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
description: 'Service code (e.g. "telegram", "whatsapp", "google")',
|
|
100
|
+
},
|
|
101
|
+
country: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
description: 'Country ISO code (e.g. "US", "GB", "RU")',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
required: ['service', 'country'],
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'check_sms',
|
|
111
|
+
description: 'Check if an SMS verification code has been received for an order. ' +
|
|
112
|
+
'Poll this every 5-10 seconds after buying a number. ' +
|
|
113
|
+
'For automatic polling, use wait_for_code instead.',
|
|
114
|
+
inputSchema: {
|
|
115
|
+
type: 'object',
|
|
116
|
+
properties: {
|
|
117
|
+
order_id: {
|
|
118
|
+
type: 'string',
|
|
119
|
+
description: 'Order ID returned from buy_number',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
required: ['order_id'],
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'cancel_order',
|
|
127
|
+
description: 'Cancel an order and request a refund. ' +
|
|
128
|
+
'Only works if no SMS has been received yet. ' +
|
|
129
|
+
'Use this if the service is taking too long or you want to try a different number.',
|
|
130
|
+
inputSchema: {
|
|
131
|
+
type: 'object',
|
|
132
|
+
properties: {
|
|
133
|
+
order_id: {
|
|
134
|
+
type: 'string',
|
|
135
|
+
description: 'Order ID to cancel',
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
required: ['order_id'],
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'wait_for_code',
|
|
143
|
+
description: '🚀 RECOMMENDED: One-step tool that buys a number AND waits for the SMS code automatically. ' +
|
|
144
|
+
'Uses real-time WebSocket delivery with automatic polling fallback. ' +
|
|
145
|
+
'Always returns order_id in the response — even on timeout — so you can use check_sms to recover.',
|
|
146
|
+
inputSchema: {
|
|
147
|
+
type: 'object',
|
|
148
|
+
properties: {
|
|
149
|
+
service: {
|
|
150
|
+
type: 'string',
|
|
151
|
+
description: 'Service code (e.g. "telegram", "whatsapp", "google")',
|
|
152
|
+
},
|
|
153
|
+
country: {
|
|
154
|
+
type: 'string',
|
|
155
|
+
description: 'Country ISO code (e.g. "US", "GB", "RU")',
|
|
156
|
+
},
|
|
157
|
+
timeout_seconds: {
|
|
158
|
+
type: 'number',
|
|
159
|
+
description: 'How long to wait for SMS code in seconds (default: 120, max: 600)',
|
|
160
|
+
default: 120,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
required: ['service', 'country'],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'find_cheapest',
|
|
168
|
+
description: '💰 Find the cheapest countries for a given service, sorted by price. ' +
|
|
169
|
+
'Returns available countries with prices and stock levels so you can pick the best deal.',
|
|
170
|
+
inputSchema: {
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties: {
|
|
173
|
+
service: {
|
|
174
|
+
type: 'string',
|
|
175
|
+
description: 'Service code (e.g. "telegram", "whatsapp", "google")',
|
|
176
|
+
},
|
|
177
|
+
limit: {
|
|
178
|
+
type: 'number',
|
|
179
|
+
description: 'Number of cheapest options to return (default: 5)',
|
|
180
|
+
default: 5,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
required: ['service'],
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: 'search_service',
|
|
188
|
+
description: '🔍 Find the right service code using natural language. ' +
|
|
189
|
+
'Don\'t know the exact code? Just search "uber", "binance", "steam" etc. ' +
|
|
190
|
+
'Returns matching services with similarity scores.',
|
|
191
|
+
inputSchema: {
|
|
192
|
+
type: 'object',
|
|
193
|
+
properties: {
|
|
194
|
+
query: {
|
|
195
|
+
type: 'string',
|
|
196
|
+
description: 'Natural language search query (e.g. "uber", "whatsapp", "binance")',
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
required: ['query'],
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'active_orders',
|
|
204
|
+
description: '📋 List your active orders. Essential for crash recovery — if your session was interrupted, ' +
|
|
205
|
+
'use this to find pending orders and their phone numbers, then use check_sms to retrieve codes.',
|
|
206
|
+
inputSchema: {
|
|
207
|
+
type: 'object',
|
|
208
|
+
properties: {
|
|
209
|
+
status: {
|
|
210
|
+
type: 'string',
|
|
211
|
+
description: 'Optional status filter: "pending", "sms_received", "cancelled", "completed"',
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
required: [],
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
// ─── Tool Handlers ────────────────────────────────────────────────────────────
|
|
219
|
+
export async function handleListServices(client) {
|
|
220
|
+
const services = await client.listServices();
|
|
221
|
+
return {
|
|
222
|
+
content: [
|
|
223
|
+
{
|
|
224
|
+
type: 'text',
|
|
225
|
+
text: JSON.stringify(services, null, 2),
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
export async function handleListCountries(client) {
|
|
231
|
+
const countries = await client.listCountries();
|
|
232
|
+
return {
|
|
233
|
+
content: [
|
|
234
|
+
{
|
|
235
|
+
type: 'text',
|
|
236
|
+
text: JSON.stringify(countries, null, 2),
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
export async function handleCheckPrice(client, args) {
|
|
242
|
+
const price = await client.checkPrice(args.service, args.country);
|
|
243
|
+
return {
|
|
244
|
+
content: [
|
|
245
|
+
{
|
|
246
|
+
type: 'text',
|
|
247
|
+
text: JSON.stringify(price, null, 2),
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
export async function handleGetBalance(client) {
|
|
253
|
+
const balance = await client.getBalance();
|
|
254
|
+
return {
|
|
255
|
+
content: [
|
|
256
|
+
{
|
|
257
|
+
type: 'text',
|
|
258
|
+
text: JSON.stringify(balance, null, 2),
|
|
259
|
+
},
|
|
260
|
+
],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
export async function handleBuyNumber(client, args) {
|
|
264
|
+
const order = await client.createOrder(args.service, args.country);
|
|
265
|
+
return {
|
|
266
|
+
content: [
|
|
267
|
+
{
|
|
268
|
+
type: 'text',
|
|
269
|
+
text: JSON.stringify({
|
|
270
|
+
order_id: order.order_id,
|
|
271
|
+
phone_number: order.phone_number,
|
|
272
|
+
expires_at: order.expires_at,
|
|
273
|
+
status: order.status,
|
|
274
|
+
tip: 'Use check_sms to poll for the code, or cancel_order to refund.',
|
|
275
|
+
}, null, 2),
|
|
276
|
+
},
|
|
277
|
+
],
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
export async function handleCheckSms(client, args) {
|
|
281
|
+
const order = await client.getOrder(args.order_id);
|
|
282
|
+
const result = {
|
|
283
|
+
status: order.status,
|
|
284
|
+
phone_number: order.phone_number,
|
|
285
|
+
};
|
|
286
|
+
if (order.sms_code)
|
|
287
|
+
result.sms_code = order.sms_code;
|
|
288
|
+
if (order.sms_text)
|
|
289
|
+
result.sms_text = order.sms_text;
|
|
290
|
+
return {
|
|
291
|
+
content: [
|
|
292
|
+
{
|
|
293
|
+
type: 'text',
|
|
294
|
+
text: JSON.stringify(result, null, 2),
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
export async function handleCancelOrder(client, args) {
|
|
300
|
+
const result = await client.cancelOrder(args.order_id);
|
|
301
|
+
return {
|
|
302
|
+
content: [
|
|
303
|
+
{
|
|
304
|
+
type: 'text',
|
|
305
|
+
text: JSON.stringify(result, null, 2),
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Try to receive SMS via WebSocket. Returns null if WS unavailable.
|
|
312
|
+
* Falls back to polling automatically.
|
|
313
|
+
*/
|
|
314
|
+
function waitForSMSViaWebSocket(baseUrl, apiKey, orderId, timeoutMs) {
|
|
315
|
+
return new Promise((resolve) => {
|
|
316
|
+
const wsUrl = baseUrl.replace(/^http/, 'ws') + `/ws/orders?order_id=${encodeURIComponent(orderId)}&api_key=${encodeURIComponent(apiKey)}`;
|
|
317
|
+
let ws = null;
|
|
318
|
+
let resolved = false;
|
|
319
|
+
let reconnected = false;
|
|
320
|
+
const timer = setTimeout(() => {
|
|
321
|
+
if (!resolved) {
|
|
322
|
+
resolved = true;
|
|
323
|
+
ws?.close();
|
|
324
|
+
resolve(null); // trigger polling fallback
|
|
325
|
+
}
|
|
326
|
+
}, timeoutMs);
|
|
327
|
+
function connect() {
|
|
328
|
+
ws = new WebSocket(wsUrl);
|
|
329
|
+
ws.on('error', () => {
|
|
330
|
+
if (!resolved && !reconnected) {
|
|
331
|
+
reconnected = true;
|
|
332
|
+
ws?.close();
|
|
333
|
+
// Try once more after 1s
|
|
334
|
+
setTimeout(connect, 1000);
|
|
335
|
+
}
|
|
336
|
+
else if (!resolved) {
|
|
337
|
+
resolved = true;
|
|
338
|
+
clearTimeout(timer);
|
|
339
|
+
resolve(null); // WS failed, use polling
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
ws.on('close', () => {
|
|
343
|
+
if (!resolved && !reconnected) {
|
|
344
|
+
reconnected = true;
|
|
345
|
+
setTimeout(connect, 1000);
|
|
346
|
+
}
|
|
347
|
+
else if (!resolved) {
|
|
348
|
+
resolved = true;
|
|
349
|
+
clearTimeout(timer);
|
|
350
|
+
resolve(null); // WS closed, use polling
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
ws.on('message', (data) => {
|
|
354
|
+
try {
|
|
355
|
+
const msg = JSON.parse(data.toString());
|
|
356
|
+
// Message format from server: {type: "sms", code: "...", full_text: "..."}
|
|
357
|
+
if (msg.type === 'sms' && msg.code) {
|
|
358
|
+
if (!resolved) {
|
|
359
|
+
resolved = true;
|
|
360
|
+
clearTimeout(timer);
|
|
361
|
+
ws?.close();
|
|
362
|
+
resolve({
|
|
363
|
+
sms_code: msg.code,
|
|
364
|
+
sms_text: msg.full_text,
|
|
365
|
+
delivery_method: 'websocket',
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Also handle sms_received type from backend
|
|
370
|
+
if (msg.type === 'sms_received' && msg.code) {
|
|
371
|
+
if (!resolved) {
|
|
372
|
+
resolved = true;
|
|
373
|
+
clearTimeout(timer);
|
|
374
|
+
ws?.close();
|
|
375
|
+
resolve({
|
|
376
|
+
sms_code: msg.code,
|
|
377
|
+
sms_text: msg.message,
|
|
378
|
+
delivery_method: 'websocket',
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
// ignore parse errors
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
connect();
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
export async function handleWaitForCode(client, args) {
|
|
392
|
+
const timeoutMs = (args.timeout_seconds ?? 120) * 1000;
|
|
393
|
+
const pollIntervalMs = 5000;
|
|
394
|
+
const startTime = Date.now();
|
|
395
|
+
// Step 1: Buy the number
|
|
396
|
+
let order;
|
|
397
|
+
try {
|
|
398
|
+
order = await client.createOrder(args.service, args.country);
|
|
399
|
+
}
|
|
400
|
+
catch (err) {
|
|
401
|
+
throw new Error(`Failed to buy number: ${err.message}`);
|
|
402
|
+
}
|
|
403
|
+
const orderId = order.order_id;
|
|
404
|
+
const phoneNumber = order.phone_number;
|
|
405
|
+
const apiKey = client.getApiKey();
|
|
406
|
+
const baseUrl = client.getBaseUrl();
|
|
407
|
+
// Step 2: Try WebSocket first (if we have an API key)
|
|
408
|
+
if (apiKey) {
|
|
409
|
+
const remainingMs = timeoutMs - (Date.now() - startTime);
|
|
410
|
+
const wsResult = await waitForSMSViaWebSocket(baseUrl, apiKey, orderId, remainingMs);
|
|
411
|
+
if (wsResult) {
|
|
412
|
+
return {
|
|
413
|
+
content: [
|
|
414
|
+
{
|
|
415
|
+
type: 'text',
|
|
416
|
+
text: JSON.stringify({
|
|
417
|
+
success: true,
|
|
418
|
+
phone_number: phoneNumber,
|
|
419
|
+
sms_code: wsResult.sms_code,
|
|
420
|
+
sms_text: wsResult.sms_text,
|
|
421
|
+
order_id: orderId,
|
|
422
|
+
delivery_method: wsResult.delivery_method,
|
|
423
|
+
elapsed_seconds: Math.round((Date.now() - startTime) / 1000),
|
|
424
|
+
}, null, 2),
|
|
425
|
+
},
|
|
426
|
+
],
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
// WS timed out or failed — fall through to polling
|
|
430
|
+
}
|
|
431
|
+
// Step 3: Polling fallback
|
|
432
|
+
let attempts = 0;
|
|
433
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
434
|
+
attempts++;
|
|
435
|
+
try {
|
|
436
|
+
const status = await client.getOrder(orderId);
|
|
437
|
+
if (status.sms_code) {
|
|
438
|
+
return {
|
|
439
|
+
content: [
|
|
440
|
+
{
|
|
441
|
+
type: 'text',
|
|
442
|
+
text: JSON.stringify({
|
|
443
|
+
success: true,
|
|
444
|
+
phone_number: phoneNumber,
|
|
445
|
+
sms_code: status.sms_code,
|
|
446
|
+
sms_text: status.sms_text,
|
|
447
|
+
order_id: orderId,
|
|
448
|
+
delivery_method: 'polling',
|
|
449
|
+
elapsed_seconds: Math.round((Date.now() - startTime) / 1000),
|
|
450
|
+
poll_attempts: attempts,
|
|
451
|
+
}, null, 2),
|
|
452
|
+
},
|
|
453
|
+
],
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
if (status.status === 'cancelled' || status.status === 'failed') {
|
|
457
|
+
throw new Error(`Order ${orderId} was ${status.status} before SMS arrived.`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
const message = err.message;
|
|
462
|
+
if (!message.includes('waiting') && !message.includes('pending')) {
|
|
463
|
+
throw err;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
const remaining = timeoutMs - (Date.now() - startTime);
|
|
467
|
+
if (remaining <= 0)
|
|
468
|
+
break;
|
|
469
|
+
await sleep(Math.min(pollIntervalMs, remaining));
|
|
470
|
+
}
|
|
471
|
+
// Timeout — return order_id for crash recovery (don't cancel automatically)
|
|
472
|
+
return {
|
|
473
|
+
content: [
|
|
474
|
+
{
|
|
475
|
+
type: 'text',
|
|
476
|
+
text: JSON.stringify({
|
|
477
|
+
success: false,
|
|
478
|
+
error: 'timeout',
|
|
479
|
+
message: `No SMS received within ${args.timeout_seconds} seconds.`,
|
|
480
|
+
order_id: orderId,
|
|
481
|
+
phone_number: phoneNumber,
|
|
482
|
+
tip: 'Use check_sms with this order_id to check if code arrived later, or cancel_order to get a refund.',
|
|
483
|
+
}, null, 2),
|
|
484
|
+
},
|
|
485
|
+
],
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
function sleep(ms) {
|
|
489
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
490
|
+
}
|
|
491
|
+
export async function handleFindCheapest(client, args) {
|
|
492
|
+
const limit = args.limit ?? 5;
|
|
493
|
+
const countries = await client.listCountries();
|
|
494
|
+
const results = [];
|
|
495
|
+
const batchSize = 10;
|
|
496
|
+
for (let i = 0; i < countries.length; i += batchSize) {
|
|
497
|
+
const batch = countries.slice(i, i + batchSize);
|
|
498
|
+
const priceChecks = await Promise.allSettled(batch.map(async (c) => {
|
|
499
|
+
const price = await client.checkPrice(args.service, c.iso);
|
|
500
|
+
return {
|
|
501
|
+
country: c.iso,
|
|
502
|
+
country_name: c.name,
|
|
503
|
+
price_usd: price.price_usd,
|
|
504
|
+
stock: price.available,
|
|
505
|
+
};
|
|
506
|
+
}));
|
|
507
|
+
for (const result of priceChecks) {
|
|
508
|
+
if (result.status === 'fulfilled' && result.value.stock) {
|
|
509
|
+
results.push(result.value);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
results.sort((a, b) => a.price_usd - b.price_usd);
|
|
514
|
+
const top = results.slice(0, limit);
|
|
515
|
+
return {
|
|
516
|
+
content: [
|
|
517
|
+
{
|
|
518
|
+
type: 'text',
|
|
519
|
+
text: JSON.stringify({
|
|
520
|
+
service: args.service,
|
|
521
|
+
cheapest_options: top,
|
|
522
|
+
total_available_countries: results.length,
|
|
523
|
+
}, null, 2),
|
|
524
|
+
},
|
|
525
|
+
],
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
export async function handleSearchService(client, args) {
|
|
529
|
+
const services = await client.listServices();
|
|
530
|
+
const query = args.query.toLowerCase().trim();
|
|
531
|
+
const scored = services.map((s) => {
|
|
532
|
+
const name = s.name.toLowerCase();
|
|
533
|
+
const code = s.code.toLowerCase();
|
|
534
|
+
let score = 0;
|
|
535
|
+
if (code === query || name === query) {
|
|
536
|
+
score = 1.0;
|
|
537
|
+
}
|
|
538
|
+
else if (code.startsWith(query) || name.startsWith(query)) {
|
|
539
|
+
score = 0.9;
|
|
540
|
+
}
|
|
541
|
+
else if (code.includes(query) || name.includes(query)) {
|
|
542
|
+
score = 0.7;
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
const queryTokens = query.split(/\s+/);
|
|
546
|
+
const nameTokens = name.split(/[\s_-]+/);
|
|
547
|
+
let matches = 0;
|
|
548
|
+
for (const qt of queryTokens) {
|
|
549
|
+
if (nameTokens.some((nt) => nt.includes(qt) || qt.includes(nt))) {
|
|
550
|
+
matches++;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
if (matches > 0) {
|
|
554
|
+
score = (matches / Math.max(queryTokens.length, nameTokens.length)) * 0.6;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return { code: s.code, name: s.name, match_score: Math.round(score * 100) / 100 };
|
|
558
|
+
});
|
|
559
|
+
const matches = scored
|
|
560
|
+
.filter((s) => s.match_score > 0)
|
|
561
|
+
.sort((a, b) => b.match_score - a.match_score)
|
|
562
|
+
.slice(0, 10);
|
|
563
|
+
return {
|
|
564
|
+
content: [
|
|
565
|
+
{
|
|
566
|
+
type: 'text',
|
|
567
|
+
text: JSON.stringify({
|
|
568
|
+
query: args.query,
|
|
569
|
+
matches,
|
|
570
|
+
tip: matches.length > 0
|
|
571
|
+
? `Use the "code" field as the service parameter in other tools.`
|
|
572
|
+
: `No matches found. Try list_services to see all available services.`,
|
|
573
|
+
}, null, 2),
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
export async function handleActiveOrders(client, args) {
|
|
579
|
+
const orders = await client.listOrders(args.status);
|
|
580
|
+
return {
|
|
581
|
+
content: [
|
|
582
|
+
{
|
|
583
|
+
type: 'text',
|
|
584
|
+
text: JSON.stringify({
|
|
585
|
+
count: orders.length,
|
|
586
|
+
orders: orders.map((o) => ({
|
|
587
|
+
order_id: o.order_id,
|
|
588
|
+
phone_number: o.phone_number,
|
|
589
|
+
status: o.status,
|
|
590
|
+
sms_code: o.sms_code,
|
|
591
|
+
sms_text: o.sms_text,
|
|
592
|
+
expires_at: o.expires_at,
|
|
593
|
+
})),
|
|
594
|
+
tip: orders.length > 0
|
|
595
|
+
? 'Use check_sms with any order_id to get the latest status, or cancel_order to refund pending orders.'
|
|
596
|
+
: 'No orders found.',
|
|
597
|
+
}, null, 2),
|
|
598
|
+
},
|
|
599
|
+
],
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "virtualsms-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for VirtualSMS — receive SMS verification codes with AI agents",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"virtualsms-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsc --watch",
|
|
12
|
+
"start": "node dist/index.js",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mcp",
|
|
17
|
+
"sms",
|
|
18
|
+
"verification",
|
|
19
|
+
"virtual-number",
|
|
20
|
+
"phone-verification",
|
|
21
|
+
"sms-activate",
|
|
22
|
+
"model-context-protocol"
|
|
23
|
+
],
|
|
24
|
+
"author": "VirtualSMS",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"homepage": "https://virtualsms.io",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/virtualsms/mcp-server"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/virtualsms/mcp-server/issues"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18"
|
|
36
|
+
},
|
|
37
|
+
"type": "module",
|
|
38
|
+
"files": [
|
|
39
|
+
"dist/**/*",
|
|
40
|
+
"README.md",
|
|
41
|
+
"ROADMAP.md",
|
|
42
|
+
"ARCHITECTURE.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
47
|
+
"@types/ws": "^8.18.1",
|
|
48
|
+
"axios": "^1.7.0",
|
|
49
|
+
"ws": "^8.18.0",
|
|
50
|
+
"zod": "^3.23.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^22.0.0",
|
|
54
|
+
"typescript": "^5.5.0"
|
|
55
|
+
}
|
|
56
|
+
}
|