roblox-mcp-pro 0.2.0 → 0.2.2

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
@@ -44,9 +44,9 @@ Two commands get you running:
44
44
 
45
45
  ```bash
46
46
  # 1) Register the server with your AI agent (Claude Code shown; see below for others)
47
- claude mcp add roblox-mcp-pro -- npx -y roblox-mcp-pro
47
+ claude mcp add roblox-mcp-pro -- npx -y roblox-mcp-pro@latest
48
48
  # 2) Install the Studio plugin
49
- npx roblox-mcp-pro install-plugin
49
+ npx roblox-mcp-pro@latest install-plugin
50
50
  ```
51
51
 
52
52
  Then open Roblox Studio, click the **MCP** button, and ask your agent to run `system_info`.
@@ -64,12 +64,16 @@ only *where* you write it down changes. The command is always:
64
64
 
65
65
  ```
66
66
  command: npx
67
- args: -y roblox-mcp-pro
67
+ args: -y roblox-mcp-pro@latest
68
68
  ```
69
69
 
70
- `npx` downloads and runs the published package on demand — no clone, no build. (Prefer a pinned
71
- copy? Run `npm i -g roblox-mcp-pro` once, then use `roblox-mcp-pro` as the command instead of
72
- `npx`.)
70
+ `npx` downloads and runs the published package on demand — no clone, no build. The `@latest` tag
71
+ means you **always get the newest version automatically** updates need zero effort on your part.
72
+
73
+ > **Updates are automatic.** Because the command uses `@latest`, each time your AI client starts
74
+ > the server it fetches the newest release. The Studio plugin also self-updates: the server copies
75
+ > the latest bundled plugin into your Plugins folder on startup (just restart Studio when it tells
76
+ > you a new plugin was installed). You never have to reinstall anything by hand.
73
77
 
74
78
  ### Part 1 — Install the MCP server
75
79
 
@@ -78,26 +82,26 @@ copy? Run `npm i -g roblox-mcp-pro` once, then use `roblox-mcp-pro` as the comma
78
82
  **Claude Code**
79
83
 
80
84
  ```bash
81
- claude mcp add roblox-mcp-pro -- npx -y roblox-mcp-pro
85
+ claude mcp add roblox-mcp-pro -- npx -y roblox-mcp-pro@latest
82
86
  ```
83
87
 
84
88
  **Codex**
85
89
 
86
90
  ```bash
87
- codex mcp add roblox-mcp-pro -- npx -y roblox-mcp-pro
91
+ codex mcp add roblox-mcp-pro -- npx -y roblox-mcp-pro@latest
88
92
  ```
89
93
 
90
94
  > If `codex mcp add` isn't available in your version, add this to `~/.codex/config.toml` instead:
91
95
  > ```toml
92
96
  > [mcp_servers.roblox-mcp-pro]
93
97
  > command = "npx"
94
- > args = ["-y", "roblox-mcp-pro"]
98
+ > args = ["-y", "roblox-mcp-pro@latest"]
95
99
  > ```
96
100
 
97
101
  **Antigravity / Gemini CLI**
98
102
 
99
103
  ```bash
100
- gemini mcp add roblox-mcp-pro npx -y roblox-mcp-pro
104
+ gemini mcp add roblox-mcp-pro npx -y roblox-mcp-pro@latest
101
105
  ```
102
106
 
103
107
  > If that doesn't work, add the JSON block below to `~/.gemini/config/mcp_config.json`.
@@ -111,7 +115,7 @@ These don't have a CLI command, so you paste the **same JSON** into the client's
111
115
  "mcpServers": {
112
116
  "roblox-mcp-pro": {
113
117
  "command": "npx",
114
- "args": ["-y", "roblox-mcp-pro"]
118
+ "args": ["-y", "roblox-mcp-pro@latest"]
115
119
  }
116
120
  }
117
121
  }
@@ -143,7 +147,7 @@ in that client's config file):
143
147
  "mcpServers": {
144
148
  "roblox-mcp-pro": {
145
149
  "command": "npx",
146
- "args": ["-y", "roblox-mcp-pro"],
150
+ "args": ["-y", "roblox-mcp-pro@latest"],
147
151
  "env": { "ROBLOX_MCP_LICENSE": "YOUR-LICENSE-KEY" }
148
152
  }
149
153
  }
