@el4cteo/rbx-studio-mcp 0.2.7 → 0.2.8

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
@@ -1,217 +1,217 @@
1
- # Roblox Studio MCP
2
-
3
- MCP server for Roblox Studio: 29 tools over a push-based bridge, batched writes that undo as one step, editor-safe script edits. MIT.
4
-
5
- ![The Studio MCP panel, showing calls and their latency](docs/console.png)
6
-
7
- ## Install
8
-
9
- **1. The Studio plugin**
10
-
11
- ```bash
12
- npx -y @el4cteo/rbx-studio-mcp --install-plugin
13
- ```
14
-
15
- Or download `StudioMCP.rbxmx` from [Releases](https://github.com/EL4CTEO/rbx-studio-mcp/releases) into your Studio plugins folder.
16
-
17
- **2. The server**, in whichever client you use:
18
-
19
- <details>
20
- <summary><b>Claude Code</b></summary>
21
-
22
- ```bash
23
- claude mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
24
- ```
25
- </details>
26
-
27
- <details>
28
- <summary><b>Codex CLI</b></summary>
29
-
30
- ```bash
31
- codex mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
32
- ```
33
- </details>
34
-
35
- <details>
36
- <summary><b>Cursor</b> — <code>~/.cursor/mcp.json</code> or <code>.cursor/mcp.json</code></summary>
37
-
38
- ```json
39
- {
40
- "mcpServers": {
41
- "roblox-studio": {
42
- "command": "npx",
43
- "args": ["-y", "@el4cteo/rbx-studio-mcp"]
44
- }
45
- }
46
- }
47
- ```
48
- </details>
49
-
50
- <details>
51
- <summary><b>Claude Desktop</b> — <code>claude_desktop_config.json</code></summary>
52
-
53
- ```json
54
- {
55
- "mcpServers": {
56
- "roblox-studio": {
57
- "command": "npx",
58
- "args": ["-y", "@el4cteo/rbx-studio-mcp"]
59
- }
60
- }
61
- }
62
- ```
63
- </details>
64
-
65
- <details>
66
- <summary><b>Gemini CLI</b> — <code>~/.gemini/settings.json</code></summary>
67
-
68
- ```json
69
- {
70
- "mcpServers": {
71
- "roblox-studio": {
72
- "command": "npx",
73
- "args": ["-y", "@el4cteo/rbx-studio-mcp"]
74
- }
75
- }
76
- }
77
- ```
78
- </details>
79
-
80
- <details>
81
- <summary><b>Windsurf</b> — <code>~/.codeium/windsurf/mcp_config.json</code></summary>
82
-
83
- ```json
84
- {
85
- "mcpServers": {
86
- "roblox-studio": {
87
- "command": "npx",
88
- "args": ["-y", "@el4cteo/rbx-studio-mcp"]
89
- }
90
- }
91
- }
92
- ```
93
- </details>
94
-
95
- <details>
96
- <summary><b>VS Code / Copilot</b> — <code>.vscode/mcp.json</code></summary>
97
-
98
- ```json
99
- {
100
- "servers": {
101
- "roblox-studio": {
102
- "type": "stdio",
103
- "command": "npx",
104
- "args": ["-y", "@el4cteo/rbx-studio-mcp"]
105
- }
106
- }
107
- }
108
- ```
109
- </details>
110
-
111
- <details>
112
- <summary><b>opencode</b> — <code>opencode.json</code></summary>
113
-
114
- ```json
115
- {
116
- "$schema": "https://opencode.ai/config.json",
117
- "mcp": {
118
- "roblox-studio": {
119
- "type": "local",
120
- "command": ["npx", "-y", "@el4cteo/rbx-studio-mcp"],
121
- "enabled": true
122
- }
123
- }
124
- }
125
- ```
126
- </details>
127
-
128
- **3.** Open Studio and accept the `127.0.0.1` prompt — the plugin connects automatically. Verify with `studio_status`.
129
-
130
- **4.** `debug` additionally needs **Debugger Luau API** in File → Beta Features, plus a Studio restart. Nothing else requires it.
131
-
132
- ![The Debugger Luau API beta feature toggle in Studio](docs/betatoggle.png)
133
-
134
- Port defaults to **44755** — change with `--port` or `ROBLOX_STUDIO_MCP_PORT`, and match it in the plugin widget. Loopback only.
135
-
136
- ## Multiple agents
137
-
138
- Register the server in as many clients as you like — the plugin connects out to one port, the first server owns it and the rest proxy through. No configuration, no second Studio connection.
139
-
140
- Each agent keeps its own target (`set_active_studio` is per client), so two agents can work on two open places and neither can retarget the other. Pass `studioId` on a single call to reach elsewhere without changing your default.
141
-
142
- Subagents share their parent's connection and therefore its target — a subagent calling `set_active_studio` silently retargets its parent. Give subagents an explicit `studioId` per call.
143
-
144
- ## Tools
145
-
146
- | | |
147
- |---|---|
148
- | **Session** | `studio_status` `list_studios` `set_active_studio` |
149
- | **Discover** | `tree` `inspect` `find` `api` |
150
- | **Scripts** | `script_read` `script_edit` `script_grep` `script_create` |
151
- | **Instances** | `create` `modify` `delete` `move` |
152
- | **World** | `geometry` `assets` `collision` `undo` |
153
- | **Run & debug** | `playtest` `execute_luau` `character` `input` `console` `debug` `performance` |
154
- | **Look** | `screenshot` `viewport` `device` |
155
-
156
- Gotchas: during a playtest two sessions connect — pass `studioId` explicitly and use the edit session for anything that must persist. `device` emulation persists until `device op="stop"`.
157
-
158
- ## Batching
159
-
160
- Every write tool takes an array — ten script edits or two hundred deletions is one call.
161
-
162
- | tool | takes | cap |
163
- |---|---|---|
164
- | `create` | instances, each nesting `children` to any depth | 100 |
165
- | `modify` | entries, each with an unlimited list of `paths` | 100 entries |
166
- | `delete` | paths | 200 |
167
- | `move` | moves | 200 |
168
- | `script_edit` | edits, across any number of scripts | 50 |
169
- | `script_create` | scripts | 50 |
170
- | `inspect` | paths | 50 |
171
- | `input` | input steps, delivered in order | 40 |
172
-
173
- `modify` caps *entries*, not targets — one entry can anchor five hundred parts, so pair it with `find` to change a whole place in one call.
174
-
175
- Each batch is a single `ChangeHistoryService` recording: **one Ctrl+Z**. Batches are all-or-nothing — everything is transformed in memory first, so a failed match leaves the place untouched.
176
-
177
- Parallel tool calls also work (responses are keyed by request id), but prefer a batch: N parallel calls are N round trips and N undo steps, a batch is one of each.
178
-
179
- ## Compared to what else exists
180
-
181
- | | tools | transport | editor-safe writes | undo recording | live API dump | licence |
182
- |---|---|---|---|---|---|---|
183
- | **this** | 29 | **SSE push** | **yes** | **yes** | **yes** | MIT |
184
- | [Roblox built-in](https://create.roblox.com/docs/studio/mcp) | ~27 | stdio | partial | — | n/a | closed source |
185
- | [Chrrxs](https://github.com/Chrrxs/robloxstudio-mcp) | ~40 | poll | no | partial | no | MIT |
186
- | [drgost1](https://github.com/drgost1/robloxstudio-mcp) | 51 | poll 500 ms | no | yes | no | MIT |
187
- | [boshyxd](https://github.com/boshyxd/robloxstudio-mcp) | 43 | long-poll | no | no | no | MIT (archived) |
188
- | [Roblox/studio-rust-mcp-server](https://github.com/Roblox/studio-rust-mcp-server) | 2 | HTTP | no | no | no | MIT (superseded) |
189
-
190
- - **Push, not poll** — 50 sequential round trips: 13.6 ms mean vs 25.8 ms, 12.8 ms median vs 29.9 ms (`node scripts/latency.mjs --count 50 --compare`).
191
- - **Safe script edits** — `ScriptEditorService:UpdateSourceAsync`, not `script.Source`; your unsaved editor buffer survives.
192
- - **~16k tokens of schema** against 43–51 tools elsewhere. Cursor-paged, capped, `detail: concise | standard | full`.
193
- - **Live API dump** — property typos get suggestions (`Anchorred` → `Anchored`).
194
-
195
- Not built here: terrain, AI mesh and material generation.
196
-
197
- ## Security
198
-
199
- Binds `127.0.0.1`, rejects `Origin`, and requires a header a browser cannot set cross-origin — closing the DNS-rebinding hole. HTTP permission is granted per plugin and per URL, so your experience's "Allow HTTP Requests" setting is untouched.
200
-
201
- ## Development
202
-
203
- ```bash
204
- npm install
205
- npm run build # TypeScript -> dist/
206
- npm run build:plugin # plugin/src -> build/StudioMCP.rbxmx
207
- npm run install:plugin # build + copy into the Studio plugins folder
208
- npm test # plugin (Luau) + bridge (Node) tests
209
- ```
210
-
211
- Needs `luau`, `luau-compile` and `luau-analyze` from [the Luau releases](https://github.com/luau-lang/luau/releases) on `PATH` or in `tools/`.
212
-
213
- `evals/` holds ten questions answerable only by driving a real Studio session — see [evals/README.md](evals/README.md).
214
-
215
- ## Licence
216
-
217
- MIT.
1
+ # Roblox Studio MCP
2
+
3
+ MCP server for Roblox Studio: 29 tools over a push-based bridge, batched writes that undo as one step, editor-safe script edits. MIT.
4
+
5
+ ![The Studio MCP panel, showing calls and their latency](docs/console.png)
6
+
7
+ ## Install
8
+
9
+ **1. The Studio plugin**
10
+
11
+ ```bash
12
+ npx -y @el4cteo/rbx-studio-mcp --install-plugin
13
+ ```
14
+
15
+ Or download `StudioMCP.rbxmx` from [Releases](https://github.com/EL4CTEO/rbx-studio-mcp/releases) into your Studio plugins folder.
16
+
17
+ **2. The server**, in whichever client you use:
18
+
19
+ <details>
20
+ <summary><b>Claude Code</b></summary>
21
+
22
+ ```bash
23
+ claude mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
24
+ ```
25
+ </details>
26
+
27
+ <details>
28
+ <summary><b>Codex CLI</b></summary>
29
+
30
+ ```bash
31
+ codex mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
32
+ ```
33
+ </details>
34
+
35
+ <details>
36
+ <summary><b>Cursor</b> — <code>~/.cursor/mcp.json</code> or <code>.cursor/mcp.json</code></summary>
37
+
38
+ ```json
39
+ {
40
+ "mcpServers": {
41
+ "roblox-studio": {
42
+ "command": "npx",
43
+ "args": ["-y", "@el4cteo/rbx-studio-mcp"]
44
+ }
45
+ }
46
+ }
47
+ ```
48
+ </details>
49
+
50
+ <details>
51
+ <summary><b>Claude Desktop</b> — <code>claude_desktop_config.json</code></summary>
52
+
53
+ ```json
54
+ {
55
+ "mcpServers": {
56
+ "roblox-studio": {
57
+ "command": "npx",
58
+ "args": ["-y", "@el4cteo/rbx-studio-mcp"]
59
+ }
60
+ }
61
+ }
62
+ ```
63
+ </details>
64
+
65
+ <details>
66
+ <summary><b>Gemini CLI</b> — <code>~/.gemini/settings.json</code></summary>
67
+
68
+ ```json
69
+ {
70
+ "mcpServers": {
71
+ "roblox-studio": {
72
+ "command": "npx",
73
+ "args": ["-y", "@el4cteo/rbx-studio-mcp"]
74
+ }
75
+ }
76
+ }
77
+ ```
78
+ </details>
79
+
80
+ <details>
81
+ <summary><b>Windsurf</b> — <code>~/.codeium/windsurf/mcp_config.json</code></summary>
82
+
83
+ ```json
84
+ {
85
+ "mcpServers": {
86
+ "roblox-studio": {
87
+ "command": "npx",
88
+ "args": ["-y", "@el4cteo/rbx-studio-mcp"]
89
+ }
90
+ }
91
+ }
92
+ ```
93
+ </details>
94
+
95
+ <details>
96
+ <summary><b>VS Code / Copilot</b> — <code>.vscode/mcp.json</code></summary>
97
+
98
+ ```json
99
+ {
100
+ "servers": {
101
+ "roblox-studio": {
102
+ "type": "stdio",
103
+ "command": "npx",
104
+ "args": ["-y", "@el4cteo/rbx-studio-mcp"]
105
+ }
106
+ }
107
+ }
108
+ ```
109
+ </details>
110
+
111
+ <details>
112
+ <summary><b>opencode</b> — <code>opencode.json</code></summary>
113
+
114
+ ```json
115
+ {
116
+ "$schema": "https://opencode.ai/config.json",
117
+ "mcp": {
118
+ "roblox-studio": {
119
+ "type": "local",
120
+ "command": ["npx", "-y", "@el4cteo/rbx-studio-mcp"],
121
+ "enabled": true
122
+ }
123
+ }
124
+ }
125
+ ```
126
+ </details>
127
+
128
+ **3.** Open Studio and accept the `127.0.0.1` prompt — the plugin connects automatically. Verify with `studio_status`.
129
+
130
+ **4.** `debug` additionally needs **Debugger Luau API** in File → Beta Features, plus a Studio restart. Nothing else requires it.
131
+
132
+ ![The Debugger Luau API beta feature toggle in Studio](docs/betatoggle.png)
133
+
134
+ Port defaults to **44755** — change with `--port` or `ROBLOX_STUDIO_MCP_PORT`, and match it in the plugin widget. Loopback only.
135
+
136
+ ## Multiple agents
137
+
138
+ Register the server in as many clients as you like — the plugin connects out to one port, the first server owns it and the rest proxy through. No configuration, no second Studio connection.
139
+
140
+ Each agent keeps its own target (`set_active_studio` is per client), so two agents can work on two open places and neither can retarget the other. Pass `studioId` on a single call to reach elsewhere without changing your default.
141
+
142
+ Subagents share their parent's connection and therefore its target — a subagent calling `set_active_studio` silently retargets its parent. Give subagents an explicit `studioId` per call.
143
+
144
+ ## Tools
145
+
146
+ | | |
147
+ |---|---|
148
+ | **Session** | `studio_status` `list_studios` `set_active_studio` |
149
+ | **Discover** | `tree` `inspect` `find` `api` |
150
+ | **Scripts** | `script_read` `script_edit` `script_grep` `script_create` |
151
+ | **Instances** | `create` `modify` `delete` `move` |
152
+ | **World** | `geometry` `assets` `collision` `undo` |
153
+ | **Run & debug** | `playtest` `execute_luau` `character` `input` `console` `debug` `performance` |
154
+ | **Look** | `screenshot` `viewport` `device` |
155
+
156
+ Gotchas: during a playtest two sessions connect — pass `studioId` explicitly and use the edit session for anything that must persist. `device` emulation persists until `device op="stop"`.
157
+
158
+ ## Batching
159
+
160
+ Every write tool takes an array — ten script edits or two hundred deletions is one call.
161
+
162
+ | tool | takes | cap |
163
+ |---|---|---|
164
+ | `create` | instances, each nesting `children` to any depth | 100 |
165
+ | `modify` | entries, each with an unlimited list of `paths` | 100 entries |
166
+ | `delete` | paths | 200 |
167
+ | `move` | moves | 200 |
168
+ | `script_edit` | edits, across any number of scripts | 50 |
169
+ | `script_create` | scripts | 50 |
170
+ | `inspect` | paths | 50 |
171
+ | `input` | input steps, delivered in order | 40 |
172
+
173
+ `modify` caps *entries*, not targets — one entry can anchor five hundred parts, so pair it with `find` to change a whole place in one call.
174
+
175
+ Each batch is a single `ChangeHistoryService` recording: **one Ctrl+Z**. Batches are all-or-nothing — everything is transformed in memory first, so a failed match leaves the place untouched.
176
+
177
+ Parallel tool calls also work (responses are keyed by request id), but prefer a batch: N parallel calls are N round trips and N undo steps, a batch is one of each.
178
+
179
+ ## Compared to what else exists
180
+
181
+ | | tools | transport | editor-safe writes | undo recording | live API dump | licence |
182
+ |---|---|---|---|---|---|---|
183
+ | **this** | 29 | **SSE push** | **yes** | **yes** | **yes** | MIT |
184
+ | [Roblox built-in](https://create.roblox.com/docs/studio/mcp) | ~27 | stdio | partial | — | n/a | closed source |
185
+ | [Chrrxs](https://github.com/Chrrxs/robloxstudio-mcp) | ~40 | poll | no | partial | no | MIT |
186
+ | [drgost1](https://github.com/drgost1/robloxstudio-mcp) | 51 | poll 500 ms | no | yes | no | MIT |
187
+ | [boshyxd](https://github.com/boshyxd/robloxstudio-mcp) | 43 | long-poll | no | no | no | MIT (archived) |
188
+ | [Roblox/studio-rust-mcp-server](https://github.com/Roblox/studio-rust-mcp-server) | 2 | HTTP | no | no | no | MIT (superseded) |
189
+
190
+ - **Push, not poll** — 50 sequential round trips: 13.6 ms mean vs 25.8 ms, 12.8 ms median vs 29.9 ms (`node scripts/latency.mjs --count 50 --compare`).
191
+ - **Safe script edits** — `ScriptEditorService:UpdateSourceAsync`, not `script.Source`; your unsaved editor buffer survives.
192
+ - **~16k tokens of schema** against 43–51 tools elsewhere. Cursor-paged, capped, `detail: concise | standard | full`.
193
+ - **Live API dump** — property typos get suggestions (`Anchorred` → `Anchored`).
194
+
195
+ Not built here: terrain, AI mesh and material generation.
196
+
197
+ ## Security
198
+
199
+ Binds `127.0.0.1`, rejects `Origin`, and requires a header a browser cannot set cross-origin — closing the DNS-rebinding hole. HTTP permission is granted per plugin and per URL, so your experience's "Allow HTTP Requests" setting is untouched.
200
+
201
+ ## Development
202
+
203
+ ```bash
204
+ npm install
205
+ npm run build # TypeScript -> dist/
206
+ npm run build:plugin # plugin/src -> build/StudioMCP.rbxmx
207
+ npm run install:plugin # build + copy into the Studio plugins folder
208
+ npm test # plugin (Luau) + bridge (Node) tests
209
+ ```
210
+
211
+ Needs `luau`, `luau-compile` and `luau-analyze` from [the Luau releases](https://github.com/luau-lang/luau/releases) on `PATH` or in `tools/`.
212
+
213
+ `evals/` holds ten questions answerable only by driving a real Studio session — see [evals/README.md](evals/README.md).
214
+
215
+ ## Licence
216
+
217
+ MIT.
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import { registerInputTools } from "./tools/input.js";
20
20
  import { registerDeviceTools } from "./tools/device.js";
21
21
  import { registerApiTools } from "./tools/api.js";
22
22
  import { registerResources } from "./resources.js";
23
- const VERSION = "0.2.7";
23
+ const VERSION = "0.2.8";
24
24
  function parsePort(argv) {
25
25
  const flag = argv.indexOf("--port");
26
26
  const raw = flag !== -1 ? argv[flag + 1] : process.env["ROBLOX_STUDIO_MCP_PORT"];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@el4cteo/rbx-studio-mcp",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "MCP server for Roblox Studio. 29 tools, push-based SSE bridge, editor-safe script edits, one-step undo.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -32,12 +32,17 @@
32
32
  },
33
33
  "keywords": [
34
34
  "mcp",
35
+ "mcp-server",
35
36
  "model-context-protocol",
36
37
  "roblox",
37
38
  "roblox-studio",
39
+ "roblox-development",
38
40
  "luau",
39
41
  "claude",
40
- "ai"
42
+ "claude-code",
43
+ "cursor",
44
+ "ai",
45
+ "ai-agent"
41
46
  ],
42
47
  "dependencies": {
43
48
  "@modelcontextprotocol/sdk": "^1.22.0",
@@ -9,7 +9,7 @@
9
9
 
10
10
  local Config = {}
11
11
 
12
- Config.PLUGIN_VERSION = "0.2.7"
12
+ Config.PLUGIN_VERSION = "0.2.8"
13
13
 
14
14
  -- Fingerprint of plugin/src, stamped in by scripts/build-plugin.mjs. The server
15
15
  -- computes the same hash from its own copy of the sources and compares, so a