Skip to main content
Glama
EL4CTEO

Roblox Studio MCP

Emulate a phone, tablet or console

device

Resize Studio's viewport to match real phones, tablets, consoles, or VR headsets, and simulate network latency, jitter, and packet loss to test how UI and gameplay perform on actual player hardware.

Instructions

Resizes the Studio viewport to a real device, so you can see what a player on that device sees.

Most Roblox players are on a phone and most UI is built on a desktop monitor, which is where interfaces break: a button under the notch, a menu off the bottom of a 393-pixel-tall screen, text sized for a display three times larger. None of that is visible in the data model — every one of those instances has perfectly correct properties — so this is the only way to find it short of owning the hardware.

The workflow is: set a device, screenshot, look. Pair it with playtest to check a running game's HUD rather than the editor.

list gives the ids, each with its real name, form factor and resolution — ids look like "iphone_16", "ipad_a16", "samsung_galaxy_s25_ultra", "xbox", "meta_quest_3".

network degrades the connection on purpose — latency, jitter and packet loss — which is the other half of what a phone player actually gets. A menu that works at 0ms is not evidence that it works at 300: the spinner that never stops, the button that fires twice, the HUD that arrives after the round started are all invisible on a local connection. Use a preset (wifi, 4g, 3g, poor, clear) or set the numbers yourself, then playtest and watch.

