tufan-blox-bridge
MCP server for Roblox Studio AI-driven development — scripts, instances, properties, Luau execution, two-way file sync, and git history.
Versions
No versions found.
Tools 83
grep_scripts Search the Source of all scripts for a Lua pattern. Returns path:line: text.
ping Ping a connected Studio place. Returns its place name + session.
is_running Whether a simulation is running in the target Studio, and whether it's Run mode.
run_luau Execute Luau in the Studio plugin context (EDIT mode — runs against the edit DataModel, not a running playtest's server/client). Captures the return value and printed output. Full plugin API access.
list_places List the Roblox Studio places currently connected to the bridge (placeId, name, gameId, project root). Use the placeId or name as the `place` arg on other tools to target a specific one.
pull_place Re-pull a connected place's full script tree into its local mirror folder (<project>/projects/<name>_<placeId>). Runs automatically on connect; use this to force a refresh.
copy_script_across Copy a script's Source from one connected place to another. The headline cross-place op — e.g. push a shared module from one game into another.
get_properties Get all (or chosen) properties of the instance at path.
set_property Set one property. Value can be a primitive or {Vector3:[x,y,z]}, {Color3:[r,g,b]}, {UDim2:[xs,xo,ys,yo]}, {EnumItem:'Enum.Material.Wood'}.
mass_edit Apply MANY different property edits in ONE call (and one undo entry): edits = [{path, name, value}, ...]. Use this instead of many set_property calls — far fewer round-trips (Roblox HttpService caps ~500 req/min, so bulk single-edits throttle).
search_by_property Find instances under rootPath whose property equals value. For name/class search use search_objects instead; for the Roblox marketplace use search_assets.
get_attributes All attributes of the instance at path.
set_attribute Set an attribute on the instance at path (value may be primitive or a typed wrapper like {Vector3:[x,y,z]}).
mass_set_attribute Set MANY attributes across instances in ONE call + one undo entry: edits = [{path, name, value}, ...].
scene_state Spatial snapshot of the scene as the editor camera sees it: camera intrinsics (CFrame, FOV, viewport) + a curated list of visible objects, each with world position/orientation/size AND its on-screen pixel (x,y,depth,onScreen) via WorldToScreenPoint. This is what grounds a screenshot — it lets you say \"object X is at screen (px,py) = world (x,y,z)\". A Model counts as one object (bounding box); closest objects first. Pair with capture_screenshot. Read-only.
pick Raycast from a screen point into the scene and report what's under it: the hit instance (+ nearest Model ancestor), world position, surface normal, distance, and the part's CFrame/size/orientation. Give x,y in pixels OR nx,ny in 0..1 OR nothing for the viewport center. Powers \"what is that?\" and tracing (sample points along a screen path). Read-only.
objects_in_region List parts whose bounds overlap a region: a box (center+size), a sphere (center+radius), or 'around' an instance (its bounding box, optionally padded). Spatial query for \"what's near X / inside this area\". Returns part paths + world pos + size. Read-only.
place_on Compute and apply an accurate placement: raycast to a surface (a screen point, a target instance's TOP via onTarget, or straight down via ground), then sit the object FLUSH on it — offset by the object's bounding box so it doesn't clip or float. Optional alignToNormal (rotate to the surface) and snap (grid studs). Use dryRun to get the computed CFrame without moving. Moves a Part (CFrame) or a Model (PivotTo, bbox-center flush). Write tool.
describe Full context of one instance in a SINGLE call: identity, key properties, attributes,
tag Read or change CollectionService tags on the instance at path. action='get' lists its tags;
get_tagged All instances carrying a CollectionService tag, optionally filtered to a className (IsA).
capture_screenshot Capture a PNG screenshot of the Roblox Studio 3D viewport only — cropped to the editor viewport, excluding the ribbon and docked panels (assumes the default layout: ribbon on top, Explorer/Properties docked right). Pass fullWindow:true to capture the entire Studio window instead. Server-side OS capture; errors if Studio isn't open/on-screen. Use this to visually verify UI/scene/VFX you just built. Windows-only.
snapshot Checkpoint a subtree before risky changes. Keeps an exact live clone in
restore Restore a snapshot: destroys whatever's currently at its original location and re-clones
list_snapshots List saved snapshots (name, origin, time, size).
delete_snapshot Delete a saved snapshot.
typecheck Type-check Luau with luau-lsp (the Luau analyzer) over a place's synced script mirror — catches
project_health One-look census of the whole place: instance / script / part counts, total Luau size,
batch Run MANY operations in ONE round-trip and ONE undo entry. The single biggest
get_recent_errors Errors + warnings the plugin has pushed live (incl. during a playtest), read from
get_output_log Recent Studio Output messages (edit mode). Optionally filter by severity.
generate_asset FULL PIPELINE: turn a text prompt (or an image) into a game-ready asset in the open place —
search_assets Search the Roblox marketplace (Toolbox) for assets. Returns id + name, and flags assets that contain scripts (⚠ possible backdoor vector). Server-side. For instances already IN this place, use search_objects or search_by_property instead; for this place's own custom MaterialVariants, use search_materials.
get_asset_details Marketplace details for an asset id (name, creator, type, whether it contains scripts, mesh stats).
get_asset_thumbnail Fetch an asset's thumbnail as a PNG image so the AI can SEE what it looks like before using it. Uses Roblox's public thumbnail API (works for any public asset — no ownership needed, unlike insert_asset). Server-side.
search_materials List custom MaterialVariants defined in this place's MaterialService (name + base material), optionally filtered by name. For marketplace assets use search_assets instead; for other existing instances use search_objects/search_by_property.
insert_asset Insert a marketplace asset by id under parentPath (default Workspace). NOTE: Roblox's LoadAsset only authorizes assets the logged-in user OWNS (or Roblox-made ones) — most third-party free models will fail unless you first take them (Toolbox → Add to Inventory). Tip: run scan_backdoors after inserting free models. For a LOCAL file you already have, use import_file instead; to AI-generate a new mesh, use generate_asset instead.
create_instance Create a new instance of className under parentPath, with optional name and properties.
delete_instance Destroy the instance at path.
clone_instance Clone the instance at path under parentPath (defaults to same parent).
move_instance Reparent the instance at path to newParentPath.
rename_instance Rename the instance at path.
create_tree Build a whole nested instance subtree from ONE spec, in one call + one undo. Ideal for UIs (a panel + all its children at once). tree = { className, name?, properties?, children?: [tree, ...] }.
history Undo or redo the last change in Studio (ChangeHistoryService). (Replaces undo + redo.)
meshy_generate Generate a 3D model with Meshy AI from a text prompt (two-stage: geometry preview → texture
meshy_task Inspect or act on an existing Meshy task by id: status (poll progress), download (re-fetch
datastore Inspect/edit a PUBLISHED game's saved data via the Open Cloud DataStore API (server-side HTTP, no
scan_perf Audit the place for runtime frame-killers in one pass (part/physics load,
http_get Fetch a URL (GET) and return the response body as text. For grabbing docs, JSON APIs, or reference data while working. Body is capped at ~100 KB; 15s timeout.
export_sourcemap Generate a Rojo-style sourcemap.json from a place's synced script mirror — the file luau-lsp
script_source Read OR write a script's Source. Omit `source` to READ the Source of a
edit_script_lines Replace a line range in a script (1-indexed, inclusive) with newText — instead of re-sending the whole Source. Get line numbers from get_script_source/grep_scripts first. newText may be multi-line or empty (empties the range).
find_and_replace_in_scripts Project-wide plain-text find & replace across all scripts. Set dryRun=true first to preview which scripts + how many hits before applying.
patch_script Apply MANY anchored find/replace hunks to ONE script in one call — refactor-grade editing without resending the whole file. Each hunk is a LITERAL match (not a pattern), applied in order. ATOMIC: if a required hunk's `find` isn't present it errors and writes NOTHING (so a stale patch can't half-apply or silently no-op). Mark a hunk optional to skip it when absent. Set dryRun to validate the patch applies cleanly without writing.
find_duplicates Find scripts with IDENTICAL Source — copy-pasted code ripe for extracting into a shared
blender_process Run a canned headless-Blender operation on a local 3D file (.glb/.gltf/.fbx/.obj/.blend in;
blender_run POWER TOOL: run an arbitrary bpy (Python) script in headless Blender on this machine. The script
git_status Working-tree status of a project.
git_commit Stage and commit changes in a project (all changes unless paths[] given).
git_log Recent commits (default 20).
git_diff Diff. Default = working tree. Give from/to to compare commits/refs (e.g. from 'HEAD~1' to 'HEAD', or from a commit hash). Optionally scope to one path.
git_restore Restore a git-tracked file. Without source: discard working changes (restore to HEAD). With source (a commit/ref): recover that OLDER version of the file — use this to get back an edit you lost. (For restoring a non-git `snapshot` checkpoint of a live instance subtree, use restore instead.)
git_recover Recover a DELETED / lost file: finds the most recent commit where it still had content and restores it. The one-shot 'get my script back' tool.
git_show Show a commit (metadata + changed-file stat) by ref, or a file's exact content at that ref when path is given.
git_revert Revert a commit — creates a new commit that undoes it (safe, keeps history). Use to roll back a bad change.
git_branch List branches, or create+switch when name given.
git_remote List remotes, or add one (action:'add' + name + url). Add a GitHub remote to back the place mirror up OFF-machine — the local mirror alone dies with the disk.
git_push Push commits to the remote (set one up first with git_remote add). Off-machine backup.
git_pull Pull from the remote (fetch + merge). Restore/sync a mirror from its off-machine backup.
make_responsive Make a UI subtree resolution-proof. Converts Offset→Scale across ALL the properties
scan_responsive Audit a UI subtree for what breaks on other resolutions — across the tree AND the scripts.
scan_backdoors Tufan Power Tool: deep-scan a place for backdoors / exploits / obfuscation. Checks script source (require-of-Value, require-by-asset-id, loadstring, HttpGet, getfenv, exploit APIs, Discord webhooks, anti-debug, high-entropy blobs) AND the spots a script-only scanner misses — instance attributes and StringValues hiding encoded payloads. Findings sorted high→low severity. NOTE: this scans the PLACE tree; it cannot read installed Studio plugins' own source (a Roblox limit) — use list_studio_plugins to see what plugins are installed (the remote-code-plugin vector).
list_studio_plugins List Studio plugins installed locally on this machine (local .rbxm plugins + marketplace InstalledPlugins). Use this to spot the blind spot scan_backdoors can't reach: a third-party plugin running remote code. Server-side; no Studio call.
get_descendants All descendants of path up to maxDepth (default 5).
get_tree Token-lean tree dump: runs of same-class siblings beyond `collapseMin` (default 6)
search_objects Find instances by name and/or className under rootPath. matchMode controls name matching: 'substring' (default), 'exact', 'wholeWord', or 'regex'. Use 'exact'/'wholeWord' to cut the noise that plain substring search produces.
get_services Top-level services in the DataModel.
format_scripts Format Luau on disk with StyLua (the standard Roblox formatter) over a place's synced script
lint_scripts Lint Luau with Selene (the standard Roblox linter) over a place's synced script mirror — catches
cloud_luau Run server-side Luau against your PUBLISHED game via the Open Cloud Luau Execution API — a fresh
get_selection What the user currently has selected in the Studio Explorer (paths + classes).
set_selection Select the given instances in the Studio Explorer.
import_file Import a LOCAL file into Roblox: uploads it to the user's own account via the Open Cloud
Permissions 3
network medium shell high env_vars low