Skip to main content
Glama
EL4CTEO

Roblox Studio MCP

Roblox Studio MCP

Let an AI agent drive Roblox Studio: read your place, edit scripts, run playtests, take screenshots. 29 tools. MIT.

The Studio MCP panel: a live activity band, a call log with latencies, and the theme drawer open

Install

1. The Studio plugin

npx -y @el4cteo/rbx-studio-mcp --install-plugin

Or download StudioMCP.rbxmx from Releases into your Studio plugins folder.

2. The server, in whichever client you use:

claude mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
codex mcp add roblox-studio -- npx -y @el4cteo/rbx-studio-mcp
{
  "mcpServers": {
    "roblox-studio": {
      "command": "npx",
      "args": ["-y", "@el4cteo/rbx-studio-mcp"]
    }
  }
}
{
  "mcpServers": {
    "roblox-studio": {
      "command": "npx",
      "args": ["-y", "@el4cteo/rbx-studio-mcp"]
    }
  }
}
{
  "mcpServers": {
    "roblox-studio": {
      "command": "npx",
      "args": ["-y", "@el4cteo/rbx-studio-mcp"]
    }
  }
}
{
  "mcpServers": {
    "roblox-studio": {
      "command": "npx",
      "args": ["-y", "@el4cteo/rbx-studio-mcp"]
    }
  }
}
{
  "servers": {
    "roblox-studio": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@el4cteo/rbx-studio-mcp"]
    }
  }
}
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "roblox-studio": {
      "type": "local",
      "command": ["npx", "-y", "@el4cteo/rbx-studio-mcp"],
      "enabled": true
    }
  }
}

3. Open Studio and accept the 127.0.0.1 prompt — the plugin connects automatically. Verify with studio_status.

4. debug additionally needs Debugger Luau API in File → Beta Features, plus a Studio restart. Nothing else requires it.

The Debugger Luau API beta feature toggle in Studio

Port defaults to 44755 — change with --port or ROBLOX_STUDIO_MCP_PORT, and match it in the plugin widget. Loopback only.

Related MCP server: Roblox Studio MCP

Multiple agents

Register the server in as many clients as you like. No extra configuration.

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.

Tools

Session

studio_status list_studios set_active_studio

Discover

tree inspect find api

Scripts

script_read script_edit script_grep script_create

Instances

create modify delete move

World

geometry assets collision undo

Run & debug

playtest execute_luau character input console debug performance

Look

screenshot viewport device

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".

The console panel

Every call is logged with its latency, above a trace of the last forty.

Hover the tab on the right edge for eight themes — Lattice, Observatory, Orbit, Void, Nebula, Aurora, Phosphor, Blueprint. Each redraws the activity band, not just its colours. Your pick is remembered.

Batching

Every write tool takes an array — ten script edits is one call.

tool

takes

cap

create

instances, each nesting children to any depth

100

modify

entries, each with an unlimited list of paths

100 entries

delete

paths

200

move

moves

200

script_edit

edits, across any number of scripts

50

script_create

scripts

50

inspect

paths

50

input

input steps, delivered in order

40

modify caps entries, not targets — one entry can anchor five hundred parts.

Each batch is one Ctrl+Z, and all-or-nothing: a failed match leaves the place untouched.

Why this one

  • 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.

  • Safe script edits. Writes go through ScriptEditorService:UpdateSourceAsync, so your unsaved editor buffer survives.

  • One Ctrl+Z per call. Every batch is a single undo recording.

  • Property names are checked against the running engine's API dump, so a typo comes back as AnchorredAnchored instead of a runtime error.

  • ~16k tokens of schema, cursor-paged and capped, with detail: concise | standard | full.

Not built here: terrain, AI mesh and material generation.

Security

Loopback only. Requires a header a browser cannot set cross-origin, which closes the DNS-rebinding hole. Your experience's "Allow HTTP Requests" setting is untouched.

Development

npm install
npm run build          # TypeScript -> dist/
npm run build:plugin   # plugin/src -> build/StudioMCP.rbxmx
npm run install:plugin # build + copy into the Studio plugins folder
npm test               # plugin (Luau) + bridge (Node) tests

Needs luau, luau-compile and luau-analyze from the Luau releases on PATH or in tools/.

evals/ holds ten questions answerable only by driving a real Studio session — see evals/README.md.

Licence

MIT.

Available Tools

29 tools
apiWhat a class can doA
Read-onlyIdempotent

Lists the properties, methods and events of any Roblox class, read from the engine that is running.

Use it before writing Luau against a class you are not certain of. Guessing a method name costs a runtime error and a round trip; this costs one call and is never out of date, because the answer comes from the running binary rather than from a published dump or from training data. That matters most for exactly the classes worth checking — new ones, and ones that changed recently.

Members come back as signatures rather than bare names — AddAccessory(accessory: Instance), HoldDuration: number — because a name tells you something exists and a signature tells you how to call it, which is the actual question.

describe takes a class name and gives the members it declares itself, counting the inherited ones separately. classes searches class names, which is how to find one whose exact spelling you do not have.

Deprecated members are never listed, only counted — Instance has eight, including clone, remove and getChildren. They still run, so picking one from a list gives you working code and a deprecation warning in the user's output.

This is not the same as inspect. inspect reads the values on an instance that exists; this reads the shape of a class whether or not anything in the place is one — which is what you need when deciding what to create in the first place.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNo'describe' details one class, 'classes' searches class names.describe
includeNodescribe only: which member kinds to return. Defaults to all three; narrow it when you only need one and the class is large.
containsNoclasses only: substring to match, case-insensitive, e.g. "constraint" or "gui". Omit to list everything.
studioIdNoTarget Studio; omit for the active one.
classNameNodescribe only: the class, e.g. "TweenService", "ProximityPrompt", "Humanoid". Case-sensitive.
inheritedNodescribe only: include members inherited from Instance and Object. Off by default because they swamp the answer — ProximityPrompt has 2 methods of its own and 42 inherited, and the two you want are not the ones you already know. The inherited count is reported either way.

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description discloses several crucial behaviors: results come 'from the running binary rather than from a published dump', members return as signatures, deprecated members are 'never listed, only counted', and the `describe` vs `classes` operational split. These are non-obvious traits that directly affect how the tool should be called and interpreted, adding real value over the annotations alone.

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

Conciseness5/5

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

The description is long but every paragraph earns its place. The first sentence states the core purpose, and subsequent paragraphs each cover a single behavioral aspect—freshness, return format, deprecation handling, and relationship to `inspect`—without redundancy. The ProximityPrompt example is illustrative, not filler.

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?

For a 6-parameter tool with no output schema, the description fully covers what an agent needs to know: the return shape (signatures), default behaviors, deprecation semantics, and how to discover class names. There are no missing pieces that would leave an agent guessing how to invoke this correctly.

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?

Even though the schema covers 100% of parameters, the description adds substantial semantic context: it clarifies the two enum values of `op`, explains the `inherited` parameter's default and trade-off with a concrete example ('ProximityPrompt has 2 methods of its own and 42 inherited'), and specifies case-sensitivity of `className`. This goes well beyond what the JSON schema alone provides.

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 opens with a specific verb+resource: 'Lists the properties, methods and events of any Roblox class', and later explicitly differentiates from sibling `inspect` ('This is not the same as `inspect`. `inspect` reads the values on an instance...'). An agent can immediately tell what this tool does and how it differs from closely related tools.

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?

Explicit when-to-use guidance is present: 'Use it before writing Luau against a class you are not certain of.' It also names when not to use it by contrasting with `inspect` ('this reads the shape of a class whether or not anything in the place is one'). This leaves no ambiguity for tool selection.

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

assetsCreator StoreA

Searches Roblox's Creator Store and inserts models into the place.

search looks through the same public index Studio's own asset browser uses and returns ids with names, creators, vote ratios and — the part that matters — whether the model contains scripts. insert puts one into the place by id.

ALWAYS check hasScripts before inserting. Free models carrying scripts are the oldest hazard on the platform, and a model dropped into someone's game can run whatever it likes. The insert reports the script count again, and names them, so it can still be undone.

Only public assets can be inserted. A private or deleted id fails with a message saying so rather than inserting nothing quietly.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes'search' finds assets, 'insert' adds one to the place.
nameNoinsert only: rename it on the way in.
limitNosearch only: how many results.
parentNoinsert only: where to put it. Defaults to Workspace.
assetIdNoinsert only: the asset id to insert.
keywordNosearch only: what to look for, e.g. "medieval door".
categoryNosearch only: what kind of asset. Only models insert as instances.model
positionNoinsert only: where to place it, e.g. "0, 10, 0". Defaults to wherever it was saved.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal mutability (readOnlyHint=false), openness (openWorldHint=true), and non-destructiveness (destructiveHint=false). The description adds meaningful beyond-annotation behavior: search returns hasScripts, insert reports and names scripts so it 'can still be undone,' and private or deleted ids fail with a message instead of silently no-oping. This is useful context not available from annotations.

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

Conciseness5/5

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

The description is compact and well-organized: summary sentence, operation specifics, critical safety warning, and access constraints. Every sentence contributes meaning, with no filler or repetition of schema fields.

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?

Given there is no output schema, the description adequately covers return-relevant behavior: search results include ids, names, creators, vote ratios, and hasScripts; insert reports script count and names. It also communicates the safety check, undo possibility, and failure mode for private/deleted assets. The schema handles parameter detail, so nothing essential is missing.

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%, so the baseline is 3. The description adds value beyond the schema by clarifying that 'Only models insert as instances' for category, that only public assets can be inserted (relevant to assetId), and by reinforcing the op semantics. This lifts it above baseline.

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 opens with a specific verb and resource: 'Searches Roblox's Creator Store and inserts models into the place.' It then clearly distinguishes the two operations, search and insert, and their corresponding outcomes. This separates the tool from unrelated siblings like script_edit or geometry without ambiguity.

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

Usage Guidelines4/5

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

The description gives explicit usage context: search finds assets, insert adds one to the place, and it instructs the agent to 'ALWAYS check hasScripts before inserting.' It also states that only public assets can be inserted. It doesn't name alternatives or exclusions, but no sibling appears to offer a similar capability, so the guidance is strong.

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

characterDrive the player during a playtestA

Moves and acts as the player character in a running playtest, so gameplay can be tested without asking the user to play it.

moveTo walks to a position or to an instance, following a path computed around walls and gaps rather than a straight line into them. It reports whether it ACTUALLY ARRIVED and how far short it stopped — a route blocked by something you did not know about otherwise looks identical to a successful walk.

act does the one-shot things worth testing: jump, sit, stand, respawn, kill (to exercise the death and respawn path), teleport, and equip/activate to use a Tool — which is how combat gets tested, since Activate is exactly what a mouse click triggers. Note that teleport skips everything in between, so triggers and collisions along the route do not fire — walk if you are testing those.

state reports position, health, walk speed and what the humanoid is doing. Call it before and after anything else here.

This drives the Humanoid directly rather than simulating keystrokes, which is the right tool for going places: pathfinding around a wall is one call here and a sequence of guessed key presses otherwise. For anything bound to a control rather than to movement — does E open the door, does the sprint key work, does Escape close the menu — use input, which sends real key and mouse events.

