@el4cteo/rbx-studio-mcp 0.2.0 → 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.
@@ -187,16 +187,60 @@ export function registerPerfTools(context) {
187
187
  "returned it rather than summarised into numbers that might be wrong.");
188
188
  }
189
189
  if (response.scripts.length === 0) {
190
- return text((response.enabled.length > 0
191
- ? `Coverage enabled for ${response.enabled.length} script(s). `
192
- : "") +
193
- "No coverage recorded yet.\n" +
194
- "Coverage is recorded per session. If the code runs in a playtest, " +
195
- "read it back from the playtest's studioId — the editor session " +
196
- "instruments its own data model and never ran that code.\n" +
197
- `This session carried over: ${JSON.stringify(response.carriedOver ?? [])}; ` +
198
- `failed: ${JSON.stringify(response.carriedFailed ?? [])}; ` +
199
- `remembered: ${JSON.stringify(response.remembered ?? [])}.`);
190
+ /*
191
+ * An empty result has more than one cause and this asserted a single
192
+ * one, so it was wrong whenever the other applied.
193
+ *
194
+ * Measured against a live session, `ScriptContext`:
195
+ * - enable a script, read straight back -> NO record. The normal
196
+ * state of the documented workflow, before anything has run.
197
+ * - run a script, then enable it -> NO record. Already
198
+ * compiled; Luau keeps the bytecode it first built.
199
+ * The two are indistinguishable from here, so neither is asserted.
200
+ * Saying "these compiled too early" to someone who has simply not
201
+ * pressed Play yet is the same failure as the message it replaced.
202
+ *
203
+ * What IS known is whether this call switched anything on, and that
204
+ * decides which half of the answer is useful.
205
+ */
206
+ const justEnabled = response.enabled.length > 0;
207
+ const pending = response.remembered ?? [];
208
+ const lead = justEnabled
209
+ ? `Coverage is on for ${response.enabled.length} script(s): ${response.enabled.join(", ")}.\n` +
210
+ "Nothing has been recorded yet, which is expected — instrumentation only " +
211
+ "collects while the code runs. Start the playtest, then read coverage back " +
212
+ "from the PLAYTEST's studioId; this editor session never runs that code."
213
+ : "No coverage recorded in this session.\n" +
214
+ (pending.length > 0
215
+ ? `Instrumentation is remembered for: ${pending.join(", ")}.\n` +
216
+ "An empty result means either that this code has not run yet, or that " +
217
+ "it was already compiled when instrumentation was switched on — Luau " +
218
+ "binds coverage at first compile and keeps that bytecode. The two look " +
219
+ "identical from here.\n"
220
+ : "Nothing is instrumented for this place. Pass `enable` with the " +
221
+ "scripts you want measured.\n") +
222
+ "A script that starts with the place can never be measured by the session " +
223
+ "that loaded it. Modules required later can be: enable them, start the " +
224
+ "playtest, then read from the playtest's studioId.";
225
+ // `enable: []` is a request to stop, and with nothing to report the
226
+ // caller otherwise gets a message that never mentions the thing they
227
+ // just asked for -- indistinguishable from the call being ignored.
228
+ const stopped = args.enable !== undefined && args.enable.length === 0
229
+ ? "\nInstrumentation is now off for this place: no future session " +
230
+ "will switch it on. Scripts already instrumented in a running " +
231
+ "session keep reporting until it ends."
232
+ : "";
233
+ const failed = response.carriedFailed ?? [];
234
+ return text(lead +
235
+ stopped +
236
+ (response.carriedOver && response.carriedOver.length > 0
237
+ ? `\nThis session instrumented at load: ${response.carriedOver.join(", ")}.`
238
+ : "") +
239
+ (failed.length > 0
240
+ ? `\nFailed to instrument: ${failed
241
+ .map((entry) => `${entry.path} (${entry.error})`)
242
+ .join("; ")}.`
243
+ : ""));
200
244
  }
201
245
  const summary = textOf(table(["path", "coveredLines", "instrumentedLines", "percent"], response.scripts, { more: "instrumented lines only; blanks, comments and `end` are excluded" }));
202
246
  // The percentage says how much ran; these say what did not, which is the
