Skip to main content
Glama

Roblox VFX Lab

Write a shader, bake it into a Roblox texture, and put it on a ParticleEmitter in Studio. You ask an AI for the effect, or you write it in the browser; the lab renders it on your GPU, checks it, and exports it to your place.

What it is

Roblox runs no custom shaders. A ParticleEmitter, a Beam or a Trail shows a texture, and a flipbook sheet animates that texture. The lab closes the gap: you write the effect as a small WGSL function, the lab renders it on a real GPU, bakes the frames into one PNG sheet, and puts that sheet on your emitter with the right flipbook settings.

flowchart LR
  node["Node<br/>WGSL effect()"] --> render["Render<br/>look, fix, repeat"]
  render --> bake["Bake<br/>PNG sheet + recipe"]
  bake --> upload["Upload<br/>Roblox Studio MCP"]
  upload --> apply["Apply<br/>emitter settings"]
  apply --> preview["Preview<br/>frozen frames in Studio"]

You can use it in two ways:

  • In the browser at nevelstudios.github.io/roblox-vfx-lab. Nothing to install. Open an example, change it, bake it, download the PNG.

  • As an MCP server for an AI client (Claude Code, Claude Desktop, Cursor). The AI writes and fixes the node, reads the quality warnings, and exports the result to Studio. The same lab page runs on your machine and follows every change the AI makes.

Related MCP server: Roblox AI Agents

Try it in 60 seconds

  1. Open the lab in Chrome, Edge, Safari 26 or Firefox 141 on Windows.

  2. The gallery plays every example as Roblox plays it. Press Open on one.

  3. Move a slider in Parameters. The live view on the left changes at once.

  4. Turn Auto bake on. The baked sheet plays beside the live view, frame by frame, as the emitter will show it.

  5. Press Code to see the node. Examples are read-only: press Duplicate to get your own copy, then edit and press Save (Ctrl+S). The editor colours the WGSL and completes names as you type: the vfx_ helpers, the params. of the node and the vfx. frame values (Ctrl+Space opens the list, Tab or Enter takes one). To delete one of your nodes or bakes, point at it in the list and press ×.

  6. In Export, press Download PNG. Upload it in Studio (Asset Manager, or the Texture property of an emitter).

  7. Press Copy under Export and paste the lines into a script, or set the same properties by hand:

emitter.Texture = "rbxassetid://<your id>"
emitter.FlipbookLayout = Enum.ParticleFlipbookLayout.Grid4x4
emitter.FlipbookMode = Enum.ParticleFlipbookMode.OneShot

Your nodes and bakes stay in this browser (IndexedDB). In a private window that blocks storage, the lab still works, and the header says Not saving.

Install the MCP

You need:

  • Node.js 22 or later.

  • A GPU with D3D12 (Windows), Metal (macOS) or Vulkan (Linux). The lab renders with Dawn, the WebGPU engine of Chrome.

  • Roblox Studio, only to export. The lab uses Roblox's own Studio MCP server for the upload and for every change in your place, so it needs no plugin of its own. In Studio, turn on the MCP server in the Assistant's MCP settings (Roblox's guide).

Claude Code

claude mcp add roblox-vfx-lab -- npx -y github:NevelStudios/roblox-vfx-lab

Claude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json)

{ "mcpServers": { "roblox-vfx-lab": { "command": "npx", "args": ["-y", "github:NevelStudios/roblox-vfx-lab"] } } }

Restart the client. When the library (~/roblox-vfx-lab) has no shaders/ folder yet, the first start copies the examples into it. Then try:

Open the VFX lab page for me, then make a blue electric hit spark for a sword: a 4x4 OneShot sheet, additive.

Your first effect

This is what a full run looks like. You say what you want; the AI calls the tools.

  1. You: "Make a shock ring for a ground slam, white so I can tint it, 4x4 OneShot."

  2. The AI reads vfx_guide, then writes shaders/impact/slam-ring.wgsl with vfx_shader_write. The answer has the compiler's problems with line and column, so a broken node gets fixed before anything renders.

  3. It calls vfx_render and looks at the frames as one image. It reads the stats under the image (edge alpha, coverage, white share) and fixes what the warnings name with vfx_shader_edit.

  4. You watch on the lab page (vfx_viewer gives the URL): every write shows at once, and you can move the sliders yourself.

  5. vfx_bake writes bakes/impact/slam-ring.png and its recipe .json.

  6. You: "Upload it and put it on the emitter I selected." The AI calls vfx_upload (public, moderated and permanent, so it asks first), then vfx_apply with the flipbook settings.

  7. vfx_preview plays the emitter in the Edit viewport and freezes it at chosen moments, so the AI can look at the effect in your scene.

On the local page you can do steps 5 and 6 yourself: select a part, an attachment or an emitter in Studio, and press Export to Roblox. The lab asks before it uploads, then sets the texture on the selected emitters, or makes a new ParticleEmitter under the selected part or attachment.

Writing nodes