REQUIRES A RUNNING PLAYTEST, and the character lives in the playtest's data model — address these to the playtest's studioId from list_studios, not the editor's. Run mode has no character at all; use playtest op=play.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes'moveTo' walks somewhere, 'act' performs an action, 'state' only reports.
toNoTarget position, e.g. "25, 5, -10". Used by moveTo and by teleport.
pathNomoveTo only: walk to this instance instead of a coordinate.
toolNoequip only: the Tool's name.
actionNoact only: what to do. 'equip' takes a Tool from the Backpack or StarterPack, 'activate' uses it (what a mouse click triggers).
directNomoveTo only: walk straight at the target without pathfinding. Use when a route is reported unreachable but you want to see what happens.
playerNoWhich player, by name. Omit for the only one; needed in a multiplayer test.
canJumpNomoveTo only: allow the path to include jumps.
studioIdNoThe PLAYTEST session's id — not the editor's. See list_studios.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses key behavioral traits: moveTo reports whether it actually arrived and how far short it stopped, teleport skips triggers and collisions, state reports position/health/walk speed/activity, and the tool drives the Humanoid directly rather than simulating keystrokes. This is substantial, operationally important context that the annotations alone do not 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 well-structured with clear sections for moveTo, act, and state, plus a use-case comparison and a requirement note. It is long, but justified given the tool's complexity and nine parameters; it avoids repetition and front-loads the core purpose.

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?

This is nearly a complete operational guide: it gives prerequisites, alternative-tool routing, per-operation behavior, caveats around teleport, parameter relationships, and even suggests calling state before and after actions. It is sufficient for an agent to know when and how to invoke the tool, including the playtest-instance context that could otherwise be a common failure.

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 coverage is 100%, but the description adds real semantic value: it clarifies the purpose of moveTo vs act vs state, documents that equip takes a Tool from Backpack/StarterPack, notes activate corresponds to a mouse click, and explains which operations use the path parameter. It doesn't enumerate every single parameter (e.g., direct and canJump are only lightly touched on), but the extra context meaningfully improves understandability.

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 begins with a specific verb and resource: 'Moves and acts as the player character in a running playtest,' and breaks out the three operations moveTo, act, and state. This makes the tool's scope unmistakable and distinguishes it from sibling tools like input, which is explicitly described as sending real key and mouse events.

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?

The description provides unusually explicit usage guidance: it tells agents to use this tool for movement/character actions, to use input for control-bound interactions, and to use playtest op=play when there is no running playtest. It even explains what to do when a route is unreachable via the direct parameter, as well as to address calls to the playtest studioId from list_studios, not the editor's.

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

collisionCollision groupsA

Controls which parts physically collide with which.

This is the right answer to 'these should pass through each other'. The alternative — turning CanCollide off — disables collision against everything, so a ghost that should pass through walls also falls through the floor.

The order is: create a group, assign parts to it, then set what it is collidable with. A group with nothing assigned does nothing.

Assigning a Model assigns every part inside it, which is almost always what is meant.

Groups are not undoable and not scoped to a session: remove when one was created to try something and is no longer wanted, rather than leaving it registered in the place indefinitely. The built-in "Default" group cannot be removed.

ParametersJSON Schema
NameRequiredDescriptionDefault
withNocollidable only: the other group.
groupNoThe group's name. Required for everything but list.
pathsNoassign only: parts or models to put in the group.
actionNo'list' shows existing groups and changes nothing. 'remove' unregisters a group entirely — not the same as un-assigning parts from it.list
studioIdNoTarget Studio; omit for the active one.
collidableNocollidable only: whether the two groups collide. False makes them pass through.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint: false, etc.), the description discloses important behavioral traits: groups are not undoable, not scoped to a session, and removing unregisters a group entirely. It also explains that assigning a Model assigns all its parts and that a group with no assignments does nothing, adding significant transparency.

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

Conciseness5/5

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

The description is well-structured: it starts with the core purpose, then covers the primary use case and alternative, followed by operational order and caveats. Each sentence adds value with no fluff, making it efficient and easy to follow. Despite being slightly long, it remains concise due to the density of useful information.

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?

Given the absence of an output schema, the description provides enough contextual information for an agent to use the tool correctly. It explains behavior, side effects, constraints (Default group cannot be removed), and the exact sequence of actions. No critical aspect is left unexplained, making it complete for practical use.

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?

The schema descriptions already cover all parameters (100% coverage), so the baseline is 3. The description adds meaningful context by explaining the action flow (create, assign, collidable) and clarifying that 'remove' is not the same as un-assigning parts, which helps interpret the 'action' parameter. This goes beyond the schema but not maximally, so a 4 is appropriate.

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 clearly states the tool's purpose with a specific verb ('Controls') and resource ('which parts physically collide with which'), immediately distinguishing it from sibling tools like geometry or script_edit. It also provides a concrete use-case ('these should pass through each other') and contrasts with the CanCollide alternative, making the purpose unmistakable.

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 explicitly states when to use this tool over the alternative (CanCollide) by explaining the downside of the alternative (ghost falls through floor). It also gives a step-by-step order of operations (create, assign, collidable) and clarifies when to use 'remove' versus un-assigning, leaving no ambiguity about usage scenarios.

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

consoleRead Studio outputA
Read-onlyIdempotent

Reads the Studio Output window — prints, warnings and runtime errors, newest last.

This is how to find out what actually happened after a playtest or an execute_luau call. An error here usually names the script and line, which script_read can then open directly.

Filter with level to see only errors, or pattern to follow one subsystem's logging. Up to 2000 lines are held, so prefer a filter over a large limit.

Each connected session keeps its own log, recorded from the moment its plugin loaded — the editor session and a running playtest server do not share one. To read what a playtest printed, target the playtest's studioId (see list_studios); the editor's log will not have it. Nothing printed before the plugin loaded is recoverable, and output from the playtest client is not reachable at all, because Studio forbids client sessions from making HTTP requests.

A quiet log is not proof nothing was said. Anything the playtest CLIENT printed is never here. Messages Studio itself emits — the ones the Output window attributes to "Studio" rather than to a script — are inconsistent: a failing breakpoint's "Breakpoint ... ignored" does arrive, while the warning that a Script with a non-legacy RunContext inside StarterGui will run multiple times does not. Do not read silence as an all-clear — when a script misbehaves in a way nothing here explains, check the Output window yourself, or ask the user what it says.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoOnly this severity. Omit for everything.
limitNoMaximum items to return (1-500).
patternNoLua pattern the message must match, e.g. "Combat" or "^%[Server%]". Lua patterns escape with %, not backslash.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint annotation, disclosing that logs are kept per session from plugin load, that editor and playtest logs are separate, that client output is never reachable, and that a quiet log does not prove nothing was printed. It even documents inconsistent Studio-originated messages, making its failure modes unusually clear.

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 longer than typical but well organized, front-loaded with core behavior, then filters, then session caveats, then failure modes. A small amount of redundancy exists around client output being unreachable, but the extra detail is necessary for this tool's unusual behavior.

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?

For a read-only diagnostic tool with no output schema, the description covers ordering, filtering, retention, session semantics, and known gaps in coverage. It also tells the agent what to do when results are suspiciously absent, which is exactly the context needed to use the tool correctly.

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?

Although schema coverage is already 100%, the description adds material meaning to each parameter: level is tied to filtering errors, pattern uses Lua patterns, limit interacts with the 2000-line retention cap, and studioId is explained in terms of per-session logs and playtest targeting. This is useful beyond the property descriptions.

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 opens with a specific verb and resource: 'Reads the Studio Output window — prints, warnings and runtime errors, newest last.' It clearly identifies the tool's function and the data it returns, which distinguishes it from siblings like execute_luau or performance.

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?

The description explicitly says this is how to find out what happened after a playtest or execute_luau call, and it directs the agent to script_read for opening error locations and list_studios for targeting the playtest's session. It also gives filtering guidance and warns when the editor log is the wrong source.

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

createCreate instancesA
Destructive

Creates instances with their properties, attributes and tags set at creation, as one undoable step.

Nest with children to build a whole model in a single call. That is both faster and safer than creating a parent and then addressing it: a new instance's path is not knowable until it exists, and same-named siblings make guessing it unreliable.

Property names are checked against the live Roblox API dump before anything is sent to Studio, so a typo comes back with the closest real names rather than an engine error.

Use script_create for Script, LocalScript and ModuleScript — it takes source directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
studioIdNoTarget Studio; omit for the active one.
instancesYesInstances to create together as one undoable step.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that creation is a single undoable step, that property names are validated against the live Roblox API dump before transmission, and that typos return closest real names instead of engine errors. It also warns that an instance's path is unknowable until it exists and that same-named siblings make guessing unreliable. These are meaningful behavioral details not present in annotations.

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

Conciseness5/5

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

The description is four tight sentences with no filler. The core purpose is front-loaded in the first sentence, followed by nested usage rationale, validation behavior, and a sibling-routing instruction. Every sentence earns its place.

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?

Given the rich input schema, relevant annotations, and the absence of an output schema, the description covers what the agent needs: what the tool does, when to use an alternative, how to structure complex creates, and how errors are surfaced. Nothing critical for correct invocation is missing.

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?

The input schema already provides 100% coverage with detailed parameter descriptions, so the baseline is 3. The description adds extra semantic value by explaining why children should be used for building models and how property validation handles typo'd names. It does not duplicate schema content but enhances conceptual understanding of 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 opens with a specific verb and resource: 'Creates instances with their properties, attributes and tags set at creation, as one undoable step.' It clearly differentiates from the sibling by explicitly directing Script, LocalScript, and ModuleScript creation to script_create. The purpose is unambiguous and not a tautology.

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?

The description gives explicit when-to-use guidance: 'Use script_create for Script, LocalScript and ModuleScript — it takes source directly.' It also explains when nesting children is preferable and why, addressing the reliability of addressing newly created instances. This provides strong decision support for selecting between alternatives.

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

debugBreakpoints and runtime inspectionA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes'set' adds breakpoints, 'clear' removes one or all, 'snapshots' reads what has been captured, 'exceptions' controls breaking on errors.
lineNoclear only: which line to remove.
modeNoexceptions only: break on every error, only unhandled ones, or never. Defaults to Unhandled.
pathNoclear only: remove breakpoints from this script. Omit to clear everything.
clearNosnapshots only: discard what is returned, so the next read starts fresh.
limitNosnapshots only: how many of the most recent to return.
studioIdNoTarget Studio; omit for the active one.
breakpointsNoset only: breakpoints to add.

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations, the description discloses critical non-obvious behaviors: breakpoints fire once per run, log expressions cannot see loop control variables, log errors surface in console rather than here, set returns Verified even when the expression fails to compile, and breakpoints never leave a thread stopped. This is exactly the kind of behavioral context annotations alone cannot provide.

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

Conciseness5/5

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

The description is long but earns its length: every paragraph addresses a distinct operational risk or decision point, and the first sentence front-loads the core purpose. The structure moves from what it is, to non-obvious limitations, to cost tradeoffs, to practical placement advice, all without filler.

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?

For a complex tool with no output schema, the description is remarkably complete. It covers all four operations implicitly through parameter behavior, explains what snapshots return, warns about session scoping, and tells the agent to set breakpoints before playtesting. The only omitted details are the exact snapshot output format and exceptions behavior, both of which are partially covered by the schema and less critical than the behavioral warnings provided.

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?

Although schema coverage is 100%, the description adds substantial meaning on top: condition must be a Luau expression evaluated in scope, logMessage is also Luau and not a template string, and line placement matters because certain lines can verify but never fire. These are value-add clarifications an agent could not infer from the schema alone.

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 opening sentence states a specific action and resource: sets breakpoints that capture stack and variables, then reads back the captures. It goes further and explicitly distinguishes itself from a step debugger, making the tool's purpose crisp and differentiated from siblings like console, inspect, and playtest.

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?

