Unity MCP
Drive the Unity Editor from an agent through RQL queries, C# scripts, tests and screenshots
Edit places, run Luau, drive playtests and profile games in Roblox Studio from a coding agent
By Chris Michael Guzman (individual) JavaScript Local · stdio Developer toolsTesting
62 popularity score ★ 360 ↓ 1.9k/wk
Opens the app, which asks before it adds the server.
claude mcp add roblox-studio -- npx -y @chrrxs/robloxstudio-mcp@latest --auto-install-plugin{
"mcpServers": {
"roblox-studio": {
"command": "npx",
"args": [
"-y",
"@chrrxs/robloxstudio-mcp@latest",
"--auto-install-plugin"
]
}
}
}{
"mcpServers": {
"roblox-studio": {
"command": "npx",
"args": [
"-y",
"@chrrxs/robloxstudio-mcp@latest",
"--auto-install-plugin"
]
}
}
}{
"servers": {
"roblox-studio": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@chrrxs/robloxstudio-mcp@latest",
"--auto-install-plugin"
]
}
}
}[mcp_servers.roblox-studio]
command = "npx"
args = ["-y", "@chrrxs/robloxstudio-mcp@latest", "--auto-install-plugin"]gemini mcp add --scope user roblox-studio npx -- -y @chrrxs/robloxstudio-mcp@latest --auto-install-plugin| Set together: open cloud | |
|---|---|
ROBLOX_OPEN_CLOUD_API_KEY secret |
Optional: Open Cloud key for monetization, experience settings, uploads, audio preview and place versions. Scopes depend on the tool. Also settable with --open-cloud-key. |
ROBLOX_CREATOR_USER_ID |
Optional: User that uploads are created under, or set ROBLOX_CREATOR_GROUP_ID instead. Also settable with --creator-id. |
ROBLOX_CREATOR_GROUP_ID |
Optional: Group that uploads are created under, in place of a user. Also settable with --creator-group-id. |
ROBLOSECURITY secret |
Optional: Roblox account cookie. When set, Decal and reference image uploads use it in place of the Open Cloud key. Not in the docs. |
ROBLOX_STUDIO_PORT |
Optional: Port of the local bridge to the Studio plugin. |
ROBLOX_STUDIO_HOST |
Optional: Bind address of the bridge. A non-loopback address exposes it to other machines. |
ROBLOX_STUDIO_AUTH_TOKEN secret |
Optional: Shared secret for HTTP tool endpoints, overriding the generated token file. |
ROBLOX_STUDIO_NO_AUTH |
Optional: Set to 1 or true to turn off HTTP tool authentication. |
ROBLOX_STUDIO_HOST_CAPTURE |
Optional: Set to 0, false or off to turn off the host window screenshot fallback. |
MCP_PLUGINS_DIR |
Optional: Folder the Studio plugin is installed to, instead of Studio's default. |
| Set together: wine | |
ROBLOX_STUDIO_EXE |
Optional: Studio executable to launch. Needed on native Linux with Wine. |
ROBLOX_STUDIO_WINE_LAUNCHER |
Optional: Native Linux only: script that execs Wine on Studio. |
Roblox Studio MCP connects a coding agent to a running copy of Roblox Studio through a companion plugin, which the launch command installs with --auto-install-plugin. In edit mode the agent reads and changes instances, properties and script source, either a whole file or a line range. It can also run Luau in the edit context or inside a live playtest, on the server or on one chosen client.
Most of the tools are about testing. It starts solo or multi-client playtests (up to 8 clients) and can open a baseplate, a local file or an older revision of a published place. You can add latency and packet loss, switch device emulation, and set breakpoints that log each hit without pausing. Logs, screenshots, memory and profiler captures come back per peer. It also sends simulated mouse and keyboard input, inserts Creator Store assets with their scripts stripped, and fetches Roblox engine docs.
With an Open Cloud key it reaches the live experience as well. manage_monetization handles developer products and game passes. manage_experience, new since our last review, reads and changes the title, description, server size, allowed devices, voice chat, private server price and social links.
Version 3.4.2 registers 50 tools in packages/core/src/tools/definitions.ts, half of them in the read category. A separate Inspector edition (@chrrxs/robloxstudio-mcp-inspector) exposes only those. The code also reads a ROBLOSECURITY variable the configuration docs never mention. If it holds an account cookie, Decal uploads and generate_model reference images go through Roblox's user-auth asset API with that cookie in place of the key (roblox-cookie-client.ts). The project continues boshyxd/robloxstudio-mcp from its v2.7.0 under a different npm package.
| Runtime | Node.js 22+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Roblox | FreeOpen Cloud API key only for monetization, experience settings, uploads, audio preview and place versions |
| Also |
|
Studio must be fully restarted after the plugin is installed, and the plugin and server must be the same version. On native Linux set ROBLOX_STUDIO_WINE_LAUNCHER and ROBLOX_STUDIO_EXE. The Open Cloud key needs the experience added to it, plus developer-product or game-pass read and write scopes for manage_monetization, and universe.place:write or universe:write for manage_experience depending on the setting. Uploads need ROBLOX_CREATOR_USER_ID or ROBLOX_CREATOR_GROUP_ID. The macOS screenshot fallback needs Screen Recording permission and Xcode Command Line Tools.
The plugin and server must be the same version; a mismatched plugin is rejected until the server is restarted with --auto-install-plugin and Studio reopened. Host window screenshots work only on Windows (not of a minimized window) and macOS 14+; elsewhere capture_screenshot returns Studio's own result, which can be a black frame in solo playtests. manage_monetization cannot delete products or passes (Roblox does not allow it) and refuses duplicate names. Only one edition (full or Inspector) can be installed at a time. Launching and closing Studio on native Linux needs a Wine launcher script.
Suits Roblox developers who want an agent to test and debug a game, not just edit scripts: per-peer eval, multi-client playtests, profilers and logs are its focus. It writes to the open place and can run arbitrary Luau, so anyone who only wants an agent to look at a place should install the read-only Inspector edition instead. We also list boshyxd/robloxstudio-mcp, the project this one is based on (v2.7.0); pick that one for the original line, this one for the playtest and profiling tools added since. It is a community project, not published by Roblox.
25 only read, 24 change things, 1 can delete or overwrite. A ? marks an optional parameter.
get_place_infoinstance_id?: stringsearch_objectsquery?: stringsearchType?: enumpropertyName?: stringpath?: stringclassName?: stringmaxResults?: integerinstance_id?: stringget_instance_propertiesinstancePath: stringexcludeSource?: booleaninstance_id?: stringget_project_structurepath?: stringmaxDepth?: numberscriptsOnly?: booleaninstance_id?: stringset_properties changesoperation_id?: stringinstancePath: stringproperties: objectatomic?: booleandryRun?: booleaninstance_id?: stringget_script_sourceinstancePath: stringline_range?: stringinstance_id?: stringset_script_source changesoperation_id?: stringinstancePath: stringsource: stringexpected_revision?: stringinstance_id?: stringedit_script_lines changesoperation_id?: stringinstancePath: stringold_string?: stringnew_string?: stringline_range?: stringedits?: arrayexpected_revision?: stringdry_run?: booleaninstance_id?: stringinsert_script_lines changesoperation_id?: stringinstancePath: stringafterLine?: numbernewContent: stringexpected_revision?: stringinstance_id?: stringdelete_script_lines changesoperation_id?: stringinstancePath: stringline_range: stringexpected_revision?: stringinstance_id?: stringget_attributesinstancePath: stringinstance_id?: stringselectionaction: enumpaths?: arraymode?: enumpath?: stringfrom?: numberpadding?: numberangleY?: numberinstance_id?: stringexecute_luau changesoperation_id?: stringcode: stringtarget?: stringinstance_id?: stringeval_server_runtime changesoperation_id?: stringcode: stringinstance_id?: stringeval_client_runtime changesoperation_id?: stringcode: stringtarget?: stringinstance_id?: stringgrep_scriptspattern: stringcaseSensitive?: booleanusePattern?: booleancontextLines?: integermaxResults?: integermaxResultsPerScript?: integerfilesOnly?: booleanpath?: stringclassFilter?: enuminstance_id?: stringmanage_instance changesaction: enumsource?: enumlocal_place_file?: stringplace_id?: numberplace_version?: numberrequire_process_identity?: booleanwait_for_connection?: booleantimeout_ms?: numberstudio_executable?: stringstudio_working_directory?: stringprocess_environment?: objectmax_page_size?: numberpage_token?: stringinstance_id?: stringlaunch_id?: stringsolo_playtest changesaction: enummode?: enumtimeout?: numberinstance_id?: stringset_network_profile changesprofile: enumtarget?: stringoverrides?: objectinstance_id?: stringget_simulation_stateinclude?: enumtarget?: stringinstance_id?: stringreset_simulation_state changestarget?: stringnetwork?: booleandeviceSimulator?: booleaninstance_id?: stringget_device_simulator_statetarget?: stringdeviceId?: stringincludeDeviceList?: booleaninstance_id?: stringset_device_simulator changestarget?: stringdeviceId?: stringorientation?: stringresolution?: objectpixelDensity?: numberscalingMode?: stringstopSimulation?: booleaninstance_id?: stringcapture_device_matrix changesentries: arraytarget?: stringformat?: enumquality?: numbersettleSeconds?: numberrestoreAfter?: booleaninstance_id?: stringmultiplayer_playtest changesaction: enumnumPlayers?: numbertarget?: stringtestArgs?: anyvalue?: anytimeout?: numberinstance_id?: stringget_runtime_logsinstance_id?: stringmultiplayer_group_id?: stringcursor?: stringcursor_by_instance?: objecttail?: numberfilter?: stringcapture_script_profilertarget?: stringduration_ms?: numberfrequency?: numbermax_functions?: numbermin_total_us?: numberfilter?: stringinclude_native?: booleaninclude_plugin?: booleanoutput_path?: stringinstance_id?: stringcapture_micro_profileraction?: enumtarget?: stringduration_ms?: numberinput_path?: stringfocus?: enumfilter?: stringmax_timers?: numbermax_groups?: numbermax_timers_per_group?: numbermax_related_timers?: numbermin_total_us?: numberinclude_idle?: booleaninclude_gpu?: booleanspike_frames?: numberstart_frame?: numberend_frame?: numberoutput_path?: stringsummary_output_path?: stringbaseline_path?: stringbaseline?: objectbreakpoints changesaction: enumclear_all?: booleanscript_path?: stringline?: numberenabled?: booleancondition?: stringlog_message?: stringcontinue_execution?: booleantarget?: stringinstance_id?: stringget_connected_instancesget_request_statusrequest_id: stringwait_ms?: integersearch_assetsassetType: enumquery?: stringmaxResults?: numbersortBy?: enumrobloxCreatedOnly?: booleanget_asset_detailsassetId: numberget_asset_thumbnailassetId: numbersize?: enuminsert_asset changesoperation_id?: stringassetId: numberparentPath?: stringposition?: objectinstance_id?: stringgenerate_model changesoperation_id?: stringasync?: booleanprompt?: stringimage_path?: stringimage_base64?: stringimage_mime_type?: enumimage_asset_id?: numberschema?: enumschema_groups?: arrayname?: stringsize?: objectmax_triangles?: numbergenerate_textures?: booleantimeout_ms?: numberinstance_id?: stringpreview_assetassetId: numberincludeProperties?: booleanmaxDepth?: numberincludeAudio?: booleanmaxAudioPreviews?: numberinstance_id?: stringupload_asset changesfilePath: stringassetType: enumdisplayName: stringdescription?: stringuserId?: stringgroupId?: stringcapture_screenshotformat?: enumquality?: numberinstance_id?: stringmanage_monetization changesaction: enumkind: enumuniverse_id?: integerid?: integername?: stringdescription?: stringprice?: integerfor_sale?: booleanmanaged_pricing?: booleanimage_path?: stringpage_token?: stringinstance_id?: stringmanage_experience deletesaction: enumuniverse_id?: integerplace_id?: integername?: stringdescription?: stringserver_size?: integervoice_chat_enabled?: booleanprivate_server_price?: integerdisable_private_servers?: booleandevices?: objectsocial_links?: arrayremove_social_links?: arrayconfirm?: booleaninstance_id?: stringsimulate_mouse_input changesaction: enumx: numbery: numberwheel?: numberbutton?: enumtarget?: stringinstance_id?: stringsimulate_keyboard_input changeskeyCode?: stringaction?: enumduration?: numbertext?: stringtarget?: stringinstance_id?: stringget_memory_breakdowntarget?: stringtags?: arrayinstance_id?: stringget_scene_analysismode?: enumtarget?: stringtopN?: numberraw?: booleaninstance_id?: stringexport_rbxminstance_paths: arrayoutput_path: stringtarget?: enuminstance_id?: stringimport_rbxm changesoperation_id?: stringsource: objectparent_path: stringtarget?: enuminstance_id?: stringfind_and_replace_in_scripts changesoperation_id?: stringpattern: stringreplacement: stringcaseSensitive?: booleanusePattern?: booleanpath?: stringclassFilter?: enumdryRun?: booleanmaxReplacements?: integerexpected_revisions?: objectinstance_id?: stringget_roblox_skillsaction: enumname?: stringget_roblox_docsname: stringdoc_type?: enumsection?: string