A node is WGSL with one function. uv is 0..1 inside the frame, y up. Return straight RGBA: alpha is the shape, and RGB stays near white so the emitter's Color tints it.

fn effect(uv: vec2f) -> vec4f

What a node can read:

Name

Meaning

vfx.phase

0..1 across the clip. OneShot: the last frame is 1. Loop: 1 is the next loop's frame 0.

vfx.time, vfx.duration

Seconds into the clip, and its length.

vfx.frame, vfx.frames

This frame and the frame count.

vfx.px

One output pixel in uv units, for crisp edges.

params.<name>

A value from a @param line.

Parameters are comments. Each one becomes a slider or a colour field on the page:

// @param width f32 0.02..0.3 = 0.12 ring width
// @param tint color = #ffd27a

The types are f32, vec2f, vec3f, vec4f and color, 15 at most. The helpers (all vfx_) cover shapes (vfx_circle, vfx_ring, vfx_segment, vfx_box), edges and light (vfx_fill, vfx_glow), easing, polar coordinates, hashes, noise (vfx_noise, vfx_fbm, vfx_loop_fbm for seamless loops) and Worley cells. The full list is in src/guide.md.

A ring that grows and fades:

// @param width f32 0.01..0.2 = 0.06
fn effect(uv: vec2f) -> vec4f {
  let p = vfx_center(uv);
  let t = vfx.phase;
  let d = vfx_ring(p, 0.8 * vfx_ease_out(t), params.width * (1.0 - 0.6 * t));
  return vec4f(vec3f(1.0), vfx_fill(d, vfx.px * 1.5) * (1.0 - vfx_ease_in(t)));
}

A smoke puff that loops with no jump:

fn effect(uv: vec2f) -> vec4f {
  let p = vfx_center(uv);
  let n = vfx_loop_fbm(p * 2.5, vfx.phase, 1.5, 5);
  let shape = vfx_fill(length(p) - 0.62 - n * 0.22, vfx.px * 2.0);
  return vec4f(vec3f(0.8), shape);
}

Quality rules

Every render and bake measures each frame and warns about the usual faults. The page shows the warnings under Bake; the AI reads them in the tool answer.

  • Keep the shape inside the frame. Alpha on the frame edge makes a hard cut line in game. The edge stat must be 0 or close to it (the warning starts above 0.02). Only a tiling still for a Beam or a Trail may touch the edge.

  • Nothing ends on a cut. Fade over a long band (about 0.62 to 0.93 of the radius), and check the bake over the light backdrop too.

  • Frame 0 must read alone. Devices that turn flipbooks off show only frame 0.

  • Every frame changes. A sheet that grows and then holds plays as a still image.

  • A loop does not jump from its last frame to its first. Use vfx_loop_fbm or sin(phase * VFX_TAU).

  • Little is full white. A bright core and a fainter body read better than a flat white shape.

  • Fill the frame. Empty space spends pixels on nothing.

