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 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 tier + Pro | Free | 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) -- [$6/mo](https://rzp.io/rzp/r4ijQsJY)
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 a license key. Add it to your `.mcp.json`:
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 the license key.
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
@@ -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;;;;;;CAiB/B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAU7C;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAMxD"}
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 a license key. Add it to your .mcp.json:",
40
- ' "MOBILE_MCP_LICENSE_KEY": "your-key-here"',
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
- * Validate the license key.
48
+ * License key format: MDMCP-XXXXX-XXXXX-XXXXX-CHECK
48
49
  *
49
- * Current implementation: presence check.
50
- * Future: integrate with Keygen.sh or xPay for real validation.
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
- // TODO: Replace with Keygen.sh API validation when payment is set up
58
- // For now, any non-empty key is treated as valid pro license
59
- return { tier: "pro", valid: true };
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
  }
@@ -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,+DAA+D;gBAC/D,EAAE;gBACF,yGAAyG;gBACzG,EAAE;gBACF,sCAAsC;gBACtC,EAAE;gBACF,wEAAwE;gBACxE,6CAA6C;aAC9C,CAAC,IAAI,CAAC,IAAI,CAAC;SACb;KACF;IACD,OAAO,EAAE,IAAI;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAE/C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,qEAAqE;IACrE,6DAA6D;IAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,wCAAwC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
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.5",
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",