@el4cteo/rbx-studio-mcp 0.5.3 → 0.5.4
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 +36 -152
- package/package.json +1 -1
- package/plugin/src/Config.luau +1 -1
package/README.md
CHANGED
|
@@ -1,84 +1,33 @@
|
|
|
1
1
|
# Roblox Studio MCP
|
|
2
2
|
|
|
3
|
-
Let an AI agent drive Roblox Studio: read your place, edit scripts, build
|
|
3
|
+
Let an AI agent drive Roblox Studio: read your place, edit scripts, build geometry, run playtests, take screenshots. 31 tools. MIT.
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
|
-
**1. The
|
|
9
|
+
**1. The plugin**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
npx -y @el4cteo/rbx-studio-mcp --install-plugin
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
**2. The server**, in whichever client you use:
|
|
18
|
-
|
|
19
|
-
<details>
|
|
20
|
-
<summary><b>Claude Code</b></summary>
|
|
15
|
+
**2. The server**
|
|
21
16
|
|
|
22
17
|
```bash
|
|
23
18
|
claude mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
|
|
24
19
|
```
|
|
25
|
-
</details>
|
|
26
20
|
|
|
27
21
|
<details>
|
|
28
|
-
<summary
|
|
22
|
+
<summary>Other clients</summary>
|
|
23
|
+
|
|
24
|
+
Codex CLI:
|
|
29
25
|
|
|
30
26
|
```bash
|
|
31
27
|
codex mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
|
|
32
28
|
```
|
|
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
29
|
|
|
80
|
-
|
|
81
|
-
<summary><b>Windsurf</b> — <code>~/.codeium/windsurf/mcp_config.json</code></summary>
|
|
30
|
+
Cursor, Claude Desktop, Gemini CLI, Windsurf — add to their config file:
|
|
82
31
|
|
|
83
32
|
```json
|
|
84
33
|
{
|
|
@@ -90,30 +39,13 @@ codex mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
|
|
|
90
39
|
}
|
|
91
40
|
}
|
|
92
41
|
```
|
|
93
|
-
</details>
|
|
94
42
|
|
|
95
|
-
|
|
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>
|
|
43
|
+
VS Code / Copilot (`.vscode/mcp.json`) uses `"servers"` instead of `"mcpServers"`, plus `"type": "stdio"`.
|
|
110
44
|
|
|
111
|
-
|
|
112
|
-
<summary><b>opencode</b> — <code>opencode.json</code></summary>
|
|
45
|
+
opencode (`opencode.json`):
|
|
113
46
|
|
|
114
47
|
```json
|
|
115
48
|
{
|
|
116
|
-
"$schema": "https://opencode.ai/config.json",
|
|
117
49
|
"mcp": {
|
|
118
50
|
"roblox-studio": {
|
|
119
51
|
"type": "local",
|
|
@@ -125,25 +57,11 @@ codex mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
|
|
|
125
57
|
```
|
|
126
58
|
</details>
|
|
127
59
|
|
|
128
|
-
**3.** Open Studio and accept the `127.0.0.1` prompt
|
|
129
|
-
|
|
130
|
-
**4.** `debug` additionally needs **Debugger Luau API** in File → Beta Features, plus a Studio restart. Nothing else requires it.
|
|
131
|
-
|
|
132
|
-