Roblox export

  • FlipbookLayout comes from the grid (Grid2x2, Grid4x4, Grid8x8). FlipbookMode is OneShot (once over the particle's Lifetime) or Loop at FlipbookFramerate.

  • Roblox plays a flipbook at 30 fps at most. A loop of 64 frames takes 2.13 s, whatever its duration says. The page warns when a loop goes over 30 fps.

  • LightEmission 1 is additive: dark pixels vanish, good for light. 0 is alpha blend: the alpha shape shows, good for smoke and ink.

  • A flipbook plays only on a ParticleEmitter. A Beam or a Trail takes a still: bake it with margin 0 so it tiles along the beam, then scroll it with TextureSpeed.

  • Roblox scales images above 1024 px down. A still that must be sharper (a big sky object) bakes with tiles 2..4 into several 1024 PNGs, laid out as ImageLabels in one BillboardGui.

Examples

Every example ships as a node, a baked PNG and its recipe in examples/. Download them from the gallery, or use them in your own place as they are.

Preview

Example

Sheet

Target

Green portal: a lumpy green disk with painted spiral arms that wind into a bright eye, a lime rim and white specks

4x4 loop, 1.5 s

ParticleEmitter, LightEmission 0.2

Black hole: ray-traced; a thick accretion disk lensed over and under the shadow, Doppler beaming and a photon ring

4x4 loop, 2 s

ParticleEmitter, LightEmission 0

Tools reference

Tool

What it does

vfx_guide

The node rules, helpers, quality rules and Roblox settings, by topic.

vfx_shader_list

Every node in the library with its hash and state.

vfx_shader_read

One node's source, hash, problems and parameters.

vfx_shader_write

Creates or replaces a node (replaces names the hash it overwrites).

vfx_shader_edit

Changes a node by exact text replacements, all or nothing.

vfx_render

Renders frames, chosen phases or a parameter sweep as one image, with stats and warnings.

vfx_bake

Writes the final PNG (still or 2x2, 4x4, 8x8 sheet at 256, 512 or 1024) and its recipe.

vfx_upload

Uploads a bake through Roblox's Studio MCP and records the asset id.

vfx_apply

Sets the texture and flipbook settings on instances, or makes a new emitter.

vfx_preview

Plays emitters in the Edit viewport and freezes them at chosen moments for screenshots.

vfx_delete

Deletes a node or a bake (its PNG and recipe) from the library.

vfx_viewer

Starts the local lab page and answers its URL.

Configuration

Variable

Default

Meaning

VFX_LAB_LIBRARY

~/roblox-vfx-lab

The library folder: shaders/ for nodes, bakes/ for PNGs and recipes.

VFX_LAB_PORT

4518

The port of the local lab page (127.0.0.1 only).

ROBLOX_STUDIO_MCP

Windows: cmd.exe /c %LOCALAPPDATA%\Roblox\mcp.batmacOS: /Applications/RobloxStudio.app/Contents/MacOS/StudioMCP

The command that starts Roblox's Studio MCP. Use double quotes around a path with spaces.

Troubleshooting

no GPU adapter: Dawn found no D3D12, Vulkan or Metal device. The machine has no GPU the lab can use (a VM or a server with no GPU driver). Update the GPU driver, or run the lab on a machine with a GPU.

no Roblox Studio MCP found at .... Studio is not installed, or it never ran on this account. Install Studio and open it once. If Studio is somewhere else, set ROBLOX_STUDIO_MCP to the command that starts its MCP server.

Roblox's Studio MCP did not start or exited. Open Studio with a place, and turn on its MCP server in the Assistant's MCP settings. The next call starts the Studio MCP again.

no Studio is connected: open a place in Roblox Studio. The Studio MCP runs, but no place is open. Open one. With two Studio windows open, the page asks which one to use.

macOS. The lab looks for the Studio MCP at /Applications/RobloxStudio.app/Contents/MacOS/StudioMCP. If Studio is in another folder, set ROBLOX_STUDIO_MCP.

port 4518 is taken by another program. Set VFX_LAB_PORT to a free port. A lab that already runs on that port is used as it is.

The page says the browser has no WebGPU. Use Chrome, Edge, Safari 26 or Firefox 141 on Windows. Without WebGPU, the gallery and finished bakes still play, but nodes do not render live and bakes do not run.

Windows: the client cannot start npx. Some clients start commands without a shell. Use "command": "cmd", "args": ["/c", "npx", "-y", "github:NevelStudios/roblox-vfx-lab"].

The hosted lab and other NevelStudios pages. Every page under nevelstudios.github.io shares one browser origin, so they share storage. The lab keeps its data in the IndexedDB database roblox-vfx-lab and in vfx: keys.

How it works

  • GPU worker. The MCP renders with Dawn (the webgpu package) in a child process. Dawn prints errors on stdout and a runaway shader can hang the device, so the child keeps both away from the MCP stream. A call over 60 s stops the worker, and the next call starts a new one.

  • Shared modules. src/core.js (parameters, shader assembly, layout), src/pixels.js (dilate, stats, PNG and APNG) and src/bake.js (the bake itself) have no Node APIs. The MCP and the browser run the same code, so a sheet baked in the browser has the same pixels as one baked by the MCP.

  • Local mode. vfx_viewer starts the page on 127.0.0.1. The page reads and writes the library on disk, and a file watcher pushes every change to the page. Only the page's own origin can post to it.

  • Hosted mode. On GitHub Pages there is no server. The examples are read-only files of the site, your nodes and bakes live in IndexedDB, and bakes run on the browser's WebGPU. Export to Roblox needs the Studio MCP, so it runs only on the local page.

  • Studio. The lab starts Roblox's Studio MCP as a child process at the first call that needs Studio, and talks to it with list_roblox_studios, upload_image, execute_luau and screen_capture. The Luau it runs is fixed code in src/studio-ops.luau; your values reach it as data, never as code.

Contributing

npm ci
npm test
npm run smoke

npm test runs the unit tests (no GPU needed). npm run smoke bakes every example on your GPU and checks that each one is clean. npm run examples writes the example PNGs, recipes and previews again after you change a node.

Issues and pull requests are welcome. Keep new examples original, with no warnings in their bake.

License

MIT, see LICENSE. Made by Nevel Studios.

Available Tools

12 tools
vfx_applyA

Puts an uploaded bake (or any texture id) on instances in Studio, with the flipbook settings a sheet needs (FlipbookLayout, FlipbookMode, FlipbookFramerate for a loop) on a ParticleEmitter; Texture on a Beam, Trail or Decal, TextureID on a MeshPart. targets: existing instances; create: { parent, name?, className? } makes a new one (default ParticleEmitter). properties: more values set in the same call (same format as set_properties).

NameRequiredDescriptionDefault
bakeNoAn uploaded bake; its recipe gives the flipbook settings
createNo
targetsNo
textureNoA texture id instead of a bake (no flipbook settings)
studio_idNoStudio id from Roblox's list_roblox_studios; optional when one Studio is open
propertiesNo

TDQS

A3.6/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It does disclose that this mutates Studio state, can create new instances, and requires a studio_id when multiple Studios are open — meaningful behavioral context. It says nothing about whether existing textures are overwritten, what happens with partially invalid targets, or what the call returns.

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?

Purpose is front-loaded in the first clause and the rest is dense, useful parameter guidance with no filler. The run-on construction and stacked parentheticals make it slightly harder to scan than it needs to be.

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 6-parameter mutation tool with no annotations and no output schema, the description covers targeting, instantiation, per-class property mapping, and extra property setting. The notable remaining gap is the absence of any statement about return values or failure behavior, which matters given there is no output schema.

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?

At 50% schema coverage with 6 params (one nested), the description compensates well: it distinguishes bake (flipbook settings come from the recipe) from texture (no flipbook settings), explains targets vs create semantics, gives the default className, and states that properties uses the same format as set_properties. Only studio_id and parent path syntax are left to the schema.

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?

Opens with a specific verb and resource ("Puts an uploaded bake ... on instances in Studio") and enumerates the class-specific property each target type receives (ParticleEmitter flipbook fields, Texture on Beam/Trail/Decal, TextureID on MeshPart). That level of specificity clearly separates it from vfx_bake and vfx_upload, though it never names those siblings.

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

Usage Guidelines3/5

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

It explains the internal mode split well — "targets: existing instances; create: { parent, name?, className? } makes a new one (default ParticleEmitter)" — and clarifies bake vs raw texture. It does not state prerequisites such as needing a prior vfx_bake/vfx_upload, nor when to prefer vfx_preview or vfx_viewer, so usage is implied rather than routed.

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

vfx_bakeA

Renders a node into its final PNG: grid 1 (a still) or a 2x2, 4x4 or 8x8 flipbook sheet at size 256, 512 or 1024, or a still sharper than Roblox's 1024 cap as tiles x tiles PNGs of size px (bakes/--), to lay out in one gui, supersampled, straight alpha with the colour spread into transparent pixels (no dark halos). Writes bakes/.png and bakes/.json (the recipe: node, hash, values, grid, mode, duration, stats, warnings, uploads). Answers the paths, the flipbook settings, the warnings and a preview over the dark backdrop. Upload it with vfx_upload.

NameRequiredDescriptionDefault
ssNoSamples per pixel axis (1..4); default 3 for render, 4 for bake
outNoBake name, default the node name
gridNoCells per side: 1 still, 2, 4 (default) or 8
modeNooneshot (default): frames span phase 0..1 inclusive; loop: phase 1 wraps to frame 0
nameYesNode name in the library, like ring/shock (letters, digits, _ and -)
sizeNoSheet px, default 1024 (with tiles: each tile's px)
tilesNoStill only: render tiles x size px and split it into tiles x tiles PNGs, <out>-<row>-<col> (row 1 at the top). Default 1
marginNoEmpty border inside each cell, as a share of the cell (0..0.25), default 0.02; 0 for tiling textures
valuesNoParameter values for this call only: { glow: 2, tint: "#ffaa33", tilt: [0.2, 0] }
durationNoClip length in seconds (vfx.time = phase * duration), default 1

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses file side effects and exact write paths (bakes/<out>.png, bakes/<out>.json), the recipe contents, alpha/colour-spread handling, supersampling and returned warnings plus a preview. It omits whether an existing bake with the same name is overwritten and gives no sense of render cost or time limits.

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

Conciseness3/5

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

The verb and output are front-loaded, but the body is a single sprawling sentence with triple-nested parentheses describing layouts and file naming, which is hard to parse on first read. Nothing is irrelevant, but the structure should have been split into discrete sentences or bullets.

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 10-parameter mutation with a nested values object and no output schema, the description covers the returns (paths, flipbook settings, warnings, preview) and the artifact layout thoroughly. The remaining gaps are overwrite semantics and cost, which matter for a tool that writes files.

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 still adds meaning the schema does not, notably the 'sharper than Roblox's 1024 cap' tiling use case and the bakes/<out>-<row>-<col> naming for tiles. It says nothing extra about ss, margin, mode, values or duration, so not a full 5.

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?

Opens with a specific verb and resource ('Renders a node into its final PNG') and enumerates the artifact variants (still, 2x2/4x4/8x8 flipbook, tiles x tiles). The word 'final' implicitly separates it from preview/render siblings, but it never names vfx_render or vfx_preview to make that distinction explicit.

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

Usage Guidelines3/5

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

Gives a clear downstream step ('Upload it with vfx_upload') and implies use when you need exported assets rather than previews. It offers no explicit when-not guidance and no comparison against vfx_render or vfx_preview, leaving the agent to infer which sibling to pick.

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

vfx_deleteA

Deletes a node (shaders/.wgsl) or a bake (bakes/.png and its recipe) from the library for good. Only on the developer's request: there is no undo. A bake stays when its node is deleted, and an uploaded asset stays on Roblox.

NameRequiredDescriptionDefault
kindYes
nameYesNode name in the library, like ring/shock (letters, digits, _ and -)

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it declares irreversibility ('no undo') and non-cascading side effects (a bake survives node deletion, the Roblox asset survives). It omits behavior on failure (missing name), permission requirements, and what confirmation/response to expect.

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?

Two sentences, no filler. The destructive action is front-loaded and the constraints follow, so the agent reads the risk before the conditions.

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 destructive two-parameter tool with no annotations and no output schema, the definition covers scope, target formats, irreversibility, and survival of related artifacts. Missing only error/failure behavior and any confirmation return semantics.

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 only 50% (the enum for 'kind' is undocumented in the schema), but the description compensates by explaining both enum values and what 'name' refers to in each case. This adds real meaning beyond the schema rather than restating 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?

States a specific verb (deletes) plus both resource variants it handles, and maps each to a concrete file path (shaders/<name>.wgsl vs bakes/<name>.png plus recipe). This clearly separates it from the read/write/upload siblings.

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?

Gives an explicit gate: 'Only on the developer's request', which tells the agent not to invoke it speculatively. It does not name an alternative (e.g. which tool to use instead to remove or revert a shader), leaving that inference to the sibling list.

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

vfx_guideA

How to write, render, bake, upload, apply and preview VFX lab nodes (WGSL baked into Roblox textures). Without section: the index and the overview. Sections: overview, node, helpers, examples, quality, roblox. Read overview and node first.

NameRequiredDescriptionDefault
sectionNo

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose useful behavior, namely that omitting the section parameter returns the index and overview. However, it does not state that the tool is read-only/side-effect free, nor characterize the response size or format of each section.

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?

Three short sentences, front-loaded with the purpose and followed by the default-behavior rule and the recommended reading order. The fragment style ('Without section: ...') is slightly awkward but wastes no space.

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 single-parameter documentation tool with no output schema, the description supplies purpose, valid values, default behavior, and reading order. It does not say what each section actually contains, which would help an agent jump straight to the right section instead of reading overview and node first.

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

Parameters5/5

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

Schema coverage is 0% (a bare untyped 'string'), so the description must compensate, and it does: it enumerates every valid section value (overview, node, helpers, examples, quality, roblox) and defines the default behavior when the parameter is omitted. This is exactly what an agent needs and is not available anywhere else.

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 states specific content: it covers writing, rendering, baking, uploading, applying and previewing VFX lab nodes as WGSL baked into Roblox textures, and that it returns a guide by section. This is clearly separable from siblings like vfx_render or vfx_bake, which perform those actions. It never uses an explicit verb like 'returns documentation', so the exact nature of the response is inferred rather than stated.

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?

'Read overview and node first' gives explicit sequencing guidance for a guide tool. The default behavior with no section is also given. It stops short of stating when to consult this versus calling the sibling operation tools directly, which would be the final piece of routing guidance.

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

vfx_previewA

Plays the ParticleEmitters at or under targets in the Edit viewport and freezes them (TimeScale 0) at each moment in at (seconds after the emit), then captures the screen: one image per moment. Burst emitters (Enabled false) emit EmitCount (attribute, default 1, or emit) after EmitDelay; Enabled emitters run from empty. The camera frames the emitters unless camera_position and look_at_position are given. TimeScales are restored after.

NameRequiredDescriptionDefault
atNo1..8 moments in seconds, default [0.1, 0.3, 0.6]
emitNoParticles per burst emitter, overriding EmitCount
targetsYes
studio_idNoStudio id from Roblox's list_roblox_studios; optional when one Studio is open
camera_positionNo
look_at_positionNo

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses the TimeScale 0 freeze, that TimeScales are restored afterward, how burst (Enabled false) versus enabled emitters emit, and that the camera auto-frames unless camera_position/look_at_position are supplied. It does not cover permissions, whether the viewport state is otherwise disturbed, or failure behavior, which keeps it below 5.

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 dense sentences, each carrying distinct information (action, emitter timing rules, camera behavior, cleanup), with the main action front-loaded. No filler sentences.

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

Completeness3/5

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

There is no output schema, and the description does not say what the captured images are returned as (paths, base64, a viewer handle) or how multiple moments map to results. Everything else an agent needs for a 6-parameter, 1-required tool is present, so this is one real gap rather than a general shortfall.

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 50%, yet the description explains the semantics of the under-documented parameters: 'at' as the moments after emit, 'emit' as a per-burst override of EmitCount, 'targets' as emitters at or under the given paths, and that camera_position/look_at_position override auto-framing. Only studio_id is left to the schema, which documents it adequately.

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?

States a concrete verb chain and resource: plays ParticleEmitters under targets in the Edit viewport, freezes them at each moment, and captures one screen image per moment. That is far more specific than a restated name and clearly separates it from siblings like vfx_upload or vfx_delete. It never explicitly distinguishes itself from the closest siblings (vfx_render, vfx_viewer), so it falls short of a 5.

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

Usage Guidelines2/5

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

There is no statement of when to choose this tool over vfx_render or vfx_viewer, no precondition for calling it, and no exclusion. The only usage signal is the implicit 'Edit viewport' / open-Studio requirement, which the agent has to infer from the studio_id parameter.

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

vfx_renderA

Renders a node on the GPU and shows it as one image, cells in reading order with grey lines between them. Default: the clip as a flipbook would play it (frames cells across phase 0..1). phases: chosen moments instead. sweep: { param, from?, to?, count?, phase? } renders one f32 parameter across a range (default its own range) at one phase. Answers per-cell stats (coverage, peak, edge alpha, full-white share, change) and, for a clip, the quality warnings. backdrop: dark (default, how it reads in game), light, checker, or alpha (the shape as grey). The file is not changed.

NameRequiredDescriptionDefault
ssNoSamples per pixel axis (1..4); default 3 for render, 4 for bake
modeNooneshot (default): frames span phase 0..1 inclusive; loop: phase 1 wraps to frame 0
nameYesNode name in the library, like ring/shock (letters, digits, _ and -)
sizeNoImage width in px, 128..1024, default 512
sweepNo
framesNoCells across the clip, 1..64, default 16
marginNoEmpty border inside each cell, as a share of the cell (0..0.25), default 0.02; 0 for tiling textures
phasesNo1..64 phases in 0..1
valuesNoParameter values for this call only: { glow: 2, tint: "#ffaa33", tilt: [0.2, 0] }
backdropNo
durationNoClip length in seconds (vfx.time = phase * duration), default 1

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden and discloses key traits: GPU rendering, non-destructive behavior ('The file is not changed'), per-cell stats, quality warnings, and backdrop choices. It still omits operational traits such as performance or auth requirements, which prevents a full 5.

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

Conciseness4/5

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

The description is front-loaded and dense with useful details, avoiding filler. Its semicolon-heavy style makes some mode distinctions harder to scan, but every sentence contributes information.

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 an 11-parameter rendering tool with nested sweep and no output schema or annotations, the description covers the essential modes, output stats, quality warnings, and non-mutation. It is not fully exhaustive about every parameter, but the schema supplies most remaining details.

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 at 82%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: the phases mode, the sweep object's purpose and defaults, and the backdrop options. It does not add much for ss, size, frames, margin, values, or duration, but the added nested-object guidance is valuable.

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 gives a specific verb and resource: 'Renders a node on the GPU and shows it as one image,' with concrete grid behavior. It indirectly distinguishes itself from write-oriented siblings by saying 'The file is not changed,' though it does not name alternatives.

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

Usage Guidelines3/5

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

It explains the default flipbook behavior, when phases are useful, and what sweep does, which implies usage contexts. However, it never explicitly says when to choose vfx_render over vfx_preview, vfx_bake, or other siblings, nor does it state exclusions.

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

vfx_shader_editA

Changes a node by exact text replacements, applied in order to the latest version, all or nothing. Each old must occur exactly once, or at least once with all: true. Answers the new hash and the verdict; the source is not echoed back.

NameRequiredDescriptionDefault
nameYesNode name in the library, like ring/shock (letters, digits, _ and -)
editsYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does well: it discloses ordering, atomicity ('all or nothing'), the uniqueness precondition on each old, the matching exception via all: true, and explicitly warns that the source is not echoed back. It stops short of permissions, conflict/retry semantics on concurrent edits, or whether the hash can be used as a precondition.

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 sentences, front-loaded with the operation and its atomicity, then the precondition, then the return contract. Every sentence carries non-redundant information.

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 an unannotated mutation tool with no output schema, the description supplies the return shape (new hash + verdict), the atomicity guarantee, and the precondition. The main residual gap is concurrency: 'latest version' hints at a race but no stale-hash or conflict behavior is described.

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 coverage is only 50% (the edits array items have no field descriptions), and the description compensates substantially by defining the occurrence constraint on 'old' and the meaning of 'all: true'. However, it never explicitly defines 'new' as the replacement text nor whether it may be empty to delete a match, so a gap remains.

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?

States a specific verb and resource: changes a node via exact text replacements, applied in order to the latest version. That distinguishes it in spirit from a full-rewrite sibling like vfx_shader_write, but no sibling is named, so the agent still has to infer the split.

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

Usage Guidelines3/5

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

The mechanics imply the usage case (targeted text substitution rather than wholesale writes), but the description never says when to pick this over vfx_shader_write or vfx_shader_read, and gives no guidance on retry/conflict behavior when operating on 'the latest version'.

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

vfx_shader_listA

Every node in the VFX library ($VFX_LAB_LIBRARY, default ~/roblox-vfx-lab/shaders): its hash, state (clean, or problems at line:column) and parameters with type, range and default. Compiles each on the GPU.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description must carry the burden, and it does surface meaningful traits: the library path resolution via $VFX_LAB_LIBRARY with a default, the problem-reporting format (line:column), and the side effect/cost that it compiles each shader on the GPU. It stops short of stating read-only safety explicitly or the latency/abort behavior when a compile fails.

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?

Two sentences, no filler, and the scope (whole library) is front-loaded before the detail about returned fields and the GPU compile note. Every clause carries information an agent would otherwise have to guess.

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?

Because there is no output schema, the description must describe the return payload, and it does: hash, state (clean or line:column problems), and per-parameter type/range/default. For a zero-param listing tool that is nearly complete; only the GPU compile cost and failure behavior are left underspecified.

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 tool takes zero parameters and the schema is an empty object, so there is nothing parameter-level to document. Baseline 4 applies; the description adds the only relevant configurability context, the $VFX_LAB_LIBRARY environment variable.

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?

"Every node in the VFX library" is a specific scope plus a resource, and the sentence enumerates the returned fields (hash, state, parameters). It implicitly contrasts with single-shader tools like vfx_shader_read by saying "every node," but it never names a sibling or explicitly draws the boundary.

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

Usage Guidelines3/5

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

Usage is only implied: it is obviously the tool to call when you want the whole library enumerated. There is no explicit when-to-use statement, no exclusion such as "for one shader use vfx_shader_read," and no note on whether calling it repeatedly is costly because every shader is compiled.

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

vfx_shader_readA

A node's source, its hash (what vfx_shader_write's replaces names), its state and problems, and its parameters.

NameRequiredDescriptionDefault
nameYesNode name in the library, like ring/shock (letters, digits, _ and -)

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the returned surface area: source, hash, state/problems, and parameters. It says nothing about read-only safety guarantees, behavior when the node is missing, or permission requirements, leaving meaningful gaps.

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?

A single front-loaded sentence covering the return surface with no filler. The parenthetical 'what vfx_shader_write's replaces names' is grammatically garbled and slightly hard to parse, which keeps it from a 5.

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?

No output schema exists, so the description must convey what comes back, and it does enumerate source, hash, state, problems, and parameters. It is largely complete for a one-parameter read tool, with only error/missing-node behavior left unstated.

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 coverage is 100%, and the schema already documents the name format ('ring/shock, letters, digits, _ and -'). The description adds only the possessive 'a node's', so baseline 3 is appropriate.

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

Purpose4/5

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

The description names the resource (a node) and enumerates what it surfaces: source, hash, state, problems, and parameters, which distinguishes it from vfx_shader_write/vfx_shader_edit. The retrieval verb itself is only implied by the tool name rather than stated, so it falls short of a clean verb+resource statement.

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

Usage Guidelines3/5

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

Using 'a node's' implies single-node retrieval versus vfx_shader_list's enumeration, and the hash parenthetical ties it to vfx_shader_write, so usage is inferable. But there is no explicit when-to-use, when-not-to-use, or named alternative (e.g., 'to see all nodes use vfx_shader_list').

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

vfx_shader_writeA

Creates a node, or replaces one whole. Replacing needs replaces: the hash from vfx_shader_read or your last write or edit; if the file changed since, nothing is written and the current hash comes back. Answers the new hash and the verdict (state, problems with line:column in your source, parameters). Read vfx_guide node first.

NameRequiredDescriptionDefault
nameYesNode name in the library, like ring/shock (letters, digits, _ and -)
sourceYesWGSL that defines fn effect(uv: vec2f) -> vec4f
replacesNo

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses optimistic concurrency behavior, that stale writes are rejected, the new hash is returned, and that verdict details include state and line:column problems. It does not cover permissions, side effects, or whether replacement is reversible.

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 front-loaded: creation/replacement semantics first, then the hash requirement, then return behavior, then the prerequisite guide. Every sentence adds useful information with no filler.

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 write tool with no annotations and no output schema, the description is nearly complete: it explains the mutation model, concurrency guard, returned hash/verdict, and prerequisite guide. The main remaining gap is that it does not discuss permissions or broader side effects.

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 67%, and the description fills the main gap by explaining that 'replaces' must be a hash from vfx_shader_read or the last write/edit, plus what happens if the hash is stale. Name and source are already described in the schema, so the description adds targeted value rather than repeating them.

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 states a specific verb and resource: creates a node or replaces one whole. The phrase 'replaces one whole' implicitly distinguishes this from partial editing via vfx_shader_edit, but it does not explicitly name or contrast the sibling 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 provides clear context for replacement: you must pass a hash from vfx_shader_read or your last write/edit, and the write is skipped if the file changed. It also directs the agent to read vfx_guide first. It does not explicitly say when to use this versus vfx_shader_edit for partial changes.

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

vfx_uploadA

Uploads a baked PNG through Roblox's own Studio MCP (upload_image, under the Studio user's account) and records the asset id in the recipe. Uploads are public, moderated and permanent: only on an explicit request, after the look is settled. The same PNG is never uploaded twice: the recorded id comes back unless force is true.

