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
/mcpor 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. Requiresdatamodel_type:Edit|Server|Client. Runs in a SEPARATE Lua VM: the DataModel is shared (Instances, PlayerGui, Workspace, Net remotes), butrequire()module state is NOT — you get a fresh copy, so you can't read/mutate a live module's singletons.FireAllClientsonly works fromServer. Pure functions can be unit-tested with synthetic inputs here.start_stop_play—is_startbool (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 stuckWaitForChild, a service error).screen_capture— needs acapture_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 — readAbsolutePosition + AbsoluteSize/2first.user_mouse_input/user_keyboard_input— simulate input. Both also requiredatamodel_type(not obvious from the schema).user_mouse_inputsupports aninstance_pathform to click a GUI object without coords. Keyboard fails with "CoreGUI has keyboard focus" when a core UI (chat, menu) owns focus. Note:VirtualInputManager:SendMouseButtonEventinsideexecute_luauFAILS ("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_grepfor a new comment string before you trust a playtest.