@@ -155,7 +159,7 @@ For **Codex** (TOML), add the env under the server block:
155
159
  ```toml
156
160
  [mcp_servers.roblox-mcp-pro]
157
161
  command = "npx"
158
- args = ["-y", "roblox-mcp-pro"]
162
+ args = ["-y", "roblox-mcp-pro@latest"]
159
163
  env = { ROBLOX_MCP_LICENSE = "YOUR-LICENSE-KEY" }
160
164
  ```
161
165
 
@@ -173,13 +177,18 @@ Don't want it in a config file? Save the key to **`%USERPROFILE%\.roblox-mcp-pro
173
177
 
174
178
  ### Part 2 — Install the Studio plugin
175
179
 
176
- The plugin ships **inside the npm package**. One command copies it into your Roblox Plugins folder:
180
+ **Usually automatic** the first time your AI client starts the server, it copies the plugin into
181
+ your Roblox Plugins folder for you (and keeps it updated on every launch). In most cases you can
182
+ skip straight to Part 3.
183
+
184
+ Want to install it right now without starting a client? Run:
177
185
 
178
186
  ```bash
179
- npx roblox-mcp-pro install-plugin
187
+ npx roblox-mcp-pro@latest install-plugin
180
188
  ```
181
189
 
182
- That's it — it works on Windows and macOS and tells you where it put the file.
190
+ It works on Windows and macOS and tells you where it put the file. (To disable the automatic
191
+ behavior, set the env var `ROBLOX_MCP_NO_PLUGIN_AUTOINSTALL=1`.)
183
192
 
184
193
  **Prefer to do it by hand?** The file lives in the installed package at
185
194
  `node_modules/roblox-mcp-pro/plugin/RobloxMcpPro.rbxmx` — copy it into:
package/dist/index.js CHANGED
@@ -15,7 +15,8 @@ import { ensureBroker, register, identify, deregister } from "./client/transport
15
15
  import { BRIDGE_HOST, BRIDGE_PORT } from "./constants.js";
16
16
  import { resolveLicense } from "./licensing/license.js";
17
17
  import { installLicenseGate } from "./licensing/gate.js";
18
- import { installPlugin } from "./install-plugin.js";
18
+ import { installPlugin, ensurePluginInstalled } from "./install-plugin.js";
19
+ import { VERSION } from "./version.js";
19
20
  function log(message) {
20
21
  process.stderr.write(`[roblox-mcp-pro] ${message}\n`);
21
22
  }
@@ -25,6 +26,23 @@ async function main() {
25
26
  await installPlugin();
26
27
  return;
27
28
  }