NameRequiredDescriptionDefault
bakeYes
forceNo
studio_idNoStudio id from Roblox's list_roblox_studios; optional when one Studio is open

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that uploads are public, moderated and permanent, that they require an explicit request, that they run under the Studio user's account, and that duplicate uploads are suppressed unless force is true. This is unusually complete for a mutation tool with no annotation coverage.

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 compact sentences, front-loaded with the core action and followed by the critical safety and idempotency constraints. No sentence is wasted.

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 permanent, public mutation tool with no annotations and no output schema, the description covers the important ground: auth context, moderation, permanence, when to use it, and duplicate handling. The main remaining gap is fuller explanation of the bake parameter, which is only indirectly described.

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 only 33%, so the description must compensate. It adds meaningful semantics for force (bypasses the duplicate-upload check and returns a new id) and implicitly ties bake to the baked PNG, but it does not explain the bake parameter's format or how studio_id is used beyond the schema's own note.

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: uploads a baked PNG via Roblox's Studio MCP and records the asset id in the recipe. That clearly distinguishes it from siblings such as vfx_bake (which produces the PNG) and vfx_render/vfx_preview (which do not publish assets).

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 usage conditions: "only on an explicit request, after the look is settled." That tells the agent when to invoke it and implies when not to, though it does not name a specific alternative tool for other cases.

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

