mobile-device-mcp 0.2.5 → 0.2.7
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 +3 -3
- package/dist/license.d.ts +6 -4
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +46 -9
- package/dist/license.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ MCP server that gives AI coding assistants (Claude Code, Cursor, Windsurf) the a
|
|
|
31
31
|
| iOS real device | Planned | Yes | Yes |
|
|
32
32
|
| Screenshot compression | **89%** (251KB->28KB) | None | 50-80% |
|
|
33
33
|
| Multi-provider AI | Claude + Gemini | N/A | Single provider |
|
|
34
|
-
| Price | Free
|
|
34
|
+
| Price | Free + Pro (₹499/mo) | Free | Free |
|
|
35
35
|
|
|
36
36
|
## The Problem
|
|
37
37
|
|
|
@@ -141,9 +141,9 @@ Copy `.mcp.json` into any mobile project -- Flutter, React Native, Kotlin, Swift
|
|
|
141
141
|
| `get_current_app` | Get the foreground app |
|
|
142
142
|
| `get_logs` | Get logcat entries with filtering |
|
|
143
143
|
|
|
144
|
-
### Pro (35 additional tools) -- [
|
|
144
|
+
### Pro (35 additional tools) -- [₹499/mo](https://rzp.io/rzp/r4ijQsJY)
|
|
145
145
|
|
|
146
|
-
**[Get Pro License](https://rzp.io/rzp/r4ijQsJY)** -- unlock all 49 tools. After payment, you'll receive
|
|
146
|
+
**[Get Pro License](https://rzp.io/rzp/r4ijQsJY)** -- unlock all 49 tools. After payment, you'll receive your license key via email within 1 hour. Add it to your `.mcp.json`:
|
|
147
147
|
|
|
148
148
|
```json
|
|
149
149
|
{
|
package/dist/license.d.ts
CHANGED
|
@@ -14,12 +14,14 @@ export declare const PRO_UPGRADE_MESSAGE: {
|
|
|
14
14
|
isError: boolean;
|
|
15
15
|
};
|
|
16
16
|
/**
|
|
17
|
-
* Validate
|
|
18
|
-
*
|
|
19
|
-
* Current implementation: presence check.
|
|
20
|
-
* Future: integrate with Keygen.sh or xPay for real validation.
|
|
17
|
+
* Validate a license key offline.
|
|
21
18
|
*/
|
|
22
19
|
export declare function validateLicense(): LicenseInfo;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a license key (for internal use — run via: node -e "...")
|
|
22
|
+
* Usage: SALT must match the one compiled in the server.
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateLicenseKey(): string;
|
|
23
25
|
/** Log the license tier on startup */
|
|
24
26
|
export declare function logLicenseStatus(info: LicenseInfo): void;
|
|
25
27
|
//# sourceMappingURL=license.d.ts.map
|
package/dist/license.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,sCAAsC;AACtC,eAAO,MAAM,UAAU,aAoBrB,CAAC;AAEH,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB;;;;;;
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,sCAAsC;AACtC,eAAO,MAAM,UAAU,aAoBrB,CAAC;AAEH,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB;;;;;;CAkB/B,CAAC;AAsBF;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAqB7C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAQxD"}
|
package/dist/license.js
CHANGED
|
@@ -30,39 +30,76 @@ export const PRO_UPGRADE_MESSAGE = {
|
|
|
30
30
|
{
|
|
31
31
|
type: "text",
|
|
32
32
|
text: [
|
|
33
|
-
"This is a Pro feature. Upgrade to Pro to unlock all 49 tools.",
|
|
33
|
+
"This is a Pro feature. Upgrade to Pro (₹499/mo) to unlock all 49 tools.",
|
|
34
34
|
"",
|
|
35
35
|
"Pro includes: AI vision, Flutter inspection, iOS simulator, video recording, test generation, and more.",
|
|
36
36
|
"",
|
|
37
37
|
"Get Pro: https://rzp.io/rzp/r4ijQsJY",
|
|
38
38
|
"",
|
|
39
|
-
"After payment, you'll receive
|
|
40
|
-
|
|
39
|
+
"After payment, you'll receive your license key via email within 1 hour.",
|
|
40
|
+
"Add it to your .mcp.json:",
|
|
41
|
+
' "MOBILE_MCP_LICENSE_KEY": "MDMCP-XXXXX-XXXXX-XXXXX-XXXXX"',
|
|
41
42
|
].join("\n"),
|
|
42
43
|
},
|
|
43
44
|
],
|
|
44
45
|
isError: true,
|
|
45
46
|
};
|
|
46
47
|
/**
|
|
47
|
-
*
|
|
48
|
+
* License key format: MDMCP-XXXXX-XXXXX-XXXXX-CHECK
|
|
48
49
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
50
|
+
* The last segment (CHECK) is a hash of the first 3 segments + a secret salt.
|
|
51
|
+
* This runs offline — no network call needed. Keys are generated by the developer
|
|
52
|
+
* and can't be guessed because the salt is compiled into the binary.
|
|
53
|
+
*/
|
|
54
|
+
const SALT = "m0b1l3-d3v1c3-mcp-2026-s4r4nsh";
|
|
55
|
+
function simpleHash(input) {
|
|
56
|
+
let hash = 0;
|
|
57
|
+
for (let i = 0; i < input.length; i++) {
|
|
58
|
+
const char = input.charCodeAt(i);
|
|
59
|
+
hash = ((hash << 5) - hash + char) | 0;
|
|
60
|
+
}
|
|
61
|
+
// Convert to positive 5-char alphanumeric
|
|
62
|
+
const positive = Math.abs(hash);
|
|
63
|
+
return positive.toString(36).toUpperCase().padStart(5, "0").slice(0, 5);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate a license key offline.
|
|
51
67
|
*/
|
|
52
68
|
export function validateLicense() {
|
|
53
69
|
const key = process.env.MOBILE_MCP_LICENSE_KEY;
|
|
54
70
|
if (!key || key.trim() === "") {
|
|
55
71
|
return { tier: "free", valid: true };
|
|
56
72
|
}
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
73
|
+
// Check format: MDMCP-XXXXX-XXXXX-XXXXX-CHECK
|
|
74
|
+
const parts = key.trim().split("-");
|
|
75
|
+
if (parts.length !== 5 || parts[0] !== "MDMCP") {
|
|
76
|
+
return { tier: "free", valid: false };
|
|
77
|
+
}
|
|
78
|
+
const body = parts.slice(0, 4).join("-");
|
|
79
|
+
const expectedCheck = simpleHash(body + SALT);
|
|
80
|
+
if (parts[4] === expectedCheck) {
|
|
81
|
+
return { tier: "pro", valid: true };
|
|
82
|
+
}
|
|
83
|
+
return { tier: "free", valid: false };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generate a license key (for internal use — run via: node -e "...")
|
|
87
|
+
* Usage: SALT must match the one compiled in the server.
|
|
88
|
+
*/
|
|
89
|
+
export function generateLicenseKey() {
|
|
90
|
+
const seg = () => Math.random().toString(36).substring(2, 7).toUpperCase();
|
|
91
|
+
const body = `MDMCP-${seg()}-${seg()}-${seg()}`;
|
|
92
|
+
const check = simpleHash(body + SALT);
|
|
93
|
+
return `${body}-${check}`;
|
|
60
94
|
}
|
|
61
95
|
/** Log the license tier on startup */
|
|
62
96
|
export function logLicenseStatus(info) {
|
|
63
97
|
if (info.tier === "pro") {
|
|
64
98
|
process.stderr.write(`${PREFIX} License: Pro (all 49 tools enabled)\n`);
|
|
65
99
|
}
|
|
100
|
+
else if (!info.valid) {
|
|
101
|
+
process.stderr.write(`${PREFIX} License: Invalid key. Get a valid Pro key at https://rzp.io/rzp/r4ijQsJY\n`);
|
|
102
|
+
}
|
|
66
103
|
else {
|
|
67
104
|
process.stderr.write(`${PREFIX} License: Free (14 tools — upgrade to Pro for all 49)\n`);
|
|
68
105
|
}
|
package/dist/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,6CAA6C;AAC7C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,qBAAqB,CAAC;AASrC,sCAAsC;AACtC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IAChC,kBAAkB;IAClB,cAAc;IACd,iBAAiB;IACjB,iBAAiB;IACjB,4BAA4B;IAC5B,iBAAiB;IACjB,iBAAiB;IACjB,wBAAwB;IACxB,KAAK;IACL,YAAY;IACZ,YAAY;IACZ,OAAO;IACP,WAAW;IACX,WAAW;IACX,2BAA2B;IAC3B,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE;QACP;YACE,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE;gBACJ
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mobile-device-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "MCP server that gives AI coding assistants (Claude, Cursor, Windsurf) the ability to see and interact with Android mobile devices via ADB — AI-powered visual inspection, element finding, and device automation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|