Skip to main content
Glama
EL4CTEO

Roblox Studio MCP

Breakpoints and runtime inspection

debug

Set breakpoints to capture stack and variables at a line, then read snapshots to diagnose issues. Supports conditional firing, log expressions, and remote tracing.

Instructions

Sets breakpoints that record the stack and variables when they are hit, then reads back what they caught.

These are tracepoints, not a step debugger. A breakpoint fires, captures the call stack and the variables in scope, and lets execution continue; op: "snapshots" returns what was captured. Studio's debugger has to decide whether to resume the instant it stops, and cannot wait for a tool call to come back with an answer, so stepping through code line by line is not possible this way — but 'what was this value when it got here' is, which is usually the actual question.

condition is a Luau expression evaluated where the breakpoint sits, so a breakpoint can fire only on the case that matters — health < 0, player.Name == "someone".

logMessage is ALSO a Luau expression, not a template string: its value is printed when the breakpoint is hit, so write "health=" .. health rather than health={health}. Prose is a syntax error. Read the lines back with console.

Two things about it are measured, not assumed, and both waste your time otherwise. A breakpoint fires ONCE PER RUN, not once per pass: on a five-iteration loop it printed a single line, for the first iteration only. It is not a way to watch a value change inside a loop — to see every pass, have the code itself print and read that with console. And a log expression CANNOT SEE THE LOOP CONTROL VARIABLE: on for index = 1, 5 do, a breakpoint in the body read the body's own locals correctly and index as nil. Wrap values in tostring so a nil prints as "nil" instead of throwing.

A log expression that throws is reported as "Breakpoint ... ignored" in console, NOT here — set still returns Verified, because Studio only compiles the expression once the line is reached.

So the two kinds cost different things: a logMessage breakpoint never stops and gives you one line you composed in advance, while one without it stops briefly and gives you the whole frame — every local and its type, without having to guess beforehand which value would matter. Both give you that for one pass only. Reach for the log when you know what to watch, the capture when you do not.

Only one breakpoint exists per line, so the same line cannot both log and capture.

Put the breakpoint on a line that does something. A return, an end or a bare declaration can verify and then never fire — measured, not guessed: the same breakpoint moved from return squared, tag to the assignment above it went from silent to firing on every pass. If one verifies but catches nothing, suspect the line before suspecting the condition.

Breakpoints belong to the session that holds them. Set them in the editor session BEFORE starting a playtest, since code that already ran cannot be caught retroactively.

Nothing here leaves a thread stopped waiting for you. A capture breakpoint stops for as long as it takes to read the frame and then resumes itself, so a script with one mid-loop still runs to its last line, and the user is never left with a frozen Studio to rescue.

remotes passively observes RemoteEvent traffic for one playtest player in both directions. Returns counts, calls/sec and two short argument-shape samples per remote; no raw payload dumps or RemoteFunction interception. Requires the playtest server studioId. Captures 5 seconds by default (max 15), at most 2000 events and 40 rows within 12 KB; reports truncation when a limit is reached.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
opYes'set' adds breakpoints, 'clear' removes one or all, 'snapshots' reads what has been captured, 'exceptions' controls breaking on errors, 'remotes' traces RemoteEvents.
lineNoclear only: which line to remove.
modeNoexceptions only: break on every error, only unhandled ones, or never. Defaults to Unhandled.
pathNoclear: script to clear. remotes: remote or subtree path, default game. Narrow this if discovery is truncated.
clearNosnapshots only: discard what is returned, so the next read starts fresh.
limitNosnapshots only: how many of the most recent to return.
playerNoremotes only: player name; required with multiple players. Both directions are scoped to this player.
secondsNoremotes only: capture seconds, default 5.
studioIdNoTarget Studio; omit for the active one.
breakpointsNoset only: breakpoints to add.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv0.7.5
    • changedInput schema / properties / op / description
      Previous value: -"'set' adds breakpoints, 'clear' removes one or all, 'snapshots' reads what has been captured, 'exceptions' controls breaking on errors."New value: +"'set' adds breakpoints, 'clear' removes one or all, 'snapshots' reads what has been captured, 'exceptions' controls breaking on errors, 'remotes' traces RemoteEvents."
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "set",
      -  "clear",
      -  "snapshots",
      -  "exceptions"
      -]New value: +[
      +  "set",
      +  "clear",
      +  "snapshots",
      +  "exceptions",
      +  "remotes"
      +]
    • changedInput schema / properties / path / description
      Previous value: -"clear only: remove breakpoints from this script. Omit to clear everything."New value: +"clear: script to clear. remotes: remote or subtree path, default game. Narrow this if discovery is truncated."
    • addedInput schema / properties / player
      Added value: +{
      +  "description": "remotes only: player name; required with multiple players. Both directions are scoped to this player.",
      +  "type": "string"
      +}
    • addedInput schema / properties / seconds
      Added value: +{
      +  "description": "remotes only: capture seconds, default 5.",
      +  "maximum": 15,
      +  "minimum": 1,
      +  "type": "number"
      +}
  2. First observedv0.1.8

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses many non-obvious behaviors beyond annotations: breakpoints fire once per run, log expressions cannot see loop control variables, a breakpoint on a return/end may never fire, and set can return Verified even when the log expression later throws. It also clarifies that capture breakpoints resume themselves and never leave Studio frozen. This far exceeds what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with the core purpose and organized into thematic paragraphs covering limitations, parameters, and remotes. Some illustrative anecdotes and repeated 'measured, not guessed' phrasing add bulk, so it is not maximally concise, but the length is largely justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description covers what each operation returns: snapshots returns captures, set returns Verified, and remotes returns counts, calls/sec, and argument-shape samples. It also explains truncation, session scoping, and the need to set breakpoints before playtesting. For a tool with 10 parameters and multiple modes, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds crucial meaning: condition must be a Luau expression, logMessage is also a Luau expression rather than a template string, prose causes syntax errors, and line placement affects whether a breakpoint fires. This significantly deepens an agent's understanding of how to correctly set parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it sets breakpoints that record stack and variables, then reads back captured snapshots. It also differentiates itself by explaining these are tracepoints, not a step debugger, which separates it from sibling inspection tools. The first sentence alone gives an agent a precise mental model.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance, e.g., 'Reach for the log when you know what to watch, the capture when you do not.' It also names an alternative, console, for loop-by-loop value watching, and warns against using breakpoints for stepping. This is exactly the kind of routing information an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.