vfx_viewerA

Starts the local lab page (once per machine) and answers its URL, for the artist to open in a WebGPU browser (Chrome, Edge, Safari 26, Firefox 141 on Windows). It renders every node live with WebGPU (play, scrub, parameter sliders, flipbook sheet view, alpha view), has a WGSL editor, plays baked sheets as Roblox plays them, and has Export to Roblox (upload, then apply to the Studio selection). It follows the library live: a node or bake that changes updates the open page. With Auto bake on, the page re-bakes bakes/.png after each change the artist makes. Port: $VFX_LAB_PORT, default 4518.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses once-per-machine startup, the port environment variable and default, live library following, Auto bake behavior, and Export side effects. It does not cover error handling, lifecycle/stopping behavior, or auth, but the core behavior is substantially transparent.

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 front-loaded with the action and return value, then follows with useful feature and behavior context. It is somewhat lengthy and includes a dense feature inventory, but the information is structured and largely 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?

There is no output schema, so the description appropriately explains that it answers the URL, along with port selection and live-update behavior. Its main gap is not clarifying lifecycle or error cases, but it is complete enough to call the tool 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 tool has zero parameters, so the baseline is 4 and no parameter explanation is required. The description correctly avoids inventing parameter semantics and instead focuses on invocation behavior and configuration via environment.

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 states a specific verb and resource: it 'Starts the local lab page' and 'answers its URL', making the core purpose clear. It does not explicitly differentiate itself from siblings such as vfx_preview or vfx_render, so it falls short of full sibling-distinguishing clarity.

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