The description gives direct selection guidance: use the log form when you know what to watch, and the capture form when you do not. It also tells the agent when this tool is not appropriate (stepping through code) and directs log output to be read through the sibling console.

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

deleteDelete instancesA
Destructive

Destroys instances and everything inside them, as one undoable step.

Deleting a container deletes its whole subtree, so the response reports how many descendants went with each one — check it before telling the user what happened.

Services cannot be deleted and are refused. Paths shift when same-named siblings are removed, so read fresh paths from find or tree before a second delete rather than reusing indexes from an earlier call.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesInstances to destroy, e.g. ["Workspace.OldModel"].
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and non-idempotent that the description reinforces by saying 'Destroys instances and everything inside them.' Beyond that, the description adds crucial behavioral details: it is undoable, it returns a descendant count, services are refused, and paths shift after deletion. This goes well beyond the annotation hints. Slight deduction because it doesn't mention authorization or rate limits, but those are not expected for this tool type.

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

Conciseness5/5

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

The description is concise and front-loaded: the first sentence captures the primary purpose)Skip subsequent sentences add exactly the details an agent needs (consequences, constraints, and pre/post-recommendations) without fluff. Each sentence earns its place, and the structure flows from the what to the how to the caveats.

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?

Given there is no output schema, the description compensates by telling the agent what to expect in the response (descendant count). It also covers the major edge cases (services, path invalidation). It doesn't specify the exact format of the response or error cases, but for a destructive tool this is sufficient. A slight extra note about what happens on invalid paths (e.g., not found) would be helpful, but overall it's complete enough for an agent to use it correctly.

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?

The schema already covers both parameters (paths and studioId) fully (100% coverage), so the baseline is 3. The description adds value by warning that paths are volatile and must be re-read before a second delete, and that services are refused. That's behavioral context on the 'paths' parameter beyond the schema's type/item description, making it more useful for correct invocation.

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 opens with a specific verb and resource: 'Destroys instances' as one undoable step GOVERNED by one verb. It clearly distinguishes itself from the many sibling tools (create, modify, move, etc.) by focusing on destruction and by noting what it does NOT do (services cannot be deleted). Any agent can tell this is the delete operation without reading the schema.

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

Usage Guidelines4/5

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

The description gives concrete usage guidance: it tells the agent to check the response's descendant count, to avoid deleting services, and to re-fetch paths from find/tree after a deletion because paths shift. This substantially helps the agent sequence operations. It doesn't explicitly say when NOT to use this tool relative to alternatives (e.g., vs. move or modify), but it does give clear operational guidance for correct use, so it earns above average.

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

deviceEmulate a phone, tablet or consoleA

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".

stop returns Studio to the normal editor viewport. Do that when you are finished: a left-over emulated device makes every later screenshot the wrong shape, and nothing on screen obviously says why.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNo'list' shows the available devices, 'set' switches to one, 'stop' returns to the normal viewport, 'state' only reports.state
formNolist only: show only devices of this form factor.
deviceNoset only: the device id, e.g. "iphone_16". See `list`.
studioIdNoTarget Studio; omit for the active one.
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.

TDQS

A4.8/5.0
Behavior5/5

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

The description reveals a persistent side effect: leaving an emulated device active makes later screenshots the wrong shape, and nothing on screen obviously explains why. It also clarifies that the tool is the only way to see device-specific interface problems without owning hardware, beyond what the annotations express.

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

Conciseness5/5

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

The prose is economical and front-loaded: the core behavior appears first, followed by a motivating use case and a concrete workflow. The longer explanation about why mobile testing matters earns its place because it clarifies when this tool is indispensable.

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?

The description covers the main operations, the workflow, the list output conceptually, and the necessary stop cleanup. It does not fully specify the exact return shapes of list and state, but with no output schema and strong schema-level parameter descriptions, the remaining ambiguity is minor.

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?

The schema already covers all parameters with detailed descriptions, so the baseline is high. The description strengthens this by showing example ids, mentioning form factor and resolution in list output, and explaining why orientation is worth testing separately.

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 first sentence states the exact verb and resource: it resizes the Studio viewport to a real device, and the opcode enum distinguishes list/set/stop/state. It is clearly separated from sibling tools like viewport and screenshot by framing itself as device emulation.

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?

The description gives an explicit workflow: set a device, screenshot, look, then stop. It recommends pairing with playtest for running-game HUD checks, tells you to use list to find device ids, and says to stop when finished.

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

execute_luauRun Luau in StudioA
Destructive

Runs Luau in Studio's plugin context and returns whatever it printed, returned, or threw.

This is the escape hatch. Reach for it only when no dedicated tool fits — create, modify, delete, move, script_edit and find validate their input, type values from the live API dump, and wrap writes in an undo recording. Code run here does none of that, so a typo becomes a runtime error instead of a suggestion, and changes it makes may not be undoable as one step.

Good uses: reading something no tool exposes, a one-off calculation over many instances, or calling an engine API the tools do not cover.

Output printed while it runs is captured and returned, so print is a reasonable way to get values out. return works too, including returning a table — it comes back as a structure, not a summary. There is no timeout: an infinite loop will hang Studio until it is force-quit.

Against a running playtest server, Studio disables loadstring, so the code is compiled through a ModuleScript instead and runs at script identity — plugin-only APIs are unavailable there. When that happens it is stated in the result rather than left to be inferred from a failure.

Do not use require to read live state out of a running game. This runs in the plugin's own Luau VM with its own module cache, so require here returns a second, freshly-initialised copy of the ModuleScript — its counters and caches read as empty while the real one is running fine, and a zero is indistinguishable from a genuine zero. Read live state off the DataModel instead (instances, attributes, properties), or have the game print it and read that with console. The result warns when a call could have hit this.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesLuau to run. In an editor session this has plugin permissions, so `game`, `workspace` and plugin-only APIs are all reachable.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this as destructive, non-read-only, and non-idempotent, and the description adds substantial behavioral detail on top: no validation, no unified undo recording, no timeout so infinite loops can hang Studio, plugin context behavior, and playtest-mode changes like disabled loadstring and script identity. It even warns about the module cache pitfall with require. There is no contradiction with the annotations.

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

Conciseness5/5

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

The description is long but every paragraph earns its place: summary, usage guidance, output handling, timeout warning, playtest caveat, and require pitfall. It is structured with clear paragraphs and front-loaded with the core behavior, making it easy for an agent to scan and extract the critical warnings.

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?

There is no output schema, so the description correctly explains return values, including printed output, returned tables as structures, and thrown errors. It covers failure modes, permission differences, undo behavior, and live-state hazards, leaving no major ambiguity for an agent deciding whether and how to invoke this dangerous escape hatch.

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 coverage is 100%, so the baseline is 3, but the description adds meaningful context beyond the schema for the source parameter by explaining plugin permissions, playtest identity restrictions, and return behavior via print/return. It does not add much for studioId beyond the schema, but the added source semantics justify a slightly higher score.

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 opens with a specific verb and resource: 'Runs Luau in Studio's plugin context and returns whatever it printed, returned, or threw.' It also distinguishes the tool from siblings by calling it the 'escape hatch' and contrasting it with dedicated tools like create, modify, and script_edit.

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?

The description gives explicit when-to-use guidance: 'Reach for it only when no dedicated tool fits,' and lists concrete good uses such as reading something no tool exposes or calling engine APIs not covered. It also provides a clear exclusion — 'Do not use require to read live state out of a running game' — and points to safer alternatives like reading from the DataModel or using console.

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

findFind instancesA
Read-onlyIdempotent

Searches the data model by name, class, property value and/or tag. Every filter you supply must match, so one call answers questions that would otherwise take several: "anchored BaseParts under Workspace.Map whose name contains door" is a single request.

This replaces separate name / class / property / tag search tools. Prefer it over tree whenever you know what you are looking for.

Tag searches are answered from CollectionService's index rather than by walking the tree, so they stay fast on large places. Narrow with path if a search reports TOO_BROAD.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoCollectionService tag the instance must carry.
pathNoLimit the search to this subtree, e.g. "Workspace.Map". Omit for everything.
limitNoMaximum items to return (1-500).
cursorNoOpaque cursor from a previous call's `nextCursor`. Omit for the first page.
detailNoHow much to return per item. 'concise' = name + class only, cheapest, use when scanning or counting. 'standard' = the properties that matter for most edits. 'full' = every readable property, expensive — use only after you have narrowed to a handful of instances.standard
studioIdNoTarget Studio; omit for the active one.
classNameNoClass or superclass, e.g. "BasePart", "Script".
nameContainsNoSubstring of the instance name, case-insensitive.
propertyNameNoProperty that must exist, e.g. "Anchored". Combine with propertyValue.
propertyValueNoRequired value of `propertyName`, compared as text — "true", "0, 5, 0", "Enum.Material.Neon". Omit to match any instance that has the property.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint), the description discloses important execution behavior: 'Every filter you supply must match' clarifies AND semantics, and 'Tag searches are answered from CollectionService's index rather than by walking the tree, so they stay fast on large places' reveals performance characteristics. It also preempts error handling by advising to narrow with `path` when TOO_BROAD. These details add substantive behavioral context beyond the structured annotations.

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

Conciseness5/5

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

The description is a well-structured paragraph that front-loads purpose, then explains the AND semantics with a concrete example, then provides routing guidance, performance note, and error-handling tip. Each sentence earns its place; there is no fluff. It is compact yet information-dense, appropriate for a tool with 10 parameters.

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?

Given the tool's complexity (10 parameters, no output schema), the description is remarkably complete. It explains the search logic, performance considerations, error handling, and the cost of different detail levels. The annotations already cover safety via readOnlyHint and destructiveHint. An agent has all necessary information to invoke it correctly for a wide range of queries and to interpret potential TOO_BROAD errors.

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 coverage is 100%, so the schema already documents each parameter. The description adds meaning beyond field descriptions: it explains that all supplied filters must match (AND logic), which is not in the schema. It also gives cost guidance for `detail` levels ('concise = name + class only, cheapest... full = every readable property, expensive') and hints at error recovery via `path`. This goes beyond a baseline 3 by enriching understanding of parameter interactions and trade-offs.

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 clearly states the tool's function: 'Searches the data model by name, class, property value and/or tag.' It specifies the resources (data model instances) and the exact search dimensions. It also distinguishes itself from siblings by noting it replaces separate search tools and explicitly positioning itself against `tree`: 'Prefer it over `tree` whenever you know what you are looking for.' This makes its purpose unambiguous and separate from other tools.

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?

The description gives explicit when-to-use guidance: 'Prefer it over `tree` whenever you know what you are looking for.' It also provides troubleshooting advice: 'Narrow with `path` if a search reports TOO_BROAD.' It explains the benefit of combining filters in one call, which clarifies the intended use case for complex queries. While it doesn't enumerate every alternative, it clearly differentiates from `tree` and offers practical direction on when to narrow the search.

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

geometrySolid modellingA
Destructive

Cuts, joins and shatters parts with real constructive solid geometry.

This is how to build a shape that is not a box without importing a mesh: subtract a door out of a wall, union several parts into one solid, intersect to keep only the overlap, fragment to shatter something into debris.

subtract and intersect need the parts to actually overlap, and they fail differently when they do not. intersect returns nothing, which comes back as an error rather than a silent no-op. subtract returns the subject UNCHANGED — a full-size copy of it, reported as a created part — because cutting nothing out of something legitimately leaves it whole. So a subtract that succeeds is not proof that anything was cut: check the positions overlap with inspect first, or compare the result's size against the original.

