Control Unity Editor through ~100 built-in tools. Works in both Editor and Play mode.
For Telegram, Discord, and other OpenClaw channels:
For Claude Code, Cursor, and local AI tools:
claude mcp add unity -- node <path>/MCP~/index.jsIf unity_execute tool is not available, install the gateway extension:
bash
# From skill directory
./scripts/install-extension.sh
# Restart gateway
openclaw gateway restart
The extension files are in extension/ directory.
bash
# 1. Copies extension files from skill to gateway
# Source: <skill>/extension/
# Destination: ~/.openclaw/extensions/unity/
# 2. Files installed:
# - index.ts # Extension entry point (HTTP handlers, tools)
# - package.json # Extension metadata
# After installation, restart gateway to load the extension.
이 스킬은 disableModelInvocation: true 로 설정되어 있습니다.
설정 변경 방법은 README.md 를 참조하세요.
CategoryKey ToolsScenescene.getActive, scene.getData, scene.load, scene.open, scene.saveGameObjectgameobject.find, gameobject.getAll, gameobject.create, gameobject.destroyComponentcomponent.get, component.set, component.add, component.removeTransformtransform.setPosition, transform.setRotation, transform.setScaleDebugdebug.hierarchy, debug.screenshot, console.getLogsInputinput.clickUI, input.type, input.keyPress, input.mouseClickEditoreditor.getState, editor.play, editor.stop, editor.refreshMaterialmaterial.create, material.assign, material.modify, material.getInfoPrefabprefab.create, prefab.instantiate, prefab.open, prefab.saveAssetasset.find, asset.copy, asset.move, asset.deletePackagepackage.add, package.remove, package.list, package.searchTesttest.run, test.list, test.getResults
text
unity_execute: debug.hierarchy {depth: 2}
unity_execute: scene.getActive
text
unity_execute: gameobject.find {name: "Player"}
unity_execute: component.get {name: "Player", componentType: "Transform"}
unity_execute: transform.setPosition {name: "Player", x: 0, y: 5, z: 0}
text
unity_execute: input.clickUI {name: "PlayButton"}
unity_execute: input.type {text: "TestUser", elementName: "UsernameInput"}
unity_execute: debug.screenshot
text
unity_execute: editor.play # Enter Play mode
unity_execute: editor.stop # Exit Play mode
unity_execute: editor.getState # Check current state
unity_execute: editor.pause # Pause
unity_execute: editor.unpause # Resume
text
unity_execute: material.create {name: "RedMetal", color: "#FF0000", metallic: 0.8}
unity_execute: material.assign {gameObjectName: "Player", materialPath: "Assets/Materials/RedMetal.mat"}
unity_execute: material.modify {path: "Assets/Materials/RedMetal.mat", metallic: 1.0, emission: "#FF4444"}
text
unity_execute: prefab.create {gameObjectName: "Player", path: "Assets/Prefabs/Player.prefab"}
unity_execute: prefab.instantiate {prefabPath: "Assets/Prefabs/Player.prefab", x: 0, y: 1, z: 0}
unity_execute: prefab.open {path: "Assets/Prefabs/Player.prefab"}
unity_execute: prefab.save
unity_execute: prefab.close
text
unity_execute: asset.find {query: "Player", type: "Prefab"}
unity_execute: asset.copy {sourcePath: "Assets/Prefabs/Player.prefab", destPath: "Assets/Backup/Player.prefab"}
unity_execute: asset.move {sourcePath: "Assets/Old/Item.prefab", destPath: "Assets/New/Item.prefab"}
text
unity_execute: package.list
unity_execute: package.search {query: "TextMeshPro"}
unity_execute: package.add {packageName: "com.unity.textmeshpro"}
unity_execute: package.add {gitUrl: "https://github.com/example/package.git"}
text
unity_execute: test.list {testMode: "EditMode"}
unity_execute: test.run {testMode: "EditMode", filter: "PlayerTests"}
unity_execute: test.getResults
text
# Debug logging
unity_execute: script.execute {code: "Debug.Log('Hello')"}
# Time manipulation
unity_execute: script.execute {code: "Time.timeScale = 0.5"}
# PlayerPrefs
unity_execute: script.execute {code: "PlayerPrefs.SetInt('score', 100)"}
# Reflection-based method calls
unity_execute: script.execute {code: "MyClass.MyMethod()"}
unity_execute: script.execute {code: "MyClass.MyStaticMethod('param1', 123)"}
console.getLogs - Get logs with optional type filter (Log/Warning/Error)console.getErrors - Get error/exception logs (with optional warnings)console.clear - Clear captured logsscene.list - List scenes in build settingsscene.getActive - Get active scene infoscene.getData - Get full hierarchy datascene.load - Load scene by name (Play mode)scene.open - Open scene in Editor modescene.save - Save active scene (Editor mode)scene.saveAll - Save all open scenes (Editor mode)gameobject.find - Find by name, tag, or componentgameobject.getAll - Get all GameObjects with filteringgameobject.create - Create object or primitive (Cube, Sphere, etc.)gameobject.destroy - Destroy objectgameobject.delete - Delete object (alias for destroy)gameobject.getData - Get detailed datagameobject.setActive - Enable/disablegameobject.setParent - Change hierarchytransform.getPosition - Get world position {x, y, z}transform.getRotation - Get Euler rotation {x, y, z}transform.getScale - Get local scale {x, y, z}transform.setPosition - Set world position {x, y, z}transform.setRotation - Set Euler rotationtransform.setScale - Set local scalecomponent.add - Add component by type namecomponent.remove - Remove componentcomponent.get - Get component data/propertiescomponent.set - Set field/property valuecomponent.list - List available component typesscript.execute - Execute code: Debug.Log, Time, PlayerPrefs, reflection callsscript.read - Read script filescript.list - List project scriptsapp.getState - Get play mode, FPS, timeapp.play - Enter/exit Play modeapp.pause - Toggle pauseapp.stop - Stop Play modedebug.log - Write to consoledebug.screenshot - Capture screenshotdebug.hierarchy - Text hierarchy vieweditor.refresh - Refresh AssetDatabase (triggers recompile)editor.recompile - Request script recompilationeditor.domainReload - Force domain reloadeditor.focusWindow - Focus window (game/scene/console/hierarchy/project/inspector)editor.listWindows - List open windowseditor.getState - Get editor stateeditor.play - Enter Play modeeditor.stop - Exit Play modeeditor.pause / editor.unpause - Pause controlinput.keyPress - Press and release keyinput.keyDown / input.keyUp - Hold/release keyinput.type - Type text into fieldinput.mouseMove - Move cursorinput.mouseClick - Click at positioninput.mouseDrag - Drag operationinput.mouseScroll - Scroll wheelinput.getMousePosition - Get cursor positioninput.clickUI - Click UI element by namematerial.create - Create material with shader, color, metallic, smoothnessmaterial.assign - Assign material to GameObjectmaterial.modify - Modify material properties (color, metallic, emission)material.getInfo - Get detailed material info with all shader propertiesmaterial.list - List materials in project with filteringprefab.create - Create prefab from scene GameObjectprefab.instantiate - Instantiate prefab in scene with positionprefab.open - Open prefab for editingprefab.close - Close prefab editing modeprefab.save - Save currently edited prefabasset.find - Search assets by query, type, folderasset.copy - Copy asset to new pathasset.move - Move/rename assetasset.delete - Delete asset (with trash option)asset.refresh - Refresh AssetDatabaseasset.import - Import/reimport specific assetasset.getPath - Get asset path by namepackage.add - Install package by name or git URLpackage.remove - Remove installed packagepackage.list - List installed packagespackage.search - Search Unity package registrytest.run - Run EditMode/PlayMode tests with filteringtest.list - List available teststest.getResults - Get last test run resultsbatch.execute - Execute multiple tools in one call (10-100x performance)
commands: Array of {tool, params} objectsstopOnError: Stop on first error (default: false)session.getInfo - Get session info (project, processId, machineName, sessionId)scriptableobject.create - Create new ScriptableObject assetscriptableobject.load - Load and inspect ScriptableObject fieldsscriptableobject.save - Save ScriptableObject changesscriptableobject.getField - Get specific field valuescriptableobject.setField - Set field value with auto-savescriptableobject.list - List ScriptableObjects in projectshader.list - List shaders in projectshader.getInfo - Get shader properties and infoshader.getKeywords - Get shader keywordstexture.create - Create new texture with color filltexture.getInfo - Get texture info (size, format, import settings)texture.setPixels - Fill region with colortexture.resize - Resize texture via import settingstexture.list - List textures in projectRegister project-specific tools:
csharp
OpenClawCustomTools.Register(
"mygame.getScore",
"Get current score",
(args) => new { success = true, score = GameManager.Score }
);
Access Unity data via MCP resource URIs:
URIDescriptionunity://scene/hierarchyScene hierarchyunity://scene/activeActive scene infounity://project/scriptsScript listunity://project/scenesScene listunity://editor/stateEditor stateunity://console/logsConsole logsunity://session/infoSession info
ScreenCapture - includes all UI overlaysCamera.main.Render() - no overlay UI{method: "camera"} for camera-only capturetext
gameobject.find {name: "Player"} # By exact name
gameobject.find {tag: "Enemy"} # By tag
gameobject.find {componentType: "Camera"} # By component
gameobject.getAll {activeOnly: true} # All active objects
Unity may not auto-recompile after code changes. Use:
text
editor.refresh # Full asset refresh + recompile
For Claude Code / Cursor integration:
claude mcp add unity -- node /path/to/MCP~/index.jscurl http://127.0.0.1:27182/statusKeyboard/mouse simulation works for UI interactions but NOT for Input.GetKey(). For gameplay testing:
transform.setPosition to move objects directlyIssueSolutionTool timeoutCheck Unity is responding, try editor.getStateGateway no connectionCheck Window → OpenClaw Plugin → SettingsMCP no connectionStart MCP Bridge, verify port 27182Scripts not updatingUse editor.refresh to force recompileWrong screenshotUse Play mode for game view with UIMCP 504 timeoutUnity busy or MCP Bridge not startedTest Runner not foundInstall com.unity.test-framework package
MIT License - See LICENSE file