@@ -221,13 +265,26 @@ export function registerPerfTools(context) {
221
265
  if (misses.length > 0)
222
266
  sections.push(`Lines never executed:\n${misses.join("\n")}`);
223
267
  if (unmeasured.length > 0) {
268
+ /*
269
+ * What this is NOT is settled; what it is, is not.
270
+ *
271
+ * It is not "already compiled when coverage was switched on", which
272
+ * is what this said before: probed against ScriptContext, a script
273
+ * that ran before being enabled gets no record at all and never
274
+ * reaches this branch. That much is reproducible.
275
+ *
276
+ * The positive cause is not. The one session that produced 0-line
277
+ * records could not be made to produce them again -- the identical
278
+ * create/enable/require sequence instrumented 6 of 6 lines the next
279
+ * time. So the wording stops at what the number means for the reader
280
+ * and does not name a mechanism nobody has reproduced twice.
281
+ */
224
282
  sections.push(`Not measurable, reported as 0 lines: ${unmeasured.map((e) => e.path).join(", ")}.\n` +
225
- "These were already compiled when coverage was switched on, and Luau " +
226
- "keeps its first bytecode — re-running them does not help. This is " +
227
- "normal for a script that starts with the place, since nothing can " +
228
- "instrument it before the data model loads it. Coverage measures " +
229
- "modules required after instrumentation, which is where most game " +
230
- "logic lives.");
283
+ "Studio holds a coverage record for these but instrumented no line " +
284
+ "of them, so nothing about them was measured. Read it as no data, " +
285
+ "never as dead code — 0 of 0 lines is not 0 of many. If you need " +
286
+ "them covered, enable them and start a fresh playtest so they are " +
287
+ "instrumented before they first compile.");
231
288
  }
232
289
  return text(sections.join("\n\n"));
233
290
  }
@@ -1 +1 @@
1
- {"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/tools/perf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/tools/perf.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,30 @@ import { json, text } from "../lib/format.js";
3
3
  import { pluginStalenessWarning } from "../lib/pluginbuild.js";
4
4
  import { protocolMismatchWarning } from "../lib/protocol.js";
5
5
  import { defineTool } from "../lib/tool.js";
6
+ /**
7
+ * What to tell the agent when this listing leaves no default target.
8
+ *
9
+ * Two sessions on one placeId is an editor and its own playtest, and telling
10
+ * the agent to go and ask the user which place they mean is a question with no
11
+ * answer -- there is one place, in two states. `resolveSession` already knew
12
+ * that and raised SAME_PLACE_STUDIO with real guidance, but this listing, which
13
+ * is what an agent reads *before* it gets that far, gave the opposite advice.
14
+ * Asking the user was the first thing it said, and the error it would hit next
15
+ * says in as many words not to. Same wording in both places now.
16
+ */
17
+ function listingHint(sessions, active) {
18
+ if (active !== null || sessions.length <= 1)
19
+ return undefined;
20
+ const places = new Set(sessions.map((session) => session.placeId));
21
+ if (places.size === 1) {
22
+ return ("This is one place with a playtest running, not two places — do not ask " +
23
+ "the user which they mean. Pass `studioId` explicitly: the *edit* session " +
24
+ "for anything that must outlive the playtest, the *playtest* session for " +
25
+ "the running game.");
26
+ }
27
+ return ("Several places are open and none is selected. Ask the user which one they " +
28
+ "mean, then call set_active_studio.");
29
+ }
6
30
  export function registerSessionTools(context) {
7
31
  const { bridge } = context;
8
32
  defineTool(context, {
@@ -116,10 +140,7 @@ export function registerSessionTools(context) {
116
140
  active: session.studioId === active,
117
141
  })),
118
142
  activeStudioId: active,
119
- }, active === null && sessions.length > 1
120
- ? "No place is selected. Ask the user which one they mean, then call " +
121
- "set_active_studio."
122
- : undefined);
143
+ }, listingHint(sessions, active));
123
144
  });