Results keep the original's material, colour and anchoring. Roblox returns bare grey MeshParts, so a brick wall with a hole cut in it would otherwise come back as a grey slab — correct geometry that looks like a mistake.

The originals are consumed unless keepOriginals is set. The whole operation is one undo step.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes'union' merges, 'subtract' cuts `with` out of `path`, 'intersect' keeps only the overlap, 'fragment' shatters `path` into pieces.
nameNoName for the result. Defaults to the original's.
pathYesThe part being operated on — the one cut from, for subtract.
withNoThe other parts. Required for union, subtract and intersect.
parentNoWhere to put the result. Defaults to the original's parent.
piecesNofragment only: roughly how many pieces to break into.
studioIdNoTarget Studio; omit for the active one.
splitApartNoReturn disconnected chunks as separate parts rather than one.
keepOriginalsNoLeave the input parts in place instead of consuming them.
collisionFidelityNoHow exactly the result collides. Precise is expensive — raise it only for a surface players walk on.Default

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the annotations by disclosing key behavioral details: originals are consumed unless `keepOriginals` is set, the whole operation is one undo step, `subtract` returns the subject unchanged when there is no overlap, `intersect` returns an error on no overlap, and results inherit material/color/anchoring. It even warns about Roblox returning grey MeshParts. This is excellent behavioral disclosure for a destructive tool.

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

Conciseness5/5

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

The description is long but every sentence earns its place. It front-loads the core purpose, then moves through operation examples, failure modes, material preservation, and consumption semantics in a logical order. The caveats about subtract and intersect are high-value and would otherwise be discovered only at runtime.

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?

For a destructive, multi-operation tool with 10 parameters and no output schema, the description covers all critical runtime behaviors: operation semantics, overlap requirements, failure modes, material inheritance, input consumption, undo behavior, and performance trade-offs. The remaining parameter details are already fully documented in the schema, so nothing essential is missing.

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 coverage is 100%, so the baseline is 3. The description adds meaningful semantic context beyond the schema: it explains the failure modes of `subtract` and `intersect`, clarifies that `keepOriginals` affects consumption of inputs, and notes that results retain material/color/anchoring. This helps the agent reason about parameter effects without reading the schema alone.

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 opens with a specific verb and resource: 'Cuts, joins and shatters parts with real constructive solid geometry.' It then enumerates the four operations and gives concrete examples (subtract a door out of a wall, union parts, etc.), which clearly distinguishes this from sibling tools like create, modify, or delete.

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

Usage Guidelines4/5

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

The description explains when this tool is the right choice: 'This is how to build a shape that is not a box without importing a mesh.' It also directs the agent to use `inspect` to verify overlap before subtracting, which is a practical alternative. It does not explicitly list all the sibling tools it should not be used instead of, but the use case is clearly scoped.

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

inputSend keyboard and mouse inputA

Sends real keyboard and mouse input to a running playtest — the same events a person pressing the keys would produce.

This is how to test what character cannot reach. character drives the Humanoid directly, which answers 'can it get to the door'; this answers 'does pressing E open it', 'does the sprint key work', 'does the menu close on Escape' — anything bound to input rather than to movement. Use character for going places and this for controls.

Steps run in order, so a sequence is one call: tap E, wait, click at a point, type a name. hold is how long a key or button stays down, after is how long to wait before the next step — a jump held for a second is a different test from a tapped one.

REQUIRES A RUNNING PLAYTEST, and must be addressed to the playtest's studioId from list_studios, not the editor's.

A pointer is drawn on screen and travels to each target before the click, so the user can see what you are aiming at. Turn it off with cursor: false.

How it works, because it explains the one thing that will surprise you: input belongs to the data model that creates it, and the character is driven by the CLIENT. Sending from the playtest's server succeeds and moves nothing. So this parents a short script into the player's PlayerGui, which runs on their client, and that reports back when the input has actually been delivered. Nothing is reported as sent until the client confirms it. If confirmation never arrives you get an error, not a success — check where things really are with character op="state".

Mouse coordinates are viewport pixels from the top-left, so pair this with screenshot to see what is where before clicking it. The client reads them at an offset the reply reports as landed — aim once, read where it actually landed, then correct. Under an emulated device that offset is large and stops being a simple translation, so re-read it after each click rather than reusing an earlier one.

A text step types into the FOCUSED TextBox. Click the box in the same call, one step before the text, and the focus is taken for you; with no box to type into the step is reported as having done nothing rather than as delivered.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYesInput steps, delivered in order.
cursorNoDraw a pointer on screen that travels to each target before the click, with a ripple where it lands. On by default: synthetic input is otherwise invisible, so the user watching sees effects with no cause, and a click that misses looks identical to one that hit. Turn it off only when recording something where the pointer would be in the way.
playerNoWhich player, by name. Omit for the only one; needed in a multiplayer test.
studioIdNoThe PLAYTEST session's id — not the editor's. See list_studios.

TDQS

A5/5.0
Behavior5/5

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

The description goes well beyond the annotations: it explains that input is delivered through a client-side script, that success is only reported after the client confirms delivery, that errors occur on missing confirmation, that a pointer is drawn on screen, and that coordinate offsets are reported as `landed`. This gives crucial failure-mode and execution-context insight.

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

Conciseness5/5

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

The description is long, but every paragraph adds distinct, non-redundant guidance for a genuinely complex tool. It is front-loaded with purpose and sibling differentiation, then proceeds through prerequisites, visualization, execution semantics, coordinates, and text input in a logical order.

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?

Given the tool's complexity, the description covers prerequisites, error behavior, coordinate space, cursor behavior, timing semantics, and client/server delivery. The schema already documents parameter defaults and constraints, so no essential calling information 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?

Even though schema description coverage is 100%, the description adds substantial meaning: `after` is explained as wait-before-next-step, `action` press/release across steps is clarified, `text` requires a focused TextBox that can be clicked in the same call, and mouse coordinates are tied to viewport pixels and `screenshot`.

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 first sentence states a specific verb and resource: sends real keyboard and mouse input to a running playtest. It also explicitly distinguishes itself from `character` by contrasting input-driven controls with movement/Humanoid-driven behavior, so an agent can tell which sibling to choose.

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?