|
|
133
|
-
|
|
134
|
-
Port defaults to **44755** — change with `--port` or `ROBLOX_STUDIO_MCP_PORT`, and match it in the plugin widget. Loopback only.
|
|
60
|
+
**3.** Open Studio and accept the `127.0.0.1` prompt. Check it works with `studio_status`.
|
|
135
61
|
|
|
136
|
-
|
|
62
|
+
Something wrong? Run `npx -y @el4cteo/rbx-studio-mcp doctor` — it says what is broken and how to fix it.
|
|
137
63
|
|
|
138
|
-
|
|
139
|
-
npx -y @el4cteo/rbx-studio-mcp doctor
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## Multiple agents
|
|
143
|
-
|
|
144
|
-
Register the server in as many clients as you like. No extra configuration.
|
|
145
|
-
|
|
146
|
-
Each agent keeps its own target, so two agents can work on two open places. Subagents share their parent's target — give them an explicit `studioId` per call.
|
|
64
|
+
Port is **44755**, loopback only. Change it with `--port` and match it in the plugin.
|
|
147
65
|
|
|
148
66
|
## Tools
|
|
149
67
|
|
|
@@ -153,101 +71,67 @@ Each agent keeps its own target, so two agents can work on two open places. Suba
|
|
|
153
71
|
| **Discover** | `tree` `inspect` `find` `api` |
|
|
154
72
|
| **Scripts** | `script_read` `script_edit` `script_grep` `script_create` |
|
|
155
73
|
| **Instances** | `create` `modify` `delete` `move` |
|
|
156
|
-
| **World** | `geometry` `generate` `assets` `collision` `undo` |
|
|
74
|
+
| **World** | `geometry` `terrain` `generate` `assets` `collision` `undo` |
|
|
157
75
|
| **Run & debug** | `playtest` `execute_luau` `character` `input` `console` `debug` `performance` |
|
|
158
76
|
| **Look** | `screenshot` `viewport` `device` |
|
|
159
77
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
`generate` builds 3D models from a prompt using Roblox's Cube model — `Body1` for props, `Car5` for a body and four named wheels a script can drive, or your own part names.
|
|
78
|
+
Write tools take arrays — ten script edits is one call, one **Ctrl+Z**, and all-or-nothing.
|
|
163
79
|
|
|
164
|
-
|
|
80
|
+
Two things to watch: a playtest connects a second session, so pass `studioId` and use the edit one for changes that must last; `device` emulation stays on until `device op="stop"`.
|
|
165
81
|
|
|
166
82
|
## The console panel
|
|
167
83
|
|
|
168
|
-
Every call is logged with
|
|
169
|
-
|
|
170
|
-
Under the header is a command line. Type a command, or type a sentence and it goes to a coding agent.
|
|
84
|
+
Every call is logged with how long it took. Below the header is a command line — type a command, or type a sentence and a coding agent answers it.
|
|
171
85
|
|
|
172
86
|
| | |
|
|
173
87
|
|---|---|
|
|
174
88
|
| `help` | list everything |
|
|
175
|
-
| `doctor` | check
|
|
89
|
+
| `doctor` | check the setup |
|
|
176
90
|
| `status` `version` `place` `clients` | what this session is |
|
|
177
|
-
| `studios` `use <n>` | which Studio window calls
|
|
178
|
-
| `theme [name]` `visuals` `log [level]` `clear` `copy` | the panel
|
|
91
|
+
| `studios` `use <n>` | which Studio window calls go to |
|
|
92
|
+
| `theme [name]` `visuals` `log [level]` `clear` `copy` | the panel |
|
|
179
93
|
| `port [n]` `reconnect` | the connection |
|
|
180
|
-
| `agent [use <id>\|new]` `stop` | which
|
|
94
|
+
| `agent [use <id>\|new]` `stop` | which agent runs your prompts |
|
|
181
95
|
| anything else | sent to that agent |
|
|
182
96
|
|
|
183
|
-
|
|
97
|
+
Arrows walk the history, Tab completes.
|
|
98
|
+
|
|
99
|
+
**Prompts start a real agent** — whichever you have on PATH: Claude Code, Codex, opencode, Gemini, Cursor, Amp, Qwen Code, Factory Droid, goose, Copilot CLI, Aider, Crush, DeepSeek Harness. It runs headless, drives the same Studio, and its work appears in the log. It is a separate session from your terminal, billed separately, and allowed the `rbx-studio` tools only. `stop` cancels it.
|
|
184
100
|
|
|
185
|
-
|
|
101
|
+
Eight themes behind the tab on the right edge. Your pick is remembered.
|
|
186
102
|
|
|
187
|
-
|
|
103
|
+
## Why this one
|
|
104
|
+
|
|
105
|
+
- **Push, not poll** — 13.6 ms per call against 25.8 ms.
|
|
106
|
+
- **Safe script edits** — writes go through the script editor, so unsaved work survives.
|
|
107
|
+
- **Stale edits are refused** — pass back the `rev` from `script_read` and a write lands only if nobody else touched the file.
|
|
108
|
+
- **Property names are checked** against the running engine, so `Anchorred` comes back as a suggestion, not a runtime error.
|
|
188
109
|
|
|
189
110
|
## DeepSeek Harness (dsh)
|
|
190
111
|
|
|
191
|
-
|
|
112
|
+
This server registers as a dsh plugin. `config/dsh.cordis.yml` is the row:
|
|
192
113
|
|
|
193
114
|
```sh
|
|
194
115
|
dsh --profile headless --patch config/dsh.cordis.yml "add a spawn point"
|
|
195
116
|
```
|
|
196
117
|
|
|
197
|
-
To keep it, append that row to your own
|
|
198
|
-
|
|
199
|
-
`config/dsh.cordis.yml` in this repo is the row. The console panel also lists `dsh` as an agent, and passes the overlay itself, so a prompt typed there works before you have merged anything.
|
|
200
|
-
|
|
201
|
-
Two limits, both dsh's rather than ours: its headless profile prints the final answer instead of streaming, so the panel shows the reply at the end rather than step by step, and it has no `--resume`, so every prompt is a fresh conversation. It needs `DEEPSEEK_API_KEY`.
|
|
202
|
-
|
|
203
|
-
## Batching
|
|
204
|
-
|
|
205
|
-
Every write tool takes an array — ten script edits is one call.
|
|
206
|
-
|
|
207
|
-
| tool | takes | cap |
|
|
208
|
-
|---|---|---|
|
|
209
|
-
| `create` | instances, each nesting `children` to any depth | 100 |
|
|
210
|
-
| `modify` | entries, each with an unlimited list of `paths` | 100 entries |
|
|
211
|
-
| `delete` | paths | 200 |
|
|
212
|
-
| `move` | moves | 200 |
|
|
213
|
-
| `script_edit` | edits, across any number of scripts | 50 |
|
|
214
|
-
| `script_create` | scripts | 50 |
|
|
215
|
-
| `inspect` | paths | 50 |
|
|
216
|
-
| `input` | input steps, delivered in order | 40 |
|
|
217
|
-
|
|
218
|
-
`modify` caps *entries*, not targets — one entry can anchor five hundred parts.
|
|
219
|
-
|
|
220
|
-
Each batch is one **Ctrl+Z**, and all-or-nothing: a failed match leaves the place untouched.
|
|
221
|
-
|
|
222
|
-
## Why this one
|
|
223
|
-
|
|
224
|
-
- **Push, not poll.** 50 sequential round trips average 13.6 ms, against 25.8 ms polling — reproduce with `node scripts/latency.mjs --count 50 --compare`.
|
|
225
|
-
- **Safe script edits.** Writes go through `ScriptEditorService:UpdateSourceAsync`, so your unsaved editor buffer survives.
|
|
226
|
-
- **Edits can refuse to be stale.** `script_read` prints a `rev`; pass it back and the write is rejected if anyone changed the script meanwhile, instead of landing on lines that moved.
|
|
227
|
-
- **One Ctrl+Z per call.** Every batch is a single undo recording.
|
|
228
|
-
- **Property names are checked** against the running engine's API dump, so a typo comes back as `Anchorred` → `Anchored` instead of a runtime error.
|
|
229
|
-
- **~16k tokens of schema**, cursor-paged and capped, with `detail: concise | standard | full`.
|
|
230
|
-
|
|
231
|
-
Not built here: material generation.
|
|
118
|
+
To keep it, append that row to your own `cordis.patch.yml`. Needs `DEEPSEEK_API_KEY`.
|
|
232
119
|
|
|
233
120
|
## Security
|
|
234
121
|
|
|
235
|
-
Loopback only
|
|
122
|
+
Loopback only, and requires a header a browser cannot set cross-origin. Your experience's "Allow HTTP Requests" setting is untouched.
|
|
236
123
|
|
|
237
124
|
## Development
|
|
238
125
|
|
|
239
126
|
```bash
|
|
240
127
|
npm install
|
|
241
128
|
npm run build # TypeScript -> dist/
|
|
242
|
-
npm run
|
|
243
|
-
npm
|
|
244
|
-
npm test # plugin (Luau) + bridge (Node) tests
|
|
129
|
+
npm run install:plugin # build the plugin and copy it into Studio
|
|
130
|
+
npm test
|
|
245
131
|
```
|
|
246
132
|
|
|
247
133
|
Needs `luau`, `luau-compile` and `luau-analyze` from [the Luau releases](https://github.com/luau-lang/luau/releases) on `PATH` or in `tools/`.
|
|
248
134
|
|
|
249
|
-
`evals/` holds ten questions answerable only by driving a real Studio session — see [evals/README.md](evals/README.md).
|
|
250
|
-
|
|
251
135
|
## Licence
|
|
252
136
|
|
|
253
137
|
MIT.
|
package/package.json
CHANGED
package/plugin/src/Config.luau
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
local Config = {}
|
|
11
11
|
|
|
12
|
-
Config.PLUGIN_VERSION = "0.5.
|
|
12
|
+
Config.PLUGIN_VERSION = "0.5.4"
|
|
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
|