Usage Guidelines3/5

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

It provides implied usage context ('for the artist to open in a WebGPU browser', 'once per machine') but gives no explicit when-to-use versus alternatives or when-not-to-use guidance. The agent must infer that this is the live interactive viewer rather than the render/preview/bake siblings.

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.

  1. 12 tool updatesv1.0.0
    • First observedvfx_apply
    • First observedvfx_bake
    • First observedvfx_delete
    • First observedvfx_guide
    • First observedvfx_preview
    • First observedvfx_render
    • First observedvfx_shader_edit
    • First observedvfx_shader_list
    • First observedvfx_shader_read
    • First observedvfx_shader_write
    • First observedvfx_upload
    • First observedvfx_viewer

TDQS

A3.9/5.0

Scored across 12 tools

Disambiguation4/5

The tools mostly target distinct stages of the VFX pipeline: node CRUD, GPU render, final bake, upload, Studio apply, Studio capture, and local viewer. The closest overlaps are vfx_render vs vfx_bake and vfx_preview vs vfx_viewer, but the descriptions make the boundaries clear.

Naming Consistency4/5

All tool names use lower snake_case with a consistent vfx_ prefix, which makes the set readable. There are minor deviations: the shader CRUD tools use a shader_ infix while vfx_delete is generic, and vfx_viewer/vfx_guide are noun-like rather than verb-like.

Tool Count5/5

Twelve tools is well within the ideal range and each one maps to a distinct step in the workflow. Nothing appears redundant or padded.

Completeness4/5

The surface covers the full node lifecycle (list/read/write/edit/delete) plus rendering, baking, uploading, applying, previewing, viewing, and guidance. A minor gap is the lack of explicit bake listing/reading tools, though bakes can be inspected through the viewer or filesystem.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to inspect, create, edit, debug, and playtest projects inside the Roblox editor via 29 lean tools, with push-based SSE transport, editor-safe script edits, and batched undoable writes.
    35
    483 npm
    11
    MIT