stop returns Studio to the normal editor viewport AND clears the network shaping. Do that when you are finished: a left-over emulated device makes every later screenshot the wrong shape, a left-over 400ms delay makes the whole place feel broken, and nothing on screen says why in either case.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
opNo'list' shows the available devices, 'set' switches to one, 'network' shapes the connection, 'stop' undoes both, 'state' only reports.state
formNolist only: show only devices of this form factor.
lossNonetwork only: percentage of packets thrown away, up to 0.5 — Roblox caps it there so the simulation does not fight congestion control. Latency makes a game feel slow; loss makes unreliable remotes arrive out of order or not at all.
deviceNoset only: the device id, e.g. "iphone_16". See `list`.
jitterNonetwork only: how much the delay varies, in milliseconds. Jitter breaks things steady latency does not — it is what makes replicated motion stutter rather than simply lag.
memoryNonetwork only: pretend the machine has this many MB of memory. A cheap phone is a small screen AND little memory; this is the half that makes textures unload. 0 removes the cap, restoring the real amount.
presetNonetwork only: a whole connection in one word. clear=0ms (normal), wifi=15ms, 4g=60ms/0.1% loss, 3g=150ms/0.3% loss, poor=400ms/0.5% loss. Named fields below override whichever part you name.
latencyNonetwork only: minimum delay in milliseconds, up to 1000 — the engine's own ceiling. 0 clears it.
studioIdNoTarget Studio; omit for the active one.
directionNonetwork only: which way to degrade. 'in' is the player with a bad connection, 'out' is everyone else seeing that player late. Defaults to both.
orientationNoset only: which way up. Portrait is worth testing separately — most mobile players hold the phone upright and most UI is only ever checked in landscape.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.8.6
    • changedInput schema / properties / loss / description
      Previous value: -"network only: percentage of packets thrown away, up to 50 — the engine's own ceiling. The field that finds real bugs: latency makes a game feel slow, loss makes it behave wrongly. 2-8% is a bad mobile connection."New value: +"network only: percentage of packets thrown away, up to 0.5 — Roblox caps it there so the simulation does not fight congestion control. Latency makes a game feel slow; loss makes unreliable remotes arrive out of order or not at all."
    • changedInput schema / properties / loss / maximum
      Previous value: -50New value: +0.5
    • changedInput schema / properties / memory / description
      Previous value: -"network only: pretend the machine has this many MB of memory. A cheap phone is a small screen AND little memory; this is the half that makes textures unload. 0 removes the cap."New value: +"network only: pretend the machine has this many MB of memory. A cheap phone is a small screen AND little memory; this is the half that makes textures unload. 0 removes the cap, restoring the real amount."
    • changedInput schema / properties / preset / description
      Previous value: -"network only: a whole connection in one word. clear=0ms (normal), wifi=15ms, 4g=60ms/0.5% loss, 3g=150ms/2% loss, poor=400ms/8% loss. Named fields below override whichever part you name."New value: +"network only: a whole connection in one word. clear=0ms (normal), wifi=15ms, 4g=60ms/0.1% loss, 3g=150ms/0.3% loss, poor=400ms/0.5% loss. Named fields below override whichever part you name."
  2. Changed8 schema fields changedv0.6.5
    • addedInput schema / properties / direction
      Added value: +{
      +  "description": "network only: which way to degrade. 'in' is the player with a bad connection, 'out' is everyone else seeing that player late. Defaults to both.",
      +  "enum": [
      +    "in",
      +    "out",
      +    "both"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / jitter
      Added value: +{
      +  "description": "network only: how much the delay varies, in milliseconds. Jitter breaks things steady latency does not — it is what makes replicated motion stutter rather than simply lag.",
      +  "maximum": 1000,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / latency
      Added value: +{
      +  "description": "network only: minimum delay in milliseconds, up to 1000 — the engine's own ceiling. 0 clears it.",
      +  "maximum": 1000,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / loss
      Added value: +{
      +  "description": "network only: percentage of packets thrown away, up to 50 — the engine's own ceiling. The field that finds real bugs: latency makes a game feel slow, loss makes it behave wrongly. 2-8% is a bad mobile connection.",
      +  "maximum": 50,
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / memory
      Added value: +{
      +  "description": "network only: pretend the machine has this many MB of memory. A cheap phone is a small screen AND little memory; this is the half that makes textures unload. 0 removes the cap.",
      +  "maximum": 65536,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / properties / op / description
      Previous value: -"'list' shows the available devices, 'set' switches to one, 'stop' returns to the normal viewport, 'state' only reports."New value: +"'list' shows the available devices, 'set' switches to one, 'network' shapes the connection, 'stop' undoes both, 'state' only reports."
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "list",
      -  "set",
      -  "stop",
      -  "state"
      -]New value: +[
      +  "list",
      +  "set",
      +  "network",
      +  "stop",
      +  "state"
      +]
    • addedInput schema / properties / preset
      Added value: +{
      +  "description": "network only: a whole connection in one word. clear=0ms (normal), wifi=15ms, 4g=60ms/0.5% loss, 3g=150ms/2% loss, poor=400ms/8% loss. Named fields below override whichever part you name.",
      +  "enum": [
      +    "clear",
      +    "wifi",
      +    "4g",
      +    "3g",
      +    "poor"
      +  ],
      +  "type": "string"
      +}
  3. First observedv0.1.8

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the bar is lower, yet the description adds real side-effect context: `stop` restores the editor viewport AND clears network shaping, and a leftover device/network shapes every later screenshot invisibly. It does not restate reversibility explicitly, which keeps it below a 5.

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 core action is front-loaded in the first sentence, and the paragraph-per-op structure is easy to scan. Several passages are rhetorically padded ("A menu that works at 0ms is not evidence that it works at 300"), so it is longer than strictly necessary for an 11-param tool.

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

Completeness4/5

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

With no output schema and 11 optional params, the description carries the load well: it covers the workflow, the effect of each mutating op, network shaping rationale, and cleanup. The gap is the unmentioned `state` op and the absence of any indication of what `list`/`state` return.

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

Parameters4/5

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

Schema description coverage is 100% (baseline 3), and the description still adds value by expanding the `preset` table, explaining the `loss` cap and the `direction` in/out semantics narratively, and giving per-op meaning for `list`/`set`/`network`/`stop`. It omits the `state` op entirely, so one enum value is undocumented in prose.

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

Purpose4/5

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

The description names a specific action and resource ("Resizes the Studio viewport to a real device") and separates its four sub-operations. It does not, however, differentiate itself from the closest sibling, `viewport`, which an agent must still disambiguate by inference.

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 states the workflow explicitly (`set` → `screenshot` → look), names companion tools (`playtest` for a running game's HUD, `screenshot`), and gives an imperative cleanup rule (run `stop` when finished) with the cost of skipping it. The sequencing and alternatives leave little to inference.

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