The description gives explicit when-to-use guidance: use `character` for going places and this for controls. It also states prerequisites (a running playtest, the playtest's studioId from `list_studios`) and explains the intended use of `after`, `hold`, `cursor`, and text focus.

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

inspectInspect instancesA
Read-onlyIdempotent

Reads properties, attributes, tags and children of one or more instances. Pass every path you care about in a single call — batching costs one round trip instead of N.

Property selection comes from the live Roblox API dump for each instance's actual class, so it stays correct across engine updates: concise — class and child count only standard — the properties that characterise the class (Part gets Size, Position, CFrame, Anchored, Material...) full — every readable property; expensive, use on one or two instances at most

Bad paths do not fail the call: they come back under failures while the valid ones still return, so one typo does not cost you the whole batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesInstance paths, e.g. ["Workspace.Baseplate", "Lighting"].
detailNoHow much to return per item. 'concise' = name + class only, cheapest, use when scanning or counting. 'standard' = the properties that matter for most edits. 'full' = every readable property, expensive — use only after you have narrowed to a handful of instances.standard
studioIdNoTarget Studio; omit for the active one.
propertiesNoRead exactly these properties instead of the detail-level default. Use when you want one specific value across many instances.
includeChildrenNoInclude a name/class listing of direct children.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/no-destructive annotations, the description discloses failure isolation (bad paths return under failures), live Roblox API property selection, and the relative cost of detail levels. This materially improves agent prediction of side effects and outcomes.

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

Conciseness5/5

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

The action and top-level batch advice come first, then detail options in scannable bullets, then edge-case behavior. Each sentence adds a distinct fact and the length is proportionate to the tool's complexity.

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?

The description covers failure handling, cost of detail levels, and property freshness, and annotations cover safety. It does not spell out the exact success-response shape (e.g., per-path objects), and there is no output schema, which leaves a minor inference gap for agents.

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 coverage is high (100%), but the description enriches the detail and properties parameters with concrete mode semantics (class/child count, characterizing properties, expensive full mode) and explains batching intent. It doesn't add much beyond schema for paths/studioId/includeChildren, so a modest premium over baseline is appropriate.

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 opens with 'Reads properties, attributes, tags and children of one or more instances', a specific read verb plus a concrete resource. The wording clearly separates this inspect operation from mutation siblings, so an agent can identify the tool's role even before reading schema details.

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

Usage Guidelines4/5

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

It gives strong operational guidance: batch all desired paths into one call, choose detail level by need, and reserve full mode for one or two instances. It does not explicitly mention sibling alternatives like tree/find for when to choose them instead, so it stops short of full alternative routing.

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

list_studiosList connected StudiosA
Read-onlyIdempotent

Lists every Roblox Studio window currently connected to this server, with its studioId, place name, transport (sse or poll), when it connected, and which one is active.

Call this whenever a tool reports AMBIGUOUS_STUDIO, and whenever the user refers to 'the other place' or 'my other window'. With a single Studio open every other tool targets it automatically, so you can skip it then.

Nothing is targeted by default when several are connected: pick one with set_active_studio, or pass studioId to a single tool call to act on one place without changing the default.

Each Studio is queried live, so placeName is the published name the user would recognise. A place never saved to Roblox has no published name and falls back to its data model name ('Place1').

context matters more than it looks. Pressing Play adds a second entry for the playtest's server — same place, same name, same id as the editor session. Instances created or changed in a 'playtest' context are thrown away the moment the user stops, so building there looks like it worked and then vanishes. Target 'edit' unless the user specifically wants to inspect or affect the running game.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark readOnly, idempotent, non-destructive. The description adds crucial behavioral nuances not captured in annotations: 'Each Studio is queried live, so placeName is the published name,' and the playtest context explanation that a second entry appears and its changes are thrown away. It also clarifies that 'no Studio is targeted by default when multiple are connected,' which is a behavioral surprise. No contradiction with annotations.

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 somewhat long but well-organized into four paragraphs that each serve a purpose: listing result details, usage guidance, default targeting, and the playtest caveat. It front-loads the main action and then adds usage nuances. No redundant filler, though it could be tightened slightly. Still, for a tool with multiple gotchas, the length is justified.

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?

Given there is no output schema, the description does the job of explaining return values. It covers the fields returnedholistically. It also covers edge cases (never-saved place name, playtest context) that are essential for correct interpretation. It clearly distinguishes when to use this vs set_active_studio. Fully complete.

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?

There are zero parametersaine; schema description coverage is 100%. The description explains the output structure and the meaning of each field (studioId, placeName, transport, connected time) and the context field. Since there are no params, the description is the sole source of semantic meaning, and it fully explains the tool's behavior.

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 begins with a precise verb and resource: 'Lists every Roblox Studio window currently connected to this server,' then enumerates the exact fields returned (studioId, placeName, transport, connection time). It differentiates from siblings like set_active_studio and studio_status by explaining its role in discovery and the default targeting behavior.

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?

Explicitly states when to call it: after AMBIGUOUS_STUDIO, or when the user references 'the other place'/'my other window'. It also tells when NOT to call it (single Studio open, because others auto-target), and describes the workflow: default is no targeting, so pick with set_active_studio or pass studioId. This is clear decision guidance.

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

modifyModify instancesA
Destructive

Sets properties, attributes and tags on existing instances, as one undoable step.

Each entry takes a list of paths, so one entry can apply the same change to many instances — anchoring 200 parts is one entry, not 200. Combine with find to build the path list.

The batch is all-or-nothing: if any value is rejected the recording is cancelled and every instance reverts, rather than leaving the place half-changed.

Values use the same notation the Properties panel shows — see the properties field. To change a script's code use script_edit.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetsYesChanges to apply together as one undoable step.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint, readOnlyHint), the description discloses important behavior: the batch is one undoable step, it is all-or-nothing, rejected values cancel the recording and revert every instance, and one entry can apply the same change to many instances. This gives agents an accurate model of side effects and failure semantics.

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

Conciseness5/5

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

Four short paragraphs, each with a distinct job: core purpose, batch path behavior, atomicity, and notation/alternative tool. The main capability is front-loaded and every sentence earns its place.

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?

The description covers the essential operational context: batch semantics, failure atomicity, value notation, and the script_edit alternative. There is no output schema, but for a mutation tool the absence of a return-value description is acceptable. Slightly more could be said about success/error responses or prerequisites, but the definition is strong overall.

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 coverage is 100%, so the baseline is 3. The description adds value by explaining that values use the same notation as the Properties panel, that one entry can apply a change to many paths, and that attribute values may need a { type, value } wrapper. These clarifications augment the schema rather than repeat it.

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 opens with a specific verb and resource: 'Sets properties, attributes and tags on existing instances.' It clearly distinguishes itself from siblings like create, delete, and move, and later explicitly distinguishes itself from script_edit. No ambiguity remains about what the tool operates on.

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

Usage Guidelines4/5

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

The description gives clear guidance: use it to set properties/attributes/tags on existing instances, combine with find to build path lists, and use script_edit instead for changing a script's code. It doesn't enumerate when to prefer create/delete/move, but the scope is clear enough for an agent to route correctly.

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

moveMove or clone instancesA
Destructive

Reparents instances, or clones them into a new parent, as one undoable step.

Set mode: "clone" to copy instead of move — that is how to duplicate something, optionally renaming it in the same call.

Moving an instance into itself or its own descendant is refused: it silently detaches the branch from the data model and undo does not bring it back.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesMoves to apply together as one undoable step.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark destructiveHint=true and readOnlyHint=false, so the description doesn't need to restate that. It adds valuable behavioral context beyond annotations: the operation is undoable ('one undoable step'), and it discloses a critical edge case ('Moving an instance into itself or its own descendant is refused: it silently detaches... and undo does not bring it back'). This is genuine extra information that changes how an agent should call it.

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

Conciseness5/5

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

The description is compact (two short paragraphs) and front-loaded with the core purpose. Every sentence earns its place: purpose, mode distinction, and a critical caveat. The critical edge-case warning is placed at the end, clearly separated, which is appropriate since it's a warning rather than primary instruction.

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?

For a tool with 2 parameters, 100% schema coverage, and no output schema, the description covers everything an agent needs: what it does, how to switch modes, what happens on an invalid self-move, and that it's undoable. The annotations cover the destructive nature. Nothing critical is missing for correct invocation.

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 coverage is 100% (all parameters have descriptions in the schema), so baseline is 3. The description adds extra value by explaining the mode semantics ('Set mode: clone to copy instead of move') and tying the 'name' parameter to the clone use case ('optionally renaming it in the same call'). It also explains the 'items' array semantics ('Moves to apply together as one undoable step'). This goes beyond the schema descriptions.

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 clearly states the tool's core function ('Reparents instances, or clones them into a new parent, as one undoable step') and explicitly differentiates 'move' vs 'clone' modes. It names what it operates on (instances) and the key action (reparent or clone), distinguishing it from siblings like 'create', 'delete', or 'modify'.

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

Usage Guidelines4/5

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

The description gives clear context for when to use clone ('that is how to duplicate something') and implies the main use case for moving. It doesn't explicitly list sibling alternatives or say when NOT to use this tool in favor of others, but the context and mode explanation provide useful guidance.

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

performancePerformance and memoryA
Read-onlyIdempotent

Reads the engine's own counters, and can run the script profiler.

snapshot returns what the Developer Console shows: frame, physics and render times in milliseconds, instance and part counts, draw calls, network rates, and memory broken down by category. Use it to answer 'why is this place heavy' with numbers instead of guesses.

profile runs Studio's script profiler — the Script Performance window — for seconds and reports which scripts consumed CPU. It blocks for that long, so keep it short. It only sees code that actually runs, so start a playtest first; profiling an idle edit session returns nothing.

coverage reports which lines of which scripts actually executed — dead code, untested branches, whether a fix was even reached. Pass enable first, then play, then read the coverage back FROM THE PLAYTEST session, not the editor: instrumenting is per data model, and the playtest is a different one. enable is remembered for the place and re-applied by each new session as it loads. Pass an empty enable array to stop.

What it can and cannot see: instrumentation is fixed when a script is first compiled, so it measures modules required after that point — where most game logic lives — but never a script that starts with the place, which the data model compiles before any plugin exists. Those report 0 lines and are named as unmeasurable rather than counted as dead code.

scene breaks the place down by what it is actually made of: instances by category, triangles and draw calls, and the assets holding script, animation and audio memory — each named, so "2.4GB of memory" becomes "this animation is 138KB and these are the Animators using it". It also reports UNPARENTED INSTANCES, which is the closest thing here to a leak detector: objects still alive with nothing holding them in the tree, invisible to find and to tree because they are in neither.

Frame and network figures are only meaningful while something is running. Instance counts and memory are useful in edit mode too.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNo'snapshot' reads counters now; 'profile' samples running scripts; 'coverage' reports which lines have executed; 'scene' breaks the place down by what it is made of.snapshot
enableNocoverage only: scripts to start measuring. Remembered for this place and switched on by every session that loads afterwards, so a playtest instruments them before its scripts run. An empty array stops instrumenting.
secondsNoprofile only: how long to sample. The call blocks for this long.
sectionNoscene only: return just one section instead of all six.
studioIdNoTarget Studio; omit for the active one.
frequencyNoprofile only: samples per second. Higher is more precise and costlier.
includePluginsNoprofile only: include Studio plugins in the results. Off by default — an idle Studio is mostly plugin activity, which buries the place's own scripts.

TDQS

A4.1/5.0
Behavior1/5

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

The description is highly transparent about behavior, including blocking profile calls, per-data-model instrumentation, and the fact that unparented instances are not in the tree. However, it explicitly documents that coverage's `enable` is 'remembered for the place and re-applied by each new session as it loads', which is a persistent side effect, while annotations declare `readOnlyHint: true`. This is an annotation contradiction, so per the rubric this dimension must score 1.

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

Conciseness5/5

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

The description is long but earns every sentence: each paragraph maps to one operation, uses code spans for parameter values, and front-loads the core purpose before diving into caveats. It is dense, well-structured, and contains no filler.

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?

Given the tool's multi-operation complexity and lack of an output schema, the description is remarkably complete. It covers what each operation returns, prerequisites, timing constraints, state persistence, and limitations. Remaining details like `studioId`, `frequency`, and `includePlugins` are adequately covered by the input schema, so nothing essential is missing.

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 coverage is already 100%, so the baseline is 3. The description adds meaningful behavior beyond the schema: it explains the profile workflow, the coverage lifecycle from enable through playtest session to stop, and the practical caveat that profiling an idle edit session returns nothing. This is enough to push the score above baseline.

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 opening sentence states a specific activity — reading engine counters and running the script profiler — and the description then cleanly differentiates the four operations: snapshot, profile, coverage, and scene. It also distinguishes itself from sibling tools like find and tree by noting that unparented instances are invisible to both, making its unique resource clear.

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?

The description gives explicit when-to-use guidance for each mode: snapshot to answer 'why is this place heavy', profile after starting a playtest, coverage with the enable-then-play-then-read flow, and scene for composition and memory breakdowns. It also states exclusions — idle profiling returns nothing, and scripts compiled before the plugin exists are unmeasurable.

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

playtestRun, pause and stop the simulationA
Destructive

Starts and stops playtests, so scripts can be made to run and then observed without asking the user to press anything.

play is the Play button: a character spawns and Players.PlayerAdded fires. run is Run mode, which executes scripts with no player at all. multiplayer starts a test with several players for testing replication. state reports without changing anything.

Pressing play adds a SECOND connected session for the playtest's server, and that is where the running game lives — console, performance and execute_luau must target its studioId, not the editor's. Call list_studios after starting and look for the entry whose context is a playtest.

A test does not block this call: it starts and the reply reports the state reached. Studio only ends it when something inside calls StudioTestService:EndTest(value) or when stop is used here; whatever EndTest passed comes back as lastResult on a later state. That makes a scripted check possible end to end: args is readable inside the test via StudioTestService:GetTestArgs(), so a test can be told what to do and report back what happened.

Stopping discards everything the playtest changed, exactly as pressing Stop does. Build in edit mode, then play — not the other way round.

The reply says whether the mode actually moved, not merely that Studio accepted the request.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes'play' starts a playtest with a character, 'run' runs scripts with no player, 'multiplayer' starts a several-player test, 'stop' ends it and discards its changes, 'state' only reports.
argsNoValue handed to the test, readable inside it with `StudioTestService:GetTestArgs()`. Use it to tell a test which case to exercise.
playersNomultiplayer only: how many players to start.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare openWorldHint=true and destructiveHint=false (though the tool stops/discards state). The description goes further: it states that play adds a second connected session hosting the game, that the call is non-blocking and reports the reached state, that stop discards changes exactly like pressing Stop, and that EndTest's value surfaces as lastResult. This is rich behavioral detail beyond the annotation flags, though it doesn't enumerate failure modes or edge cases (e.g., what happens if stop is called before any test).

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

Conciseness5/5

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

Dense but every sentence earns its place: op semantics up front, then async behavior, then studioId routing, then stop/EndTest contractholics. No filler, well-organized into scannable paragraphs.

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?

Comprehensive for a control tool. It explains non-blocking behavior, side effects of stopping, how to discover the right studio, and the return-value semantics. Minor gaps: no failure modes or preconditions (e.g., must be in edit mode for play), and no mention of auth, but the description is unusually complete for the domain.

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?

Even though the schema already documents all 4 parameters at 100% coverage, the description adds substantial semantic value: it explains the async nature of the reply ('returns the state reached'), how args is consumed inside the test, and the meaning of the state operation as a pure reporter. That goes beyond the schema's enumerations and helps an agent avoid misusing op as a blocking call.

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 uses specific verbs ('starts', 'stops', 'reports') tied to a clear resource ('playtests') and enumerates the five op values with distinct one-line meanings. It distinguishes the modes play/run/multiplayer and singles out state as read-only, so an agent can tell them apart without opening the schema.

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?

Explicitly explains when to use play vs run vs multiplayer, warns that stop is the only way to end a test besides EndTest, and instructs calling list_studios after starting so console/performance/execute_luau target the playtest's studioId. This is actionable routing guidance with no ambiguity.

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

screenshotSee the Studio viewportA
Read-onlyIdempotent

Takes a picture of the Studio viewport and returns it as an image you can actually look at.

Every other tool here reads the data model — names, properties, numbers — which answers 'is it there' but never 'does it look right'. A part can be at the correct position, anchored, correctly sized, and still be buried inside a wall, facing backwards, or hidden behind a GUI. Take a screenshot after building something visual, and before reporting that it worked.

It captures the viewport as the user currently sees it, so it shows their camera angle, not a framing of your choosing. Frame the subject with viewport op="focus" first — that is what makes this tool worth calling.

Works during a playtest too — address it at the playtest's studioId and you get the player's own view, which is the only way to check what a GUI actually looks like in front of the game. That one is taken on the client and read back through the editor session, so it is a little slower and needs the editor window still connected; the caption says playtest client when it came from there.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoWidth to scale the image down to, in pixels; height follows the viewport's aspect ratio. Larger is sharper and costs more — raise it only when you need to read small text.
studioIdNoTarget Studio; omit for the active one.

TDQS

A5/5.0
Behavior5/5

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

Annotations cover read-only and idempotent safety, and the description adds non-obvious context: it captures the user's current camera angle, behaves differently during playtest (slower, needs editor connection), and marks playtest captures with the caption `playtest client`. No contradiction with annotations.

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

Conciseness5/5

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

The description is front-loaded with the core action, then organized into when-to-use, camera behavior, and playtest caveats. Every sentence earns its place, including the illustrative wall/backwards/GUI examples that justify why a screenshot is needed.

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?

Even without an output schema, the description explains the return is an image, warns about playtest latency and editor connectivity, and names the required `viewport` sibling interaction. An agent has enough context to invoke it correctly in both normal and playtest scenarios.

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?

The schema already documents both parameters at 100% coverage, and the description adds beyond it: width guidance about sharpness versus cost, and studioId semantics for targeting a playtest client. This helps the agent choose parameter values, not just understand names.

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 ('Takes a picture of the Studio viewport') and immediately distinguishes itself from sibling tools that 'read the data model.' An agent can tell this is the visual-reality-check tool rather than a data query tool.

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 timing guidance: take a screenshot after building something visual and before reporting success. It also names the prerequisite `viewport op="focus"`, explains when to rely on data tools instead, and covers the playtest scenario with studioId targeting.

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

script_createCreate scriptsA
Destructive

Creates Script, LocalScript or ModuleScript instances with their source.

Batch related scripts into one call: they are created inside one ChangeHistoryService recording, so the user can drop a whole generated system in a single undo. The response says whether that recording was actually opened — Studio refuses while another one is in progress.

Prefer Script with runContext: "Client" over LocalScript in new work — a Script with an explicit RunContext runs wherever you parent it, while LocalScript only runs under a player's character, backpack or PlayerGui.

The exception is the starter containers — StarterGui, StarterPack, StarterPlayerScripts, StarterCharacterScripts. They are COPIED into each player, so a Script with a non-Legacy RunContext there runs once where it sits and again in every copy, while a Legacy one does not run at all. Use LocalScript inside those. Creating one anyway comes back with a warning, because Studio's own warning about it goes to its Output and never reaches console.

Use script_edit to change a script that already exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptsYesScripts to create together as one undoable step.
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that batch creation happens inside a single ChangeHistoryService recording, that Studio may refuse to open another recording, what the response indicates, and how Studio's warning output behaves for `LocalScript` in starter containers. These are meaningful behavioral details not available from the annotations alone. No contradiction with annotations.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then adds the batching/undo behavior, then the nuanced script-type guidance, and finally the sibling routing. Every sentence carries meaningful information and none is redundant with the schema or annotations.

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?

For a creation tool with no output schema, the description covers the most important runtime caveats: undo batching, recording refusal, starter-container behavior, and warnings. It could be slightly more complete by describing the full response shape or error behavior, but the essential invocation context is present.

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 coverage is 100%, so the schema already documents all parameters; the baseline is 3. The description adds valuable semantics for `className` and `runContext`, explaining where `LocalScript` actually runs and how starter containers behave. It does not cover `source`, `disabled`, `parent`, or `studioId`, but those are already described in the schema.

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 opens with a precise verb and resource: 'Creates Script, LocalScript or ModuleScript instances with their source.' It clearly distinguishes itself from the sibling `script_edit` by naming it directly, and the restriction to script classes separates it from the generic `create` sibling.

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

Usage Guidelines4/5

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

It gives explicit routing guidance: 'Use `script_edit` to change a script that already exists.' It also provides strong contextual guidance on when to prefer `Script` with `runContext: "Client"` vs `LocalScript`, including the starter-container exception. However, it does not mention the generic `create` sibling or when that should be used instead, so the alternative-selection guidance is not fully complete.

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

script_editEdit scriptsA
Destructive

Edits Luau source through the Studio script editor. This is the tool to use for any change to existing code.

Every edit in one call is all-or-nothing: the whole batch is resolved against current source before anything is written, so if one edit cannot be applied nothing is. Batch related changes together, even across different scripts.

Each edit picks exactly one mode: find/replace — literal text, not a pattern. Preferred: it survives line numbers shifting. Fails if the text is not unique, unless you set replaceAll, so include enough surrounding lines to pin it down. startLine/endLine + replacement — for line ranges from script_read. Numbers refer to the file as you read it; several line edits to one script are applied bottom-up so they do not shift each other. source — replaces the whole script. Only for small files or a rewrite; it discards anything the user changed since you read it.

Writes go through ScriptEditorService:UpdateSourceAsync, so an open editor tab updates in place and unsaved work is preserved. Undo for source changes is the script editor's own, per script — Ctrl+Z in a script tab reverts that script, not the whole batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
editsYesEdits to apply together as one undoable step.
studioIdNoTarget Studio; omit for the active one.

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations, it discloses critical behavior: all-or-nothing batch semantics, non-unique find refusal, bottom-up application of line edits, preservation of unsaved work, per-script undo scope, and the fact that source replacement discards user changes. No contradiction with the destructiveHint annotation.

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

Conciseness5/5

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

The description is long but earned: the core purpose is front-loaded, the three edit modes are clearly separated, and the implementation and undo details are directly relevant to correct use. Every sentence either clarifies a parameter, sets expectations, or prevents misuse.

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?

For a complex, destructive edit tool, the description covers invocation semantics, failure modes, concurrency behavior, and undo behavior comprehensively. No output schema exists, but the agent has everything needed to construct correct calls and predict consequences.

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?

Although schema coverage is 100%, the description adds meaningfully to the parameters: it explains the three mutually exclusive edit modes, why find is literal, when replaceAll is needed, how line numbers relate to a previous script_read, and what source replacement implies. This goes well beyond the schema's property descriptions.

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 action — editing Luau source through the Studio script editor — and explicitly frames it as the tool for any change to existing code. This clearly distinguishes it from creation or read-only tools like script_create and script_read.

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 ('the tool to use for any change to existing code') and provides mode-level selection guidance: find/replace is preferred, line ranges come from script_read, and source replacement is only for small files or rewrites. This is actionable and reduces guesswork.

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

script_grepSearch script sourceA
Read-onlyIdempotent

Searches inside Luau source across the place and returns matching lines with their paths and line numbers.

Use this to find where something is defined or used before editing it — it is far cheaper than reading whole scripts to look for one call.

Patterns are Lua patterns, which are not regular expressions: % escapes instead of backslash, there is no alternation, and - means a lazy quantifier. Set literal to search for text exactly as written, which is usually what you want for identifiers.

Matches come from the script editor's live buffer, so unsaved edits are searched too.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoLimit to this subtree, e.g. "ServerScriptService". Omit to search everywhere.
limitNoMaximum items to return (1-500).
cursorNoOpaque cursor from a previous call's `nextCursor`. Omit for the first page.
literalNoTreat `pattern` as plain text rather than a Lua pattern.
patternYesLua pattern, or exact text when `literal` is set, e.g. "PlayerAdded".
studioIdNoTarget Studio; omit for the active one.
classNameNoRestrict to one script class: "Script", "LocalScript" or "ModuleScript".
ignoreCaseNoCase-insensitive. Both sides are lowercased, so pattern classes like %u stop being meaningful — combine with `literal`.
contextLinesNoLines of context to show either side of each match.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description doesn't need to repeat those safety attributes. The description adds valuable behavioral detail about the live buffer ('unsaved edits are searched too') and the return format (matching lines with paths and line numbers), enhancing transparency beyond the annotations.

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

Conciseness5/5

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

The description is concise and well-structured: it opens with the core function, then explains when to use it, clarifies the pattern vs. literal distinction, and closes with the live buffer behavior. Each sentence contributes unique useful information without redundancy, and the flow is logical.

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?

Given the complexity (9 parameters, no output schema), the description covers all essential aspects: the return format, the search scope, the pattern semantics, and a key behavioral caveat (live buffer). Combined with the thorough schema descriptions, it provides enough context for an agent to correctly invoke the tool without missing critical details.

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?

The schema provides 100% coverage of parameters with descriptions, and the description supplements this by explaining the nuance of Lua patterns (e.g., `%` escaping), the behavior of `ignoreCase` when combined with pattern classes, and the recommendation to use `literal` for identifiers. This goes beyond simply restating the schema.

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 clearly states the tool's function: searching inside Luau source across the place and returning matching lines with paths and line numbers. It uses specific verbs (searches, returns) and specifies the resource (script source). It also implicitly differentiates from sibling tools like 'find' or 'inspect' by focusing on script source content.

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?

The description explicitly advises when to use the tool: 'find where something is defined or used before editing it' and contrasts it with reading whole scripts. It also provides practical guidance on using Lua patterns vs. literal search and the `literal` parameter for identifiers, which is actionable and clear.

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

script_readRead scriptsA
Read-onlyIdempotent

Reads Luau source from one or more scripts, with line numbers that script_edit accepts back verbatim.

Source comes from the Studio script editor's live buffer, so anything the user has typed but not yet saved is included. Reading the saved property instead would hand you stale code and you would 'fix' the change they just made.

Pass every script you need in one call, including when you want a different part of each: an entry may be a bare path for the whole file, or {path, startLine, endLine} for a window into that one script. The top-level startLine/endLine are the default for entries that do not carry their own.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesScripts to read, e.g. ["ServerScriptService.Systems.Combat"] or [{ path: "...Combat", startLine: 120, endLine: 180 }].
endLineNoDefault last line for entries without their own, inclusive. Omit to read to the end.
studioIdNoTarget Studio; omit for the active one.
startLineNoDefault first line for entries without their own, 1-based and inclusive. Omit to start at the top.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already indicate read-only, open-world, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond that: it reads from the Studio editor's live buffer, includes unsaved user edits, and produces line numbers intended for script_edit. This is exactly the kind of non-obvious behavior an agent needs to know.

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

Conciseness5/5

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

The description is tight and well-structured: first sentence states what it does, second explains the live-buffer rationale, third explains batching and windowing. Every sentence adds useful information with no filler, and front-loads the core purpose.

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?

The description covers the tool's behavior, input forms, line-number semantics, and rationale thoroughly. Without an output schema, it does not explicitly describe the exact return format, but 'source with line numbers' plus compatibility with script_edit gives a reasonably clear picture. Minor gap only.

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 coverage is 100%, so the schema already documents each parameter. The description adds meaning by explaining the relationship between top-level startLine/endLine defaults and per-entry windows, and by describing the bare-path versus {path, startLine, endLine} forms. This goes beyond the raw schema definitions.

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 opens with 'Reads Luau source from one or more scripts', which is a specific verb and resource. It also ties to script_edit by noting line numbers are accepted back verbatim, helping an agent understand this is the read counterpart to script_edit rather than a search or write tool.

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

Usage Guidelines4/5

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

It gives strong usage context: pass every script needed in one call, use the live buffer rather than saved property to avoid stale code, and use per-entry or top-level line ranges. It does not explicitly contrast against script_grep or other sibling tools, but it clearly communicates when and why to use this tool.

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

set_active_studioSet active StudioA
Idempotent

Chooses which connected Studio window every other tool targets by default. Use it after list_studios when several places are open, and again whenever the user says to switch to another place.

The choice persists until it is changed or that Studio disconnects. While several Studios are connected and none has been chosen, tools refuse with AMBIGUOUS_STUDIO rather than guessing.

The choice belongs to this MCP connection alone. Several agents can share one Studio, and each keeps its own target, so calling this never moves another client's — two editors, or two sessions, can work on two places at once.

SUBAGENTS SHARE THEIR PARENT'S CONNECTION, and therefore its target. A subagent calling this retargets its parent and every sibling, and the damage is silent: later calls that name no studioId still succeed, just against the wrong place — and if that place is a playtest, everything written there is discarded when it stops. Inside a subagent, pass studioId on each call instead of calling this.

ParametersJSON Schema
NameRequiredDescriptionDefault
studioIdYesA studioId from list_studios.

TDQS

A4.6/5.0
Behavior5/5

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

Although annotations already indicate non-read-only, non-destructive behavior, the description adds substantial beyond-schema context: persistence until changed or disconnected, AMBIGUOUS_STUDIO refusal when no choice exists, per-connection state isolation, and the silent subagent retargeting hazard. This is rich disclosure of consequences beyond any structured field.

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 longer than average, but it is front-loaded with the core purpose and usage, and every later paragraph covers a real behavioral consequence. The subagent warning is verbose but vital; a slight tightening would make it fully concise, so 4 rather than 5.

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?

For a stateful selector with connection-scoped side effects, the description covers the full lifecycle: when to invoke it, what happens while multiple studios are connected, how state persists, and how it interacts with subagents. No output schema is needed, and nothing required to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the only parameter, studioId, is documented in the schema as coming from list_studios. The description reinforces the source and warns subagents to pass studioId directly, but it does not add new format, range, or default semantics beyond what the schema already states. Baseline 3 is appropriate.

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 'Chooses which connected Studio window every other tool targets by default.' It is immediately distinguishable from siblings like list_studios and studio_status because it names the selection role and the effect on other tools.

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?

Usage is explicit: use after list_studios when several places are open, and again when the user asks to switch. It also gives a firm exclusion, telling subagents to pass studioId on each call instead of invoking this tool, which is exactly the kind of when-to-use vs. when-not-to-use guidance an agent needs.

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

studio_statusStudio statusA
Read-onlyIdempotent

One-call snapshot of the connected Roblox Studio: place name and id, whether it is in edit / run / play mode, the current selection, which scripts are open in the editor, and how big the data model is.

Call this FIRST in any Studio session, and again whenever a tool reports NO_STUDIO or TIMEOUT — it is the cheapest way to tell a disconnected plugin apart from a genuinely failing request. Also call it before and after playtest, because most tools behave differently in run mode.

openScripts is what the user is actually working on: for each open tab it gives the script's path, the cursor line, any selected text, and which lines are on screen. Use it whenever a request is deictic — 'this function', 'the script I'm in', 'fix this' — instead of searching the place or asking which file they mean. Studio exposes no focused-tab API, so with several open, prefer the one holding a selection and otherwise ask.

Returns JSON. Selection is capped at 50 entries and selected text at 400 characters; use find or script_read for more.

ParametersJSON Schema
NameRequiredDescriptionDefault
studioIdNoTarget a specific Studio instance. Omit to use the active one (see list_studios / set_active_studio).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark it read-only and safe, and the description adds behavioral limits and caveats: selection is capped at 50 entries, selected text at 400 characters, no focused-tab API exists, and it returns JSON. It also positions the call as the cheapest diagnostic for disconnection, which helps the agent interpret failures.

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

Conciseness5/5

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

Three dense paragraphs front-load the tool's purpose in the first sentence and every subsequent sentence adds decision-relevant detail: sequencing, deictic interpretation, and truncation limits. No filler is present; the length is justified by the absence of an output schema.

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?

The description covers what the tool returns, when to use it, how to interpret openScripts without a focused-tab API, and the truncation behavior that affects agents needing more data. Combined with the read-only annotations and schema-documented studioId, an agent has everything needed to call and interpret this tool correctly.

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

Parameters3/5

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

The single optional studioId parameter is fully documented in the schema itself ('Omit to use the active one'), so the description need not repeat it. The description adds no additional parameter-level meaning, but with 100% schema coverage the baseline 3 is appropriate.

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 opens with 'One-call snapshot of the connected Roblox Studio' and enumerates the exact fields returned: place name/id, edit/run/play mode, selection, open scripts, and data model size. This clearly differentiates it from siblings like list_studios and find by scoping it to the connected Studio session.

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 explicitly instructs the agent to call this tool FIRST in any Studio session, on NO_STUDIO/TIMEOUT, and before/after playtest. It also gives a concrete alternative rule: for deictic requests, use openScripts data instead of searching the place or asking the user, and prefer tabs with a selection. This is the strongest possible usage guidance.

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

treeBrowse hierarchyA
Read-onlyIdempotent

Lists the instance hierarchy under a path, breadth-first to a given depth. Returns a flat array of paths — flat is both cheaper and easier to act on than nested JSON, since every entry is directly usable as a path.

Use this to orient yourself in an unfamiliar place. Use find instead when you already know what you are looking for; a deep tree over a whole place wastes context on instances you will never touch.

With path omitted it lists only the containers a place is authored in — Workspace, ReplicatedStorage, ServerScriptService and friends. Roblox exposes ~120 services at the root, almost all engine internals; those are hidden and the response says how many. Pass an explicit path to look inside one of them anyway.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoDot-notation root, e.g. "Workspace.Map". Omit to list services from the root.
depthNoLevels below `path` to walk. Keep low; each level multiplies the result.
limitNoMaximum items to return (1-500).
cursorNoOpaque cursor from a previous call's `nextCursor`. Omit for the first page.
detailNoHow much to return per item. 'concise' = name + class only, cheapest, use when scanning or counting. 'standard' = the properties that matter for most edits. 'full' = every readable property, expensive — use only after you have narrowed to a handful of instances.standard
studioIdNoTarget Studio; omit for the active one.
classNameNoOnly include instances of this class or a subclass, e.g. "BasePart".
nameContainsNoOnly include instances whose name contains this text (case-insensitive).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations establish readOnly/idempotent/not-destructive, so the safety profile is covered. The description then adds genuinely unexpected behavior an agent would never guess: the ~120 hidden root services, the fact that omitting path lists only authored containers, the hidden-services count appearing in the response, and the flat-over-nested design rationale. This is exactly the kind of domain gotcha the description is the only place to surface.

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

Conciseness5/5

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

Three tight paragraphs with a clear job each: what it returns, when to use it, and the root/path edge behavior. The hidden-services admission—a place where most tools would hide a bug—earns its place in the final sentence. Everything is front-loaded (purpose first), with zero filler or ceremonial language.

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?

For a read-only discovery tool with 100% schema coverage, no output schema, and 0 required parameters, the description covers every decision point an agent faces: what the response shape is, what surprising root behavior exists, how to avoid the find/tree ambiguity, and how cost scales with depth. The pagination and filter params are fully documented in the schema where they belong. The only thing an agent might want to know—the actual return shape—is explained ('flat array of paths'), and the response hint about the hidden-services count is disclosed. Nothing material is missing.

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

Parameters3/5

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

At 100% schema description coverage, the schema carries the parameter-documentation burden, so the baseline of 3 applies. The description reinforces the cost model of `depth` and `detail` in prose, but that's complementary to, not a replacement for, the schema's work. No meaningful gap to compensate for.

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?

Opens with a specific verb and resource ('Lists the instance hierarchy under a path') plus the exact algorithm ('breadth-first to a given depth') and return type ('flat array of paths'). The explicit contrast with the sibling 'find' — 'Use `find` instead when you already know what you are looking for' — provides exactly the sibling differentiation the rubric rewards.

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?

States when to use it ('orient yourself in an unfamiliar place'), when not to use it ('when you already know what you are looking for'), names the alternative explicitly ('use `find` instead'), and gives a cost rationale for the boundary ('wastes context on instances you will never touch'). Textbook when/when-not/alternative coverage.

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

undoUndo and redoA
Destructive

Steps Studio's undo history backwards or forwards.

Every write this server makes is already wrapped in an undo recording, so this reverses your own work as cleanly as the user pressing Ctrl+Z — one tool call is one step. Use it when the user says an edit was wrong, instead of trying to reconstruct the previous state by hand, which is guesswork and usually incomplete.

It reports how many steps actually applied, which is not always what was asked: the stack runs out, and an undo that did nothing otherwise looks exactly like one that worked.

Studio's history covers the whole session, including the user's own edits — undoing more steps than you made will start reverting THEIR work. Undo only what you just did, and only when asked.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsNoHow many steps to take. Keep it to what you did yourself.
actionNo'status' reports what is available without changing anything.status
studioIdNoTarget Studio; omit for the active one.

TDQS

A4.8/5.0
Behavior5/5

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

The annotation `destructiveHint: true` is already declared, but the description meaningfully adds context: it discloses the partial-failure behavior ('the stack runs out, and an undo that did nothing otherwise looks exactly like one that worked'), clarifies that the server's own writes are pre-wrapped in undo recordings, and warns that the history 'covers the whole session, including the user's own edits.' These are important behavioral traits that annotations alone cannot convey. There is no contradiction between description and annotations.

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 moderately long, but every paragraph earns its place — it fronts the core statement of what it does, then explains when to use it, then the critical edge case, and finally the safety warning. Nothing is wasted, and for a destructive tool, the added length is fully justified. It could be tightened slightly, but the density of information is well-matched to the risk profile.

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?

For a tool with no output schema, the description's disclosure that 'It reports how many steps actually applied' is essential return-value context. The description covers the full picture — the mechanics, the failure modes (stack exhaustion), the risks (resetting user work), and the safety guardrail — while the parameters and annotations are all declared. The tool's complexity (3 params, a destructive flag, no nested objects) is thoroughly addressed. There is no meaningful gap an agent would need to resolve before calling this correctly.

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?

With 100% schema description coverage, the schema already documents all three parameters completely, so the baseline is 3. The description adds extra value by explaining the edge case relevant to the `steps` parameter — that over-requesting is possible and will silently return fewer steps, and by clarifying how the `action: 'status'` semantics let the caller inspect before mutating. It would have been a 5 with even more explicit per-parameter cross-referencing, but this exceeds the baseline.

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 clearly states the tool's purpose: 'Steps Studio's undo history backwards or forwards' — a specific verb with an explicit resource and scope. It differentiates this from other operations by explaining what it reverses and why ('as cleanly as the user pressing Ctrl+Z — one tool call is one step'). Even though it's named just 'undo', the title 'Undo and redo' plus the description make the full scope clear.

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?

The description provides explicit usage conditions: 'Use it when the user says an edit was wrong, instead of trying to reconstruct the previous state by hand, which is guesswork and usually incomplete.' It also sets clear boundaries with 'Undo only what you just did, and only when asked', and explains the danger case where undoing beyond your own edits will revert the user's work. This is exactly the kind of when-to/not-to guidance that an agent needs.

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

viewportViewport and selectionA
Idempotent

Works with the 3D view and the Studio selection.

select sets, extends or shrinks what is highlighted in Studio. Select what you just built or changed — it shows the user the result, and puts the instance under Studio's own move and scale handles. studio_status reports the current selection; this sets it.

focus aims the Studio camera at an instance and frames it so the whole thing is on screen. This is what makes screenshot worth having: a picture of wherever the camera happened to be answers nothing, while a picture of the thing you just built answers 'does it look right', which no amount of reading properties can. Build, focus, screenshot.

The distance is computed from the subject's size and the camera's field of view, so a doorway and a whole map both arrive filling a similar share of the frame. from changes the angle you view it from, and padding how tightly it is framed.

camera sets or reads the camera directly, for shots framing cannot express — standing inside a room, or looking along a corridor.

raycast fires a ray through the world and reports the first thing it hits, with position, surface normal, distance and material. This answers 'what occupies this space', which the data model alone cannot: use it to find the ground under a spawn point, or check whether a gap is clear before placing something.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNofocus only: look at this point instead of an instance, e.g. "0, 10, 0".
opYes'focus' points the camera at something and frames it, 'camera' sets it explicitly, 'select' changes the Studio selection, 'raycast' queries the world.
fromNofocus only: direction to view from, e.g. "0, 1, 0" for directly above or "1, 0, 0" from the side. Defaults to a raised three-quarter view.
modeNoselect only: replace the selection, extend it, or remove from it.set
pathNofocus only: the instance to look at. A model, part, or folder containing them.
pathsNoselect only: instances to select. An empty array clears the selection.
ignoreNoraycast only: instances the ray passes through.
lookAtNocamera only: the point to aim at.
originNoraycast only: where the ray starts, e.g. "0, 50, 0".
paddingNofocus only: how much room to leave around the subject. 1 is tight.
positionNocamera only: where to put the camera, e.g. "0, 20, 30".
studioIdNoTarget Studio; omit for the active one.
directionNoraycast only: which way it points, e.g. "0, -1, 0" for straight down.
fieldOfViewNocamera only: field of view in degrees. Lower is more zoomed in.
maxDistanceNoraycast only: how far to look, in studs.

TDQS

A3.5/5.0
Behavior3/5

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

The description discloses that 'select' sets the selection (versus 'studio_status' reporting) and explains the effect of 'focus' on the camera. However, it inaccurately claims 'camera' can both 'set or read' the camera, while the schema only defines parameters for setting. This minor inconsistency and lack of side-effect discussion leaves some ambiguity.

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

Conciseness2/5

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

The description is excessively long and employs a repetitive, poetic style (e.g., 'Build, focus, screenshot.'). It could be condensed to a few clear sentences without losing meaning. This violates the principle of being appropriately sized and front-loaded.

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?

The description thoroughly explains the purpose and reasoning behind each operation, including why 'focus' is necessary for screenshots and why 'raycast' is useful for queries. It covers all operations and their parameters contextually, leaving no major gaps for an agent to misunderstand the tool's functionality.

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

Parameters3/5

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

The input schema already provides complete parameter descriptions (100% coverage). The tool description adds minimal extra semantic value—it mentions defaults for 'from' and 'padding' but repeats schema info. Per the rubric, a baseline of 3 is appropriate when schema coverage is high and the description adds little.

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 clearly states the tool's domain (3D view and Studio selection) and enumerates the four operations (select, raycast, focus, camera). However, it is more verbose than necessary and includes a stray reference to 'studio_status' that could confuse, so it doesn't reach a perfect 5.

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

Usage Guidelines4/5

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

The description provides usage context by comparing to sibling tools: it contrasts with 'studio_status' for selection reporting, and implies using 'focus'/'camera' before 'screenshot'. This is helpful but not as explicit as naming when to use each operation versus alternatives.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.3.7
    • Changedinput1 field changed
      • changedInput schema / properties / steps / items / properties / text / description
        Previous value: -"text only: the string to type."New value: +"text only: the string to type. Goes to the focused TextBox — click it first, in the same call."
  2. 2 tool updatesv0.3.5
    • Changedcreate3 fields changed
      • addedInput schema / definitions / __schema0 / properties / attributes / additionalProperties / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "properties": {
        +      "type": {
        +        "description": "Roblox type to store the attribute as. Needed for anything but a plain string, number or boolean — a bare string stays a string.",
        +        "enum": [
        +          "string",
        +          "boolean",
        +          "number",
        +          "BrickColor",
        +          "CFrame",
        +          "Color3",
        +          "ColorSequence",
        +          "Font",
        +          "NumberRange",
        +          "NumberSequence",
        +          "Rect",
        +          "UDim",
        +          "UDim2",
        +          "Vector2",
        +          "Vector3"
        +        ],
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "The value, written as the Properties panel shows it: \"0, 5, 0\".",
        +        "type": [
        +          "string",
        +          "number",
        +          "boolean"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / definitions / __schema0 / properties / attributes / additionalProperties / type
        Removed value: -[
        -  "string",
        -  "number",
        -  "boolean"
        -]
      • changedInput schema / definitions / __schema0 / properties / attributes / description
        Previous value: -"Attributes to set, as name → value. An empty string removes one."New value: +"Attributes to set, as name → value. A bare string, number or boolean is stored as-is; for any other type pass { type, value }, e.g. { type: \"Vector3\", value: \"0, 5, 0\" }. An empty string removes an attribute."
    • Changedmodify3 fields changed
      • addedInput schema / properties / targets / items / properties / attributes / additionalProperties / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "properties": {
        +      "type": {
        +        "description": "Roblox type to store the attribute as. Needed for anything but a plain string, number or boolean — a bare string stays a string.",
        +        "enum": [
        +          "string",
        +          "boolean",
        +          "number",
        +          "BrickColor",
        +          "CFrame",
        +          "Color3",
        +          "ColorSequence",
        +          "Font",
        +          "NumberRange",
        +          "NumberSequence",
        +          "Rect",
        +          "UDim",
        +          "UDim2",
        +          "Vector2",
        +          "Vector3"
        +        ],
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "The value, written as the Properties panel shows it: \"0, 5, 0\".",
        +        "type": [
        +          "string",
        +          "number",
        +          "boolean"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "value"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / targets / items / properties / attributes / additionalProperties / type
        Removed value: -[
        -  "string",
        -  "number",
        -  "boolean"
        -]
      • changedInput schema / properties / targets / items / properties / attributes / description
        Previous value: -"Attributes to set, as name → value. An empty string removes one."New value: +"Attributes to set, as name → value. A bare string, number or boolean is stored as-is; for any other type pass { type, value }, e.g. { type: \"Vector3\", value: \"0, 5, 0\" }. An empty string removes an attribute."
  3. 1 tool updatev0.3.0
    • Changedscript_read5 fields changed
      • changedInput schema / properties / endLine / description
        Previous value: -"Last line to return, inclusive. Omit to read to the end."New value: +"Default last line for entries without their own, inclusive. Omit to read to the end."
      • changedInput schema / properties / paths / description
        Previous value: -"Script paths, e.g. [\"ServerScriptService.Systems.Combat\"]."New value: +"Scripts to read, e.g. [\"ServerScriptService.Systems.Combat\"] or [{ path: \"...Combat\", startLine: 120, endLine: 180 }]."
      • addedInput schema / properties / paths / items / anyOf
        Added value: +[
        +  {
        +    "description": "A script path, read in full.",
        +    "type": "string"
        +  },
        +  {
        +    "properties": {
        +      "endLine": {
        +        "description": "Last line of the window for this script, inclusive.",
        +        "maximum": 9007199254740991,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "path": {
        +        "description": "The script to read.",
        +        "type": "string"
        +      },
        +      "startLine": {
        +        "description": "First line of the window for this script, 1-based and inclusive.",
        +        "maximum": 9007199254740991,
        +        "minimum": 1,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "path"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / paths / items / type
        Removed value: -"string"
      • changedInput schema / properties / startLine / description
        Previous value: -"First line to return, 1-based and inclusive. Omit to start at the top."New value: +"Default first line for entries without their own, 1-based and inclusive. Omit to start at the top."
  4. 2 tool updatesv0.2.9
    • Changedcreate4 fields changed
      • removedInput schema / definitions / __schema0 / properties / attributes / additionalProperties / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  }
        -]
      • addedInput schema / definitions / __schema0 / properties / attributes / additionalProperties / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
      • removedInput schema / definitions / __schema0 / properties / properties / additionalProperties / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  }
        -]
      • addedInput schema / definitions / __schema0 / properties / properties / additionalProperties / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
    • Changedmodify4 fields changed
      • removedInput schema / properties / targets / items / properties / attributes / additionalProperties / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  }
        -]
      • addedInput schema / properties / targets / items / properties / attributes / additionalProperties / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
      • removedInput schema / properties / targets / items / properties / properties / additionalProperties / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "boolean"
        -  }
        -]
      • addedInput schema / properties / targets / items / properties / properties / additionalProperties / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
  5. 29 tool updatesv0.1.8
    • First observedapi
    • First observedassets
    • First observedcharacter
    • First observedcollision
    • First observedconsole
    • First observedcreate
    • First observeddebug
    • First observeddelete
    • First observeddevice
    • First observedexecute_luau
    • First observedfind
    • First observedgeometry
    • First observedinput
    • First observedinspect
    • First observedlist_studios
    • First observedmodify
    • First observedmove
    • First observedperformance
    • First observedplaytest
    • First observedscreenshot
    • First observedscript_create
    • First observedscript_edit
    • First observedscript_grep
    • First observedscript_read
    • First observedset_active_studio
    • First observedstudio_status
    • First observedtree
    • First observedundo
    • First observedviewport

TDQS

A4.1/5.0
Disambiguation5/5

Every tool occupies a distinct niche, and the closest pairs are explicitly cross-referenced and differentiated: character vs input (humanoid driving vs keystrokes), api vs inspect (class schema vs instance values), find vs tree (search vs hierarchy walk), create vs script_create (instances vs source code). A few pairs are adjacent — create/script_create, studio_status/list_studios, viewport/screenshot — but none would plausibly cause an agent to select the wrong tool if descriptions are read, and the docs work hard to make those boundaries explicit.

Naming Consistency3/5

Coherent subgroups exist — bare-verb CRUD (create, modify, delete, move, undo), a script_ prefix family (script_create/read/edit/grep), and snake_case studio verbs (list_studios, set_active_studio, studio_status) — but the convention is not uniform. Single-noun tools (console, debug, viewport, api, assets, device, collision) sit alongside compound verbs (execute_luau), and instance operations use no analogous verb_prefix while script operations do. The inconsistency is not chaotic, but an agent cannot reliably predict a tool name without checking the list first.

Tool Count3/5

Twenty-nine tools is genuinely heavy — above the rubric's 25-tool ceiling — but the scope here is enormous: a full bidirectional bridge into a complete game development IDE covering data model editing, scripting, playtesting, debugging, profiling, input simulation, device emulation, asset browsing, and the API reference. Each tool earns its place, and the count reads as a deliberately decomposed surface rather than feature bloat, though some consolidation (e.g., screenshot folding into viewport, collision into modify) would not be missed.

Completeness4/5

The lifecycle coverage is exceptional: instances have read (find/tree/inspect), create, update, delete, move, and undo; scripts have create/read/edit/grep; and the testing loop is fully covered (playtest, input, character, console, debug, performance, screenshot, device). Notable gaps are minor — there is no explicit save/publish tool and no script-specific delete (handled via the generic delete), plus chunked outputs are capped (selection at 50, console at 2000 lines) — but every core workflow an agent would need is present with no dead ends.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI coding tools to control Roblox Studio for workspace exploration, instance manipulation, and script management. It provides tools for playtesting, scene rendering, and integration with the Roblox Creator Store.
    6
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to control Roblox Studio by running Luau code, creating and editing instances, reading the scene tree, and managing scripts via an MCP server with a long-polling plugin bridge.
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to interact with Roblox Studio via a token-efficient MCP server, live two-way script sync, and zero-friction plugin setup.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/EL4CTEO/rbx-studio-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server