roblox-studio-mcp

Installation
SKILL.md

Roblox Studio MCP: remote-controlling Studio

The Studio MCP lets you run code inside a live Studio, inspect/modify the datamodel, screenshot, and generate content. This is the toolbox reference; for the disk→Rojo→test dev LOOP see the roblox-studio-workflow skill.

Connecting (and fixing a dead link)

  • Studio dials OUT to the MCP hub and registers its tools. If Studio never connects, the MCP answers with 0 tools — ToolSearch/mcp__Roblox_Studio__* find nothing.
  • Enable it in Studio: Assistant panel → Assistant Settings → "Enable Studio as MCP server". A green indicator under "Manage MCP Servers" = connected. Docs: create.roblox.com/docs/studio/mcp
  • Dead-link fixes (in order): (1) toggle "Enable Studio as MCP server" off/on while a Codex session is running; (2) restart Studio after saving that setting; (3) an already-open Codex session may still hold the empty tool list — reconnect via /mcp or start a fresh session. A Studio that auto-updated & relaunched before the MCP existed is the classic "enabled but not connected" case.
  • The MCP link can silently drop mid-session (the server disconnects) — after that the tools are gone until Studio reconnects. If tool calls start failing, check whether the link dropped before assuming a code problem.

Core tools (verified, used constantly)

  • execute_luau — run Luau in Studio. Requires datamodel_type: Edit | Server | Client. Runs in a SEPARATE Lua VM: the DataModel is shared (Instances, PlayerGui, Workspace, Net remotes), but require() module state is NOT — you get a fresh copy, so you can't read/mutate a live module's singletons. FireAllClients only works from Server. Pure functions can be unit-tested with synthetic inputs here.
  • start_stop_play — is_start bool (true=play, false=stop). Pair with the Rojo sync wait (see workflow skill) so you don't test stale code.
  • get_console_output — read the output/errors. ALWAYS check after a boot for silent failures (e.g. "Out of local registers", a stuck WaitForChild, a service error).
  • screen_capture — needs a capture_id. Artifacts to know: a freecam/scripted camera can leave ScreenGuis hidden, and distant SurfaceGui close-ups render blank — those are capture bugs, not game bugs (cross-check via instance queries). Coords for clicking are GUI AbsolutePosition space, not screenshot pixels — read AbsolutePosition + AbsoluteSize/2 first.
  • user_mouse_input / user_keyboard_input — simulate input. Both also require datamodel_type (not obvious from the schema). user_mouse_input supports an instance_path form to click a GUI object without coords. Keyboard fails with "CoreGUI has keyboard focus" when a core UI (chat, menu) owns focus. Note: VirtualInputManager:SendMouseButtonEvent inside execute_luau FAILS ("lacking capability") — use these MCP input tools instead.
  • inspect_instance / search_game_tree — inspect/find instances in the datamodel.
  • script_read / script_grep / script_search — read/search the SCRIPTS currently in the datamodel. Great for confirming Rojo actually synced your latest edit: script_grep for a new comment string before you trust a playtest.
Installs
46
First Seen
Sep 20, 2026