RoBridge
Provides tools for controlling Roblox Studio from an AI agent, including querying and mutating the DataModel, managing scripts, lighting, UI, selection, camera, terrain, assets, playtesting, input simulation, and running arbitrary Luau.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@RoBridge Create a red brick part at the center of the baseplate"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
RoBridge
A free, open, local MCP server that lets AI agents (Cursor, Claude, any MCP client) drive Roblox Studio — DataModel, scripts, terrain, lighting, UI, and playtests — plus a dashboard at http://127.0.0.1:3737. All tools included. No Pro tier.
Public MIT: fork for your own version, PRs welcome; main is maintained by LeapVerse/Allusia1.
flowchart LR
A["AI agent<br/>MCP stdio"] --> B["RoBridge server<br/>:3737"]
B --> C["Studio plugin"]
C --> D["Your place"]
B --> E["Dashboard"]Docs
Everything lives in this repo (no separate docs site):
Build, plugin, HTTP, Mesh/Image APIs | |
Cursor, Claude Desktop, Claude Code, generic stdio | |
| |
Local UI on | |
Full action + param reference | |
Fix lines, stuck Play | |
One port, InsertService, no Open Cloud | |
Server 0.1.8 / plugin 0.1.9 |
Clone this repo, then npm install (see First run).
Related MCP server: Roblox Studio MCP Server
Works with
Cursor, Claude Desktop, Claude Code, and any stdio MCP client (VS Code Copilot, Cline, Windsurf). Init writes the spawn config (absolute Node binary + absolute dist/index.js, empty argv). Details: docs/mcp.md.
First run
npm installPostinstall builds the server and runs init: copies the Studio plugin into the Roblox Plugins folder and writes Cursor / Claude MCP configs (merge — other servers are kept). Re-run later with npx robridge init. Plugin only: npx robridge install-plugin. Configs only: npx robridge mcp.
Then reload MCP in Cursor (Settings → MCP), open Studio (or refresh Plugins), Allow HTTP to 127.0.0.1, and (for screenshots) Allow Mesh / Image APIs. Fully quit Claude Desktop if you use it. Clients spawn the server; you do not start it in a terminal. Stuck? npx robridge doctor prints a checklist (Node, dist, plugin, MCP config, :3737, Studio) and exactly one next step. Official Studio MCP (Assistant → … → Enable Studio as MCP server) is optional and complementary — it does not use :3737 (MCP setup).
Plugin destination:
OS | Path |
macOS |
|
Windows |
|
Unusual clients that cannot be auto-configured: MCP setup (fallback JSON). Reload the MCP server after each rebuild (npx robridge mcp updates paths). Claude Desktop: fully quit and reopen.
Dashboard: http://127.0.0.1:3737. Dashboard only (you run this yourself): node dist/index.js --no-mcp.
One process owns :3737. Extra MCP clients (Cursor + Claude together) forward to that owner and share the same Studio session.
Updating
Keep this clone. From the repo root:
npx robridge updateThat runs git pull --ff-only then npm install (rebuild + init). The working tree must be clean. Then reload MCP and refresh Studio plugins. MCP/HTTP start also copies plugin/RoBridge.lua into the Roblox Plugins folder if it is missing or out of date. The dashboard shows a banner when a newer GitHub release exists.
Tools (24, all free)
MCP tools/list and HTTP /api/tools share the same defineTool Zod shapes. Full param tables: docs/tools.md.
Tool | Actions |
| get, children, descendants, ancestors, find_child, find_descendant, wait_for_child, search_class, search_name, search_property, search_tag, class_info, file_tree, project_structure |
| create, create_with_props, delete, clone, move, rename, pivot, create_tree, mass_create, mass_delete, mass_duplicate, smart_duplicate, scatter |
| get, get_all, set, set_many / set_multiple, attributes/tags (incl. get_tagged, check_tag), set_relative, set_calculated, mass_set, mass_get, modify_children |
| get_source, set_source, create, delete, list, search, replace, edit_lines, edit_replace, edit_insert, edit_delete, validate, get_dependencies |
| design_brief, create_tree, update, list, inspect, list_interactive, preview, hide_preview, click, type_text, scroll, get_abs, check, delete |
| get, set / lighting, set_time / time, atmosphere, sky, terrain_props, mood, add_effect, clear_effects |
| get, set, add, remove, clear, details, cached, context, watch |
| get / info, set, focus / focus_path, focus_position, suggest, zoom_extents, screenshot, record, record_stop |
| create, play, pause, resume, cancel / stop_all |
| create, play, pause, resume, stop, stop_all, list, set, set_listener |
| create, list, load, play, stop, stop_all, get_tracks |
| anchor, unanchor, set_collide, weld, get_mass, set_physical_properties, create_constraint, register_group, set_collidable, get_groups |
| create, remove / clear, list, emit, toggle |
| fill_block/ball/cylinder/wedge, clear, clear_region, clear_bounds, replace_material, colors_get/set, read/write voxels, generate, smooth, get_info |
| raycast, multi_raycast, in_radius, in_box, ground_height / find_ground, check_placement, scan_area, find_flat, find_spawn, analyze_walkable, spatial_map, find_space, bounds, snap_grid, collision |
| search, preview / info, insert / insert_free / insert_package, search_insert, export/import library, review_model, generate_model, upload_asset, generate_thumbnail |
| export_scripts, status / status_current_place, history, directions, read_file, write_file, progress |
| summary, counts, sync, snapshot, changes, clear_history, viewport, metadata, scripts, selection_info, clear_cache |
| get, errors, clear |
| info (default), ping, connection, place_info, services, usage, preflight |
| get_mode, play_status, play_start, play_stop, play_pause, play_resume, run_test, toggle_ui_preview, test_profile_get/set/reset, experience_language_get/set, undo, redo, set_waypoint, save_prompt |
| click_at, click_path, key, type_text, walk_to, click_world, walk_and_click |
| run several tool calls in one request (optional waypoint / stopOnError) |
| run arbitrary Luau at plugin security level |
manage_studio.run_test injects Luau, stops leftover Play first, starts Play (or Run), collects [ROBRIDGE_TEST] logs, stops, and writes a report. Prefer it over play_start + manage_logs + play_stop.
system_info.preflight is a read-only Studio checklist (edit mode, HttpService, loadstring, Mesh/Image APIs) with fix instructions.
Value conventions
Property values accept plain JSON: [x,y,z] for Vector3/CFrame position, 12 numbers for full CFrame, "#ff0000" or [r,g,b] for Color3, [xs,xo,ys,yo] for UDim2, "Enum.Material.Neon" or "Neon" for enums, path strings for Instance references.
Instance paths look like game.Workspace.Model.Part or Workspace/Model/Part. Prefer rbId from a prior summary when names collide. Never invent rbxassetid values — manage_assets.search first.
Configuration
Env var | Default | Purpose |
|
| Dashboard + plugin bridge port |
The plugin reads RoBridgeHost/RoBridgePort plugin settings if you need a non-default port.
Dump the shipped catalog (no Studio needed): node dist/index.js --dump-catalog. Live HTTP: http://127.0.0.1:3737/api/tools. Schema check: npm run test:schema.
Troubleshooting
Problem | What to do |
No Studio session | Open the place in Studio with the plugin; click Allow for HTTP to |
| Edit-only. Use |
Stuck Play | Press Stop in Studio (or |
CaptureService / screenshot failed | File → Game Settings → Security → Allow Mesh / Image APIs. One in-flight shot; ~1.5–2 fps is expected. |
Play started but agent never polls | Game Settings → Security → Allow HTTP Requests. |
Stale dashboard / port in use | One process owns |
Tool errors append a Fix: line when the server recognizes the failure. Run system_info preflight for a checklist. More: docs/troubleshooting.md.
Limits
One RoBridge instance owns
:3737; extra MCP clients forward to that owner.manage_assetsinsert usesInsertService:LoadAsset(asset must be free or owned by you).Open Cloud asset upload is not included.
upload_assetis StudioAssetService:CreateAssetAsync(confirm=true).
See docs/limits.md.
Repository
Path | |
| MCP + HTTP server ( |
| Studio plugin ( |
| Dashboard served at http://127.0.0.1:3737 |
| Install, MCP, playtesting, tools, limits |
| Plugin install, catalog extract, tests |
npm test runs test:schema and test:hints (no Studio). Play/UI tests need an open place.
License
MIT. See LICENSE.
Available Tools
24 toolsbatch_executeA
Run several RoBridge tool calls in one request as a single undo waypoint. Each command is {tool, args}. Stops on first error unless continueOnError is true (stopOnError is the inverse alias). Nested batch_execute is rejected. Prefer this over many round-trips for related mutations.
Inputs: commands (required), waypoint, stopOnError, continueOnError.
execute_luauA
Run arbitrary Luau code in Roblox Studio (plugin security level, Edit-only). During Play use manage_studio.run_test / play agents instead — plugin loadstring is unavailable in Play. The code may return a value, which is JSON-encoded (Instances become path strings, Roblox types become typed tables). A helper table RB is available with RB.resolve(path or rbId), RB.encode(value), RB.summary(instance) (includes rbId), RB.setProp(instance, name, value), RB.stripIds().
Inputs: code (required), timeoutSeconds.
manage_animationA
Manage animations. Actions: create (Animation with animationId — do not invent IDs), list, load (load onto a rig without playing), play, stop, stop_all, get_tracks (tracks on a rig). Prefer user-provided or search-accepted animation IDs.
Inputs: action (required), name, path, rigPath, +2 more.
manage_assetsA
Roblox Toolbox/Creator Store assets plus a local asset library. ALWAYS search first, then insert using an assetId from those results — never invent or hardcode IDs. Actions: search (keyword/query + assetType), preview / info (metadata for a search-result assetId), insert / insert_free / insert_package (assetId into parentPath), search_insert (search then insert the first match), export_selection_json (JSON snapshot of the Studio selection), export_selection_rbxm / export_path_rbxm (serialize selection or a path into the local ./asset-library as a re-importable asset), import_rbxm (rebuild a library asset in Studio), review_model (QA a model: anchoring, PrimaryPart, naming, size, expected groups; readiness verdict), generate_model (Roblox GenerationService, if this Studio has access), upload_asset (AssetService:CreateAssetAsync — requires confirm=true), generate_thumbnail (render a library asset to a PNG thumbnail).
Inputs: action (required), name, play, limit, +23 more.
manage_audioA
Manage Sound instances. Actions: create (soundId number or 'rbxassetid://...' — do not invent IDs), play, pause, resume, stop, stop_all, list, set, set_listener (SoundService listener: Camera, CFrame, ObjectPosition, or ObjectCFrame). Prefer user-provided or search-accepted asset IDs.
Inputs: action (required), name, path, cframe, +5 more.
manage_cameraA
Control the Studio viewport camera. Actions: get/info, set, focus/focus_path, focus_position (look at a world point), suggest (recommended views for a target or the selection — does not move the camera), zoom_extents, screenshot, record, record_stop. screenshot captures the Edit-mode viewport via Roblox CaptureService (works even if Studio is in the background). record captures a short viewport clip (CaptureService frame burst → Node stitch). CaptureService allows only one in-flight shot and typically lands around 1.5–2 fps; that cap is expected. record_stop aborts an in-flight recording. Requires File → Game Settings → Security → Allow Mesh / Image APIs.
Inputs: action (required), fps, path, lookAt, +4 more.
manage_effectsA
Add visual effects to parts. Actions: create (ParticleEmitter, Fire, Smoke, Sparkles, Trail, Beam, PointLight, SpotLight, SurfaceLight, Highlight), remove/clear, list, emit (ParticleEmitter:Emit), toggle (Enabled).
Inputs: path (required), action (required), name, count, +2 more.
manage_inputA
Simulate input. In playtest: walk_to (Humanoid:MoveTo a path/position), click_world (VirtualInput at a 3D instance screen pos), walk_and_click (walk then click — use this to verify world clicks), click_at (viewport pixels), click_path (PlayerGui GuiButton), key, type_text. Clicks use UserInputService:CreateVirtualInput, not VirtualInputManager. In edit: click_path uses VirtualInput plus a LastClick attribute on the ScreenGui.
Inputs: action (required), x, y, key, +6 more.
manage_lightingA
Inspect or change Lighting and environment. Actions: get, set/lighting (Lighting properties), set_time/time (clockTime 0-24 or time 'HH:MM:SS'), atmosphere (get/set Atmosphere, createIfMissing), sky, terrain_props (Terrain water/visuals), mood (preset: day/night/sunset/foggy/horror plus optional overrides), add_effect, clear_effects. Do not invent skybox asset IDs.
Inputs: action (required), mood, time, clockTime, +4 more.
manage_logsA
Read the Roblox Studio output log (captured by the plugin via LogService; play-mode logs come from the play agent). Actions: get (recent entries, optional levelFilter: Print/Warning/Error, containsFilter, since unix-seconds cursor), errors (Error-level only), clear.
Inputs: action (required), limit, since, levelFilter, +1 more.
manage_physicsC
Physics helpers. Actions: anchor / unanchor, set_collide, weld, get_mass, set_physical_properties, create_constraint, register_group, set_collidable, get_groups (PhysicsService collision groups).
Inputs: action (required), path, group, groupA, +9 more.
manage_propertiesB
Get/set properties, attributes and tags. Actions: get, get_all, set (property + value), set_many/set_multiple (properties map — also used if you pass action 'set' with a properties map and no property), get_attributes/get_attr/get_all_attrs, set_attribute/set_attr, delete_attr, get_tags, add_tag, remove_tag, check_tag, get_tagged, set_relative (add/subtract/multiply/divide via operation, or plain delta), set_calculated (evaluate a math expression with variables that may be values or instance property paths), mass_set, mass_get, modify_children (set props on matching children).
Inputs: action (required), id, tag, path, +12 more.
manage_scriptsA
Work with Script/LocalScript/ModuleScript sources. Actions: get_source, set_source, create, delete, list, search, replace (substring across scripts), edit_lines, edit_replace (find/replace in one script), edit_insert (insert at line), edit_delete (delete line range), validate (loadstring syntax check of a script path or raw source), get_dependencies (require() targets and services a script references). Prefer these over execute_luau for script edits.
Inputs: action (required), id, name, path, +9 more.
manage_selectionA
Get or set the Studio selection. Actions: get, set (paths array), add, remove, clear, details (selection + common properties, optional maxDepth descendants + includeAncestors), cached (last known selection without a Studio round-trip; maxAge ms), context (selection with script source, properties, and children), watch (install a selection-change watcher; call again to collect changes).
Inputs: action (required), paths, maxAge, maxDepth, +4 more.
manage_studioA
Studio-level operations. Actions: get_mode, play_status, play_start (F5 Play or F8 Run), play_stop, play_pause, play_resume, run_test (inject Luau, play, collect [ROBRIDGE_TEST] logs, stop, write report; auto-records a short viewport clip unless record=false), toggle_ui_preview (StarterGui.ShowDevelopmentGui), test_profile_get/set/reset (Player Emulator — no public API; returns manual_required with instructions), experience_language_get (locale info) / experience_language_set (manual_required), undo, redo, set_waypoint, save_prompt. After adding a player-facing feature (UI, clicks, shop, movement, leaderstats), playtest with run_test or play_start before reporting done. Prefer run_test over manually sequencing play_start + logs + play_stop. Viewport clips: manage_camera.record, or run_test (attaches clip metadata).
Inputs: action (required), mode, name, locale, +10 more.
manage_syncA
Sync between Studio and the local filesystem. Actions: export_scripts (dump every script source under a path to ./sync// on disk), status / status_current_place (place + sync dir + last export), history (recent sync operations), directions (get or set per-type sync directions), read_file (read a synced script file by instancePath), write_file (write content to the synced file AND apply it to the Studio script), progress (last export stats).
Inputs: action (required), path, limit, outDir, +3 more.
manage_terrainB
Edit Terrain. Actions: fill_block, fill_ball, fill_cylinder, fill_wedge, clear, clear_region (center+size or region {min,max}), clear_bounds (min+max), replace_material (fromMaterial→material), colors_get / colors_set (per-material terrain colors), read_voxel (position), read_voxels / write_voxels (bulk region voxels), generate (procedural fBm terrain with presets mountains/hills/plains/dunes/islands/canyon), smooth (blur occupancy in a region), get_info. Regions: {min:[x,y,z], max:[x,y,z]}. Materials: Grass, Sand, Rock, Water, Snow, Mud, Asphalt, Basalt, Brick, Cobblestone, Concrete, CrackedLava, Glacier, Ground, Ice, LeafyGrass, Limestone, Pavement, Salt, Sandstone, Slate, WoodPlanks.
Inputs: action (required), max, min, seed, +23 more.
manage_tweenA
Animate properties with TweenService (plays live in the Studio viewport). Actions: create (build a tween without playing; returns tweenId), play (tweenId from create, or path+goal to create-and-play), pause, resume, cancel/stop_all. pause/resume/cancel accept tweenId or affect all tracked tweens. goal/properties map e.g. {"Position": [0,10,0], "Transparency": 0.5}.
Inputs: action (required), goal, path, tweenId, +7 more.
manage_uiA
Create, inspect, preview, and interact with Roblox UI. Actions: design_brief (plan a UI from a text brief; set create=true to build it), create_tree, update, list, inspect, list_interactive, preview (clone into CoreGui in Edit), hide_preview, click (VirtualInput / attribute click — PlayerGui during playtest, StarterGui in Edit), type_text, scroll (ScrollingFrame CanvasPosition — PlayerGui during playtest, StarterGui in Edit), get_abs, check, delete.
Inputs: action (required), kind, path, text, +9 more.
mutate_instancesA
Create, delete, clone, move, rename, or pivot instances. Also: create_with_props (create+properties), create_tree (nested hierarchy in one waypoint), mass_create, mass_delete, mass_duplicate, smart_duplicate (N copies with offset), scatter (ray-snap clones onto ground in a region). Property values: numbers/strings/booleans, Vector3 [x,y,z], CFrame [x,y,z] or 12 numbers, Color3 hex '#ff0000' or [r,g,b] 0-1, UDim2 [xs,xo,ys,yo], enum strings like 'Enum.Material.Neon'.
Inputs: action (required), id, name, path, +19 more.
query_instancesA
Query instances in the Roblox place. Prefer a typed action over execute_luau. Actions: get, children, descendants, ancestors, find_child, find_descendant, wait_for_child, search_class, search_name, search_property, search_tag, class_info, file_tree (nested outline), project_structure (service/script counts). Paths: 'game.Workspace.Model.Part' or 'Workspace/Model/Part'. Prefer rbId (from a prior summary) over path when both are set — names like Part are not unique. Aliases: childName/descendantName/query→name, root→path, propertyName→property, id→rbId.
Inputs: action (required), id, tag, name, +16 more.
spatial_queryA
Spatial queries in workspace. Actions: raycast (filterList/filterType/ignoreWater), multi_raycast (rays[], max 50), in_radius, in_box, ground_height/find_ground (position or x/z), check_placement (is a box placeable at position), scan_area (heightmap grid), find_flat (flat build spots), find_spawn (clear spawn positions), analyze_walkable (walkability grid), spatial_map (all BasePart/Model positions), find_space (empty spot for a box), bounds (one path or paths[]), snap_grid (snap an instance pivot to a grid), collision. Areas: searchArea/area/region are {min:[x,y,z], max:[x,y,z]}.
Inputs: action (required), x, z, area, +36 more.
system_infoA
RoBridge + Studio status. No action (or action=info) returns the full snapshot. Actions: ping (latency), connection (edit/play sessions), place_info, services (DataModel services), usage (per-tool call statistics for this server session), preflight (read-only Studio diagnostics: mode, publish status, HttpService, loadstring, Mesh/Image APIs — with fix instructions).
Inputs: action.
workspace_stateA
Snapshot of the place. Actions: summary (place info, top-level services, selection, camera), counts (instance counts by ClassName under a path), sync (hierarchy outline + metadata + change stats), snapshot (instance tree under a path, maxDepth), changes (recent added/removed instances — installs a watcher on first call), clear_history (reset the change log), viewport (camera + viewport size + selection bounds), metadata (place ids, counts, timestamps), scripts (all script paths with line counts), selection_info (selection with bounds), clear_cache (drop watchers and cached plugin state).
Inputs: action (required), path, topN, limit, +4 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 24 tools
Each tool targets a distinct domain (terrain, instances, properties, scripts, lighting, etc.), but some overlap exists between query_instances and workspace_state for hierarchy inspection, and between manage_effects, manage_audio, and manage_animation for creating different instance types. Overall, tool purposes are clear enough to avoid frequent misselection.
The naming convention is mixed: many tools use the manage_ prefix (manage_terrain, manage_scripts), but others use bare verbs or noun phrases (query_instances, spatial_query, workspace_state, system_info, execute_luau, batch_execute). While all names are lowercase with underscores, the lack of a uniform verb_noun pattern makes the set feel less predictable.
With 24 tools, the count is at the high end of what is considered heavy (16-25). However, the server covers a very broad domain (Roblox Studio control), and each tool represents a major subsystem, so the count is borderline but arguably justifiable. It still feels dense and might overwhelm agents.
The tool set is highly comprehensive, covering instance management, terrain, lighting, camera, physics, UI, input, scripts, assets, animation, audio, and testing. Minor gaps exist, such as no dedicated tool for managing Game Settings or project-level configuration beyond preflight checks, but the core workflows for editing and testing a Roblox place are well covered.
Maintenance
Related MCP Connectors
Make games with AI: one MCP server that connects your agent to Unity, Unreal and Godot editors.
9 remote MCP servers on Cloudflare Workers for AI agents. Free tier + Pro API keys.
AI tool directory MCP server, live since July 2026. Tools, agents, models, companies, services.
A registry of AI agent tools — MCP servers, APIs, CLIs, SDKs — kept current by automated ingestion.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA free, open-source MCP server that lets Claude, Cursor, Codex, or Gemini operate Roblox Studio — debug live playtests, bulk-edit places, and scaffold whole games — with a built-in safety layer.7MIT
- AlicenseNot gradedqualityDmaintenanceBridges AI assistants to Roblox Studio with 51 tools for exploring, editing, and automating game development, all locally via HTTP polling.875 npm7MIT
- AlicenseNot gradedqualityDmaintenanceA production MCP integration that lets AI agents control Roblox Studio to autonomously build, test, and debug Roblox games. Provides 39 tools for explorer control, script management, terrain generation, and autonomous testing.3MIT
- FlicenseAqualityCmaintenanceAn MCP server that bridges AI to Roblox Studio, enabling execution of Luau scripts, instance manipulation, play-testing control, and Open Cloud operations via natural language.21-