29
+ if (process.argv[2] === "--version" || process.argv[2] === "-v") {
30
+ process.stdout.write(`${VERSION}\n`);
31
+ return;
32
+ }
33
+ log(`roblox-mcp-pro v${VERSION}`);
34
+ // Keep the Studio plugin up to date automatically — copy the bundled plugin
35
+ // into the Roblox Plugins folder when it's missing or out of date, so a server
36
+ // update also updates the plugin with no action from the user.
37
+ if (process.env.ROBLOX_MCP_NO_PLUGIN_AUTOINSTALL !== "1") {
38
+ const sync = await ensurePluginInstalled();
39
+ if (sync.status === "installed") {
40
+ log(`installed Studio plugin → ${sync.dest} (open Studio and click MCP)`);
41
+ }
42
+ else if (sync.status === "updated") {
43
+ log(`updated Studio plugin → restart Roblox Studio to load the new version`);
44
+ }
45
+ }
28
46
  const server = new McpServer({
29
47
  name: "roblox-studio-mcp-server",
30
48
  version: "0.1.0",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,23 @@
1
1
  /**
2
- * `roblox-mcp-pro install-plugin` copies the bundled Studio plugin
3
- * (RobloxMcpPro.rbxmx, shipped inside this npm package) into the local Roblox
4
- * Plugins folder. This is how customers get the plugin without needing access to
5
- * the (private) source repo or a GitHub Release.
2
+ * Studio plugin distribution. The plugin (RobloxMcpPro.rbxmx) ships inside this
3
+ * npm package, so customers never touch a GitHub release.
6
4
  *
7
- * Runs as a one-shot CLI command, so it logs to stdout/stderr normally (it is
8
- * NOT the MCP stdio server see index.ts for the argv dispatch).
5
+ * - `ensurePluginInstalled()` runs automatically on server startup and copies the
6
+ * bundled plugin into the Roblox Plugins folder *only when it's missing or
7
+ * different* — so plugin updates happen with zero customer effort.
8
+ * - `installPlugin()` is the explicit `roblox-mcp-pro install-plugin` CLI command
9
+ * (manual install / repair), logging to stdout/stderr.
9
10
  */
11
+ export type PluginSyncStatus = "installed" | "updated" | "current" | "unsupported" | "error";
12
+ export interface PluginSyncResult {
13
+ status: PluginSyncStatus;
14
+ dest?: string;
15
+ }
16
+ /**
17
+ * Copy the bundled plugin into the Roblox Plugins folder if it's missing or
18
+ * differs from what's installed. Best-effort: never throws.
19
+ */
20
+ export declare function ensurePluginInstalled(): Promise<PluginSyncResult>;
21
+ /** Explicit CLI command: install/repair the plugin with human-readable output. */
10
22
  export declare function installPlugin(): Promise<void>;
11
23
  //# sourceMappingURL=install-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-plugin.d.ts","sourceRoot":"","sources":["../src/install-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCnD"}
1
+ {"version":3,"file":"install-plugin.d.ts","sourceRoot":"","sources":["../src/install-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,SAAS,GACT,SAAS,GACT,aAAa,GACb,OAAO,CAAC;AAEZ,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAqBvE;AAED,kFAAkF;AAClF,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBnD"}
@@ -1,16 +1,22 @@
1
1
  /**
2
- * `roblox-mcp-pro install-plugin` copies the bundled Studio plugin
3
- * (RobloxMcpPro.rbxmx, shipped inside this npm package) into the local Roblox
4
- * Plugins folder. This is how customers get the plugin without needing access to
5
- * the (private) source repo or a GitHub Release.
2
+ * Studio plugin distribution. The plugin (RobloxMcpPro.rbxmx) ships inside this
3
+ * npm package, so customers never touch a GitHub release.
6
4
  *
7
- * Runs as a one-shot CLI command, so it logs to stdout/stderr normally (it is
8
- * NOT the MCP stdio server see index.ts for the argv dispatch).
5
+ * - `ensurePluginInstalled()` runs automatically on server startup and copies the
6
+ * bundled plugin into the Roblox Plugins folder *only when it's missing or
7
+ * different* — so plugin updates happen with zero customer effort.
8
+ * - `installPlugin()` is the explicit `roblox-mcp-pro install-plugin` CLI command
9
+ * (manual install / repair), logging to stdout/stderr.
9
10
  */
10
11
  import os from "node:os";
11
12
  import path from "node:path";
12
13
  import { fileURLToPath } from "node:url";
13
14
  import { promises as fs } from "node:fs";
15
+ /** Absolute path to the plugin file bundled in this package. */
16
+ function bundledPluginPath() {
17
+ const here = path.dirname(fileURLToPath(import.meta.url));
18
+ return path.join(here, "..", "plugin", "RobloxMcpPro.rbxmx");
19
+ }
14
20
  /** The local Roblox Studio plugins folder for this OS, or null if unsupported. */
15
21
  function pluginsDir() {
16
22
  const platform = os.platform();
@@ -23,30 +29,52 @@ function pluginsDir() {
23
29
  }
24
30
  return null;
25
31
  }
32
+ /**
33
+ * Copy the bundled plugin into the Roblox Plugins folder if it's missing or
34
+ * differs from what's installed. Best-effort: never throws.
35
+ */
36
+ export async function ensurePluginInstalled() {
37
+ try {
38
+ const dir = pluginsDir();
39
+ if (!dir)
40
+ return { status: "unsupported" };
41
+ const dest = path.join(dir, "RobloxMcpPro.rbxmx");
42
+ const source = await fs.readFile(bundledPluginPath());
43
+ let existing = null;
44
+ try {
45
+ existing = await fs.readFile(dest);
46
+ }
47
+ catch {
48
+ existing = null;
49
+ }
50
+ if (existing && existing.equals(source))
51
+ return { status: "current", dest };
52
+ await fs.mkdir(dir, { recursive: true });
53
+ await fs.writeFile(dest, source);
54
+ return { status: existing ? "updated" : "installed", dest };
55
+ }
56
+ catch {
57
+ return { status: "error" };
58
+ }
59
+ }
60
+ /** Explicit CLI command: install/repair the plugin with human-readable output. */
26
61
  export async function installPlugin() {
27
- const here = path.dirname(fileURLToPath(import.meta.url));
28
- const source = path.join(here, "..", "plugin", "RobloxMcpPro.rbxmx");
29
62
  const dir = pluginsDir();
30
63
  if (!dir) {
31
64
  console.error("Auto-install isn't supported on this OS. Copy the plugin file into your\n" +
32
65
  "Roblox Studio plugins folder manually. File location:\n " +
33
- source);
66
+ bundledPluginPath());
34
67
  process.exitCode = 1;
35
68
  return;
36
69
  }
37
- try {
38
- await fs.access(source);
39
- }
40
- catch {
41
- console.error(`Bundled plugin not found at:\n ${source}\n` +
42
- "Reinstall the package (npm i -g roblox-mcp-pro) and try again.");
70
+ const result = await ensurePluginInstalled();
71
+ if (result.status === "error") {
72
+ console.error("Failed to install the plugin. Try again or copy it manually from:\n " + bundledPluginPath());
43
73
  process.exitCode = 1;
44
74
  return;
45
75
  }
46
- const dest = path.join(dir, "RobloxMcpPro.rbxmx");
47
- await fs.mkdir(dir, { recursive: true });
48
- await fs.copyFile(source, dest);
49
- console.log(`✅ Installed the Roblox MCP Pro plugin to:\n ${dest}\n`);
76
+ const dest = result.dest ?? path.join(dir, "RobloxMcpPro.rbxmx");
77
+ console.log(`✅ Roblox MCP Pro plugin is installed at:\n ${dest}\n`);
50
78
  console.log("Next: open Roblox Studio and click the MCP toolbar button to connect.\n" +
51
79
  "(If Studio was already open, restart it so the plugin loads.)");
52
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../src/install-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,kFAAkF;AAClF,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAErE,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CACX,2EAA2E;YACzE,2DAA2D;YAC3D,MAAM,CACT,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,mCAAmC,MAAM,IAAI;YAC3C,gEAAgE,CACnE,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,IAAI,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CACT,yEAAyE;QACvE,+DAA+D,CAClE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"install-plugin.js","sourceRoot":"","sources":["../src/install-plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiBH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AASD,+EAA+E;AAC/E,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAgHD,iEAAiE;AACjE,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC,CAW5D"}
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiBH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AASD,+EAA+E;AAC/E,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAiJD,iEAAiE;AACjE,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC,CAW5D"}
@@ -43,64 +43,96 @@ async function readLicenseFile() {
43
43
  return undefined;
44
44
  }
45
45
  }
46
- async function resolveWithKey(key) {
47
- const store = await readStore();
48
- // If the key changed since last activation, drop the stale instance binding.
49
- let instanceId = store.licenseKey === key ? store.instanceId : undefined;
50
- // Activate this machine the first time we see this key.
51
- if (!instanceId) {
52
- const act = await activate(key, os.hostname() || "device");
53
- if (act.reachable) {
54
- if (act.valid && act.instanceId && ownsKey(act)) {
55
- instanceId = act.instanceId;
56
- await writeStore({ instanceId, licenseKey: key });
57
- }
58
- else if (act.reachable && !ownsKey(act)) {
59
- return "no-key"; // key belongs to a different store/product
60
- }
61
- // else: reachable but invalid → fall through to validate for a clear status
46
+ /** A subscription/key status that still grants access. */
47
+ function isLive(status) {
48
+ return status !== "expired" && status !== "disabled";
49
+ }
50
+ /** Result when Lemon Squeezy is unreachable: offline grace window, else locked. */
51
+ function offlineResult(store) {
52
+ if (store.lastValidationOk && store.lastValidatedAt) {
53
+ const used = daysBetween(store.lastValidatedAt, Date.now());
54
+ if (used <= OFFLINE_GRACE_DAYS) {
55
+ return {
56
+ status: "licensed",
57
+ message: `Licensed ✅ (offline — re-checks within ${OFFLINE_GRACE_DAYS - used} day(s)).`,
58
+ daysLeft: OFFLINE_GRACE_DAYS - used,
59
+ };
62
60
  }
63
- // If unreachable, fall through to the offline-grace path below.
64
61
  }
65
- const val = await validate(key, instanceId);
66
- if (val.reachable) {
62
+ return {
63
+ status: "locked",
64
+ message: `Couldn't verify your ${PRODUCT_NAME} license (no internet). ` +
65
+ "Connect to the internet and try again.",
66
+ };
67
+ }
68
+ const licensed = (expiresAt) => ({
69
+ status: "licensed",
70
+ message: `Licensed ✅ (${PRODUCT_NAME}).`,
71
+ expiresAt: expiresAt ?? null,
72
+ });
73
+ /**
74
+ * Resolve a license key. The activation limit is enforced by REQUIRING a bound
75
+ * activation instance: a machine either re-validates its own instance, or it
76
+ * must successfully ACTIVATE a new one. If activation fails because the limit is
77
+ * full, we lock — we never fall back to a bare key check (which would let one key
78
+ * run on unlimited machines).
79
+ */
80
+ async function resolveWithKey(key) {
81
+ const store = await readStore();
82
+ const boundInstance = store.licenseKey === key ? store.instanceId : undefined;
83
+ // 1) Returning machine — re-validate its own activation instance.
84
+ if (boundInstance) {
85
+ const val = await validate(key, boundInstance);
86
+ if (!val.reachable)
87
+ return offlineResult(store);
67
88
  if (!ownsKey(val))
68
89
  return "no-key";
69
- if (val.valid && val.status !== "expired" && val.status !== "disabled") {
90
+ if (val.valid && isLive(val.status)) {
70
91
  await writeStore({
71
92
  licenseKey: key,
72
93
  lastValidatedAt: new Date().toISOString(),
73
94
  lastValidationOk: true,
74
95
  });
96
+ return licensed(val.expiresAt);
97
+ }
98
+ if (!isLive(val.status)) {
99
+ await writeStore({ lastValidationOk: false });
75
100
  return {
76
- status: "licensed",
77
- message: `Licensed ✅ (${PRODUCT_NAME}).`,
101
+ status: "locked",
102
+ message: `Your ${PRODUCT_NAME} subscription is ${val.status}. Renew at ${PURCHASE_URL}`,
78
103
  expiresAt: val.expiresAt ?? null,
79
104
  };
80
105
  }
81
- await writeStore({ lastValidationOk: false });
106
+ // Instance was deactivated elsewhere — forget it and try to re-activate below.
107
+ await writeStore({ instanceId: undefined });
108
+ }
109
+ // 2) New machine — MUST activate. This is what enforces the activation limit.
110
+ const act = await activate(key, os.hostname() || "device");
111
+ if (!act.reachable)
112
+ return offlineResult(store);
113
+ if (act.valid && act.instanceId && ownsKey(act)) {
114
+ await writeStore({
115
+ instanceId: act.instanceId,
116
+ licenseKey: key,
117
+ lastValidatedAt: new Date().toISOString(),
118
+ lastValidationOk: true,
119
+ });
120
+ return licensed(act.expiresAt);
121
+ }
122
+ // Activation failed — classify why.
123
+ if (!ownsKey(act))
124
+ return "no-key"; // wrong store/product or key not found → trial
125
+ if (!isLive(act.status)) {
82
126
  return {
83
127
  status: "locked",
84
- message: `Your ${PRODUCT_NAME} subscription is ${val.status ?? "inactive"}. ` +
85
- `Renew at ${PURCHASE_URL}`,
86
- expiresAt: val.expiresAt ?? null,
128
+ message: `Your ${PRODUCT_NAME} subscription is ${act.status}. Renew at ${PURCHASE_URL}`,
87
129
  };
88
130
  }
89
- // Network failure honor an offline grace window for known-good licenses.
90
- if (store.lastValidationOk && store.lastValidatedAt) {
91
- const used = daysBetween(store.lastValidatedAt, Date.now());
92
- if (used <= OFFLINE_GRACE_DAYS) {
93
- return {
94
- status: "licensed",
95
- message: `Licensed ✅ (offline — re-checks within ${OFFLINE_GRACE_DAYS - used} day(s)).`,
96
- daysLeft: OFFLINE_GRACE_DAYS - used,
97
- };
98
- }
99
- }
131
+ // Key is valid & ours, but this machine couldn't be activated → device limit hit.
100
132
  return {
101
133
  status: "locked",
102
- message: `Couldn't verify your ${PRODUCT_NAME} license (no internet). ` +
103
- "Connect to the internet and try again.",
134
+ message: `This license is already active on another device (activation limit reached). ` +
135
+ `Deactivate the other device, or get another license at ${PURCHASE_URL}`,
104
136
  };
105
137
  }
106
138
  async function resolveTrial() {
@@ -1 +1 @@
1
- {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/licensing/license.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmD3D"}
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoD3D"}
@@ -6,6 +6,7 @@ import { callStudio } from "../services/studio.js";
6
6
  import { status as brokerStatus } from "../client/transport.js";
7
7
  import { ok } from "../services/format.js";
8
8
  import { currentLicense } from "../licensing/license.js";
9
+ import { VERSION } from "../version.js";
9
10
  const InputSchema = z.object({}).strict();
10
11
  export function registerSystemTools(server) {
11
12
  server.registerTool("system_info", {
@@ -23,10 +24,11 @@ export function registerSystemTools(server) {
23
24
  }, async () => {
24
25
  const status = await brokerStatus();
25
26
  const license = currentLicense();
26
- const out = { bridge: status, license };
27
+ const out = { version: VERSION, bridge: status, license };
27
28
  let text = [
28
29
  "# Roblox MCP — System Info",
29
30
  "",
31
+ `- Version: ${VERSION}`,
30
32
  `- License: ${license.status} — ${license.message}`,
31
33
  `- Plugin connected: ${status.pluginConnected ? "yes ✅" : "no ❌"}`,
32
34
  `- Queued commands: ${status.queued}`,
@@ -1 +1 @@
1
- {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAS1C,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,sGAAsG;YACtG,iFAAiF;YACjF,4GAA4G;QAC9G,WAAW,EAAE,WAAW,CAAC,KAAK;QAC9B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,GAAG,GAA4B,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACjE,IAAI,IAAI,GAAG;YACT,4BAA4B;YAC5B,EAAE;YACF,cAAc,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,OAAO,EAAE;YACnD,uBAAuB,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE;YAClE,sBAAsB,MAAM,CAAC,MAAM,EAAE;YACrC,yBAAyB,MAAM,CAAC,QAAQ,EAAE;SAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC/D,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;gBACpB,IAAI;oBACF,cAAc,MAAM,CAAC,SAAS,IAAI,GAAG,QAAQ,MAAM,CAAC,OAAO,IAAI,GAAG,GAAG;wBACrE,uBAAuB,MAAM,CAAC,aAAa,IAAI,GAAG,EAAE;wBACpD,6BAA6B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,0EAA0E;gBAC1E,IAAI,IAAI,2DAA2D,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI;gBACF,8EAA8E;oBAC9E,6CAA6C,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAS1C,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,sGAAsG;YACtG,iFAAiF;YACjF,4GAA4G;QAC9G,WAAW,EAAE,WAAW,CAAC,KAAK;QAC9B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACnF,IAAI,IAAI,GAAG;YACT,4BAA4B;YAC5B,EAAE;YACF,cAAc,OAAO,EAAE;YACvB,cAAc,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,OAAO,EAAE;YACnD,uBAAuB,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE;YAClE,sBAAsB,MAAM,CAAC,MAAM,EAAE;YACrC,yBAAyB,MAAM,CAAC,QAAQ,EAAE;SAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAa,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC/D,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;gBACpB,IAAI;oBACF,cAAc,MAAM,CAAC,SAAS,IAAI,GAAG,QAAQ,MAAM,CAAC,OAAO,IAAI,GAAG,GAAG;wBACrE,uBAAuB,MAAM,CAAC,aAAa,IAAI,GAAG,EAAE;wBACpD,6BAA6B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,0EAA0E;gBAC1E,IAAI,IAAI,2DAA2D,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI;gBACF,8EAA8E;oBAC9E,6CAA6C,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,OAAO,QAAU,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** The running package version, read from package.json at the package root. */
2
+ import { readFileSync } from "node:fs";
3
+ let version = "unknown";
4
+ try {
5
+ // dist/version.js -> ../package.json (package root; always shipped by npm).
6
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
7
+ if (pkg.version)
8
+ version = pkg.version;
9
+ }
10
+ catch {
11
+ // Leave "unknown" if package.json can't be read.
12
+ }
13
+ export const VERSION = version;
14
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,IAAI,OAAO,GAAG,SAAS,CAAC;AACxB,IAAI,CAAC;IACH,4EAA4E;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC1C,CAAC;IAC1B,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACzC,CAAC;AAAC,MAAM,CAAC;IACP,iDAAiD;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roblox-mcp-pro",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "MCP server that lets AI agents control Roblox Studio: live Luau execution, instance query/mutate, UI/terrain/lighting, and bidirectional Studio<->local sync. Paid subscription with a free trial.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Peerapol",