@ggboi360/mobile-dev-mcp 0.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.
- package/LICENSE +53 -0
- package/README.md +193 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2320 -0
- package/dist/index.js.map +1 -0
- package/dist/license.d.ts +103 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +606 -0
- package/dist/license.js.map +1 -0
- package/dist/license.test.d.ts +2 -0
- package/dist/license.test.d.ts.map +1 -0
- package/dist/license.test.js +198 -0
- package/dist/license.test.js.map +1 -0
- package/dist/tools.test.d.ts +2 -0
- package/dist/tools.test.d.ts.map +1 -0
- package/dist/tools.test.js +337 -0
- package/dist/tools.test.js.map +1 -0
- package/package.json +57 -0
package/dist/license.js
ADDED
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License validation module for Mobile Dev MCP
|
|
3
|
+
*
|
|
4
|
+
* Tiers:
|
|
5
|
+
* - TRIAL: No license, 50 tool requests then blocked
|
|
6
|
+
* - BASIC ($6/mo): 17 core tools (Android + iOS basics), 50 line limits, 1 device
|
|
7
|
+
* - ADVANCED ($8/wk, $12/mo, $99/yr): All 41 tools, unlimited, multi-device
|
|
8
|
+
*
|
|
9
|
+
* Handles:
|
|
10
|
+
* - License key validation against API
|
|
11
|
+
* - Local caching of license status
|
|
12
|
+
* - Trial usage tracking
|
|
13
|
+
* - Graceful degradation when offline
|
|
14
|
+
* - Feature gating based on tier
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from "fs";
|
|
17
|
+
import * as path from "path";
|
|
18
|
+
import * as os from "os";
|
|
19
|
+
import * as crypto from "crypto";
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// CONSTANTS
|
|
22
|
+
// ============================================================================
|
|
23
|
+
const CONFIG_DIR = path.join(os.homedir(), ".mobiledev-mcp");
|
|
24
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
25
|
+
const LICENSE_CACHE_FILE = path.join(CONFIG_DIR, "license.json");
|
|
26
|
+
const TRIAL_FILE = path.join(CONFIG_DIR, "trial.json");
|
|
27
|
+
// How long to trust cached license without revalidation
|
|
28
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
29
|
+
// Grace period if API is down but we have a cached valid license
|
|
30
|
+
const GRACE_PERIOD_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
31
|
+
// Default API endpoint - UPDATE THIS after deploying your Cloudflare Worker!
|
|
32
|
+
const DEFAULT_API_ENDPOINT = "https://mobiledev-license-api.giladworkersdev.workers.dev";
|
|
33
|
+
// Trial settings
|
|
34
|
+
const TRIAL_LIMIT = 50; // Number of tool requests allowed in trial
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// FEATURE TIERS
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// BASIC TIER ($6/mo) - Core tools, available to all paid users
|
|
39
|
+
export const BASIC_TOOLS = [
|
|
40
|
+
// Android tools
|
|
41
|
+
"get_metro_logs",
|
|
42
|
+
"get_adb_logs",
|
|
43
|
+
"screenshot_emulator",
|
|
44
|
+
"list_devices",
|
|
45
|
+
"check_metro_status",
|
|
46
|
+
"get_app_info",
|
|
47
|
+
"clear_app_data",
|
|
48
|
+
"restart_adb",
|
|
49
|
+
"get_device_info",
|
|
50
|
+
"start_metro_logging",
|
|
51
|
+
"stop_metro_logging",
|
|
52
|
+
// iOS Simulator tools
|
|
53
|
+
"list_ios_simulators",
|
|
54
|
+
"screenshot_ios_simulator",
|
|
55
|
+
"get_ios_simulator_logs",
|
|
56
|
+
"get_ios_simulator_info",
|
|
57
|
+
// License tools
|
|
58
|
+
"get_license_status",
|
|
59
|
+
"set_license_key",
|
|
60
|
+
];
|
|
61
|
+
// ADVANCED TIER ($8/wk, $12/mo, $99/yr) - Pro tools, only for Advanced subscribers
|
|
62
|
+
export const ADVANCED_TOOLS = [
|
|
63
|
+
// Android streaming & monitoring
|
|
64
|
+
"stream_adb_realtime",
|
|
65
|
+
"stop_adb_streaming",
|
|
66
|
+
"screenshot_history",
|
|
67
|
+
"watch_for_errors",
|
|
68
|
+
"multi_device_logs",
|
|
69
|
+
// Android interaction tools
|
|
70
|
+
"tap_screen",
|
|
71
|
+
"input_text",
|
|
72
|
+
"press_button",
|
|
73
|
+
"swipe_screen",
|
|
74
|
+
"launch_app",
|
|
75
|
+
"install_apk",
|
|
76
|
+
// iOS Simulator advanced tools
|
|
77
|
+
"boot_ios_simulator",
|
|
78
|
+
"shutdown_ios_simulator",
|
|
79
|
+
"install_ios_app",
|
|
80
|
+
"launch_ios_app",
|
|
81
|
+
"terminate_ios_app",
|
|
82
|
+
"ios_open_url",
|
|
83
|
+
"ios_push_notification",
|
|
84
|
+
"ios_set_location",
|
|
85
|
+
// React DevTools integration
|
|
86
|
+
"setup_react_devtools",
|
|
87
|
+
"check_devtools_connection",
|
|
88
|
+
"get_react_component_tree",
|
|
89
|
+
"inspect_react_component",
|
|
90
|
+
"search_react_components",
|
|
91
|
+
];
|
|
92
|
+
// Limits for each tier
|
|
93
|
+
export const TIER_LIMITS = {
|
|
94
|
+
trial: {
|
|
95
|
+
maxLogLines: 50, // Same as Basic during trial
|
|
96
|
+
maxDevices: 1,
|
|
97
|
+
screenshotHistory: 0,
|
|
98
|
+
},
|
|
99
|
+
basic: {
|
|
100
|
+
maxLogLines: 50,
|
|
101
|
+
maxDevices: 1,
|
|
102
|
+
screenshotHistory: 0,
|
|
103
|
+
},
|
|
104
|
+
advanced: {
|
|
105
|
+
maxLogLines: Infinity,
|
|
106
|
+
maxDevices: 3,
|
|
107
|
+
screenshotHistory: 20,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// CONFIG MANAGEMENT
|
|
112
|
+
// ============================================================================
|
|
113
|
+
function ensureConfigDir() {
|
|
114
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
115
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function loadConfig() {
|
|
119
|
+
ensureConfigDir();
|
|
120
|
+
const defaultConfig = {
|
|
121
|
+
metroPort: 8081,
|
|
122
|
+
logBufferSize: 100,
|
|
123
|
+
apiEndpoint: DEFAULT_API_ENDPOINT,
|
|
124
|
+
};
|
|
125
|
+
if (!fs.existsSync(CONFIG_FILE)) {
|
|
126
|
+
saveConfig(defaultConfig);
|
|
127
|
+
return defaultConfig;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
|
|
131
|
+
const loaded = JSON.parse(raw);
|
|
132
|
+
return { ...defaultConfig, ...loaded };
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return defaultConfig;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function saveConfig(config) {
|
|
139
|
+
ensureConfigDir();
|
|
140
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
141
|
+
}
|
|
142
|
+
export function setLicenseKey(key) {
|
|
143
|
+
const config = loadConfig();
|
|
144
|
+
config.licenseKey = key;
|
|
145
|
+
saveConfig(config);
|
|
146
|
+
// Clear cached license to force revalidation
|
|
147
|
+
clearLicenseCache();
|
|
148
|
+
}
|
|
149
|
+
// ============================================================================
|
|
150
|
+
// MACHINE ID (for license binding)
|
|
151
|
+
// ============================================================================
|
|
152
|
+
function getMachineId() {
|
|
153
|
+
const info = [
|
|
154
|
+
os.hostname(),
|
|
155
|
+
os.platform(),
|
|
156
|
+
os.arch(),
|
|
157
|
+
os.cpus()[0]?.model || "unknown",
|
|
158
|
+
].join("|");
|
|
159
|
+
return crypto.createHash("sha256").update(info).digest("hex").substring(0, 32);
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// LICENSE CACHE
|
|
163
|
+
// ============================================================================
|
|
164
|
+
function loadLicenseCache() {
|
|
165
|
+
if (!fs.existsSync(LICENSE_CACHE_FILE)) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const raw = fs.readFileSync(LICENSE_CACHE_FILE, "utf-8");
|
|
170
|
+
return JSON.parse(raw);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function saveLicenseCache(license) {
|
|
177
|
+
ensureConfigDir();
|
|
178
|
+
fs.writeFileSync(LICENSE_CACHE_FILE, JSON.stringify(license, null, 2));
|
|
179
|
+
}
|
|
180
|
+
function clearLicenseCache() {
|
|
181
|
+
if (fs.existsSync(LICENSE_CACHE_FILE)) {
|
|
182
|
+
fs.unlinkSync(LICENSE_CACHE_FILE);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function isCacheFresh(license) {
|
|
186
|
+
const validatedAt = new Date(license.validatedAt).getTime();
|
|
187
|
+
const now = Date.now();
|
|
188
|
+
return now - validatedAt < CACHE_TTL_MS;
|
|
189
|
+
}
|
|
190
|
+
function isWithinGracePeriod(license) {
|
|
191
|
+
const validatedAt = new Date(license.validatedAt).getTime();
|
|
192
|
+
const now = Date.now();
|
|
193
|
+
return now - validatedAt < GRACE_PERIOD_MS;
|
|
194
|
+
}
|
|
195
|
+
// ============================================================================
|
|
196
|
+
// TRIAL TRACKING
|
|
197
|
+
// ============================================================================
|
|
198
|
+
function loadTrialInfo() {
|
|
199
|
+
if (!fs.existsSync(TRIAL_FILE)) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const raw = fs.readFileSync(TRIAL_FILE, "utf-8");
|
|
204
|
+
return JSON.parse(raw);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function saveTrialInfo(trial) {
|
|
211
|
+
ensureConfigDir();
|
|
212
|
+
fs.writeFileSync(TRIAL_FILE, JSON.stringify(trial, null, 2));
|
|
213
|
+
}
|
|
214
|
+
function getMachineIdForTrial() {
|
|
215
|
+
const info = [
|
|
216
|
+
os.hostname(),
|
|
217
|
+
os.platform(),
|
|
218
|
+
os.arch(),
|
|
219
|
+
os.cpus()[0]?.model || "unknown",
|
|
220
|
+
].join("|");
|
|
221
|
+
return crypto.createHash("sha256").update(info).digest("hex").substring(0, 32);
|
|
222
|
+
}
|
|
223
|
+
export function getTrialStatus() {
|
|
224
|
+
const trial = loadTrialInfo();
|
|
225
|
+
if (!trial) {
|
|
226
|
+
return { remaining: TRIAL_LIMIT, used: 0, expired: false };
|
|
227
|
+
}
|
|
228
|
+
// Verify machine ID matches (prevent copying trial.json to new machines)
|
|
229
|
+
const currentMachineId = getMachineIdForTrial();
|
|
230
|
+
if (trial.machineId !== currentMachineId) {
|
|
231
|
+
return { remaining: TRIAL_LIMIT, used: 0, expired: false };
|
|
232
|
+
}
|
|
233
|
+
const remaining = Math.max(0, TRIAL_LIMIT - trial.usageCount);
|
|
234
|
+
return {
|
|
235
|
+
remaining,
|
|
236
|
+
used: trial.usageCount,
|
|
237
|
+
expired: remaining === 0,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
export function incrementTrialUsage() {
|
|
241
|
+
const machineId = getMachineIdForTrial();
|
|
242
|
+
let trial = loadTrialInfo();
|
|
243
|
+
// Initialize trial if needed
|
|
244
|
+
if (!trial || trial.machineId !== machineId) {
|
|
245
|
+
trial = {
|
|
246
|
+
usageCount: 0,
|
|
247
|
+
firstUsedAt: new Date().toISOString(),
|
|
248
|
+
lastUsedAt: new Date().toISOString(),
|
|
249
|
+
machineId,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// Check if trial expired
|
|
253
|
+
if (trial.usageCount >= TRIAL_LIMIT) {
|
|
254
|
+
return {
|
|
255
|
+
allowed: false,
|
|
256
|
+
remaining: 0,
|
|
257
|
+
message: `🔒 Trial expired! You've used all ${TRIAL_LIMIT} trial requests.
|
|
258
|
+
|
|
259
|
+
To continue using Mobile Dev MCP, purchase a license:
|
|
260
|
+
|
|
261
|
+
┌─────────────────────────────────────────┐
|
|
262
|
+
│ Basic Solo $6/month │
|
|
263
|
+
│ → 13 core tools, 50 log lines │
|
|
264
|
+
├─────────────────────────────────────────┤
|
|
265
|
+
│ Advanced Solo $12/month (or $99/year) │
|
|
266
|
+
│ → All 18 tools, unlimited logs │
|
|
267
|
+
│ → Real-time streaming, multi-device │
|
|
268
|
+
└─────────────────────────────────────────┘
|
|
269
|
+
|
|
270
|
+
Purchase at: https://mobile-dev-mcp.com
|
|
271
|
+
Then use 'set_license_key' to activate.`,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
// Increment usage
|
|
275
|
+
trial.usageCount++;
|
|
276
|
+
trial.lastUsedAt = new Date().toISOString();
|
|
277
|
+
saveTrialInfo(trial);
|
|
278
|
+
const remaining = TRIAL_LIMIT - trial.usageCount;
|
|
279
|
+
return {
|
|
280
|
+
allowed: true,
|
|
281
|
+
remaining,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// ============================================================================
|
|
285
|
+
// API VALIDATION
|
|
286
|
+
// ============================================================================
|
|
287
|
+
async function validateWithApi(licenseKey, apiEndpoint) {
|
|
288
|
+
try {
|
|
289
|
+
const response = await fetch(`${apiEndpoint}/validate`, {
|
|
290
|
+
method: "POST",
|
|
291
|
+
headers: {
|
|
292
|
+
"Content-Type": "application/json",
|
|
293
|
+
},
|
|
294
|
+
body: JSON.stringify({
|
|
295
|
+
license_key: licenseKey,
|
|
296
|
+
instance_id: getMachineId(),
|
|
297
|
+
}),
|
|
298
|
+
});
|
|
299
|
+
if (!response.ok) {
|
|
300
|
+
console.error("License API returned status:", response.status);
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
const data = (await response.json());
|
|
304
|
+
if (data.valid) {
|
|
305
|
+
// Determine tier from product/variant name
|
|
306
|
+
let tier = data.tier || "basic";
|
|
307
|
+
// Check variant name for tier hints
|
|
308
|
+
const variantName = data.meta?.variant_name?.toLowerCase() || "";
|
|
309
|
+
const productName = data.meta?.product_name?.toLowerCase() || "";
|
|
310
|
+
if (variantName.includes("advanced") ||
|
|
311
|
+
productName.includes("advanced")) {
|
|
312
|
+
tier = "advanced";
|
|
313
|
+
}
|
|
314
|
+
else if (variantName.includes("basic") ||
|
|
315
|
+
productName.includes("basic")) {
|
|
316
|
+
tier = "basic";
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
key: licenseKey,
|
|
320
|
+
valid: true,
|
|
321
|
+
tier,
|
|
322
|
+
email: data.meta?.customer_email,
|
|
323
|
+
validatedAt: new Date().toISOString(),
|
|
324
|
+
expiresAt: data.license_key?.expires_at || undefined,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
key: licenseKey,
|
|
329
|
+
valid: false,
|
|
330
|
+
tier: "trial",
|
|
331
|
+
validatedAt: new Date().toISOString(),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
console.error("License validation API error:", error);
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// ============================================================================
|
|
340
|
+
// MAIN LICENSE CHECK
|
|
341
|
+
// ============================================================================
|
|
342
|
+
let cachedLicenseResult = null;
|
|
343
|
+
export async function checkLicense() {
|
|
344
|
+
// Return cached result if we've already checked this session
|
|
345
|
+
if (cachedLicenseResult) {
|
|
346
|
+
return cachedLicenseResult;
|
|
347
|
+
}
|
|
348
|
+
const config = loadConfig();
|
|
349
|
+
// No license key configured - trial mode
|
|
350
|
+
if (!config.licenseKey) {
|
|
351
|
+
cachedLicenseResult = {
|
|
352
|
+
key: "",
|
|
353
|
+
valid: false,
|
|
354
|
+
tier: "trial",
|
|
355
|
+
validatedAt: new Date().toISOString(),
|
|
356
|
+
};
|
|
357
|
+
return cachedLicenseResult;
|
|
358
|
+
}
|
|
359
|
+
// Check local cache first
|
|
360
|
+
const cached = loadLicenseCache();
|
|
361
|
+
if (cached && cached.key === config.licenseKey) {
|
|
362
|
+
if (cached.valid && isCacheFresh(cached)) {
|
|
363
|
+
cachedLicenseResult = cached;
|
|
364
|
+
return cached;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Try to validate with API
|
|
368
|
+
const apiResult = await validateWithApi(config.licenseKey, config.apiEndpoint);
|
|
369
|
+
if (apiResult) {
|
|
370
|
+
saveLicenseCache(apiResult);
|
|
371
|
+
cachedLicenseResult = apiResult;
|
|
372
|
+
return apiResult;
|
|
373
|
+
}
|
|
374
|
+
// API is down - check if we have a valid cached license within grace period
|
|
375
|
+
if (cached && cached.valid && isWithinGracePeriod(cached)) {
|
|
376
|
+
console.error("License API unreachable, using cached license (grace period)");
|
|
377
|
+
cachedLicenseResult = cached;
|
|
378
|
+
return cached;
|
|
379
|
+
}
|
|
380
|
+
// No valid cache, API down - fall back to trial
|
|
381
|
+
cachedLicenseResult = {
|
|
382
|
+
key: config.licenseKey,
|
|
383
|
+
valid: false,
|
|
384
|
+
tier: "trial",
|
|
385
|
+
validatedAt: new Date().toISOString(),
|
|
386
|
+
};
|
|
387
|
+
return cachedLicenseResult;
|
|
388
|
+
}
|
|
389
|
+
// ============================================================================
|
|
390
|
+
// FEATURE GATING
|
|
391
|
+
// ============================================================================
|
|
392
|
+
export function isAdvancedTool(toolName) {
|
|
393
|
+
return ADVANCED_TOOLS.includes(toolName);
|
|
394
|
+
}
|
|
395
|
+
export function isBasicTool(toolName) {
|
|
396
|
+
return BASIC_TOOLS.includes(toolName);
|
|
397
|
+
}
|
|
398
|
+
export async function canUseTool(toolName) {
|
|
399
|
+
const license = await checkLicense();
|
|
400
|
+
// Advanced tools require Advanced tier
|
|
401
|
+
if (isAdvancedTool(toolName)) {
|
|
402
|
+
return license.valid && license.tier === "advanced";
|
|
403
|
+
}
|
|
404
|
+
// Basic tools require Basic or Advanced tier
|
|
405
|
+
if (isBasicTool(toolName)) {
|
|
406
|
+
return license.valid && (license.tier === "basic" || license.tier === "advanced");
|
|
407
|
+
}
|
|
408
|
+
// Unknown tool - allow (might be a new tool)
|
|
409
|
+
return true;
|
|
410
|
+
}
|
|
411
|
+
export async function requireAdvanced(toolName) {
|
|
412
|
+
const license = await checkLicense();
|
|
413
|
+
// Advanced license holders always allowed
|
|
414
|
+
if (license.valid && license.tier === "advanced") {
|
|
415
|
+
return { allowed: true };
|
|
416
|
+
}
|
|
417
|
+
// Trial users can try Advanced tools (uses trial quota)
|
|
418
|
+
if (!license.valid || license.tier === "trial") {
|
|
419
|
+
const trialResult = incrementTrialUsage();
|
|
420
|
+
if (!trialResult.allowed) {
|
|
421
|
+
return {
|
|
422
|
+
allowed: false,
|
|
423
|
+
message: trialResult.message,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
// Trial still has requests - allow with reminder
|
|
427
|
+
if (trialResult.remaining <= 10) {
|
|
428
|
+
return {
|
|
429
|
+
allowed: true,
|
|
430
|
+
message: `⚠️ Trial: ${trialResult.remaining} requests remaining. This is an Advanced feature - upgrade to keep using it!`,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
return { allowed: true };
|
|
434
|
+
}
|
|
435
|
+
// Basic tier users cannot use Advanced tools
|
|
436
|
+
return {
|
|
437
|
+
allowed: false,
|
|
438
|
+
message: `🔒 "${toolName}" requires Advanced tier.
|
|
439
|
+
|
|
440
|
+
Your current tier: BASIC
|
|
441
|
+
|
|
442
|
+
Upgrade to Advanced for:
|
|
443
|
+
- Real-time log streaming
|
|
444
|
+
- Screenshot history
|
|
445
|
+
- Multi-device support (3 devices)
|
|
446
|
+
- Error watching
|
|
447
|
+
- Unlimited log lines
|
|
448
|
+
- Device interaction (tap, type, swipe)
|
|
449
|
+
|
|
450
|
+
Pricing: $8/week, $12/month, or $99/year
|
|
451
|
+
|
|
452
|
+
Upgrade at: https://mobile-dev-mcp.com`,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
export async function requireBasic(toolName) {
|
|
456
|
+
const license = await checkLicense();
|
|
457
|
+
// Licensed users can always use basic tools
|
|
458
|
+
if (license.valid) {
|
|
459
|
+
return { allowed: true };
|
|
460
|
+
}
|
|
461
|
+
// Trial users - check trial status
|
|
462
|
+
const trialResult = incrementTrialUsage();
|
|
463
|
+
if (!trialResult.allowed) {
|
|
464
|
+
return {
|
|
465
|
+
allowed: false,
|
|
466
|
+
message: trialResult.message,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
// Trial still has requests - allow with reminder
|
|
470
|
+
if (trialResult.remaining <= 10) {
|
|
471
|
+
return {
|
|
472
|
+
allowed: true,
|
|
473
|
+
message: `⚠️ Trial: ${trialResult.remaining} requests remaining. Purchase a license to continue uninterrupted.`,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
return { allowed: true };
|
|
477
|
+
}
|
|
478
|
+
export function getTierLimits(tier) {
|
|
479
|
+
return TIER_LIMITS[tier];
|
|
480
|
+
}
|
|
481
|
+
export async function getMaxLogLines() {
|
|
482
|
+
const license = await checkLicense();
|
|
483
|
+
return TIER_LIMITS[license.tier].maxLogLines;
|
|
484
|
+
}
|
|
485
|
+
// ============================================================================
|
|
486
|
+
// LICENSE INFO TOOL
|
|
487
|
+
// ============================================================================
|
|
488
|
+
export async function getLicenseStatus() {
|
|
489
|
+
const license = await checkLicense();
|
|
490
|
+
const config = loadConfig();
|
|
491
|
+
if (!config.licenseKey) {
|
|
492
|
+
const trialStatus = getTrialStatus();
|
|
493
|
+
if (trialStatus.expired) {
|
|
494
|
+
return `📋 License Status: TRIAL EXPIRED
|
|
495
|
+
|
|
496
|
+
You've used all ${TRIAL_LIMIT} trial requests.
|
|
497
|
+
|
|
498
|
+
┌─────────────────────────────────────────┐
|
|
499
|
+
│ Basic Solo $6/mo → Core tools │
|
|
500
|
+
│ Advanced Solo $12/mo → All features│
|
|
501
|
+
│ $8/wk or $99/yr │
|
|
502
|
+
└─────────────────────────────────────────┘
|
|
503
|
+
|
|
504
|
+
Purchase at: https://mobile-dev-mcp.com
|
|
505
|
+
Then use 'set_license_key' to activate.`;
|
|
506
|
+
}
|
|
507
|
+
return `📋 License Status: TRIAL
|
|
508
|
+
|
|
509
|
+
Trial requests remaining: ${trialStatus.remaining}/${TRIAL_LIMIT}
|
|
510
|
+
Trial requests used: ${trialStatus.used}
|
|
511
|
+
|
|
512
|
+
┌─────────────────────────────────────────┐
|
|
513
|
+
│ Basic Solo $6/mo → Core tools │
|
|
514
|
+
│ Advanced Solo $12/mo → All features│
|
|
515
|
+
│ $8/wk or $99/yr │
|
|
516
|
+
└─────────────────────────────────────────┘
|
|
517
|
+
|
|
518
|
+
Purchase at: https://mobile-dev-mcp.com
|
|
519
|
+
Then use 'set_license_key' to activate.`;
|
|
520
|
+
}
|
|
521
|
+
if (!license.valid) {
|
|
522
|
+
return `📋 License Status: INVALID
|
|
523
|
+
|
|
524
|
+
License key: ${maskLicenseKey(config.licenseKey)}
|
|
525
|
+
Status: Invalid or expired
|
|
526
|
+
|
|
527
|
+
Please check your license key or purchase a new one.
|
|
528
|
+
https://mobile-dev-mcp.com`;
|
|
529
|
+
}
|
|
530
|
+
const tierEmoji = license.tier === "advanced" ? "⭐" : "✓";
|
|
531
|
+
const limits = TIER_LIMITS[license.tier];
|
|
532
|
+
return `📋 License Status: ${license.tier.toUpperCase()} ${tierEmoji}
|
|
533
|
+
|
|
534
|
+
License key: ${maskLicenseKey(license.key)}
|
|
535
|
+
Email: ${license.email || "N/A"}
|
|
536
|
+
Valid until: ${license.expiresAt || "Active subscription"}
|
|
537
|
+
Last validated: ${license.validatedAt}
|
|
538
|
+
|
|
539
|
+
Your limits:
|
|
540
|
+
- Max log lines: ${limits.maxLogLines === Infinity ? "Unlimited" : limits.maxLogLines}
|
|
541
|
+
- Max devices: ${limits.maxDevices}
|
|
542
|
+
- Screenshot history: ${limits.screenshotHistory || "Not available"}
|
|
543
|
+
|
|
544
|
+
${license.tier === "basic" ? "\n💡 Upgrade to Advanced for real-time streaming & multi-device support!" : "All features unlocked! 🎉"}`;
|
|
545
|
+
}
|
|
546
|
+
function maskLicenseKey(key) {
|
|
547
|
+
if (key.length < 8)
|
|
548
|
+
return "****";
|
|
549
|
+
return key.substring(0, 4) + "****" + key.substring(key.length - 4);
|
|
550
|
+
}
|
|
551
|
+
export const licenseTools = [
|
|
552
|
+
{
|
|
553
|
+
name: "get_license_status",
|
|
554
|
+
description: "Check your current license status and tier (free/basic/advanced)",
|
|
555
|
+
inputSchema: {
|
|
556
|
+
type: "object",
|
|
557
|
+
properties: {},
|
|
558
|
+
},
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
name: "set_license_key",
|
|
562
|
+
description: "Set or update your license key to unlock paid features",
|
|
563
|
+
inputSchema: {
|
|
564
|
+
type: "object",
|
|
565
|
+
properties: {
|
|
566
|
+
licenseKey: {
|
|
567
|
+
type: "string",
|
|
568
|
+
description: "Your license key from mobile-dev-mcp.com",
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
required: ["licenseKey"],
|
|
572
|
+
},
|
|
573
|
+
},
|
|
574
|
+
];
|
|
575
|
+
export async function handleLicenseTool(name, args) {
|
|
576
|
+
switch (name) {
|
|
577
|
+
case "get_license_status":
|
|
578
|
+
return getLicenseStatus();
|
|
579
|
+
case "set_license_key":
|
|
580
|
+
const key = args.licenseKey;
|
|
581
|
+
if (!key || key.length < 10) {
|
|
582
|
+
return "Invalid license key format. Keys should look like: lk_XXXXX...";
|
|
583
|
+
}
|
|
584
|
+
setLicenseKey(key);
|
|
585
|
+
// Force revalidation
|
|
586
|
+
cachedLicenseResult = null;
|
|
587
|
+
const status = await checkLicense();
|
|
588
|
+
if (status.valid) {
|
|
589
|
+
return `✅ License activated successfully!
|
|
590
|
+
|
|
591
|
+
Tier: ${status.tier.toUpperCase()}
|
|
592
|
+
${status.tier === "advanced" ? "All features unlocked!" : "Basic features unlocked!"}
|
|
593
|
+
|
|
594
|
+
Use 'get_license_status' to see your limits.`;
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
return `❌ License key is invalid or expired.
|
|
598
|
+
|
|
599
|
+
Please check your key or contact support.
|
|
600
|
+
https://mobile-dev-mcp.com`;
|
|
601
|
+
}
|
|
602
|
+
default:
|
|
603
|
+
return `Unknown license tool: ${name}`;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.test.d.ts","sourceRoot":"","sources":["../src/license.test.ts"],"names":[],"mappings":""}
|