roblox-mcp-pro 0.2.1 → 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 +25 -16
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/install-plugin.d.ts +18 -6
- package/dist/install-plugin.d.ts.map +1 -1
- package/dist/install-plugin.js +47 -19
- package/dist/install-plugin.js.map +1 -1
- package/dist/tools/system.d.ts.map +1 -1
- package/dist/tools/system.js +3 -1
- package/dist/tools/system.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +14 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
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.
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/install-plugin.d.ts
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
-
*
|
|
8
|
-
*
|
|
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
|
|
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"}
|
package/dist/install-plugin.js
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
-
*
|
|
8
|
-
*
|
|
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
|
-
|
|
66
|
+
bundledPluginPath());
|
|
34
67
|
process.exitCode = 1;
|
|
35
68
|
return;
|
|
36
69
|
}
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
|
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":"system.d.ts","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
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"}
|
package/dist/tools/system.js
CHANGED
|
@@ -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}`,
|
package/dist/tools/system.js.map
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,OAAO,QAAU,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -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.
|
|
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",
|