124
145
  defineTool(context, {
125
146
  name: "set_active_studio",
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@el4cteo/rbx-studio-mcp",
3
- "version": "0.2.0",
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",
@@ -24,7 +24,7 @@
24
24
  "start": "node dist/index.js",
25
25
  "build:plugin": "node scripts/check-plugin.mjs && node scripts/build-plugin.mjs",
26
26
  "sourcemap": "node scripts/sourcemap.mjs",
27
- "test": "node scripts/test-plugin.mjs && node scripts/test-bridge.mjs",
27
+ "test": "node scripts/test-plugin.mjs && node scripts/test-transport.mjs && node scripts/test-bridge.mjs",
28
28
  "build:all": "npm run build && npm run build:plugin",
29
29
  "install:plugin": "node scripts/install-plugin.mjs",
30
30
  "check:plugin": "node scripts/check-plugin.mjs",
@@ -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.0"
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
@@ -1,6 +1,6 @@
1
1
  --!strict
2
2
  --[[
3
- The Studio MCP console.
3
+ The rbx-studio console.
4
4
 
5
5
  This is the only feedback channel the plugin has. It deliberately never
6
6
  writes to Studio's Output window, because that log is also what the agent
@@ -107,12 +107,22 @@ end
107
107
 
108
108
  type State = {
109
109
  lines: { string },
110
+ --[[
111
+ Rows written, as opposed to lines rendered.
112
+
113
+ `lines` also holds the indented continuations a long detail wraps onto,
114
+ so counting it would report a number nobody wrote -- "cleared 41 logs"
115
+ for twelve commands. This counts calls to `log`, which is what a person
116
+ means by a log line.
117
+ ]]
118
+ entries: number,
110
119
  label: TextLabel?,
111
120
  scroller: ScrollingFrame?,
112
121
  statusDot: TextLabel?,
113
122
  statusText: TextLabel?,
114
123
  metaText: TextLabel?,
115
124
  countersText: TextLabel?,
125
+ clientsChip: TextLabel?,
116
126
  pinned: boolean,
117
127
  calls: number,
118
128
  errors: number,
@@ -120,23 +130,43 @@ type State = {
120
130
  -- The command in flight, shown in the footer while it runs. One value that
121
131
  -- is replaced, never a list that grows.
122
132
  running: string?,
133
+ --[[
134
+ Bumped by every call, so a pending idle timer can tell whether it is still
135
+ the most recent one. Cheaper and less error-prone than cancelling timers:
136
+ `task.delay` has no handle to cancel, and a stale closure that checks a
137
+ counter simply does nothing.
138
+ ]]
139
+ generation: number,
140
+ -- How many MCP clients share this bridge. Only ever displayed above one.
141
+ clients: number,
142
+ -- Set while a repaint is already scheduled for the end of this frame.
143
+ dirty: boolean,
123
144
  }
124
145
 
125
146
  local state: State = {
126
147
  lines = {},
148
+ entries = 0,
127
149
  label = nil,
128
150
  scroller = nil,
129
151
  statusDot = nil,
130
152
  statusText = nil,
131
153
  metaText = nil,
132
154
  countersText = nil,
155
+ clientsChip = nil,
133
156
  pinned = true,
134
157
  calls = 0,
135
158
  errors = 0,
136
159
  totalMs = 0,
137
160
  running = nil,
161
+ generation = 0,
162
+ clients = 1,
163
+ dirty = false,
138
164
  }
139
165
 
166
+ -- How long the session must be silent before the console says so. Long enough
167
+ -- that an agent pausing to think is not announced as having stopped.
168
+ local QUIET_SECONDS = 20
169
+
140
170
  local function hex(color: Color3): string
141
171
  return string.format(
142
172
  "#%02X%02X%02X",
@@ -159,7 +189,8 @@ local function span(color: Color3, value: string): string
159
189
  return string.format('<font color="%s">%s</font>', hex(color), escape(value))
160
190
  end
161
191
 
162
- local function redraw()
192
+ local function paint()
193
+ state.dirty = false
163
194
  local label = state.label
164
195
  if not label then
165
196
  return
@@ -177,6 +208,24 @@ local function redraw()
177
208
  end
178
209
  end
179
210
 
211
+ --[[
212
+ Asks for a repaint, at most one per frame.
213
+
214
+ Painting is a concat of up to three hundred strings followed by a RichText
215
+ relayout of the whole label, and it used to run once per appended row. A
216
+ failed command writes three rows -- the failure, its message, sometimes a
217
+ hint -- so a single unlucky call repainted the entire console three times,
218
+ and all of that sat in front of the reply on its way back to the agent.
219
+ Deferring collapses them into the one paint that was always sufficient.
220
+ ]]
221
+ local function redraw()
222
+ if state.dirty then
223
+ return
224
+ end
225
+ state.dirty = true
226
+ task.defer(paint)
227
+ end
228
+
180
229
  local function refreshCounters()
181
230
  local counters = state.countersText
182
231
  if not counters then
@@ -257,6 +306,7 @@ function Console.log(level: Level, message: string, detail: string?)
257
306
  off beneath it.
258
307
  ]]
259
308
  table.insert(state.lines, line)
309
+ state.entries += 1
260
310
  if detail then
261
311
  if inlineDetail then
262
312
  local padding = math.max(1, DETAIL_COLUMN - bodyWidth)
@@ -303,6 +353,7 @@ local KIND_LOOK: { [string]: { color: Color3, urgency: number } } = {
303
353
 
304
354
  function Console.beginCall(title: string, kind: string)
305
355
  state.running = title
356
+ state.generation += 1
306
357
  local look = KIND_LOOK[kind] or KIND_LOOK.read
307
358
  Visuals.setCaption(title)
308
359
  Visuals.setKind(look.color, look.urgency)
@@ -319,6 +370,9 @@ function Console.recordCall(ok: boolean, milliseconds: number)
319
370
  if not ok then
320
371
  state.errors += 1
321
372
  end
373
+ -- Read before it is cleared: the bar wants the same phrase the log row uses,
374
+ -- and this is the only place that still has it.
375
+ local title = state.running or "call"
322
376
  state.running = nil
323
377
  refreshCounters()
324
378
  -- The footer reports totals when idle, so the band shows what just ran
@@ -327,7 +381,35 @@ function Console.recordCall(ok: boolean, milliseconds: number)
327
381
 
328
382
  -- The band plots it: bar height is how long it took, colour is whether it
329
383
  -- worked, and a failure knocks the solid off its axis as well.
330
- Visuals.recordCall(milliseconds, ok)
384
+ Visuals.recordCall(milliseconds, ok, title)
385
+
386
+ --[[
387
+ Says so when the session goes quiet, once per burst.
388
+
389
+ There is no "the agent has finished" message in MCP -- an agent that has
390
+ stopped and one that is thinking are the same silence -- so this reports
391
+ the silence rather than claiming to know what caused it: what ran, how
392
+ much of it, and how fast. The generation check is what makes it once per
393
+ burst: every later call bumps the counter, so all but the newest timer
394
+ wake up, find they are stale, and do nothing.
395
+ ]]
396
+ state.generation += 1
397
+ local mine = state.generation
398
+ task.delay(QUIET_SECONDS, function()
399
+ if state.generation ~= mine or state.calls == 0 then
400
+ return
401
+ end
402
+ Console.log(
403
+ "dim",
404
+ string.format(
405
+ "agent idle -- %d call%s, avg %.0fms",
406
+ state.calls,
407
+ if state.calls == 1 then "" else "s",
408
+ state.totalMs / state.calls
409
+ )
410
+ )
411
+ Visuals.setQuiet()
412
+ end)
331
413
  end
332
414
 
333
415
  --[[
@@ -342,13 +424,99 @@ function Console.setCaption(message: string)
342
424
  Visuals.setCaption(message)
343
425
  end
344
426
 
427
+ --[[
428
+ Announces that an MCP client disconnected.
429
+
430
+ This is the one moment the bridge can be certain a session ended rather than
431
+ paused -- the client's process is gone -- so it is the one place the console
432
+ is allowed to state it outright. Everything else it knows about agent
433
+ activity is inference, and is worded as inference.
434
+ ]]
435
+ function Console.agentFinished()
436
+ --[[
437
+ Named for what happened, not for what it might have meant.
438
+
439
+ This said "Agent finished task." and that was overclaiming: the bridge
440
+ sees a client disconnect and nothing more. Quitting the editor, a crash
441
+ and a restart all arrive here identically, and the first time one was
442
+ watched live it announced a completed task for an agent that had simply
443
+ been closed mid-idle.
444
+ ]]
445
+ Console.log("ok", "Agent disconnected.", "client left")
446
+ Visuals.setQuiet()
447
+ end
448
+
449
+ --[[
450
+ How many MCP clients are sharing this bridge.
451
+
452
+ Reported only above one. A single client is the ordinary case and needs no
453
+ badge -- a permanent "1 client connected" is a label, not a signal, and the
454
+ header has better uses for the width.
455
+ ]]
456
+ function Console.setClients(count: number)
457
+ local previous = state.clients
458
+ state.clients = count
459
+
460
+ local chip = state.clientsChip
461
+ if chip then
462
+ chip.Visible = count > 1
463
+ -- Pluralised even though the badge hides at one. A string that is only
464
+ -- ever correct because nobody can see it is a trap for whoever changes
465
+ -- the visibility rule later.
466
+ chip.Text = string.format(
467
+ "\u{25C6} %d client%s",
468
+ count,
469
+ if count == 1 then "" else "s"
470
+ )
471
+ end
472
+
473
+ local meta = state.metaText
474
+ if meta then
475
+ meta.Size = UDim2.new(1, if count > 1 then -486 else -394, 1, 0)
476
+ end
477
+
478
+ --[[
479
+ Only the arrival is worth a row.
480
+
481
+ The departure had one too, and seeing it live made the redundancy plain:
482
+ "one MCP client connected" landed in the same second as "Agent finished
483
+ task.", saying the same thing less well, while the badge disappearing
484
+ said it a third time. The count going up is news because nothing else
485
+ reports it; the count coming down is already covered twice over.
486
+ ]]
487
+ if count > 1 and previous <= 1 then
488
+ Console.log("info", string.format("%d MCP clients connected", count))
489
+ end
490
+ end
491
+
345
492
  function Console.clear()
493
+ --[[
494
+ Says what it did, with a timestamp, like everything else in here.
495
+
496
+ A button that empties the screen and leaves no trace is indistinguishable
497
+ from one that crashed the panel. The count is read before the clear and
498
+ written after it, so the first row of the fresh log is the receipt for
499
+ the one that went.
500
+ ]]
501
+ local cleared = state.entries
346
502
  table.clear(state.lines)
503
+ state.entries = 0
347
504
  state.calls = 0
348
505
  state.errors = 0
349
506
  state.totalMs = 0
350
507
  refreshCounters()
508
+ -- The bars belonged to the log that just went. Leaving forty timings from an
509
+ -- erased session on screen while the footer reads "idle" is two answers to
510
+ -- one question.
511
+ Visuals.clearTrace()
351
512
  redraw()
513
+
514
+ if cleared > 0 then
515
+ Console.log(
516
+ "dim",
517
+ string.format("cleared %d log%s", cleared, if cleared == 1 then "" else "s")
518
+ )
519
+ end
352
520
  end
353
521
 
354
522
  --[[
@@ -482,6 +650,38 @@ function Console.mount(parent: Instance, handlers: Handlers)
482
650
  meta.Parent = header
483
651
  state.metaText = meta
484
652
 
653
+ --[[
654
+ The shared-bridge badge, hidden until there is something to share.
655
+
656
+ Sits between the meta line and the buttons rather than in the activity
657
+ band, because it is a fact about the connection and the header is where
658
+ connection facts live. `meta` gives up the width when it appears; see
659
+ `Console.setClients`.
660
+ ]]
661
+ local clientsChip = Instance.new("TextLabel")
662
+ clientsChip.Name = "Clients"
663
+ clientsChip.AnchorPoint = Vector2.new(1, 0.5)
664
+ clientsChip.Position = UDim2.new(1, -252, 0.5, 0)
665
+ clientsChip.Size = UDim2.new(0, 84, 0, 18)
666
+ clientsChip.BackgroundColor3 = PALETTE.background
667
+ clientsChip.BorderSizePixel = 0
668
+ clientsChip.Font = Enum.Font.Code
669
+ clientsChip.TextSize = 11
670
+ clientsChip.TextColor3 = PALETTE.cyan
671
+ clientsChip.Text = ""
672
+ clientsChip.Visible = false
673
+ clientsChip.Parent = header
674
+ state.clientsChip = clientsChip
675
+
676
+ local chipCorner = Instance.new("UICorner")
677
+ chipCorner.CornerRadius = UDim.new(0, 3)
678
+ chipCorner.Parent = clientsChip
679
+
680
+ local chipStroke = Instance.new("UIStroke")
681
+ chipStroke.Color = PALETTE.cyan
682
+ chipStroke.Transparency = 0.6
683
+ chipStroke.Parent = clientsChip
684
+
485
685
  local buttons = Instance.new("Frame")
486
686
  buttons.AnchorPoint = Vector2.new(1, 0.5)
487
687
  buttons.Position = UDim2.new(1, 0, 0.5, 0)
@@ -571,7 +771,7 @@ function Console.mount(parent: Instance, handlers: Handlers)
571
771
  footerPadding.Parent = footer
572
772
 
573
773
  local prompt = Instance.new("TextLabel")
574
- prompt.Text = "studio\u{00B7}mcp"
774
+ prompt.Text = "rbx\u{00B7}studio"
575
775
  prompt.Font = Enum.Font.Code
576
776
  prompt.TextSize = 11
577
777
  prompt.TextColor3 = PALETTE.violet