{"owner":"CoplayDev","repo":"unity-mcp","hasSkills":true,"totalSkillsCount":91,"totalTokensCount":69388,"categories":["claude-rule","mcp-config","anthropic-skill"],"hasMcp":true,"mcpConfig":{"mcpServers":{"unity-mcp":{"command":"npx","args":["-y","@modelcontextprotocol/server-unity-mcp"]}}},"found":["CLAUDE.md",".claude/mcp.json",".claude/skills/mcp-source/SKILL.md",".claude/skills/unity-mcp-skill/SKILL.md",".claude/skills/blender-to-unity/SKILL.md","tools/UPDATE_DOCS_PROMPT.md","tools/unity-versions.json","unity-mcp-skill/references/tools-reference.md","unity-mcp-skill/references/probuilder-guide.md","unity-mcp-skill/references/resources-reference.md","unity-mcp-skill/references/workflows.md",".claude/skills/blender-to-unity/manual-verify.md","TestProjects/UnityMCPTests/Packages/manifest.json","TestProjects/AssetStoreUploads/Packages/manifest.json","TestProjects/AssetStoreUploads/Packages/packages-lock.json",".claude/skills/unity-mcp-skill/references/tools-reference.md",".claude/skills/unity-mcp-skill/references/workflows.md",".claude/skills/blender-to-unity/references/bridge-fidelity.md","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json","website/docs/reference/tools/index.md","TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json","website/docs/reference/tools/docs/_category_.json","website/docs/reference/tools/docs/index.md","website/docs/reference/tools/docs/unity_docs.md","website/docs/reference/tools/docs/unity_reflect.md","website/docs/reference/tools/core/_category_.json","website/docs/reference/tools/core/apply_text_edits.md","website/docs/reference/tools/core/batch_execute.md","website/docs/reference/tools/core/create_script.md","website/docs/reference/tools/core/debug_request_context.md","website/docs/reference/tools/core/delete_script.md","website/docs/reference/tools/core/execute_custom_tool.md","website/docs/reference/tools/core/execute_menu_item.md","website/docs/reference/tools/core/find_gameobjects.md","website/docs/reference/tools/core/find_in_file.md","website/docs/reference/tools/core/get_sha.md","website/docs/reference/tools/core/index.md","website/docs/reference/tools/core/manage_asset.md","website/docs/reference/tools/core/manage_build.md","website/docs/reference/tools/core/manage_camera.md","website/docs/reference/tools/core/manage_components.md","website/docs/reference/tools/core/manage_editor.md","website/docs/reference/tools/core/manage_gameobject.md","website/docs/reference/tools/core/manage_graphics.md","website/docs/reference/tools/core/manage_material.md","website/docs/reference/tools/core/manage_packages.md","website/docs/reference/tools/core/manage_physics.md","website/docs/reference/tools/core/manage_prefabs.md","website/docs/reference/tools/core/manage_scene.md","website/docs/reference/tools/core/manage_script.md","website/docs/reference/tools/core/manage_script_capabilities.md","website/docs/reference/tools/core/manage_tools.md","website/docs/reference/tools/core/read_console.md","website/docs/reference/tools/core/refresh_unity.md","website/docs/reference/tools/core/script_apply_edits.md","website/docs/reference/tools/core/set_active_instance.md","website/docs/reference/tools/core/validate_script.md","website/docs/reference/tools/asset_gen/_category_.json","website/docs/reference/tools/asset_gen/generate_audio.md","website/docs/reference/tools/asset_gen/generate_image.md","website/docs/reference/tools/asset_gen/generate_model.md","website/docs/reference/tools/asset_gen/import_model.md","website/docs/reference/tools/asset_gen/import_model_file.md","website/docs/reference/tools/asset_gen/index.md","website/docs/reference/tools/animation/_category_.json","website/docs/reference/tools/animation/index.md","website/docs/reference/tools/animation/manage_animation.md","website/docs/reference/tools/probuilder/_category_.json","website/docs/reference/tools/probuilder/index.md","website/docs/reference/tools/probuilder/manage_probuilder.md","website/docs/reference/tools/profiling/_category_.json","website/docs/reference/tools/profiling/index.md","website/docs/reference/tools/profiling/manage_profiler.md","website/docs/reference/tools/scripting_ext/_category_.json","website/docs/reference/tools/scripting_ext/execute_code.md","website/docs/reference/tools/scripting_ext/index.md","website/docs/reference/tools/scripting_ext/manage_scriptable_object.md","website/docs/reference/tools/testing/_category_.json","website/docs/reference/tools/testing/get_test_job.md","website/docs/reference/tools/testing/index.md","website/docs/reference/tools/testing/run_tests.md","website/docs/reference/tools/ui/_category_.json","website/docs/reference/tools/ui/index.md","website/docs/reference/tools/ui/manage_ui.md","website/docs/reference/tools/vfx/_category_.json","website/docs/reference/tools/vfx/index.md","website/docs/reference/tools/vfx/manage_shader.md","website/docs/reference/tools/vfx/manage_texture.md","website/docs/reference/tools/vfx/manage_vfx.md"],"skills":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## What This Project Is\n\n**MCP for Unity** is a bridge that lets AI assistants (Claude, Cursor, Windsurf, etc.) control the Unity Editor through the Model Context Protocol (MCP). It enables AI-driven game development workflows - creating GameObjects, editing scripts, managing assets, running tests, and more.\n\n## Architecture\n\n```text\nAI Assistant (Claude/Cursor)\n        ↓ MCP Protocol (stdio/HTTP)\nPython Server (Server/src/)\n        ↓ WebSocket + HTTP\nUnity Editor Plugin (MCPForUnity/)\n        ↓ Unity Editor API\nScene, Assets, Scripts\n```\n\n**Two codebases, one system:**\n- `Server/` - Python MCP server using FastMCP\n- `MCPForUnity/` - Unity C# Editor package\n\n### Three Layers on the Python Side\n\nThe Python server has three distinct layers. These are **not** auto-generated from each other:\n\n| Layer | Location | Framework | Purpose |\n|-------|----------|-----------|---------|\n| **MCP Tools** | `Server/src/services/tools/` | FastMCP (`@mcp_for_unity_tool`) | Exposed to AI assistants via MCP protocol |\n| **CLI Commands** | `Server/src/cli/commands/` | Click (`@click.command`) | Terminal interface for developers |\n| **Resources** | `Server/src/services/resources/` | FastMCP (`@mcp_for_unity_resource`) | Read-only state exposed to AI assistants |\n\nMCP tools call Unity via WebSocket (`send_with_unity_instance`). CLI commands call Unity via HTTP (`run_command`). Both route to the same C# `HandleCommand` methods.\n\n### Transport Modes\n\n- **Stdio**: Single-agent only. Separate Python process per client. Legacy TCP bridge to Unity. New connections stomp old ones.\n- **HTTP**: Multi-agent ready. Single shared Python server. WebSocket hub at `/hub/plugin`. Session isolation via `client_id`.\n\n## Code Philosophy\n\n### 1. Domain Symmetry\nPython MCP tools mirror C# Editor tools. Each domain exists in both:\n- `Server/src/services/tools/manage_material.py` ↔ `MCPForUnity/Editor/Tools/ManageMaterial.cs`\n- CLI commands (`Server/src/cli/commands/`) also mirror these but are a separate implementation.\n\n### 2. Minimal Abstraction\nAvoid premature abstraction. Three similar lines of code is better than a helper that's used once. Only abstract when you have 3+ genuine use cases.\n\n### 3. Delete Rather Than Deprecate\nWhen removing functionality, delete it completely. No `_unused` renames, no `// removed` comments, no backwards-compatibility shims for internal code.\n\n### 4. Test Coverage Required\nEvery new feature needs tests. Run them before PRs.\n\n### 5. Keep Tools Focused\nEach MCP tool does one thing well. Resist the urge to add \"convenient\" parameters that bloat the API surface.\n\n### 6. Use Resources for Reading\nKeep them smart and focused rather than \"read everything\" type resources. Resources should be quick and LLM-friendly.\n\n## Key Patterns\n\n### Python MCP Tool Registration\nTools in `Server/src/services/tools/` are auto-discovered. Use the `@mcp_for_unity_tool` decorator:\n```python\nfrom services.registry import mcp_for_unity_tool\n\n@mcp_for_unity_tool(\n    description=\"Does something in Unity.\",\n    group=\"core\",  # core (default), vfx, animation, ui, scripting_ext, testing, probuilder, profiling, docs, asset_gen\n)\nasync def manage_something(\n    ctx: Context,\n    action: Annotated[Literal[\"create\", \"delete\"], \"Action to perform\"],\n) -> dict[str, Any]:\n    unity_instance = await get_unity_instance_from_context(ctx)\n    params = {\"action\": action}\n    response = await send_with_unity_instance(async_send_command_with_retry, unity_instance, \"manage_something\", params)\n    return response\n```\n\nThe `group` parameter controls tool visibility. Only `\"core\"` is enabled by default. Non-core groups (vfx, animation, etc.) start disabled and are toggled via `manage_tools`.\n\n### Python CLI Error Handling\nCLI commands (not MCP tools) use the `@handle_unity_errors` decorator:\n```python\n@handle_unity_errors\nasync def my_command(ctx, ...):\n    result = await call_unity_tool(...)\n```\n\n### C# Tool Registration\nTools are auto-discovered by `CommandRegistry` via reflection. Use the `[McpForUnityTool]` attribute:\n```csharp\n[McpForUnityTool(\"manage_something\", AutoRegister = false, Group = \"core\")]\npublic static class ManageSomething\n{\n    // Sync handler (most tools):\n    public static object HandleCommand(JObject @params)\n    {\n        var p = new ToolParams(@params);\n        // ...\n        return new SuccessResponse(\"Done.\", new { data = result });\n    }\n\n    // OR async handler (for long-running operations like play-test, refresh, batch):\n    public static async Task<object> HandleCommand(JObject @params)\n    {\n        // CommandRegistry detects Task return type automatically\n        await SomeAsyncOperation();\n        return new SuccessResponse(\"Done.\");\n    }\n}\n```\n\nAsync handlers use `EditorApplication.update` polling with `TaskCompletionSource` — see `RefreshUnity.cs` for the canonical pattern.\n\n### C# Parameter Handling\nUse `ToolParams` for consistent parameter validation:\n```csharp\nvar p = new ToolParams(parameters);\nvar pageSize = p.GetInt(\"page_size\", \"pageSize\") ?? 50;\nvar name = p.RequireString(\"name\");\n```\n\n### C# Resources\nResources use `[McpForUnityResource]` and follow the same `HandleCommand` pattern as tools. They provide read-only state to AI assistants.\n\n### Paging Large Results\nAlways page results that could be large (hierarchies, components, search results):\n- Use `page_size` and `cursor` parameters\n- Return `next_cursor` when more results exist\n\n### Composing Tools Internally (C#)\nUse `CommandRegistry.InvokeCommandAsync` to call other tools from within a handler:\n```csharp\nvar result = await CommandRegistry.InvokeCommandAsync(\"read_console\", consoleParams);\n```\n\n### Unity API Compatibility Shims\nWe support a wide Unity version range (2021+ → 6.x → CoreCLR 6.8). When an API is renamed, deprecated, or removed across versions, **don't sprinkle `#if UNITY_x_y_OR_NEWER` at every call site** — add a shim in `MCPForUnity/Runtime/Helpers/Unity*Compat.cs` and route every caller through it.\n\nThe catalog of active shims, the policy for when to add one, what does NOT belong in a shim, and the reflection-cache pattern all live in **`MCPForUnity/Runtime/Helpers/UnityCompatShims.cs`** — the XML doc on that empty marker class is the source of truth and ships inside the UPM package, so end-users can `F12`/Go-to-definition into it. Sources for current deprecations: Unity 6.x upgrade guides and the [CoreCLR 2026 thread](https://discussions.unity.com/t/path-to-coreclr-2026-upgrade-guide/1714279).\n\nWhen you touch a shim or anything else gated by `#if UNITY_*_OR_NEWER`, run `tools/check-unity-versions.sh` to compile-check across the CI matrix locally before committing — the matrix lives in `tools/unity-versions.json`.\n\n## Commands\n\n### Running Tests\n```bash\n# Python (all tests)\ncd Server && uv run pytest tests/ -v\n\n# Python (single test file)\ncd Server && uv run pytest tests/test_manage_material.py -v\n\n# Python (single test by name)\ncd Server && uv run pytest tests/ -k \"test_create_material\" -v\n\n# Unity - open TestProjects/UnityMCPTests in Unity, use Test Runner window\n\n# Local multi-version compile check (parity with CI matrix, see tools/unity-versions.json)\ntools/check-unity-versions.sh           # compile-only across installed Unity Hub editors\ntools/check-unity-versions.sh --full    # full EditMode test run\n\n# License-free Roslyn compile of MCPForUnity, the same gate compile-check.yml runs on every PR.\n# No Editor launch, ~1 min per version. EXTRA_REFS must hold Newtonsoft.Json.dll and\n# nunit.framework.dll (copy them from TestProjects/UnityMCPTests/Library/PackageCache);\n# the script header has the full recipe, including the Windows/Git Bash form.\nUNITY_DATA=/path/to/Editor/Data UNITY_VERSION=2021.3.45f2 EXTRA_REFS=/path/to/refs tools/compile-check.sh\n```\n\n#### Local headless test harness\nOne command boots a headless Hub-licensed Editor against `TestProjects/UnityMCPTests` and runs the smoke + EditMode + PlayMode legs over the bridge — the same entrypoint CI uses (`.github/workflows/e2e-bridge.yml`):\n\n```bash\npython tools/local_harness.py\n```\n\nKey flags: `--legs smoke,editmode,playmode` (subset to run), `--project-path` (target project, default `TestProjects/UnityMCPTests`), `--reuse` (attach to an already-resident bridge instead of booting one), `--keep-alive` (leave the Editor running after the legs), `--no-warmup` (skip the warm-up import phase).\n\nExit codes: `0` pass, `1` blocking-leg regression, `2` bridge unreachable / setup failure, `3` project does not compile, `4` no Unity license / Hub seat, `5` Editor binary/version not found. Requires a Hub-activated Editor locally (no ULF/serial).\n\n### Local Development\n1. Set **Server Source Override** in MCP for Unity Advanced Settings to your local `Server/` path\n2. Enable **Dev Mode** checkbox to force fresh installs\n3. Use `mcp_source.py` to switch Unity package sources\n4. Test on Windows and Mac if possible, and multiple clients (Claude Desktop and Claude Code are tricky for configuration as of this writing)\n\n### Adding a New Tool\n1. Add Python MCP tool in `Server/src/services/tools/manage_<domain>.py` using `@mcp_for_unity_tool`\n2. Add Python CLI commands in `Server/src/cli/commands/<domain>.py` using Click\n3. Add C# implementation in `MCPForUnity/Editor/Tools/Manage<Domain>.cs` with `[McpForUnityTool]`\n4. Add Python tests in `Server/tests/test_manage_<domain>.py`\n5. Add Unity tests in `TestProjects/UnityMCPTests/Assets/Tests/`\n\n## What Not To Do\n\n- Don't add features without tests\n- Don't create helper functions for one-time operations\n- Don't add error handling for scenarios that can't happen\n- Don't commit to `main` directly - branch off `beta` for PRs\n- Don't add docstrings/comments to code you didn't change\n",".claude/mcp.json":"{\n  \"mcpServers\": {\n    \"UnityMCP\": {\n      \"type\": \"http\",\n      \"url\": \"http://localhost:8080/mcp\"\n    }\n  }\n}\n",".claude/skills/mcp-source/SKILL.md":"---\nname: mcp-source\ndescription: Switch MCP for Unity package source in connected Unity projects. Use /mcp-source [main|beta|branch|local] to swap between upstream releases, your remote branch, or local dev checkout.\n---\n\n# Switch MCP for Unity Package Source\n\nYou are switching the `com.coplaydev.unity-mcp` package source in one or more Unity projects.\n\n## allowed-tools\n\nBash, Read, Edit, ReadMcpResourceTool, ListMcpResourcesTool\n\n## Instructions\n\n### 1. Parse arguments\n\nThe user's argument is: `$ARGUMENTS`\n\nValid values: `main`, `beta`, `branch`, `local`, or empty.\n\nIf empty or not one of the four valid values, ask the user to choose:\n- **main** — upstream main branch (stable releases)\n- **beta** — upstream beta branch (pre-release)\n- **branch** — your current remote branch (for testing a PR)\n- **local** — local file reference to your checkout (for live dev iteration)\n\n### 2. Detect repo context\n\nRun these git commands from the current working directory to find the unity-mcp repo:\n\n```bash\ngit rev-parse --show-toplevel    # → repo_root\ngit rev-parse --abbrev-ref HEAD  # → branch_name\ngit remote get-url origin        # → origin_url\n```\n\nConvert SSH origins to HTTPS: if `origin_url` starts with `git@github.com:`, transform it to `https://github.com/{owner}/{repo}.git`.\n\n### 3. Discover target Unity projects\n\nTry two approaches to find `Packages/manifest.json` files to update:\n\n**Approach A — MCP resources (preferred):**\nRead `mcpforunity://project/info` for each connected Unity instance (use `ListMcpResourcesTool` to find available instances). Extract `projectRoot` and use `{projectRoot}/Packages/manifest.json`.\n\n**Approach B — filesystem fallback:**\nIf no MCP instances are connected, search upward from the current working directory for `Packages/manifest.json` files using Bash:\n```bash\nfind \"$(pwd)\" -maxdepth 3 -name \"manifest.json\" -path \"*/Packages/manifest.json\" 2>/dev/null\n```\n\nIf multiple manifests are found, update all of them (confirming with the user first).\n\n### 4. Build the package URL\n\nBased on the user's selection, construct the dependency value:\n\n| Selection | URL |\n|-----------|-----|\n| `main`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main` |\n| `beta`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#beta` |\n| `branch`  | `{origin_https}?path=/MCPForUnity#{branch_name}` |\n| `local`   | `file:{repo_root}/MCPForUnity` |\n\nFor `branch`: use the HTTPS-normalized origin URL and current git branch name.\nFor `local`: use the absolute path to the repo root with `file:` prefix (no `//`), e.g. `file:/Users/davidsarno/unity-mcp/MCPForUnity`.\n\n### 5. Update each manifest\n\nFor each discovered `manifest.json`:\n\n1. Read the file with the Read tool\n2. Find the `\"com.coplaydev.unity-mcp\"` dependency line\n3. Use the Edit tool to replace the old value with the new URL\n4. Report what was changed: old value → new value, file path\n\n### 6. Report results\n\nAfter updating, tell the user:\n- Which manifests were updated\n- The old and new package source values\n- Remind them: \"Unity will re-resolve the package automatically. If it doesn't, open Package Manager and click Refresh.\"\n",".claude/skills/unity-mcp-skill/SKILL.md":"---\nname: unity-mcp-orchestrator\ndescription: Orchestrate Unity Editor via MCP (Model Context Protocol) tools and resources. Use when working with Unity projects through MCP for Unity - creating/modifying GameObjects, editing scripts, managing scenes, running tests, or any Unity Editor automation. Provides best practices, tool schemas, and workflow patterns for effective Unity-MCP integration.\n---\n\n# Unity-MCP Operator Guide\n\nThis skill helps you effectively use the Unity Editor with MCP tools and resources.\n\n## Template Notice\n\nExamples in `references/workflows.md` and `references/tools-reference.md` are reusable templates. They may be inaccurate across Unity versions, package setups (UGUI/TMP/Input System), and project-specific conventions. Please check console, compilation errors, or use screenshot after implementation.\n\nBefore applying a template:\n- Validate targets/components first via resources and `find_gameobjects`.\n- Treat names, enum values, and property payloads as placeholders to adapt.\n\n## Quick Start: Resource-First Workflow\n\n**Always read relevant resources before using tools.** This prevents errors and provides the necessary context.\n\n```\n1. Check editor state     → mcpforunity://editor/state\n2. Understand the scene   → mcpforunity://scene/gameobject-api\n3. Find what you need     → find_gameobjects or resources\n4. Take action            → tools (manage_gameobject, create_script, script_apply_edits, apply_text_edits, validate_script, delete_script, get_sha, etc.)\n5. Verify results         → read_console, manage_camera(action=\"screenshot\"), resources\n```\n\n**If a tool you need is not in your tool list, it is not necessarily missing.** Check these before troubleshooting the connection:\n\n- **Project custom tools** (C# `[McpForUnityTool]`): with project-scoped tools enabled on the server, they are *not* callable by name. List them via `mcpforunity://custom-tools` and run them with `execute_custom_tool(tool_name=\"...\", parameters={...})`. With it disabled, they are registered as ordinary tools and appear in your list.\n- **Disabled tool groups**: over HTTP, a session starts with only the `core` group enabled. Over stdio, all groups start enabled and are then synced to the tool toggles in the Unity editor, so a tool can still be hidden. `manage_tools(action=\"list_groups\")` shows the groups, `manage_tools(action=\"activate\", group=\"...\")` enables one.\n\n## Critical Best Practices\n\n### 1. After Writing/Editing Scripts: Wait for Compilation and Check Console\n\n```python\n# After create_script or script_apply_edits:\n# Both tools already trigger AssetDatabase.ImportAsset + RequestScriptCompilation automatically.\n# No need to call refresh_unity — just wait for compilation to finish, then check console.\n\n# 1. Poll editor state until compilation completes\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 2. Check for compilation errors\nread_console(types=[\"error\"], count=10, include_stacktrace=True)\n```\n\n**Why:** Unity must compile scripts before they're usable. `create_script` and `script_apply_edits` already trigger import and compilation automatically — calling `refresh_unity` afterward is redundant.\n\n### 2. Use `batch_execute` for Multiple Operations\n\n```python\n# 10-100x faster than sequential calls\nbatch_execute(\n    commands=[\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube1\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube2\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube3\", \"primitive_type\": \"Cube\"}}\n    ],\n    parallel=True  # Hint only: Unity may still execute sequentially\n)\n```\n\n**Max 25 commands per batch by default (configurable in Unity MCP Tools window, max 100).** Use `fail_fast=True` for dependent operations.\n\n**Tip:** Also use `batch_execute` for discovery — batch multiple `find_gameobjects` calls instead of calling them one at a time:\n```python\nbatch_execute(commands=[\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Camera\", \"search_method\": \"by_component\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Player\", \"search_method\": \"by_tag\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"GameManager\", \"search_method\": \"by_name\"}}\n])\n```\n\n### 3. Use Screenshots to Verify Visual Results\n\n```python\n# Basic screenshot (saves to Assets/, returns file path only)\nmanage_camera(action=\"screenshot\")\n\n# Inline screenshot (returns base64 PNG directly to the AI)\nmanage_camera(action=\"screenshot\", include_image=True)\n\n# Use a specific camera and cap resolution for smaller payloads\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n\n# Batch surround: captures front/back/left/right/top/bird_eye around the scene\nmanage_camera(action=\"screenshot\", batch=\"surround\", max_resolution=256)\n\n# Batch surround centered on a specific object\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Positioned screenshot: place a temp camera and capture in one call\nmanage_camera(action=\"screenshot\", view_target=\"Player\", view_position=[0, 10, -10], max_resolution=512)\n\n# Scene View screenshot: capture what the developer sees in the editor\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n```\n\n**Best practices for AI scene understanding:**\n- Use `include_image=True` when you need to *see* the scene, not just save a file.\n- Use `batch=\"surround\"` for a comprehensive overview (6 angles, one command).\n- Use `view_target`/`view_position` to capture from a specific viewpoint without needing a scene camera.\n- Use `capture_source=\"scene_view\"` to see the editor viewport (gizmos, wireframes, grid).\n- Keep `max_resolution` at 256–512 to balance quality vs. token cost.\n\n```python\n# Agentic camera loop: point, shoot, analyze\nmanage_gameobject(action=\"look_at\", target=\"MainCamera\", look_at_target=\"Player\")\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n# → Analyze image, decide next action\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Scene View for editor-level inspection (shows gizmos, debug overlays, etc.)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Player\", include_image=True)\n```\n\n### 4. Check Console After Major Changes\n\n```python\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\"],  # Focus on problems\n    count=10,\n    format=\"detailed\"\n)\n```\n\n### 5. Always Check `mcpforunity://editor/state` Before Complex Operations\n\n```python\n# Read mcpforunity://editor/state to check:\n# - is_compiling: Wait if true\n# - is_domain_reload_pending: Wait if true  \n# - ready_for_tools: Only proceed if true\n# - blocking_reasons: Why tools might fail\n```\n\n## Parameter Type Conventions\n\nThese are common patterns, not strict guarantees. `manage_components.set_property` payload shapes can vary by component/property; if a template fails, inspect the component resource payload and adjust.\n\n### Vectors (position, rotation, scale, color)\n```python\n# Both forms accepted:\nposition=[1.0, 2.0, 3.0]        # List\nposition=\"[1.0, 2.0, 3.0]\"     # JSON string\n```\n\n### Booleans\n```python\n# Both forms accepted:\ninclude_inactive=True           # Boolean\ninclude_inactive=\"true\"         # String\n```\n\n### Colors\n```python\n# Auto-detected format:\ncolor=[255, 0, 0, 255]         # 0-255 range\ncolor=[1.0, 0.0, 0.0, 1.0]    # 0.0-1.0 normalized (auto-converted)\n```\n\n### Paths\n```python\n# Assets-relative (default):\npath=\"Assets/Scripts/MyScript.cs\"\n\n# URI forms:\nuri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\"\nuri=\"file:///full/path/to/file.cs\"\n```\n\n## Core Tool Categories\n\n| Category | Key Tools | Use For |\n|----------|-----------|---------|\n| **Scene** | `manage_scene`, `find_gameobjects` | Scene operations, finding objects. Multi-scene editing (additive load, close, set active, move GO between scenes), scene templates (`3d_basic`, `2d_basic`, `empty`, `default`), scene validation with `auto_repair`. For build settings, use `manage_build(action=\"scenes\")`. |\n| **Objects** | `manage_gameobject`, `manage_components` | Creating/modifying GameObjects |\n| **Scripts** | `create_script`, `script_apply_edits`, `validate_script` | C# code management (auto-refreshes on create/edit) |\n| **Assets** | `manage_asset`, `manage_prefabs` | Asset operations. **Prefab instantiation** is done via `manage_gameobject(action=\"create\", prefab_path=\"...\")`, not `manage_prefabs`. |\n| **Editor** | `manage_editor`, `execute_menu_item`, `read_console` | Editor control, package deployment (`deploy_package`/`restore_package`), undo/redo (`undo`/`redo` actions) |\n| **Testing** | `run_tests`, `get_test_job` | Unity Test Framework |\n| **Batch** | `batch_execute` | Parallel/bulk operations |\n| **Camera** | `manage_camera` | Camera management (Unity Camera + Cinemachine). **Tier 1** (always available): create, target, lens, priority, list, screenshot. **Tier 2** (requires `com.unity.cinemachine`): brain, body/aim/noise pipeline, extensions, blending, force/release. 7 presets: follow, third_person, freelook, dolly, static, top_down, side_scroller. Resource: `mcpforunity://scene/cameras`. Use `ping` to check Cinemachine availability. See [tools-reference.md](references/tools-reference.md#camera-tools). |\n| **Animation** | `manage_animation`, `manage_sprite` | Animator control, clips and controllers. **2D sprite sheets**: `manage_sprite(action=\"get_info\")` returns a PNG or JPEG sheet as an image to count the grid from, then `full_setup` slices it and builds clips and a controller; clip names decide the states (idle, walk/run, attack-type triggers). Off by default over HTTP: `manage_tools(action=\"activate\", group=\"animation\")`. |\n| **Graphics** | `manage_graphics` | Rendering and post-processing management. 33 actions across 5 groups: **Volume** (create/configure volumes and effects, URP/HDRP), **Bake** (lightmaps, light probes, reflection probes, Edit mode only), **Stats** (draw calls, batches, memory), **Pipeline** (quality levels, pipeline settings), **Features** (URP renderer features: add, remove, toggle, reorder). Resources: `mcpforunity://scene/volumes`, `mcpforunity://rendering/stats`, `mcpforunity://pipeline/renderer-features`. Use `ping` to check pipeline status. See [tools-reference.md](references/tools-reference.md#graphics-tools). |\n| **Packages** | `manage_packages` | Install, remove, search, and manage Unity packages and scoped registries. Query actions: list installed, search registry, get info, ping, poll status. Mutating actions: add/remove packages, embed for editing, add/remove scoped registries, force resolve. Validates identifiers, warns on git URLs, checks dependents before removal (`force=true` to override). See [tools-reference.md](references/tools-reference.md#package-tools). |\n| **Physics** | `manage_physics` | Manage 3D and 2D physics (21 actions). Settings, collision matrix, materials, joints (14 types). Queries: `raycast`, `raycast_all`, `linecast`, `shapecast` (sphere/box/capsule sweep), `overlap`. Forces: `apply_force` (AddForce/AddTorque/AddExplosionForce with ForceMode). Rigidbody: `get_rigidbody`, `configure_rigidbody` (mass, drag, gravity, constraints, collision detection). Validation: scene-wide checks. Simulation: `simulate_step` in edit mode. See [tools-reference.md](references/tools-reference.md#physics-tools). |\n| **ProBuilder** | `manage_probuilder` | 3D modeling, mesh editing, complex geometry. **When `com.unity.probuilder` is installed, prefer ProBuilder shapes over primitive GameObjects** for editable geometry, multi-material faces, or complex shapes. Supports 12 shape types, face/edge/vertex editing, smoothing, and per-face materials. See [ProBuilder Guide](references/probuilder-guide.md). |\n| **UI** | `manage_ui`, `batch_execute` with `manage_gameobject` + `manage_components` | **UI Toolkit**: Use `manage_ui` to create UXML/USS files, attach UIDocument, inspect visual trees. **uGUI (Canvas)**: Use `batch_execute` for Canvas, Panel, Button, Text, Slider, Toggle, Input Field. **Read `mcpforunity://project/info` first** to detect uGUI/TMP/Input System/UI Toolkit availability. (see [UI workflows](references/workflows.md#ui-creation-workflows)) |\n| **Docs** | `unity_reflect`, `unity_docs` | API verification and documentation lookup. **`unity_reflect`** inspects live C# APIs via reflection (requires Unity connection): `search` types across assemblies, `get_type` for member summary, `get_member` for full signatures. **`unity_docs`** fetches official docs from docs.unity3d.com (no Unity connection needed): `get_doc` (ScriptReference), `get_manual` (Manual pages), `get_package_doc` (package docs), `lookup` (parallel search all sources + project assets). **Trust hierarchy: reflection > project assets > docs.** Workflow: `unity_reflect` search -> get_type -> get_member -> `unity_docs` lookup. See [tools-reference.md](references/tools-reference.md#docs-tools). |\n| **More** | `manage_material`, `manage_texture`, `manage_shader`, `manage_vfx`, `manage_profiler`, `execute_code`, `manage_scriptable_object`, `generate_image`, `generate_model`, `generate_audio`, `import_model`, `import_model_file`, `blender_bridge` | Materials; textures, shaders and VFX (`vfx` group); profiling (`profiling`); in-editor C# and ScriptableObjects (`scripting_ext`); AI asset generation, Sketchfab and on-disk model import, Blender (`asset_gen`). Every tool has a section in [tools-reference.md](references/tools-reference.md). |\n\n## Common Workflows\n\n### Creating a New Script and Using It\n\n```python\n# 1. Create the script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/PlayerController.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class PlayerController : MonoBehaviour\\n{\\n    void Update() { }\\n}\"\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for compilation errors\nread_console(types=[\"error\"], count=10)\n\n# 4. Only then attach to GameObject\nmanage_gameobject(action=\"modify\", target=\"Player\", components_to_add=[\"PlayerController\"])\n```\n\n### Finding and Modifying GameObjects\n\n```python\n# 1. Find by name/tag/component (returns IDs only)\nresult = find_gameobjects(search_term=\"Enemy\", search_method=\"by_tag\", page_size=50)\n\n# 2. Get full data via resource\n# mcpforunity://scene/gameobject/{instance_id}\n\n# 3. Modify using the ID\nmanage_gameobject(action=\"modify\", target=instance_id, position=[10, 0, 0])\n```\n\n### Running and Monitoring Tests\n\n```python\n# 1. Start test run (async)\nresult = run_tests(mode=\"EditMode\", test_names=[\"MyTests.TestSomething\"])\njob_id = result[\"job_id\"]\n\n# 2. Poll for completion\nresult = get_test_job(job_id=job_id, wait_timeout=60, include_failed_tests=True)\n```\n\n## Pagination Pattern\n\nLarge queries return paginated results. Always follow `next_cursor`:\n\n```python\ncursor = 0\nall_items = []\nwhile True:\n    result = manage_scene(action=\"get_hierarchy\", page_size=50, cursor=cursor)\n    all_items.extend(result[\"data\"][\"items\"])\n    if not result[\"data\"].get(\"next_cursor\"):\n        break\n    cursor = result[\"data\"][\"next_cursor\"]\n```\n\n## Multi-Instance Workflow\n\nWhen multiple Unity Editors are running:\n\n```python\n# 1. List instances via resource: mcpforunity://instances\n# 2. Set active instance\nset_active_instance(instance=\"MyProject@abc123\")\n# 3. All subsequent calls route to that instance\n```\n\n## Error Recovery\n\n| Symptom | Cause | Solution |\n|---------|-------|----------|\n| Tools return \"busy\" | Compilation in progress | Wait, check `mcpforunity://editor/state` |\n| \"stale_file\" error | File changed since SHA | Re-fetch SHA with `get_sha`, retry |\n| Connection lost | Domain reload | Wait ~5s, reconnect |\n| Commands fail silently | Wrong instance | Check `set_active_instance` |\n\n## Reference Files\n\nFor detailed schemas and examples:\n\n- **[tools-reference.md](references/tools-reference.md)**: Every tool's main actions, parameters, and examples, with links to the full parameter tables\n- **[resources-reference.md](references/resources-reference.md)**: All available resources and their data\n- **[workflows.md](references/workflows.md)**: Extended workflow examples and patterns\n- **[probuilder-guide.md](references/probuilder-guide.md)**: ProBuilder modeling patterns\n",".claude/skills/blender-to-unity/SKILL.md":"---\nname: blender-to-unity\ndescription: Hand off a model from Blender (via BlenderMCP) into Unity (via MCP for Unity) — export the current Blender model, import it through import_model_file, and place it in the open scene. Use when the user has BlenderMCP and MCP for Unity both connected and wants to bring a Blender model into Unity. Does NOT drive Blender's own generators; BlenderMCP owns how the model got into Blender.\n---\n\n# Blender → Unity Model Handoff\n\nBring whatever model is currently in Blender into the open Unity scene. The seam is the\nlocal filesystem: Blender exports a file, Unity imports it. The two servers never talk\ndirectly.\n\n## Preconditions\n- Both `mcp__blender__*` tools and MCP for Unity tools are connected.\n- A model exists in the Blender scene (confirm with `mcp__blender__get_scene_info` /\n  `mcp__blender__get_object_info`). If empty, stop and tell the user — this skill does not generate models.\n- **`import_model_file` is in the `asset_gen` tool group, which is off by default** (only `core`\n  loads). Enable it first with `manage_tools` (enable the `asset_gen` group), **or** call the C#\n  handler straight through `batch_execute` —\n  `{\"tool\":\"import_model_file\",\"params\":{\"sourcePath\":...,\"name\":...,\"outputFolder\":...}}` (camelCase)\n  — which dispatches by name regardless of group gating.\n\n## Steps\n1. **Resolve the Unity project path.** Read `mcpforunity://editor/state` for the project\n   root (the editor dataPath's parent). Decide the export format:\n   - **GLB (glTFast) when the model has a rig, animation, PBR (metallic/roughness), emission,\n     or transparency** — glTFast carries all of these automatically, no post-processing\n     (see [references/bridge-fidelity.md](references/bridge-fidelity.md)). Multi-material zones\n     survive either format, so they alone don't force GLB.\n   - **FBX otherwise** — when glTFast isn't installed, the model is plain geometry, or you\n     specifically need the built-in importer's humanoid-avatar pipeline. FBX drops emission/metallic\n     (Step 5 restores emission) and surfaces animation only with `animation_type` set (Step 3).\n2. **Export from Blender to a temp path** via `mcp__blender__execute_blender_code`:\n   ```python\n   import bpy, os, tempfile\n   out = os.path.join(tempfile.gettempdir(), \"blender_to_unity.fbx\")\n   # Export the selection if any, else the whole scene:\n   bpy.ops.export_scene.fbx(filepath=out, use_selection=bool(bpy.context.selected_objects),\n                            apply_unit_scale=True, bake_space_transform=True)\n   print(out)\n   ```\n   (glTF branch: `out_glb = os.path.join(tempfile.gettempdir(), \"blender_to_unity.glb\")`, then\n   `bpy.ops.export_scene.gltf(filepath=out_glb, export_format='GLB', use_active_scene=True)`\n   — its default `use_active_scene=False` can silently export a *different* open scene.)\n3. **Import into Unity** with `import_model_file`:\n   `import_model_file(source_path=<temp path>, name=<asset name>, target_size=<final size in meters>)`.\n   For a **rigged/animated FBX**, also pass `animation_type=\"generic\"` (or `\"humanoid\"`; `\"legacy\"`\n   targets the old Animation-component system) — the importer defaults to `\"none\"`, which\n   deliberately imports the mesh with **zero animation clips**. GLB ignores this (glTFast imports\n   animation itself), so it's an FBX-only knob.\n   It returns `{ asset_path, asset_guid }`. Pass `target_size` as the intended final size, but treat\n   it only as a hint: it rescales at import solely when the project's **Auto-normalize** pref is on,\n   and even then is unreliable for Blender FBX (see the **Scale** note). Step 4 does the reliable\n   normalization.\n4. **Place it in the scene, normalized to size.** Ensure the scene has a camera + directional\n   light (`manage_scene` / `manage_gameobject`). Instantiate the model at the chosen position via\n   `manage_gameobject(action=\"create\", prefab_path=<asset_path>, name=<asset name>, position=[x,y,z])`.\n   Then normalize its size deterministically — Blender FBX commonly imports ~100× too large — by\n   measuring the placed model's world bounds and scaling so its largest dimension equals your target\n   size. Run via `execute_code` (substitute your object name and target meters):\n   ```csharp\n   var go = GameObject.Find(\"<asset name>\");\n   var rs = go.GetComponentsInChildren<Renderer>();\n   var b = rs[0].bounds; for (int i = 1; i < rs.Length; i++) b.Encapsulate(rs[i].bounds);\n   float maxDim = Mathf.Max(b.size.x, Mathf.Max(b.size.y, b.size.z));\n   float target = 2f; // intended size in meters\n   if (maxDim > 0.0001f) go.transform.localScale *= target / maxDim;\n   ```\n5. **Restore emission FBX dropped (FBX path).** Blender scenes commonly store their color/glow\n   in *material emission* (and other Principled-node inputs). FBX carries base/diffuse color but\n   **not emission**, so neon / \"Tron\" scenes import as dark bodies with black accents. If the\n   import looks flat vs. Blender, restore it:\n   a. Dump the emissive materials from Blender via `execute_blender_code`:\n      ```python\n      import bpy, json\n      out = {}\n      for m in bpy.data.materials:\n          if not (m.use_nodes and m.node_tree): continue\n          col, s = (0, 0, 0), 0.0\n          p = next((n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None)\n          es = next((k for k in ('Emission Color', 'Emission') if p and k in p.inputs), None)  # 4.x / 3.x name\n          if es:\n              col = tuple(p.inputs[es].default_value)[:3]\n              s = float(p.inputs['Emission Strength'].default_value)\n          e = next((n for n in m.node_tree.nodes if n.type == 'EMISSION'), None)\n          if e and s == 0:\n              col = tuple(e.inputs['Color'].default_value)[:3]; s = float(e.inputs['Strength'].default_value)\n          if s > 0 and sum(col) > 0.01:\n              out[m.name] = [round(col[0], 3), round(col[1], 3), round(col[2], 3), round(s, 3)]\n      print(json.dumps(out))\n      ```\n   b. In Unity (`execute_code`): extract the FBX's materials so they're editable\n      (`AssetDatabase.ExtractAsset` per `Material`, then `ImportAsset(fbx, ForceUpdate)`), then for\n      each dumped name set `_EmissionColor = color * Mathf.Clamp(strength*0.45f, 1.5f, 5f)`,\n      `EnableKeyword(\"_EMISSION\")`, and `globalIlluminationFlags = RealtimeEmissive`. Match names\n      **case-insensitively** — FBX mangles case and can split one material into variants\n      (`EdgeCyan` → `EdgeCyan` + `EDGE_CYAN`); set every match. Add a global Bloom volume and enable\n      the camera's `renderPostProcessing` so the emission actually glows.\n6. **Verify** with `manage_camera(action=\"screenshot\", include_image=true)` and report the\n   asset path + a screenshot.\n\n## Notes\n- **Scale.** Models from Blender almost always arrive at the wrong scale — its FBX unit handling\n  makes them land ~100× too large in Unity. `import_model_file`'s `target_size` only rescales at\n  import when the project's Auto-normalize pref is enabled, and its importer-level normalization is\n  unreliable for Blender FBX (it can over- or under-shoot, e.g. a `target_size=2` model measured 200 m).\n  The robust fix is the Step 4 measure-bounds-then-set-`localScale` routine, which hits the target\n  size deterministically regardless of the import scale or the Auto-normalize pref.\n- **Materials & emission.** FBX carries base/diffuse color and transforms fine, but **drops\n  emission and any node-based color** — so Blender neon / \"Tron\" scenes (color stored in\n  emission) import as dark bodies with black accents. Two fixes: **(a) prefer glTF/GLB when glTFast\n  is installed** — glTF's PBR model carries `emissiveFactor` + `KHR_materials_emissive_strength`\n  natively, so emission survives with no post-step (`bpy.ops.export_scene.gltf(filepath=out, export_format='GLB', use_active_scene=True)`);\n  **(b) with FBX, run Step 5** to dump Blender's emission and reapply it. Also check the mesh for a\n  `color_attributes` (vertex color) layer — the *data* survives FBX, but URP Lit won't *display* it;\n  that needs a vertex-color-reading shader, not `_EmissionColor`.\n- FBX is the default because glTFast is optional in MCP for Unity. If the import errors with\n  \"GLB import requires glTFast\", re-export as FBX (or install glTFast from the Dependencies tab).\n- **Format fidelity.** [references/bridge-fidelity.md](references/bridge-fidelity.md) is a tested\n  matrix of what each format carries. Summary: **GLB (glTFast)** keeps textures, metallic/roughness,\n  emission, transparency, and animation automatically; **FBX** drops metallic + emission, needs\n  `ModelImporter.animationType = Generic` to surface transform animation, and needs material/texture\n  extraction to assign an embedded texture. Both bake modifiers and carry geometry + vertex-color\n  *data* (URP Lit won't *display* vertex colors). Neither carries procedural/node materials — bake\n  them to image textures in Blender first.\n- **Animation doesn't auto-play.** An imported clip won't move the model until an `AnimatorController`\n  drives it — the placed model has an `Animator` with a **null controller**, so it looks frozen. Build\n  one with `manage_animation` (`controller_create` → add the clip as a looping state → `controller_assign`\n  onto the instance) rather than hand-rolling `execute_code`. See bridge-fidelity gotcha #7.\n- **Multi-material zones survive.** A mesh split into material slots in Blender (e.g. skin/shirt/pants\n  regions) imports as submeshes with one material each — base colors carry over GLB natively — so you\n  can \"dress\" a model with material zones and it arrives intact.\n- Keep one model per handoff; for batches, repeat the loop with distinct names.\n- This skill never sends API keys or file bytes over the MCP bridge — Unity reads the file from disk.\n- `import_model_file` copies only the single source file; for multi-file exports (a text `.gltf` with an external `.bin`, or an `.obj` with a sibling `.mtl`/textures), zip them first and pass the `.zip` — a bare `.gltf`/`.obj` will lose its sidecars.\n","tools/UPDATE_DOCS_PROMPT.md":"# LLM Prompt for Updating Documentation\n\nCopy and paste this prompt into your LLM after you add, remove, rename or change an MCP tool or resource. Review its changes, then make sure the checks in step 5 pass.\n\n---\n\n## Prompt\n\nI've just changed MCP tools or resources in this MCP for Unity repository. Please update the documentation to match.\n\n1. **Read the current tools and resources**:\n   - `Server/src/services/tools/`: tools (`@mcp_for_unity_tool`, including its `group`)\n   - `Server/src/services/resources/`: resources (`@mcp_for_unity_resource`)\n   - `Server/src/cli/commands/`: the Click CLI commands that mirror the tools\n\n2. **Regenerate the reference pages.** `website/docs/reference/tools/**` and `website/docs/reference/resources/index.md` are generated from the registry:\n   ```bash\n   cd Server && uv run python ../tools/generate_docs_reference.py\n   ```\n   Do not hand-edit them, except for usage examples between `<!-- examples:start -->` and `<!-- examples:end -->`, which the generator keeps.\n\n3. **Update the hand-maintained files**:\n   - **manifest.json**: the `tools` array must list exactly the registered tools as `{\"name\", \"description\"}` entries; put new ones in alphabetical position. Resources are not listed. `Server/tests/test_manifest_tools.py` fails when a tool is missing, extra or listed twice, but it compares names only: when a tool's purpose changes, check its one-line description by hand.\n   - **Tool groups**: if a tool adds a group or changes what a group covers, update the group's blurb in `TOOL_GROUPS` (`Server/src/services/registry/tool_registry.py`; it feeds the generated group pages, the `tool_groups` resource and `manage_tools`) and the group lists in `website/docs/guides/tool-groups.md` and `website/docs/contributing/dev-setup.md`.\n   - **Tool count**: `README.md`, `docs/i18n/README-zh.md` and `website/docs/guides/tool-groups.md` state how many tools ship. Update the number if it changed.\n   - **CLI docs**: the group table in `website/docs/reference/cli.md` and the \"Complete Command Reference\" table in `website/docs/guides/cli.md` must match the Click command tree (`cd Server && uv run unity-mcp --help`, then `--help` on each group).\n   - **Skill**: if agents need new guidance for the change, update the skill. It has two copies, `unity-mcp-skill/` and `.claude/skills/unity-mcp-skill/`; keep both copies identical.\n\n4. **Leave the release notes alone.** `README.md` has no tool or resource lists; it links to the website catalog. Its \"Recent Updates\" block (the latest 5 releases) and `website/docs/releases.md` are generated from GitHub Releases, whose notes GitHub builds from merged PR titles. After each release, `release.yml` dispatches `.github/workflows/sync-releases.yml`, which runs `tools/sync_release_notes.py` and merges the result into `beta` through its own PR. The \"最近更新\" block in `docs/i18n/README-zh.md` is not synced; it is updated by hand at release time.\n\n5. **After updating**, run these checks:\n   ```bash\n   cd Server\n   uv run python ../tools/generate_docs_reference.py --check\n   uv run pytest tests/test_manifest_tools.py\n   ```\n\nPlease show me the exact changes you're making to each file, and explain any discrepancies you find.\n\n---\n","tools/unity-versions.json":"{\n  \"$comment\": \"Single source of truth for Unity versions exercised by CI and tools/check-unity-versions.* local script. Versions are pinned to specific patch releases (no floating tags) per acceptance criteria in CoplayDev/unity-mcp#1107. Every id MUST have a corresponding GameCI Docker image at unityci/editor:ubuntu-<id>-base-3 since both CI (game-ci/unity-test-runner@v4) and local --docker mode pull from there. Verify availability before bumping: https://hub.docker.com/v2/repositories/unityci/editor/tags/?name=<id>\",\n  \"$coverageGap\": \"UNITY_6000_5_OR_NEWER and UNITY_6000_6_OR_NEWER branches are NOT exercised by this matrix because GameCI has not yet published Docker images for Unity 6000.5+/6000.6+. Bump the 'rolling' row to a 6000.5+/6000.6+ patch once https://hub.docker.com/r/unityci/editor publishes one. Tracked branches in code: UnityObjectIdCompat.cs (EntityId path).\",\n  \"defaultVersion\": \"6000.0.75f1\",\n  \"$defaultVersionComment\": \"Unity version used when CI runs the narrow matrix (default PR feedback path). Must be one of the ids in 'versions' below. Today's pick is 6.0 LTS — the version most users target. The 'floor' role still identifies the package's minimum supported version separately.\",\n  \"versions\": [\n    {\n      \"id\": \"2021.3.45f2\",\n      \"role\": \"floor\",\n      \"notes\": \"Package minimum (matches MCPForUnity/package.json 'unity' field and TestProjects/UnityMCPTests/ProjectSettings/ProjectVersion.txt). Legacy branch: all UNITY_2022_*/UNITY_6000_* flags OFF.\"\n    },\n    {\n      \"id\": \"2022.3.62f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Last 2022 LTS. Exercises UNITY_2022_1/2/3_OR_NEWER branches; UNITY_2023_*/UNITY_6000_* OFF. Catches FindObjectsByType-style regressions (the #1105 path).\"\n    },\n    {\n      \"id\": \"6000.0.75f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Unity 6.0 LTS (latest patch on GameCI). UNITY_6000_0_OR_NEWER ON (27 files), UNITY_2023_*_OR_NEWER ON, UNITY_6000_3/4/5/6 OFF.\"\n    },\n    {\n      \"id\": \"6000.4.8f1\",\n      \"role\": \"rolling\",\n      \"notes\": \"Latest 6.x available on GameCI. UNITY_6000_0/1/2/3/4_OR_NEWER ON; UNITY_6000_5/6 OFF (no GameCI image yet — see $coverageGap).\"\n    }\n  ]\n}\n","unity-mcp-skill/references/tools-reference.md":"# Unity-MCP Tools Reference\n\nEvery built-in MCP tool, with its main actions, parameters, and usage examples. For a tool's full parameter table, open its generated page: `https://coplaydev.github.io/unity-mcp/reference/tools/<group>/<tool>` (tools with no group, such as `manage_tools`, are under `core`).\n\nEach section names the tool's group when it is not `core`. A tool outside `core` can be hidden (over HTTP, only `core` starts enabled); enable its group with `manage_tools(action=\"activate\", group=\"<group>\")`.\n\n> **Template warning:** Examples in this file are skill templates and may be inaccurate for some Unity versions, packages, or project setups. Validate parameters and payload shapes against your active tool schema and runtime behavior.\n\n## Table of Contents\n\n- [Infrastructure Tools](#infrastructure-tools)\n- [Scene Tools](#scene-tools)\n- [GameObject Tools](#gameobject-tools)\n- [Script Tools](#script-tools)\n- [Asset Tools](#asset-tools)\n- [Material & Shader Tools](#material--shader-tools)\n- [UI Tools](#ui-tools)\n- [Editor Control Tools](#editor-control-tools)\n- [Build Tools](#build-tools)\n- [Testing Tools](#testing-tools)\n- [Search Tools](#search-tools)\n- [Custom Tools](#custom-tools)\n- [Camera Tools](#camera-tools)\n- [Graphics Tools](#graphics-tools)\n- [Package Tools](#package-tools)\n- [Physics Tools](#physics-tools)\n- [ProBuilder Tools](#probuilder-tools)\n- [Profiler Tools](#profiler-tools)\n- [Docs Tools](#docs-tools)\n- [Animation Tools](#animation-tools)\n- [VFX Tools](#vfx-tools)\n- [Scripting Extension Tools](#scripting-extension-tools)\n- [Asset Generation Tools](#asset-generation-tools)\n\n---\n\n## Project Info Resource\n\nRead `mcpforunity://project/info` to detect project capabilities before making assumptions about UI, input, or rendering setup.\n\n**Returned fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `projectRoot` | string | Absolute path to project root |\n| `projectName` | string | Project folder name |\n| `unityVersion` | string | e.g. `\"2022.3.20f1\"` |\n| `platform` | string | Active build target e.g. `\"StandaloneWindows64\"` |\n| `assetsPath` | string | Absolute path to Assets folder |\n| `renderPipeline` | string | `\"BuiltIn\"`, `\"Universal\"`, `\"HighDefinition\"`, or `\"Custom\"` |\n| `activeInputHandler` | string | `\"Old\"`, `\"New\"`, or `\"Both\"` |\n| `packages.ugui` | bool | `com.unity.ugui` installed (Canvas, Image, Button, etc.) |\n| `packages.textmeshpro` | bool | `com.unity.textmeshpro` installed (TMP_Text, TMP_InputField) |\n| `packages.inputsystem` | bool | `com.unity.inputsystem` installed (InputAction, PlayerInput) |\n| `packages.uiToolkit` | bool | Always `true` for Unity 2021.3+ (UIDocument, VisualElement, UXML/USS) |\n| `packages.screenCapture` | bool | `com.unity.modules.screencapture` enabled (ScreenCapture API for screenshots) |\n\n**Key decision points:**\n\n- **UI system**: If `packages.uiToolkit` is true (always for Unity 2021+), use `manage_ui` for UI Toolkit workflows (UXML/USS). If `packages.ugui` is true, use Canvas + uGUI components via `batch_execute`. UI Toolkit is preferred for new UI — it uses a frontend-like workflow (UXML for structure, USS for styling).\n- **Text**: If `packages.textmeshpro` is true, use `TextMeshProUGUI` instead of legacy `Text`.\n- **Input**: Use `activeInputHandler` to decide EventSystem module — `StandaloneInputModule` (Old) vs `InputSystemUIInputModule` (New). See [workflows.md — Input System](workflows.md#input-system-old-vs-new).\n- **Shaders**: Use `renderPipeline` to pick correct shader names — `Standard` (BuiltIn) vs `Universal Render Pipeline/Lit` (URP) vs `HDRP/Lit` (HDRP).\n\n---\n\n## Infrastructure Tools\n\n### batch_execute\n\nExecute multiple MCP commands in a single batch (10-100x faster).\n\n```python\nbatch_execute(\n    commands=[                    # list[dict], required, max 25\n        {\"tool\": \"tool_name\", \"params\": {...}},\n        ...\n    ],\n    parallel=False,              # bool, optional - advisory only (Unity may still run sequentially)\n    fail_fast=False,             # bool, optional - stop on first failure\n    max_parallelism=None         # int, optional - max parallel workers\n)\n```\n\n`batch_execute` is not transactional: earlier commands are not rolled back if a later command fails.\n\n### set_active_instance\n\nRoute commands to a specific Unity instance (multi-instance workflows).\n\n```python\nset_active_instance(\n    instance=\"ProjectName@abc123\"  # str, required - Name@hash or hash prefix\n)\n```\n\n### refresh_unity\n\nRefresh asset database and trigger script compilation.\n\n```python\nrefresh_unity(\n    mode=\"if_dirty\",             # \"if_dirty\" | \"force\"\n    scope=\"all\",                 # \"assets\" | \"scripts\" | \"all\"\n    compile=\"none\",              # \"none\" | \"request\"\n    wait_for_ready=True          # bool - wait until editor ready\n)\n```\n\n### manage_tools\n\nShow, enable, or hide tool groups for the current session. Always visible (no group).\n\n```python\nmanage_tools(action=\"list_groups\")                  # every group, whether it is on, and its tools\nmanage_tools(action=\"activate\", group=\"animation\")  # \"deactivate\" hides a group again\nmanage_tools(action=\"sync\")                         # re-read the tool toggles in the Unity editor\nmanage_tools(action=\"reset\")                        # back to the defaults\n```\n\nGroups: `core`, `animation`, `asset_gen`, `docs`, `probuilder`, `profiling`, `scripting_ext`, `testing`, `ui`, `vfx`. The `mcpforunity://tool-groups` resource lists the same catalog read-only. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_tools)\n\n### debug_request_context\n\nDiagnostics: returns the request's `client_id`, `session_id` and meta, the session's active Unity instance, and the server version. No parameters; always visible (no group).\n\n```python\ndebug_request_context()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/debug_request_context)\n\n---\n\n## Scene Tools\n\n### manage_scene\n\nScene CRUD operations, hierarchy queries, multi-scene editing, validation, and scene view control. Screenshots are `manage_camera` actions (see [Camera Tools](#camera-tools)); build-settings scenes are `manage_build(action=\"scenes\")`.\n\n```python\n# Get hierarchy (paginated)\nmanage_scene(\n    action=\"get_hierarchy\",\n    page_size=50,                # int, default 50, max 500\n    cursor=0,                    # int, pagination cursor\n    parent=None,                 # str|int, optional - filter by parent\n    include_transform=False      # bool - include local transforms\n)\n\n# Frame scene view on target\nmanage_scene(\n    action=\"scene_view_frame\",\n    scene_view_target=\"Player\"   # str|int - GO name, path, or instance ID to frame\n)\n\n# Other actions\nmanage_scene(action=\"get_active\")        # Current scene info\nmanage_scene(action=\"get_build_settings\") # Build settings\nmanage_scene(action=\"create\", name=\"NewScene\", path=\"Assets/Scenes/\")\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Main.unity\")\nmanage_scene(action=\"save\")\n\n# Scene templates: \"empty\" (no objects), \"default\", \"3d_basic\", \"2d_basic\"\nmanage_scene(action=\"create\", name=\"Level1\", path=\"Assets/Scenes/\", template=\"3d_basic\")\n\n# Multi-scene editing\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Level2.unity\", additive=True)  # keep current scene\nmanage_scene(action=\"get_loaded_scenes\")\nmanage_scene(action=\"set_active_scene\", scene_name=\"Level2\")\nmanage_scene(action=\"move_to_scene\", target=\"Player\", scene_name=\"Level2\")     # moves a root GameObject\nmanage_scene(action=\"close_scene\", scene_name=\"Level2\", remove_scene=True)     # remove_scene=False only unloads\n\n# Validation: missing scripts, broken prefabs\nmanage_scene(action=\"validate\")\nmanage_scene(action=\"validate\", auto_repair=True)  # also removes missing scripts (undoable)\n```\n\n### find_gameobjects\n\nSearch for GameObjects (returns instance IDs only).\n\n```python\nfind_gameobjects(\n    search_term=\"Player\",        # str, required\n    search_method=\"by_name\",     # \"by_name\"|\"by_tag\"|\"by_layer\"|\"by_component\"|\"by_path\"|\"by_id\"\n    include_inactive=False,      # bool|str\n    page_size=50,                # int, default 50, max 500\n    cursor=0                     # int, pagination cursor\n)\n# Returns: {\"ids\": [12345, 67890], \"next_cursor\": 50, ...}\n```\n\n---\n\n## GameObject Tools\n\n### manage_gameobject\n\nCreate, modify, delete, duplicate GameObjects.\n\n```python\n# Create\nmanage_gameobject(\n    action=\"create\",\n    name=\"MyCube\",               # str, required\n    primitive_type=\"Cube\",       # \"Cube\"|\"Sphere\"|\"Capsule\"|\"Cylinder\"|\"Plane\"|\"Quad\"\n    position=[0, 1, 0],          # list[float] or JSON string \"[0,1,0]\"\n    rotation=[0, 45, 0],         # euler angles\n    scale=[1, 1, 1],\n    components_to_add=[\"Rigidbody\", \"BoxCollider\"],\n    save_as_prefab=False,\n    prefab_path=\"Assets/Prefabs/MyCube.prefab\"\n)\n\n# Prefab instantiation — place a prefab instance in the scene\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"                # optional parent GameObject\n)\n# Smart lookup — just the prefab name works too:\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Modify\nmanage_gameobject(\n    action=\"modify\",\n    target=\"Player\",             # name, path, or instance ID\n    search_method=\"by_name\",     # how to find target\n    position=[10, 0, 0],\n    rotation=[0, 90, 0],\n    scale=[2, 2, 2],\n    set_active=True,\n    layer=\"Player\",\n    components_to_add=[\"AudioSource\"],\n    components_to_remove=[\"OldComponent\"],\n    component_properties={       # nested dict for property setting\n        \"Rigidbody\": {\n            \"mass\": 10.0,\n            \"useGravity\": True\n        }\n    }\n)\n\n# Delete\nmanage_gameobject(action=\"delete\", target=\"OldObject\")\n\n# Duplicate\nmanage_gameobject(\n    action=\"duplicate\",\n    target=\"Player\",\n    new_name=\"Player2\",\n    offset=[5, 0, 0]             # position offset from original\n)\n\n# Move relative\nmanage_gameobject(\n    action=\"move_relative\",\n    target=\"Player\",\n    reference_object=\"Enemy\",    # optional reference\n    direction=\"left\",            # \"left\"|\"right\"|\"up\"|\"down\"|\"forward\"|\"back\"\n    distance=5.0,\n    world_space=True\n)\n\n# Look at target (rotates GO to face a point or another GO)\nmanage_gameobject(\n    action=\"look_at\",\n    target=\"MainCamera\",         # the GO to rotate\n    look_at_target=\"Player\",     # str (GO name/path) or list[float] world position\n    look_at_up=[0, 1, 0]        # optional up vector, default [0,1,0]\n)\n```\n\n### manage_components\n\nAdd, remove, or set properties on components.\n\n```python\n# Add component\nmanage_components(\n    action=\"add\",\n    target=12345,                # instance ID (preferred) or name\n    component_type=\"Rigidbody\",\n    search_method=\"by_id\"\n)\n\n# Remove component\nmanage_components(\n    action=\"remove\",\n    target=\"Player\",\n    component_type=\"OldScript\"\n)\n\n# Set single property\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Rigidbody\",\n    property=\"mass\",\n    value=5.0\n)\n\n# Set multiple properties\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Transform\",\n    properties={\n        \"position\": [1, 2, 3],\n        \"localScale\": [2, 2, 2]\n    }\n)\n\n# Set object reference property (reference another GameObject by name)\nmanage_components(\n    action=\"set_property\",\n    target=\"GameManager\",\n    component_type=\"GameManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Bee_1\"}]\n)\n\n# Object reference formats supported:\n# - {\"name\": \"ObjectName\"}     → Find GameObject in scene by name\n# - {\"instanceID\": 12345}      → Direct instance ID reference\n# - {\"guid\": \"abc123...\"}      → Asset GUID reference\n# - {\"path\": \"Assets/...\"}     → Asset path reference\n# - \"Assets/Prefabs/My.prefab\" → String shorthand for asset paths\n# - \"ObjectName\"               → String shorthand for scene name lookup\n# - 12345                      → Integer shorthand for instanceID\n# - {\"guid\": \"...\", \"spriteName\": \"Hero_0\"} or {\"guid\": \"...\", \"fileID\": 12345}\n#                              → Sprite sub-asset of a sliced sheet (single-sprite textures resolve from guid/path alone)\n```\n\n---\n\n## Script Tools\n\n### create_script\n\nCreate a new C# script.\n\n```python\ncreate_script(\n    path=\"Assets/Scripts/MyScript.cs\",  # str, required\n    contents='''using UnityEngine;\n\npublic class MyScript : MonoBehaviour\n{\n    void Start() { }\n    void Update() { }\n}''',\n    script_type=\"MonoBehaviour\",  # optional hint\n    namespace=\"MyGame\"            # optional namespace\n)\n```\n\n### script_apply_edits\n\nApply structured edits to C# scripts (safer than raw text edits).\n\n```python\nscript_apply_edits(\n    name=\"MyScript\",             # script name (no .cs)\n    path=\"Assets/Scripts\",       # folder path\n    edits=[\n        # Replace entire method\n        {\n            \"op\": \"replace_method\",\n            \"methodName\": \"Update\",\n            \"replacement\": \"void Update() { transform.Rotate(Vector3.up); }\"\n        },\n        # Insert new method\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": \"void OnEnable() { Debug.Log(\\\"Enabled\\\"); }\"\n        },\n        # Delete method\n        {\n            \"op\": \"delete_method\",\n            \"methodName\": \"OldMethod\"\n        },\n        # Anchor-based insert\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"void Start()\",\n            \"position\": \"before\",  # \"before\" | \"after\"\n            \"text\": \"// Called before Start\\n\"\n        },\n        # Regex replace\n        {\n            \"op\": \"regex_replace\",\n            \"pattern\": \"Debug\\\\.Log\\\\(\",\n            \"text\": \"Debug.LogWarning(\"\n        },\n        # Prepend/append to file\n        {\"op\": \"prepend\", \"text\": \"// File header\\n\"},\n        {\"op\": \"append\", \"text\": \"\\n// File footer\"}\n    ]\n)\n```\n\n### apply_text_edits\n\nApply precise character-position edits (1-indexed lines/columns).\n\n```python\napply_text_edits(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    edits=[\n        {\n            \"startLine\": 10,\n            \"startCol\": 5,\n            \"endLine\": 10,\n            \"endCol\": 20,\n            \"newText\": \"replacement text\"\n        }\n    ],\n    precondition_sha256=\"abc123...\",  # optional, prevents stale edits\n    strict=True                        # optional, stricter validation\n)\n```\n\n### validate_script\n\nCheck script for syntax/semantic errors.\n\n```python\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    level=\"standard\",            # \"basic\" | \"standard\"\n    include_diagnostics=True     # include full error details\n)\n```\n\n### get_sha\n\nGet file hash without content (for preconditions).\n\n```python\nget_sha(uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\")\n# Returns: {\"sha256\": \"...\", \"lengthBytes\": 1234}\n```\n\n### delete_script\n\nDelete a script file.\n\n```python\ndelete_script(uri=\"mcpforunity://path/Assets/Scripts/OldScript.cs\")\n```\n\n### manage_script\n\nLegacy whole-file router with three actions: `create`, `read`, `delete`. `name` is the class name without `.cs`; `path` is its folder under `Assets/`. There is no update action: edit with `script_apply_edits` or `apply_text_edits`.\n\n```python\nmanage_script(action=\"read\", name=\"PlayerController\", path=\"Assets/Scripts\")  # returns the file contents\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script)\n\n### manage_script_capabilities\n\nLists the edit ops `script_apply_edits` supports (structured and text), the max edit payload size, and the active guards. No parameters; always visible (no group).\n\n```python\nmanage_script_capabilities()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script_capabilities)\n\n---\n\n## Asset Tools\n\n### manage_asset\n\nAsset operations: search, import, create, modify, delete.\n\n```python\n# Search assets (paginated)\nmanage_asset(\n    action=\"search\",\n    path=\"Assets\",               # search scope\n    search_pattern=\"*.prefab\",   # glob or \"t:MonoScript\" filter\n    filter_type=\"Prefab\",        # optional type filter\n    page_size=25,                # keep small to avoid large payloads\n    page_number=1,               # 1-based\n    generate_preview=False       # avoid base64 bloat\n)\n\n# Get asset info\nmanage_asset(action=\"get_info\", path=\"Assets/Prefabs/Player.prefab\")\n\n# Create asset\nmanage_asset(\n    action=\"create\",\n    path=\"Assets/Materials/NewMaterial.mat\",\n    asset_type=\"Material\",\n    properties={\"color\": [1, 0, 0, 1]}\n)\n\n# Duplicate/move/rename\nmanage_asset(action=\"duplicate\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\nmanage_asset(action=\"move\", path=\"Assets/A.prefab\", destination=\"Assets/Prefabs/A.prefab\")\nmanage_asset(action=\"rename\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\n\n# Create folder\nmanage_asset(action=\"create_folder\", path=\"Assets/NewFolder\")\n\n# Delete\nmanage_asset(action=\"delete\", path=\"Assets/OldAsset.asset\")\n```\n\n### manage_prefabs\n\nPrefab assets: headless edits with `modify_contents`, or interactive editing in a prefab stage.\n\n```python\n# Get prefab info\nmanage_prefabs(action=\"get_info\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Get prefab hierarchy\nmanage_prefabs(action=\"get_hierarchy\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Create prefab from scene GameObject\nmanage_prefabs(\n    action=\"create_from_gameobject\",\n    target=\"Player\",             # GameObject in scene\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    allow_overwrite=False\n)\n\n# Modify prefab contents (headless)\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",        # object within prefab\n    position=[0, 1, 0],\n    components_to_add=[\"AudioSource\"]\n)\n\n# Delete child GameObjects from prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    delete_child=[\"OldChild\", \"Turret/Barrel\"]  # single string or list\n)\n\n# Create child GameObject in prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    create_child={\"name\": \"SpawnPoint\", \"primitive_type\": \"Sphere\", \"position\": [0, 2, 0]}\n)\n# A list creates several children in one save; \"source_prefab_path\" instead of\n# \"primitive_type\" nests a prefab instance: {\"name\": \"Gun\", \"source_prefab_path\": \"Assets/Prefabs/Gun.prefab\"}\n\n# Set component properties on prefab contents\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",\n    component_properties={\"Rigidbody\": {\"mass\": 5.0}, \"MyScript\": {\"health\": 100}}\n)\n\n# Interactive: open a prefab stage, edit with manage_gameobject/manage_components, save, close\nmanage_prefabs(action=\"open_prefab_stage\", prefab_path=\"Assets/Prefabs/Enemy.prefab\")\nmanage_prefabs(action=\"save_prefab_stage\")\nmanage_prefabs(action=\"close_prefab_stage\")  # back to the main scene\n```\n\n---\n\n## Material & Shader Tools\n\n### manage_material\n\nCreate and modify materials.\n\n```python\n# Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/Red.mat\",\n    shader=\"Standard\",\n    properties={\"_Color\": [1, 0, 0, 1]}\n)\n\n# Get material info\nmanage_material(action=\"get_material_info\", material_path=\"Assets/Materials/Red.mat\")\n\n# Set shader property\nmanage_material(\n    action=\"set_material_shader_property\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_Metallic\",\n    value=0.8\n)\n\n# Set color\nmanage_material(\n    action=\"set_material_color\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_BaseColor\",\n    color=[0, 1, 0, 1]           # RGBA\n)\n\n# Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"MyCube\",\n    material_path=\"Assets/Materials/Red.mat\",\n    slot=0                       # material slot index\n)\n\n# Set renderer color directly\nmanage_material(\n    action=\"set_renderer_color\",\n    target=\"MyCube\",\n    color=[1, 0, 0, 1],\n    mode=\"create_unique\"          # Creates a unique .mat asset per object (persistent)\n    # Other modes: \"property_block\" (default, not persistent),\n    #              \"shared\" (mutates shared material — avoid for primitives),\n    #              \"instance\" (runtime only, not persistent)\n)\n```\n\n### manage_texture\n\nCreate procedural textures. Group: `vfx`.\n\n```python\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checker.png\",\n    width=64,\n    height=64,\n    fill_color=[255, 255, 255, 255]  # or [1.0, 1.0, 1.0, 1.0]\n)\n\n# Apply pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checker.png\",\n    pattern=\"checkerboard\",      # \"checkerboard\"|\"stripes\"|\"dots\"|\"grid\"|\"brick\"\n    palette=[[0,0,0,255], [255,255,255,255]],\n    pattern_size=8\n)\n\n# Apply gradient\nmanage_texture(\n    action=\"apply_gradient\",\n    path=\"Assets/Textures/Gradient.png\",\n    gradient_type=\"linear\",      # \"linear\"|\"radial\"\n    gradient_angle=45,\n    palette=[[255,0,0,255], [0,0,255,255]]\n)\n```\n\n### manage_shader\n\nCreate, read, update, or delete `.shader` files. Group: `vfx`. `name` is the file name without `.shader`; `path` is its folder under `Assets/`. To use the shader, pass the name declared in its `Shader \"...\"` line to `manage_material`.\n\n```python\nmanage_shader(action=\"create\", name=\"UnlitTint\", path=\"Assets/Shaders\",\n              contents='Shader \"Custom/UnlitTint\" { ... }')\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/vfx/manage_shader)\n\n---\n\n## UI Tools\n\n### manage_ui\n\nManage Unity UI Toolkit elements: UXML documents, USS stylesheets, UIDocument components, and visual tree inspection. Group: `ui`.\n\n```python\n# Create a UXML file\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='<ui:UXML xmlns:ui=\"UnityEngine.UIElements\"><ui:Label text=\"Hello\" /></ui:UXML>'\n)\n\n# Create a USS stylesheet\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 32px; color: white; }\"\n)\n\n# Read a UXML/USS file\nmanage_ui(\n    action=\"read\",\n    path=\"Assets/UI/MainMenu.uxml\"\n)\n# Returns: {\"success\": true, \"data\": {\"contents\": \"...\", \"path\": \"...\"}}\n\n# Update an existing file\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 48px; color: yellow; -unity-font-style: bold; }\"\n)\n\n# Attach UIDocument to a GameObject\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UICanvas\",                    # GameObject name or path\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/Panel.asset\",  # optional, auto-creates if omitted\n    sort_order=0                          # optional, default 0\n)\n\n# Create PanelSettings asset\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/Panel.asset\",\n    scale_mode=\"ScaleWithScreenSize\",     # optional: \"ConstantPixelSize\"|\"ConstantPhysicalSize\"|\"ScaleWithScreenSize\"\n    reference_resolution={\"width\": 1920, \"height\": 1080}  # optional, for ScaleWithScreenSize\n)\n\n# Inspect the visual tree of a UIDocument\nmanage_ui(\n    action=\"get_visual_tree\",\n    target=\"UICanvas\",                    # GameObject with UIDocument\n    max_depth=10                          # optional, default 10\n)\n# Returns: hierarchy of VisualElements with type, name, classes, styles, text, children\n```\n\n**UI Toolkit workflow:**\n\n1. Create UXML (structure, like HTML) and USS (styling, like CSS) files\n2. Create a PanelSettings asset (or let `attach_ui_document` auto-create one)\n3. Create an empty GameObject and attach UIDocument with the UXML source\n4. Use `get_visual_tree` to inspect the result\n\n**Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML files, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n---\n\n## Editor Control Tools\n\n### manage_editor\n\nControl Unity Editor state, undo/redo. Prefab stages are `manage_prefabs` actions.\n\n```python\nmanage_editor(action=\"play\")               # Enter play mode\nmanage_editor(action=\"pause\")              # Pause play mode\nmanage_editor(action=\"stop\")               # Exit play mode\n\nmanage_editor(action=\"set_active_tool\", tool_name=\"Move\")  # Move/Rotate/Scale/etc.\n\nmanage_editor(action=\"add_tag\", tag_name=\"Enemy\")\nmanage_editor(action=\"remove_tag\", tag_name=\"OldTag\")\n\nmanage_editor(action=\"add_layer\", layer_name=\"Projectiles\")\nmanage_editor(action=\"remove_layer\", layer_name=\"OldLayer\")\n\nmanage_editor(action=\"undo\")               # Returns the name of the undone step\nmanage_editor(action=\"redo\")\n\n# Package deployment (no confirmation dialog — designed for LLM-driven iteration)\nmanage_editor(action=\"deploy_package\")     # Copy configured MCPForUnity source into installed package\nmanage_editor(action=\"restore_package\")    # Revert to pre-deployment backup\n```\n\n**Deploy workflow:** Set the source path in MCP for Unity Advanced Settings first. `deploy_package` copies the source into the project's package location, creates a backup, and triggers `AssetDatabase.Refresh`. Follow with `refresh_unity(wait_for_ready=True)` to wait for recompilation.\n\n### execute_menu_item\n\nExecute any Unity menu item.\n\n```python\nexecute_menu_item(menu_path=\"File/Save Project\")\nexecute_menu_item(menu_path=\"GameObject/3D Object/Cube\")\nexecute_menu_item(menu_path=\"Window/General/Console\")\n```\n\n### read_console\n\nRead or clear Unity console messages.\n\n```python\n# Get recent messages\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\", \"log\"],  # or [\"all\"]\n    count=10,                    # max messages (ignored with paging)\n    filter_text=\"NullReference\", # optional text filter\n    page_size=50,\n    cursor=0,\n    format=\"detailed\",           # \"plain\"|\"detailed\"|\"json\"\n    include_stacktrace=True\n)\n\n# Clear console\nread_console(action=\"clear\")\n```\n\n---\n\n## Build Tools\n\n### manage_build\n\nPlayer builds, platform switching, player settings, build-settings scenes, build profiles, and batch builds. Actions: `build`, `status`, `platform`, `settings`, `scenes`, `profiles`, `batch`, `cancel`. `build` and `batch` return a `job_id`; poll it with `status`, stop it with `cancel`. `platform`, `settings` (with `property`) and `scenes` read when the value is omitted and write when it is given. `profiles` and `profile` need Unity 6+.\n\n```python\nmanage_build(action=\"scenes\", scenes='[\"Assets/Scenes/Menu.unity\", \"Assets/Scenes/Level1.unity\"]')  # replaces the list\nmanage_build(action=\"build\", target=\"windows64\", output_path=\"Builds/Win/Game.exe\", development=\"true\")\nmanage_build(action=\"status\", job_id=\"<job_id>\")\n```\n\nTargets: `windows64`, `osx`, `linux64`, `android`, `ios`, `webgl`, `uwp`, `tvos`, `visionos`. Switching `platform` reimports assets. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_build)\n\n---\n\n## Testing Tools\n\nGroup: `testing`.\n\n### run_tests\n\nStart async test execution.\n\n```python\nresult = run_tests(\n    mode=\"EditMode\",             # \"EditMode\"|\"PlayMode\"\n    test_names=[\"MyTests.TestA\", \"MyTests.TestB\"],  # specific tests\n    group_names=[\"Integration*\"],  # regex patterns\n    category_names=[\"Unit\"],     # NUnit categories\n    assembly_names=[\"Tests\"],    # assembly filter\n    include_failed_tests=True,   # include failure details\n    include_details=False        # include all test details\n)\n# Returns: {\"job_id\": \"abc123\", ...}\n```\n\n### get_test_job\n\nPoll test job status.\n\n```python\nresult = get_test_job(\n    job_id=\"abc123\",\n    wait_timeout=60,             # wait up to N seconds\n    include_failed_tests=True,\n    include_details=False\n)\n# Returns: {\"status\": \"complete\"|\"running\"|\"failed\", \"results\": {...}}\n```\n\n---\n\n## Search Tools\n\n### find_in_file\n\nSearch file contents with regex.\n\n```python\nfind_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    pattern=\"public void \\\\w+\",  # regex pattern\n    max_results=200,\n    ignore_case=True\n)\n# Returns: line numbers, content excerpts, match positions\n```\n\n---\n\n## Custom Tools\n\n### execute_custom_tool\n\nExecute project-specific custom tools.\n\n```python\nexecute_custom_tool(\n    tool_name=\"my_custom_tool\",\n    parameters={\"param1\": \"value\", \"param2\": 42}\n)\n```\n\nDiscover available custom tools via `mcpforunity://custom-tools` resource.\n\n---\n\n## Camera Tools\n\n### manage_camera\n\nUnified camera management (Unity Camera + Cinemachine). Works without Cinemachine using basic Camera; unlocks presets, pipelines, and blending when Cinemachine is installed. Use `ping` to check availability.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target camera (name, path, or instance ID) |\n| `search_method` | string | No | `by_id`, `by_name`, `by_path` |\n| `properties` | dict \\| string | No | Action-specific parameters |\n\n**Screenshot parameters** (for `screenshot` and `screenshot_multiview` actions):\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `capture_source` | string | `\"game_view\"` (default) or `\"scene_view\"` (editor viewport) |\n| `view_target` | string\\|int\\|list | Target to focus on (GO name/path/ID or [x,y,z]). game_view: aims camera; scene_view: frames viewport |\n| `camera` | string | Camera to capture from (defaults to Camera.main). game_view only |\n| `include_image` | bool | Return base64 PNG inline (default false) |\n| `max_resolution` | int | Downscale cap in px (default 640) |\n| `batch` | string | `\"surround\"` (6 angles) or `\"orbit\"` (configurable grid). game_view only |\n| `view_position` | list[float] | World position [x,y,z] to place camera. game_view only |\n| `view_rotation` | list[float] | Euler rotation [x,y,z] (overrides view_target). game_view only |\n\n**Actions by category:**\n\n**Setup:**\n- `ping` — Check Cinemachine availability and version\n- `ensure_brain` — Ensure CinemachineBrain exists on main camera. Properties: `camera` (target camera), `defaultBlendStyle`, `defaultBlendDuration`\n- `get_brain_status` — Get Brain state (active camera, blend status)\n\n**Creation:**\n- `create_camera` — Create camera with optional preset. Properties: `name`, `preset` (follow/third_person/freelook/dolly/static/top_down/side_scroller), `follow`, `lookAt`, `priority`, `fieldOfView`. Falls back to basic Camera without Cinemachine.\n\n**Configuration:**\n- `set_target` — Set Follow and/or LookAt targets. Properties: `follow`, `lookAt` (GO name/path/ID)\n- `set_priority` — Set camera priority for Brain selection. Properties: `priority` (int)\n- `set_lens` — Configure lens. Properties: `fieldOfView`, `nearClipPlane`, `farClipPlane`, `orthographicSize`, `dutch`\n- `set_body` — Configure Body component (Cinemachine). Properties: `bodyType` (to swap), plus component-specific properties\n- `set_aim` — Configure Aim component (Cinemachine). Properties: `aimType` (to swap), plus component-specific properties\n- `set_noise` — Configure Noise (Cinemachine). Properties: `amplitudeGain`, `frequencyGain`\n\n**Extensions (Cinemachine):**\n- `add_extension` — Add extension. Properties: `extensionType` (CinemachineConfiner2D, CinemachineDeoccluder, CinemachineImpulseListener, CinemachineFollowZoom, CinemachineRecomposer, etc.)\n- `remove_extension` — Remove extension by type. Properties: `extensionType`\n\n**Control:**\n- `list_cameras` — List all cameras with status\n- `set_blend` — Configure default blend on Brain. Properties: `style` (Cut/EaseInOut/Linear/etc.), `duration`\n- `force_camera` — Override Brain to use specific camera\n- `release_override` — Release camera override\n\n**Capture:**\n- `screenshot` — Capture screenshot. Supports `capture_source=\"game_view\"` (default, camera-based) or `\"scene_view\"` (editor viewport). game_view supports inline base64, batch surround/orbit, positioned capture. scene_view supports `view_target` for framing.\n- `screenshot_multiview` — Shorthand for screenshot with batch='surround' and include_image=true.\n\n**Examples:**\n\n```python\n# Check Cinemachine availability\nmanage_camera(action=\"ping\")\n\n# Create a third-person camera following the player\nmanage_camera(action=\"create_camera\", properties={\n    \"name\": \"FollowCam\", \"preset\": \"third_person\",\n    \"follow\": \"Player\", \"lookAt\": \"Player\", \"priority\": 20\n})\n\n# Ensure Brain exists on main camera\nmanage_camera(action=\"ensure_brain\")\n\n# Configure body component\nmanage_camera(action=\"set_body\", target=\"FollowCam\", properties={\n    \"bodyType\": \"CinemachineThirdPersonFollow\",\n    \"cameraDistance\": 5.0, \"shoulderOffset\": [0.5, 0.5, 0]\n})\n\n# Set aim\nmanage_camera(action=\"set_aim\", target=\"FollowCam\", properties={\n    \"aimType\": \"CinemachineRotationComposer\"\n})\n\n# Add camera shake\nmanage_camera(action=\"set_noise\", target=\"FollowCam\", properties={\n    \"amplitudeGain\": 0.5, \"frequencyGain\": 1.0\n})\n\n# Set priority to make this the active camera\nmanage_camera(action=\"set_priority\", target=\"FollowCam\", properties={\"priority\": 50})\n\n# Force a specific camera\nmanage_camera(action=\"force_camera\", target=\"CinematicCam\")\n\n# Release override (return to priority-based selection)\nmanage_camera(action=\"release_override\")\n\n# Configure blend transitions\nmanage_camera(action=\"set_blend\", properties={\"style\": \"EaseInOut\", \"duration\": 2.0})\n\n# Add deoccluder extension\nmanage_camera(action=\"add_extension\", target=\"FollowCam\", properties={\n    \"extensionType\": \"CinemachineDeoccluder\"\n})\n\n# Screenshot from a specific camera (game_view, default)\nmanage_camera(action=\"screenshot\", camera=\"FollowCam\", include_image=True, max_resolution=512)\n\n# Scene View screenshot (captures editor viewport — gizmos, wireframes, grid)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View screenshot framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Batch surround centered on a target: one contact sheet of 6 labeled angles\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Batch orbit: grid of orbit_angles x orbit_elevations tiles around a target\nmanage_camera(action=\"screenshot\", batch=\"orbit\", view_target=\"Player\",\n              orbit_angles=8,              # azimuth steps (default 8, max 36)\n              orbit_elevations=[0, 30],    # degrees (default [0, 30, -15])\n              orbit_distance=10,           # optional, auto-fit if omitted\n              orbit_fov=60, max_resolution=256)\n\n# Positioned capture: temp camera at a viewpoint (view_rotation overrides the view_target aim)\nmanage_camera(action=\"screenshot\", view_target=\"Enemy\", view_position=[0, 10, -10], max_resolution=512)\n\n# List all cameras\nmanage_camera(action=\"list_cameras\")\n```\n\n**Tier system:**\n- Tier 1 actions (ping, create_camera, set_target, set_lens, set_priority, list_cameras, screenshot, screenshot_multiview) work without Cinemachine — they fall back to basic Unity Camera.\n- Tier 2 actions (ensure_brain, get_brain_status, set_body, set_aim, set_noise, add/remove_extension, set_blend, force_camera, release_override) require `com.unity.cinemachine`. If called without Cinemachine, they return an error with a fallback suggestion.\n\n**Resource:** Read `mcpforunity://scene/cameras` for current camera state before modifying.\n\n---\n\n## Graphics Tools\n\n### manage_graphics\n\nUnified rendering and graphics management: volumes/post-processing, light baking, rendering stats, pipeline configuration, and URP renderer features. Requires URP or HDRP for volume/feature actions. Use `ping` to check pipeline status and available features.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target object name or instance ID |\n| `effect` | string | Sometimes | Effect type name (e.g., `Bloom`, `Vignette`) |\n| `properties` | dict | No | Action-specific properties to set |\n| `parameters` | dict | No | Effect parameter values |\n| `settings` | dict | No | Bake or pipeline settings |\n| `name` | string | No | Name for created objects |\n| `profile_path` | string | No | Asset path for VolumeProfile |\n| `path` | string | No | Asset path (for `volume_create_profile`) |\n| `position` | list[float] | No | Position [x,y,z] |\n\n**Actions by category:**\n\n**Status:**\n- `ping` — Check render pipeline type, available features, and package status\n\n**Volume (require URP/HDRP):**\n- `volume_create` — Create a Volume GameObject with optional effects. Properties: `name`, `is_global` (default true), `weight` (0-1), `priority`, `profile_path` (existing profile), `effects` (list of effect defs)\n- `volume_add_effect` — Add effect override to a Volume. Params: `target` (Volume GO), `effect` (e.g., \"Bloom\")\n- `volume_set_effect` — Set effect parameters. Params: `target`, `effect`, `parameters` (dict of param name to value)\n- `volume_remove_effect` — Remove effect override. Params: `target`, `effect`\n- `volume_get_info` — Get Volume details (profile, effects, parameters). Params: `target`\n- `volume_set_properties` — Set Volume component properties (weight, priority, isGlobal). Params: `target`, `properties`\n- `volume_list_effects` — List all available volume effects for the active pipeline\n- `volume_create_profile` — Create a standalone VolumeProfile asset. Params: `path`, `effects` (optional)\n\n**Bake (Edit mode only):**\n- `bake_start` — Start lightmap bake. Params: `async_bake` (default true)\n- `bake_cancel` — Cancel in-progress bake\n- `bake_status` — Check bake progress\n- `bake_clear` — Clear baked lightmap data\n- `bake_reflection_probe` — Bake a specific reflection probe. Params: `target`\n- `bake_get_settings` — Get current Lightmapping settings\n- `bake_set_settings` — Set Lightmapping settings. Params: `settings` (dict)\n- `bake_create_light_probe_group` — Create a Light Probe Group. Params: `name`, `position`, `grid_size` [x,y,z], `spacing`\n- `bake_create_reflection_probe` — Create a Reflection Probe. Params: `name`, `position`, `size` [x,y,z], `resolution`, `mode`, `hdr`, `box_projection`\n- `bake_set_probe_positions` — Set Light Probe positions manually. Params: `target`, `positions` (array of [x,y,z])\n\n**Stats:**\n- `stats_get` — Get rendering counters (draw calls, batches, triangles, vertices, etc.)\n- `stats_list_counters` — List all available ProfilerRecorder counters\n- `stats_set_scene_debug` — Set Scene View debug/draw mode. Params: `mode`\n- `stats_get_memory` — Get rendering memory usage\n\n**Pipeline:**\n- `pipeline_get_info` — Get active render pipeline info (type, quality level, asset paths)\n- `pipeline_set_quality` — Switch quality level. Params: `level` (name or index)\n- `pipeline_get_settings` — Get pipeline asset settings\n- `pipeline_set_settings` — Set pipeline asset settings. Params: `settings` (dict)\n\n**Features (URP only):**\n- `feature_list` — List renderer features on the active URP renderer\n- `feature_add` — Add a renderer feature. Params: `feature_type`, `name`, `material` (for full-screen effects)\n- `feature_remove` — Remove a renderer feature. Params: `index` or `name`\n- `feature_configure` — Set feature properties. Params: `index` or `name`, `properties` (dict)\n- `feature_toggle` — Enable/disable a feature. Params: `index` or `name`, `active` (bool)\n- `feature_reorder` — Reorder features. Params: `order` (list of indices)\n\n**Examples:**\n\n```python\n# Check pipeline status\nmanage_graphics(action=\"ping\")\n\n# Create a global post-processing volume with Bloom and Vignette\nmanage_graphics(action=\"volume_create\", name=\"PostProcessing\", is_global=True,\n    effects=[\n        {\"type\": \"Bloom\", \"parameters\": {\"intensity\": 1.5, \"threshold\": 0.9}},\n        {\"type\": \"Vignette\", \"parameters\": {\"intensity\": 0.4}}\n    ])\n\n# Add an effect to an existing volume\nmanage_graphics(action=\"volume_add_effect\", target=\"PostProcessing\", effect=\"ColorAdjustments\")\n\n# Configure effect parameters\nmanage_graphics(action=\"volume_set_effect\", target=\"PostProcessing\",\n    effect=\"ColorAdjustments\", parameters={\"postExposure\": 0.5, \"saturation\": 10})\n\n# Get volume info\nmanage_graphics(action=\"volume_get_info\", target=\"PostProcessing\")\n\n# List all available effects for the active pipeline\nmanage_graphics(action=\"volume_list_effects\")\n\n# Create a VolumeProfile asset\nmanage_graphics(action=\"volume_create_profile\", path=\"Assets/Settings/MyProfile.asset\",\n    effects=[{\"type\": \"Bloom\"}, {\"type\": \"Tonemapping\"}])\n\n# Start async lightmap bake\nmanage_graphics(action=\"bake_start\", async_bake=True)\n\n# Check bake progress\nmanage_graphics(action=\"bake_status\")\n\n# Create a Light Probe Group with a 3x2x3 grid\nmanage_graphics(action=\"bake_create_light_probe_group\", name=\"ProbeGrid\",\n    position=[0, 1, 0], grid_size=[3, 2, 3], spacing=2.0)\n\n# Create a Reflection Probe\nmanage_graphics(action=\"bake_create_reflection_probe\", name=\"RoomProbe\",\n    position=[0, 2, 0], size=[10, 5, 10], resolution=256, hdr=True)\n\n# Get rendering stats\nmanage_graphics(action=\"stats_get\")\n\n# Get memory usage\nmanage_graphics(action=\"stats_get_memory\")\n\n# Get pipeline info\nmanage_graphics(action=\"pipeline_get_info\")\n\n# Switch quality level\nmanage_graphics(action=\"pipeline_set_quality\", level=\"High\")\n\n# List URP renderer features\nmanage_graphics(action=\"feature_list\")\n\n# Add a full-screen renderer feature\nmanage_graphics(action=\"feature_add\", feature_type=\"FullScreenPassRendererFeature\",\n    name=\"NightVision\", material=\"Assets/Materials/NightVision.mat\")\n\n# Toggle a feature off\nmanage_graphics(action=\"feature_toggle\", index=0, active=False)\n\n# Reorder features\nmanage_graphics(action=\"feature_reorder\", order=[2, 0, 1])\n```\n\n**Resources:**\n- `mcpforunity://scene/volumes` — Lists all Volume components in the scene with their profiles and effects\n- `mcpforunity://rendering/stats` — Current rendering performance counters\n- `mcpforunity://pipeline/renderer-features` — URP renderer features on the active renderer\n\n---\n\n## Package Tools\n\n### manage_packages\n\nManage Unity packages: query, install, remove, embed, and configure registries. Install/remove trigger domain reload.\n\n**Query Actions (read-only):**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `list_packages` | — | List all installed packages (async, returns job_id) |\n| `search_packages` | `query` | Search Unity registry by keyword (async, returns job_id) |\n| `get_package_info` | `package` | Get details about a specific installed package |\n| `list_registries` | — | List all scoped registries (names, URLs, scopes); immediate result |\n| `ping` | — | Check package manager availability, Unity version, package count |\n| `status` | `job_id` (required for list/search; optional for add/remove/embed) | Poll async job status; omit job_id to poll latest add/remove/embed job |\n\n**Mutating Actions:**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `add_package` | `package` | Install a package (name, name@version, git URL, or file: path) |\n| `remove_package` | `package`, `force` (optional) | Remove a package; blocked if dependents exist unless `force=true` |\n| `embed_package` | `package` | Copy package to local Packages/ for editing |\n| `resolve_packages` | — | Force re-resolution of all packages |\n| `add_registry` | `name`, `url`, `scopes` | Add a scoped registry (e.g., OpenUPM) |\n| `remove_registry` | `name` or `url` | Remove a scoped registry |\n\n**Input validation:**\n- Valid package IDs: `com.unity.inputsystem`, `com.unity.cinemachine@3.1.6`\n- Git URLs: allowed with warning (\"ensure this is a trusted source\")\n- `file:` paths: allowed with warning\n- Invalid names (uppercase, missing dots): rejected\n\n**Example — List installed packages:**\n```python\nmanage_packages(action=\"list_packages\")\n# Returns job_id, then poll:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Search for a package:**\n```python\nmanage_packages(action=\"search_packages\", query=\"input system\")\n```\n\n**Example — Install a package:**\n```python\nmanage_packages(action=\"add_package\", package=\"com.unity.inputsystem\")\n# Poll until complete:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Remove with dependency check:**\n```python\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\")\n# Error: \"Cannot remove: 3 package(s) depend on it: ...\"\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\", force=True)\n# Proceeds anyway\n```\n\n**Example — Add OpenUPM registry:**\n```python\nmanage_packages(\n    action=\"add_registry\",\n    name=\"OpenUPM\",\n    url=\"https://package.openupm.com\",\n    scopes=[\"com.cysharp\", \"com.neuecc\"]\n)\n```\n\n---\n\n## Physics Tools\n\n### `manage_physics`\n\nManage 3D and 2D physics: settings, collision matrix, materials, joints, queries, validation, and simulation. All actions support `dimension=\"3d\"` (default) or `dimension=\"2d\"` where applicable.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | See action groups below |\n| `dimension` | string | No | `\"3d\"` (default) or `\"2d\"` |\n| `settings` | object | For set_settings | Key-value physics settings dict |\n| `layer_a` / `layer_b` | string | For collision matrix | Layer name or index |\n| `collide` | bool | For set_collision_matrix | `true` to enable, `false` to disable |\n| `name` | string | For create_physics_material | Material asset name |\n| `path` | string | No | Asset folder path (create) or asset path (configure) |\n| `dynamic_friction` / `static_friction` / `bounciness` | float | No | Material properties (0–1) |\n| `friction_combine` / `bounce_combine` | string | No | `Average`, `Minimum`, `Multiply`, `Maximum` |\n| `material_path` | string | For assign_physics_material | Path to physics material asset |\n| `target` | string | For joints/queries/validate | GameObject name or instance ID |\n| `joint_type` | string | For joints | 3D: `fixed`, `hinge`, `spring`, `character`, `configurable`; 2D: `distance`, `fixed`, `friction`, `hinge`, `relative`, `slider`, `spring`, `target`, `wheel` |\n| `connected_body` | string | For add_joint | Connected body GameObject |\n| `motor` / `limits` / `spring` / `drive` | object | For configure_joint | Joint sub-config objects |\n| `properties` | object | For configure_joint/material | Direct property dict |\n| `origin` / `direction` | float[] | For raycast | Ray origin and direction `[x,y,z]` or `[x,y]` |\n| `max_distance` | float | No | Max raycast distance |\n| `shape` | string | For overlap | `sphere`, `box`, `capsule` (3D); `circle`, `box`, `capsule` (2D) |\n| `position` | float[] | For overlap | `[x,y,z]` or `[x,y]` |\n| `size` | float or float[] | For overlap | Radius (sphere/circle) or half-extents `[x,y,z]` (box) |\n| `layer_mask` | string | No | Layer name or int mask for queries |\n| `start` / `end` | float[] | For linecast | Start and end points `[x,y,z]` or `[x,y]` |\n| `point1` / `point2` | float[] | For shapecast capsule | Capsule endpoints (3D alternative) |\n| `height` | float | For shapecast capsule | Capsule height |\n| `capsule_direction` | int | For shapecast capsule | 0=X, 1=Y (default), 2=Z |\n| `angle` | float | For 2D shapecasts | Rotation angle in degrees |\n| `force` | float[] | For apply_force | Force vector `[x,y,z]` or `[x,y]` |\n| `force_mode` | string | For apply_force | `Force`, `Impulse`, `Acceleration`, `VelocityChange` (3D); `Force`, `Impulse` (2D) |\n| `force_type` | string | For apply_force | `normal` (default) or `explosion` (3D only) |\n| `torque` | float[] | For apply_force | Torque `[x,y,z]` (3D) or `[z]` (2D) |\n| `explosion_position` | float[] | For apply_force explosion | Explosion center `[x,y,z]` |\n| `explosion_radius` | float | For apply_force explosion | Explosion sphere radius |\n| `explosion_force` | float | For apply_force explosion | Explosion force magnitude |\n| `upwards_modifier` | float | For apply_force explosion | Y-axis offset (default 0) |\n| `steps` | int | For simulate_step | Number of steps (1–100) |\n| `step_size` | float | No | Step size in seconds (default: `Time.fixedDeltaTime`) |\n\n**Action groups:**\n\n- **Settings:** `ping`, `get_settings`, `set_settings`\n- **Collision Matrix:** `get_collision_matrix`, `set_collision_matrix`\n- **Materials:** `create_physics_material`, `configure_physics_material`, `assign_physics_material`\n- **Joints:** `add_joint`, `configure_joint`, `remove_joint`\n- **Queries:** `raycast`, `raycast_all`, `linecast`, `shapecast`, `overlap`\n- **Forces:** `apply_force`\n- **Rigidbody:** `get_rigidbody`, `configure_rigidbody`\n- **Validation:** `validate`\n- **Simulation:** `simulate_step`\n\n```python\n# Check physics status\nmanage_physics(action=\"ping\")\n\n# Get/set gravity\nmanage_physics(action=\"get_settings\", dimension=\"3d\")\nmanage_physics(action=\"set_settings\", dimension=\"3d\", settings={\"gravity\": [0, -20, 0]})\n\n# Collision matrix\nmanage_physics(action=\"get_collision_matrix\")\nmanage_physics(action=\"set_collision_matrix\", layer_a=\"Player\", layer_b=\"Enemy\", collide=False)\n\n# Create a bouncy physics material and assign it\nmanage_physics(action=\"create_physics_material\", name=\"Bouncy\", bounciness=0.9, dynamic_friction=0.2)\nmanage_physics(action=\"assign_physics_material\", target=\"Ball\", material_path=\"Assets/Physics Materials/Bouncy.physicMaterial\")\n\n# Add and configure a hinge joint\nmanage_physics(action=\"add_joint\", target=\"Door\", joint_type=\"hinge\", connected_body=\"DoorFrame\")\nmanage_physics(action=\"configure_joint\", target=\"Door\", joint_type=\"hinge\",\n               motor={\"targetVelocity\": 90, \"force\": 100},\n               limits={\"min\": -90, \"max\": 0, \"bounciness\": 0})\n\n# Raycast and overlap\nmanage_physics(action=\"raycast\", origin=[0, 10, 0], direction=[0, -1, 0], max_distance=50)\nmanage_physics(action=\"overlap\", shape=\"sphere\", position=[0, 0, 0]","unity-mcp-skill/references/probuilder-guide.md":"# ProBuilder Workflow Guide\n\nPatterns and best practices for AI-driven ProBuilder mesh editing through MCP for Unity.\n\n## Availability\n\nProBuilder is an **optional** Unity package (`com.unity.probuilder`). Check `mcpforunity://project/info` or call `manage_probuilder(action=\"ping\")` to verify it's installed before using any ProBuilder tools. If available, **prefer ProBuilder over primitive GameObjects** for any geometry that needs editing, multi-material faces, or non-trivial shapes.\n\n## Core Workflow: Always Get Info First\n\nBefore any mesh edit, call `get_mesh_info` with `include='faces'` to understand the geometry:\n\n```python\n# Step 1: Get face info with directions\nresult = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"faces\"})\n\n# Response includes per-face:\n#   index: 0, normal: [0, 1, 0], center: [0, 0.5, 0], direction: \"top\"\n#   index: 1, normal: [0, -1, 0], center: [0, -0.5, 0], direction: \"bottom\"\n#   index: 2, normal: [0, 0, 1], center: [0, 0, 0.5], direction: \"front\"\n#   ...\n\n# Step 2: Use the direction labels to pick faces\n# Want to extrude the top? Find the face with direction=\"top\"\nmanage_probuilder(action=\"extrude_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0], \"distance\": 1.5})\n```\n\n### Include Parameter\n\n| Value | Returns | Use When |\n|-------|---------|----------|\n| `\"summary\"` | Counts, bounds, materials | Quick check / validation |\n| `\"faces\"` | + normals, centers, directions | Selecting faces for editing |\n| `\"edges\"` | + edge vertex pairs with world positions (max 200) | Edge-based operations |\n| `\"all\"` | Everything | Full mesh analysis |\n\n## Shape Creation\n\n### All 12 Shape Types\n\n```python\n# Basic shapes\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cube\", \"name\": \"MyCube\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Sphere\", \"name\": \"MySphere\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cylinder\", \"name\": \"MyCyl\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Plane\", \"name\": \"MyPlane\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cone\", \"name\": \"MyCone\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Prism\", \"name\": \"MyPrism\"})\n\n# Parametric shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"MyTorus\",\n    \"rows\": 16, \"columns\": 24, \"innerRadius\": 0.5, \"outerRadius\": 1.0\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Pipe\", \"name\": \"MyPipe\",\n    \"radius\": 1.0, \"height\": 2.0, \"thickness\": 0.2\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Arch\", \"name\": \"MyArch\",\n    \"radius\": 2.0, \"angle\": 180, \"segments\": 12\n})\n\n# Architectural shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"MyStairs\", \"steps\": 10\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"CurvedStair\", \"name\": \"Spiral\", \"steps\": 12\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"MyDoor\"\n})\n\n# Custom polygon\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [[0,0,0], [5,0,0], [5,0,5], [2.5,0,7], [0,0,5]],\n    \"extrudeHeight\": 3.0, \"name\": \"Pentagon\"\n})\n```\n\n## Common Editing Operations\n\n### Extrude a Roof\n\n```python\n# 1. Create a building base\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"Building\", \"size\": [4, 3, 6]\n})\n\n# 2. Find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Building\",\n    properties={\"include\": \"faces\"})\n# Find face with direction=\"top\" -> e.g. index 2\n\n# 3. Extrude upward for a flat roof extension\nmanage_probuilder(action=\"extrude_faces\", target=\"Building\",\n    properties={\"faceIndices\": [2], \"distance\": 0.5})\n```\n\n### Cut a Hole (Delete Faces)\n\n```python\n# 1. Get face info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n# Find the face with direction=\"front\" -> e.g. index 4\n\n# 2. Subdivide to create more faces\nmanage_probuilder(action=\"subdivide\", target=\"Wall\",\n    properties={\"faceIndices\": [4]})\n\n# 3. Get updated face info (indices changed after subdivide!)\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n\n# 4. Delete the center face(s) for the hole\nmanage_probuilder(action=\"delete_faces\", target=\"Wall\",\n    properties={\"faceIndices\": [6]})\n```\n\n### Bevel Edges\n\n```python\n# Get edge info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"edges\"})\n\n# Bevel specific edges\nmanage_probuilder(action=\"bevel_edges\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.1})\n```\n\n### Detach Faces to New Object\n\n```python\n# Detach and keep original (default)\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": False})\n\n# Detach and remove from source\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": True})\n```\n\n### Select Faces by Direction\n\n```python\n# Select all upward-facing faces\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"direction\": \"up\", \"tolerance\": 0.7})\n\n# Grow selection from a seed face\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"growFrom\": [0], \"growAngle\": 45})\n```\n\n### Double-Sided Geometry\n\n```python\n# Create inside faces for a room (duplicate and flip normals)\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"Room\",\n    properties={\"faceIndices\": [0, 1, 2, 3, 4, 5]})\n```\n\n### Create Polygon from Existing Vertices\n\n```python\n# Connect existing vertices into a new face (auto-finds winding order)\nmanage_probuilder(action=\"create_polygon\", target=\"MyMesh\",\n    properties={\"vertexIndices\": [0, 3, 7, 4]})\n```\n\n## Vertex Operations\n\n```python\n# Move vertices by offset. Only the listed indices move: faces that meet at a corner\n# usually each have their own vertex there, so moving one face's corners opens a gap.\nmanage_probuilder(action=\"move_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"offset\": [0, 1, 0]})\n\n# Weld nearby vertices (proximity-based merge)\nmanage_probuilder(action=\"weld_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"radius\": 0.1})\n\n# Insert vertex on an edge\nmanage_probuilder(action=\"insert_vertex\", target=\"MyCube\",\n    properties={\"edge\": {\"a\": 0, \"b\": 1}, \"point\": [0.5, 0, 0]})\n\n# Add evenly-spaced points along edges\nmanage_probuilder(action=\"append_vertices_to_edge\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1], \"count\": 3})\n```\n\n## Smoothing Workflow\n\n### Auto-Smooth (Recommended Default)\n\n```python\n# Apply auto-smoothing with default 30 degree threshold\nmanage_probuilder(action=\"auto_smooth\", target=\"MyMesh\",\n    properties={\"angleThreshold\": 30})\n```\n\n- **Low angle (15-25)**: More hard edges, faceted look\n- **Medium angle (30-45)**: Good default, smooth curves + sharp corners\n- **High angle (60-80)**: Very smooth, only sharpest edges remain hard\n\n### Manual Smoothing Groups\n\n```python\n# Set specific faces to smooth group 1\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [0, 1, 2], \"smoothingGroup\": 1})\n\n# Set other faces to hard edges (group 0)\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [3, 4, 5], \"smoothingGroup\": 0})\n```\n\n## Mesh Cleanup Pattern\n\nAfter editing, always clean up:\n\n```python\n# 1. Center the pivot (important after extrusions that shift geometry)\nmanage_probuilder(action=\"center_pivot\", target=\"MyMesh\")\n\n# 2. Optionally freeze transform if you moved/rotated the object\nmanage_probuilder(action=\"freeze_transform\", target=\"MyMesh\")\n\n# 3. Validate mesh health\nresult = manage_probuilder(action=\"validate_mesh\", target=\"MyMesh\")\n# Check result.data.healthy -- if false, repair\n\n# 4. Auto-repair if needed\nmanage_probuilder(action=\"repair_mesh\", target=\"MyMesh\")\n```\n\n## Building Complex Objects with ProBuilder\n\nWhen ProBuilder is available, prefer it over primitive GameObjects for complex geometry. ProBuilder lets you create, edit, and combine shapes into detailed objects without external 3D tools.\n\n### Example: Simple House\n\n```python\n# 1. Create base building\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"House\", \"width\": 6, \"height\": 3, \"depth\": 8\n})\n\n# 2. Get face info to find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"top\" -> e.g. index 2\n\n# 3. Extrude the top face to create a flat raised section\nmanage_probuilder(action=\"extrude_faces\", target=\"House\",\n    properties={\"faceIndices\": [2], \"distance\": 0.3})\n\n# 4. Add a peaked roof as a separate Prism; its ridge runs along Z, like the house.\n#    (Moving the top face's vertices would pull it away from the walls; see Vertex Operations.)\n#    Shapes are centered on their position: the walls now reach y = 1.8,\n#    so a roof 2 high sits on them at y = 1.8 + 1.\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Prism\", \"name\": \"Roof\",\n    \"width\": 6, \"height\": 2, \"depth\": 8, \"position\": [0, 2.8, 0]\n})\n\n# 5. Cut a doorway: subdivide front face, delete center sub-face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"front\", subdivide it\nmanage_probuilder(action=\"subdivide\", target=\"House\",\n    properties={\"faceIndices\": [4]})\n\n# Re-query, find bottom-center face, delete it\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\nmanage_probuilder(action=\"delete_faces\", target=\"House\",\n    properties={\"faceIndices\": [12]})\n\n# 6. Add a door frame with arch\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"Doorway\",\n    \"position\": [0, 0, 4], \"width\": 1.5, \"height\": 2.5\n})\n\n# 7. Add stairs to the door\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"FrontSteps\",\n    \"position\": [0, 0, 5], \"steps\": 3, \"width\": 2\n})\n\n# 8. Smooth organic parts, keep architectural edges sharp\nmanage_probuilder(action=\"auto_smooth\", target=\"House\",\n    properties={\"angleThreshold\": 30})\n\n# 9. Assign materials per face\nmanage_probuilder(action=\"set_face_material\", target=\"House\",\n    properties={\"faceIndices\": [0, 1, 2, 3], \"materialPath\": \"Assets/Materials/Brick.mat\"})\n# A Prism's faces 1 and 3 are its two slopes\nmanage_probuilder(action=\"set_face_material\", target=\"Roof\",\n    properties={\"faceIndices\": [1, 3], \"materialPath\": \"Assets/Materials/Roof.mat\"})\n\n# 10. Cleanup\nmanage_probuilder(action=\"center_pivot\", target=\"House\")\nmanage_probuilder(action=\"validate_mesh\", target=\"House\")\n```\n\n### Example: Pillared Corridor (Batch)\n\n```python\n# Create multiple columns efficiently\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cylinder\", \"name\": f\"Pillar_{i}\",\n                       \"radius\": 0.3, \"height\": 4, \"segments\": 12,\n                       \"position\": [i * 3, 0, 0]}\n    }} for i in range(6)\n] + [\n    # Floor\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Floor\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 0, 0]}\n    }},\n    # Ceiling\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Ceiling\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 4, 0]}\n    }},\n])\n\n# Bevel all pillar tops for decoration\nfor i in range(6):\n    info = manage_probuilder(action=\"get_mesh_info\", target=f\"Pillar_{i}\",\n        properties={\"include\": \"edges\"})\n    # Find top ring edges, bevel them\n    manage_probuilder(action=\"bevel_edges\", target=f\"Pillar_{i}\",\n        properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.05})\n\n# Smooth the pillars\nfor i in range(6):\n    manage_probuilder(action=\"auto_smooth\", target=f\"Pillar_{i}\",\n        properties={\"angleThreshold\": 45})\n```\n\n### Example: Custom L-Shaped Room\n\n```python\n# Use polygon shape for non-rectangular footprint\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [\n        [0, 0, 0], [10, 0, 0], [10, 0, 6],\n        [4, 0, 6], [4, 0, 10], [0, 0, 10]\n    ],\n    \"extrudeHeight\": 3.0,\n    \"name\": \"LRoom\"\n})\n\n# Create inside faces for the room interior\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"LRoom\",\n    properties={\"include\": \"faces\"})\n# Duplicate and flip all faces to make interior visible\nall_faces = list(range(info[\"data\"][\"faceCount\"]))\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"LRoom\",\n    properties={\"faceIndices\": all_faces})\n\n# Cut a window: subdivide a wall face, delete center\n# (follow the get_mesh_info -> subdivide -> get_mesh_info -> delete pattern)\n```\n\n### Example: Torus Knot / Decorative Ring\n\n```python\n# Create a torus\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"Ring\",\n    \"innerRadius\": 0.3, \"outerRadius\": 2.0,\n    \"rows\": 24, \"columns\": 32\n})\n\n# Smooth it for organic look\nmanage_probuilder(action=\"auto_smooth\", target=\"Ring\",\n    properties={\"angleThreshold\": 60})\n\n# Assign metallic material\nmanage_probuilder(action=\"set_face_material\", target=\"Ring\",\n    properties={\"faceIndices\": [], \"materialPath\": \"Assets/Materials/Gold.mat\"})\n# Note: empty faceIndices = all faces\n```\n\n## Batch Patterns\n\nUse `batch_execute` for multi-step workflows to reduce round-trips:\n\n```python\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column1\", \"position\": [0, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column2\", \"position\": [5, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column3\", \"position\": [10, 0, 0]}\n    }},\n])\n```\n\n## Known Limitations\n\n### Not Yet Working\n\nThese actions exist in the API but have known bugs that prevent them from working correctly:\n\n| Action | Issue | Workaround |\n|--------|-------|------------|\n| `set_pivot` | Vertex positions don't persist through `ToMesh()`/`RefreshMesh()`. The `positions` property setter is overwritten when ProBuilder rebuilds the mesh. Needs `SetVertices(IList<Vertex>)` or direct `m_Positions` field access. | Use `center_pivot` instead, or position objects via Transform. |\n| `convert_to_probuilder` | `MeshImporter` constructor throws internally. May need ProBuilder's editor-only `ProBuilderize` API instead of runtime `MeshImporter`. | Create shapes natively with `create_shape` or `create_poly_shape` instead of converting existing meshes. |\n\n### General Limitations\n\n- Face indices are **not stable** across edits -- always re-query `get_mesh_info` after any modification\n- Edge data is capped at **200 edges** in `get_mesh_info` results\n- Face data is capped at **100 faces** in `get_mesh_info` results\n- `subdivide` uses `ConnectElements.Connect` internally (ProBuilder has no public `Subdivide` API), which connects face midpoints rather than traditional quad subdivision\n\n## Key Rules\n\n1. **Always get_mesh_info before editing** -- face indices are not stable across edits\n2. **Re-query after modifications** -- subdivide, extrude, delete all change face indices\n3. **Use direction labels** -- don't guess face indices, use the direction field\n4. **Cleanup after editing** -- center_pivot + validate is good practice\n5. **Auto-smooth for organic shapes** -- 30 degrees is a good default\n6. **Prefer ProBuilder over primitives** -- when the package is available and you need editable geometry\n7. **Use batch_execute** -- for creating multiple shapes or repetitive operations\n8. **Screenshot to verify** -- use `manage_camera(action=\"screenshot\", include_image=True)` to check visual results after complex edits\n","unity-mcp-skill/references/resources-reference.md":"# Unity-MCP Resources Reference\n\nResources provide read-only access to Unity state. Use resources to inspect before using tools to modify.\n\n## Table of Contents\n\n- [Editor State Resources](#editor-state-resources)\n- [Camera Resources](#camera-resources)\n- [Graphics Resources](#graphics-resources)\n- [Scene & GameObject Resources](#scene--gameobject-resources)\n- [Prefab Resources](#prefab-resources)\n- [Project Resources](#project-resources)\n- [Instance Resources](#instance-resources)\n- [Test Resources](#test-resources)\n\n---\n\n## URI Scheme\n\nAll resources use `mcpforunity://` scheme:\n\n```\nmcpforunity://{category}/{resource_path}[?query_params]\n```\n\n**Categories:** `editor`, `scene`, `prefab`, `project`, `pipeline`, `rendering`, `menu-items`, `custom-tools`, `tests`, `instances`\n\n---\n\n## Editor State Resources\n\n### mcpforunity://editor/state\n\n**Purpose:** Editor readiness snapshot - check before tool operations.\n\n**Returns:**\n```json\n{\n  \"unity_version\": \"2022.3.10f1\",\n  \"is_compiling\": false,\n  \"is_domain_reload_pending\": false,\n  \"play_mode\": {\n    \"is_playing\": false,\n    \"is_paused\": false\n  },\n  \"active_scene\": {\n    \"path\": \"Assets/Scenes/Main.unity\",\n    \"name\": \"Main\"\n  },\n  \"ready_for_tools\": true,\n  \"blocking_reasons\": [],\n  \"recommended_retry_after_ms\": null,\n  \"staleness\": {\n    \"age_ms\": 150,\n    \"is_stale\": false\n  }\n}\n```\n\n**Key Fields:**\n- `ready_for_tools`: Only proceed if `true`\n- `is_compiling`: Wait if `true`\n- `blocking_reasons`: Array explaining why tools might fail\n- `recommended_retry_after_ms`: Suggested wait time\n\n### mcpforunity://editor/selection\n\n**Purpose:** Currently selected objects.\n\n**Returns:**\n```json\n{\n  \"activeObject\": \"Player\",\n  \"activeGameObject\": \"Player\",\n  \"activeInstanceID\": 12345,\n  \"count\": 3,\n  \"gameObjects\": [\"Player\", \"Enemy\", \"Wall\"],\n  \"assetGUIDs\": []\n}\n```\n\n### mcpforunity://editor/active-tool\n\n**Purpose:** Current editor tool state.\n\n**Returns:**\n```json\n{\n  \"activeTool\": \"Move\",\n  \"isCustom\": false,\n  \"pivotMode\": \"Center\",\n  \"pivotRotation\": \"Global\"\n}\n```\n\n### mcpforunity://editor/windows\n\n**Purpose:** All open editor windows.\n\n**Returns:**\n```json\n{\n  \"windows\": [\n    {\n      \"title\": \"Scene\",\n      \"typeName\": \"UnityEditor.SceneView\",\n      \"isFocused\": true,\n      \"position\": {\"x\": 0, \"y\": 0, \"width\": 800, \"height\": 600}\n    }\n  ]\n}\n```\n\n### mcpforunity://editor/prefab-stage\n\n**Purpose:** Current prefab editing context.\n\n**Returns:**\n```json\n{\n  \"isOpen\": true,\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"prefabRootName\": \"Player\",\n  \"isDirty\": false\n}\n```\n\n---\n\n## Camera Resources\n\n### mcpforunity://scene/cameras\n\n**Purpose:** List all cameras in the scene (Unity Camera + CinemachineCamera) with full status. Read this before using `manage_camera` to understand the current camera setup.\n\n**Returns:**\n```json\n{\n  \"brain\": {\n    \"exists\": true,\n    \"gameObject\": \"Main Camera\",\n    \"instanceID\": 55504,\n    \"activeCameraName\": \"Cam_Cinematic\",\n    \"activeCameraID\": -39420,\n    \"isBlending\": false\n  },\n  \"cinemachineCameras\": [\n    {\n      \"instanceID\": -39420,\n      \"name\": \"Cam_Cinematic\",\n      \"isLive\": true,\n      \"priority\": 50,\n      \"follow\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"lookAt\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"body\": \"CinemachineThirdPersonFollow\",\n      \"aim\": \"CinemachineRotationComposer\",\n      \"noise\": \"CinemachineBasicMultiChannelPerlin\",\n      \"extensions\": []\n    }\n  ],\n  \"unityCameras\": [\n    {\n      \"instanceID\": 55504,\n      \"name\": \"Main Camera\",\n      \"depth\": 0.0,\n      \"fieldOfView\": 50.0,\n      \"hasBrain\": true\n    }\n  ],\n  \"cinemachineInstalled\": true\n}\n```\n\n**Key Fields:**\n- `brain`: CinemachineBrain status — which camera is active, blend state\n- `cinemachineCameras`: All CinemachineCamera components with pipeline info (body, aim, noise, extensions)\n- `unityCameras`: All Unity Camera components with depth and FOV\n- `cinemachineInstalled`: Whether Cinemachine package is available\n\n**Use with:** `manage_camera` tool for creating/configuring cameras\n\n---\n\n## Graphics Resources\n\n### mcpforunity://scene/volumes\n\n**Purpose:** List all Volume components in the scene with effects and parameters. Read this before using `manage_graphics` volume actions.\n\n**Returns:**\n```json\n{\n  \"pipeline\": \"Universal (URP)\",\n  \"volumes\": [\n    {\n      \"name\": \"PostProcessVolume\",\n      \"instance_id\": -24600,\n      \"is_global\": true,\n      \"weight\": 1.0,\n      \"priority\": 0,\n      \"blend_distance\": 0,\n      \"profile\": \"MyProfile\",\n      \"profile_path\": \"Assets/Settings/MyProfile.asset\",\n      \"effects\": [\n        {\n          \"type\": \"Bloom\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"threshold\", \"scatter\"]\n        },\n        {\n          \"type\": \"Vignette\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"smoothness\"]\n        }\n      ]\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `is_global`: Whether the volume applies everywhere or only within its collider bounds\n- `effects[].overridden_params`: Which parameters are actively overridden (not using defaults)\n- `profile_path`: Empty string for embedded profiles, asset path for shared profiles\n\n**Use with:** `manage_graphics` volume actions (volume_create, volume_add_effect, volume_set_effect, etc.)\n\n### mcpforunity://rendering/stats\n\n**Purpose:** Current rendering performance counters (draw calls, batches, triangles, memory).\n\n**Returns:**\n```json\n{\n  \"draw_calls\": 42,\n  \"batches\": 35,\n  \"set_pass_calls\": 12,\n  \"triangles\": 15234,\n  \"vertices\": 8456,\n  \"dynamic_batches\": 5,\n  \"static_batches\": 20,\n  \"shadow_casters\": 3,\n  \"render_textures\": 8,\n  \"render_textures_bytes\": 16777216,\n  \"visible_skinned_meshes\": 2\n}\n```\n\n**Use with:** `manage_graphics` stats actions (stats_get, stats_list_counters, stats_get_memory)\n\n### mcpforunity://pipeline/renderer-features\n\n**Purpose:** URP renderer features on the active renderer (SSAO, Decals, etc.).\n\n**Returns:**\n```json\n{\n  \"rendererDataName\": \"PC_Renderer\",\n  \"features\": [\n    {\n      \"index\": 0,\n      \"name\": \"ScreenSpaceAmbientOcclusion\",\n      \"type\": \"ScreenSpaceAmbientOcclusion\",\n      \"isActive\": true,\n      \"properties\": { \"m_Settings\": \"Generic\" }\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `index`: Position in the feature list (use for feature_toggle, feature_remove, feature_configure)\n- `isActive`: Whether the feature is enabled\n- `rendererDataName`: Which URP renderer data asset is active\n\n**Use with:** `manage_graphics` feature actions (feature_list, feature_add, feature_remove, feature_toggle, etc.)\n\n---\n\n## Scene & GameObject Resources\n\n### mcpforunity://scene/gameobject-api\n\n**Purpose:** Documentation for GameObject resources (read this first).\n\n### mcpforunity://scene/gameobject/{instance_id}\n\n**Purpose:** Basic GameObject data (metadata, no component properties).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID from `find_gameobjects`\n\n**Returns:**\n```json\n{\n  \"instanceID\": 12345,\n  \"name\": \"Player\",\n  \"tag\": \"Player\",\n  \"layer\": 8,\n  \"layerName\": \"Player\",\n  \"active\": true,\n  \"activeInHierarchy\": true,\n  \"isStatic\": false,\n  \"transform\": {\n    \"position\": [0, 1, 0],\n    \"rotation\": [0, 0, 0],\n    \"scale\": [1, 1, 1]\n  },\n  \"parent\": {\"instanceID\": 0},\n  \"children\": [{\"instanceID\": 67890}],\n  \"componentTypes\": [\"Transform\", \"Rigidbody\", \"PlayerController\"],\n  \"path\": \"/Player\"\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/components\n\n**Purpose:** All components with full property serialization (paginated).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `page_size` (int): Default 25, max 100\n- `cursor` (int): Pagination cursor\n- `include_properties` (bool): Default true, set false for just types\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"components\": [\n    {\n      \"type\": \"Transform\",\n      \"properties\": {\n        \"position\": {\"x\": 0, \"y\": 1, \"z\": 0},\n        \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0, \"w\": 1}\n      }\n    },\n    {\n      \"type\": \"Rigidbody\",\n      \"properties\": {\n        \"mass\": 1.0,\n        \"useGravity\": true\n      }\n    }\n  ],\n  \"cursor\": 0,\n  \"pageSize\": 25,\n  \"nextCursor\": null,\n  \"hasMore\": false\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/component/{component_name}\n\n**Purpose:** Single component with full properties.\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `component_name` (string): e.g., \"Rigidbody\", \"Camera\", \"Transform\"\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"component\": {\n    \"type\": \"Rigidbody\",\n    \"properties\": {\n      \"mass\": 1.0,\n      \"drag\": 0,\n      \"angularDrag\": 0.05,\n      \"useGravity\": true,\n      \"isKinematic\": false\n    }\n  }\n}\n```\n\n---\n\n## Prefab Resources\n\n### mcpforunity://prefab-api\n\n**Purpose:** Documentation for prefab resources.\n\n### mcpforunity://prefab/{encoded_path}\n\n**Purpose:** Prefab asset information.\n\n**Parameters:**\n- `encoded_path` (string): URL-encoded path, e.g., `Assets%2FPrefabs%2FPlayer.prefab`\n\n**Path Encoding:**\n```\nAssets/Prefabs/Player.prefab → Assets%2FPrefabs%2FPlayer.prefab\n```\n\n**Returns:**\n```json\n{\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"guid\": \"abc123...\",\n  \"prefabType\": \"Regular\",\n  \"rootObjectName\": \"Player\",\n  \"rootComponentTypes\": [\"Transform\", \"PlayerController\"],\n  \"childCount\": 5,\n  \"isVariant\": false,\n  \"parentPrefab\": null\n}\n```\n\n### mcpforunity://prefab/{encoded_path}/hierarchy\n\n**Purpose:** Full prefab hierarchy with nested prefab info.\n\n**Returns:**\n```json\n{\n  \"prefabPath\": \"Assets/Prefabs/Player.prefab\",\n  \"total\": 6,\n  \"items\": [\n    {\n      \"name\": \"Player\",\n      \"instanceId\": 12345,\n      \"path\": \"/Player\",\n      \"activeSelf\": true,\n      \"childCount\": 2,\n      \"componentTypes\": [\"Transform\", \"PlayerController\"]\n    },\n    {\n      \"name\": \"Model\",\n      \"path\": \"/Player/Model\",\n      \"isNestedPrefab\": true,\n      \"nestedPrefabPath\": \"Assets/Prefabs/PlayerModel.prefab\"\n    }\n  ]\n}\n```\n\n---\n\n## Project Resources\n\n### mcpforunity://project/info\n\n**Purpose:** Static project configuration.\n\n**Returns:**\n```json\n{\n  \"projectRoot\": \"/Users/dev/MyProject\",\n  \"projectName\": \"MyProject\",\n  \"unityVersion\": \"2022.3.10f1\",\n  \"platform\": \"StandaloneWindows64\",\n  \"assetsPath\": \"/Users/dev/MyProject/Assets\"\n}\n```\n\n### mcpforunity://project/tags\n\n**Purpose:** All tags defined in TagManager.\n\n**Returns:**\n```json\n[\"Untagged\", \"Respawn\", \"Finish\", \"EditorOnly\", \"MainCamera\", \"Player\", \"GameController\", \"Enemy\"]\n```\n\n### mcpforunity://project/layers\n\n**Purpose:** All layers with indices (0-31).\n\n**Returns:**\n```json\n{\n  \"0\": \"Default\",\n  \"1\": \"TransparentFX\",\n  \"2\": \"Ignore Raycast\",\n  \"4\": \"Water\",\n  \"5\": \"UI\",\n  \"8\": \"Player\",\n  \"9\": \"Enemy\"\n}\n```\n\n### mcpforunity://menu-items\n\n**Purpose:** All available Unity menu items.\n\n**Returns:**\n```json\n[\n  \"File/New Scene\",\n  \"File/Open Scene\",\n  \"File/Save\",\n  \"Edit/Undo\",\n  \"Edit/Redo\",\n  \"GameObject/Create Empty\",\n  \"GameObject/3D Object/Cube\",\n  \"Window/General/Console\"\n]\n```\n\n### mcpforunity://custom-tools\n\n**Purpose:** Custom tools available in the active Unity project.\n\n**Returns:**\n```json\n{\n  \"project_id\": \"MyProject\",\n  \"tool_count\": 3,\n  \"tools\": [\n    {\n      \"name\": \"capture_screenshot\",\n      \"description\": \"Capture screenshots in Unity\",\n      \"parameters\": [\n        {\"name\": \"filename\", \"type\": \"string\", \"required\": true},\n        {\"name\": \"width\", \"type\": \"int\", \"required\": false},\n        {\"name\": \"height\", \"type\": \"int\", \"required\": false}\n      ]\n    }\n  ]\n}\n```\n\n---\n\n## Instance Resources\n\n### mcpforunity://instances\n\n**Purpose:** All running Unity Editor instances (for multi-instance workflows).\n\n**Returns:**\n```json\n{\n  \"transport\": \"http\",\n  \"instance_count\": 2,\n  \"instances\": [\n    {\n      \"id\": \"MyProject@abc123\",\n      \"name\": \"MyProject\",\n      \"hash\": \"abc123\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T10:30:00Z\"\n    },\n    {\n      \"id\": \"TestProject@def456\",\n      \"name\": \"TestProject\",\n      \"hash\": \"def456\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T11:00:00Z\"\n    }\n  ],\n  \"warnings\": []\n}\n```\n\n**Use with:** `set_active_instance(instance=\"MyProject@abc123\")`\n\n---\n\n## Test Resources\n\n### mcpforunity://tests\n\n**Purpose:** All tests in the project.\n\n**Returns:**\n```json\n[\n  {\n    \"name\": \"TestSomething\",\n    \"full_name\": \"MyTests.TestSomething\",\n    \"mode\": \"EditMode\"\n  },\n  {\n    \"name\": \"TestOther\",\n    \"full_name\": \"MyTests.TestOther\",\n    \"mode\": \"PlayMode\"\n  }\n]\n```\n\n### mcpforunity://tests/{mode}\n\n**Purpose:** Tests filtered by mode.\n\n**Parameters:**\n- `mode` (string): \"EditMode\" or \"PlayMode\"\n\n**Example:** `mcpforunity://tests/EditMode`\n\n---\n\n## Best Practices\n\n### 1. Check Editor State First\n\n```python\n# Before any complex operation:\n# Read mcpforunity://editor/state\n# Check ready_for_tools == true\n```\n\n### 2. Use Find Then Read Pattern\n\n```python\n# 1. find_gameobjects to get IDs\nresult = find_gameobjects(search_term=\"Player\")\n\n# 2. Read resource for full data\n# mcpforunity://scene/gameobject/{id}\n```\n\n### 3. Paginate Large Queries\n\n```python\n# Start with include_properties=false for component lists\n# mcpforunity://scene/gameobject/{id}/components?include_properties=false&page_size=25\n\n# Then read specific components as needed\n# mcpforunity://scene/gameobject/{id}/component/Rigidbody\n```\n\n### 4. URL-Encode Prefab Paths\n\n```python\n# Wrong:\n# mcpforunity://prefab/Assets/Prefabs/Player.prefab\n\n# Correct:\n# mcpforunity://prefab/Assets%2FPrefabs%2FPlayer.prefab\n```\n\n### 5. Multi-Instance Awareness\n\n```python\n# Always check mcpforunity://instances when:\n# - First connecting\n# - Commands fail unexpectedly\n# - Working with multiple projects\n```\n","unity-mcp-skill/references/workflows.md":"# Unity-MCP Workflow Patterns\n\nCommon workflows and patterns for effective Unity-MCP usage.\n\n## Table of Contents\n\n- [Setup & Verification](#setup--verification)\n- [Scene Creation Workflows](#scene-creation-workflows)\n- [Script Development Workflows](#script-development-workflows)\n- [Asset Management Workflows](#asset-management-workflows)\n- [Testing Workflows](#testing-workflows)\n- [Debugging Workflows](#debugging-workflows)\n- [UI Creation Workflows](#ui-creation-workflows)\n- [Camera & Cinemachine Workflows](#camera--cinemachine-workflows)\n- [ProBuilder Workflows](#probuilder-workflows)\n- [Graphics & Rendering Workflows](#graphics--rendering-workflows)\n- [Package Management Workflows](#package-management-workflows)\n- [Package Deployment Workflows](#package-deployment-workflows)\n- [API Verification Workflows](#api-verification-workflows)\n- [Batch Operations](#batch-operations)\n\n---\n\n## Setup & Verification\n\n### Initial Connection Verification\n\n```python\n# 1. Check editor state\n# Read mcpforunity://editor/state\n\n# 2. Verify ready_for_tools == true\n# If false, wait for recommended_retry_after_ms\n\n# 3. Check active scene\n# Read mcpforunity://editor/state → active_scene\n\n# 4. List available instances (multi-instance)\n# Read mcpforunity://instances\n```\n\n### Before Any Operation\n\n```python\n# Quick readiness check pattern:\neditor_state = read_resource(\"mcpforunity://editor/state\")\n\nif not editor_state[\"ready_for_tools\"]:\n    # Check blocking_reasons\n    # Wait recommended_retry_after_ms\n    pass\n\nif editor_state[\"is_compiling\"]:\n    # Wait for compilation to complete\n    pass\n```\n\n---\n\n## Scene Generator Build Workflow\n\n### Fresh Scene Before Building\n\n**Always start a generated scene build with `manage_scene(action=\"create\")`** to get a clean empty scene. This avoids conflicts with existing default objects (Camera, Light) that would cause \"already exists\" errors when the execution plan tries to create its own.\n\n```python\n# Step 0: Create fresh empty scene (replaces current scene entirely)\nmanage_scene(action=\"create\", name=\"MyGeneratedScene\", path=\"Assets/Scenes/\")\n\n# Now proceed with the phased execution plan...\n# Phase 1: Environment (camera, lights) — no conflicts\n# Phase 2: Objects (GameObjects)\n# Phase 3: Materials\n# etc.\n```\n\n### Wiring Object References Between Components\n\nAfter creating scripts and attaching components, use `set_property` to wire cross-references between GameObjects. Use the `{\"name\": \"ObjectName\"}` format to reference scene objects by name:\n\n```python\n# Wire a list of target GameObjects into a script's serialized field\nmanage_components(\n    action=\"set_property\",\n    target=\"BeeManager\",\n    component_type=\"BeeManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Flower_3\"}]\n)\n```\n\n### Physics Requirements for Trigger-Based Interactions\n\nWhen scripts use `OnTriggerEnter` / `OnTriggerStay` / `OnTriggerExit`, at least one of the two colliding objects **must** have a `Rigidbody` component. Common pattern:\n\n```python\n# Moving objects (bees, players) need Rigidbody for triggers to fire\nbatch_execute(commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"Bee_1\", \"component_type\": \"Rigidbody\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"Bee_1\",\n        \"component_type\": \"Rigidbody\",\n        \"properties\": {\"useGravity\": false, \"isKinematic\": true}\n    }}\n])\n```\n\n### Script Overwrites with `manage_script(action=\"update\")`\n\nWhen a generated script needs to be rewritten (e.g., to add auto-wiring logic), use `update` instead of deleting and recreating:\n\n```python\nmanage_script(\n    action=\"update\",\n    path=\"Assets/Scripts/MyScript.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class MyScript : MonoBehaviour { ... }\"\n)\n# manage_script update auto-triggers import + compile — just wait and check console\n# Read mcpforunity://editor/state → wait until is_compiling == false\nread_console(types=[\"error\"], count=10)\n```\n\n---\n\n## Scene Creation Workflows\n\n### Create Complete Scene from Scratch\n\n```python\n# 1. Create new scene\nmanage_scene(action=\"create\", name=\"GameLevel\", path=\"Assets/Scenes/\")\n\n# 2. Batch create environment objects\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Ground\", \"primitive_type\": \"Plane\",\n        \"position\": [0, 0, 0], \"scale\": [10, 1, 10]\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Light\", \"primitive_type\": \"Cube\"\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Player\", \"primitive_type\": \"Capsule\",\n        \"position\": [0, 1, 0]\n    }}\n])\n\n# 3. Add light component (delete cube mesh, add light)\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshRenderer\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshFilter\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"BoxCollider\")\nmanage_components(action=\"add\", target=\"Light\", component_type=\"Light\")\nmanage_components(action=\"set_property\", target=\"Light\", component_type=\"Light\",\n    property=\"type\", value=\"Directional\")\n\n# 4. Set up camera\nmanage_gameobject(action=\"modify\", target=\"Main Camera\", position=[0, 5, -10],\n    rotation=[30, 0, 0])\n\n# 5. Verify with screenshot\nmanage_camera(action=\"screenshot\")\n\n# 6. Save scene\nmanage_scene(action=\"save\")\n```\n\n### Populate Scene with Grid of Objects\n\n```python\n# Create 5x5 grid of cubes using batch\ncommands = []\nfor x in range(5):\n    for z in range(5):\n        commands.append({\n            \"tool\": \"manage_gameobject\",\n            \"params\": {\n                \"action\": \"create\",\n                \"name\": f\"Cube_{x}_{z}\",\n                \"primitive_type\": \"Cube\",\n                \"position\": [x * 2, 0, z * 2]\n            }\n        })\n\n# Execute in batches of 25\nbatch_execute(commands=commands[:25], parallel=True)\n```\n\n### Clone and Arrange Objects\n\n```python\n# Find template object\nresult = find_gameobjects(search_term=\"Template\", search_method=\"by_name\")\ntemplate_id = result[\"ids\"][0]\n\n# Duplicate in a line\nfor i in range(10):\n    manage_gameobject(\n        action=\"duplicate\",\n        target=template_id,\n        new_name=f\"Instance_{i}\",\n        offset=[i * 2, 0, 0]\n    )\n```\n\n---\n\n## Script Development Workflows\n\n### Create New Script and Attach\n\n```python\n# 1. Create script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/EnemyAI.cs\",\n    contents='''using UnityEngine;\n\npublic class EnemyAI : MonoBehaviour\n{\n    public float speed = 5f;\n    public Transform target;\n\n    void Update()\n    {\n        if (target != null)\n        {\n            Vector3 direction = (target.position - transform.position).normalized;\n            transform.position += direction * speed * Time.deltaTime;\n        }\n    }\n}'''\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for errors\nconsole = read_console(types=[\"error\"], count=10)\nif console[\"messages\"]:\n    # Handle compilation errors\n    print(\"Compilation errors:\", console[\"messages\"])\nelse:\n    # 4. Attach to GameObject\n    manage_gameobject(action=\"modify\", target=\"Enemy\", components_to_add=[\"EnemyAI\"])\n\n    # 5. Set component properties\n    manage_components(\n        action=\"set_property\",\n        target=\"Enemy\",\n        component_type=\"EnemyAI\",\n        properties={\n            \"speed\": 10.0\n        }\n    )\n```\n\n### Edit Existing Script Safely\n\n```python\n# 1. Get current SHA\nsha_info = get_sha(uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\")\n\n# 2. Find the method to edit\nmatches = find_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    pattern=\"void Update\\\\(\\\\)\"\n)\n\n# 3. Apply structured edit\nscript_apply_edits(\n    name=\"PlayerController\",\n    path=\"Assets/Scripts\",\n    edits=[{\n        \"op\": \"replace_method\",\n        \"methodName\": \"Update\",\n        \"replacement\": '''void Update()\n    {\n        float h = Input.GetAxis(\"Horizontal\");\n        float v = Input.GetAxis(\"Vertical\");\n        transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);\n    }'''\n    }]\n)\n\n# 4. Validate\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    level=\"standard\"\n)\n\n# 5. Wait for compilation (script_apply_edits auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 6. Check console\nread_console(types=[\"error\"], count=10)\n```\n\n### Add Method to Existing Class\n\n```python\nscript_apply_edits(\n    name=\"GameManager\",\n    path=\"Assets/Scripts\",\n    edits=[\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": '''\n    public void ResetGame()\n    {\n        SceneManager.LoadScene(SceneManager.GetActiveScene().name);\n    }'''\n        },\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"using UnityEngine;\",\n            \"position\": \"after\",\n            \"text\": \"\\nusing UnityEngine.SceneManagement;\"\n        }\n    ]\n)\n```\n\n---\n\n## Asset Management Workflows\n\n### Create and Apply Material\n\n```python\n# 1. Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    shader=\"Standard\",\n    properties={\n        \"_Color\": [0.2, 0.5, 1.0, 1.0],\n        \"_Metallic\": 0.5,\n        \"_Glossiness\": 0.8\n    }\n)\n\n# 2. Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"Player\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    slot=0\n)\n\n# 3. Verify visually\nmanage_camera(action=\"screenshot\")\n```\n\n### Create Procedural Texture\n\n```python\n# 1. Create base texture\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    width=256,\n    height=256,\n    fill_color=[255, 255, 255, 255]\n)\n\n# 2. Apply checkerboard pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    pattern=\"checkerboard\",\n    palette=[[0, 0, 0, 255], [255, 255, 255, 255]],\n    pattern_size=32\n)\n\n# 3. Create material with texture\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/CheckerMaterial.mat\",\n    shader=\"Standard\"\n)\n\n# 4. Assign texture to material (via manage_material set_material_shader_property)\n```\n\n### Organize Assets into Folders\n\n```python\n# 1. Create folder structure\nbatch_execute(commands=[\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Prefabs\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Materials\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Scripts\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Textures\"}}\n])\n\n# 2. Move existing assets\nmanage_asset(action=\"move\", path=\"Assets/MyMaterial.mat\", destination=\"Assets/Materials/MyMaterial.mat\")\nmanage_asset(action=\"move\", path=\"Assets/MyScript.cs\", destination=\"Assets/Scripts/MyScript.cs\")\n```\n\n### Search and Process Assets\n\n```python\n# Find all prefabs\nresult = manage_asset(\n    action=\"search\",\n    path=\"Assets\",\n    search_pattern=\"*.prefab\",\n    page_size=50,\n    generate_preview=False\n)\n\n# Process each prefab\nfor asset in result[\"assets\"]:\n    prefab_path = asset[\"path\"]\n    # Get prefab info\n    info = manage_prefabs(action=\"get_info\", prefab_path=prefab_path)\n    print(f\"Prefab: {prefab_path}, Children: {info['childCount']}\")\n```\n\n### Instantiate Prefab in Scene\n\nUse `manage_gameobject` (not `manage_prefabs`) to place prefab instances in the scene.\n\n```python\n# Full path\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"\n)\n\n# Smart lookup — just the prefab name works too\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Batch-spawn multiple instances\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": f\"Enemy_{i}\",\n        \"prefab_path\": \"Enemy\", \"position\": [i * 3, 0, 0], \"parent\": \"Enemies\"\n    }}\n    for i in range(5)\n])\n```\n\n> **Note:** `manage_prefabs` is for headless prefab editing (inspect, modify contents, create from GameObject). To *instantiate* a prefab into the scene, always use `manage_gameobject(action=\"create\", prefab_path=\"...\")`.\n\n---\n\n## Testing Workflows\n\n### Run Specific Tests\n\n```python\n# 1. List available tests\n# Read mcpforunity://tests/EditMode\n\n# 2. Run specific tests\nresult = run_tests(\n    mode=\"EditMode\",\n    test_names=[\"MyTests.TestPlayerMovement\", \"MyTests.TestEnemySpawn\"],\n    include_failed_tests=True\n)\njob_id = result[\"job_id\"]\n\n# 3. Wait for results\nfinal_result = get_test_job(\n    job_id=job_id,\n    wait_timeout=60,\n    include_failed_tests=True\n)\n\n# 4. Check results\nif final_result[\"status\"] == \"complete\":\n    for test in final_result.get(\"failed_tests\", []):\n        print(f\"FAILED: {test['name']}: {test['message']}\")\n```\n\n### Run Tests by Category\n\n```python\n# Run all unit tests\nresult = run_tests(\n    mode=\"EditMode\",\n    category_names=[\"Unit\"],\n    include_failed_tests=True\n)\n\n# Poll until complete\nwhile True:\n    status = get_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n    if status[\"status\"] in [\"complete\", \"failed\"]:\n        break\n```\n\n### Test-Driven Development Pattern\n\n```python\n# 1. Write test first\ncreate_script(\n    path=\"Assets/Tests/Editor/PlayerTests.cs\",\n    contents='''using NUnit.Framework;\nusing UnityEngine;\n\npublic class PlayerTests\n{\n    [Test]\n    public void TestPlayerStartsAtOrigin()\n    {\n        var player = new GameObject(\"TestPlayer\");\n        Assert.AreEqual(Vector3.zero, player.transform.position);\n        Object.DestroyImmediate(player);\n    }\n}'''\n)\n\n# 2. Wait for compilation (create_script auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Run test (expect pass for this simple test)\nresult = run_tests(mode=\"EditMode\", test_names=[\"PlayerTests.TestPlayerStartsAtOrigin\"])\nget_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n```\n\n---\n\n## Debugging Workflows\n\n### Diagnose Compilation Errors\n\n```python\n# 1. Check console for errors\nerrors = read_console(\n    types=[\"error\"],\n    count=20,\n    include_stacktrace=True,\n    format=\"detailed\"\n)\n\n# 2. For each error, find the file and line\nfor error in errors[\"messages\"]:\n    # Parse error message for file:line info\n    # Use find_in_file to locate the problematic code\n    pass\n\n# 3. After fixing, refresh and check again\nrefresh_unity(mode=\"force\", scope=\"scripts\", compile=\"request\", wait_for_ready=True)\nread_console(types=[\"error\"], count=10)\n```\n\n### Investigate Missing References\n\n```python\n# 1. Find the GameObject\nresult = find_gameobjects(search_term=\"Player\", search_method=\"by_name\")\n\n# 2. Get all components\n# Read mcpforunity://scene/gameobject/{id}/components\n\n# 3. Check for null references in serialized fields\n# Look for fields with null/missing values\n\n# 4. Find the referenced object\nresult = find_gameobjects(search_term=\"Target\", search_method=\"by_name\")\n\n# 5. Set the reference\nmanage_components(\n    action=\"set_property\",\n    target=\"Player\",\n    component_type=\"PlayerController\",\n    property=\"target\",\n    value={\"instanceID\": result[\"ids\"][0]}  # Reference by ID\n)\n```\n\n### Check Scene State\n\n```python\n# 1. Get hierarchy\nhierarchy = manage_scene(action=\"get_hierarchy\", page_size=100, include_transform=True)\n\n# 2. Find objects at unexpected positions\nfor item in hierarchy[\"data\"][\"items\"]:\n    if item.get(\"transform\", {}).get(\"position\", [0,0,0])[1] < -100:\n        print(f\"Object {item['name']} fell through floor!\")\n\n# 3. Visual verification\nmanage_camera(action=\"screenshot\")\n```\n\n---\n\n## UI Creation Workflows\n\nUnity has two UI systems: **UI Toolkit** (modern, recommended) and **uGUI** (Canvas-based, legacy). Use `manage_ui` for UI Toolkit workflows, and `batch_execute` with `manage_gameobject` + `manage_components` for uGUI.\n\n> **Template warning:** This section is a skill template library, not a guaranteed source of truth. Examples may be inaccurate for your Unity version, package setup, or project conventions.\n> **Use safely:**\n> 1. **Always read `mcpforunity://project/info` first** to detect installed packages and input system.\n> 2. Validate component/property names against the current project.\n> 3. Prefer targeting by instance ID or full path over generic names.\n> 4. Treat numeric enum values as placeholders and verify before reuse.\n\n### Step 0: Detect Project UI Capabilities\n\n**Before creating any UI**, read project info to determine which packages and input system are available.\n\n```python\n# Read mcpforunity://project/info — returns:\n# {\n#   \"renderPipeline\": \"BuiltIn\" | \"Universal\" | \"HighDefinition\" | \"Custom\",\n#   \"activeInputHandler\": \"Old\" | \"New\" | \"Both\",\n#   \"packages\": {\n#     \"ugui\": true/false,        — com.unity.ugui (Canvas, Image, Button, etc.)\n#     \"textmeshpro\": true/false,  — com.unity.textmeshpro (TextMeshProUGUI)\n#     \"inputsystem\": true/false,  — com.unity.inputsystem (new Input System)\n#     \"uiToolkit\": true/false,    — UI Toolkit (always true for Unity 2021.3+)\n#     \"screenCapture\": true/false  — ScreenCapture module enabled\n#   }\n# }\n```\n\n**Decision matrix:**\n\n| project_info field | Value | What to use |\n|---|---|---|\n| `packages.uiToolkit` | `true` | **Preferred:** Use `manage_ui` for UI Toolkit (UXML/USS) |\n| `packages.ugui` | `true` | Canvas-based UI (Image, Button, etc.) via `batch_execute` |\n| `packages.textmeshpro` | `true` | `TextMeshProUGUI` for text (uGUI) |\n| `packages.textmeshpro` | `false` | `UnityEngine.UI.Text` (legacy, lower quality) |\n| `activeInputHandler` | `\"Old\"` | `StandaloneInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"New\"` | `InputSystemUIInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"Both\"` | Either works; prefer `InputSystemUIInputModule` for UI |\n\n### UI Toolkit Workflows (manage_ui)\n\nUI Toolkit uses a web-like approach: **UXML** (like HTML) for structure, **USS** (like CSS) for styling. This is the preferred UI system for new projects.\n\n> **Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n#### Create a Complete UI Screen\n\n```python\n# 1. Create UXML document (structure)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='''<ui:UXML xmlns:ui=\"UnityEngine.UIElements\" xmlns:uie=\"UnityEditor.UIElements\">\n    <ui:Style src=\"Assets/UI/MainMenu.uss\" />\n    <ui:VisualElement name=\"root\" class=\"root-container\">\n        <ui:Label text=\"My Game\" class=\"title\" />\n        <ui:Button text=\"Play\" name=\"play-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Settings\" name=\"settings-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Quit\" name=\"quit-btn\" class=\"menu-button\" />\n    </ui:VisualElement>\n</ui:UXML>'''\n)\n\n# 2. Create USS stylesheet (styling)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents='''.root-container {\n    flex-grow: 1;\n    justify-content: center;\n    align-items: center;\n    background-color: rgba(0, 0, 0, 0.8);\n}\n.title {\n    font-size: 48px;\n    color: white;\n    -unity-font-style: bold;\n    margin-bottom: 40px;\n}\n.menu-button {\n    width: 300px;\n    height: 60px;\n    font-size: 24px;\n    margin: 8px;\n    background-color: rgb(50, 120, 200);\n    color: white;\n    border-radius: 8px;\n}\n.menu-button:hover {\n    background-color: rgb(70, 140, 220);\n}'''\n)\n\n# 3. Create a GameObject and attach UIDocument\nmanage_gameobject(action=\"create\", name=\"UIRoot\")\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\"\n    # panel_settings auto-created if omitted\n)\n\n# 4. Verify the visual tree\nmanage_ui(action=\"get_visual_tree\", target=\"UIRoot\", max_depth=5)\n```\n\n#### Update Existing UI\n\n```python\n# Read current content\nresult = manage_ui(action=\"read\", path=\"Assets/UI/MainMenu.uss\")\n# Modify and update\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents=\".title { font-size: 64px; color: yellow; }\"\n)\n```\n\n#### Custom PanelSettings\n\n```python\n# Create PanelSettings with ScaleWithScreenSize\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/GamePanelSettings.asset\",\n    scale_mode=\"ScaleWithScreenSize\",\n    reference_resolution={\"width\": 1920, \"height\": 1080}\n)\n\n# Attach UIDocument with custom PanelSettings\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/GamePanelSettings.asset\"\n)\n```\n\n### uGUI (Canvas-Based) Workflows\n\nThe sections below cover legacy Canvas-based UI using `batch_execute`. Use these when working with existing uGUI projects or when UI Toolkit is not suitable.\n\n### RectTransform Sizing (Critical for All UI Children)\n\nEvery GameObject under a Canvas gets a `RectTransform` instead of `Transform`. **Without setting anchor/size, UI elements default to zero size and won't be visible.** Use `set_property` on `RectTransform`:\n\n```python\n# Stretch to fill parent (common for panels/backgrounds)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyPanel\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 0],        # bottom-left corner\n        \"anchorMax\": [1, 1],        # top-right corner\n        \"sizeDelta\": [0, 0],        # no extra size beyond anchors\n        \"anchoredPosition\": [0, 0]  # centered on anchors\n    }\n}}\n\n# Fixed-size centered element (e.g. 300x50 button)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyButton\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0.5, 0.5],\n        \"anchorMax\": [0.5, 0.5],\n        \"sizeDelta\": [300, 50],\n        \"anchoredPosition\": [0, 0]\n    }\n}}\n\n# Top-anchored bar (e.g. health bar at top of screen)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"TopBar\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 1],        # left-top\n        \"anchorMax\": [1, 1],        # right-top (stretch horizontally)\n        \"sizeDelta\": [0, 60],       # 60px tall, full width\n        \"anchoredPosition\": [0, -30] # offset down by half height\n    }\n}}\n```\n\n> **Note:** Vector2 properties accept both `[x, y]` array format and `{\"x\": ..., \"y\": ...}` object format.\n\n### Create Canvas (Foundation for All UI)\n\nEvery UI element must be under a Canvas. A Canvas requires three components: `Canvas`, `CanvasScaler`, and `GraphicRaycaster`.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"Canvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"CanvasScaler\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"GraphicRaycaster\"\n    }},\n    # renderMode: 0=ScreenSpaceOverlay, 1=ScreenSpaceCamera, 2=WorldSpace\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0\n    }},\n    # CanvasScaler: uiScaleMode 1=ScaleWithScreenSize\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"uiScaleMode\", \"value\": 1\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"referenceResolution\",\n        \"value\": [1920, 1080]\n    }}\n])\n```\n\n### Create EventSystem (Required Once Per Scene for UI Interaction)\n\nIf no EventSystem exists in the scene, buttons and other interactive UI elements won't respond to input. Create one alongside your first Canvas. **Check `project_info.activeInputHandler` to pick the correct input module.**\n\n```python\n# For activeInputHandler == \"New\" or \"Both\" (project has Input System package):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.InputSystem.UI.InputSystemUIInputModule\"\n    }}\n])\n\n# For activeInputHandler == \"Old\" (legacy Input Manager only):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"\n    }}\n])\n```\n\n### Create Panel (Background Container)\n\nA Panel is an Image component used as a background/container for other UI elements.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.1, 0.1, 0.1, 0.8]\n    }},\n    # Size the panel (stretch to 60% of canvas, centered)\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.2, 0.1], \"anchorMax\": [0.8, 0.9],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Text (TextMeshPro)\n\nTextMeshProUGUI automatically adds a RectTransform when added to a child of a Canvas. If `packages.textmeshpro` is `false`, use `UnityEngine.UI.Text` instead.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"TitleText\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\n            \"text\": \"My Game Title\",\n            \"fontSize\": 48,\n            \"alignment\": 514,\n            \"color\": [1, 1, 1, 1]\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0.8], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n> **TextMeshPro alignment values:** 257=TopLeft, 258=TopCenter, 260=TopRight, 513=MiddleLeft, 514=MiddleCenter, 516=MiddleRight, 1025=BottomLeft, 1026=BottomCenter, 1028=BottomRight.\n\n### Create Button (With Label)\n\nA Button needs an `Image` (visual) + `Button` (interaction) on the parent, and a child with `TextMeshProUGUI` for the label.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Button\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.2, 0.6, 1.0, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [300, 60], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Child text label (stretches to fill button)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton_Label\", \"parent\": \"StartButton\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Start Game\", \"fontSize\": 24, \"alignment\": 514}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Slider (With Reference Wiring)\n\nA Slider requires a specific hierarchy and **must have its `fillRect` and `handleRect` references wired** to function.\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HealthSlider\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Slider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderBG\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.3, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Fill Area + Fill\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"FillArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"FillArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderFill\", \"parent\": \"FillArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderFill\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.8, 0.2, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Handle Area + Handle\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HandleArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HandleArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderHandle\", \"parent\": \"HandleArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderHandle\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderHandle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.5, 0], \"anchorMax\": [0.5, 1], \"sizeDelta\": [20, 0]}\n    }}\n])\n\n# Step 2: Wire Slider references (CRITICAL — slider won't work without this)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"fillRect\",\n        \"value\": {\"name\": \"SliderFill\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"handleRect\",\n        \"value\": {\"name\": \"SliderHandle\"}\n    }}\n])\n```\n\n### Create Input Field (With Reference Wiring)\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"NameInput\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 50], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Text Area child (clips text to input bounds)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputTextArea\", \"parent\": \"NameInput\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputTextArea\", \"component_type\": \"RectMask2D\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputTextArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-16, -8]}\n    }},\n    # Placeholder\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputPlaceholder\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputPlaceholder\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Enter name...\", \"fontStyle\": 2, \"color\": [0.5, 0.5, 0.5, 0.5]}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Actual text display\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputText\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputText\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }}\n])\n\n# Step 2: Wire TMP_InputField references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textViewport\",\n        \"value\": {\"name\": \"InputTextArea\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textComponent\",\n        \"value\": {\"name\": \"InputText\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"placeholder\",\n        \"value\": {\"name\": \"InputPlaceholder\"}\n    }}\n])\n```\n\n### Create Toggle (With Reference Wiring)\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SoundToggle\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SoundToggle\", \"component_type\": \"Toggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [200, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background box\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleBG\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0.5], \"anchorMax\": [0, 0.5], \"sizeDelta\": [26, 26], \"anchoredPosition\": [13, 0]}\n    }},\n    # Checkmark\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleCheckmark\", \"parent\": \"ToggleBG\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleCheckmark\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleCheckmark\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.1, 0.1], \"anchorMax\": [0.9, 0.9], \"sizeDelta\": [0, 0]}\n    }},\n    # Label\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleLabel\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleLabel\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Sound Effects\", \"fontSize\": 18, \"alignment\": 513}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-35, 0], \"anchoredPosition\": [17.5, 0]}\n    }}\n])\n\n# Wire Toggle references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"Toggle\", \"property\": \"graphic\",\n        \"value\": {\"name\": \"ToggleCheckmark\"}\n    }}\n])\n```\n\n### Add Layout Group (Vertical/Horizontal/Grid)\n\nLayout groups auto-arrange child elements, so you can skip manual RectTransform positioning for children.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\",\n        \"properties\": {\n            \"spacing\": 10,\n            \"childAlignment\": 4,\n            \"childForceExpandWidth\": True,\n            \"childForceExpandHeight\": False,\n            \"padding\": {\"left\": 20, \"right\": 20, \"top\": 20, \"bottom\": 20}\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\",\n        \"properties\": { \"verticalFit\": 2 }\n    }}\n])\n```\n\n> **childAlignment values:** 0=UpperLeft, 1=UpperCenter, 2=UpperRight, 3=MiddleLeft, 4=MiddleCenter, 5=MiddleRight, 6=LowerLeft, 7=LowerCenter, 8=LowerRight.\n> **ContentSizeFitter fit modes:** 0=Unconstrained, 1=MinSize, 2=PreferredSize.\n\n### Complete Example: Main Menu Screen\n\nCombines multiple templates into a full menu screen in two batch calls (default 25 command limit per batch, configurable in Unity MCP Tools window up to 100). **Assumes `project_info` has been read and `activeInputHandler` is known.**\n\n```python\n# Batch 1: Canvas + EventSystem + Panel + Title\nbatch_execute(fail_fast=True, commands=[\n    # Canvas\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"GraphicRaycaster\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\", \"properties\": {\"uiScaleMode\": 1, \"referenceResolution\": [1920, 1080]}}},\n    # EventSystem — use StandaloneInputModule OR InputSystemUIInputModule based on project_info\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"}},\n    # Panel (centered, 60% width)\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.1, 0.1, 0.15, 0.9]}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0.2, 0.15], \"anchorMax\": [0.8, 0.85], \"sizeDelta\": [0, 0]}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\", \"properties\": {\"spacing\": 20, \"childAlignment\": 4, \"childForceExpandWidth\": True, \"childForceExpandHeight\": False}}},\n    # Title\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Title\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"My Game\", \"fontSize\": 64, \"alignment\": 514, \"color\": [1, 1, 1, 1]}}}\n])\n\n# Batch 2: Buttons\nbatch_execute(fail_fast=True, commands=[\n    # Play Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.6, 1.0, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayLabel\", \"parent\": \"PlayButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Play\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Settings Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.35, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsLabel\", \"parent\": \"SettingsButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Settings\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Quit Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.8, 0.2, 0.2, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitLabel\", \"parent\": \"QuitButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Quit\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}}\n])\n```\n\n### UI Component Quick Reference\n\n| UI Element | Required Components | Notes |\n| ---------- | ------------------- | ----- |\n| **Canvas** | Canvas + CanvasScaler + GraphicRaycaster | Root for all UI. One per screen. |\n| **EventSystem** | EventSystem + input module (see below) | One per scene. Required for interaction. |\n| **Panel** | Image + RectTransform sizing | Container. Set color for background. |\n| **Text** | TextMeshProUGUI (or Text if no TMP) + RectTransform | Check `packages.textmeshpro`. |\n| **Button** | Image + Button + child(TextMeshProUGUI) + RectTransform | Image = visual, Button = click handler. |\n| **Slider** | Slider + Image + children + **wire fillRect/handleRect** | Won't function without wiring. |\n| **Toggle** | Toggle + children + **wire graphic** | Wire checkmark Image to `graphic`. |\n| **Input Field** | Image + TMP_InputField + children + **wire textViewport/textComponent/placeholder** | Won't function without wiring. |\n| **Layout Group** | VerticalLayoutGroup / HorizontalLayoutGroup / GridLayoutGroup | Auto-arranges children; skip manual RectTransform on children. |\n\n---\n\n## Input System: Old vs New\n\nUnity has two input systems that affect UI interaction, script input handling, and EventSystem confi",".claude/skills/blender-to-unity/manual-verify.md":"# Blender-to-unity Skill\n\nPath: `.claude/skills/blender-to-unity/manual-verify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/manual-verify.md)","TestProjects/UnityMCPTests/Packages/manifest.json":"# Packages Skill\n\nPath: `TestProjects/UnityMCPTests/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/Packages/manifest.json)","TestProjects/AssetStoreUploads/Packages/manifest.json":"# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/manifest.json)","TestProjects/AssetStoreUploads/Packages/packages-lock.json":"# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/packages-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/packages-lock.json)",".claude/skills/unity-mcp-skill/references/tools-reference.md":"# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/tools-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/tools-reference.md)",".claude/skills/unity-mcp-skill/references/workflows.md":"# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/workflows.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/workflows.md)",".claude/skills/blender-to-unity/references/bridge-fidelity.md":"# References Skill\n\nPath: `.claude/skills/blender-to-unity/references/bridge-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/references/bridge-fidelity.md)","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md)","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md)","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json)","website/docs/reference/tools/index.md":"# Tools Skill\n\nPath: `website/docs/reference/tools/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/index.md)","TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json":"# Com.unity.testtools.codecoverage Skill\n\nPath: `TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json)","website/docs/reference/tools/docs/_category_.json":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/_category_.json)","website/docs/reference/tools/docs/index.md":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/index.md)","website/docs/reference/tools/docs/unity_docs.md":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/unity_docs.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_docs.md)","website/docs/reference/tools/docs/unity_reflect.md":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/unity_reflect.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_reflect.md)","website/docs/reference/tools/core/_category_.json":"# Core Skill\n\nPath: `website/docs/reference/tools/core/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/_category_.json)","website/docs/reference/tools/core/apply_text_edits.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/apply_text_edits.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/apply_text_edits.md)","website/docs/reference/tools/core/batch_execute.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/batch_execute.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/batch_execute.md)","website/docs/reference/tools/core/create_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/create_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/create_script.md)","website/docs/reference/tools/core/debug_request_context.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/debug_request_context.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/debug_request_context.md)","website/docs/reference/tools/core/delete_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/delete_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/delete_script.md)","website/docs/reference/tools/core/execute_custom_tool.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/execute_custom_tool.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_custom_tool.md)","website/docs/reference/tools/core/execute_menu_item.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/execute_menu_item.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_menu_item.md)","website/docs/reference/tools/core/find_gameobjects.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/find_gameobjects.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_gameobjects.md)","website/docs/reference/tools/core/find_in_file.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/find_in_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_in_file.md)","website/docs/reference/tools/core/get_sha.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/get_sha.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/get_sha.md)","website/docs/reference/tools/core/index.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/index.md)","website/docs/reference/tools/core/manage_asset.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_asset.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_asset.md)","website/docs/reference/tools/core/manage_build.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_build.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_build.md)","website/docs/reference/tools/core/manage_camera.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_camera.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_camera.md)","website/docs/reference/tools/core/manage_components.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_components.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_components.md)","website/docs/reference/tools/core/manage_editor.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_editor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_editor.md)","website/docs/reference/tools/core/manage_gameobject.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_gameobject.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_gameobject.md)","website/docs/reference/tools/core/manage_graphics.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_graphics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_graphics.md)","website/docs/reference/tools/core/manage_material.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_material.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_material.md)","website/docs/reference/tools/core/manage_packages.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_packages.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_packages.md)","website/docs/reference/tools/core/manage_physics.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_physics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_physics.md)","website/docs/reference/tools/core/manage_prefabs.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_prefabs.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_prefabs.md)","website/docs/reference/tools/core/manage_scene.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_scene.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_scene.md)","website/docs/reference/tools/core/manage_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script.md)","website/docs/reference/tools/core/manage_script_capabilities.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_script_capabilities.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script_capabilities.md)","website/docs/reference/tools/core/manage_tools.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_tools.md)","website/docs/reference/tools/core/read_console.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/read_console.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/read_console.md)","website/docs/reference/tools/core/refresh_unity.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/refresh_unity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/refresh_unity.md)","website/docs/reference/tools/core/script_apply_edits.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/script_apply_edits.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/script_apply_edits.md)","website/docs/reference/tools/core/set_active_instance.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/set_active_instance.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/set_active_instance.md)","website/docs/reference/tools/core/validate_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/validate_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/validate_script.md)","website/docs/reference/tools/asset_gen/_category_.json":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/_category_.json)","website/docs/reference/tools/asset_gen/generate_audio.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_audio.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_audio.md)","website/docs/reference/tools/asset_gen/generate_image.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_image.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_image.md)","website/docs/reference/tools/asset_gen/generate_model.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_model.md)","website/docs/reference/tools/asset_gen/import_model.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model.md)","website/docs/reference/tools/asset_gen/import_model_file.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model_file.md)","website/docs/reference/tools/asset_gen/index.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/index.md)","website/docs/reference/tools/animation/_category_.json":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/_category_.json)","website/docs/reference/tools/animation/index.md":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/index.md)","website/docs/reference/tools/animation/manage_animation.md":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/manage_animation.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/manage_animation.md)","website/docs/reference/tools/probuilder/_category_.json":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/_category_.json)","website/docs/reference/tools/probuilder/index.md":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/index.md)","website/docs/reference/tools/probuilder/manage_probuilder.md":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/manage_probuilder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/manage_probuilder.md)","website/docs/reference/tools/profiling/_category_.json":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/_category_.json)","website/docs/reference/tools/profiling/index.md":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/index.md)","website/docs/reference/tools/profiling/manage_profiler.md":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/manage_profiler.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/manage_profiler.md)","website/docs/reference/tools/scripting_ext/_category_.json":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/_category_.json)","website/docs/reference/tools/scripting_ext/execute_code.md":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/execute_code.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/execute_code.md)","website/docs/reference/tools/scripting_ext/index.md":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/index.md)","website/docs/reference/tools/scripting_ext/manage_scriptable_object.md":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/manage_scriptable_object.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/manage_scriptable_object.md)","website/docs/reference/tools/testing/_category_.json":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/_category_.json)","website/docs/reference/tools/testing/get_test_job.md":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/get_test_job.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/get_test_job.md)","website/docs/reference/tools/testing/index.md":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/index.md)","website/docs/reference/tools/testing/run_tests.md":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/run_tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/run_tests.md)","website/docs/reference/tools/ui/_category_.json":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/_category_.json)","website/docs/reference/tools/ui/index.md":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/index.md)","website/docs/reference/tools/ui/manage_ui.md":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/manage_ui.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/manage_ui.md)","website/docs/reference/tools/vfx/_category_.json":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/_category_.json)","website/docs/reference/tools/vfx/index.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/index.md)","website/docs/reference/tools/vfx/manage_shader.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_shader.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_shader.md)","website/docs/reference/tools/vfx/manage_texture.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_texture.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_texture.md)","website/docs/reference/tools/vfx/manage_vfx.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_vfx.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_vfx.md)"},"files":{"CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## What This Project Is\n\n**MCP for Unity** is a bridge that lets AI assistants (Claude, Cursor, Windsurf, etc.) control the Unity Editor through the Model Context Protocol (MCP). It enables AI-driven game development workflows - creating GameObjects, editing scripts, managing assets, running tests, and more.\n\n## Architecture\n\n```text\nAI Assistant (Claude/Cursor)\n        ↓ MCP Protocol (stdio/HTTP)\nPython Server (Server/src/)\n        ↓ WebSocket + HTTP\nUnity Editor Plugin (MCPForUnity/)\n        ↓ Unity Editor API\nScene, Assets, Scripts\n```\n\n**Two codebases, one system:**\n- `Server/` - Python MCP server using FastMCP\n- `MCPForUnity/` - Unity C# Editor package\n\n### Three Layers on the Python Side\n\nThe Python server has three distinct layers. These are **not** auto-generated from each other:\n\n| Layer | Location | Framework | Purpose |\n|-------|----------|-----------|---------|\n| **MCP Tools** | `Server/src/services/tools/` | FastMCP (`@mcp_for_unity_tool`) | Exposed to AI assistants via MCP protocol |\n| **CLI Commands** | `Server/src/cli/commands/` | Click (`@click.command`) | Terminal interface for developers |\n| **Resources** | `Server/src/services/resources/` | FastMCP (`@mcp_for_unity_resource`) | Read-only state exposed to AI assistants |\n\nMCP tools call Unity via WebSocket (`send_with_unity_instance`). CLI commands call Unity via HTTP (`run_command`). Both route to the same C# `HandleCommand` methods.\n\n### Transport Modes\n\n- **Stdio**: Single-agent only. Separate Python process per client. Legacy TCP bridge to Unity. New connections stomp old ones.\n- **HTTP**: Multi-agent ready. Single shared Python server. WebSocket hub at `/hub/plugin`. Session isolation via `client_id`.\n\n## Code Philosophy\n\n### 1. Domain Symmetry\nPython MCP tools mirror C# Editor tools. Each domain exists in both:\n- `Server/src/services/tools/manage_material.py` ↔ `MCPForUnity/Editor/Tools/ManageMaterial.cs`\n- CLI commands (`Server/src/cli/commands/`) also mirror these but are a separate implementation.\n\n### 2. Minimal Abstraction\nAvoid premature abstraction. Three similar lines of code is better than a helper that's used once. Only abstract when you have 3+ genuine use cases.\n\n### 3. Delete Rather Than Deprecate\nWhen removing functionality, delete it completely. No `_unused` renames, no `// removed` comments, no backwards-compatibility shims for internal code.\n\n### 4. Test Coverage Required\nEvery new feature needs tests. Run them before PRs.\n\n### 5. Keep Tools Focused\nEach MCP tool does one thing well. Resist the urge to add \"convenient\" parameters that bloat the API surface.\n\n### 6. Use Resources for Reading\nKeep them smart and focused rather than \"read everything\" type resources. Resources should be quick and LLM-friendly.\n\n## Key Patterns\n\n### Python MCP Tool Registration\nTools in `Server/src/services/tools/` are auto-discovered. Use the `@mcp_for_unity_tool` decorator:\n```python\nfrom services.registry import mcp_for_unity_tool\n\n@mcp_for_unity_tool(\n    description=\"Does something in Unity.\",\n    group=\"core\",  # core (default), vfx, animation, ui, scripting_ext, testing, probuilder, profiling, docs, asset_gen\n)\nasync def manage_something(\n    ctx: Context,\n    action: Annotated[Literal[\"create\", \"delete\"], \"Action to perform\"],\n) -> dict[str, Any]:\n    unity_instance = await get_unity_instance_from_context(ctx)\n    params = {\"action\": action}\n    response = await send_with_unity_instance(async_send_command_with_retry, unity_instance, \"manage_something\", params)\n    return response\n```\n\nThe `group` parameter controls tool visibility. Only `\"core\"` is enabled by default. Non-core groups (vfx, animation, etc.) start disabled and are toggled via `manage_tools`.\n\n### Python CLI Error Handling\nCLI commands (not MCP tools) use the `@handle_unity_errors` decorator:\n```python\n@handle_unity_errors\nasync def my_command(ctx, ...):\n    result = await call_unity_tool(...)\n```\n\n### C# Tool Registration\nTools are auto-discovered by `CommandRegistry` via reflection. Use the `[McpForUnityTool]` attribute:\n```csharp\n[McpForUnityTool(\"manage_something\", AutoRegister = false, Group = \"core\")]\npublic static class ManageSomething\n{\n    // Sync handler (most tools):\n    public static object HandleCommand(JObject @params)\n    {\n        var p = new ToolParams(@params);\n        // ...\n        return new SuccessResponse(\"Done.\", new { data = result });\n    }\n\n    // OR async handler (for long-running operations like play-test, refresh, batch):\n    public static async Task<object> HandleCommand(JObject @params)\n    {\n        // CommandRegistry detects Task return type automatically\n        await SomeAsyncOperation();\n        return new SuccessResponse(\"Done.\");\n    }\n}\n```\n\nAsync handlers use `EditorApplication.update` polling with `TaskCompletionSource` — see `RefreshUnity.cs` for the canonical pattern.\n\n### C# Parameter Handling\nUse `ToolParams` for consistent parameter validation:\n```csharp\nvar p = new ToolParams(parameters);\nvar pageSize = p.GetInt(\"page_size\", \"pageSize\") ?? 50;\nvar name = p.RequireString(\"name\");\n```\n\n### C# Resources\nResources use `[McpForUnityResource]` and follow the same `HandleCommand` pattern as tools. They provide read-only state to AI assistants.\n\n### Paging Large Results\nAlways page results that could be large (hierarchies, components, search results):\n- Use `page_size` and `cursor` parameters\n- Return `next_cursor` when more results exist\n\n### Composing Tools Internally (C#)\nUse `CommandRegistry.InvokeCommandAsync` to call other tools from within a handler:\n```csharp\nvar result = await CommandRegistry.InvokeCommandAsync(\"read_console\", consoleParams);\n```\n\n### Unity API Compatibility Shims\nWe support a wide Unity version range (2021+ → 6.x → CoreCLR 6.8). When an API is renamed, deprecated, or removed across versions, **don't sprinkle `#if UNITY_x_y_OR_NEWER` at every call site** — add a shim in `MCPForUnity/Runtime/Helpers/Unity*Compat.cs` and route every caller through it.\n\nThe catalog of active shims, the policy for when to add one, what does NOT belong in a shim, and the reflection-cache pattern all live in **`MCPForUnity/Runtime/Helpers/UnityCompatShims.cs`** — the XML doc on that empty marker class is the source of truth and ships inside the UPM package, so end-users can `F12`/Go-to-definition into it. Sources for current deprecations: Unity 6.x upgrade guides and the [CoreCLR 2026 thread](https://discussions.unity.com/t/path-to-coreclr-2026-upgrade-guide/1714279).\n\nWhen you touch a shim or anything else gated by `#if UNITY_*_OR_NEWER`, run `tools/check-unity-versions.sh` to compile-check across the CI matrix locally before committing — the matrix lives in `tools/unity-versions.json`.\n\n## Commands\n\n### Running Tests\n```bash\n# Python (all tests)\ncd Server && uv run pytest tests/ -v\n\n# Python (single test file)\ncd Server && uv run pytest tests/test_manage_material.py -v\n\n# Python (single test by name)\ncd Server && uv run pytest tests/ -k \"test_create_material\" -v\n\n# Unity - open TestProjects/UnityMCPTests in Unity, use Test Runner window\n\n# Local multi-version compile check (parity with CI matrix, see tools/unity-versions.json)\ntools/check-unity-versions.sh           # compile-only across installed Unity Hub editors\ntools/check-unity-versions.sh --full    # full EditMode test run\n\n# License-free Roslyn compile of MCPForUnity, the same gate compile-check.yml runs on every PR.\n# No Editor launch, ~1 min per version. EXTRA_REFS must hold Newtonsoft.Json.dll and\n# nunit.framework.dll (copy them from TestProjects/UnityMCPTests/Library/PackageCache);\n# the script header has the full recipe, including the Windows/Git Bash form.\nUNITY_DATA=/path/to/Editor/Data UNITY_VERSION=2021.3.45f2 EXTRA_REFS=/path/to/refs tools/compile-check.sh\n```\n\n#### Local headless test harness\nOne command boots a headless Hub-licensed Editor against `TestProjects/UnityMCPTests` and runs the smoke + EditMode + PlayMode legs over the bridge — the same entrypoint CI uses (`.github/workflows/e2e-bridge.yml`):\n\n```bash\npython tools/local_harness.py\n```\n\nKey flags: `--legs smoke,editmode,playmode` (subset to run), `--project-path` (target project, default `TestProjects/UnityMCPTests`), `--reuse` (attach to an already-resident bridge instead of booting one), `--keep-alive` (leave the Editor running after the legs), `--no-warmup` (skip the warm-up import phase).\n\nExit codes: `0` pass, `1` blocking-leg regression, `2` bridge unreachable / setup failure, `3` project does not compile, `4` no Unity license / Hub seat, `5` Editor binary/version not found. Requires a Hub-activated Editor locally (no ULF/serial).\n\n### Local Development\n1. Set **Server Source Override** in MCP for Unity Advanced Settings to your local `Server/` path\n2. Enable **Dev Mode** checkbox to force fresh installs\n3. Use `mcp_source.py` to switch Unity package sources\n4. Test on Windows and Mac if possible, and multiple clients (Claude Desktop and Claude Code are tricky for configuration as of this writing)\n\n### Adding a New Tool\n1. Add Python MCP tool in `Server/src/services/tools/manage_<domain>.py` using `@mcp_for_unity_tool`\n2. Add Python CLI commands in `Server/src/cli/commands/<domain>.py` using Click\n3. Add C# implementation in `MCPForUnity/Editor/Tools/Manage<Domain>.cs` with `[McpForUnityTool]`\n4. Add Python tests in `Server/tests/test_manage_<domain>.py`\n5. Add Unity tests in `TestProjects/UnityMCPTests/Assets/Tests/`\n\n## What Not To Do\n\n- Don't add features without tests\n- Don't create helper functions for one-time operations\n- Don't add error handling for scenarios that can't happen\n- Don't commit to `main` directly - branch off `beta` for PRs\n- Don't add docstrings/comments to code you didn't change\n",".claude/mcp.json":"{\n  \"mcpServers\": {\n    \"UnityMCP\": {\n      \"type\": \"http\",\n      \"url\": \"http://localhost:8080/mcp\"\n    }\n  }\n}\n",".claude/skills/mcp-source/SKILL.md":"---\nname: mcp-source\ndescription: Switch MCP for Unity package source in connected Unity projects. Use /mcp-source [main|beta|branch|local] to swap between upstream releases, your remote branch, or local dev checkout.\n---\n\n# Switch MCP for Unity Package Source\n\nYou are switching the `com.coplaydev.unity-mcp` package source in one or more Unity projects.\n\n## allowed-tools\n\nBash, Read, Edit, ReadMcpResourceTool, ListMcpResourcesTool\n\n## Instructions\n\n### 1. Parse arguments\n\nThe user's argument is: `$ARGUMENTS`\n\nValid values: `main`, `beta`, `branch`, `local`, or empty.\n\nIf empty or not one of the four valid values, ask the user to choose:\n- **main** — upstream main branch (stable releases)\n- **beta** — upstream beta branch (pre-release)\n- **branch** — your current remote branch (for testing a PR)\n- **local** — local file reference to your checkout (for live dev iteration)\n\n### 2. Detect repo context\n\nRun these git commands from the current working directory to find the unity-mcp repo:\n\n```bash\ngit rev-parse --show-toplevel    # → repo_root\ngit rev-parse --abbrev-ref HEAD  # → branch_name\ngit remote get-url origin        # → origin_url\n```\n\nConvert SSH origins to HTTPS: if `origin_url` starts with `git@github.com:`, transform it to `https://github.com/{owner}/{repo}.git`.\n\n### 3. Discover target Unity projects\n\nTry two approaches to find `Packages/manifest.json` files to update:\n\n**Approach A — MCP resources (preferred):**\nRead `mcpforunity://project/info` for each connected Unity instance (use `ListMcpResourcesTool` to find available instances). Extract `projectRoot` and use `{projectRoot}/Packages/manifest.json`.\n\n**Approach B — filesystem fallback:**\nIf no MCP instances are connected, search upward from the current working directory for `Packages/manifest.json` files using Bash:\n```bash\nfind \"$(pwd)\" -maxdepth 3 -name \"manifest.json\" -path \"*/Packages/manifest.json\" 2>/dev/null\n```\n\nIf multiple manifests are found, update all of them (confirming with the user first).\n\n### 4. Build the package URL\n\nBased on the user's selection, construct the dependency value:\n\n| Selection | URL |\n|-----------|-----|\n| `main`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main` |\n| `beta`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#beta` |\n| `branch`  | `{origin_https}?path=/MCPForUnity#{branch_name}` |\n| `local`   | `file:{repo_root}/MCPForUnity` |\n\nFor `branch`: use the HTTPS-normalized origin URL and current git branch name.\nFor `local`: use the absolute path to the repo root with `file:` prefix (no `//`), e.g. `file:/Users/davidsarno/unity-mcp/MCPForUnity`.\n\n### 5. Update each manifest\n\nFor each discovered `manifest.json`:\n\n1. Read the file with the Read tool\n2. Find the `\"com.coplaydev.unity-mcp\"` dependency line\n3. Use the Edit tool to replace the old value with the new URL\n4. Report what was changed: old value → new value, file path\n\n### 6. Report results\n\nAfter updating, tell the user:\n- Which manifests were updated\n- The old and new package source values\n- Remind them: \"Unity will re-resolve the package automatically. If it doesn't, open Package Manager and click Refresh.\"\n",".claude/skills/unity-mcp-skill/SKILL.md":"---\nname: unity-mcp-orchestrator\ndescription: Orchestrate Unity Editor via MCP (Model Context Protocol) tools and resources. Use when working with Unity projects through MCP for Unity - creating/modifying GameObjects, editing scripts, managing scenes, running tests, or any Unity Editor automation. Provides best practices, tool schemas, and workflow patterns for effective Unity-MCP integration.\n---\n\n# Unity-MCP Operator Guide\n\nThis skill helps you effectively use the Unity Editor with MCP tools and resources.\n\n## Template Notice\n\nExamples in `references/workflows.md` and `references/tools-reference.md` are reusable templates. They may be inaccurate across Unity versions, package setups (UGUI/TMP/Input System), and project-specific conventions. Please check console, compilation errors, or use screenshot after implementation.\n\nBefore applying a template:\n- Validate targets/components first via resources and `find_gameobjects`.\n- Treat names, enum values, and property payloads as placeholders to adapt.\n\n## Quick Start: Resource-First Workflow\n\n**Always read relevant resources before using tools.** This prevents errors and provides the necessary context.\n\n```\n1. Check editor state     → mcpforunity://editor/state\n2. Understand the scene   → mcpforunity://scene/gameobject-api\n3. Find what you need     → find_gameobjects or resources\n4. Take action            → tools (manage_gameobject, create_script, script_apply_edits, apply_text_edits, validate_script, delete_script, get_sha, etc.)\n5. Verify results         → read_console, manage_camera(action=\"screenshot\"), resources\n```\n\n**If a tool you need is not in your tool list, it is not necessarily missing.** Check these before troubleshooting the connection:\n\n- **Project custom tools** (C# `[McpForUnityTool]`): with project-scoped tools enabled on the server, they are *not* callable by name. List them via `mcpforunity://custom-tools` and run them with `execute_custom_tool(tool_name=\"...\", parameters={...})`. With it disabled, they are registered as ordinary tools and appear in your list.\n- **Disabled tool groups**: over HTTP, a session starts with only the `core` group enabled. Over stdio, all groups start enabled and are then synced to the tool toggles in the Unity editor, so a tool can still be hidden. `manage_tools(action=\"list_groups\")` shows the groups, `manage_tools(action=\"activate\", group=\"...\")` enables one.\n\n## Critical Best Practices\n\n### 1. After Writing/Editing Scripts: Wait for Compilation and Check Console\n\n```python\n# After create_script or script_apply_edits:\n# Both tools already trigger AssetDatabase.ImportAsset + RequestScriptCompilation automatically.\n# No need to call refresh_unity — just wait for compilation to finish, then check console.\n\n# 1. Poll editor state until compilation completes\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 2. Check for compilation errors\nread_console(types=[\"error\"], count=10, include_stacktrace=True)\n```\n\n**Why:** Unity must compile scripts before they're usable. `create_script` and `script_apply_edits` already trigger import and compilation automatically — calling `refresh_unity` afterward is redundant.\n\n### 2. Use `batch_execute` for Multiple Operations\n\n```python\n# 10-100x faster than sequential calls\nbatch_execute(\n    commands=[\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube1\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube2\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube3\", \"primitive_type\": \"Cube\"}}\n    ],\n    parallel=True  # Hint only: Unity may still execute sequentially\n)\n```\n\n**Max 25 commands per batch by default (configurable in Unity MCP Tools window, max 100).** Use `fail_fast=True` for dependent operations.\n\n**Tip:** Also use `batch_execute` for discovery — batch multiple `find_gameobjects` calls instead of calling them one at a time:\n```python\nbatch_execute(commands=[\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Camera\", \"search_method\": \"by_component\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Player\", \"search_method\": \"by_tag\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"GameManager\", \"search_method\": \"by_name\"}}\n])\n```\n\n### 3. Use Screenshots to Verify Visual Results\n\n```python\n# Basic screenshot (saves to Assets/, returns file path only)\nmanage_camera(action=\"screenshot\")\n\n# Inline screenshot (returns base64 PNG directly to the AI)\nmanage_camera(action=\"screenshot\", include_image=True)\n\n# Use a specific camera and cap resolution for smaller payloads\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n\n# Batch surround: captures front/back/left/right/top/bird_eye around the scene\nmanage_camera(action=\"screenshot\", batch=\"surround\", max_resolution=256)\n\n# Batch surround centered on a specific object\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Positioned screenshot: place a temp camera and capture in one call\nmanage_camera(action=\"screenshot\", view_target=\"Player\", view_position=[0, 10, -10], max_resolution=512)\n\n# Scene View screenshot: capture what the developer sees in the editor\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n```\n\n**Best practices for AI scene understanding:**\n- Use `include_image=True` when you need to *see* the scene, not just save a file.\n- Use `batch=\"surround\"` for a comprehensive overview (6 angles, one command).\n- Use `view_target`/`view_position` to capture from a specific viewpoint without needing a scene camera.\n- Use `capture_source=\"scene_view\"` to see the editor viewport (gizmos, wireframes, grid).\n- Keep `max_resolution` at 256–512 to balance quality vs. token cost.\n\n```python\n# Agentic camera loop: point, shoot, analyze\nmanage_gameobject(action=\"look_at\", target=\"MainCamera\", look_at_target=\"Player\")\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n# → Analyze image, decide next action\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Scene View for editor-level inspection (shows gizmos, debug overlays, etc.)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Player\", include_image=True)\n```\n\n### 4. Check Console After Major Changes\n\n```python\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\"],  # Focus on problems\n    count=10,\n    format=\"detailed\"\n)\n```\n\n### 5. Always Check `mcpforunity://editor/state` Before Complex Operations\n\n```python\n# Read mcpforunity://editor/state to check:\n# - is_compiling: Wait if true\n# - is_domain_reload_pending: Wait if true  \n# - ready_for_tools: Only proceed if true\n# - blocking_reasons: Why tools might fail\n```\n\n## Parameter Type Conventions\n\nThese are common patterns, not strict guarantees. `manage_components.set_property` payload shapes can vary by component/property; if a template fails, inspect the component resource payload and adjust.\n\n### Vectors (position, rotation, scale, color)\n```python\n# Both forms accepted:\nposition=[1.0, 2.0, 3.0]        # List\nposition=\"[1.0, 2.0, 3.0]\"     # JSON string\n```\n\n### Booleans\n```python\n# Both forms accepted:\ninclude_inactive=True           # Boolean\ninclude_inactive=\"true\"         # String\n```\n\n### Colors\n```python\n# Auto-detected format:\ncolor=[255, 0, 0, 255]         # 0-255 range\ncolor=[1.0, 0.0, 0.0, 1.0]    # 0.0-1.0 normalized (auto-converted)\n```\n\n### Paths\n```python\n# Assets-relative (default):\npath=\"Assets/Scripts/MyScript.cs\"\n\n# URI forms:\nuri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\"\nuri=\"file:///full/path/to/file.cs\"\n```\n\n## Core Tool Categories\n\n| Category | Key Tools | Use For |\n|----------|-----------|---------|\n| **Scene** | `manage_scene`, `find_gameobjects` | Scene operations, finding objects. Multi-scene editing (additive load, close, set active, move GO between scenes), scene templates (`3d_basic`, `2d_basic`, `empty`, `default`), scene validation with `auto_repair`. For build settings, use `manage_build(action=\"scenes\")`. |\n| **Objects** | `manage_gameobject`, `manage_components` | Creating/modifying GameObjects |\n| **Scripts** | `create_script`, `script_apply_edits`, `validate_script` | C# code management (auto-refreshes on create/edit) |\n| **Assets** | `manage_asset`, `manage_prefabs` | Asset operations. **Prefab instantiation** is done via `manage_gameobject(action=\"create\", prefab_path=\"...\")`, not `manage_prefabs`. |\n| **Editor** | `manage_editor`, `execute_menu_item`, `read_console` | Editor control, package deployment (`deploy_package`/`restore_package`), undo/redo (`undo`/`redo` actions) |\n| **Testing** | `run_tests`, `get_test_job` | Unity Test Framework |\n| **Batch** | `batch_execute` | Parallel/bulk operations |\n| **Camera** | `manage_camera` | Camera management (Unity Camera + Cinemachine). **Tier 1** (always available): create, target, lens, priority, list, screenshot. **Tier 2** (requires `com.unity.cinemachine`): brain, body/aim/noise pipeline, extensions, blending, force/release. 7 presets: follow, third_person, freelook, dolly, static, top_down, side_scroller. Resource: `mcpforunity://scene/cameras`. Use `ping` to check Cinemachine availability. See [tools-reference.md](references/tools-reference.md#camera-tools). |\n| **Animation** | `manage_animation`, `manage_sprite` | Animator control, clips and controllers. **2D sprite sheets**: `manage_sprite(action=\"get_info\")` returns a PNG or JPEG sheet as an image to count the grid from, then `full_setup` slices it and builds clips and a controller; clip names decide the states (idle, walk/run, attack-type triggers). Off by default over HTTP: `manage_tools(action=\"activate\", group=\"animation\")`. |\n| **Graphics** | `manage_graphics` | Rendering and post-processing management. 33 actions across 5 groups: **Volume** (create/configure volumes and effects, URP/HDRP), **Bake** (lightmaps, light probes, reflection probes, Edit mode only), **Stats** (draw calls, batches, memory), **Pipeline** (quality levels, pipeline settings), **Features** (URP renderer features: add, remove, toggle, reorder). Resources: `mcpforunity://scene/volumes`, `mcpforunity://rendering/stats`, `mcpforunity://pipeline/renderer-features`. Use `ping` to check pipeline status. See [tools-reference.md](references/tools-reference.md#graphics-tools). |\n| **Packages** | `manage_packages` | Install, remove, search, and manage Unity packages and scoped registries. Query actions: list installed, search registry, get info, ping, poll status. Mutating actions: add/remove packages, embed for editing, add/remove scoped registries, force resolve. Validates identifiers, warns on git URLs, checks dependents before removal (`force=true` to override). See [tools-reference.md](references/tools-reference.md#package-tools). |\n| **Physics** | `manage_physics` | Manage 3D and 2D physics (21 actions). Settings, collision matrix, materials, joints (14 types). Queries: `raycast`, `raycast_all`, `linecast`, `shapecast` (sphere/box/capsule sweep), `overlap`. Forces: `apply_force` (AddForce/AddTorque/AddExplosionForce with ForceMode). Rigidbody: `get_rigidbody`, `configure_rigidbody` (mass, drag, gravity, constraints, collision detection). Validation: scene-wide checks. Simulation: `simulate_step` in edit mode. See [tools-reference.md](references/tools-reference.md#physics-tools). |\n| **ProBuilder** | `manage_probuilder` | 3D modeling, mesh editing, complex geometry. **When `com.unity.probuilder` is installed, prefer ProBuilder shapes over primitive GameObjects** for editable geometry, multi-material faces, or complex shapes. Supports 12 shape types, face/edge/vertex editing, smoothing, and per-face materials. See [ProBuilder Guide](references/probuilder-guide.md). |\n| **UI** | `manage_ui`, `batch_execute` with `manage_gameobject` + `manage_components` | **UI Toolkit**: Use `manage_ui` to create UXML/USS files, attach UIDocument, inspect visual trees. **uGUI (Canvas)**: Use `batch_execute` for Canvas, Panel, Button, Text, Slider, Toggle, Input Field. **Read `mcpforunity://project/info` first** to detect uGUI/TMP/Input System/UI Toolkit availability. (see [UI workflows](references/workflows.md#ui-creation-workflows)) |\n| **Docs** | `unity_reflect`, `unity_docs` | API verification and documentation lookup. **`unity_reflect`** inspects live C# APIs via reflection (requires Unity connection): `search` types across assemblies, `get_type` for member summary, `get_member` for full signatures. **`unity_docs`** fetches official docs from docs.unity3d.com (no Unity connection needed): `get_doc` (ScriptReference), `get_manual` (Manual pages), `get_package_doc` (package docs), `lookup` (parallel search all sources + project assets). **Trust hierarchy: reflection > project assets > docs.** Workflow: `unity_reflect` search -> get_type -> get_member -> `unity_docs` lookup. See [tools-reference.md](references/tools-reference.md#docs-tools). |\n| **More** | `manage_material`, `manage_texture`, `manage_shader`, `manage_vfx`, `manage_profiler`, `execute_code`, `manage_scriptable_object`, `generate_image`, `generate_model`, `generate_audio`, `import_model`, `import_model_file`, `blender_bridge` | Materials; textures, shaders and VFX (`vfx` group); profiling (`profiling`); in-editor C# and ScriptableObjects (`scripting_ext`); AI asset generation, Sketchfab and on-disk model import, Blender (`asset_gen`). Every tool has a section in [tools-reference.md](references/tools-reference.md). |\n\n## Common Workflows\n\n### Creating a New Script and Using It\n\n```python\n# 1. Create the script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/PlayerController.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class PlayerController : MonoBehaviour\\n{\\n    void Update() { }\\n}\"\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for compilation errors\nread_console(types=[\"error\"], count=10)\n\n# 4. Only then attach to GameObject\nmanage_gameobject(action=\"modify\", target=\"Player\", components_to_add=[\"PlayerController\"])\n```\n\n### Finding and Modifying GameObjects\n\n```python\n# 1. Find by name/tag/component (returns IDs only)\nresult = find_gameobjects(search_term=\"Enemy\", search_method=\"by_tag\", page_size=50)\n\n# 2. Get full data via resource\n# mcpforunity://scene/gameobject/{instance_id}\n\n# 3. Modify using the ID\nmanage_gameobject(action=\"modify\", target=instance_id, position=[10, 0, 0])\n```\n\n### Running and Monitoring Tests\n\n```python\n# 1. Start test run (async)\nresult = run_tests(mode=\"EditMode\", test_names=[\"MyTests.TestSomething\"])\njob_id = result[\"job_id\"]\n\n# 2. Poll for completion\nresult = get_test_job(job_id=job_id, wait_timeout=60, include_failed_tests=True)\n```\n\n## Pagination Pattern\n\nLarge queries return paginated results. Always follow `next_cursor`:\n\n```python\ncursor = 0\nall_items = []\nwhile True:\n    result = manage_scene(action=\"get_hierarchy\", page_size=50, cursor=cursor)\n    all_items.extend(result[\"data\"][\"items\"])\n    if not result[\"data\"].get(\"next_cursor\"):\n        break\n    cursor = result[\"data\"][\"next_cursor\"]\n```\n\n## Multi-Instance Workflow\n\nWhen multiple Unity Editors are running:\n\n```python\n# 1. List instances via resource: mcpforunity://instances\n# 2. Set active instance\nset_active_instance(instance=\"MyProject@abc123\")\n# 3. All subsequent calls route to that instance\n```\n\n## Error Recovery\n\n| Symptom | Cause | Solution |\n|---------|-------|----------|\n| Tools return \"busy\" | Compilation in progress | Wait, check `mcpforunity://editor/state` |\n| \"stale_file\" error | File changed since SHA | Re-fetch SHA with `get_sha`, retry |\n| Connection lost | Domain reload | Wait ~5s, reconnect |\n| Commands fail silently | Wrong instance | Check `set_active_instance` |\n\n## Reference Files\n\nFor detailed schemas and examples:\n\n- **[tools-reference.md](references/tools-reference.md)**: Every tool's main actions, parameters, and examples, with links to the full parameter tables\n- **[resources-reference.md](references/resources-reference.md)**: All available resources and their data\n- **[workflows.md](references/workflows.md)**: Extended workflow examples and patterns\n- **[probuilder-guide.md](references/probuilder-guide.md)**: ProBuilder modeling patterns\n",".claude/skills/blender-to-unity/SKILL.md":"---\nname: blender-to-unity\ndescription: Hand off a model from Blender (via BlenderMCP) into Unity (via MCP for Unity) — export the current Blender model, import it through import_model_file, and place it in the open scene. Use when the user has BlenderMCP and MCP for Unity both connected and wants to bring a Blender model into Unity. Does NOT drive Blender's own generators; BlenderMCP owns how the model got into Blender.\n---\n\n# Blender → Unity Model Handoff\n\nBring whatever model is currently in Blender into the open Unity scene. The seam is the\nlocal filesystem: Blender exports a file, Unity imports it. The two servers never talk\ndirectly.\n\n## Preconditions\n- Both `mcp__blender__*` tools and MCP for Unity tools are connected.\n- A model exists in the Blender scene (confirm with `mcp__blender__get_scene_info` /\n  `mcp__blender__get_object_info`). If empty, stop and tell the user — this skill does not generate models.\n- **`import_model_file` is in the `asset_gen` tool group, which is off by default** (only `core`\n  loads). Enable it first with `manage_tools` (enable the `asset_gen` group), **or** call the C#\n  handler straight through `batch_execute` —\n  `{\"tool\":\"import_model_file\",\"params\":{\"sourcePath\":...,\"name\":...,\"outputFolder\":...}}` (camelCase)\n  — which dispatches by name regardless of group gating.\n\n## Steps\n1. **Resolve the Unity project path.** Read `mcpforunity://editor/state` for the project\n   root (the editor dataPath's parent). Decide the export format:\n   - **GLB (glTFast) when the model has a rig, animation, PBR (metallic/roughness), emission,\n     or transparency** — glTFast carries all of these automatically, no post-processing\n     (see [references/bridge-fidelity.md](references/bridge-fidelity.md)). Multi-material zones\n     survive either format, so they alone don't force GLB.\n   - **FBX otherwise** — when glTFast isn't installed, the model is plain geometry, or you\n     specifically need the built-in importer's humanoid-avatar pipeline. FBX drops emission/metallic\n     (Step 5 restores emission) and surfaces animation only with `animation_type` set (Step 3).\n2. **Export from Blender to a temp path** via `mcp__blender__execute_blender_code`:\n   ```python\n   import bpy, os, tempfile\n   out = os.path.join(tempfile.gettempdir(), \"blender_to_unity.fbx\")\n   # Export the selection if any, else the whole scene:\n   bpy.ops.export_scene.fbx(filepath=out, use_selection=bool(bpy.context.selected_objects),\n                            apply_unit_scale=True, bake_space_transform=True)\n   print(out)\n   ```\n   (glTF branch: `out_glb = os.path.join(tempfile.gettempdir(), \"blender_to_unity.glb\")`, then\n   `bpy.ops.export_scene.gltf(filepath=out_glb, export_format='GLB', use_active_scene=True)`\n   — its default `use_active_scene=False` can silently export a *different* open scene.)\n3. **Import into Unity** with `import_model_file`:\n   `import_model_file(source_path=<temp path>, name=<asset name>, target_size=<final size in meters>)`.\n   For a **rigged/animated FBX**, also pass `animation_type=\"generic\"` (or `\"humanoid\"`; `\"legacy\"`\n   targets the old Animation-component system) — the importer defaults to `\"none\"`, which\n   deliberately imports the mesh with **zero animation clips**. GLB ignores this (glTFast imports\n   animation itself), so it's an FBX-only knob.\n   It returns `{ asset_path, asset_guid }`. Pass `target_size` as the intended final size, but treat\n   it only as a hint: it rescales at import solely when the project's **Auto-normalize** pref is on,\n   and even then is unreliable for Blender FBX (see the **Scale** note). Step 4 does the reliable\n   normalization.\n4. **Place it in the scene, normalized to size.** Ensure the scene has a camera + directional\n   light (`manage_scene` / `manage_gameobject`). Instantiate the model at the chosen position via\n   `manage_gameobject(action=\"create\", prefab_path=<asset_path>, name=<asset name>, position=[x,y,z])`.\n   Then normalize its size deterministically — Blender FBX commonly imports ~100× too large — by\n   measuring the placed model's world bounds and scaling so its largest dimension equals your target\n   size. Run via `execute_code` (substitute your object name and target meters):\n   ```csharp\n   var go = GameObject.Find(\"<asset name>\");\n   var rs = go.GetComponentsInChildren<Renderer>();\n   var b = rs[0].bounds; for (int i = 1; i < rs.Length; i++) b.Encapsulate(rs[i].bounds);\n   float maxDim = Mathf.Max(b.size.x, Mathf.Max(b.size.y, b.size.z));\n   float target = 2f; // intended size in meters\n   if (maxDim > 0.0001f) go.transform.localScale *= target / maxDim;\n   ```\n5. **Restore emission FBX dropped (FBX path).** Blender scenes commonly store their color/glow\n   in *material emission* (and other Principled-node inputs). FBX carries base/diffuse color but\n   **not emission**, so neon / \"Tron\" scenes import as dark bodies with black accents. If the\n   import looks flat vs. Blender, restore it:\n   a. Dump the emissive materials from Blender via `execute_blender_code`:\n      ```python\n      import bpy, json\n      out = {}\n      for m in bpy.data.materials:\n          if not (m.use_nodes and m.node_tree): continue\n          col, s = (0, 0, 0), 0.0\n          p = next((n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None)\n          es = next((k for k in ('Emission Color', 'Emission') if p and k in p.inputs), None)  # 4.x / 3.x name\n          if es:\n              col = tuple(p.inputs[es].default_value)[:3]\n              s = float(p.inputs['Emission Strength'].default_value)\n          e = next((n for n in m.node_tree.nodes if n.type == 'EMISSION'), None)\n          if e and s == 0:\n              col = tuple(e.inputs['Color'].default_value)[:3]; s = float(e.inputs['Strength'].default_value)\n          if s > 0 and sum(col) > 0.01:\n              out[m.name] = [round(col[0], 3), round(col[1], 3), round(col[2], 3), round(s, 3)]\n      print(json.dumps(out))\n      ```\n   b. In Unity (`execute_code`): extract the FBX's materials so they're editable\n      (`AssetDatabase.ExtractAsset` per `Material`, then `ImportAsset(fbx, ForceUpdate)`), then for\n      each dumped name set `_EmissionColor = color * Mathf.Clamp(strength*0.45f, 1.5f, 5f)`,\n      `EnableKeyword(\"_EMISSION\")`, and `globalIlluminationFlags = RealtimeEmissive`. Match names\n      **case-insensitively** — FBX mangles case and can split one material into variants\n      (`EdgeCyan` → `EdgeCyan` + `EDGE_CYAN`); set every match. Add a global Bloom volume and enable\n      the camera's `renderPostProcessing` so the emission actually glows.\n6. **Verify** with `manage_camera(action=\"screenshot\", include_image=true)` and report the\n   asset path + a screenshot.\n\n## Notes\n- **Scale.** Models from Blender almost always arrive at the wrong scale — its FBX unit handling\n  makes them land ~100× too large in Unity. `import_model_file`'s `target_size` only rescales at\n  import when the project's Auto-normalize pref is enabled, and its importer-level normalization is\n  unreliable for Blender FBX (it can over- or under-shoot, e.g. a `target_size=2` model measured 200 m).\n  The robust fix is the Step 4 measure-bounds-then-set-`localScale` routine, which hits the target\n  size deterministically regardless of the import scale or the Auto-normalize pref.\n- **Materials & emission.** FBX carries base/diffuse color and transforms fine, but **drops\n  emission and any node-based color** — so Blender neon / \"Tron\" scenes (color stored in\n  emission) import as dark bodies with black accents. Two fixes: **(a) prefer glTF/GLB when glTFast\n  is installed** — glTF's PBR model carries `emissiveFactor` + `KHR_materials_emissive_strength`\n  natively, so emission survives with no post-step (`bpy.ops.export_scene.gltf(filepath=out, export_format='GLB', use_active_scene=True)`);\n  **(b) with FBX, run Step 5** to dump Blender's emission and reapply it. Also check the mesh for a\n  `color_attributes` (vertex color) layer — the *data* survives FBX, but URP Lit won't *display* it;\n  that needs a vertex-color-reading shader, not `_EmissionColor`.\n- FBX is the default because glTFast is optional in MCP for Unity. If the import errors with\n  \"GLB import requires glTFast\", re-export as FBX (or install glTFast from the Dependencies tab).\n- **Format fidelity.** [references/bridge-fidelity.md](references/bridge-fidelity.md) is a tested\n  matrix of what each format carries. Summary: **GLB (glTFast)** keeps textures, metallic/roughness,\n  emission, transparency, and animation automatically; **FBX** drops metallic + emission, needs\n  `ModelImporter.animationType = Generic` to surface transform animation, and needs material/texture\n  extraction to assign an embedded texture. Both bake modifiers and carry geometry + vertex-color\n  *data* (URP Lit won't *display* vertex colors). Neither carries procedural/node materials — bake\n  them to image textures in Blender first.\n- **Animation doesn't auto-play.** An imported clip won't move the model until an `AnimatorController`\n  drives it — the placed model has an `Animator` with a **null controller**, so it looks frozen. Build\n  one with `manage_animation` (`controller_create` → add the clip as a looping state → `controller_assign`\n  onto the instance) rather than hand-rolling `execute_code`. See bridge-fidelity gotcha #7.\n- **Multi-material zones survive.** A mesh split into material slots in Blender (e.g. skin/shirt/pants\n  regions) imports as submeshes with one material each — base colors carry over GLB natively — so you\n  can \"dress\" a model with material zones and it arrives intact.\n- Keep one model per handoff; for batches, repeat the loop with distinct names.\n- This skill never sends API keys or file bytes over the MCP bridge — Unity reads the file from disk.\n- `import_model_file` copies only the single source file; for multi-file exports (a text `.gltf` with an external `.bin`, or an `.obj` with a sibling `.mtl`/textures), zip them first and pass the `.zip` — a bare `.gltf`/`.obj` will lose its sidecars.\n","tools/UPDATE_DOCS_PROMPT.md":"# LLM Prompt for Updating Documentation\n\nCopy and paste this prompt into your LLM after you add, remove, rename or change an MCP tool or resource. Review its changes, then make sure the checks in step 5 pass.\n\n---\n\n## Prompt\n\nI've just changed MCP tools or resources in this MCP for Unity repository. Please update the documentation to match.\n\n1. **Read the current tools and resources**:\n   - `Server/src/services/tools/`: tools (`@mcp_for_unity_tool`, including its `group`)\n   - `Server/src/services/resources/`: resources (`@mcp_for_unity_resource`)\n   - `Server/src/cli/commands/`: the Click CLI commands that mirror the tools\n\n2. **Regenerate the reference pages.** `website/docs/reference/tools/**` and `website/docs/reference/resources/index.md` are generated from the registry:\n   ```bash\n   cd Server && uv run python ../tools/generate_docs_reference.py\n   ```\n   Do not hand-edit them, except for usage examples between `<!-- examples:start -->` and `<!-- examples:end -->`, which the generator keeps.\n\n3. **Update the hand-maintained files**:\n   - **manifest.json**: the `tools` array must list exactly the registered tools as `{\"name\", \"description\"}` entries; put new ones in alphabetical position. Resources are not listed. `Server/tests/test_manifest_tools.py` fails when a tool is missing, extra or listed twice, but it compares names only: when a tool's purpose changes, check its one-line description by hand.\n   - **Tool groups**: if a tool adds a group or changes what a group covers, update the group's blurb in `TOOL_GROUPS` (`Server/src/services/registry/tool_registry.py`; it feeds the generated group pages, the `tool_groups` resource and `manage_tools`) and the group lists in `website/docs/guides/tool-groups.md` and `website/docs/contributing/dev-setup.md`.\n   - **Tool count**: `README.md`, `docs/i18n/README-zh.md` and `website/docs/guides/tool-groups.md` state how many tools ship. Update the number if it changed.\n   - **CLI docs**: the group table in `website/docs/reference/cli.md` and the \"Complete Command Reference\" table in `website/docs/guides/cli.md` must match the Click command tree (`cd Server && uv run unity-mcp --help`, then `--help` on each group).\n   - **Skill**: if agents need new guidance for the change, update the skill. It has two copies, `unity-mcp-skill/` and `.claude/skills/unity-mcp-skill/`; keep both copies identical.\n\n4. **Leave the release notes alone.** `README.md` has no tool or resource lists; it links to the website catalog. Its \"Recent Updates\" block (the latest 5 releases) and `website/docs/releases.md` are generated from GitHub Releases, whose notes GitHub builds from merged PR titles. After each release, `release.yml` dispatches `.github/workflows/sync-releases.yml`, which runs `tools/sync_release_notes.py` and merges the result into `beta` through its own PR. The \"最近更新\" block in `docs/i18n/README-zh.md` is not synced; it is updated by hand at release time.\n\n5. **After updating**, run these checks:\n   ```bash\n   cd Server\n   uv run python ../tools/generate_docs_reference.py --check\n   uv run pytest tests/test_manifest_tools.py\n   ```\n\nPlease show me the exact changes you're making to each file, and explain any discrepancies you find.\n\n---\n","tools/unity-versions.json":"{\n  \"$comment\": \"Single source of truth for Unity versions exercised by CI and tools/check-unity-versions.* local script. Versions are pinned to specific patch releases (no floating tags) per acceptance criteria in CoplayDev/unity-mcp#1107. Every id MUST have a corresponding GameCI Docker image at unityci/editor:ubuntu-<id>-base-3 since both CI (game-ci/unity-test-runner@v4) and local --docker mode pull from there. Verify availability before bumping: https://hub.docker.com/v2/repositories/unityci/editor/tags/?name=<id>\",\n  \"$coverageGap\": \"UNITY_6000_5_OR_NEWER and UNITY_6000_6_OR_NEWER branches are NOT exercised by this matrix because GameCI has not yet published Docker images for Unity 6000.5+/6000.6+. Bump the 'rolling' row to a 6000.5+/6000.6+ patch once https://hub.docker.com/r/unityci/editor publishes one. Tracked branches in code: UnityObjectIdCompat.cs (EntityId path).\",\n  \"defaultVersion\": \"6000.0.75f1\",\n  \"$defaultVersionComment\": \"Unity version used when CI runs the narrow matrix (default PR feedback path). Must be one of the ids in 'versions' below. Today's pick is 6.0 LTS — the version most users target. The 'floor' role still identifies the package's minimum supported version separately.\",\n  \"versions\": [\n    {\n      \"id\": \"2021.3.45f2\",\n      \"role\": \"floor\",\n      \"notes\": \"Package minimum (matches MCPForUnity/package.json 'unity' field and TestProjects/UnityMCPTests/ProjectSettings/ProjectVersion.txt). Legacy branch: all UNITY_2022_*/UNITY_6000_* flags OFF.\"\n    },\n    {\n      \"id\": \"2022.3.62f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Last 2022 LTS. Exercises UNITY_2022_1/2/3_OR_NEWER branches; UNITY_2023_*/UNITY_6000_* OFF. Catches FindObjectsByType-style regressions (the #1105 path).\"\n    },\n    {\n      \"id\": \"6000.0.75f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Unity 6.0 LTS (latest patch on GameCI). UNITY_6000_0_OR_NEWER ON (27 files), UNITY_2023_*_OR_NEWER ON, UNITY_6000_3/4/5/6 OFF.\"\n    },\n    {\n      \"id\": \"6000.4.8f1\",\n      \"role\": \"rolling\",\n      \"notes\": \"Latest 6.x available on GameCI. UNITY_6000_0/1/2/3/4_OR_NEWER ON; UNITY_6000_5/6 OFF (no GameCI image yet — see $coverageGap).\"\n    }\n  ]\n}\n","unity-mcp-skill/references/tools-reference.md":"# Unity-MCP Tools Reference\n\nEvery built-in MCP tool, with its main actions, parameters, and usage examples. For a tool's full parameter table, open its generated page: `https://coplaydev.github.io/unity-mcp/reference/tools/<group>/<tool>` (tools with no group, such as `manage_tools`, are under `core`).\n\nEach section names the tool's group when it is not `core`. A tool outside `core` can be hidden (over HTTP, only `core` starts enabled); enable its group with `manage_tools(action=\"activate\", group=\"<group>\")`.\n\n> **Template warning:** Examples in this file are skill templates and may be inaccurate for some Unity versions, packages, or project setups. Validate parameters and payload shapes against your active tool schema and runtime behavior.\n\n## Table of Contents\n\n- [Infrastructure Tools](#infrastructure-tools)\n- [Scene Tools](#scene-tools)\n- [GameObject Tools](#gameobject-tools)\n- [Script Tools](#script-tools)\n- [Asset Tools](#asset-tools)\n- [Material & Shader Tools](#material--shader-tools)\n- [UI Tools](#ui-tools)\n- [Editor Control Tools](#editor-control-tools)\n- [Build Tools](#build-tools)\n- [Testing Tools](#testing-tools)\n- [Search Tools](#search-tools)\n- [Custom Tools](#custom-tools)\n- [Camera Tools](#camera-tools)\n- [Graphics Tools](#graphics-tools)\n- [Package Tools](#package-tools)\n- [Physics Tools](#physics-tools)\n- [ProBuilder Tools](#probuilder-tools)\n- [Profiler Tools](#profiler-tools)\n- [Docs Tools](#docs-tools)\n- [Animation Tools](#animation-tools)\n- [VFX Tools](#vfx-tools)\n- [Scripting Extension Tools](#scripting-extension-tools)\n- [Asset Generation Tools](#asset-generation-tools)\n\n---\n\n## Project Info Resource\n\nRead `mcpforunity://project/info` to detect project capabilities before making assumptions about UI, input, or rendering setup.\n\n**Returned fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `projectRoot` | string | Absolute path to project root |\n| `projectName` | string | Project folder name |\n| `unityVersion` | string | e.g. `\"2022.3.20f1\"` |\n| `platform` | string | Active build target e.g. `\"StandaloneWindows64\"` |\n| `assetsPath` | string | Absolute path to Assets folder |\n| `renderPipeline` | string | `\"BuiltIn\"`, `\"Universal\"`, `\"HighDefinition\"`, or `\"Custom\"` |\n| `activeInputHandler` | string | `\"Old\"`, `\"New\"`, or `\"Both\"` |\n| `packages.ugui` | bool | `com.unity.ugui` installed (Canvas, Image, Button, etc.) |\n| `packages.textmeshpro` | bool | `com.unity.textmeshpro` installed (TMP_Text, TMP_InputField) |\n| `packages.inputsystem` | bool | `com.unity.inputsystem` installed (InputAction, PlayerInput) |\n| `packages.uiToolkit` | bool | Always `true` for Unity 2021.3+ (UIDocument, VisualElement, UXML/USS) |\n| `packages.screenCapture` | bool | `com.unity.modules.screencapture` enabled (ScreenCapture API for screenshots) |\n\n**Key decision points:**\n\n- **UI system**: If `packages.uiToolkit` is true (always for Unity 2021+), use `manage_ui` for UI Toolkit workflows (UXML/USS). If `packages.ugui` is true, use Canvas + uGUI components via `batch_execute`. UI Toolkit is preferred for new UI — it uses a frontend-like workflow (UXML for structure, USS for styling).\n- **Text**: If `packages.textmeshpro` is true, use `TextMeshProUGUI` instead of legacy `Text`.\n- **Input**: Use `activeInputHandler` to decide EventSystem module — `StandaloneInputModule` (Old) vs `InputSystemUIInputModule` (New). See [workflows.md — Input System](workflows.md#input-system-old-vs-new).\n- **Shaders**: Use `renderPipeline` to pick correct shader names — `Standard` (BuiltIn) vs `Universal Render Pipeline/Lit` (URP) vs `HDRP/Lit` (HDRP).\n\n---\n\n## Infrastructure Tools\n\n### batch_execute\n\nExecute multiple MCP commands in a single batch (10-100x faster).\n\n```python\nbatch_execute(\n    commands=[                    # list[dict], required, max 25\n        {\"tool\": \"tool_name\", \"params\": {...}},\n        ...\n    ],\n    parallel=False,              # bool, optional - advisory only (Unity may still run sequentially)\n    fail_fast=False,             # bool, optional - stop on first failure\n    max_parallelism=None         # int, optional - max parallel workers\n)\n```\n\n`batch_execute` is not transactional: earlier commands are not rolled back if a later command fails.\n\n### set_active_instance\n\nRoute commands to a specific Unity instance (multi-instance workflows).\n\n```python\nset_active_instance(\n    instance=\"ProjectName@abc123\"  # str, required - Name@hash or hash prefix\n)\n```\n\n### refresh_unity\n\nRefresh asset database and trigger script compilation.\n\n```python\nrefresh_unity(\n    mode=\"if_dirty\",             # \"if_dirty\" | \"force\"\n    scope=\"all\",                 # \"assets\" | \"scripts\" | \"all\"\n    compile=\"none\",              # \"none\" | \"request\"\n    wait_for_ready=True          # bool - wait until editor ready\n)\n```\n\n### manage_tools\n\nShow, enable, or hide tool groups for the current session. Always visible (no group).\n\n```python\nmanage_tools(action=\"list_groups\")                  # every group, whether it is on, and its tools\nmanage_tools(action=\"activate\", group=\"animation\")  # \"deactivate\" hides a group again\nmanage_tools(action=\"sync\")                         # re-read the tool toggles in the Unity editor\nmanage_tools(action=\"reset\")                        # back to the defaults\n```\n\nGroups: `core`, `animation`, `asset_gen`, `docs`, `probuilder`, `profiling`, `scripting_ext`, `testing`, `ui`, `vfx`. The `mcpforunity://tool-groups` resource lists the same catalog read-only. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_tools)\n\n### debug_request_context\n\nDiagnostics: returns the request's `client_id`, `session_id` and meta, the session's active Unity instance, and the server version. No parameters; always visible (no group).\n\n```python\ndebug_request_context()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/debug_request_context)\n\n---\n\n## Scene Tools\n\n### manage_scene\n\nScene CRUD operations, hierarchy queries, multi-scene editing, validation, and scene view control. Screenshots are `manage_camera` actions (see [Camera Tools](#camera-tools)); build-settings scenes are `manage_build(action=\"scenes\")`.\n\n```python\n# Get hierarchy (paginated)\nmanage_scene(\n    action=\"get_hierarchy\",\n    page_size=50,                # int, default 50, max 500\n    cursor=0,                    # int, pagination cursor\n    parent=None,                 # str|int, optional - filter by parent\n    include_transform=False      # bool - include local transforms\n)\n\n# Frame scene view on target\nmanage_scene(\n    action=\"scene_view_frame\",\n    scene_view_target=\"Player\"   # str|int - GO name, path, or instance ID to frame\n)\n\n# Other actions\nmanage_scene(action=\"get_active\")        # Current scene info\nmanage_scene(action=\"get_build_settings\") # Build settings\nmanage_scene(action=\"create\", name=\"NewScene\", path=\"Assets/Scenes/\")\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Main.unity\")\nmanage_scene(action=\"save\")\n\n# Scene templates: \"empty\" (no objects), \"default\", \"3d_basic\", \"2d_basic\"\nmanage_scene(action=\"create\", name=\"Level1\", path=\"Assets/Scenes/\", template=\"3d_basic\")\n\n# Multi-scene editing\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Level2.unity\", additive=True)  # keep current scene\nmanage_scene(action=\"get_loaded_scenes\")\nmanage_scene(action=\"set_active_scene\", scene_name=\"Level2\")\nmanage_scene(action=\"move_to_scene\", target=\"Player\", scene_name=\"Level2\")     # moves a root GameObject\nmanage_scene(action=\"close_scene\", scene_name=\"Level2\", remove_scene=True)     # remove_scene=False only unloads\n\n# Validation: missing scripts, broken prefabs\nmanage_scene(action=\"validate\")\nmanage_scene(action=\"validate\", auto_repair=True)  # also removes missing scripts (undoable)\n```\n\n### find_gameobjects\n\nSearch for GameObjects (returns instance IDs only).\n\n```python\nfind_gameobjects(\n    search_term=\"Player\",        # str, required\n    search_method=\"by_name\",     # \"by_name\"|\"by_tag\"|\"by_layer\"|\"by_component\"|\"by_path\"|\"by_id\"\n    include_inactive=False,      # bool|str\n    page_size=50,                # int, default 50, max 500\n    cursor=0                     # int, pagination cursor\n)\n# Returns: {\"ids\": [12345, 67890], \"next_cursor\": 50, ...}\n```\n\n---\n\n## GameObject Tools\n\n### manage_gameobject\n\nCreate, modify, delete, duplicate GameObjects.\n\n```python\n# Create\nmanage_gameobject(\n    action=\"create\",\n    name=\"MyCube\",               # str, required\n    primitive_type=\"Cube\",       # \"Cube\"|\"Sphere\"|\"Capsule\"|\"Cylinder\"|\"Plane\"|\"Quad\"\n    position=[0, 1, 0],          # list[float] or JSON string \"[0,1,0]\"\n    rotation=[0, 45, 0],         # euler angles\n    scale=[1, 1, 1],\n    components_to_add=[\"Rigidbody\", \"BoxCollider\"],\n    save_as_prefab=False,\n    prefab_path=\"Assets/Prefabs/MyCube.prefab\"\n)\n\n# Prefab instantiation — place a prefab instance in the scene\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"                # optional parent GameObject\n)\n# Smart lookup — just the prefab name works too:\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Modify\nmanage_gameobject(\n    action=\"modify\",\n    target=\"Player\",             # name, path, or instance ID\n    search_method=\"by_name\",     # how to find target\n    position=[10, 0, 0],\n    rotation=[0, 90, 0],\n    scale=[2, 2, 2],\n    set_active=True,\n    layer=\"Player\",\n    components_to_add=[\"AudioSource\"],\n    components_to_remove=[\"OldComponent\"],\n    component_properties={       # nested dict for property setting\n        \"Rigidbody\": {\n            \"mass\": 10.0,\n            \"useGravity\": True\n        }\n    }\n)\n\n# Delete\nmanage_gameobject(action=\"delete\", target=\"OldObject\")\n\n# Duplicate\nmanage_gameobject(\n    action=\"duplicate\",\n    target=\"Player\",\n    new_name=\"Player2\",\n    offset=[5, 0, 0]             # position offset from original\n)\n\n# Move relative\nmanage_gameobject(\n    action=\"move_relative\",\n    target=\"Player\",\n    reference_object=\"Enemy\",    # optional reference\n    direction=\"left\",            # \"left\"|\"right\"|\"up\"|\"down\"|\"forward\"|\"back\"\n    distance=5.0,\n    world_space=True\n)\n\n# Look at target (rotates GO to face a point or another GO)\nmanage_gameobject(\n    action=\"look_at\",\n    target=\"MainCamera\",         # the GO to rotate\n    look_at_target=\"Player\",     # str (GO name/path) or list[float] world position\n    look_at_up=[0, 1, 0]        # optional up vector, default [0,1,0]\n)\n```\n\n### manage_components\n\nAdd, remove, or set properties on components.\n\n```python\n# Add component\nmanage_components(\n    action=\"add\",\n    target=12345,                # instance ID (preferred) or name\n    component_type=\"Rigidbody\",\n    search_method=\"by_id\"\n)\n\n# Remove component\nmanage_components(\n    action=\"remove\",\n    target=\"Player\",\n    component_type=\"OldScript\"\n)\n\n# Set single property\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Rigidbody\",\n    property=\"mass\",\n    value=5.0\n)\n\n# Set multiple properties\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Transform\",\n    properties={\n        \"position\": [1, 2, 3],\n        \"localScale\": [2, 2, 2]\n    }\n)\n\n# Set object reference property (reference another GameObject by name)\nmanage_components(\n    action=\"set_property\",\n    target=\"GameManager\",\n    component_type=\"GameManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Bee_1\"}]\n)\n\n# Object reference formats supported:\n# - {\"name\": \"ObjectName\"}     → Find GameObject in scene by name\n# - {\"instanceID\": 12345}      → Direct instance ID reference\n# - {\"guid\": \"abc123...\"}      → Asset GUID reference\n# - {\"path\": \"Assets/...\"}     → Asset path reference\n# - \"Assets/Prefabs/My.prefab\" → String shorthand for asset paths\n# - \"ObjectName\"               → String shorthand for scene name lookup\n# - 12345                      → Integer shorthand for instanceID\n# - {\"guid\": \"...\", \"spriteName\": \"Hero_0\"} or {\"guid\": \"...\", \"fileID\": 12345}\n#                              → Sprite sub-asset of a sliced sheet (single-sprite textures resolve from guid/path alone)\n```\n\n---\n\n## Script Tools\n\n### create_script\n\nCreate a new C# script.\n\n```python\ncreate_script(\n    path=\"Assets/Scripts/MyScript.cs\",  # str, required\n    contents='''using UnityEngine;\n\npublic class MyScript : MonoBehaviour\n{\n    void Start() { }\n    void Update() { }\n}''',\n    script_type=\"MonoBehaviour\",  # optional hint\n    namespace=\"MyGame\"            # optional namespace\n)\n```\n\n### script_apply_edits\n\nApply structured edits to C# scripts (safer than raw text edits).\n\n```python\nscript_apply_edits(\n    name=\"MyScript\",             # script name (no .cs)\n    path=\"Assets/Scripts\",       # folder path\n    edits=[\n        # Replace entire method\n        {\n            \"op\": \"replace_method\",\n            \"methodName\": \"Update\",\n            \"replacement\": \"void Update() { transform.Rotate(Vector3.up); }\"\n        },\n        # Insert new method\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": \"void OnEnable() { Debug.Log(\\\"Enabled\\\"); }\"\n        },\n        # Delete method\n        {\n            \"op\": \"delete_method\",\n            \"methodName\": \"OldMethod\"\n        },\n        # Anchor-based insert\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"void Start()\",\n            \"position\": \"before\",  # \"before\" | \"after\"\n            \"text\": \"// Called before Start\\n\"\n        },\n        # Regex replace\n        {\n            \"op\": \"regex_replace\",\n            \"pattern\": \"Debug\\\\.Log\\\\(\",\n            \"text\": \"Debug.LogWarning(\"\n        },\n        # Prepend/append to file\n        {\"op\": \"prepend\", \"text\": \"// File header\\n\"},\n        {\"op\": \"append\", \"text\": \"\\n// File footer\"}\n    ]\n)\n```\n\n### apply_text_edits\n\nApply precise character-position edits (1-indexed lines/columns).\n\n```python\napply_text_edits(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    edits=[\n        {\n            \"startLine\": 10,\n            \"startCol\": 5,\n            \"endLine\": 10,\n            \"endCol\": 20,\n            \"newText\": \"replacement text\"\n        }\n    ],\n    precondition_sha256=\"abc123...\",  # optional, prevents stale edits\n    strict=True                        # optional, stricter validation\n)\n```\n\n### validate_script\n\nCheck script for syntax/semantic errors.\n\n```python\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    level=\"standard\",            # \"basic\" | \"standard\"\n    include_diagnostics=True     # include full error details\n)\n```\n\n### get_sha\n\nGet file hash without content (for preconditions).\n\n```python\nget_sha(uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\")\n# Returns: {\"sha256\": \"...\", \"lengthBytes\": 1234}\n```\n\n### delete_script\n\nDelete a script file.\n\n```python\ndelete_script(uri=\"mcpforunity://path/Assets/Scripts/OldScript.cs\")\n```\n\n### manage_script\n\nLegacy whole-file router with three actions: `create`, `read`, `delete`. `name` is the class name without `.cs`; `path` is its folder under `Assets/`. There is no update action: edit with `script_apply_edits` or `apply_text_edits`.\n\n```python\nmanage_script(action=\"read\", name=\"PlayerController\", path=\"Assets/Scripts\")  # returns the file contents\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script)\n\n### manage_script_capabilities\n\nLists the edit ops `script_apply_edits` supports (structured and text), the max edit payload size, and the active guards. No parameters; always visible (no group).\n\n```python\nmanage_script_capabilities()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script_capabilities)\n\n---\n\n## Asset Tools\n\n### manage_asset\n\nAsset operations: search, import, create, modify, delete.\n\n```python\n# Search assets (paginated)\nmanage_asset(\n    action=\"search\",\n    path=\"Assets\",               # search scope\n    search_pattern=\"*.prefab\",   # glob or \"t:MonoScript\" filter\n    filter_type=\"Prefab\",        # optional type filter\n    page_size=25,                # keep small to avoid large payloads\n    page_number=1,               # 1-based\n    generate_preview=False       # avoid base64 bloat\n)\n\n# Get asset info\nmanage_asset(action=\"get_info\", path=\"Assets/Prefabs/Player.prefab\")\n\n# Create asset\nmanage_asset(\n    action=\"create\",\n    path=\"Assets/Materials/NewMaterial.mat\",\n    asset_type=\"Material\",\n    properties={\"color\": [1, 0, 0, 1]}\n)\n\n# Duplicate/move/rename\nmanage_asset(action=\"duplicate\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\nmanage_asset(action=\"move\", path=\"Assets/A.prefab\", destination=\"Assets/Prefabs/A.prefab\")\nmanage_asset(action=\"rename\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\n\n# Create folder\nmanage_asset(action=\"create_folder\", path=\"Assets/NewFolder\")\n\n# Delete\nmanage_asset(action=\"delete\", path=\"Assets/OldAsset.asset\")\n```\n\n### manage_prefabs\n\nPrefab assets: headless edits with `modify_contents`, or interactive editing in a prefab stage.\n\n```python\n# Get prefab info\nmanage_prefabs(action=\"get_info\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Get prefab hierarchy\nmanage_prefabs(action=\"get_hierarchy\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Create prefab from scene GameObject\nmanage_prefabs(\n    action=\"create_from_gameobject\",\n    target=\"Player\",             # GameObject in scene\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    allow_overwrite=False\n)\n\n# Modify prefab contents (headless)\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",        # object within prefab\n    position=[0, 1, 0],\n    components_to_add=[\"AudioSource\"]\n)\n\n# Delete child GameObjects from prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    delete_child=[\"OldChild\", \"Turret/Barrel\"]  # single string or list\n)\n\n# Create child GameObject in prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    create_child={\"name\": \"SpawnPoint\", \"primitive_type\": \"Sphere\", \"position\": [0, 2, 0]}\n)\n# A list creates several children in one save; \"source_prefab_path\" instead of\n# \"primitive_type\" nests a prefab instance: {\"name\": \"Gun\", \"source_prefab_path\": \"Assets/Prefabs/Gun.prefab\"}\n\n# Set component properties on prefab contents\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",\n    component_properties={\"Rigidbody\": {\"mass\": 5.0}, \"MyScript\": {\"health\": 100}}\n)\n\n# Interactive: open a prefab stage, edit with manage_gameobject/manage_components, save, close\nmanage_prefabs(action=\"open_prefab_stage\", prefab_path=\"Assets/Prefabs/Enemy.prefab\")\nmanage_prefabs(action=\"save_prefab_stage\")\nmanage_prefabs(action=\"close_prefab_stage\")  # back to the main scene\n```\n\n---\n\n## Material & Shader Tools\n\n### manage_material\n\nCreate and modify materials.\n\n```python\n# Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/Red.mat\",\n    shader=\"Standard\",\n    properties={\"_Color\": [1, 0, 0, 1]}\n)\n\n# Get material info\nmanage_material(action=\"get_material_info\", material_path=\"Assets/Materials/Red.mat\")\n\n# Set shader property\nmanage_material(\n    action=\"set_material_shader_property\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_Metallic\",\n    value=0.8\n)\n\n# Set color\nmanage_material(\n    action=\"set_material_color\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_BaseColor\",\n    color=[0, 1, 0, 1]           # RGBA\n)\n\n# Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"MyCube\",\n    material_path=\"Assets/Materials/Red.mat\",\n    slot=0                       # material slot index\n)\n\n# Set renderer color directly\nmanage_material(\n    action=\"set_renderer_color\",\n    target=\"MyCube\",\n    color=[1, 0, 0, 1],\n    mode=\"create_unique\"          # Creates a unique .mat asset per object (persistent)\n    # Other modes: \"property_block\" (default, not persistent),\n    #              \"shared\" (mutates shared material — avoid for primitives),\n    #              \"instance\" (runtime only, not persistent)\n)\n```\n\n### manage_texture\n\nCreate procedural textures. Group: `vfx`.\n\n```python\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checker.png\",\n    width=64,\n    height=64,\n    fill_color=[255, 255, 255, 255]  # or [1.0, 1.0, 1.0, 1.0]\n)\n\n# Apply pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checker.png\",\n    pattern=\"checkerboard\",      # \"checkerboard\"|\"stripes\"|\"dots\"|\"grid\"|\"brick\"\n    palette=[[0,0,0,255], [255,255,255,255]],\n    pattern_size=8\n)\n\n# Apply gradient\nmanage_texture(\n    action=\"apply_gradient\",\n    path=\"Assets/Textures/Gradient.png\",\n    gradient_type=\"linear\",      # \"linear\"|\"radial\"\n    gradient_angle=45,\n    palette=[[255,0,0,255], [0,0,255,255]]\n)\n```\n\n### manage_shader\n\nCreate, read, update, or delete `.shader` files. Group: `vfx`. `name` is the file name without `.shader`; `path` is its folder under `Assets/`. To use the shader, pass the name declared in its `Shader \"...\"` line to `manage_material`.\n\n```python\nmanage_shader(action=\"create\", name=\"UnlitTint\", path=\"Assets/Shaders\",\n              contents='Shader \"Custom/UnlitTint\" { ... }')\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/vfx/manage_shader)\n\n---\n\n## UI Tools\n\n### manage_ui\n\nManage Unity UI Toolkit elements: UXML documents, USS stylesheets, UIDocument components, and visual tree inspection. Group: `ui`.\n\n```python\n# Create a UXML file\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='<ui:UXML xmlns:ui=\"UnityEngine.UIElements\"><ui:Label text=\"Hello\" /></ui:UXML>'\n)\n\n# Create a USS stylesheet\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 32px; color: white; }\"\n)\n\n# Read a UXML/USS file\nmanage_ui(\n    action=\"read\",\n    path=\"Assets/UI/MainMenu.uxml\"\n)\n# Returns: {\"success\": true, \"data\": {\"contents\": \"...\", \"path\": \"...\"}}\n\n# Update an existing file\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 48px; color: yellow; -unity-font-style: bold; }\"\n)\n\n# Attach UIDocument to a GameObject\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UICanvas\",                    # GameObject name or path\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/Panel.asset\",  # optional, auto-creates if omitted\n    sort_order=0                          # optional, default 0\n)\n\n# Create PanelSettings asset\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/Panel.asset\",\n    scale_mode=\"ScaleWithScreenSize\",     # optional: \"ConstantPixelSize\"|\"ConstantPhysicalSize\"|\"ScaleWithScreenSize\"\n    reference_resolution={\"width\": 1920, \"height\": 1080}  # optional, for ScaleWithScreenSize\n)\n\n# Inspect the visual tree of a UIDocument\nmanage_ui(\n    action=\"get_visual_tree\",\n    target=\"UICanvas\",                    # GameObject with UIDocument\n    max_depth=10                          # optional, default 10\n)\n# Returns: hierarchy of VisualElements with type, name, classes, styles, text, children\n```\n\n**UI Toolkit workflow:**\n\n1. Create UXML (structure, like HTML) and USS (styling, like CSS) files\n2. Create a PanelSettings asset (or let `attach_ui_document` auto-create one)\n3. Create an empty GameObject and attach UIDocument with the UXML source\n4. Use `get_visual_tree` to inspect the result\n\n**Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML files, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n---\n\n## Editor Control Tools\n\n### manage_editor\n\nControl Unity Editor state, undo/redo. Prefab stages are `manage_prefabs` actions.\n\n```python\nmanage_editor(action=\"play\")               # Enter play mode\nmanage_editor(action=\"pause\")              # Pause play mode\nmanage_editor(action=\"stop\")               # Exit play mode\n\nmanage_editor(action=\"set_active_tool\", tool_name=\"Move\")  # Move/Rotate/Scale/etc.\n\nmanage_editor(action=\"add_tag\", tag_name=\"Enemy\")\nmanage_editor(action=\"remove_tag\", tag_name=\"OldTag\")\n\nmanage_editor(action=\"add_layer\", layer_name=\"Projectiles\")\nmanage_editor(action=\"remove_layer\", layer_name=\"OldLayer\")\n\nmanage_editor(action=\"undo\")               # Returns the name of the undone step\nmanage_editor(action=\"redo\")\n\n# Package deployment (no confirmation dialog — designed for LLM-driven iteration)\nmanage_editor(action=\"deploy_package\")     # Copy configured MCPForUnity source into installed package\nmanage_editor(action=\"restore_package\")    # Revert to pre-deployment backup\n```\n\n**Deploy workflow:** Set the source path in MCP for Unity Advanced Settings first. `deploy_package` copies the source into the project's package location, creates a backup, and triggers `AssetDatabase.Refresh`. Follow with `refresh_unity(wait_for_ready=True)` to wait for recompilation.\n\n### execute_menu_item\n\nExecute any Unity menu item.\n\n```python\nexecute_menu_item(menu_path=\"File/Save Project\")\nexecute_menu_item(menu_path=\"GameObject/3D Object/Cube\")\nexecute_menu_item(menu_path=\"Window/General/Console\")\n```\n\n### read_console\n\nRead or clear Unity console messages.\n\n```python\n# Get recent messages\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\", \"log\"],  # or [\"all\"]\n    count=10,                    # max messages (ignored with paging)\n    filter_text=\"NullReference\", # optional text filter\n    page_size=50,\n    cursor=0,\n    format=\"detailed\",           # \"plain\"|\"detailed\"|\"json\"\n    include_stacktrace=True\n)\n\n# Clear console\nread_console(action=\"clear\")\n```\n\n---\n\n## Build Tools\n\n### manage_build\n\nPlayer builds, platform switching, player settings, build-settings scenes, build profiles, and batch builds. Actions: `build`, `status`, `platform`, `settings`, `scenes`, `profiles`, `batch`, `cancel`. `build` and `batch` return a `job_id`; poll it with `status`, stop it with `cancel`. `platform`, `settings` (with `property`) and `scenes` read when the value is omitted and write when it is given. `profiles` and `profile` need Unity 6+.\n\n```python\nmanage_build(action=\"scenes\", scenes='[\"Assets/Scenes/Menu.unity\", \"Assets/Scenes/Level1.unity\"]')  # replaces the list\nmanage_build(action=\"build\", target=\"windows64\", output_path=\"Builds/Win/Game.exe\", development=\"true\")\nmanage_build(action=\"status\", job_id=\"<job_id>\")\n```\n\nTargets: `windows64`, `osx`, `linux64`, `android`, `ios`, `webgl`, `uwp`, `tvos`, `visionos`. Switching `platform` reimports assets. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_build)\n\n---\n\n## Testing Tools\n\nGroup: `testing`.\n\n### run_tests\n\nStart async test execution.\n\n```python\nresult = run_tests(\n    mode=\"EditMode\",             # \"EditMode\"|\"PlayMode\"\n    test_names=[\"MyTests.TestA\", \"MyTests.TestB\"],  # specific tests\n    group_names=[\"Integration*\"],  # regex patterns\n    category_names=[\"Unit\"],     # NUnit categories\n    assembly_names=[\"Tests\"],    # assembly filter\n    include_failed_tests=True,   # include failure details\n    include_details=False        # include all test details\n)\n# Returns: {\"job_id\": \"abc123\", ...}\n```\n\n### get_test_job\n\nPoll test job status.\n\n```python\nresult = get_test_job(\n    job_id=\"abc123\",\n    wait_timeout=60,             # wait up to N seconds\n    include_failed_tests=True,\n    include_details=False\n)\n# Returns: {\"status\": \"complete\"|\"running\"|\"failed\", \"results\": {...}}\n```\n\n---\n\n## Search Tools\n\n### find_in_file\n\nSearch file contents with regex.\n\n```python\nfind_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    pattern=\"public void \\\\w+\",  # regex pattern\n    max_results=200,\n    ignore_case=True\n)\n# Returns: line numbers, content excerpts, match positions\n```\n\n---\n\n## Custom Tools\n\n### execute_custom_tool\n\nExecute project-specific custom tools.\n\n```python\nexecute_custom_tool(\n    tool_name=\"my_custom_tool\",\n    parameters={\"param1\": \"value\", \"param2\": 42}\n)\n```\n\nDiscover available custom tools via `mcpforunity://custom-tools` resource.\n\n---\n\n## Camera Tools\n\n### manage_camera\n\nUnified camera management (Unity Camera + Cinemachine). Works without Cinemachine using basic Camera; unlocks presets, pipelines, and blending when Cinemachine is installed. Use `ping` to check availability.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target camera (name, path, or instance ID) |\n| `search_method` | string | No | `by_id`, `by_name`, `by_path` |\n| `properties` | dict \\| string | No | Action-specific parameters |\n\n**Screenshot parameters** (for `screenshot` and `screenshot_multiview` actions):\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `capture_source` | string | `\"game_view\"` (default) or `\"scene_view\"` (editor viewport) |\n| `view_target` | string\\|int\\|list | Target to focus on (GO name/path/ID or [x,y,z]). game_view: aims camera; scene_view: frames viewport |\n| `camera` | string | Camera to capture from (defaults to Camera.main). game_view only |\n| `include_image` | bool | Return base64 PNG inline (default false) |\n| `max_resolution` | int | Downscale cap in px (default 640) |\n| `batch` | string | `\"surround\"` (6 angles) or `\"orbit\"` (configurable grid). game_view only |\n| `view_position` | list[float] | World position [x,y,z] to place camera. game_view only |\n| `view_rotation` | list[float] | Euler rotation [x,y,z] (overrides view_target). game_view only |\n\n**Actions by category:**\n\n**Setup:**\n- `ping` — Check Cinemachine availability and version\n- `ensure_brain` — Ensure CinemachineBrain exists on main camera. Properties: `camera` (target camera), `defaultBlendStyle`, `defaultBlendDuration`\n- `get_brain_status` — Get Brain state (active camera, blend status)\n\n**Creation:**\n- `create_camera` — Create camera with optional preset. Properties: `name`, `preset` (follow/third_person/freelook/dolly/static/top_down/side_scroller), `follow`, `lookAt`, `priority`, `fieldOfView`. Falls back to basic Camera without Cinemachine.\n\n**Configuration:**\n- `set_target` — Set Follow and/or LookAt targets. Properties: `follow`, `lookAt` (GO name/path/ID)\n- `set_priority` — Set camera priority for Brain selection. Properties: `priority` (int)\n- `set_lens` — Configure lens. Properties: `fieldOfView`, `nearClipPlane`, `farClipPlane`, `orthographicSize`, `dutch`\n- `set_body` — Configure Body component (Cinemachine). Properties: `bodyType` (to swap), plus component-specific properties\n- `set_aim` — Configure Aim component (Cinemachine). Properties: `aimType` (to swap), plus component-specific properties\n- `set_noise` — Configure Noise (Cinemachine). Properties: `amplitudeGain`, `frequencyGain`\n\n**Extensions (Cinemachine):**\n- `add_extension` — Add extension. Properties: `extensionType` (CinemachineConfiner2D, CinemachineDeoccluder, CinemachineImpulseListener, CinemachineFollowZoom, CinemachineRecomposer, etc.)\n- `remove_extension` — Remove extension by type. Properties: `extensionType`\n\n**Control:**\n- `list_cameras` — List all cameras with status\n- `set_blend` — Configure default blend on Brain. Properties: `style` (Cut/EaseInOut/Linear/etc.), `duration`\n- `force_camera` — Override Brain to use specific camera\n- `release_override` — Release camera override\n\n**Capture:**\n- `screenshot` — Capture screenshot. Supports `capture_source=\"game_view\"` (default, camera-based) or `\"scene_view\"` (editor viewport). game_view supports inline base64, batch surround/orbit, positioned capture. scene_view supports `view_target` for framing.\n- `screenshot_multiview` — Shorthand for screenshot with batch='surround' and include_image=true.\n\n**Examples:**\n\n```python\n# Check Cinemachine availability\nmanage_camera(action=\"ping\")\n\n# Create a third-person camera following the player\nmanage_camera(action=\"create_camera\", properties={\n    \"name\": \"FollowCam\", \"preset\": \"third_person\",\n    \"follow\": \"Player\", \"lookAt\": \"Player\", \"priority\": 20\n})\n\n# Ensure Brain exists on main camera\nmanage_camera(action=\"ensure_brain\")\n\n# Configure body component\nmanage_camera(action=\"set_body\", target=\"FollowCam\", properties={\n    \"bodyType\": \"CinemachineThirdPersonFollow\",\n    \"cameraDistance\": 5.0, \"shoulderOffset\": [0.5, 0.5, 0]\n})\n\n# Set aim\nmanage_camera(action=\"set_aim\", target=\"FollowCam\", properties={\n    \"aimType\": \"CinemachineRotationComposer\"\n})\n\n# Add camera shake\nmanage_camera(action=\"set_noise\", target=\"FollowCam\", properties={\n    \"amplitudeGain\": 0.5, \"frequencyGain\": 1.0\n})\n\n# Set priority to make this the active camera\nmanage_camera(action=\"set_priority\", target=\"FollowCam\", properties={\"priority\": 50})\n\n# Force a specific camera\nmanage_camera(action=\"force_camera\", target=\"CinematicCam\")\n\n# Release override (return to priority-based selection)\nmanage_camera(action=\"release_override\")\n\n# Configure blend transitions\nmanage_camera(action=\"set_blend\", properties={\"style\": \"EaseInOut\", \"duration\": 2.0})\n\n# Add deoccluder extension\nmanage_camera(action=\"add_extension\", target=\"FollowCam\", properties={\n    \"extensionType\": \"CinemachineDeoccluder\"\n})\n\n# Screenshot from a specific camera (game_view, default)\nmanage_camera(action=\"screenshot\", camera=\"FollowCam\", include_image=True, max_resolution=512)\n\n# Scene View screenshot (captures editor viewport — gizmos, wireframes, grid)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View screenshot framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Batch surround centered on a target: one contact sheet of 6 labeled angles\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Batch orbit: grid of orbit_angles x orbit_elevations tiles around a target\nmanage_camera(action=\"screenshot\", batch=\"orbit\", view_target=\"Player\",\n              orbit_angles=8,              # azimuth steps (default 8, max 36)\n              orbit_elevations=[0, 30],    # degrees (default [0, 30, -15])\n              orbit_distance=10,           # optional, auto-fit if omitted\n              orbit_fov=60, max_resolution=256)\n\n# Positioned capture: temp camera at a viewpoint (view_rotation overrides the view_target aim)\nmanage_camera(action=\"screenshot\", view_target=\"Enemy\", view_position=[0, 10, -10], max_resolution=512)\n\n# List all cameras\nmanage_camera(action=\"list_cameras\")\n```\n\n**Tier system:**\n- Tier 1 actions (ping, create_camera, set_target, set_lens, set_priority, list_cameras, screenshot, screenshot_multiview) work without Cinemachine — they fall back to basic Unity Camera.\n- Tier 2 actions (ensure_brain, get_brain_status, set_body, set_aim, set_noise, add/remove_extension, set_blend, force_camera, release_override) require `com.unity.cinemachine`. If called without Cinemachine, they return an error with a fallback suggestion.\n\n**Resource:** Read `mcpforunity://scene/cameras` for current camera state before modifying.\n\n---\n\n## Graphics Tools\n\n### manage_graphics\n\nUnified rendering and graphics management: volumes/post-processing, light baking, rendering stats, pipeline configuration, and URP renderer features. Requires URP or HDRP for volume/feature actions. Use `ping` to check pipeline status and available features.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target object name or instance ID |\n| `effect` | string | Sometimes | Effect type name (e.g., `Bloom`, `Vignette`) |\n| `properties` | dict | No | Action-specific properties to set |\n| `parameters` | dict | No | Effect parameter values |\n| `settings` | dict | No | Bake or pipeline settings |\n| `name` | string | No | Name for created objects |\n| `profile_path` | string | No | Asset path for VolumeProfile |\n| `path` | string | No | Asset path (for `volume_create_profile`) |\n| `position` | list[float] | No | Position [x,y,z] |\n\n**Actions by category:**\n\n**Status:**\n- `ping` — Check render pipeline type, available features, and package status\n\n**Volume (require URP/HDRP):**\n- `volume_create` — Create a Volume GameObject with optional effects. Properties: `name`, `is_global` (default true), `weight` (0-1), `priority`, `profile_path` (existing profile), `effects` (list of effect defs)\n- `volume_add_effect` — Add effect override to a Volume. Params: `target` (Volume GO), `effect` (e.g., \"Bloom\")\n- `volume_set_effect` — Set effect parameters. Params: `target`, `effect`, `parameters` (dict of param name to value)\n- `volume_remove_effect` — Remove effect override. Params: `target`, `effect`\n- `volume_get_info` — Get Volume details (profile, effects, parameters). Params: `target`\n- `volume_set_properties` — Set Volume component properties (weight, priority, isGlobal). Params: `target`, `properties`\n- `volume_list_effects` — List all available volume effects for the active pipeline\n- `volume_create_profile` — Create a standalone VolumeProfile asset. Params: `path`, `effects` (optional)\n\n**Bake (Edit mode only):**\n- `bake_start` — Start lightmap bake. Params: `async_bake` (default true)\n- `bake_cancel` — Cancel in-progress bake\n- `bake_status` — Check bake progress\n- `bake_clear` — Clear baked lightmap data\n- `bake_reflection_probe` — Bake a specific reflection probe. Params: `target`\n- `bake_get_settings` — Get current Lightmapping settings\n- `bake_set_settings` — Set Lightmapping settings. Params: `settings` (dict)\n- `bake_create_light_probe_group` — Create a Light Probe Group. Params: `name`, `position`, `grid_size` [x,y,z], `spacing`\n- `bake_create_reflection_probe` — Create a Reflection Probe. Params: `name`, `position`, `size` [x,y,z], `resolution`, `mode`, `hdr`, `box_projection`\n- `bake_set_probe_positions` — Set Light Probe positions manually. Params: `target`, `positions` (array of [x,y,z])\n\n**Stats:**\n- `stats_get` — Get rendering counters (draw calls, batches, triangles, vertices, etc.)\n- `stats_list_counters` — List all available ProfilerRecorder counters\n- `stats_set_scene_debug` — Set Scene View debug/draw mode. Params: `mode`\n- `stats_get_memory` — Get rendering memory usage\n\n**Pipeline:**\n- `pipeline_get_info` — Get active render pipeline info (type, quality level, asset paths)\n- `pipeline_set_quality` — Switch quality level. Params: `level` (name or index)\n- `pipeline_get_settings` — Get pipeline asset settings\n- `pipeline_set_settings` — Set pipeline asset settings. Params: `settings` (dict)\n\n**Features (URP only):**\n- `feature_list` — List renderer features on the active URP renderer\n- `feature_add` — Add a renderer feature. Params: `feature_type`, `name`, `material` (for full-screen effects)\n- `feature_remove` — Remove a renderer feature. Params: `index` or `name`\n- `feature_configure` — Set feature properties. Params: `index` or `name`, `properties` (dict)\n- `feature_toggle` — Enable/disable a feature. Params: `index` or `name`, `active` (bool)\n- `feature_reorder` — Reorder features. Params: `order` (list of indices)\n\n**Examples:**\n\n```python\n# Check pipeline status\nmanage_graphics(action=\"ping\")\n\n# Create a global post-processing volume with Bloom and Vignette\nmanage_graphics(action=\"volume_create\", name=\"PostProcessing\", is_global=True,\n    effects=[\n        {\"type\": \"Bloom\", \"parameters\": {\"intensity\": 1.5, \"threshold\": 0.9}},\n        {\"type\": \"Vignette\", \"parameters\": {\"intensity\": 0.4}}\n    ])\n\n# Add an effect to an existing volume\nmanage_graphics(action=\"volume_add_effect\", target=\"PostProcessing\", effect=\"ColorAdjustments\")\n\n# Configure effect parameters\nmanage_graphics(action=\"volume_set_effect\", target=\"PostProcessing\",\n    effect=\"ColorAdjustments\", parameters={\"postExposure\": 0.5, \"saturation\": 10})\n\n# Get volume info\nmanage_graphics(action=\"volume_get_info\", target=\"PostProcessing\")\n\n# List all available effects for the active pipeline\nmanage_graphics(action=\"volume_list_effects\")\n\n# Create a VolumeProfile asset\nmanage_graphics(action=\"volume_create_profile\", path=\"Assets/Settings/MyProfile.asset\",\n    effects=[{\"type\": \"Bloom\"}, {\"type\": \"Tonemapping\"}])\n\n# Start async lightmap bake\nmanage_graphics(action=\"bake_start\", async_bake=True)\n\n# Check bake progress\nmanage_graphics(action=\"bake_status\")\n\n# Create a Light Probe Group with a 3x2x3 grid\nmanage_graphics(action=\"bake_create_light_probe_group\", name=\"ProbeGrid\",\n    position=[0, 1, 0], grid_size=[3, 2, 3], spacing=2.0)\n\n# Create a Reflection Probe\nmanage_graphics(action=\"bake_create_reflection_probe\", name=\"RoomProbe\",\n    position=[0, 2, 0], size=[10, 5, 10], resolution=256, hdr=True)\n\n# Get rendering stats\nmanage_graphics(action=\"stats_get\")\n\n# Get memory usage\nmanage_graphics(action=\"stats_get_memory\")\n\n# Get pipeline info\nmanage_graphics(action=\"pipeline_get_info\")\n\n# Switch quality level\nmanage_graphics(action=\"pipeline_set_quality\", level=\"High\")\n\n# List URP renderer features\nmanage_graphics(action=\"feature_list\")\n\n# Add a full-screen renderer feature\nmanage_graphics(action=\"feature_add\", feature_type=\"FullScreenPassRendererFeature\",\n    name=\"NightVision\", material=\"Assets/Materials/NightVision.mat\")\n\n# Toggle a feature off\nmanage_graphics(action=\"feature_toggle\", index=0, active=False)\n\n# Reorder features\nmanage_graphics(action=\"feature_reorder\", order=[2, 0, 1])\n```\n\n**Resources:**\n- `mcpforunity://scene/volumes` — Lists all Volume components in the scene with their profiles and effects\n- `mcpforunity://rendering/stats` — Current rendering performance counters\n- `mcpforunity://pipeline/renderer-features` — URP renderer features on the active renderer\n\n---\n\n## Package Tools\n\n### manage_packages\n\nManage Unity packages: query, install, remove, embed, and configure registries. Install/remove trigger domain reload.\n\n**Query Actions (read-only):**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `list_packages` | — | List all installed packages (async, returns job_id) |\n| `search_packages` | `query` | Search Unity registry by keyword (async, returns job_id) |\n| `get_package_info` | `package` | Get details about a specific installed package |\n| `list_registries` | — | List all scoped registries (names, URLs, scopes); immediate result |\n| `ping` | — | Check package manager availability, Unity version, package count |\n| `status` | `job_id` (required for list/search; optional for add/remove/embed) | Poll async job status; omit job_id to poll latest add/remove/embed job |\n\n**Mutating Actions:**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `add_package` | `package` | Install a package (name, name@version, git URL, or file: path) |\n| `remove_package` | `package`, `force` (optional) | Remove a package; blocked if dependents exist unless `force=true` |\n| `embed_package` | `package` | Copy package to local Packages/ for editing |\n| `resolve_packages` | — | Force re-resolution of all packages |\n| `add_registry` | `name`, `url`, `scopes` | Add a scoped registry (e.g., OpenUPM) |\n| `remove_registry` | `name` or `url` | Remove a scoped registry |\n\n**Input validation:**\n- Valid package IDs: `com.unity.inputsystem`, `com.unity.cinemachine@3.1.6`\n- Git URLs: allowed with warning (\"ensure this is a trusted source\")\n- `file:` paths: allowed with warning\n- Invalid names (uppercase, missing dots): rejected\n\n**Example — List installed packages:**\n```python\nmanage_packages(action=\"list_packages\")\n# Returns job_id, then poll:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Search for a package:**\n```python\nmanage_packages(action=\"search_packages\", query=\"input system\")\n```\n\n**Example — Install a package:**\n```python\nmanage_packages(action=\"add_package\", package=\"com.unity.inputsystem\")\n# Poll until complete:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Remove with dependency check:**\n```python\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\")\n# Error: \"Cannot remove: 3 package(s) depend on it: ...\"\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\", force=True)\n# Proceeds anyway\n```\n\n**Example — Add OpenUPM registry:**\n```python\nmanage_packages(\n    action=\"add_registry\",\n    name=\"OpenUPM\",\n    url=\"https://package.openupm.com\",\n    scopes=[\"com.cysharp\", \"com.neuecc\"]\n)\n```\n\n---\n\n## Physics Tools\n\n### `manage_physics`\n\nManage 3D and 2D physics: settings, collision matrix, materials, joints, queries, validation, and simulation. All actions support `dimension=\"3d\"` (default) or `dimension=\"2d\"` where applicable.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | See action groups below |\n| `dimension` | string | No | `\"3d\"` (default) or `\"2d\"` |\n| `settings` | object | For set_settings | Key-value physics settings dict |\n| `layer_a` / `layer_b` | string | For collision matrix | Layer name or index |\n| `collide` | bool | For set_collision_matrix | `true` to enable, `false` to disable |\n| `name` | string | For create_physics_material | Material asset name |\n| `path` | string | No | Asset folder path (create) or asset path (configure) |\n| `dynamic_friction` / `static_friction` / `bounciness` | float | No | Material properties (0–1) |\n| `friction_combine` / `bounce_combine` | string | No | `Average`, `Minimum`, `Multiply`, `Maximum` |\n| `material_path` | string | For assign_physics_material | Path to physics material asset |\n| `target` | string | For joints/queries/validate | GameObject name or instance ID |\n| `joint_type` | string | For joints | 3D: `fixed`, `hinge`, `spring`, `character`, `configurable`; 2D: `distance`, `fixed`, `friction`, `hinge`, `relative`, `slider`, `spring`, `target`, `wheel` |\n| `connected_body` | string | For add_joint | Connected body GameObject |\n| `motor` / `limits` / `spring` / `drive` | object | For configure_joint | Joint sub-config objects |\n| `properties` | object | For configure_joint/material | Direct property dict |\n| `origin` / `direction` | float[] | For raycast | Ray origin and direction `[x,y,z]` or `[x,y]` |\n| `max_distance` | float | No | Max raycast distance |\n| `shape` | string | For overlap | `sphere`, `box`, `capsule` (3D); `circle`, `box`, `capsule` (2D) |\n| `position` | float[] | For overlap | `[x,y,z]` or `[x,y]` |\n| `size` | float or float[] | For overlap | Radius (sphere/circle) or half-extents `[x,y,z]` (box) |\n| `layer_mask` | string | No | Layer name or int mask for queries |\n| `start` / `end` | float[] | For linecast | Start and end points `[x,y,z]` or `[x,y]` |\n| `point1` / `point2` | float[] | For shapecast capsule | Capsule endpoints (3D alternative) |\n| `height` | float | For shapecast capsule | Capsule height |\n| `capsule_direction` | int | For shapecast capsule | 0=X, 1=Y (default), 2=Z |\n| `angle` | float | For 2D shapecasts | Rotation angle in degrees |\n| `force` | float[] | For apply_force | Force vector `[x,y,z]` or `[x,y]` |\n| `force_mode` | string | For apply_force | `Force`, `Impulse`, `Acceleration`, `VelocityChange` (3D); `Force`, `Impulse` (2D) |\n| `force_type` | string | For apply_force | `normal` (default) or `explosion` (3D only) |\n| `torque` | float[] | For apply_force | Torque `[x,y,z]` (3D) or `[z]` (2D) |\n| `explosion_position` | float[] | For apply_force explosion | Explosion center `[x,y,z]` |\n| `explosion_radius` | float | For apply_force explosion | Explosion sphere radius |\n| `explosion_force` | float | For apply_force explosion | Explosion force magnitude |\n| `upwards_modifier` | float | For apply_force explosion | Y-axis offset (default 0) |\n| `steps` | int | For simulate_step | Number of steps (1–100) |\n| `step_size` | float | No | Step size in seconds (default: `Time.fixedDeltaTime`) |\n\n**Action groups:**\n\n- **Settings:** `ping`, `get_settings`, `set_settings`\n- **Collision Matrix:** `get_collision_matrix`, `set_collision_matrix`\n- **Materials:** `create_physics_material`, `configure_physics_material`, `assign_physics_material`\n- **Joints:** `add_joint`, `configure_joint`, `remove_joint`\n- **Queries:** `raycast`, `raycast_all`, `linecast`, `shapecast`, `overlap`\n- **Forces:** `apply_force`\n- **Rigidbody:** `get_rigidbody`, `configure_rigidbody`\n- **Validation:** `validate`\n- **Simulation:** `simulate_step`\n\n```python\n# Check physics status\nmanage_physics(action=\"ping\")\n\n# Get/set gravity\nmanage_physics(action=\"get_settings\", dimension=\"3d\")\nmanage_physics(action=\"set_settings\", dimension=\"3d\", settings={\"gravity\": [0, -20, 0]})\n\n# Collision matrix\nmanage_physics(action=\"get_collision_matrix\")\nmanage_physics(action=\"set_collision_matrix\", layer_a=\"Player\", layer_b=\"Enemy\", collide=False)\n\n# Create a bouncy physics material and assign it\nmanage_physics(action=\"create_physics_material\", name=\"Bouncy\", bounciness=0.9, dynamic_friction=0.2)\nmanage_physics(action=\"assign_physics_material\", target=\"Ball\", material_path=\"Assets/Physics Materials/Bouncy.physicMaterial\")\n\n# Add and configure a hinge joint\nmanage_physics(action=\"add_joint\", target=\"Door\", joint_type=\"hinge\", connected_body=\"DoorFrame\")\nmanage_physics(action=\"configure_joint\", target=\"Door\", joint_type=\"hinge\",\n               motor={\"targetVelocity\": 90, \"force\": 100},\n               limits={\"min\": -90, \"max\": 0, \"bounciness\": 0})\n\n# Raycast and overlap\nmanage_physics(action=\"raycast\", origin=[0, 10, 0], direction=[0, -1, 0], max_distance=50)\nmanage_physics(action=\"overlap\", shape=\"sphere\", position=[0, 0, 0]","unity-mcp-skill/references/probuilder-guide.md":"# ProBuilder Workflow Guide\n\nPatterns and best practices for AI-driven ProBuilder mesh editing through MCP for Unity.\n\n## Availability\n\nProBuilder is an **optional** Unity package (`com.unity.probuilder`). Check `mcpforunity://project/info` or call `manage_probuilder(action=\"ping\")` to verify it's installed before using any ProBuilder tools. If available, **prefer ProBuilder over primitive GameObjects** for any geometry that needs editing, multi-material faces, or non-trivial shapes.\n\n## Core Workflow: Always Get Info First\n\nBefore any mesh edit, call `get_mesh_info` with `include='faces'` to understand the geometry:\n\n```python\n# Step 1: Get face info with directions\nresult = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"faces\"})\n\n# Response includes per-face:\n#   index: 0, normal: [0, 1, 0], center: [0, 0.5, 0], direction: \"top\"\n#   index: 1, normal: [0, -1, 0], center: [0, -0.5, 0], direction: \"bottom\"\n#   index: 2, normal: [0, 0, 1], center: [0, 0, 0.5], direction: \"front\"\n#   ...\n\n# Step 2: Use the direction labels to pick faces\n# Want to extrude the top? Find the face with direction=\"top\"\nmanage_probuilder(action=\"extrude_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0], \"distance\": 1.5})\n```\n\n### Include Parameter\n\n| Value | Returns | Use When |\n|-------|---------|----------|\n| `\"summary\"` | Counts, bounds, materials | Quick check / validation |\n| `\"faces\"` | + normals, centers, directions | Selecting faces for editing |\n| `\"edges\"` | + edge vertex pairs with world positions (max 200) | Edge-based operations |\n| `\"all\"` | Everything | Full mesh analysis |\n\n## Shape Creation\n\n### All 12 Shape Types\n\n```python\n# Basic shapes\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cube\", \"name\": \"MyCube\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Sphere\", \"name\": \"MySphere\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cylinder\", \"name\": \"MyCyl\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Plane\", \"name\": \"MyPlane\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cone\", \"name\": \"MyCone\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Prism\", \"name\": \"MyPrism\"})\n\n# Parametric shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"MyTorus\",\n    \"rows\": 16, \"columns\": 24, \"innerRadius\": 0.5, \"outerRadius\": 1.0\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Pipe\", \"name\": \"MyPipe\",\n    \"radius\": 1.0, \"height\": 2.0, \"thickness\": 0.2\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Arch\", \"name\": \"MyArch\",\n    \"radius\": 2.0, \"angle\": 180, \"segments\": 12\n})\n\n# Architectural shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"MyStairs\", \"steps\": 10\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"CurvedStair\", \"name\": \"Spiral\", \"steps\": 12\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"MyDoor\"\n})\n\n# Custom polygon\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [[0,0,0], [5,0,0], [5,0,5], [2.5,0,7], [0,0,5]],\n    \"extrudeHeight\": 3.0, \"name\": \"Pentagon\"\n})\n```\n\n## Common Editing Operations\n\n### Extrude a Roof\n\n```python\n# 1. Create a building base\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"Building\", \"size\": [4, 3, 6]\n})\n\n# 2. Find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Building\",\n    properties={\"include\": \"faces\"})\n# Find face with direction=\"top\" -> e.g. index 2\n\n# 3. Extrude upward for a flat roof extension\nmanage_probuilder(action=\"extrude_faces\", target=\"Building\",\n    properties={\"faceIndices\": [2], \"distance\": 0.5})\n```\n\n### Cut a Hole (Delete Faces)\n\n```python\n# 1. Get face info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n# Find the face with direction=\"front\" -> e.g. index 4\n\n# 2. Subdivide to create more faces\nmanage_probuilder(action=\"subdivide\", target=\"Wall\",\n    properties={\"faceIndices\": [4]})\n\n# 3. Get updated face info (indices changed after subdivide!)\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n\n# 4. Delete the center face(s) for the hole\nmanage_probuilder(action=\"delete_faces\", target=\"Wall\",\n    properties={\"faceIndices\": [6]})\n```\n\n### Bevel Edges\n\n```python\n# Get edge info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"edges\"})\n\n# Bevel specific edges\nmanage_probuilder(action=\"bevel_edges\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.1})\n```\n\n### Detach Faces to New Object\n\n```python\n# Detach and keep original (default)\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": False})\n\n# Detach and remove from source\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": True})\n```\n\n### Select Faces by Direction\n\n```python\n# Select all upward-facing faces\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"direction\": \"up\", \"tolerance\": 0.7})\n\n# Grow selection from a seed face\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"growFrom\": [0], \"growAngle\": 45})\n```\n\n### Double-Sided Geometry\n\n```python\n# Create inside faces for a room (duplicate and flip normals)\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"Room\",\n    properties={\"faceIndices\": [0, 1, 2, 3, 4, 5]})\n```\n\n### Create Polygon from Existing Vertices\n\n```python\n# Connect existing vertices into a new face (auto-finds winding order)\nmanage_probuilder(action=\"create_polygon\", target=\"MyMesh\",\n    properties={\"vertexIndices\": [0, 3, 7, 4]})\n```\n\n## Vertex Operations\n\n```python\n# Move vertices by offset. Only the listed indices move: faces that meet at a corner\n# usually each have their own vertex there, so moving one face's corners opens a gap.\nmanage_probuilder(action=\"move_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"offset\": [0, 1, 0]})\n\n# Weld nearby vertices (proximity-based merge)\nmanage_probuilder(action=\"weld_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"radius\": 0.1})\n\n# Insert vertex on an edge\nmanage_probuilder(action=\"insert_vertex\", target=\"MyCube\",\n    properties={\"edge\": {\"a\": 0, \"b\": 1}, \"point\": [0.5, 0, 0]})\n\n# Add evenly-spaced points along edges\nmanage_probuilder(action=\"append_vertices_to_edge\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1], \"count\": 3})\n```\n\n## Smoothing Workflow\n\n### Auto-Smooth (Recommended Default)\n\n```python\n# Apply auto-smoothing with default 30 degree threshold\nmanage_probuilder(action=\"auto_smooth\", target=\"MyMesh\",\n    properties={\"angleThreshold\": 30})\n```\n\n- **Low angle (15-25)**: More hard edges, faceted look\n- **Medium angle (30-45)**: Good default, smooth curves + sharp corners\n- **High angle (60-80)**: Very smooth, only sharpest edges remain hard\n\n### Manual Smoothing Groups\n\n```python\n# Set specific faces to smooth group 1\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [0, 1, 2], \"smoothingGroup\": 1})\n\n# Set other faces to hard edges (group 0)\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [3, 4, 5], \"smoothingGroup\": 0})\n```\n\n## Mesh Cleanup Pattern\n\nAfter editing, always clean up:\n\n```python\n# 1. Center the pivot (important after extrusions that shift geometry)\nmanage_probuilder(action=\"center_pivot\", target=\"MyMesh\")\n\n# 2. Optionally freeze transform if you moved/rotated the object\nmanage_probuilder(action=\"freeze_transform\", target=\"MyMesh\")\n\n# 3. Validate mesh health\nresult = manage_probuilder(action=\"validate_mesh\", target=\"MyMesh\")\n# Check result.data.healthy -- if false, repair\n\n# 4. Auto-repair if needed\nmanage_probuilder(action=\"repair_mesh\", target=\"MyMesh\")\n```\n\n## Building Complex Objects with ProBuilder\n\nWhen ProBuilder is available, prefer it over primitive GameObjects for complex geometry. ProBuilder lets you create, edit, and combine shapes into detailed objects without external 3D tools.\n\n### Example: Simple House\n\n```python\n# 1. Create base building\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"House\", \"width\": 6, \"height\": 3, \"depth\": 8\n})\n\n# 2. Get face info to find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"top\" -> e.g. index 2\n\n# 3. Extrude the top face to create a flat raised section\nmanage_probuilder(action=\"extrude_faces\", target=\"House\",\n    properties={\"faceIndices\": [2], \"distance\": 0.3})\n\n# 4. Add a peaked roof as a separate Prism; its ridge runs along Z, like the house.\n#    (Moving the top face's vertices would pull it away from the walls; see Vertex Operations.)\n#    Shapes are centered on their position: the walls now reach y = 1.8,\n#    so a roof 2 high sits on them at y = 1.8 + 1.\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Prism\", \"name\": \"Roof\",\n    \"width\": 6, \"height\": 2, \"depth\": 8, \"position\": [0, 2.8, 0]\n})\n\n# 5. Cut a doorway: subdivide front face, delete center sub-face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"front\", subdivide it\nmanage_probuilder(action=\"subdivide\", target=\"House\",\n    properties={\"faceIndices\": [4]})\n\n# Re-query, find bottom-center face, delete it\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\nmanage_probuilder(action=\"delete_faces\", target=\"House\",\n    properties={\"faceIndices\": [12]})\n\n# 6. Add a door frame with arch\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"Doorway\",\n    \"position\": [0, 0, 4], \"width\": 1.5, \"height\": 2.5\n})\n\n# 7. Add stairs to the door\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"FrontSteps\",\n    \"position\": [0, 0, 5], \"steps\": 3, \"width\": 2\n})\n\n# 8. Smooth organic parts, keep architectural edges sharp\nmanage_probuilder(action=\"auto_smooth\", target=\"House\",\n    properties={\"angleThreshold\": 30})\n\n# 9. Assign materials per face\nmanage_probuilder(action=\"set_face_material\", target=\"House\",\n    properties={\"faceIndices\": [0, 1, 2, 3], \"materialPath\": \"Assets/Materials/Brick.mat\"})\n# A Prism's faces 1 and 3 are its two slopes\nmanage_probuilder(action=\"set_face_material\", target=\"Roof\",\n    properties={\"faceIndices\": [1, 3], \"materialPath\": \"Assets/Materials/Roof.mat\"})\n\n# 10. Cleanup\nmanage_probuilder(action=\"center_pivot\", target=\"House\")\nmanage_probuilder(action=\"validate_mesh\", target=\"House\")\n```\n\n### Example: Pillared Corridor (Batch)\n\n```python\n# Create multiple columns efficiently\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cylinder\", \"name\": f\"Pillar_{i}\",\n                       \"radius\": 0.3, \"height\": 4, \"segments\": 12,\n                       \"position\": [i * 3, 0, 0]}\n    }} for i in range(6)\n] + [\n    # Floor\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Floor\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 0, 0]}\n    }},\n    # Ceiling\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Ceiling\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 4, 0]}\n    }},\n])\n\n# Bevel all pillar tops for decoration\nfor i in range(6):\n    info = manage_probuilder(action=\"get_mesh_info\", target=f\"Pillar_{i}\",\n        properties={\"include\": \"edges\"})\n    # Find top ring edges, bevel them\n    manage_probuilder(action=\"bevel_edges\", target=f\"Pillar_{i}\",\n        properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.05})\n\n# Smooth the pillars\nfor i in range(6):\n    manage_probuilder(action=\"auto_smooth\", target=f\"Pillar_{i}\",\n        properties={\"angleThreshold\": 45})\n```\n\n### Example: Custom L-Shaped Room\n\n```python\n# Use polygon shape for non-rectangular footprint\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [\n        [0, 0, 0], [10, 0, 0], [10, 0, 6],\n        [4, 0, 6], [4, 0, 10], [0, 0, 10]\n    ],\n    \"extrudeHeight\": 3.0,\n    \"name\": \"LRoom\"\n})\n\n# Create inside faces for the room interior\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"LRoom\",\n    properties={\"include\": \"faces\"})\n# Duplicate and flip all faces to make interior visible\nall_faces = list(range(info[\"data\"][\"faceCount\"]))\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"LRoom\",\n    properties={\"faceIndices\": all_faces})\n\n# Cut a window: subdivide a wall face, delete center\n# (follow the get_mesh_info -> subdivide -> get_mesh_info -> delete pattern)\n```\n\n### Example: Torus Knot / Decorative Ring\n\n```python\n# Create a torus\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"Ring\",\n    \"innerRadius\": 0.3, \"outerRadius\": 2.0,\n    \"rows\": 24, \"columns\": 32\n})\n\n# Smooth it for organic look\nmanage_probuilder(action=\"auto_smooth\", target=\"Ring\",\n    properties={\"angleThreshold\": 60})\n\n# Assign metallic material\nmanage_probuilder(action=\"set_face_material\", target=\"Ring\",\n    properties={\"faceIndices\": [], \"materialPath\": \"Assets/Materials/Gold.mat\"})\n# Note: empty faceIndices = all faces\n```\n\n## Batch Patterns\n\nUse `batch_execute` for multi-step workflows to reduce round-trips:\n\n```python\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column1\", \"position\": [0, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column2\", \"position\": [5, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column3\", \"position\": [10, 0, 0]}\n    }},\n])\n```\n\n## Known Limitations\n\n### Not Yet Working\n\nThese actions exist in the API but have known bugs that prevent them from working correctly:\n\n| Action | Issue | Workaround |\n|--------|-------|------------|\n| `set_pivot` | Vertex positions don't persist through `ToMesh()`/`RefreshMesh()`. The `positions` property setter is overwritten when ProBuilder rebuilds the mesh. Needs `SetVertices(IList<Vertex>)` or direct `m_Positions` field access. | Use `center_pivot` instead, or position objects via Transform. |\n| `convert_to_probuilder` | `MeshImporter` constructor throws internally. May need ProBuilder's editor-only `ProBuilderize` API instead of runtime `MeshImporter`. | Create shapes natively with `create_shape` or `create_poly_shape` instead of converting existing meshes. |\n\n### General Limitations\n\n- Face indices are **not stable** across edits -- always re-query `get_mesh_info` after any modification\n- Edge data is capped at **200 edges** in `get_mesh_info` results\n- Face data is capped at **100 faces** in `get_mesh_info` results\n- `subdivide` uses `ConnectElements.Connect` internally (ProBuilder has no public `Subdivide` API), which connects face midpoints rather than traditional quad subdivision\n\n## Key Rules\n\n1. **Always get_mesh_info before editing** -- face indices are not stable across edits\n2. **Re-query after modifications** -- subdivide, extrude, delete all change face indices\n3. **Use direction labels** -- don't guess face indices, use the direction field\n4. **Cleanup after editing** -- center_pivot + validate is good practice\n5. **Auto-smooth for organic shapes** -- 30 degrees is a good default\n6. **Prefer ProBuilder over primitives** -- when the package is available and you need editable geometry\n7. **Use batch_execute** -- for creating multiple shapes or repetitive operations\n8. **Screenshot to verify** -- use `manage_camera(action=\"screenshot\", include_image=True)` to check visual results after complex edits\n","unity-mcp-skill/references/resources-reference.md":"# Unity-MCP Resources Reference\n\nResources provide read-only access to Unity state. Use resources to inspect before using tools to modify.\n\n## Table of Contents\n\n- [Editor State Resources](#editor-state-resources)\n- [Camera Resources](#camera-resources)\n- [Graphics Resources](#graphics-resources)\n- [Scene & GameObject Resources](#scene--gameobject-resources)\n- [Prefab Resources](#prefab-resources)\n- [Project Resources](#project-resources)\n- [Instance Resources](#instance-resources)\n- [Test Resources](#test-resources)\n\n---\n\n## URI Scheme\n\nAll resources use `mcpforunity://` scheme:\n\n```\nmcpforunity://{category}/{resource_path}[?query_params]\n```\n\n**Categories:** `editor`, `scene`, `prefab`, `project`, `pipeline`, `rendering`, `menu-items`, `custom-tools`, `tests`, `instances`\n\n---\n\n## Editor State Resources\n\n### mcpforunity://editor/state\n\n**Purpose:** Editor readiness snapshot - check before tool operations.\n\n**Returns:**\n```json\n{\n  \"unity_version\": \"2022.3.10f1\",\n  \"is_compiling\": false,\n  \"is_domain_reload_pending\": false,\n  \"play_mode\": {\n    \"is_playing\": false,\n    \"is_paused\": false\n  },\n  \"active_scene\": {\n    \"path\": \"Assets/Scenes/Main.unity\",\n    \"name\": \"Main\"\n  },\n  \"ready_for_tools\": true,\n  \"blocking_reasons\": [],\n  \"recommended_retry_after_ms\": null,\n  \"staleness\": {\n    \"age_ms\": 150,\n    \"is_stale\": false\n  }\n}\n```\n\n**Key Fields:**\n- `ready_for_tools`: Only proceed if `true`\n- `is_compiling`: Wait if `true`\n- `blocking_reasons`: Array explaining why tools might fail\n- `recommended_retry_after_ms`: Suggested wait time\n\n### mcpforunity://editor/selection\n\n**Purpose:** Currently selected objects.\n\n**Returns:**\n```json\n{\n  \"activeObject\": \"Player\",\n  \"activeGameObject\": \"Player\",\n  \"activeInstanceID\": 12345,\n  \"count\": 3,\n  \"gameObjects\": [\"Player\", \"Enemy\", \"Wall\"],\n  \"assetGUIDs\": []\n}\n```\n\n### mcpforunity://editor/active-tool\n\n**Purpose:** Current editor tool state.\n\n**Returns:**\n```json\n{\n  \"activeTool\": \"Move\",\n  \"isCustom\": false,\n  \"pivotMode\": \"Center\",\n  \"pivotRotation\": \"Global\"\n}\n```\n\n### mcpforunity://editor/windows\n\n**Purpose:** All open editor windows.\n\n**Returns:**\n```json\n{\n  \"windows\": [\n    {\n      \"title\": \"Scene\",\n      \"typeName\": \"UnityEditor.SceneView\",\n      \"isFocused\": true,\n      \"position\": {\"x\": 0, \"y\": 0, \"width\": 800, \"height\": 600}\n    }\n  ]\n}\n```\n\n### mcpforunity://editor/prefab-stage\n\n**Purpose:** Current prefab editing context.\n\n**Returns:**\n```json\n{\n  \"isOpen\": true,\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"prefabRootName\": \"Player\",\n  \"isDirty\": false\n}\n```\n\n---\n\n## Camera Resources\n\n### mcpforunity://scene/cameras\n\n**Purpose:** List all cameras in the scene (Unity Camera + CinemachineCamera) with full status. Read this before using `manage_camera` to understand the current camera setup.\n\n**Returns:**\n```json\n{\n  \"brain\": {\n    \"exists\": true,\n    \"gameObject\": \"Main Camera\",\n    \"instanceID\": 55504,\n    \"activeCameraName\": \"Cam_Cinematic\",\n    \"activeCameraID\": -39420,\n    \"isBlending\": false\n  },\n  \"cinemachineCameras\": [\n    {\n      \"instanceID\": -39420,\n      \"name\": \"Cam_Cinematic\",\n      \"isLive\": true,\n      \"priority\": 50,\n      \"follow\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"lookAt\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"body\": \"CinemachineThirdPersonFollow\",\n      \"aim\": \"CinemachineRotationComposer\",\n      \"noise\": \"CinemachineBasicMultiChannelPerlin\",\n      \"extensions\": []\n    }\n  ],\n  \"unityCameras\": [\n    {\n      \"instanceID\": 55504,\n      \"name\": \"Main Camera\",\n      \"depth\": 0.0,\n      \"fieldOfView\": 50.0,\n      \"hasBrain\": true\n    }\n  ],\n  \"cinemachineInstalled\": true\n}\n```\n\n**Key Fields:**\n- `brain`: CinemachineBrain status — which camera is active, blend state\n- `cinemachineCameras`: All CinemachineCamera components with pipeline info (body, aim, noise, extensions)\n- `unityCameras`: All Unity Camera components with depth and FOV\n- `cinemachineInstalled`: Whether Cinemachine package is available\n\n**Use with:** `manage_camera` tool for creating/configuring cameras\n\n---\n\n## Graphics Resources\n\n### mcpforunity://scene/volumes\n\n**Purpose:** List all Volume components in the scene with effects and parameters. Read this before using `manage_graphics` volume actions.\n\n**Returns:**\n```json\n{\n  \"pipeline\": \"Universal (URP)\",\n  \"volumes\": [\n    {\n      \"name\": \"PostProcessVolume\",\n      \"instance_id\": -24600,\n      \"is_global\": true,\n      \"weight\": 1.0,\n      \"priority\": 0,\n      \"blend_distance\": 0,\n      \"profile\": \"MyProfile\",\n      \"profile_path\": \"Assets/Settings/MyProfile.asset\",\n      \"effects\": [\n        {\n          \"type\": \"Bloom\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"threshold\", \"scatter\"]\n        },\n        {\n          \"type\": \"Vignette\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"smoothness\"]\n        }\n      ]\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `is_global`: Whether the volume applies everywhere or only within its collider bounds\n- `effects[].overridden_params`: Which parameters are actively overridden (not using defaults)\n- `profile_path`: Empty string for embedded profiles, asset path for shared profiles\n\n**Use with:** `manage_graphics` volume actions (volume_create, volume_add_effect, volume_set_effect, etc.)\n\n### mcpforunity://rendering/stats\n\n**Purpose:** Current rendering performance counters (draw calls, batches, triangles, memory).\n\n**Returns:**\n```json\n{\n  \"draw_calls\": 42,\n  \"batches\": 35,\n  \"set_pass_calls\": 12,\n  \"triangles\": 15234,\n  \"vertices\": 8456,\n  \"dynamic_batches\": 5,\n  \"static_batches\": 20,\n  \"shadow_casters\": 3,\n  \"render_textures\": 8,\n  \"render_textures_bytes\": 16777216,\n  \"visible_skinned_meshes\": 2\n}\n```\n\n**Use with:** `manage_graphics` stats actions (stats_get, stats_list_counters, stats_get_memory)\n\n### mcpforunity://pipeline/renderer-features\n\n**Purpose:** URP renderer features on the active renderer (SSAO, Decals, etc.).\n\n**Returns:**\n```json\n{\n  \"rendererDataName\": \"PC_Renderer\",\n  \"features\": [\n    {\n      \"index\": 0,\n      \"name\": \"ScreenSpaceAmbientOcclusion\",\n      \"type\": \"ScreenSpaceAmbientOcclusion\",\n      \"isActive\": true,\n      \"properties\": { \"m_Settings\": \"Generic\" }\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `index`: Position in the feature list (use for feature_toggle, feature_remove, feature_configure)\n- `isActive`: Whether the feature is enabled\n- `rendererDataName`: Which URP renderer data asset is active\n\n**Use with:** `manage_graphics` feature actions (feature_list, feature_add, feature_remove, feature_toggle, etc.)\n\n---\n\n## Scene & GameObject Resources\n\n### mcpforunity://scene/gameobject-api\n\n**Purpose:** Documentation for GameObject resources (read this first).\n\n### mcpforunity://scene/gameobject/{instance_id}\n\n**Purpose:** Basic GameObject data (metadata, no component properties).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID from `find_gameobjects`\n\n**Returns:**\n```json\n{\n  \"instanceID\": 12345,\n  \"name\": \"Player\",\n  \"tag\": \"Player\",\n  \"layer\": 8,\n  \"layerName\": \"Player\",\n  \"active\": true,\n  \"activeInHierarchy\": true,\n  \"isStatic\": false,\n  \"transform\": {\n    \"position\": [0, 1, 0],\n    \"rotation\": [0, 0, 0],\n    \"scale\": [1, 1, 1]\n  },\n  \"parent\": {\"instanceID\": 0},\n  \"children\": [{\"instanceID\": 67890}],\n  \"componentTypes\": [\"Transform\", \"Rigidbody\", \"PlayerController\"],\n  \"path\": \"/Player\"\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/components\n\n**Purpose:** All components with full property serialization (paginated).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `page_size` (int): Default 25, max 100\n- `cursor` (int): Pagination cursor\n- `include_properties` (bool): Default true, set false for just types\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"components\": [\n    {\n      \"type\": \"Transform\",\n      \"properties\": {\n        \"position\": {\"x\": 0, \"y\": 1, \"z\": 0},\n        \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0, \"w\": 1}\n      }\n    },\n    {\n      \"type\": \"Rigidbody\",\n      \"properties\": {\n        \"mass\": 1.0,\n        \"useGravity\": true\n      }\n    }\n  ],\n  \"cursor\": 0,\n  \"pageSize\": 25,\n  \"nextCursor\": null,\n  \"hasMore\": false\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/component/{component_name}\n\n**Purpose:** Single component with full properties.\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `component_name` (string): e.g., \"Rigidbody\", \"Camera\", \"Transform\"\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"component\": {\n    \"type\": \"Rigidbody\",\n    \"properties\": {\n      \"mass\": 1.0,\n      \"drag\": 0,\n      \"angularDrag\": 0.05,\n      \"useGravity\": true,\n      \"isKinematic\": false\n    }\n  }\n}\n```\n\n---\n\n## Prefab Resources\n\n### mcpforunity://prefab-api\n\n**Purpose:** Documentation for prefab resources.\n\n### mcpforunity://prefab/{encoded_path}\n\n**Purpose:** Prefab asset information.\n\n**Parameters:**\n- `encoded_path` (string): URL-encoded path, e.g., `Assets%2FPrefabs%2FPlayer.prefab`\n\n**Path Encoding:**\n```\nAssets/Prefabs/Player.prefab → Assets%2FPrefabs%2FPlayer.prefab\n```\n\n**Returns:**\n```json\n{\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"guid\": \"abc123...\",\n  \"prefabType\": \"Regular\",\n  \"rootObjectName\": \"Player\",\n  \"rootComponentTypes\": [\"Transform\", \"PlayerController\"],\n  \"childCount\": 5,\n  \"isVariant\": false,\n  \"parentPrefab\": null\n}\n```\n\n### mcpforunity://prefab/{encoded_path}/hierarchy\n\n**Purpose:** Full prefab hierarchy with nested prefab info.\n\n**Returns:**\n```json\n{\n  \"prefabPath\": \"Assets/Prefabs/Player.prefab\",\n  \"total\": 6,\n  \"items\": [\n    {\n      \"name\": \"Player\",\n      \"instanceId\": 12345,\n      \"path\": \"/Player\",\n      \"activeSelf\": true,\n      \"childCount\": 2,\n      \"componentTypes\": [\"Transform\", \"PlayerController\"]\n    },\n    {\n      \"name\": \"Model\",\n      \"path\": \"/Player/Model\",\n      \"isNestedPrefab\": true,\n      \"nestedPrefabPath\": \"Assets/Prefabs/PlayerModel.prefab\"\n    }\n  ]\n}\n```\n\n---\n\n## Project Resources\n\n### mcpforunity://project/info\n\n**Purpose:** Static project configuration.\n\n**Returns:**\n```json\n{\n  \"projectRoot\": \"/Users/dev/MyProject\",\n  \"projectName\": \"MyProject\",\n  \"unityVersion\": \"2022.3.10f1\",\n  \"platform\": \"StandaloneWindows64\",\n  \"assetsPath\": \"/Users/dev/MyProject/Assets\"\n}\n```\n\n### mcpforunity://project/tags\n\n**Purpose:** All tags defined in TagManager.\n\n**Returns:**\n```json\n[\"Untagged\", \"Respawn\", \"Finish\", \"EditorOnly\", \"MainCamera\", \"Player\", \"GameController\", \"Enemy\"]\n```\n\n### mcpforunity://project/layers\n\n**Purpose:** All layers with indices (0-31).\n\n**Returns:**\n```json\n{\n  \"0\": \"Default\",\n  \"1\": \"TransparentFX\",\n  \"2\": \"Ignore Raycast\",\n  \"4\": \"Water\",\n  \"5\": \"UI\",\n  \"8\": \"Player\",\n  \"9\": \"Enemy\"\n}\n```\n\n### mcpforunity://menu-items\n\n**Purpose:** All available Unity menu items.\n\n**Returns:**\n```json\n[\n  \"File/New Scene\",\n  \"File/Open Scene\",\n  \"File/Save\",\n  \"Edit/Undo\",\n  \"Edit/Redo\",\n  \"GameObject/Create Empty\",\n  \"GameObject/3D Object/Cube\",\n  \"Window/General/Console\"\n]\n```\n\n### mcpforunity://custom-tools\n\n**Purpose:** Custom tools available in the active Unity project.\n\n**Returns:**\n```json\n{\n  \"project_id\": \"MyProject\",\n  \"tool_count\": 3,\n  \"tools\": [\n    {\n      \"name\": \"capture_screenshot\",\n      \"description\": \"Capture screenshots in Unity\",\n      \"parameters\": [\n        {\"name\": \"filename\", \"type\": \"string\", \"required\": true},\n        {\"name\": \"width\", \"type\": \"int\", \"required\": false},\n        {\"name\": \"height\", \"type\": \"int\", \"required\": false}\n      ]\n    }\n  ]\n}\n```\n\n---\n\n## Instance Resources\n\n### mcpforunity://instances\n\n**Purpose:** All running Unity Editor instances (for multi-instance workflows).\n\n**Returns:**\n```json\n{\n  \"transport\": \"http\",\n  \"instance_count\": 2,\n  \"instances\": [\n    {\n      \"id\": \"MyProject@abc123\",\n      \"name\": \"MyProject\",\n      \"hash\": \"abc123\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T10:30:00Z\"\n    },\n    {\n      \"id\": \"TestProject@def456\",\n      \"name\": \"TestProject\",\n      \"hash\": \"def456\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T11:00:00Z\"\n    }\n  ],\n  \"warnings\": []\n}\n```\n\n**Use with:** `set_active_instance(instance=\"MyProject@abc123\")`\n\n---\n\n## Test Resources\n\n### mcpforunity://tests\n\n**Purpose:** All tests in the project.\n\n**Returns:**\n```json\n[\n  {\n    \"name\": \"TestSomething\",\n    \"full_name\": \"MyTests.TestSomething\",\n    \"mode\": \"EditMode\"\n  },\n  {\n    \"name\": \"TestOther\",\n    \"full_name\": \"MyTests.TestOther\",\n    \"mode\": \"PlayMode\"\n  }\n]\n```\n\n### mcpforunity://tests/{mode}\n\n**Purpose:** Tests filtered by mode.\n\n**Parameters:**\n- `mode` (string): \"EditMode\" or \"PlayMode\"\n\n**Example:** `mcpforunity://tests/EditMode`\n\n---\n\n## Best Practices\n\n### 1. Check Editor State First\n\n```python\n# Before any complex operation:\n# Read mcpforunity://editor/state\n# Check ready_for_tools == true\n```\n\n### 2. Use Find Then Read Pattern\n\n```python\n# 1. find_gameobjects to get IDs\nresult = find_gameobjects(search_term=\"Player\")\n\n# 2. Read resource for full data\n# mcpforunity://scene/gameobject/{id}\n```\n\n### 3. Paginate Large Queries\n\n```python\n# Start with include_properties=false for component lists\n# mcpforunity://scene/gameobject/{id}/components?include_properties=false&page_size=25\n\n# Then read specific components as needed\n# mcpforunity://scene/gameobject/{id}/component/Rigidbody\n```\n\n### 4. URL-Encode Prefab Paths\n\n```python\n# Wrong:\n# mcpforunity://prefab/Assets/Prefabs/Player.prefab\n\n# Correct:\n# mcpforunity://prefab/Assets%2FPrefabs%2FPlayer.prefab\n```\n\n### 5. Multi-Instance Awareness\n\n```python\n# Always check mcpforunity://instances when:\n# - First connecting\n# - Commands fail unexpectedly\n# - Working with multiple projects\n```\n","unity-mcp-skill/references/workflows.md":"# Unity-MCP Workflow Patterns\n\nCommon workflows and patterns for effective Unity-MCP usage.\n\n## Table of Contents\n\n- [Setup & Verification](#setup--verification)\n- [Scene Creation Workflows](#scene-creation-workflows)\n- [Script Development Workflows](#script-development-workflows)\n- [Asset Management Workflows](#asset-management-workflows)\n- [Testing Workflows](#testing-workflows)\n- [Debugging Workflows](#debugging-workflows)\n- [UI Creation Workflows](#ui-creation-workflows)\n- [Camera & Cinemachine Workflows](#camera--cinemachine-workflows)\n- [ProBuilder Workflows](#probuilder-workflows)\n- [Graphics & Rendering Workflows](#graphics--rendering-workflows)\n- [Package Management Workflows](#package-management-workflows)\n- [Package Deployment Workflows](#package-deployment-workflows)\n- [API Verification Workflows](#api-verification-workflows)\n- [Batch Operations](#batch-operations)\n\n---\n\n## Setup & Verification\n\n### Initial Connection Verification\n\n```python\n# 1. Check editor state\n# Read mcpforunity://editor/state\n\n# 2. Verify ready_for_tools == true\n# If false, wait for recommended_retry_after_ms\n\n# 3. Check active scene\n# Read mcpforunity://editor/state → active_scene\n\n# 4. List available instances (multi-instance)\n# Read mcpforunity://instances\n```\n\n### Before Any Operation\n\n```python\n# Quick readiness check pattern:\neditor_state = read_resource(\"mcpforunity://editor/state\")\n\nif not editor_state[\"ready_for_tools\"]:\n    # Check blocking_reasons\n    # Wait recommended_retry_after_ms\n    pass\n\nif editor_state[\"is_compiling\"]:\n    # Wait for compilation to complete\n    pass\n```\n\n---\n\n## Scene Generator Build Workflow\n\n### Fresh Scene Before Building\n\n**Always start a generated scene build with `manage_scene(action=\"create\")`** to get a clean empty scene. This avoids conflicts with existing default objects (Camera, Light) that would cause \"already exists\" errors when the execution plan tries to create its own.\n\n```python\n# Step 0: Create fresh empty scene (replaces current scene entirely)\nmanage_scene(action=\"create\", name=\"MyGeneratedScene\", path=\"Assets/Scenes/\")\n\n# Now proceed with the phased execution plan...\n# Phase 1: Environment (camera, lights) — no conflicts\n# Phase 2: Objects (GameObjects)\n# Phase 3: Materials\n# etc.\n```\n\n### Wiring Object References Between Components\n\nAfter creating scripts and attaching components, use `set_property` to wire cross-references between GameObjects. Use the `{\"name\": \"ObjectName\"}` format to reference scene objects by name:\n\n```python\n# Wire a list of target GameObjects into a script's serialized field\nmanage_components(\n    action=\"set_property\",\n    target=\"BeeManager\",\n    component_type=\"BeeManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Flower_3\"}]\n)\n```\n\n### Physics Requirements for Trigger-Based Interactions\n\nWhen scripts use `OnTriggerEnter` / `OnTriggerStay` / `OnTriggerExit`, at least one of the two colliding objects **must** have a `Rigidbody` component. Common pattern:\n\n```python\n# Moving objects (bees, players) need Rigidbody for triggers to fire\nbatch_execute(commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"Bee_1\", \"component_type\": \"Rigidbody\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"Bee_1\",\n        \"component_type\": \"Rigidbody\",\n        \"properties\": {\"useGravity\": false, \"isKinematic\": true}\n    }}\n])\n```\n\n### Script Overwrites with `manage_script(action=\"update\")`\n\nWhen a generated script needs to be rewritten (e.g., to add auto-wiring logic), use `update` instead of deleting and recreating:\n\n```python\nmanage_script(\n    action=\"update\",\n    path=\"Assets/Scripts/MyScript.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class MyScript : MonoBehaviour { ... }\"\n)\n# manage_script update auto-triggers import + compile — just wait and check console\n# Read mcpforunity://editor/state → wait until is_compiling == false\nread_console(types=[\"error\"], count=10)\n```\n\n---\n\n## Scene Creation Workflows\n\n### Create Complete Scene from Scratch\n\n```python\n# 1. Create new scene\nmanage_scene(action=\"create\", name=\"GameLevel\", path=\"Assets/Scenes/\")\n\n# 2. Batch create environment objects\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Ground\", \"primitive_type\": \"Plane\",\n        \"position\": [0, 0, 0], \"scale\": [10, 1, 10]\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Light\", \"primitive_type\": \"Cube\"\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Player\", \"primitive_type\": \"Capsule\",\n        \"position\": [0, 1, 0]\n    }}\n])\n\n# 3. Add light component (delete cube mesh, add light)\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshRenderer\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshFilter\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"BoxCollider\")\nmanage_components(action=\"add\", target=\"Light\", component_type=\"Light\")\nmanage_components(action=\"set_property\", target=\"Light\", component_type=\"Light\",\n    property=\"type\", value=\"Directional\")\n\n# 4. Set up camera\nmanage_gameobject(action=\"modify\", target=\"Main Camera\", position=[0, 5, -10],\n    rotation=[30, 0, 0])\n\n# 5. Verify with screenshot\nmanage_camera(action=\"screenshot\")\n\n# 6. Save scene\nmanage_scene(action=\"save\")\n```\n\n### Populate Scene with Grid of Objects\n\n```python\n# Create 5x5 grid of cubes using batch\ncommands = []\nfor x in range(5):\n    for z in range(5):\n        commands.append({\n            \"tool\": \"manage_gameobject\",\n            \"params\": {\n                \"action\": \"create\",\n                \"name\": f\"Cube_{x}_{z}\",\n                \"primitive_type\": \"Cube\",\n                \"position\": [x * 2, 0, z * 2]\n            }\n        })\n\n# Execute in batches of 25\nbatch_execute(commands=commands[:25], parallel=True)\n```\n\n### Clone and Arrange Objects\n\n```python\n# Find template object\nresult = find_gameobjects(search_term=\"Template\", search_method=\"by_name\")\ntemplate_id = result[\"ids\"][0]\n\n# Duplicate in a line\nfor i in range(10):\n    manage_gameobject(\n        action=\"duplicate\",\n        target=template_id,\n        new_name=f\"Instance_{i}\",\n        offset=[i * 2, 0, 0]\n    )\n```\n\n---\n\n## Script Development Workflows\n\n### Create New Script and Attach\n\n```python\n# 1. Create script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/EnemyAI.cs\",\n    contents='''using UnityEngine;\n\npublic class EnemyAI : MonoBehaviour\n{\n    public float speed = 5f;\n    public Transform target;\n\n    void Update()\n    {\n        if (target != null)\n        {\n            Vector3 direction = (target.position - transform.position).normalized;\n            transform.position += direction * speed * Time.deltaTime;\n        }\n    }\n}'''\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for errors\nconsole = read_console(types=[\"error\"], count=10)\nif console[\"messages\"]:\n    # Handle compilation errors\n    print(\"Compilation errors:\", console[\"messages\"])\nelse:\n    # 4. Attach to GameObject\n    manage_gameobject(action=\"modify\", target=\"Enemy\", components_to_add=[\"EnemyAI\"])\n\n    # 5. Set component properties\n    manage_components(\n        action=\"set_property\",\n        target=\"Enemy\",\n        component_type=\"EnemyAI\",\n        properties={\n            \"speed\": 10.0\n        }\n    )\n```\n\n### Edit Existing Script Safely\n\n```python\n# 1. Get current SHA\nsha_info = get_sha(uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\")\n\n# 2. Find the method to edit\nmatches = find_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    pattern=\"void Update\\\\(\\\\)\"\n)\n\n# 3. Apply structured edit\nscript_apply_edits(\n    name=\"PlayerController\",\n    path=\"Assets/Scripts\",\n    edits=[{\n        \"op\": \"replace_method\",\n        \"methodName\": \"Update\",\n        \"replacement\": '''void Update()\n    {\n        float h = Input.GetAxis(\"Horizontal\");\n        float v = Input.GetAxis(\"Vertical\");\n        transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);\n    }'''\n    }]\n)\n\n# 4. Validate\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    level=\"standard\"\n)\n\n# 5. Wait for compilation (script_apply_edits auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 6. Check console\nread_console(types=[\"error\"], count=10)\n```\n\n### Add Method to Existing Class\n\n```python\nscript_apply_edits(\n    name=\"GameManager\",\n    path=\"Assets/Scripts\",\n    edits=[\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": '''\n    public void ResetGame()\n    {\n        SceneManager.LoadScene(SceneManager.GetActiveScene().name);\n    }'''\n        },\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"using UnityEngine;\",\n            \"position\": \"after\",\n            \"text\": \"\\nusing UnityEngine.SceneManagement;\"\n        }\n    ]\n)\n```\n\n---\n\n## Asset Management Workflows\n\n### Create and Apply Material\n\n```python\n# 1. Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    shader=\"Standard\",\n    properties={\n        \"_Color\": [0.2, 0.5, 1.0, 1.0],\n        \"_Metallic\": 0.5,\n        \"_Glossiness\": 0.8\n    }\n)\n\n# 2. Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"Player\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    slot=0\n)\n\n# 3. Verify visually\nmanage_camera(action=\"screenshot\")\n```\n\n### Create Procedural Texture\n\n```python\n# 1. Create base texture\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    width=256,\n    height=256,\n    fill_color=[255, 255, 255, 255]\n)\n\n# 2. Apply checkerboard pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    pattern=\"checkerboard\",\n    palette=[[0, 0, 0, 255], [255, 255, 255, 255]],\n    pattern_size=32\n)\n\n# 3. Create material with texture\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/CheckerMaterial.mat\",\n    shader=\"Standard\"\n)\n\n# 4. Assign texture to material (via manage_material set_material_shader_property)\n```\n\n### Organize Assets into Folders\n\n```python\n# 1. Create folder structure\nbatch_execute(commands=[\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Prefabs\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Materials\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Scripts\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Textures\"}}\n])\n\n# 2. Move existing assets\nmanage_asset(action=\"move\", path=\"Assets/MyMaterial.mat\", destination=\"Assets/Materials/MyMaterial.mat\")\nmanage_asset(action=\"move\", path=\"Assets/MyScript.cs\", destination=\"Assets/Scripts/MyScript.cs\")\n```\n\n### Search and Process Assets\n\n```python\n# Find all prefabs\nresult = manage_asset(\n    action=\"search\",\n    path=\"Assets\",\n    search_pattern=\"*.prefab\",\n    page_size=50,\n    generate_preview=False\n)\n\n# Process each prefab\nfor asset in result[\"assets\"]:\n    prefab_path = asset[\"path\"]\n    # Get prefab info\n    info = manage_prefabs(action=\"get_info\", prefab_path=prefab_path)\n    print(f\"Prefab: {prefab_path}, Children: {info['childCount']}\")\n```\n\n### Instantiate Prefab in Scene\n\nUse `manage_gameobject` (not `manage_prefabs`) to place prefab instances in the scene.\n\n```python\n# Full path\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"\n)\n\n# Smart lookup — just the prefab name works too\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Batch-spawn multiple instances\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": f\"Enemy_{i}\",\n        \"prefab_path\": \"Enemy\", \"position\": [i * 3, 0, 0], \"parent\": \"Enemies\"\n    }}\n    for i in range(5)\n])\n```\n\n> **Note:** `manage_prefabs` is for headless prefab editing (inspect, modify contents, create from GameObject). To *instantiate* a prefab into the scene, always use `manage_gameobject(action=\"create\", prefab_path=\"...\")`.\n\n---\n\n## Testing Workflows\n\n### Run Specific Tests\n\n```python\n# 1. List available tests\n# Read mcpforunity://tests/EditMode\n\n# 2. Run specific tests\nresult = run_tests(\n    mode=\"EditMode\",\n    test_names=[\"MyTests.TestPlayerMovement\", \"MyTests.TestEnemySpawn\"],\n    include_failed_tests=True\n)\njob_id = result[\"job_id\"]\n\n# 3. Wait for results\nfinal_result = get_test_job(\n    job_id=job_id,\n    wait_timeout=60,\n    include_failed_tests=True\n)\n\n# 4. Check results\nif final_result[\"status\"] == \"complete\":\n    for test in final_result.get(\"failed_tests\", []):\n        print(f\"FAILED: {test['name']}: {test['message']}\")\n```\n\n### Run Tests by Category\n\n```python\n# Run all unit tests\nresult = run_tests(\n    mode=\"EditMode\",\n    category_names=[\"Unit\"],\n    include_failed_tests=True\n)\n\n# Poll until complete\nwhile True:\n    status = get_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n    if status[\"status\"] in [\"complete\", \"failed\"]:\n        break\n```\n\n### Test-Driven Development Pattern\n\n```python\n# 1. Write test first\ncreate_script(\n    path=\"Assets/Tests/Editor/PlayerTests.cs\",\n    contents='''using NUnit.Framework;\nusing UnityEngine;\n\npublic class PlayerTests\n{\n    [Test]\n    public void TestPlayerStartsAtOrigin()\n    {\n        var player = new GameObject(\"TestPlayer\");\n        Assert.AreEqual(Vector3.zero, player.transform.position);\n        Object.DestroyImmediate(player);\n    }\n}'''\n)\n\n# 2. Wait for compilation (create_script auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Run test (expect pass for this simple test)\nresult = run_tests(mode=\"EditMode\", test_names=[\"PlayerTests.TestPlayerStartsAtOrigin\"])\nget_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n```\n\n---\n\n## Debugging Workflows\n\n### Diagnose Compilation Errors\n\n```python\n# 1. Check console for errors\nerrors = read_console(\n    types=[\"error\"],\n    count=20,\n    include_stacktrace=True,\n    format=\"detailed\"\n)\n\n# 2. For each error, find the file and line\nfor error in errors[\"messages\"]:\n    # Parse error message for file:line info\n    # Use find_in_file to locate the problematic code\n    pass\n\n# 3. After fixing, refresh and check again\nrefresh_unity(mode=\"force\", scope=\"scripts\", compile=\"request\", wait_for_ready=True)\nread_console(types=[\"error\"], count=10)\n```\n\n### Investigate Missing References\n\n```python\n# 1. Find the GameObject\nresult = find_gameobjects(search_term=\"Player\", search_method=\"by_name\")\n\n# 2. Get all components\n# Read mcpforunity://scene/gameobject/{id}/components\n\n# 3. Check for null references in serialized fields\n# Look for fields with null/missing values\n\n# 4. Find the referenced object\nresult = find_gameobjects(search_term=\"Target\", search_method=\"by_name\")\n\n# 5. Set the reference\nmanage_components(\n    action=\"set_property\",\n    target=\"Player\",\n    component_type=\"PlayerController\",\n    property=\"target\",\n    value={\"instanceID\": result[\"ids\"][0]}  # Reference by ID\n)\n```\n\n### Check Scene State\n\n```python\n# 1. Get hierarchy\nhierarchy = manage_scene(action=\"get_hierarchy\", page_size=100, include_transform=True)\n\n# 2. Find objects at unexpected positions\nfor item in hierarchy[\"data\"][\"items\"]:\n    if item.get(\"transform\", {}).get(\"position\", [0,0,0])[1] < -100:\n        print(f\"Object {item['name']} fell through floor!\")\n\n# 3. Visual verification\nmanage_camera(action=\"screenshot\")\n```\n\n---\n\n## UI Creation Workflows\n\nUnity has two UI systems: **UI Toolkit** (modern, recommended) and **uGUI** (Canvas-based, legacy). Use `manage_ui` for UI Toolkit workflows, and `batch_execute` with `manage_gameobject` + `manage_components` for uGUI.\n\n> **Template warning:** This section is a skill template library, not a guaranteed source of truth. Examples may be inaccurate for your Unity version, package setup, or project conventions.\n> **Use safely:**\n> 1. **Always read `mcpforunity://project/info` first** to detect installed packages and input system.\n> 2. Validate component/property names against the current project.\n> 3. Prefer targeting by instance ID or full path over generic names.\n> 4. Treat numeric enum values as placeholders and verify before reuse.\n\n### Step 0: Detect Project UI Capabilities\n\n**Before creating any UI**, read project info to determine which packages and input system are available.\n\n```python\n# Read mcpforunity://project/info — returns:\n# {\n#   \"renderPipeline\": \"BuiltIn\" | \"Universal\" | \"HighDefinition\" | \"Custom\",\n#   \"activeInputHandler\": \"Old\" | \"New\" | \"Both\",\n#   \"packages\": {\n#     \"ugui\": true/false,        — com.unity.ugui (Canvas, Image, Button, etc.)\n#     \"textmeshpro\": true/false,  — com.unity.textmeshpro (TextMeshProUGUI)\n#     \"inputsystem\": true/false,  — com.unity.inputsystem (new Input System)\n#     \"uiToolkit\": true/false,    — UI Toolkit (always true for Unity 2021.3+)\n#     \"screenCapture\": true/false  — ScreenCapture module enabled\n#   }\n# }\n```\n\n**Decision matrix:**\n\n| project_info field | Value | What to use |\n|---|---|---|\n| `packages.uiToolkit` | `true` | **Preferred:** Use `manage_ui` for UI Toolkit (UXML/USS) |\n| `packages.ugui` | `true` | Canvas-based UI (Image, Button, etc.) via `batch_execute` |\n| `packages.textmeshpro` | `true` | `TextMeshProUGUI` for text (uGUI) |\n| `packages.textmeshpro` | `false` | `UnityEngine.UI.Text` (legacy, lower quality) |\n| `activeInputHandler` | `\"Old\"` | `StandaloneInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"New\"` | `InputSystemUIInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"Both\"` | Either works; prefer `InputSystemUIInputModule` for UI |\n\n### UI Toolkit Workflows (manage_ui)\n\nUI Toolkit uses a web-like approach: **UXML** (like HTML) for structure, **USS** (like CSS) for styling. This is the preferred UI system for new projects.\n\n> **Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n#### Create a Complete UI Screen\n\n```python\n# 1. Create UXML document (structure)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='''<ui:UXML xmlns:ui=\"UnityEngine.UIElements\" xmlns:uie=\"UnityEditor.UIElements\">\n    <ui:Style src=\"Assets/UI/MainMenu.uss\" />\n    <ui:VisualElement name=\"root\" class=\"root-container\">\n        <ui:Label text=\"My Game\" class=\"title\" />\n        <ui:Button text=\"Play\" name=\"play-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Settings\" name=\"settings-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Quit\" name=\"quit-btn\" class=\"menu-button\" />\n    </ui:VisualElement>\n</ui:UXML>'''\n)\n\n# 2. Create USS stylesheet (styling)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents='''.root-container {\n    flex-grow: 1;\n    justify-content: center;\n    align-items: center;\n    background-color: rgba(0, 0, 0, 0.8);\n}\n.title {\n    font-size: 48px;\n    color: white;\n    -unity-font-style: bold;\n    margin-bottom: 40px;\n}\n.menu-button {\n    width: 300px;\n    height: 60px;\n    font-size: 24px;\n    margin: 8px;\n    background-color: rgb(50, 120, 200);\n    color: white;\n    border-radius: 8px;\n}\n.menu-button:hover {\n    background-color: rgb(70, 140, 220);\n}'''\n)\n\n# 3. Create a GameObject and attach UIDocument\nmanage_gameobject(action=\"create\", name=\"UIRoot\")\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\"\n    # panel_settings auto-created if omitted\n)\n\n# 4. Verify the visual tree\nmanage_ui(action=\"get_visual_tree\", target=\"UIRoot\", max_depth=5)\n```\n\n#### Update Existing UI\n\n```python\n# Read current content\nresult = manage_ui(action=\"read\", path=\"Assets/UI/MainMenu.uss\")\n# Modify and update\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents=\".title { font-size: 64px; color: yellow; }\"\n)\n```\n\n#### Custom PanelSettings\n\n```python\n# Create PanelSettings with ScaleWithScreenSize\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/GamePanelSettings.asset\",\n    scale_mode=\"ScaleWithScreenSize\",\n    reference_resolution={\"width\": 1920, \"height\": 1080}\n)\n\n# Attach UIDocument with custom PanelSettings\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/GamePanelSettings.asset\"\n)\n```\n\n### uGUI (Canvas-Based) Workflows\n\nThe sections below cover legacy Canvas-based UI using `batch_execute`. Use these when working with existing uGUI projects or when UI Toolkit is not suitable.\n\n### RectTransform Sizing (Critical for All UI Children)\n\nEvery GameObject under a Canvas gets a `RectTransform` instead of `Transform`. **Without setting anchor/size, UI elements default to zero size and won't be visible.** Use `set_property` on `RectTransform`:\n\n```python\n# Stretch to fill parent (common for panels/backgrounds)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyPanel\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 0],        # bottom-left corner\n        \"anchorMax\": [1, 1],        # top-right corner\n        \"sizeDelta\": [0, 0],        # no extra size beyond anchors\n        \"anchoredPosition\": [0, 0]  # centered on anchors\n    }\n}}\n\n# Fixed-size centered element (e.g. 300x50 button)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyButton\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0.5, 0.5],\n        \"anchorMax\": [0.5, 0.5],\n        \"sizeDelta\": [300, 50],\n        \"anchoredPosition\": [0, 0]\n    }\n}}\n\n# Top-anchored bar (e.g. health bar at top of screen)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"TopBar\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 1],        # left-top\n        \"anchorMax\": [1, 1],        # right-top (stretch horizontally)\n        \"sizeDelta\": [0, 60],       # 60px tall, full width\n        \"anchoredPosition\": [0, -30] # offset down by half height\n    }\n}}\n```\n\n> **Note:** Vector2 properties accept both `[x, y]` array format and `{\"x\": ..., \"y\": ...}` object format.\n\n### Create Canvas (Foundation for All UI)\n\nEvery UI element must be under a Canvas. A Canvas requires three components: `Canvas`, `CanvasScaler`, and `GraphicRaycaster`.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"Canvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"CanvasScaler\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"GraphicRaycaster\"\n    }},\n    # renderMode: 0=ScreenSpaceOverlay, 1=ScreenSpaceCamera, 2=WorldSpace\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0\n    }},\n    # CanvasScaler: uiScaleMode 1=ScaleWithScreenSize\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"uiScaleMode\", \"value\": 1\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"referenceResolution\",\n        \"value\": [1920, 1080]\n    }}\n])\n```\n\n### Create EventSystem (Required Once Per Scene for UI Interaction)\n\nIf no EventSystem exists in the scene, buttons and other interactive UI elements won't respond to input. Create one alongside your first Canvas. **Check `project_info.activeInputHandler` to pick the correct input module.**\n\n```python\n# For activeInputHandler == \"New\" or \"Both\" (project has Input System package):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.InputSystem.UI.InputSystemUIInputModule\"\n    }}\n])\n\n# For activeInputHandler == \"Old\" (legacy Input Manager only):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"\n    }}\n])\n```\n\n### Create Panel (Background Container)\n\nA Panel is an Image component used as a background/container for other UI elements.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.1, 0.1, 0.1, 0.8]\n    }},\n    # Size the panel (stretch to 60% of canvas, centered)\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.2, 0.1], \"anchorMax\": [0.8, 0.9],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Text (TextMeshPro)\n\nTextMeshProUGUI automatically adds a RectTransform when added to a child of a Canvas. If `packages.textmeshpro` is `false`, use `UnityEngine.UI.Text` instead.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"TitleText\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\n            \"text\": \"My Game Title\",\n            \"fontSize\": 48,\n            \"alignment\": 514,\n            \"color\": [1, 1, 1, 1]\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0.8], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n> **TextMeshPro alignment values:** 257=TopLeft, 258=TopCenter, 260=TopRight, 513=MiddleLeft, 514=MiddleCenter, 516=MiddleRight, 1025=BottomLeft, 1026=BottomCenter, 1028=BottomRight.\n\n### Create Button (With Label)\n\nA Button needs an `Image` (visual) + `Button` (interaction) on the parent, and a child with `TextMeshProUGUI` for the label.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Button\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.2, 0.6, 1.0, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [300, 60], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Child text label (stretches to fill button)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton_Label\", \"parent\": \"StartButton\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Start Game\", \"fontSize\": 24, \"alignment\": 514}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Slider (With Reference Wiring)\n\nA Slider requires a specific hierarchy and **must have its `fillRect` and `handleRect` references wired** to function.\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HealthSlider\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Slider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderBG\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.3, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Fill Area + Fill\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"FillArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"FillArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderFill\", \"parent\": \"FillArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderFill\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.8, 0.2, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Handle Area + Handle\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HandleArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HandleArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderHandle\", \"parent\": \"HandleArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderHandle\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderHandle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.5, 0], \"anchorMax\": [0.5, 1], \"sizeDelta\": [20, 0]}\n    }}\n])\n\n# Step 2: Wire Slider references (CRITICAL — slider won't work without this)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"fillRect\",\n        \"value\": {\"name\": \"SliderFill\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"handleRect\",\n        \"value\": {\"name\": \"SliderHandle\"}\n    }}\n])\n```\n\n### Create Input Field (With Reference Wiring)\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"NameInput\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 50], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Text Area child (clips text to input bounds)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputTextArea\", \"parent\": \"NameInput\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputTextArea\", \"component_type\": \"RectMask2D\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputTextArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-16, -8]}\n    }},\n    # Placeholder\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputPlaceholder\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputPlaceholder\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Enter name...\", \"fontStyle\": 2, \"color\": [0.5, 0.5, 0.5, 0.5]}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Actual text display\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputText\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputText\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }}\n])\n\n# Step 2: Wire TMP_InputField references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textViewport\",\n        \"value\": {\"name\": \"InputTextArea\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textComponent\",\n        \"value\": {\"name\": \"InputText\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"placeholder\",\n        \"value\": {\"name\": \"InputPlaceholder\"}\n    }}\n])\n```\n\n### Create Toggle (With Reference Wiring)\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SoundToggle\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SoundToggle\", \"component_type\": \"Toggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [200, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background box\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleBG\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0.5], \"anchorMax\": [0, 0.5], \"sizeDelta\": [26, 26], \"anchoredPosition\": [13, 0]}\n    }},\n    # Checkmark\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleCheckmark\", \"parent\": \"ToggleBG\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleCheckmark\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleCheckmark\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.1, 0.1], \"anchorMax\": [0.9, 0.9], \"sizeDelta\": [0, 0]}\n    }},\n    # Label\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleLabel\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleLabel\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Sound Effects\", \"fontSize\": 18, \"alignment\": 513}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-35, 0], \"anchoredPosition\": [17.5, 0]}\n    }}\n])\n\n# Wire Toggle references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"Toggle\", \"property\": \"graphic\",\n        \"value\": {\"name\": \"ToggleCheckmark\"}\n    }}\n])\n```\n\n### Add Layout Group (Vertical/Horizontal/Grid)\n\nLayout groups auto-arrange child elements, so you can skip manual RectTransform positioning for children.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\",\n        \"properties\": {\n            \"spacing\": 10,\n            \"childAlignment\": 4,\n            \"childForceExpandWidth\": True,\n            \"childForceExpandHeight\": False,\n            \"padding\": {\"left\": 20, \"right\": 20, \"top\": 20, \"bottom\": 20}\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\",\n        \"properties\": { \"verticalFit\": 2 }\n    }}\n])\n```\n\n> **childAlignment values:** 0=UpperLeft, 1=UpperCenter, 2=UpperRight, 3=MiddleLeft, 4=MiddleCenter, 5=MiddleRight, 6=LowerLeft, 7=LowerCenter, 8=LowerRight.\n> **ContentSizeFitter fit modes:** 0=Unconstrained, 1=MinSize, 2=PreferredSize.\n\n### Complete Example: Main Menu Screen\n\nCombines multiple templates into a full menu screen in two batch calls (default 25 command limit per batch, configurable in Unity MCP Tools window up to 100). **Assumes `project_info` has been read and `activeInputHandler` is known.**\n\n```python\n# Batch 1: Canvas + EventSystem + Panel + Title\nbatch_execute(fail_fast=True, commands=[\n    # Canvas\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"GraphicRaycaster\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\", \"properties\": {\"uiScaleMode\": 1, \"referenceResolution\": [1920, 1080]}}},\n    # EventSystem — use StandaloneInputModule OR InputSystemUIInputModule based on project_info\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"}},\n    # Panel (centered, 60% width)\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.1, 0.1, 0.15, 0.9]}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0.2, 0.15], \"anchorMax\": [0.8, 0.85], \"sizeDelta\": [0, 0]}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\", \"properties\": {\"spacing\": 20, \"childAlignment\": 4, \"childForceExpandWidth\": True, \"childForceExpandHeight\": False}}},\n    # Title\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Title\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"My Game\", \"fontSize\": 64, \"alignment\": 514, \"color\": [1, 1, 1, 1]}}}\n])\n\n# Batch 2: Buttons\nbatch_execute(fail_fast=True, commands=[\n    # Play Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.6, 1.0, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayLabel\", \"parent\": \"PlayButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Play\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Settings Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.35, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsLabel\", \"parent\": \"SettingsButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Settings\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Quit Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.8, 0.2, 0.2, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitLabel\", \"parent\": \"QuitButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Quit\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}}\n])\n```\n\n### UI Component Quick Reference\n\n| UI Element | Required Components | Notes |\n| ---------- | ------------------- | ----- |\n| **Canvas** | Canvas + CanvasScaler + GraphicRaycaster | Root for all UI. One per screen. |\n| **EventSystem** | EventSystem + input module (see below) | One per scene. Required for interaction. |\n| **Panel** | Image + RectTransform sizing | Container. Set color for background. |\n| **Text** | TextMeshProUGUI (or Text if no TMP) + RectTransform | Check `packages.textmeshpro`. |\n| **Button** | Image + Button + child(TextMeshProUGUI) + RectTransform | Image = visual, Button = click handler. |\n| **Slider** | Slider + Image + children + **wire fillRect/handleRect** | Won't function without wiring. |\n| **Toggle** | Toggle + children + **wire graphic** | Wire checkmark Image to `graphic`. |\n| **Input Field** | Image + TMP_InputField + children + **wire textViewport/textComponent/placeholder** | Won't function without wiring. |\n| **Layout Group** | VerticalLayoutGroup / HorizontalLayoutGroup / GridLayoutGroup | Auto-arranges children; skip manual RectTransform on children. |\n\n---\n\n## Input System: Old vs New\n\nUnity has two input systems that affect UI interaction, script input handling, and EventSystem confi",".claude/skills/blender-to-unity/manual-verify.md":"# Blender-to-unity Skill\n\nPath: `.claude/skills/blender-to-unity/manual-verify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/manual-verify.md)","TestProjects/UnityMCPTests/Packages/manifest.json":"# Packages Skill\n\nPath: `TestProjects/UnityMCPTests/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/Packages/manifest.json)","TestProjects/AssetStoreUploads/Packages/manifest.json":"# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/manifest.json)","TestProjects/AssetStoreUploads/Packages/packages-lock.json":"# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/packages-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/packages-lock.json)",".claude/skills/unity-mcp-skill/references/tools-reference.md":"# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/tools-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/tools-reference.md)",".claude/skills/unity-mcp-skill/references/workflows.md":"# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/workflows.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/workflows.md)",".claude/skills/blender-to-unity/references/bridge-fidelity.md":"# References Skill\n\nPath: `.claude/skills/blender-to-unity/references/bridge-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/references/bridge-fidelity.md)","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md)","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md)","TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json)","website/docs/reference/tools/index.md":"# Tools Skill\n\nPath: `website/docs/reference/tools/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/index.md)","TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json":"# Com.unity.testtools.codecoverage Skill\n\nPath: `TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json)","website/docs/reference/tools/docs/_category_.json":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/_category_.json)","website/docs/reference/tools/docs/index.md":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/index.md)","website/docs/reference/tools/docs/unity_docs.md":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/unity_docs.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_docs.md)","website/docs/reference/tools/docs/unity_reflect.md":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/unity_reflect.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_reflect.md)","website/docs/reference/tools/core/_category_.json":"# Core Skill\n\nPath: `website/docs/reference/tools/core/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/_category_.json)","website/docs/reference/tools/core/apply_text_edits.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/apply_text_edits.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/apply_text_edits.md)","website/docs/reference/tools/core/batch_execute.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/batch_execute.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/batch_execute.md)","website/docs/reference/tools/core/create_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/create_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/create_script.md)","website/docs/reference/tools/core/debug_request_context.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/debug_request_context.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/debug_request_context.md)","website/docs/reference/tools/core/delete_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/delete_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/delete_script.md)","website/docs/reference/tools/core/execute_custom_tool.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/execute_custom_tool.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_custom_tool.md)","website/docs/reference/tools/core/execute_menu_item.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/execute_menu_item.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_menu_item.md)","website/docs/reference/tools/core/find_gameobjects.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/find_gameobjects.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_gameobjects.md)","website/docs/reference/tools/core/find_in_file.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/find_in_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_in_file.md)","website/docs/reference/tools/core/get_sha.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/get_sha.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/get_sha.md)","website/docs/reference/tools/core/index.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/index.md)","website/docs/reference/tools/core/manage_asset.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_asset.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_asset.md)","website/docs/reference/tools/core/manage_build.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_build.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_build.md)","website/docs/reference/tools/core/manage_camera.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_camera.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_camera.md)","website/docs/reference/tools/core/manage_components.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_components.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_components.md)","website/docs/reference/tools/core/manage_editor.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_editor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_editor.md)","website/docs/reference/tools/core/manage_gameobject.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_gameobject.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_gameobject.md)","website/docs/reference/tools/core/manage_graphics.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_graphics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_graphics.md)","website/docs/reference/tools/core/manage_material.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_material.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_material.md)","website/docs/reference/tools/core/manage_packages.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_packages.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_packages.md)","website/docs/reference/tools/core/manage_physics.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_physics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_physics.md)","website/docs/reference/tools/core/manage_prefabs.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_prefabs.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_prefabs.md)","website/docs/reference/tools/core/manage_scene.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_scene.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_scene.md)","website/docs/reference/tools/core/manage_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script.md)","website/docs/reference/tools/core/manage_script_capabilities.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_script_capabilities.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script_capabilities.md)","website/docs/reference/tools/core/manage_tools.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_tools.md)","website/docs/reference/tools/core/read_console.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/read_console.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/read_console.md)","website/docs/reference/tools/core/refresh_unity.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/refresh_unity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/refresh_unity.md)","website/docs/reference/tools/core/script_apply_edits.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/script_apply_edits.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/script_apply_edits.md)","website/docs/reference/tools/core/set_active_instance.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/set_active_instance.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/set_active_instance.md)","website/docs/reference/tools/core/validate_script.md":"# Core Skill\n\nPath: `website/docs/reference/tools/core/validate_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/validate_script.md)","website/docs/reference/tools/asset_gen/_category_.json":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/_category_.json)","website/docs/reference/tools/asset_gen/generate_audio.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_audio.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_audio.md)","website/docs/reference/tools/asset_gen/generate_image.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_image.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_image.md)","website/docs/reference/tools/asset_gen/generate_model.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_model.md)","website/docs/reference/tools/asset_gen/import_model.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model.md)","website/docs/reference/tools/asset_gen/import_model_file.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model_file.md)","website/docs/reference/tools/asset_gen/index.md":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/index.md)","website/docs/reference/tools/animation/_category_.json":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/_category_.json)","website/docs/reference/tools/animation/index.md":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/index.md)","website/docs/reference/tools/animation/manage_animation.md":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/manage_animation.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/manage_animation.md)","website/docs/reference/tools/probuilder/_category_.json":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/_category_.json)","website/docs/reference/tools/probuilder/index.md":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/index.md)","website/docs/reference/tools/probuilder/manage_probuilder.md":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/manage_probuilder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/manage_probuilder.md)","website/docs/reference/tools/profiling/_category_.json":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/_category_.json)","website/docs/reference/tools/profiling/index.md":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/index.md)","website/docs/reference/tools/profiling/manage_profiler.md":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/manage_profiler.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/manage_profiler.md)","website/docs/reference/tools/scripting_ext/_category_.json":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/_category_.json)","website/docs/reference/tools/scripting_ext/execute_code.md":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/execute_code.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/execute_code.md)","website/docs/reference/tools/scripting_ext/index.md":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/index.md)","website/docs/reference/tools/scripting_ext/manage_scriptable_object.md":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/manage_scriptable_object.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/manage_scriptable_object.md)","website/docs/reference/tools/testing/_category_.json":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/_category_.json)","website/docs/reference/tools/testing/get_test_job.md":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/get_test_job.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/get_test_job.md)","website/docs/reference/tools/testing/index.md":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/index.md)","website/docs/reference/tools/testing/run_tests.md":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/run_tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/run_tests.md)","website/docs/reference/tools/ui/_category_.json":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/_category_.json)","website/docs/reference/tools/ui/index.md":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/index.md)","website/docs/reference/tools/ui/manage_ui.md":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/manage_ui.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/manage_ui.md)","website/docs/reference/tools/vfx/_category_.json":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/_category_.json)","website/docs/reference/tools/vfx/index.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/index.md)","website/docs/reference/tools/vfx/manage_shader.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_shader.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_shader.md)","website/docs/reference/tools/vfx/manage_texture.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_texture.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_texture.md)","website/docs/reference/tools/vfx/manage_vfx.md":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_vfx.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_vfx.md)"},"items":[{"name":"manual-verify.md","path":".claude/skills/blender-to-unity/manual-verify.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/manual-verify.md","title":"Blender-to-unity Skill","category":"anthropic-skill","format":"markdown","content":"# Blender-to-unity Skill\n\nPath: `.claude/skills/blender-to-unity/manual-verify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/manual-verify.md)","tokens":300,"sizeBytes":221},{"name":"bridge-fidelity.md","path":".claude/skills/blender-to-unity/references/bridge-fidelity.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/references/bridge-fidelity.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.claude/skills/blender-to-unity/references/bridge-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/references/bridge-fidelity.md)","tokens":300,"sizeBytes":241},{"name":"SKILL.md","path":".claude/skills/blender-to-unity/SKILL.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/SKILL.md","title":"blender-to-unity","category":"anthropic-skill","format":"markdown","content":"---\nname: blender-to-unity\ndescription: Hand off a model from Blender (via BlenderMCP) into Unity (via MCP for Unity) — export the current Blender model, import it through import_model_file, and place it in the open scene. Use when the user has BlenderMCP and MCP for Unity both connected and wants to bring a Blender model into Unity. Does NOT drive Blender's own generators; BlenderMCP owns how the model got into Blender.\n---\n\n# Blender → Unity Model Handoff\n\nBring whatever model is currently in Blender into the open Unity scene. The seam is the\nlocal filesystem: Blender exports a file, Unity imports it. The two servers never talk\ndirectly.\n\n## Preconditions\n- Both `mcp__blender__*` tools and MCP for Unity tools are connected.\n- A model exists in the Blender scene (confirm with `mcp__blender__get_scene_info` /\n  `mcp__blender__get_object_info`). If empty, stop and tell the user — this skill does not generate models.\n- **`import_model_file` is in the `asset_gen` tool group, which is off by default** (only `core`\n  loads). Enable it first with `manage_tools` (enable the `asset_gen` group), **or** call the C#\n  handler straight through `batch_execute` —\n  `{\"tool\":\"import_model_file\",\"params\":{\"sourcePath\":...,\"name\":...,\"outputFolder\":...}}` (camelCase)\n  — which dispatches by name regardless of group gating.\n\n## Steps\n1. **Resolve the Unity project path.** Read `mcpforunity://editor/state` for the project\n   root (the editor dataPath's parent). Decide the export format:\n   - **GLB (glTFast) when the model has a rig, animation, PBR (metallic/roughness), emission,\n     or transparency** — glTFast carries all of these automatically, no post-processing\n     (see [references/bridge-fidelity.md](references/bridge-fidelity.md)). Multi-material zones\n     survive either format, so they alone don't force GLB.\n   - **FBX otherwise** — when glTFast isn't installed, the model is plain geometry, or you\n     specifically need the built-in importer's humanoid-avatar pipeline. FBX drops emission/metallic\n     (Step 5 restores emission) and surfaces animation only with `animation_type` set (Step 3).\n2. **Export from Blender to a temp path** via `mcp__blender__execute_blender_code`:\n   ```python\n   import bpy, os, tempfile\n   out = os.path.join(tempfile.gettempdir(), \"blender_to_unity.fbx\")\n   # Export the selection if any, else the whole scene:\n   bpy.ops.export_scene.fbx(filepath=out, use_selection=bool(bpy.context.selected_objects),\n                            apply_unit_scale=True, bake_space_transform=True)\n   print(out)\n   ```\n   (glTF branch: `out_glb = os.path.join(tempfile.gettempdir(), \"blender_to_unity.glb\")`, then\n   `bpy.ops.export_scene.gltf(filepath=out_glb, export_format='GLB', use_active_scene=True)`\n   — its default `use_active_scene=False` can silently export a *different* open scene.)\n3. **Import into Unity** with `import_model_file`:\n   `import_model_file(source_path=<temp path>, name=<asset name>, target_size=<final size in meters>)`.\n   For a **rigged/animated FBX**, also pass `animation_type=\"generic\"` (or `\"humanoid\"`; `\"legacy\"`\n   targets the old Animation-component system) — the importer defaults to `\"none\"`, which\n   deliberately imports the mesh with **zero animation clips**. GLB ignores this (glTFast imports\n   animation itself), so it's an FBX-only knob.\n   It returns `{ asset_path, asset_guid }`. Pass `target_size` as the intended final size, but treat\n   it only as a hint: it rescales at import solely when the project's **Auto-normalize** pref is on,\n   and even then is unreliable for Blender FBX (see the **Scale** note). Step 4 does the reliable\n   normalization.\n4. **Place it in the scene, normalized to size.** Ensure the scene has a camera + directional\n   light (`manage_scene` / `manage_gameobject`). Instantiate the model at the chosen position via\n   `manage_gameobject(action=\"create\", prefab_path=<asset_path>, name=<asset name>, position=[x,y,z])`.\n   Then normalize its size deterministically — Blender FBX commonly imports ~100× too large — by\n   measuring the placed model's world bounds and scaling so its largest dimension equals your target\n   size. Run via `execute_code` (substitute your object name and target meters):\n   ```csharp\n   var go = GameObject.Find(\"<asset name>\");\n   var rs = go.GetComponentsInChildren<Renderer>();\n   var b = rs[0].bounds; for (int i = 1; i < rs.Length; i++) b.Encapsulate(rs[i].bounds);\n   float maxDim = Mathf.Max(b.size.x, Mathf.Max(b.size.y, b.size.z));\n   float target = 2f; // intended size in meters\n   if (maxDim > 0.0001f) go.transform.localScale *= target / maxDim;\n   ```\n5. **Restore emission FBX dropped (FBX path).** Blender scenes commonly store their color/glow\n   in *material emission* (and other Principled-node inputs). FBX carries base/diffuse color but\n   **not emission**, so neon / \"Tron\" scenes import as dark bodies with black accents. If the\n   import looks flat vs. Blender, restore it:\n   a. Dump the emissive materials from Blender via `execute_blender_code`:\n      ```python\n      import bpy, json\n      out = {}\n      for m in bpy.data.materials:\n          if not (m.use_nodes and m.node_tree): continue\n          col, s = (0, 0, 0), 0.0\n          p = next((n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None)\n          es = next((k for k in ('Emission Color', 'Emission') if p and k in p.inputs), None)  # 4.x / 3.x name\n          if es:\n              col = tuple(p.inputs[es].default_value)[:3]\n              s = float(p.inputs['Emission Strength'].default_value)\n          e = next((n for n in m.node_tree.nodes if n.type == 'EMISSION'), None)\n          if e and s == 0:\n              col = tuple(e.inputs['Color'].default_value)[:3]; s = float(e.inputs['Strength'].default_value)\n          if s > 0 and sum(col) > 0.01:\n              out[m.name] = [round(col[0], 3), round(col[1], 3), round(col[2], 3), round(s, 3)]\n      print(json.dumps(out))\n      ```\n   b. In Unity (`execute_code`): extract the FBX's materials so they're editable\n      (`AssetDatabase.ExtractAsset` per `Material`, then `ImportAsset(fbx, ForceUpdate)`), then for\n      each dumped name set `_EmissionColor = color * Mathf.Clamp(strength*0.45f, 1.5f, 5f)`,\n      `EnableKeyword(\"_EMISSION\")`, and `globalIlluminationFlags = RealtimeEmissive`. Match names\n      **case-insensitively** — FBX mangles case and can split one material into variants\n      (`EdgeCyan` → `EdgeCyan` + `EDGE_CYAN`); set every match. Add a global Bloom volume and enable\n      the camera's `renderPostProcessing` so the emission actually glows.\n6. **Verify** with `manage_camera(action=\"screenshot\", include_image=true)` and report the\n   asset path + a screenshot.\n\n## Notes\n- **Scale.** Models from Blender almost always arrive at the wrong scale — its FBX unit handling\n  makes them land ~100× too large in Unity. `import_model_file`'s `target_size` only rescales at\n  import when the project's Auto-normalize pref is enabled, and its importer-level normalization is\n  unreliable for Blender FBX (it can over- or under-shoot, e.g. a `target_size=2` model measured 200 m).\n  The robust fix is the Step 4 measure-bounds-then-set-`localScale` routine, which hits the target\n  size deterministically regardless of the import scale or the Auto-normalize pref.\n- **Materials & emission.** FBX carries base/diffuse color and transforms fine, but **drops\n  emission and any node-based color** — so Blender neon / \"Tron\" scenes (color stored in\n  emission) import as dark bodies with black accents. Two fixes: **(a) prefer glTF/GLB when glTFast\n  is installed** — glTF's PBR model carries `emissiveFactor` + `KHR_materials_emissive_strength`\n  natively, so emission survives with no post-step (`bpy.ops.export_scene.gltf(filepath=out, export_format='GLB', use_active_scene=True)`);\n  **(b) with FBX, run Step 5** to dump Blender's emission and reapply it. Also check the mesh for a\n  `color_attributes` (vertex color) layer — the *data* survives FBX, but URP Lit won't *display* it;\n  that needs a vertex-color-reading shader, not `_EmissionColor`.\n- FBX is the default because glTFast is optional in MCP for Unity. If the import errors with\n  \"GLB import requires glTFast\", re-export as FBX (or install glTFast from the Dependencies tab).\n- **Format fidelity.** [references/bridge-fidelity.md](references/bridge-fidelity.md) is a tested\n  matrix of what each format carries. Summary: **GLB (glTFast)** keeps textures, metallic/roughness,\n  emission, transparency, and animation automatically; **FBX** drops metallic + emission, needs\n  `ModelImporter.animationType = Generic` to surface transform animation, and needs material/texture\n  extraction to assign an embedded texture. Both bake modifiers and carry geometry + vertex-color\n  *data* (URP Lit won't *display* vertex colors). Neither carries procedural/node materials — bake\n  them to image textures in Blender first.\n- **Animation doesn't auto-play.** An imported clip won't move the model until an `AnimatorController`\n  drives it — the placed model has an `Animator` with a **null controller**, so it looks frozen. Build\n  one with `manage_animation` (`controller_create` → add the clip as a looping state → `controller_assign`\n  onto the instance) rather than hand-rolling `execute_code`. See bridge-fidelity gotcha #7.\n- **Multi-material zones survive.** A mesh split into material slots in Blender (e.g. skin/shirt/pants\n  regions) imports as submeshes with one material each — base colors carry over GLB natively — so you\n  can \"dress\" a model with material zones and it arrives intact.\n- Keep one model per handoff; for batches, repeat the loop with distinct names.\n- This skill never sends API keys or file bytes over the MCP bridge — Unity reads the file from disk.\n- `import_model_file` copies only the single source file; for multi-file exports (a text `.gltf` with an external `.bin`, or an `.obj` with a sibling `.mtl`/textures), zip them first and pass the `.zip` — a bare `.gltf`/`.obj` will lose its sidecars.\n","frontmatter":{"name":"blender-to-unity","description":"Hand off a model from Blender (via BlenderMCP) into Unity (via MCP for Unity) — export the current Blender model, import it through import_model_file, and place it in the open scene. Use when the user has BlenderMCP and MCP for Unity both connected and wants to bring a Blender model into Unity. Does NOT drive Blender's own generators; BlenderMCP owns how the model got into Blender."},"isInternal":false,"tokens":2555,"sizeBytes":10061},{"name":"SKILL.md","path":".claude/skills/mcp-source/SKILL.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/mcp-source/SKILL.md","title":"mcp-source","category":"anthropic-skill","format":"markdown","content":"---\nname: mcp-source\ndescription: Switch MCP for Unity package source in connected Unity projects. Use /mcp-source [main|beta|branch|local] to swap between upstream releases, your remote branch, or local dev checkout.\n---\n\n# Switch MCP for Unity Package Source\n\nYou are switching the `com.coplaydev.unity-mcp` package source in one or more Unity projects.\n\n## allowed-tools\n\nBash, Read, Edit, ReadMcpResourceTool, ListMcpResourcesTool\n\n## Instructions\n\n### 1. Parse arguments\n\nThe user's argument is: `$ARGUMENTS`\n\nValid values: `main`, `beta`, `branch`, `local`, or empty.\n\nIf empty or not one of the four valid values, ask the user to choose:\n- **main** — upstream main branch (stable releases)\n- **beta** — upstream beta branch (pre-release)\n- **branch** — your current remote branch (for testing a PR)\n- **local** — local file reference to your checkout (for live dev iteration)\n\n### 2. Detect repo context\n\nRun these git commands from the current working directory to find the unity-mcp repo:\n\n```bash\ngit rev-parse --show-toplevel    # → repo_root\ngit rev-parse --abbrev-ref HEAD  # → branch_name\ngit remote get-url origin        # → origin_url\n```\n\nConvert SSH origins to HTTPS: if `origin_url` starts with `git@github.com:`, transform it to `https://github.com/{owner}/{repo}.git`.\n\n### 3. Discover target Unity projects\n\nTry two approaches to find `Packages/manifest.json` files to update:\n\n**Approach A — MCP resources (preferred):**\nRead `mcpforunity://project/info` for each connected Unity instance (use `ListMcpResourcesTool` to find available instances). Extract `projectRoot` and use `{projectRoot}/Packages/manifest.json`.\n\n**Approach B — filesystem fallback:**\nIf no MCP instances are connected, search upward from the current working directory for `Packages/manifest.json` files using Bash:\n```bash\nfind \"$(pwd)\" -maxdepth 3 -name \"manifest.json\" -path \"*/Packages/manifest.json\" 2>/dev/null\n```\n\nIf multiple manifests are found, update all of them (confirming with the user first).\n\n### 4. Build the package URL\n\nBased on the user's selection, construct the dependency value:\n\n| Selection | URL |\n|-----------|-----|\n| `main`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main` |\n| `beta`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#beta` |\n| `branch`  | `{origin_https}?path=/MCPForUnity#{branch_name}` |\n| `local`   | `file:{repo_root}/MCPForUnity` |\n\nFor `branch`: use the HTTPS-normalized origin URL and current git branch name.\nFor `local`: use the absolute path to the repo root with `file:` prefix (no `//`), e.g. `file:/Users/davidsarno/unity-mcp/MCPForUnity`.\n\n### 5. Update each manifest\n\nFor each discovered `manifest.json`:\n\n1. Read the file with the Read tool\n2. Find the `\"com.coplaydev.unity-mcp\"` dependency line\n3. Use the Edit tool to replace the old value with the new URL\n4. Report what was changed: old value → new value, file path\n\n### 6. Report results\n\nAfter updating, tell the user:\n- Which manifests were updated\n- The old and new package source values\n- Remind them: \"Unity will re-resolve the package automatically. If it doesn't, open Package Manager and click Refresh.\"\n","frontmatter":{"name":"mcp-source","description":"Switch MCP for Unity package source in connected Unity projects. Use /mcp-source [main|beta|branch|local] to swap between upstream releases, your remote branch, or local dev checkout."},"isInternal":false,"tokens":807,"sizeBytes":3184},{"name":"tools-reference.md","path":".claude/skills/unity-mcp-skill/references/tools-reference.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/tools-reference.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/tools-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/tools-reference.md)","tokens":300,"sizeBytes":239},{"name":"workflows.md","path":".claude/skills/unity-mcp-skill/references/workflows.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/workflows.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/workflows.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/workflows.md)","tokens":300,"sizeBytes":227},{"name":"SKILL.md","path":".claude/skills/unity-mcp-skill/SKILL.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/SKILL.md","title":"unity-mcp-orchestrator","category":"anthropic-skill","format":"markdown","content":"---\nname: unity-mcp-orchestrator\ndescription: Orchestrate Unity Editor via MCP (Model Context Protocol) tools and resources. Use when working with Unity projects through MCP for Unity - creating/modifying GameObjects, editing scripts, managing scenes, running tests, or any Unity Editor automation. Provides best practices, tool schemas, and workflow patterns for effective Unity-MCP integration.\n---\n\n# Unity-MCP Operator Guide\n\nThis skill helps you effectively use the Unity Editor with MCP tools and resources.\n\n## Template Notice\n\nExamples in `references/workflows.md` and `references/tools-reference.md` are reusable templates. They may be inaccurate across Unity versions, package setups (UGUI/TMP/Input System), and project-specific conventions. Please check console, compilation errors, or use screenshot after implementation.\n\nBefore applying a template:\n- Validate targets/components first via resources and `find_gameobjects`.\n- Treat names, enum values, and property payloads as placeholders to adapt.\n\n## Quick Start: Resource-First Workflow\n\n**Always read relevant resources before using tools.** This prevents errors and provides the necessary context.\n\n```\n1. Check editor state     → mcpforunity://editor/state\n2. Understand the scene   → mcpforunity://scene/gameobject-api\n3. Find what you need     → find_gameobjects or resources\n4. Take action            → tools (manage_gameobject, create_script, script_apply_edits, apply_text_edits, validate_script, delete_script, get_sha, etc.)\n5. Verify results         → read_console, manage_camera(action=\"screenshot\"), resources\n```\n\n**If a tool you need is not in your tool list, it is not necessarily missing.** Check these before troubleshooting the connection:\n\n- **Project custom tools** (C# `[McpForUnityTool]`): with project-scoped tools enabled on the server, they are *not* callable by name. List them via `mcpforunity://custom-tools` and run them with `execute_custom_tool(tool_name=\"...\", parameters={...})`. With it disabled, they are registered as ordinary tools and appear in your list.\n- **Disabled tool groups**: over HTTP, a session starts with only the `core` group enabled. Over stdio, all groups start enabled and are then synced to the tool toggles in the Unity editor, so a tool can still be hidden. `manage_tools(action=\"list_groups\")` shows the groups, `manage_tools(action=\"activate\", group=\"...\")` enables one.\n\n## Critical Best Practices\n\n### 1. After Writing/Editing Scripts: Wait for Compilation and Check Console\n\n```python\n# After create_script or script_apply_edits:\n# Both tools already trigger AssetDatabase.ImportAsset + RequestScriptCompilation automatically.\n# No need to call refresh_unity — just wait for compilation to finish, then check console.\n\n# 1. Poll editor state until compilation completes\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 2. Check for compilation errors\nread_console(types=[\"error\"], count=10, include_stacktrace=True)\n```\n\n**Why:** Unity must compile scripts before they're usable. `create_script` and `script_apply_edits` already trigger import and compilation automatically — calling `refresh_unity` afterward is redundant.\n\n### 2. Use `batch_execute` for Multiple Operations\n\n```python\n# 10-100x faster than sequential calls\nbatch_execute(\n    commands=[\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube1\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube2\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube3\", \"primitive_type\": \"Cube\"}}\n    ],\n    parallel=True  # Hint only: Unity may still execute sequentially\n)\n```\n\n**Max 25 commands per batch by default (configurable in Unity MCP Tools window, max 100).** Use `fail_fast=True` for dependent operations.\n\n**Tip:** Also use `batch_execute` for discovery — batch multiple `find_gameobjects` calls instead of calling them one at a time:\n```python\nbatch_execute(commands=[\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Camera\", \"search_method\": \"by_component\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Player\", \"search_method\": \"by_tag\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"GameManager\", \"search_method\": \"by_name\"}}\n])\n```\n\n### 3. Use Screenshots to Verify Visual Results\n\n```python\n# Basic screenshot (saves to Assets/, returns file path only)\nmanage_camera(action=\"screenshot\")\n\n# Inline screenshot (returns base64 PNG directly to the AI)\nmanage_camera(action=\"screenshot\", include_image=True)\n\n# Use a specific camera and cap resolution for smaller payloads\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n\n# Batch surround: captures front/back/left/right/top/bird_eye around the scene\nmanage_camera(action=\"screenshot\", batch=\"surround\", max_resolution=256)\n\n# Batch surround centered on a specific object\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Positioned screenshot: place a temp camera and capture in one call\nmanage_camera(action=\"screenshot\", view_target=\"Player\", view_position=[0, 10, -10], max_resolution=512)\n\n# Scene View screenshot: capture what the developer sees in the editor\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n```\n\n**Best practices for AI scene understanding:**\n- Use `include_image=True` when you need to *see* the scene, not just save a file.\n- Use `batch=\"surround\"` for a comprehensive overview (6 angles, one command).\n- Use `view_target`/`view_position` to capture from a specific viewpoint without needing a scene camera.\n- Use `capture_source=\"scene_view\"` to see the editor viewport (gizmos, wireframes, grid).\n- Keep `max_resolution` at 256–512 to balance quality vs. token cost.\n\n```python\n# Agentic camera loop: point, shoot, analyze\nmanage_gameobject(action=\"look_at\", target=\"MainCamera\", look_at_target=\"Player\")\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n# → Analyze image, decide next action\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Scene View for editor-level inspection (shows gizmos, debug overlays, etc.)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Player\", include_image=True)\n```\n\n### 4. Check Console After Major Changes\n\n```python\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\"],  # Focus on problems\n    count=10,\n    format=\"detailed\"\n)\n```\n\n### 5. Always Check `mcpforunity://editor/state` Before Complex Operations\n\n```python\n# Read mcpforunity://editor/state to check:\n# - is_compiling: Wait if true\n# - is_domain_reload_pending: Wait if true  \n# - ready_for_tools: Only proceed if true\n# - blocking_reasons: Why tools might fail\n```\n\n## Parameter Type Conventions\n\nThese are common patterns, not strict guarantees. `manage_components.set_property` payload shapes can vary by component/property; if a template fails, inspect the component resource payload and adjust.\n\n### Vectors (position, rotation, scale, color)\n```python\n# Both forms accepted:\nposition=[1.0, 2.0, 3.0]        # List\nposition=\"[1.0, 2.0, 3.0]\"     # JSON string\n```\n\n### Booleans\n```python\n# Both forms accepted:\ninclude_inactive=True           # Boolean\ninclude_inactive=\"true\"         # String\n```\n\n### Colors\n```python\n# Auto-detected format:\ncolor=[255, 0, 0, 255]         # 0-255 range\ncolor=[1.0, 0.0, 0.0, 1.0]    # 0.0-1.0 normalized (auto-converted)\n```\n\n### Paths\n```python\n# Assets-relative (default):\npath=\"Assets/Scripts/MyScript.cs\"\n\n# URI forms:\nuri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\"\nuri=\"file:///full/path/to/file.cs\"\n```\n\n## Core Tool Categories\n\n| Category | Key Tools | Use For |\n|----------|-----------|---------|\n| **Scene** | `manage_scene`, `find_gameobjects` | Scene operations, finding objects. Multi-scene editing (additive load, close, set active, move GO between scenes), scene templates (`3d_basic`, `2d_basic`, `empty`, `default`), scene validation with `auto_repair`. For build settings, use `manage_build(action=\"scenes\")`. |\n| **Objects** | `manage_gameobject`, `manage_components` | Creating/modifying GameObjects |\n| **Scripts** | `create_script`, `script_apply_edits`, `validate_script` | C# code management (auto-refreshes on create/edit) |\n| **Assets** | `manage_asset`, `manage_prefabs` | Asset operations. **Prefab instantiation** is done via `manage_gameobject(action=\"create\", prefab_path=\"...\")`, not `manage_prefabs`. |\n| **Editor** | `manage_editor`, `execute_menu_item`, `read_console` | Editor control, package deployment (`deploy_package`/`restore_package`), undo/redo (`undo`/`redo` actions) |\n| **Testing** | `run_tests`, `get_test_job` | Unity Test Framework |\n| **Batch** | `batch_execute` | Parallel/bulk operations |\n| **Camera** | `manage_camera` | Camera management (Unity Camera + Cinemachine). **Tier 1** (always available): create, target, lens, priority, list, screenshot. **Tier 2** (requires `com.unity.cinemachine`): brain, body/aim/noise pipeline, extensions, blending, force/release. 7 presets: follow, third_person, freelook, dolly, static, top_down, side_scroller. Resource: `mcpforunity://scene/cameras`. Use `ping` to check Cinemachine availability. See [tools-reference.md](references/tools-reference.md#camera-tools). |\n| **Animation** | `manage_animation`, `manage_sprite` | Animator control, clips and controllers. **2D sprite sheets**: `manage_sprite(action=\"get_info\")` returns a PNG or JPEG sheet as an image to count the grid from, then `full_setup` slices it and builds clips and a controller; clip names decide the states (idle, walk/run, attack-type triggers). Off by default over HTTP: `manage_tools(action=\"activate\", group=\"animation\")`. |\n| **Graphics** | `manage_graphics` | Rendering and post-processing management. 33 actions across 5 groups: **Volume** (create/configure volumes and effects, URP/HDRP), **Bake** (lightmaps, light probes, reflection probes, Edit mode only), **Stats** (draw calls, batches, memory), **Pipeline** (quality levels, pipeline settings), **Features** (URP renderer features: add, remove, toggle, reorder). Resources: `mcpforunity://scene/volumes`, `mcpforunity://rendering/stats`, `mcpforunity://pipeline/renderer-features`. Use `ping` to check pipeline status. See [tools-reference.md](references/tools-reference.md#graphics-tools). |\n| **Packages** | `manage_packages` | Install, remove, search, and manage Unity packages and scoped registries. Query actions: list installed, search registry, get info, ping, poll status. Mutating actions: add/remove packages, embed for editing, add/remove scoped registries, force resolve. Validates identifiers, warns on git URLs, checks dependents before removal (`force=true` to override). See [tools-reference.md](references/tools-reference.md#package-tools). |\n| **Physics** | `manage_physics` | Manage 3D and 2D physics (21 actions). Settings, collision matrix, materials, joints (14 types). Queries: `raycast`, `raycast_all`, `linecast`, `shapecast` (sphere/box/capsule sweep), `overlap`. Forces: `apply_force` (AddForce/AddTorque/AddExplosionForce with ForceMode). Rigidbody: `get_rigidbody`, `configure_rigidbody` (mass, drag, gravity, constraints, collision detection). Validation: scene-wide checks. Simulation: `simulate_step` in edit mode. See [tools-reference.md](references/tools-reference.md#physics-tools). |\n| **ProBuilder** | `manage_probuilder` | 3D modeling, mesh editing, complex geometry. **When `com.unity.probuilder` is installed, prefer ProBuilder shapes over primitive GameObjects** for editable geometry, multi-material faces, or complex shapes. Supports 12 shape types, face/edge/vertex editing, smoothing, and per-face materials. See [ProBuilder Guide](references/probuilder-guide.md). |\n| **UI** | `manage_ui`, `batch_execute` with `manage_gameobject` + `manage_components` | **UI Toolkit**: Use `manage_ui` to create UXML/USS files, attach UIDocument, inspect visual trees. **uGUI (Canvas)**: Use `batch_execute` for Canvas, Panel, Button, Text, Slider, Toggle, Input Field. **Read `mcpforunity://project/info` first** to detect uGUI/TMP/Input System/UI Toolkit availability. (see [UI workflows](references/workflows.md#ui-creation-workflows)) |\n| **Docs** | `unity_reflect`, `unity_docs` | API verification and documentation lookup. **`unity_reflect`** inspects live C# APIs via reflection (requires Unity connection): `search` types across assemblies, `get_type` for member summary, `get_member` for full signatures. **`unity_docs`** fetches official docs from docs.unity3d.com (no Unity connection needed): `get_doc` (ScriptReference), `get_manual` (Manual pages), `get_package_doc` (package docs), `lookup` (parallel search all sources + project assets). **Trust hierarchy: reflection > project assets > docs.** Workflow: `unity_reflect` search -> get_type -> get_member -> `unity_docs` lookup. See [tools-reference.md](references/tools-reference.md#docs-tools). |\n| **More** | `manage_material`, `manage_texture`, `manage_shader`, `manage_vfx`, `manage_profiler`, `execute_code`, `manage_scriptable_object`, `generate_image`, `generate_model`, `generate_audio`, `import_model`, `import_model_file`, `blender_bridge` | Materials; textures, shaders and VFX (`vfx` group); profiling (`profiling`); in-editor C# and ScriptableObjects (`scripting_ext`); AI asset generation, Sketchfab and on-disk model import, Blender (`asset_gen`). Every tool has a section in [tools-reference.md](references/tools-reference.md). |\n\n## Common Workflows\n\n### Creating a New Script and Using It\n\n```python\n# 1. Create the script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/PlayerController.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class PlayerController : MonoBehaviour\\n{\\n    void Update() { }\\n}\"\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for compilation errors\nread_console(types=[\"error\"], count=10)\n\n# 4. Only then attach to GameObject\nmanage_gameobject(action=\"modify\", target=\"Player\", components_to_add=[\"PlayerController\"])\n```\n\n### Finding and Modifying GameObjects\n\n```python\n# 1. Find by name/tag/component (returns IDs only)\nresult = find_gameobjects(search_term=\"Enemy\", search_method=\"by_tag\", page_size=50)\n\n# 2. Get full data via resource\n# mcpforunity://scene/gameobject/{instance_id}\n\n# 3. Modify using the ID\nmanage_gameobject(action=\"modify\", target=instance_id, position=[10, 0, 0])\n```\n\n### Running and Monitoring Tests\n\n```python\n# 1. Start test run (async)\nresult = run_tests(mode=\"EditMode\", test_names=[\"MyTests.TestSomething\"])\njob_id = result[\"job_id\"]\n\n# 2. Poll for completion\nresult = get_test_job(job_id=job_id, wait_timeout=60, include_failed_tests=True)\n```\n\n## Pagination Pattern\n\nLarge queries return paginated results. Always follow `next_cursor`:\n\n```python\ncursor = 0\nall_items = []\nwhile True:\n    result = manage_scene(action=\"get_hierarchy\", page_size=50, cursor=cursor)\n    all_items.extend(result[\"data\"][\"items\"])\n    if not result[\"data\"].get(\"next_cursor\"):\n        break\n    cursor = result[\"data\"][\"next_cursor\"]\n```\n\n## Multi-Instance Workflow\n\nWhen multiple Unity Editors are running:\n\n```python\n# 1. List instances via resource: mcpforunity://instances\n# 2. Set active instance\nset_active_instance(instance=\"MyProject@abc123\")\n# 3. All subsequent calls route to that instance\n```\n\n## Error Recovery\n\n| Symptom | Cause | Solution |\n|---------|-------|----------|\n| Tools return \"busy\" | Compilation in progress | Wait, check `mcpforunity://editor/state` |\n| \"stale_file\" error | File changed since SHA | Re-fetch SHA with `get_sha`, retry |\n| Connection lost | Domain reload | Wait ~5s, reconnect |\n| Commands fail silently | Wrong instance | Check `set_active_instance` |\n\n## Reference Files\n\nFor detailed schemas and examples:\n\n- **[tools-reference.md](references/tools-reference.md)**: Every tool's main actions, parameters, and examples, with links to the full parameter tables\n- **[resources-reference.md](references/resources-reference.md)**: All available resources and their data\n- **[workflows.md](references/workflows.md)**: Extended workflow examples and patterns\n- **[probuilder-guide.md](references/probuilder-guide.md)**: ProBuilder modeling patterns\n","frontmatter":{"name":"unity-mcp-orchestrator","description":"Orchestrate Unity Editor via MCP (Model Context Protocol) tools and resources. Use when working with Unity projects through MCP for Unity - creating/modifying GameObjects, editing scripts, managing scenes, running tests, or any Unity Editor automation. Provides best practices, tool schemas, and workflow patterns for effective Unity-MCP integration."},"isInternal":false,"tokens":3984,"sizeBytes":16677},{"name":"CHANGELOG.md","path":"TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md","title":"Com.unity.asset-store-tools Skill","category":"anthropic-skill","format":"markdown","content":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md)","tokens":300,"sizeBytes":296},{"name":"LICENSE.md","path":"TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md","title":"Com.unity.asset-store-tools Skill","category":"anthropic-skill","format":"markdown","content":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md)","tokens":300,"sizeBytes":292},{"name":"package.json","path":"TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json","title":"Com.unity.asset-store-tools Skill","category":"anthropic-skill","format":"json","content":"# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json)","tokens":300,"sizeBytes":296},{"name":"manifest.json","path":"TestProjects/AssetStoreUploads/Packages/manifest.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/manifest.json","title":"Packages Skill","category":"anthropic-skill","format":"json","content":"# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/manifest.json)","tokens":300,"sizeBytes":223},{"name":"packages-lock.json","path":"TestProjects/AssetStoreUploads/Packages/packages-lock.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/packages-lock.json","title":"Packages Skill","category":"anthropic-skill","format":"json","content":"# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/packages-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/packages-lock.json)","tokens":300,"sizeBytes":233},{"name":"manifest.json","path":"TestProjects/UnityMCPTests/Packages/manifest.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/Packages/manifest.json","title":"Packages Skill","category":"anthropic-skill","format":"json","content":"# Packages Skill\n\nPath: `TestProjects/UnityMCPTests/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/Packages/manifest.json)","tokens":300,"sizeBytes":215},{"name":"Settings.json","path":"TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json","title":"Com.unity.testtools.codecoverage Skill","category":"anthropic-skill","format":"json","content":"# Com.unity.testtools.codecoverage Skill\n\nPath: `TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json)","tokens":300,"sizeBytes":337},{"name":"unity-versions.json","path":"tools/unity-versions.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/tools/unity-versions.json","title":"Tools Skill","category":"anthropic-skill","format":"json","content":"{\n  \"$comment\": \"Single source of truth for Unity versions exercised by CI and tools/check-unity-versions.* local script. Versions are pinned to specific patch releases (no floating tags) per acceptance criteria in CoplayDev/unity-mcp#1107. Every id MUST have a corresponding GameCI Docker image at unityci/editor:ubuntu-<id>-base-3 since both CI (game-ci/unity-test-runner@v4) and local --docker mode pull from there. Verify availability before bumping: https://hub.docker.com/v2/repositories/unityci/editor/tags/?name=<id>\",\n  \"$coverageGap\": \"UNITY_6000_5_OR_NEWER and UNITY_6000_6_OR_NEWER branches are NOT exercised by this matrix because GameCI has not yet published Docker images for Unity 6000.5+/6000.6+. Bump the 'rolling' row to a 6000.5+/6000.6+ patch once https://hub.docker.com/r/unityci/editor publishes one. Tracked branches in code: UnityObjectIdCompat.cs (EntityId path).\",\n  \"defaultVersion\": \"6000.0.75f1\",\n  \"$defaultVersionComment\": \"Unity version used when CI runs the narrow matrix (default PR feedback path). Must be one of the ids in 'versions' below. Today's pick is 6.0 LTS — the version most users target. The 'floor' role still identifies the package's minimum supported version separately.\",\n  \"versions\": [\n    {\n      \"id\": \"2021.3.45f2\",\n      \"role\": \"floor\",\n      \"notes\": \"Package minimum (matches MCPForUnity/package.json 'unity' field and TestProjects/UnityMCPTests/ProjectSettings/ProjectVersion.txt). Legacy branch: all UNITY_2022_*/UNITY_6000_* flags OFF.\"\n    },\n    {\n      \"id\": \"2022.3.62f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Last 2022 LTS. Exercises UNITY_2022_1/2/3_OR_NEWER branches; UNITY_2023_*/UNITY_6000_* OFF. Catches FindObjectsByType-style regressions (the #1105 path).\"\n    },\n    {\n      \"id\": \"6000.0.75f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Unity 6.0 LTS (latest patch on GameCI). UNITY_6000_0_OR_NEWER ON (27 files), UNITY_2023_*_OR_NEWER ON, UNITY_6000_3/4/5/6 OFF.\"\n    },\n    {\n      \"id\": \"6000.4.8f1\",\n      \"role\": \"rolling\",\n      \"notes\": \"Latest 6.x available on GameCI. UNITY_6000_0/1/2/3/4_OR_NEWER ON; UNITY_6000_5/6 OFF (no GameCI image yet — see $coverageGap).\"\n    }\n  ]\n}\n","frontmatter":{"$comment":"Single source of truth for Unity versions exercised by CI and tools/check-unity-versions.* local script. Versions are pinned to specific patch releases (no floating tags) per acceptance criteria in CoplayDev/unity-mcp#1107. Every id MUST have a corresponding GameCI Docker image at unityci/editor:ubuntu-<id>-base-3 since both CI (game-ci/unity-test-runner@v4) and local --docker mode pull from there. Verify availability before bumping: https://hub.docker.com/v2/repositories/unityci/editor/tags/?name=<id>","$coverageGap":"UNITY_6000_5_OR_NEWER and UNITY_6000_6_OR_NEWER branches are NOT exercised by this matrix because GameCI has not yet published Docker images for Unity 6000.5+/6000.6+. Bump the 'rolling' row to a 6000.5+/6000.6+ patch once https://hub.docker.com/r/unityci/editor publishes one. Tracked branches in code: UnityObjectIdCompat.cs (EntityId path).","defaultVersion":"6000.0.75f1","$defaultVersionComment":"Unity version used when CI runs the narrow matrix (default PR feedback path). Must be one of the ids in 'versions' below. Today's pick is 6.0 LTS — the version most users target. The 'floor' role still identifies the package's minimum supported version separately.","versions":[{"id":"2021.3.45f2","role":"floor","notes":"Package minimum (matches MCPForUnity/package.json 'unity' field and TestProjects/UnityMCPTests/ProjectSettings/ProjectVersion.txt). Legacy branch: all UNITY_2022_*/UNITY_6000_* flags OFF."},{"id":"2022.3.62f1","role":"lts","notes":"Last 2022 LTS. Exercises UNITY_2022_1/2/3_OR_NEWER branches; UNITY_2023_*/UNITY_6000_* OFF. Catches FindObjectsByType-style regressions (the #1105 path)."},{"id":"6000.0.75f1","role":"lts","notes":"Unity 6.0 LTS (latest patch on GameCI). UNITY_6000_0_OR_NEWER ON (27 files), UNITY_2023_*_OR_NEWER ON, UNITY_6000_3/4/5/6 OFF."},{"id":"6000.4.8f1","role":"rolling","notes":"Latest 6.x available on GameCI. UNITY_6000_0/1/2/3/4_OR_NEWER ON; UNITY_6000_5/6 OFF (no GameCI image yet — see $coverageGap)."}]},"isInternal":false,"tokens":641,"sizeBytes":2161},{"name":"UPDATE_DOCS_PROMPT.md","path":"tools/UPDATE_DOCS_PROMPT.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/tools/UPDATE_DOCS_PROMPT.md","title":"Tools Skill","category":"anthropic-skill","format":"markdown","content":"# LLM Prompt for Updating Documentation\n\nCopy and paste this prompt into your LLM after you add, remove, rename or change an MCP tool or resource. Review its changes, then make sure the checks in step 5 pass.\n\n---\n\n## Prompt\n\nI've just changed MCP tools or resources in this MCP for Unity repository. Please update the documentation to match.\n\n1. **Read the current tools and resources**:\n   - `Server/src/services/tools/`: tools (`@mcp_for_unity_tool`, including its `group`)\n   - `Server/src/services/resources/`: resources (`@mcp_for_unity_resource`)\n   - `Server/src/cli/commands/`: the Click CLI commands that mirror the tools\n\n2. **Regenerate the reference pages.** `website/docs/reference/tools/**` and `website/docs/reference/resources/index.md` are generated from the registry:\n   ```bash\n   cd Server && uv run python ../tools/generate_docs_reference.py\n   ```\n   Do not hand-edit them, except for usage examples between `<!-- examples:start -->` and `<!-- examples:end -->`, which the generator keeps.\n\n3. **Update the hand-maintained files**:\n   - **manifest.json**: the `tools` array must list exactly the registered tools as `{\"name\", \"description\"}` entries; put new ones in alphabetical position. Resources are not listed. `Server/tests/test_manifest_tools.py` fails when a tool is missing, extra or listed twice, but it compares names only: when a tool's purpose changes, check its one-line description by hand.\n   - **Tool groups**: if a tool adds a group or changes what a group covers, update the group's blurb in `TOOL_GROUPS` (`Server/src/services/registry/tool_registry.py`; it feeds the generated group pages, the `tool_groups` resource and `manage_tools`) and the group lists in `website/docs/guides/tool-groups.md` and `website/docs/contributing/dev-setup.md`.\n   - **Tool count**: `README.md`, `docs/i18n/README-zh.md` and `website/docs/guides/tool-groups.md` state how many tools ship. Update the number if it changed.\n   - **CLI docs**: the group table in `website/docs/reference/cli.md` and the \"Complete Command Reference\" table in `website/docs/guides/cli.md` must match the Click command tree (`cd Server && uv run unity-mcp --help`, then `--help` on each group).\n   - **Skill**: if agents need new guidance for the change, update the skill. It has two copies, `unity-mcp-skill/` and `.claude/skills/unity-mcp-skill/`; keep both copies identical.\n\n4. **Leave the release notes alone.** `README.md` has no tool or resource lists; it links to the website catalog. Its \"Recent Updates\" block (the latest 5 releases) and `website/docs/releases.md` are generated from GitHub Releases, whose notes GitHub builds from merged PR titles. After each release, `release.yml` dispatches `.github/workflows/sync-releases.yml`, which runs `tools/sync_release_notes.py` and merges the result into `beta` through its own PR. The \"最近更新\" block in `docs/i18n/README-zh.md` is not synced; it is updated by hand at release time.\n\n5. **After updating**, run these checks:\n   ```bash\n   cd Server\n   uv run python ../tools/generate_docs_reference.py --check\n   uv run pytest tests/test_manifest_tools.py\n   ```\n\nPlease show me the exact changes you're making to each file, and explain any discrepancies you find.\n\n---\n","isInternal":false,"tokens":768,"sizeBytes":3235},{"name":"probuilder-guide.md","path":"unity-mcp-skill/references/probuilder-guide.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/unity-mcp-skill/references/probuilder-guide.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# ProBuilder Workflow Guide\n\nPatterns and best practices for AI-driven ProBuilder mesh editing through MCP for Unity.\n\n## Availability\n\nProBuilder is an **optional** Unity package (`com.unity.probuilder`). Check `mcpforunity://project/info` or call `manage_probuilder(action=\"ping\")` to verify it's installed before using any ProBuilder tools. If available, **prefer ProBuilder over primitive GameObjects** for any geometry that needs editing, multi-material faces, or non-trivial shapes.\n\n## Core Workflow: Always Get Info First\n\nBefore any mesh edit, call `get_mesh_info` with `include='faces'` to understand the geometry:\n\n```python\n# Step 1: Get face info with directions\nresult = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"faces\"})\n\n# Response includes per-face:\n#   index: 0, normal: [0, 1, 0], center: [0, 0.5, 0], direction: \"top\"\n#   index: 1, normal: [0, -1, 0], center: [0, -0.5, 0], direction: \"bottom\"\n#   index: 2, normal: [0, 0, 1], center: [0, 0, 0.5], direction: \"front\"\n#   ...\n\n# Step 2: Use the direction labels to pick faces\n# Want to extrude the top? Find the face with direction=\"top\"\nmanage_probuilder(action=\"extrude_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0], \"distance\": 1.5})\n```\n\n### Include Parameter\n\n| Value | Returns | Use When |\n|-------|---------|----------|\n| `\"summary\"` | Counts, bounds, materials | Quick check / validation |\n| `\"faces\"` | + normals, centers, directions | Selecting faces for editing |\n| `\"edges\"` | + edge vertex pairs with world positions (max 200) | Edge-based operations |\n| `\"all\"` | Everything | Full mesh analysis |\n\n## Shape Creation\n\n### All 12 Shape Types\n\n```python\n# Basic shapes\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cube\", \"name\": \"MyCube\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Sphere\", \"name\": \"MySphere\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cylinder\", \"name\": \"MyCyl\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Plane\", \"name\": \"MyPlane\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cone\", \"name\": \"MyCone\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Prism\", \"name\": \"MyPrism\"})\n\n# Parametric shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"MyTorus\",\n    \"rows\": 16, \"columns\": 24, \"innerRadius\": 0.5, \"outerRadius\": 1.0\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Pipe\", \"name\": \"MyPipe\",\n    \"radius\": 1.0, \"height\": 2.0, \"thickness\": 0.2\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Arch\", \"name\": \"MyArch\",\n    \"radius\": 2.0, \"angle\": 180, \"segments\": 12\n})\n\n# Architectural shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"MyStairs\", \"steps\": 10\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"CurvedStair\", \"name\": \"Spiral\", \"steps\": 12\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"MyDoor\"\n})\n\n# Custom polygon\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [[0,0,0], [5,0,0], [5,0,5], [2.5,0,7], [0,0,5]],\n    \"extrudeHeight\": 3.0, \"name\": \"Pentagon\"\n})\n```\n\n## Common Editing Operations\n\n### Extrude a Roof\n\n```python\n# 1. Create a building base\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"Building\", \"size\": [4, 3, 6]\n})\n\n# 2. Find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Building\",\n    properties={\"include\": \"faces\"})\n# Find face with direction=\"top\" -> e.g. index 2\n\n# 3. Extrude upward for a flat roof extension\nmanage_probuilder(action=\"extrude_faces\", target=\"Building\",\n    properties={\"faceIndices\": [2], \"distance\": 0.5})\n```\n\n### Cut a Hole (Delete Faces)\n\n```python\n# 1. Get face info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n# Find the face with direction=\"front\" -> e.g. index 4\n\n# 2. Subdivide to create more faces\nmanage_probuilder(action=\"subdivide\", target=\"Wall\",\n    properties={\"faceIndices\": [4]})\n\n# 3. Get updated face info (indices changed after subdivide!)\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n\n# 4. Delete the center face(s) for the hole\nmanage_probuilder(action=\"delete_faces\", target=\"Wall\",\n    properties={\"faceIndices\": [6]})\n```\n\n### Bevel Edges\n\n```python\n# Get edge info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"edges\"})\n\n# Bevel specific edges\nmanage_probuilder(action=\"bevel_edges\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.1})\n```\n\n### Detach Faces to New Object\n\n```python\n# Detach and keep original (default)\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": False})\n\n# Detach and remove from source\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": True})\n```\n\n### Select Faces by Direction\n\n```python\n# Select all upward-facing faces\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"direction\": \"up\", \"tolerance\": 0.7})\n\n# Grow selection from a seed face\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"growFrom\": [0], \"growAngle\": 45})\n```\n\n### Double-Sided Geometry\n\n```python\n# Create inside faces for a room (duplicate and flip normals)\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"Room\",\n    properties={\"faceIndices\": [0, 1, 2, 3, 4, 5]})\n```\n\n### Create Polygon from Existing Vertices\n\n```python\n# Connect existing vertices into a new face (auto-finds winding order)\nmanage_probuilder(action=\"create_polygon\", target=\"MyMesh\",\n    properties={\"vertexIndices\": [0, 3, 7, 4]})\n```\n\n## Vertex Operations\n\n```python\n# Move vertices by offset. Only the listed indices move: faces that meet at a corner\n# usually each have their own vertex there, so moving one face's corners opens a gap.\nmanage_probuilder(action=\"move_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"offset\": [0, 1, 0]})\n\n# Weld nearby vertices (proximity-based merge)\nmanage_probuilder(action=\"weld_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"radius\": 0.1})\n\n# Insert vertex on an edge\nmanage_probuilder(action=\"insert_vertex\", target=\"MyCube\",\n    properties={\"edge\": {\"a\": 0, \"b\": 1}, \"point\": [0.5, 0, 0]})\n\n# Add evenly-spaced points along edges\nmanage_probuilder(action=\"append_vertices_to_edge\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1], \"count\": 3})\n```\n\n## Smoothing Workflow\n\n### Auto-Smooth (Recommended Default)\n\n```python\n# Apply auto-smoothing with default 30 degree threshold\nmanage_probuilder(action=\"auto_smooth\", target=\"MyMesh\",\n    properties={\"angleThreshold\": 30})\n```\n\n- **Low angle (15-25)**: More hard edges, faceted look\n- **Medium angle (30-45)**: Good default, smooth curves + sharp corners\n- **High angle (60-80)**: Very smooth, only sharpest edges remain hard\n\n### Manual Smoothing Groups\n\n```python\n# Set specific faces to smooth group 1\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [0, 1, 2], \"smoothingGroup\": 1})\n\n# Set other faces to hard edges (group 0)\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [3, 4, 5], \"smoothingGroup\": 0})\n```\n\n## Mesh Cleanup Pattern\n\nAfter editing, always clean up:\n\n```python\n# 1. Center the pivot (important after extrusions that shift geometry)\nmanage_probuilder(action=\"center_pivot\", target=\"MyMesh\")\n\n# 2. Optionally freeze transform if you moved/rotated the object\nmanage_probuilder(action=\"freeze_transform\", target=\"MyMesh\")\n\n# 3. Validate mesh health\nresult = manage_probuilder(action=\"validate_mesh\", target=\"MyMesh\")\n# Check result.data.healthy -- if false, repair\n\n# 4. Auto-repair if needed\nmanage_probuilder(action=\"repair_mesh\", target=\"MyMesh\")\n```\n\n## Building Complex Objects with ProBuilder\n\nWhen ProBuilder is available, prefer it over primitive GameObjects for complex geometry. ProBuilder lets you create, edit, and combine shapes into detailed objects without external 3D tools.\n\n### Example: Simple House\n\n```python\n# 1. Create base building\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"House\", \"width\": 6, \"height\": 3, \"depth\": 8\n})\n\n# 2. Get face info to find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"top\" -> e.g. index 2\n\n# 3. Extrude the top face to create a flat raised section\nmanage_probuilder(action=\"extrude_faces\", target=\"House\",\n    properties={\"faceIndices\": [2], \"distance\": 0.3})\n\n# 4. Add a peaked roof as a separate Prism; its ridge runs along Z, like the house.\n#    (Moving the top face's vertices would pull it away from the walls; see Vertex Operations.)\n#    Shapes are centered on their position: the walls now reach y = 1.8,\n#    so a roof 2 high sits on them at y = 1.8 + 1.\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Prism\", \"name\": \"Roof\",\n    \"width\": 6, \"height\": 2, \"depth\": 8, \"position\": [0, 2.8, 0]\n})\n\n# 5. Cut a doorway: subdivide front face, delete center sub-face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"front\", subdivide it\nmanage_probuilder(action=\"subdivide\", target=\"House\",\n    properties={\"faceIndices\": [4]})\n\n# Re-query, find bottom-center face, delete it\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\nmanage_probuilder(action=\"delete_faces\", target=\"House\",\n    properties={\"faceIndices\": [12]})\n\n# 6. Add a door frame with arch\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"Doorway\",\n    \"position\": [0, 0, 4], \"width\": 1.5, \"height\": 2.5\n})\n\n# 7. Add stairs to the door\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"FrontSteps\",\n    \"position\": [0, 0, 5], \"steps\": 3, \"width\": 2\n})\n\n# 8. Smooth organic parts, keep architectural edges sharp\nmanage_probuilder(action=\"auto_smooth\", target=\"House\",\n    properties={\"angleThreshold\": 30})\n\n# 9. Assign materials per face\nmanage_probuilder(action=\"set_face_material\", target=\"House\",\n    properties={\"faceIndices\": [0, 1, 2, 3], \"materialPath\": \"Assets/Materials/Brick.mat\"})\n# A Prism's faces 1 and 3 are its two slopes\nmanage_probuilder(action=\"set_face_material\", target=\"Roof\",\n    properties={\"faceIndices\": [1, 3], \"materialPath\": \"Assets/Materials/Roof.mat\"})\n\n# 10. Cleanup\nmanage_probuilder(action=\"center_pivot\", target=\"House\")\nmanage_probuilder(action=\"validate_mesh\", target=\"House\")\n```\n\n### Example: Pillared Corridor (Batch)\n\n```python\n# Create multiple columns efficiently\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cylinder\", \"name\": f\"Pillar_{i}\",\n                       \"radius\": 0.3, \"height\": 4, \"segments\": 12,\n                       \"position\": [i * 3, 0, 0]}\n    }} for i in range(6)\n] + [\n    # Floor\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Floor\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 0, 0]}\n    }},\n    # Ceiling\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Ceiling\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 4, 0]}\n    }},\n])\n\n# Bevel all pillar tops for decoration\nfor i in range(6):\n    info = manage_probuilder(action=\"get_mesh_info\", target=f\"Pillar_{i}\",\n        properties={\"include\": \"edges\"})\n    # Find top ring edges, bevel them\n    manage_probuilder(action=\"bevel_edges\", target=f\"Pillar_{i}\",\n        properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.05})\n\n# Smooth the pillars\nfor i in range(6):\n    manage_probuilder(action=\"auto_smooth\", target=f\"Pillar_{i}\",\n        properties={\"angleThreshold\": 45})\n```\n\n### Example: Custom L-Shaped Room\n\n```python\n# Use polygon shape for non-rectangular footprint\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [\n        [0, 0, 0], [10, 0, 0], [10, 0, 6],\n        [4, 0, 6], [4, 0, 10], [0, 0, 10]\n    ],\n    \"extrudeHeight\": 3.0,\n    \"name\": \"LRoom\"\n})\n\n# Create inside faces for the room interior\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"LRoom\",\n    properties={\"include\": \"faces\"})\n# Duplicate and flip all faces to make interior visible\nall_faces = list(range(info[\"data\"][\"faceCount\"]))\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"LRoom\",\n    properties={\"faceIndices\": all_faces})\n\n# Cut a window: subdivide a wall face, delete center\n# (follow the get_mesh_info -> subdivide -> get_mesh_info -> delete pattern)\n```\n\n### Example: Torus Knot / Decorative Ring\n\n```python\n# Create a torus\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"Ring\",\n    \"innerRadius\": 0.3, \"outerRadius\": 2.0,\n    \"rows\": 24, \"columns\": 32\n})\n\n# Smooth it for organic look\nmanage_probuilder(action=\"auto_smooth\", target=\"Ring\",\n    properties={\"angleThreshold\": 60})\n\n# Assign metallic material\nmanage_probuilder(action=\"set_face_material\", target=\"Ring\",\n    properties={\"faceIndices\": [], \"materialPath\": \"Assets/Materials/Gold.mat\"})\n# Note: empty faceIndices = all faces\n```\n\n## Batch Patterns\n\nUse `batch_execute` for multi-step workflows to reduce round-trips:\n\n```python\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column1\", \"position\": [0, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column2\", \"position\": [5, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column3\", \"position\": [10, 0, 0]}\n    }},\n])\n```\n\n## Known Limitations\n\n### Not Yet Working\n\nThese actions exist in the API but have known bugs that prevent them from working correctly:\n\n| Action | Issue | Workaround |\n|--------|-------|------------|\n| `set_pivot` | Vertex positions don't persist through `ToMesh()`/`RefreshMesh()`. The `positions` property setter is overwritten when ProBuilder rebuilds the mesh. Needs `SetVertices(IList<Vertex>)` or direct `m_Positions` field access. | Use `center_pivot` instead, or position objects via Transform. |\n| `convert_to_probuilder` | `MeshImporter` constructor throws internally. May need ProBuilder's editor-only `ProBuilderize` API instead of runtime `MeshImporter`. | Create shapes natively with `create_shape` or `create_poly_shape` instead of converting existing meshes. |\n\n### General Limitations\n\n- Face indices are **not stable** across edits -- always re-query `get_mesh_info` after any modification\n- Edge data is capped at **200 edges** in `get_mesh_info` results\n- Face data is capped at **100 faces** in `get_mesh_info` results\n- `subdivide` uses `ConnectElements.Connect` internally (ProBuilder has no public `Subdivide` API), which connects face midpoints rather than traditional quad subdivision\n\n## Key Rules\n\n1. **Always get_mesh_info before editing** -- face indices are not stable across edits\n2. **Re-query after modifications** -- subdivide, extrude, delete all change face indices\n3. **Use direction labels** -- don't guess face indices, use the direction field\n4. **Cleanup after editing** -- center_pivot + validate is good practice\n5. **Auto-smooth for organic shapes** -- 30 degrees is a good default\n6. **Prefer ProBuilder over primitives** -- when the package is available and you need editable geometry\n7. **Use batch_execute** -- for creating multiple shapes or repetitive operations\n8. **Screenshot to verify** -- use `manage_camera(action=\"screenshot\", include_image=True)` to check visual results after complex edits\n","isInternal":false,"tokens":4431,"sizeBytes":16397},{"name":"resources-reference.md","path":"unity-mcp-skill/references/resources-reference.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/unity-mcp-skill/references/resources-reference.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Unity-MCP Resources Reference\n\nResources provide read-only access to Unity state. Use resources to inspect before using tools to modify.\n\n## Table of Contents\n\n- [Editor State Resources](#editor-state-resources)\n- [Camera Resources](#camera-resources)\n- [Graphics Resources](#graphics-resources)\n- [Scene & GameObject Resources](#scene--gameobject-resources)\n- [Prefab Resources](#prefab-resources)\n- [Project Resources](#project-resources)\n- [Instance Resources](#instance-resources)\n- [Test Resources](#test-resources)\n\n---\n\n## URI Scheme\n\nAll resources use `mcpforunity://` scheme:\n\n```\nmcpforunity://{category}/{resource_path}[?query_params]\n```\n\n**Categories:** `editor`, `scene`, `prefab`, `project`, `pipeline`, `rendering`, `menu-items`, `custom-tools`, `tests`, `instances`\n\n---\n\n## Editor State Resources\n\n### mcpforunity://editor/state\n\n**Purpose:** Editor readiness snapshot - check before tool operations.\n\n**Returns:**\n```json\n{\n  \"unity_version\": \"2022.3.10f1\",\n  \"is_compiling\": false,\n  \"is_domain_reload_pending\": false,\n  \"play_mode\": {\n    \"is_playing\": false,\n    \"is_paused\": false\n  },\n  \"active_scene\": {\n    \"path\": \"Assets/Scenes/Main.unity\",\n    \"name\": \"Main\"\n  },\n  \"ready_for_tools\": true,\n  \"blocking_reasons\": [],\n  \"recommended_retry_after_ms\": null,\n  \"staleness\": {\n    \"age_ms\": 150,\n    \"is_stale\": false\n  }\n}\n```\n\n**Key Fields:**\n- `ready_for_tools`: Only proceed if `true`\n- `is_compiling`: Wait if `true`\n- `blocking_reasons`: Array explaining why tools might fail\n- `recommended_retry_after_ms`: Suggested wait time\n\n### mcpforunity://editor/selection\n\n**Purpose:** Currently selected objects.\n\n**Returns:**\n```json\n{\n  \"activeObject\": \"Player\",\n  \"activeGameObject\": \"Player\",\n  \"activeInstanceID\": 12345,\n  \"count\": 3,\n  \"gameObjects\": [\"Player\", \"Enemy\", \"Wall\"],\n  \"assetGUIDs\": []\n}\n```\n\n### mcpforunity://editor/active-tool\n\n**Purpose:** Current editor tool state.\n\n**Returns:**\n```json\n{\n  \"activeTool\": \"Move\",\n  \"isCustom\": false,\n  \"pivotMode\": \"Center\",\n  \"pivotRotation\": \"Global\"\n}\n```\n\n### mcpforunity://editor/windows\n\n**Purpose:** All open editor windows.\n\n**Returns:**\n```json\n{\n  \"windows\": [\n    {\n      \"title\": \"Scene\",\n      \"typeName\": \"UnityEditor.SceneView\",\n      \"isFocused\": true,\n      \"position\": {\"x\": 0, \"y\": 0, \"width\": 800, \"height\": 600}\n    }\n  ]\n}\n```\n\n### mcpforunity://editor/prefab-stage\n\n**Purpose:** Current prefab editing context.\n\n**Returns:**\n```json\n{\n  \"isOpen\": true,\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"prefabRootName\": \"Player\",\n  \"isDirty\": false\n}\n```\n\n---\n\n## Camera Resources\n\n### mcpforunity://scene/cameras\n\n**Purpose:** List all cameras in the scene (Unity Camera + CinemachineCamera) with full status. Read this before using `manage_camera` to understand the current camera setup.\n\n**Returns:**\n```json\n{\n  \"brain\": {\n    \"exists\": true,\n    \"gameObject\": \"Main Camera\",\n    \"instanceID\": 55504,\n    \"activeCameraName\": \"Cam_Cinematic\",\n    \"activeCameraID\": -39420,\n    \"isBlending\": false\n  },\n  \"cinemachineCameras\": [\n    {\n      \"instanceID\": -39420,\n      \"name\": \"Cam_Cinematic\",\n      \"isLive\": true,\n      \"priority\": 50,\n      \"follow\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"lookAt\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"body\": \"CinemachineThirdPersonFollow\",\n      \"aim\": \"CinemachineRotationComposer\",\n      \"noise\": \"CinemachineBasicMultiChannelPerlin\",\n      \"extensions\": []\n    }\n  ],\n  \"unityCameras\": [\n    {\n      \"instanceID\": 55504,\n      \"name\": \"Main Camera\",\n      \"depth\": 0.0,\n      \"fieldOfView\": 50.0,\n      \"hasBrain\": true\n    }\n  ],\n  \"cinemachineInstalled\": true\n}\n```\n\n**Key Fields:**\n- `brain`: CinemachineBrain status — which camera is active, blend state\n- `cinemachineCameras`: All CinemachineCamera components with pipeline info (body, aim, noise, extensions)\n- `unityCameras`: All Unity Camera components with depth and FOV\n- `cinemachineInstalled`: Whether Cinemachine package is available\n\n**Use with:** `manage_camera` tool for creating/configuring cameras\n\n---\n\n## Graphics Resources\n\n### mcpforunity://scene/volumes\n\n**Purpose:** List all Volume components in the scene with effects and parameters. Read this before using `manage_graphics` volume actions.\n\n**Returns:**\n```json\n{\n  \"pipeline\": \"Universal (URP)\",\n  \"volumes\": [\n    {\n      \"name\": \"PostProcessVolume\",\n      \"instance_id\": -24600,\n      \"is_global\": true,\n      \"weight\": 1.0,\n      \"priority\": 0,\n      \"blend_distance\": 0,\n      \"profile\": \"MyProfile\",\n      \"profile_path\": \"Assets/Settings/MyProfile.asset\",\n      \"effects\": [\n        {\n          \"type\": \"Bloom\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"threshold\", \"scatter\"]\n        },\n        {\n          \"type\": \"Vignette\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"smoothness\"]\n        }\n      ]\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `is_global`: Whether the volume applies everywhere or only within its collider bounds\n- `effects[].overridden_params`: Which parameters are actively overridden (not using defaults)\n- `profile_path`: Empty string for embedded profiles, asset path for shared profiles\n\n**Use with:** `manage_graphics` volume actions (volume_create, volume_add_effect, volume_set_effect, etc.)\n\n### mcpforunity://rendering/stats\n\n**Purpose:** Current rendering performance counters (draw calls, batches, triangles, memory).\n\n**Returns:**\n```json\n{\n  \"draw_calls\": 42,\n  \"batches\": 35,\n  \"set_pass_calls\": 12,\n  \"triangles\": 15234,\n  \"vertices\": 8456,\n  \"dynamic_batches\": 5,\n  \"static_batches\": 20,\n  \"shadow_casters\": 3,\n  \"render_textures\": 8,\n  \"render_textures_bytes\": 16777216,\n  \"visible_skinned_meshes\": 2\n}\n```\n\n**Use with:** `manage_graphics` stats actions (stats_get, stats_list_counters, stats_get_memory)\n\n### mcpforunity://pipeline/renderer-features\n\n**Purpose:** URP renderer features on the active renderer (SSAO, Decals, etc.).\n\n**Returns:**\n```json\n{\n  \"rendererDataName\": \"PC_Renderer\",\n  \"features\": [\n    {\n      \"index\": 0,\n      \"name\": \"ScreenSpaceAmbientOcclusion\",\n      \"type\": \"ScreenSpaceAmbientOcclusion\",\n      \"isActive\": true,\n      \"properties\": { \"m_Settings\": \"Generic\" }\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `index`: Position in the feature list (use for feature_toggle, feature_remove, feature_configure)\n- `isActive`: Whether the feature is enabled\n- `rendererDataName`: Which URP renderer data asset is active\n\n**Use with:** `manage_graphics` feature actions (feature_list, feature_add, feature_remove, feature_toggle, etc.)\n\n---\n\n## Scene & GameObject Resources\n\n### mcpforunity://scene/gameobject-api\n\n**Purpose:** Documentation for GameObject resources (read this first).\n\n### mcpforunity://scene/gameobject/{instance_id}\n\n**Purpose:** Basic GameObject data (metadata, no component properties).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID from `find_gameobjects`\n\n**Returns:**\n```json\n{\n  \"instanceID\": 12345,\n  \"name\": \"Player\",\n  \"tag\": \"Player\",\n  \"layer\": 8,\n  \"layerName\": \"Player\",\n  \"active\": true,\n  \"activeInHierarchy\": true,\n  \"isStatic\": false,\n  \"transform\": {\n    \"position\": [0, 1, 0],\n    \"rotation\": [0, 0, 0],\n    \"scale\": [1, 1, 1]\n  },\n  \"parent\": {\"instanceID\": 0},\n  \"children\": [{\"instanceID\": 67890}],\n  \"componentTypes\": [\"Transform\", \"Rigidbody\", \"PlayerController\"],\n  \"path\": \"/Player\"\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/components\n\n**Purpose:** All components with full property serialization (paginated).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `page_size` (int): Default 25, max 100\n- `cursor` (int): Pagination cursor\n- `include_properties` (bool): Default true, set false for just types\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"components\": [\n    {\n      \"type\": \"Transform\",\n      \"properties\": {\n        \"position\": {\"x\": 0, \"y\": 1, \"z\": 0},\n        \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0, \"w\": 1}\n      }\n    },\n    {\n      \"type\": \"Rigidbody\",\n      \"properties\": {\n        \"mass\": 1.0,\n        \"useGravity\": true\n      }\n    }\n  ],\n  \"cursor\": 0,\n  \"pageSize\": 25,\n  \"nextCursor\": null,\n  \"hasMore\": false\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/component/{component_name}\n\n**Purpose:** Single component with full properties.\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `component_name` (string): e.g., \"Rigidbody\", \"Camera\", \"Transform\"\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"component\": {\n    \"type\": \"Rigidbody\",\n    \"properties\": {\n      \"mass\": 1.0,\n      \"drag\": 0,\n      \"angularDrag\": 0.05,\n      \"useGravity\": true,\n      \"isKinematic\": false\n    }\n  }\n}\n```\n\n---\n\n## Prefab Resources\n\n### mcpforunity://prefab-api\n\n**Purpose:** Documentation for prefab resources.\n\n### mcpforunity://prefab/{encoded_path}\n\n**Purpose:** Prefab asset information.\n\n**Parameters:**\n- `encoded_path` (string): URL-encoded path, e.g., `Assets%2FPrefabs%2FPlayer.prefab`\n\n**Path Encoding:**\n```\nAssets/Prefabs/Player.prefab → Assets%2FPrefabs%2FPlayer.prefab\n```\n\n**Returns:**\n```json\n{\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"guid\": \"abc123...\",\n  \"prefabType\": \"Regular\",\n  \"rootObjectName\": \"Player\",\n  \"rootComponentTypes\": [\"Transform\", \"PlayerController\"],\n  \"childCount\": 5,\n  \"isVariant\": false,\n  \"parentPrefab\": null\n}\n```\n\n### mcpforunity://prefab/{encoded_path}/hierarchy\n\n**Purpose:** Full prefab hierarchy with nested prefab info.\n\n**Returns:**\n```json\n{\n  \"prefabPath\": \"Assets/Prefabs/Player.prefab\",\n  \"total\": 6,\n  \"items\": [\n    {\n      \"name\": \"Player\",\n      \"instanceId\": 12345,\n      \"path\": \"/Player\",\n      \"activeSelf\": true,\n      \"childCount\": 2,\n      \"componentTypes\": [\"Transform\", \"PlayerController\"]\n    },\n    {\n      \"name\": \"Model\",\n      \"path\": \"/Player/Model\",\n      \"isNestedPrefab\": true,\n      \"nestedPrefabPath\": \"Assets/Prefabs/PlayerModel.prefab\"\n    }\n  ]\n}\n```\n\n---\n\n## Project Resources\n\n### mcpforunity://project/info\n\n**Purpose:** Static project configuration.\n\n**Returns:**\n```json\n{\n  \"projectRoot\": \"/Users/dev/MyProject\",\n  \"projectName\": \"MyProject\",\n  \"unityVersion\": \"2022.3.10f1\",\n  \"platform\": \"StandaloneWindows64\",\n  \"assetsPath\": \"/Users/dev/MyProject/Assets\"\n}\n```\n\n### mcpforunity://project/tags\n\n**Purpose:** All tags defined in TagManager.\n\n**Returns:**\n```json\n[\"Untagged\", \"Respawn\", \"Finish\", \"EditorOnly\", \"MainCamera\", \"Player\", \"GameController\", \"Enemy\"]\n```\n\n### mcpforunity://project/layers\n\n**Purpose:** All layers with indices (0-31).\n\n**Returns:**\n```json\n{\n  \"0\": \"Default\",\n  \"1\": \"TransparentFX\",\n  \"2\": \"Ignore Raycast\",\n  \"4\": \"Water\",\n  \"5\": \"UI\",\n  \"8\": \"Player\",\n  \"9\": \"Enemy\"\n}\n```\n\n### mcpforunity://menu-items\n\n**Purpose:** All available Unity menu items.\n\n**Returns:**\n```json\n[\n  \"File/New Scene\",\n  \"File/Open Scene\",\n  \"File/Save\",\n  \"Edit/Undo\",\n  \"Edit/Redo\",\n  \"GameObject/Create Empty\",\n  \"GameObject/3D Object/Cube\",\n  \"Window/General/Console\"\n]\n```\n\n### mcpforunity://custom-tools\n\n**Purpose:** Custom tools available in the active Unity project.\n\n**Returns:**\n```json\n{\n  \"project_id\": \"MyProject\",\n  \"tool_count\": 3,\n  \"tools\": [\n    {\n      \"name\": \"capture_screenshot\",\n      \"description\": \"Capture screenshots in Unity\",\n      \"parameters\": [\n        {\"name\": \"filename\", \"type\": \"string\", \"required\": true},\n        {\"name\": \"width\", \"type\": \"int\", \"required\": false},\n        {\"name\": \"height\", \"type\": \"int\", \"required\": false}\n      ]\n    }\n  ]\n}\n```\n\n---\n\n## Instance Resources\n\n### mcpforunity://instances\n\n**Purpose:** All running Unity Editor instances (for multi-instance workflows).\n\n**Returns:**\n```json\n{\n  \"transport\": \"http\",\n  \"instance_count\": 2,\n  \"instances\": [\n    {\n      \"id\": \"MyProject@abc123\",\n      \"name\": \"MyProject\",\n      \"hash\": \"abc123\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T10:30:00Z\"\n    },\n    {\n      \"id\": \"TestProject@def456\",\n      \"name\": \"TestProject\",\n      \"hash\": \"def456\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T11:00:00Z\"\n    }\n  ],\n  \"warnings\": []\n}\n```\n\n**Use with:** `set_active_instance(instance=\"MyProject@abc123\")`\n\n---\n\n## Test Resources\n\n### mcpforunity://tests\n\n**Purpose:** All tests in the project.\n\n**Returns:**\n```json\n[\n  {\n    \"name\": \"TestSomething\",\n    \"full_name\": \"MyTests.TestSomething\",\n    \"mode\": \"EditMode\"\n  },\n  {\n    \"name\": \"TestOther\",\n    \"full_name\": \"MyTests.TestOther\",\n    \"mode\": \"PlayMode\"\n  }\n]\n```\n\n### mcpforunity://tests/{mode}\n\n**Purpose:** Tests filtered by mode.\n\n**Parameters:**\n- `mode` (string): \"EditMode\" or \"PlayMode\"\n\n**Example:** `mcpforunity://tests/EditMode`\n\n---\n\n## Best Practices\n\n### 1. Check Editor State First\n\n```python\n# Before any complex operation:\n# Read mcpforunity://editor/state\n# Check ready_for_tools == true\n```\n\n### 2. Use Find Then Read Pattern\n\n```python\n# 1. find_gameobjects to get IDs\nresult = find_gameobjects(search_term=\"Player\")\n\n# 2. Read resource for full data\n# mcpforunity://scene/gameobject/{id}\n```\n\n### 3. Paginate Large Queries\n\n```python\n# Start with include_properties=false for component lists\n# mcpforunity://scene/gameobject/{id}/components?include_properties=false&page_size=25\n\n# Then read specific components as needed\n# mcpforunity://scene/gameobject/{id}/component/Rigidbody\n```\n\n### 4. URL-Encode Prefab Paths\n\n```python\n# Wrong:\n# mcpforunity://prefab/Assets/Prefabs/Player.prefab\n\n# Correct:\n# mcpforunity://prefab/Assets%2FPrefabs%2FPlayer.prefab\n```\n\n### 5. Multi-Instance Awareness\n\n```python\n# Always check mcpforunity://instances when:\n# - First connecting\n# - Commands fail unexpectedly\n# - Working with multiple projects\n```\n","isInternal":false,"tokens":3864,"sizeBytes":13708},{"name":"tools-reference.md","path":"unity-mcp-skill/references/tools-reference.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/unity-mcp-skill/references/tools-reference.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Unity-MCP Tools Reference\n\nEvery built-in MCP tool, with its main actions, parameters, and usage examples. For a tool's full parameter table, open its generated page: `https://coplaydev.github.io/unity-mcp/reference/tools/<group>/<tool>` (tools with no group, such as `manage_tools`, are under `core`).\n\nEach section names the tool's group when it is not `core`. A tool outside `core` can be hidden (over HTTP, only `core` starts enabled); enable its group with `manage_tools(action=\"activate\", group=\"<group>\")`.\n\n> **Template warning:** Examples in this file are skill templates and may be inaccurate for some Unity versions, packages, or project setups. Validate parameters and payload shapes against your active tool schema and runtime behavior.\n\n## Table of Contents\n\n- [Infrastructure Tools](#infrastructure-tools)\n- [Scene Tools](#scene-tools)\n- [GameObject Tools](#gameobject-tools)\n- [Script Tools](#script-tools)\n- [Asset Tools](#asset-tools)\n- [Material & Shader Tools](#material--shader-tools)\n- [UI Tools](#ui-tools)\n- [Editor Control Tools](#editor-control-tools)\n- [Build Tools](#build-tools)\n- [Testing Tools](#testing-tools)\n- [Search Tools](#search-tools)\n- [Custom Tools](#custom-tools)\n- [Camera Tools](#camera-tools)\n- [Graphics Tools](#graphics-tools)\n- [Package Tools](#package-tools)\n- [Physics Tools](#physics-tools)\n- [ProBuilder Tools](#probuilder-tools)\n- [Profiler Tools](#profiler-tools)\n- [Docs Tools](#docs-tools)\n- [Animation Tools](#animation-tools)\n- [VFX Tools](#vfx-tools)\n- [Scripting Extension Tools](#scripting-extension-tools)\n- [Asset Generation Tools](#asset-generation-tools)\n\n---\n\n## Project Info Resource\n\nRead `mcpforunity://project/info` to detect project capabilities before making assumptions about UI, input, or rendering setup.\n\n**Returned fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `projectRoot` | string | Absolute path to project root |\n| `projectName` | string | Project folder name |\n| `unityVersion` | string | e.g. `\"2022.3.20f1\"` |\n| `platform` | string | Active build target e.g. `\"StandaloneWindows64\"` |\n| `assetsPath` | string | Absolute path to Assets folder |\n| `renderPipeline` | string | `\"BuiltIn\"`, `\"Universal\"`, `\"HighDefinition\"`, or `\"Custom\"` |\n| `activeInputHandler` | string | `\"Old\"`, `\"New\"`, or `\"Both\"` |\n| `packages.ugui` | bool | `com.unity.ugui` installed (Canvas, Image, Button, etc.) |\n| `packages.textmeshpro` | bool | `com.unity.textmeshpro` installed (TMP_Text, TMP_InputField) |\n| `packages.inputsystem` | bool | `com.unity.inputsystem` installed (InputAction, PlayerInput) |\n| `packages.uiToolkit` | bool | Always `true` for Unity 2021.3+ (UIDocument, VisualElement, UXML/USS) |\n| `packages.screenCapture` | bool | `com.unity.modules.screencapture` enabled (ScreenCapture API for screenshots) |\n\n**Key decision points:**\n\n- **UI system**: If `packages.uiToolkit` is true (always for Unity 2021+), use `manage_ui` for UI Toolkit workflows (UXML/USS). If `packages.ugui` is true, use Canvas + uGUI components via `batch_execute`. UI Toolkit is preferred for new UI — it uses a frontend-like workflow (UXML for structure, USS for styling).\n- **Text**: If `packages.textmeshpro` is true, use `TextMeshProUGUI` instead of legacy `Text`.\n- **Input**: Use `activeInputHandler` to decide EventSystem module — `StandaloneInputModule` (Old) vs `InputSystemUIInputModule` (New). See [workflows.md — Input System](workflows.md#input-system-old-vs-new).\n- **Shaders**: Use `renderPipeline` to pick correct shader names — `Standard` (BuiltIn) vs `Universal Render Pipeline/Lit` (URP) vs `HDRP/Lit` (HDRP).\n\n---\n\n## Infrastructure Tools\n\n### batch_execute\n\nExecute multiple MCP commands in a single batch (10-100x faster).\n\n```python\nbatch_execute(\n    commands=[                    # list[dict], required, max 25\n        {\"tool\": \"tool_name\", \"params\": {...}},\n        ...\n    ],\n    parallel=False,              # bool, optional - advisory only (Unity may still run sequentially)\n    fail_fast=False,             # bool, optional - stop on first failure\n    max_parallelism=None         # int, optional - max parallel workers\n)\n```\n\n`batch_execute` is not transactional: earlier commands are not rolled back if a later command fails.\n\n### set_active_instance\n\nRoute commands to a specific Unity instance (multi-instance workflows).\n\n```python\nset_active_instance(\n    instance=\"ProjectName@abc123\"  # str, required - Name@hash or hash prefix\n)\n```\n\n### refresh_unity\n\nRefresh asset database and trigger script compilation.\n\n```python\nrefresh_unity(\n    mode=\"if_dirty\",             # \"if_dirty\" | \"force\"\n    scope=\"all\",                 # \"assets\" | \"scripts\" | \"all\"\n    compile=\"none\",              # \"none\" | \"request\"\n    wait_for_ready=True          # bool - wait until editor ready\n)\n```\n\n### manage_tools\n\nShow, enable, or hide tool groups for the current session. Always visible (no group).\n\n```python\nmanage_tools(action=\"list_groups\")                  # every group, whether it is on, and its tools\nmanage_tools(action=\"activate\", group=\"animation\")  # \"deactivate\" hides a group again\nmanage_tools(action=\"sync\")                         # re-read the tool toggles in the Unity editor\nmanage_tools(action=\"reset\")                        # back to the defaults\n```\n\nGroups: `core`, `animation`, `asset_gen`, `docs`, `probuilder`, `profiling`, `scripting_ext`, `testing`, `ui`, `vfx`. The `mcpforunity://tool-groups` resource lists the same catalog read-only. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_tools)\n\n### debug_request_context\n\nDiagnostics: returns the request's `client_id`, `session_id` and meta, the session's active Unity instance, and the server version. No parameters; always visible (no group).\n\n```python\ndebug_request_context()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/debug_request_context)\n\n---\n\n## Scene Tools\n\n### manage_scene\n\nScene CRUD operations, hierarchy queries, multi-scene editing, validation, and scene view control. Screenshots are `manage_camera` actions (see [Camera Tools](#camera-tools)); build-settings scenes are `manage_build(action=\"scenes\")`.\n\n```python\n# Get hierarchy (paginated)\nmanage_scene(\n    action=\"get_hierarchy\",\n    page_size=50,                # int, default 50, max 500\n    cursor=0,                    # int, pagination cursor\n    parent=None,                 # str|int, optional - filter by parent\n    include_transform=False      # bool - include local transforms\n)\n\n# Frame scene view on target\nmanage_scene(\n    action=\"scene_view_frame\",\n    scene_view_target=\"Player\"   # str|int - GO name, path, or instance ID to frame\n)\n\n# Other actions\nmanage_scene(action=\"get_active\")        # Current scene info\nmanage_scene(action=\"get_build_settings\") # Build settings\nmanage_scene(action=\"create\", name=\"NewScene\", path=\"Assets/Scenes/\")\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Main.unity\")\nmanage_scene(action=\"save\")\n\n# Scene templates: \"empty\" (no objects), \"default\", \"3d_basic\", \"2d_basic\"\nmanage_scene(action=\"create\", name=\"Level1\", path=\"Assets/Scenes/\", template=\"3d_basic\")\n\n# Multi-scene editing\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Level2.unity\", additive=True)  # keep current scene\nmanage_scene(action=\"get_loaded_scenes\")\nmanage_scene(action=\"set_active_scene\", scene_name=\"Level2\")\nmanage_scene(action=\"move_to_scene\", target=\"Player\", scene_name=\"Level2\")     # moves a root GameObject\nmanage_scene(action=\"close_scene\", scene_name=\"Level2\", remove_scene=True)     # remove_scene=False only unloads\n\n# Validation: missing scripts, broken prefabs\nmanage_scene(action=\"validate\")\nmanage_scene(action=\"validate\", auto_repair=True)  # also removes missing scripts (undoable)\n```\n\n### find_gameobjects\n\nSearch for GameObjects (returns instance IDs only).\n\n```python\nfind_gameobjects(\n    search_term=\"Player\",        # str, required\n    search_method=\"by_name\",     # \"by_name\"|\"by_tag\"|\"by_layer\"|\"by_component\"|\"by_path\"|\"by_id\"\n    include_inactive=False,      # bool|str\n    page_size=50,                # int, default 50, max 500\n    cursor=0                     # int, pagination cursor\n)\n# Returns: {\"ids\": [12345, 67890], \"next_cursor\": 50, ...}\n```\n\n---\n\n## GameObject Tools\n\n### manage_gameobject\n\nCreate, modify, delete, duplicate GameObjects.\n\n```python\n# Create\nmanage_gameobject(\n    action=\"create\",\n    name=\"MyCube\",               # str, required\n    primitive_type=\"Cube\",       # \"Cube\"|\"Sphere\"|\"Capsule\"|\"Cylinder\"|\"Plane\"|\"Quad\"\n    position=[0, 1, 0],          # list[float] or JSON string \"[0,1,0]\"\n    rotation=[0, 45, 0],         # euler angles\n    scale=[1, 1, 1],\n    components_to_add=[\"Rigidbody\", \"BoxCollider\"],\n    save_as_prefab=False,\n    prefab_path=\"Assets/Prefabs/MyCube.prefab\"\n)\n\n# Prefab instantiation — place a prefab instance in the scene\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"                # optional parent GameObject\n)\n# Smart lookup — just the prefab name works too:\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Modify\nmanage_gameobject(\n    action=\"modify\",\n    target=\"Player\",             # name, path, or instance ID\n    search_method=\"by_name\",     # how to find target\n    position=[10, 0, 0],\n    rotation=[0, 90, 0],\n    scale=[2, 2, 2],\n    set_active=True,\n    layer=\"Player\",\n    components_to_add=[\"AudioSource\"],\n    components_to_remove=[\"OldComponent\"],\n    component_properties={       # nested dict for property setting\n        \"Rigidbody\": {\n            \"mass\": 10.0,\n            \"useGravity\": True\n        }\n    }\n)\n\n# Delete\nmanage_gameobject(action=\"delete\", target=\"OldObject\")\n\n# Duplicate\nmanage_gameobject(\n    action=\"duplicate\",\n    target=\"Player\",\n    new_name=\"Player2\",\n    offset=[5, 0, 0]             # position offset from original\n)\n\n# Move relative\nmanage_gameobject(\n    action=\"move_relative\",\n    target=\"Player\",\n    reference_object=\"Enemy\",    # optional reference\n    direction=\"left\",            # \"left\"|\"right\"|\"up\"|\"down\"|\"forward\"|\"back\"\n    distance=5.0,\n    world_space=True\n)\n\n# Look at target (rotates GO to face a point or another GO)\nmanage_gameobject(\n    action=\"look_at\",\n    target=\"MainCamera\",         # the GO to rotate\n    look_at_target=\"Player\",     # str (GO name/path) or list[float] world position\n    look_at_up=[0, 1, 0]        # optional up vector, default [0,1,0]\n)\n```\n\n### manage_components\n\nAdd, remove, or set properties on components.\n\n```python\n# Add component\nmanage_components(\n    action=\"add\",\n    target=12345,                # instance ID (preferred) or name\n    component_type=\"Rigidbody\",\n    search_method=\"by_id\"\n)\n\n# Remove component\nmanage_components(\n    action=\"remove\",\n    target=\"Player\",\n    component_type=\"OldScript\"\n)\n\n# Set single property\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Rigidbody\",\n    property=\"mass\",\n    value=5.0\n)\n\n# Set multiple properties\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Transform\",\n    properties={\n        \"position\": [1, 2, 3],\n        \"localScale\": [2, 2, 2]\n    }\n)\n\n# Set object reference property (reference another GameObject by name)\nmanage_components(\n    action=\"set_property\",\n    target=\"GameManager\",\n    component_type=\"GameManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Bee_1\"}]\n)\n\n# Object reference formats supported:\n# - {\"name\": \"ObjectName\"}     → Find GameObject in scene by name\n# - {\"instanceID\": 12345}      → Direct instance ID reference\n# - {\"guid\": \"abc123...\"}      → Asset GUID reference\n# - {\"path\": \"Assets/...\"}     → Asset path reference\n# - \"Assets/Prefabs/My.prefab\" → String shorthand for asset paths\n# - \"ObjectName\"               → String shorthand for scene name lookup\n# - 12345                      → Integer shorthand for instanceID\n# - {\"guid\": \"...\", \"spriteName\": \"Hero_0\"} or {\"guid\": \"...\", \"fileID\": 12345}\n#                              → Sprite sub-asset of a sliced sheet (single-sprite textures resolve from guid/path alone)\n```\n\n---\n\n## Script Tools\n\n### create_script\n\nCreate a new C# script.\n\n```python\ncreate_script(\n    path=\"Assets/Scripts/MyScript.cs\",  # str, required\n    contents='''using UnityEngine;\n\npublic class MyScript : MonoBehaviour\n{\n    void Start() { }\n    void Update() { }\n}''',\n    script_type=\"MonoBehaviour\",  # optional hint\n    namespace=\"MyGame\"            # optional namespace\n)\n```\n\n### script_apply_edits\n\nApply structured edits to C# scripts (safer than raw text edits).\n\n```python\nscript_apply_edits(\n    name=\"MyScript\",             # script name (no .cs)\n    path=\"Assets/Scripts\",       # folder path\n    edits=[\n        # Replace entire method\n        {\n            \"op\": \"replace_method\",\n            \"methodName\": \"Update\",\n            \"replacement\": \"void Update() { transform.Rotate(Vector3.up); }\"\n        },\n        # Insert new method\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": \"void OnEnable() { Debug.Log(\\\"Enabled\\\"); }\"\n        },\n        # Delete method\n        {\n            \"op\": \"delete_method\",\n            \"methodName\": \"OldMethod\"\n        },\n        # Anchor-based insert\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"void Start()\",\n            \"position\": \"before\",  # \"before\" | \"after\"\n            \"text\": \"// Called before Start\\n\"\n        },\n        # Regex replace\n        {\n            \"op\": \"regex_replace\",\n            \"pattern\": \"Debug\\\\.Log\\\\(\",\n            \"text\": \"Debug.LogWarning(\"\n        },\n        # Prepend/append to file\n        {\"op\": \"prepend\", \"text\": \"// File header\\n\"},\n        {\"op\": \"append\", \"text\": \"\\n// File footer\"}\n    ]\n)\n```\n\n### apply_text_edits\n\nApply precise character-position edits (1-indexed lines/columns).\n\n```python\napply_text_edits(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    edits=[\n        {\n            \"startLine\": 10,\n            \"startCol\": 5,\n            \"endLine\": 10,\n            \"endCol\": 20,\n            \"newText\": \"replacement text\"\n        }\n    ],\n    precondition_sha256=\"abc123...\",  # optional, prevents stale edits\n    strict=True                        # optional, stricter validation\n)\n```\n\n### validate_script\n\nCheck script for syntax/semantic errors.\n\n```python\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    level=\"standard\",            # \"basic\" | \"standard\"\n    include_diagnostics=True     # include full error details\n)\n```\n\n### get_sha\n\nGet file hash without content (for preconditions).\n\n```python\nget_sha(uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\")\n# Returns: {\"sha256\": \"...\", \"lengthBytes\": 1234}\n```\n\n### delete_script\n\nDelete a script file.\n\n```python\ndelete_script(uri=\"mcpforunity://path/Assets/Scripts/OldScript.cs\")\n```\n\n### manage_script\n\nLegacy whole-file router with three actions: `create`, `read`, `delete`. `name` is the class name without `.cs`; `path` is its folder under `Assets/`. There is no update action: edit with `script_apply_edits` or `apply_text_edits`.\n\n```python\nmanage_script(action=\"read\", name=\"PlayerController\", path=\"Assets/Scripts\")  # returns the file contents\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script)\n\n### manage_script_capabilities\n\nLists the edit ops `script_apply_edits` supports (structured and text), the max edit payload size, and the active guards. No parameters; always visible (no group).\n\n```python\nmanage_script_capabilities()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script_capabilities)\n\n---\n\n## Asset Tools\n\n### manage_asset\n\nAsset operations: search, import, create, modify, delete.\n\n```python\n# Search assets (paginated)\nmanage_asset(\n    action=\"search\",\n    path=\"Assets\",               # search scope\n    search_pattern=\"*.prefab\",   # glob or \"t:MonoScript\" filter\n    filter_type=\"Prefab\",        # optional type filter\n    page_size=25,                # keep small to avoid large payloads\n    page_number=1,               # 1-based\n    generate_preview=False       # avoid base64 bloat\n)\n\n# Get asset info\nmanage_asset(action=\"get_info\", path=\"Assets/Prefabs/Player.prefab\")\n\n# Create asset\nmanage_asset(\n    action=\"create\",\n    path=\"Assets/Materials/NewMaterial.mat\",\n    asset_type=\"Material\",\n    properties={\"color\": [1, 0, 0, 1]}\n)\n\n# Duplicate/move/rename\nmanage_asset(action=\"duplicate\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\nmanage_asset(action=\"move\", path=\"Assets/A.prefab\", destination=\"Assets/Prefabs/A.prefab\")\nmanage_asset(action=\"rename\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\n\n# Create folder\nmanage_asset(action=\"create_folder\", path=\"Assets/NewFolder\")\n\n# Delete\nmanage_asset(action=\"delete\", path=\"Assets/OldAsset.asset\")\n```\n\n### manage_prefabs\n\nPrefab assets: headless edits with `modify_contents`, or interactive editing in a prefab stage.\n\n```python\n# Get prefab info\nmanage_prefabs(action=\"get_info\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Get prefab hierarchy\nmanage_prefabs(action=\"get_hierarchy\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Create prefab from scene GameObject\nmanage_prefabs(\n    action=\"create_from_gameobject\",\n    target=\"Player\",             # GameObject in scene\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    allow_overwrite=False\n)\n\n# Modify prefab contents (headless)\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",        # object within prefab\n    position=[0, 1, 0],\n    components_to_add=[\"AudioSource\"]\n)\n\n# Delete child GameObjects from prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    delete_child=[\"OldChild\", \"Turret/Barrel\"]  # single string or list\n)\n\n# Create child GameObject in prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    create_child={\"name\": \"SpawnPoint\", \"primitive_type\": \"Sphere\", \"position\": [0, 2, 0]}\n)\n# A list creates several children in one save; \"source_prefab_path\" instead of\n# \"primitive_type\" nests a prefab instance: {\"name\": \"Gun\", \"source_prefab_path\": \"Assets/Prefabs/Gun.prefab\"}\n\n# Set component properties on prefab contents\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",\n    component_properties={\"Rigidbody\": {\"mass\": 5.0}, \"MyScript\": {\"health\": 100}}\n)\n\n# Interactive: open a prefab stage, edit with manage_gameobject/manage_components, save, close\nmanage_prefabs(action=\"open_prefab_stage\", prefab_path=\"Assets/Prefabs/Enemy.prefab\")\nmanage_prefabs(action=\"save_prefab_stage\")\nmanage_prefabs(action=\"close_prefab_stage\")  # back to the main scene\n```\n\n---\n\n## Material & Shader Tools\n\n### manage_material\n\nCreate and modify materials.\n\n```python\n# Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/Red.mat\",\n    shader=\"Standard\",\n    properties={\"_Color\": [1, 0, 0, 1]}\n)\n\n# Get material info\nmanage_material(action=\"get_material_info\", material_path=\"Assets/Materials/Red.mat\")\n\n# Set shader property\nmanage_material(\n    action=\"set_material_shader_property\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_Metallic\",\n    value=0.8\n)\n\n# Set color\nmanage_material(\n    action=\"set_material_color\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_BaseColor\",\n    color=[0, 1, 0, 1]           # RGBA\n)\n\n# Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"MyCube\",\n    material_path=\"Assets/Materials/Red.mat\",\n    slot=0                       # material slot index\n)\n\n# Set renderer color directly\nmanage_material(\n    action=\"set_renderer_color\",\n    target=\"MyCube\",\n    color=[1, 0, 0, 1],\n    mode=\"create_unique\"          # Creates a unique .mat asset per object (persistent)\n    # Other modes: \"property_block\" (default, not persistent),\n    #              \"shared\" (mutates shared material — avoid for primitives),\n    #              \"instance\" (runtime only, not persistent)\n)\n```\n\n### manage_texture\n\nCreate procedural textures. Group: `vfx`.\n\n```python\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checker.png\",\n    width=64,\n    height=64,\n    fill_color=[255, 255, 255, 255]  # or [1.0, 1.0, 1.0, 1.0]\n)\n\n# Apply pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checker.png\",\n    pattern=\"checkerboard\",      # \"checkerboard\"|\"stripes\"|\"dots\"|\"grid\"|\"brick\"\n    palette=[[0,0,0,255], [255,255,255,255]],\n    pattern_size=8\n)\n\n# Apply gradient\nmanage_texture(\n    action=\"apply_gradient\",\n    path=\"Assets/Textures/Gradient.png\",\n    gradient_type=\"linear\",      # \"linear\"|\"radial\"\n    gradient_angle=45,\n    palette=[[255,0,0,255], [0,0,255,255]]\n)\n```\n\n### manage_shader\n\nCreate, read, update, or delete `.shader` files. Group: `vfx`. `name` is the file name without `.shader`; `path` is its folder under `Assets/`. To use the shader, pass the name declared in its `Shader \"...\"` line to `manage_material`.\n\n```python\nmanage_shader(action=\"create\", name=\"UnlitTint\", path=\"Assets/Shaders\",\n              contents='Shader \"Custom/UnlitTint\" { ... }')\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/vfx/manage_shader)\n\n---\n\n## UI Tools\n\n### manage_ui\n\nManage Unity UI Toolkit elements: UXML documents, USS stylesheets, UIDocument components, and visual tree inspection. Group: `ui`.\n\n```python\n# Create a UXML file\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='<ui:UXML xmlns:ui=\"UnityEngine.UIElements\"><ui:Label text=\"Hello\" /></ui:UXML>'\n)\n\n# Create a USS stylesheet\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 32px; color: white; }\"\n)\n\n# Read a UXML/USS file\nmanage_ui(\n    action=\"read\",\n    path=\"Assets/UI/MainMenu.uxml\"\n)\n# Returns: {\"success\": true, \"data\": {\"contents\": \"...\", \"path\": \"...\"}}\n\n# Update an existing file\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 48px; color: yellow; -unity-font-style: bold; }\"\n)\n\n# Attach UIDocument to a GameObject\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UICanvas\",                    # GameObject name or path\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/Panel.asset\",  # optional, auto-creates if omitted\n    sort_order=0                          # optional, default 0\n)\n\n# Create PanelSettings asset\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/Panel.asset\",\n    scale_mode=\"ScaleWithScreenSize\",     # optional: \"ConstantPixelSize\"|\"ConstantPhysicalSize\"|\"ScaleWithScreenSize\"\n    reference_resolution={\"width\": 1920, \"height\": 1080}  # optional, for ScaleWithScreenSize\n)\n\n# Inspect the visual tree of a UIDocument\nmanage_ui(\n    action=\"get_visual_tree\",\n    target=\"UICanvas\",                    # GameObject with UIDocument\n    max_depth=10                          # optional, default 10\n)\n# Returns: hierarchy of VisualElements with type, name, classes, styles, text, children\n```\n\n**UI Toolkit workflow:**\n\n1. Create UXML (structure, like HTML) and USS (styling, like CSS) files\n2. Create a PanelSettings asset (or let `attach_ui_document` auto-create one)\n3. Create an empty GameObject and attach UIDocument with the UXML source\n4. Use `get_visual_tree` to inspect the result\n\n**Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML files, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n---\n\n## Editor Control Tools\n\n### manage_editor\n\nControl Unity Editor state, undo/redo. Prefab stages are `manage_prefabs` actions.\n\n```python\nmanage_editor(action=\"play\")               # Enter play mode\nmanage_editor(action=\"pause\")              # Pause play mode\nmanage_editor(action=\"stop\")               # Exit play mode\n\nmanage_editor(action=\"set_active_tool\", tool_name=\"Move\")  # Move/Rotate/Scale/etc.\n\nmanage_editor(action=\"add_tag\", tag_name=\"Enemy\")\nmanage_editor(action=\"remove_tag\", tag_name=\"OldTag\")\n\nmanage_editor(action=\"add_layer\", layer_name=\"Projectiles\")\nmanage_editor(action=\"remove_layer\", layer_name=\"OldLayer\")\n\nmanage_editor(action=\"undo\")               # Returns the name of the undone step\nmanage_editor(action=\"redo\")\n\n# Package deployment (no confirmation dialog — designed for LLM-driven iteration)\nmanage_editor(action=\"deploy_package\")     # Copy configured MCPForUnity source into installed package\nmanage_editor(action=\"restore_package\")    # Revert to pre-deployment backup\n```\n\n**Deploy workflow:** Set the source path in MCP for Unity Advanced Settings first. `deploy_package` copies the source into the project's package location, creates a backup, and triggers `AssetDatabase.Refresh`. Follow with `refresh_unity(wait_for_ready=True)` to wait for recompilation.\n\n### execute_menu_item\n\nExecute any Unity menu item.\n\n```python\nexecute_menu_item(menu_path=\"File/Save Project\")\nexecute_menu_item(menu_path=\"GameObject/3D Object/Cube\")\nexecute_menu_item(menu_path=\"Window/General/Console\")\n```\n\n### read_console\n\nRead or clear Unity console messages.\n\n```python\n# Get recent messages\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\", \"log\"],  # or [\"all\"]\n    count=10,                    # max messages (ignored with paging)\n    filter_text=\"NullReference\", # optional text filter\n    page_size=50,\n    cursor=0,\n    format=\"detailed\",           # \"plain\"|\"detailed\"|\"json\"\n    include_stacktrace=True\n)\n\n# Clear console\nread_console(action=\"clear\")\n```\n\n---\n\n## Build Tools\n\n### manage_build\n\nPlayer builds, platform switching, player settings, build-settings scenes, build profiles, and batch builds. Actions: `build`, `status`, `platform`, `settings`, `scenes`, `profiles`, `batch`, `cancel`. `build` and `batch` return a `job_id`; poll it with `status`, stop it with `cancel`. `platform`, `settings` (with `property`) and `scenes` read when the value is omitted and write when it is given. `profiles` and `profile` need Unity 6+.\n\n```python\nmanage_build(action=\"scenes\", scenes='[\"Assets/Scenes/Menu.unity\", \"Assets/Scenes/Level1.unity\"]')  # replaces the list\nmanage_build(action=\"build\", target=\"windows64\", output_path=\"Builds/Win/Game.exe\", development=\"true\")\nmanage_build(action=\"status\", job_id=\"<job_id>\")\n```\n\nTargets: `windows64`, `osx`, `linux64`, `android`, `ios`, `webgl`, `uwp`, `tvos`, `visionos`. Switching `platform` reimports assets. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_build)\n\n---\n\n## Testing Tools\n\nGroup: `testing`.\n\n### run_tests\n\nStart async test execution.\n\n```python\nresult = run_tests(\n    mode=\"EditMode\",             # \"EditMode\"|\"PlayMode\"\n    test_names=[\"MyTests.TestA\", \"MyTests.TestB\"],  # specific tests\n    group_names=[\"Integration*\"],  # regex patterns\n    category_names=[\"Unit\"],     # NUnit categories\n    assembly_names=[\"Tests\"],    # assembly filter\n    include_failed_tests=True,   # include failure details\n    include_details=False        # include all test details\n)\n# Returns: {\"job_id\": \"abc123\", ...}\n```\n\n### get_test_job\n\nPoll test job status.\n\n```python\nresult = get_test_job(\n    job_id=\"abc123\",\n    wait_timeout=60,             # wait up to N seconds\n    include_failed_tests=True,\n    include_details=False\n)\n# Returns: {\"status\": \"complete\"|\"running\"|\"failed\", \"results\": {...}}\n```\n\n---\n\n## Search Tools\n\n### find_in_file\n\nSearch file contents with regex.\n\n```python\nfind_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    pattern=\"public void \\\\w+\",  # regex pattern\n    max_results=200,\n    ignore_case=True\n)\n# Returns: line numbers, content excerpts, match positions\n```\n\n---\n\n## Custom Tools\n\n### execute_custom_tool\n\nExecute project-specific custom tools.\n\n```python\nexecute_custom_tool(\n    tool_name=\"my_custom_tool\",\n    parameters={\"param1\": \"value\", \"param2\": 42}\n)\n```\n\nDiscover available custom tools via `mcpforunity://custom-tools` resource.\n\n---\n\n## Camera Tools\n\n### manage_camera\n\nUnified camera management (Unity Camera + Cinemachine). Works without Cinemachine using basic Camera; unlocks presets, pipelines, and blending when Cinemachine is installed. Use `ping` to check availability.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target camera (name, path, or instance ID) |\n| `search_method` | string | No | `by_id`, `by_name`, `by_path` |\n| `properties` | dict \\| string | No | Action-specific parameters |\n\n**Screenshot parameters** (for `screenshot` and `screenshot_multiview` actions):\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `capture_source` | string | `\"game_view\"` (default) or `\"scene_view\"` (editor viewport) |\n| `view_target` | string\\|int\\|list | Target to focus on (GO name/path/ID or [x,y,z]). game_view: aims camera; scene_view: frames viewport |\n| `camera` | string | Camera to capture from (defaults to Camera.main). game_view only |\n| `include_image` | bool | Return base64 PNG inline (default false) |\n| `max_resolution` | int | Downscale cap in px (default 640) |\n| `batch` | string | `\"surround\"` (6 angles) or `\"orbit\"` (configurable grid). game_view only |\n| `view_position` | list[float] | World position [x,y,z] to place camera. game_view only |\n| `view_rotation` | list[float] | Euler rotation [x,y,z] (overrides view_target). game_view only |\n\n**Actions by category:**\n\n**Setup:**\n- `ping` — Check Cinemachine availability and version\n- `ensure_brain` — Ensure CinemachineBrain exists on main camera. Properties: `camera` (target camera), `defaultBlendStyle`, `defaultBlendDuration`\n- `get_brain_status` — Get Brain state (active camera, blend status)\n\n**Creation:**\n- `create_camera` — Create camera with optional preset. Properties: `name`, `preset` (follow/third_person/freelook/dolly/static/top_down/side_scroller), `follow`, `lookAt`, `priority`, `fieldOfView`. Falls back to basic Camera without Cinemachine.\n\n**Configuration:**\n- `set_target` — Set Follow and/or LookAt targets. Properties: `follow`, `lookAt` (GO name/path/ID)\n- `set_priority` — Set camera priority for Brain selection. Properties: `priority` (int)\n- `set_lens` — Configure lens. Properties: `fieldOfView`, `nearClipPlane`, `farClipPlane`, `orthographicSize`, `dutch`\n- `set_body` — Configure Body component (Cinemachine). Properties: `bodyType` (to swap), plus component-specific properties\n- `set_aim` — Configure Aim component (Cinemachine). Properties: `aimType` (to swap), plus component-specific properties\n- `set_noise` — Configure Noise (Cinemachine). Properties: `amplitudeGain`, `frequencyGain`\n\n**Extensions (Cinemachine):**\n- `add_extension` — Add extension. Properties: `extensionType` (CinemachineConfiner2D, CinemachineDeoccluder, CinemachineImpulseListener, CinemachineFollowZoom, CinemachineRecomposer, etc.)\n- `remove_extension` — Remove extension by type. Properties: `extensionType`\n\n**Control:**\n- `list_cameras` — List all cameras with status\n- `set_blend` — Configure default blend on Brain. Properties: `style` (Cut/EaseInOut/Linear/etc.), `duration`\n- `force_camera` — Override Brain to use specific camera\n- `release_override` — Release camera override\n\n**Capture:**\n- `screenshot` — Capture screenshot. Supports `capture_source=\"game_view\"` (default, camera-based) or `\"scene_view\"` (editor viewport). game_view supports inline base64, batch surround/orbit, positioned capture. scene_view supports `view_target` for framing.\n- `screenshot_multiview` — Shorthand for screenshot with batch='surround' and include_image=true.\n\n**Examples:**\n\n```python\n# Check Cinemachine availability\nmanage_camera(action=\"ping\")\n\n# Create a third-person camera following the player\nmanage_camera(action=\"create_camera\", properties={\n    \"name\": \"FollowCam\", \"preset\": \"third_person\",\n    \"follow\": \"Player\", \"lookAt\": \"Player\", \"priority\": 20\n})\n\n# Ensure Brain exists on main camera\nmanage_camera(action=\"ensure_brain\")\n\n# Configure body component\nmanage_camera(action=\"set_body\", target=\"FollowCam\", properties={\n    \"bodyType\": \"CinemachineThirdPersonFollow\",\n    \"cameraDistance\": 5.0, \"shoulderOffset\": [0.5, 0.5, 0]\n})\n\n# Set aim\nmanage_camera(action=\"set_aim\", target=\"FollowCam\", properties={\n    \"aimType\": \"CinemachineRotationComposer\"\n})\n\n# Add camera shake\nmanage_camera(action=\"set_noise\", target=\"FollowCam\", properties={\n    \"amplitudeGain\": 0.5, \"frequencyGain\": 1.0\n})\n\n# Set priority to make this the active camera\nmanage_camera(action=\"set_priority\", target=\"FollowCam\", properties={\"priority\": 50})\n\n# Force a specific camera\nmanage_camera(action=\"force_camera\", target=\"CinematicCam\")\n\n# Release override (return to priority-based selection)\nmanage_camera(action=\"release_override\")\n\n# Configure blend transitions\nmanage_camera(action=\"set_blend\", properties={\"style\": \"EaseInOut\", \"duration\": 2.0})\n\n# Add deoccluder extension\nmanage_camera(action=\"add_extension\", target=\"FollowCam\", properties={\n    \"extensionType\": \"CinemachineDeoccluder\"\n})\n\n# Screenshot from a specific camera (game_view, default)\nmanage_camera(action=\"screenshot\", camera=\"FollowCam\", include_image=True, max_resolution=512)\n\n# Scene View screenshot (captures editor viewport — gizmos, wireframes, grid)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View screenshot framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Batch surround centered on a target: one contact sheet of 6 labeled angles\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Batch orbit: grid of orbit_angles x orbit_elevations tiles around a target\nmanage_camera(action=\"screenshot\", batch=\"orbit\", view_target=\"Player\",\n              orbit_angles=8,              # azimuth steps (default 8, max 36)\n              orbit_elevations=[0, 30],    # degrees (default [0, 30, -15])\n              orbit_distance=10,           # optional, auto-fit if omitted\n              orbit_fov=60, max_resolution=256)\n\n# Positioned capture: temp camera at a viewpoint (view_rotation overrides the view_target aim)\nmanage_camera(action=\"screenshot\", view_target=\"Enemy\", view_position=[0, 10, -10], max_resolution=512)\n\n# List all cameras\nmanage_camera(action=\"list_cameras\")\n```\n\n**Tier system:**\n- Tier 1 actions (ping, create_camera, set_target, set_lens, set_priority, list_cameras, screenshot, screenshot_multiview) work without Cinemachine — they fall back to basic Unity Camera.\n- Tier 2 actions (ensure_brain, get_brain_status, set_body, set_aim, set_noise, add/remove_extension, set_blend, force_camera, release_override) require `com.unity.cinemachine`. If called without Cinemachine, they return an error with a fallback suggestion.\n\n**Resource:** Read `mcpforunity://scene/cameras` for current camera state before modifying.\n\n---\n\n## Graphics Tools\n\n### manage_graphics\n\nUnified rendering and graphics management: volumes/post-processing, light baking, rendering stats, pipeline configuration, and URP renderer features. Requires URP or HDRP for volume/feature actions. Use `ping` to check pipeline status and available features.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target object name or instance ID |\n| `effect` | string | Sometimes | Effect type name (e.g., `Bloom`, `Vignette`) |\n| `properties` | dict | No | Action-specific properties to set |\n| `parameters` | dict | No | Effect parameter values |\n| `settings` | dict | No | Bake or pipeline settings |\n| `name` | string | No | Name for created objects |\n| `profile_path` | string | No | Asset path for VolumeProfile |\n| `path` | string | No | Asset path (for `volume_create_profile`) |\n| `position` | list[float] | No | Position [x,y,z] |\n\n**Actions by category:**\n\n**Status:**\n- `ping` — Check render pipeline type, available features, and package status\n\n**Volume (require URP/HDRP):**\n- `volume_create` — Create a Volume GameObject with optional effects. Properties: `name`, `is_global` (default true), `weight` (0-1), `priority`, `profile_path` (existing profile), `effects` (list of effect defs)\n- `volume_add_effect` — Add effect override to a Volume. Params: `target` (Volume GO), `effect` (e.g., \"Bloom\")\n- `volume_set_effect` — Set effect parameters. Params: `target`, `effect`, `parameters` (dict of param name to value)\n- `volume_remove_effect` — Remove effect override. Params: `target`, `effect`\n- `volume_get_info` — Get Volume details (profile, effects, parameters). Params: `target`\n- `volume_set_properties` — Set Volume component properties (weight, priority, isGlobal). Params: `target`, `properties`\n- `volume_list_effects` — List all available volume effects for the active pipeline\n- `volume_create_profile` — Create a standalone VolumeProfile asset. Params: `path`, `effects` (optional)\n\n**Bake (Edit mode only):**\n- `bake_start` — Start lightmap bake. Params: `async_bake` (default true)\n- `bake_cancel` — Cancel in-progress bake\n- `bake_status` — Check bake progress\n- `bake_clear` — Clear baked lightmap data\n- `bake_reflection_probe` — Bake a specific reflection probe. Params: `target`\n- `bake_get_settings` — Get current Lightmapping settings\n- `bake_set_settings` — Set Lightmapping settings. Params: `settings` (dict)\n- `bake_create_light_probe_group` — Create a Light Probe Group. Params: `name`, `position`, `grid_size` [x,y,z], `spacing`\n- `bake_create_reflection_probe` — Create a Reflection Probe. Params: `name`, `position`, `size` [x,y,z], `resolution`, `mode`, `hdr`, `box_projection`\n- `bake_set_probe_positions` — Set Light Probe positions manually. Params: `target`, `positions` (array of [x,y,z])\n\n**Stats:**\n- `stats_get` — Get rendering counters (draw calls, batches, triangles, vertices, etc.)\n- `stats_list_counters` — List all available ProfilerRecorder counters\n- `stats_set_scene_debug` — Set Scene View debug/draw mode. Params: `mode`\n- `stats_get_memory` — Get rendering memory usage\n\n**Pipeline:**\n- `pipeline_get_info` — Get active render pipeline info (type, quality level, asset paths)\n- `pipeline_set_quality` — Switch quality level. Params: `level` (name or index)\n- `pipeline_get_settings` — Get pipeline asset settings\n- `pipeline_set_settings` — Set pipeline asset settings. Params: `settings` (dict)\n\n**Features (URP only):**\n- `feature_list` — List renderer features on the active URP renderer\n- `feature_add` — Add a renderer feature. Params: `feature_type`, `name`, `material` (for full-screen effects)\n- `feature_remove` — Remove a renderer feature. Params: `index` or `name`\n- `feature_configure` — Set feature properties. Params: `index` or `name`, `properties` (dict)\n- `feature_toggle` — Enable/disable a feature. Params: `index` or `name`, `active` (bool)\n- `feature_reorder` — Reorder features. Params: `order` (list of indices)\n\n**Examples:**\n\n```python\n# Check pipeline status\nmanage_graphics(action=\"ping\")\n\n# Create a global post-processing volume with Bloom and Vignette\nmanage_graphics(action=\"volume_create\", name=\"PostProcessing\", is_global=True,\n    effects=[\n        {\"type\": \"Bloom\", \"parameters\": {\"intensity\": 1.5, \"threshold\": 0.9}},\n        {\"type\": \"Vignette\", \"parameters\": {\"intensity\": 0.4}}\n    ])\n\n# Add an effect to an existing volume\nmanage_graphics(action=\"volume_add_effect\", target=\"PostProcessing\", effect=\"ColorAdjustments\")\n\n# Configure effect parameters\nmanage_graphics(action=\"volume_set_effect\", target=\"PostProcessing\",\n    effect=\"ColorAdjustments\", parameters={\"postExposure\": 0.5, \"saturation\": 10})\n\n# Get volume info\nmanage_graphics(action=\"volume_get_info\", target=\"PostProcessing\")\n\n# List all available effects for the active pipeline\nmanage_graphics(action=\"volume_list_effects\")\n\n# Create a VolumeProfile asset\nmanage_graphics(action=\"volume_create_profile\", path=\"Assets/Settings/MyProfile.asset\",\n    effects=[{\"type\": \"Bloom\"}, {\"type\": \"Tonemapping\"}])\n\n# Start async lightmap bake\nmanage_graphics(action=\"bake_start\", async_bake=True)\n\n# Check bake progress\nmanage_graphics(action=\"bake_status\")\n\n# Create a Light Probe Group with a 3x2x3 grid\nmanage_graphics(action=\"bake_create_light_probe_group\", name=\"ProbeGrid\",\n    position=[0, 1, 0], grid_size=[3, 2, 3], spacing=2.0)\n\n# Create a Reflection Probe\nmanage_graphics(action=\"bake_create_reflection_probe\", name=\"RoomProbe\",\n    position=[0, 2, 0], size=[10, 5, 10], resolution=256, hdr=True)\n\n# Get rendering stats\nmanage_graphics(action=\"stats_get\")\n\n# Get memory usage\nmanage_graphics(action=\"stats_get_memory\")\n\n# Get pipeline info\nmanage_graphics(action=\"pipeline_get_info\")\n\n# Switch quality level\nmanage_graphics(action=\"pipeline_set_quality\", level=\"High\")\n\n# List URP renderer features\nmanage_graphics(action=\"feature_list\")\n\n# Add a full-screen renderer feature\nmanage_graphics(action=\"feature_add\", feature_type=\"FullScreenPassRendererFeature\",\n    name=\"NightVision\", material=\"Assets/Materials/NightVision.mat\")\n\n# Toggle a feature off\nmanage_graphics(action=\"feature_toggle\", index=0, active=False)\n\n# Reorder features\nmanage_graphics(action=\"feature_reorder\", order=[2, 0, 1])\n```\n\n**Resources:**\n- `mcpforunity://scene/volumes` — Lists all Volume components in the scene with their profiles and effects\n- `mcpforunity://rendering/stats` — Current rendering performance counters\n- `mcpforunity://pipeline/renderer-features` — URP renderer features on the active renderer\n\n---\n\n## Package Tools\n\n### manage_packages\n\nManage Unity packages: query, install, remove, embed, and configure registries. Install/remove trigger domain reload.\n\n**Query Actions (read-only):**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `list_packages` | — | List all installed packages (async, returns job_id) |\n| `search_packages` | `query` | Search Unity registry by keyword (async, returns job_id) |\n| `get_package_info` | `package` | Get details about a specific installed package |\n| `list_registries` | — | List all scoped registries (names, URLs, scopes); immediate result |\n| `ping` | — | Check package manager availability, Unity version, package count |\n| `status` | `job_id` (required for list/search; optional for add/remove/embed) | Poll async job status; omit job_id to poll latest add/remove/embed job |\n\n**Mutating Actions:**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `add_package` | `package` | Install a package (name, name@version, git URL, or file: path) |\n| `remove_package` | `package`, `force` (optional) | Remove a package; blocked if dependents exist unless `force=true` |\n| `embed_package` | `package` | Copy package to local Packages/ for editing |\n| `resolve_packages` | — | Force re-resolution of all packages |\n| `add_registry` | `name`, `url`, `scopes` | Add a scoped registry (e.g., OpenUPM) |\n| `remove_registry` | `name` or `url` | Remove a scoped registry |\n\n**Input validation:**\n- Valid package IDs: `com.unity.inputsystem`, `com.unity.cinemachine@3.1.6`\n- Git URLs: allowed with warning (\"ensure this is a trusted source\")\n- `file:` paths: allowed with warning\n- Invalid names (uppercase, missing dots): rejected\n\n**Example — List installed packages:**\n```python\nmanage_packages(action=\"list_packages\")\n# Returns job_id, then poll:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Search for a package:**\n```python\nmanage_packages(action=\"search_packages\", query=\"input system\")\n```\n\n**Example — Install a package:**\n```python\nmanage_packages(action=\"add_package\", package=\"com.unity.inputsystem\")\n# Poll until complete:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Remove with dependency check:**\n```python\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\")\n# Error: \"Cannot remove: 3 package(s) depend on it: ...\"\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\", force=True)\n# Proceeds anyway\n```\n\n**Example — Add OpenUPM registry:**\n```python\nmanage_packages(\n    action=\"add_registry\",\n    name=\"OpenUPM\",\n    url=\"https://package.openupm.com\",\n    scopes=[\"com.cysharp\", \"com.neuecc\"]\n)\n```\n\n---\n\n## Physics Tools\n\n### `manage_physics`\n\nManage 3D and 2D physics: settings, collision matrix, materials, joints, queries, validation, and simulation. All actions support `dimension=\"3d\"` (default) or `dimension=\"2d\"` where applicable.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | See action groups below |\n| `dimension` | string | No | `\"3d\"` (default) or `\"2d\"` |\n| `settings` | object | For set_settings | Key-value physics settings dict |\n| `layer_a` / `layer_b` | string | For collision matrix | Layer name or index |\n| `collide` | bool | For set_collision_matrix | `true` to enable, `false` to disable |\n| `name` | string | For create_physics_material | Material asset name |\n| `path` | string | No | Asset folder path (create) or asset path (configure) |\n| `dynamic_friction` / `static_friction` / `bounciness` | float | No | Material properties (0–1) |\n| `friction_combine` / `bounce_combine` | string | No | `Average`, `Minimum`, `Multiply`, `Maximum` |\n| `material_path` | string | For assign_physics_material | Path to physics material asset |\n| `target` | string | For joints/queries/validate | GameObject name or instance ID |\n| `joint_type` | string | For joints | 3D: `fixed`, `hinge`, `spring`, `character`, `configurable`; 2D: `distance`, `fixed`, `friction`, `hinge`, `relative`, `slider`, `spring`, `target`, `wheel` |\n| `connected_body` | string | For add_joint | Connected body GameObject |\n| `motor` / `limits` / `spring` / `drive` | object | For configure_joint | Joint sub-config objects |\n| `properties` | object | For configure_joint/material | Direct property dict |\n| `origin` / `direction` | float[] | For raycast | Ray origin and direction `[x,y,z]` or `[x,y]` |\n| `max_distance` | float | No | Max raycast distance |\n| `shape` | string | For overlap | `sphere`, `box`, `capsule` (3D); `circle`, `box`, `capsule` (2D) |\n| `position` | float[] | For overlap | `[x,y,z]` or `[x,y]` |\n| `size` | float or float[] | For overlap | Radius (sphere/circle) or half-extents `[x,y,z]` (box) |\n| `layer_mask` | string | No | Layer name or int mask for queries |\n| `start` / `end` | float[] | For linecast | Start and end points `[x,y,z]` or `[x,y]` |\n| `point1` / `point2` | float[] | For shapecast capsule | Capsule endpoints (3D alternative) |\n| `height` | float | For shapecast capsule | Capsule height |\n| `capsule_direction` | int | For shapecast capsule | 0=X, 1=Y (default), 2=Z |\n| `angle` | float | For 2D shapecasts | Rotation angle in degrees |\n| `force` | float[] | For apply_force | Force vector `[x,y,z]` or `[x,y]` |\n| `force_mode` | string | For apply_force | `Force`, `Impulse`, `Acceleration`, `VelocityChange` (3D); `Force`, `Impulse` (2D) |\n| `force_type` | string | For apply_force | `normal` (default) or `explosion` (3D only) |\n| `torque` | float[] | For apply_force | Torque `[x,y,z]` (3D) or `[z]` (2D) |\n| `explosion_position` | float[] | For apply_force explosion | Explosion center `[x,y,z]` |\n| `explosion_radius` | float | For apply_force explosion | Explosion sphere radius |\n| `explosion_force` | float | For apply_force explosion | Explosion force magnitude |\n| `upwards_modifier` | float | For apply_force explosion | Y-axis offset (default 0) |\n| `steps` | int | For simulate_step | Number of steps (1–100) |\n| `step_size` | float | No | Step size in seconds (default: `Time.fixedDeltaTime`) |\n\n**Action groups:**\n\n- **Settings:** `ping`, `get_settings`, `set_settings`\n- **Collision Matrix:** `get_collision_matrix`, `set_collision_matrix`\n- **Materials:** `create_physics_material`, `configure_physics_material`, `assign_physics_material`\n- **Joints:** `add_joint`, `configure_joint`, `remove_joint`\n- **Queries:** `raycast`, `raycast_all`, `linecast`, `shapecast`, `overlap`\n- **Forces:** `apply_force`\n- **Rigidbody:** `get_rigidbody`, `configure_rigidbody`\n- **Validation:** `validate`\n- **Simulation:** `simulate_step`\n\n```python\n# Check physics status\nmanage_physics(action=\"ping\")\n\n# Get/set gravity\nmanage_physics(action=\"get_settings\", dimension=\"3d\")\nmanage_physics(action=\"set_settings\", dimension=\"3d\", settings={\"gravity\": [0, -20, 0]})\n\n# Collision matrix\nmanage_physics(action=\"get_collision_matrix\")\nmanage_physics(action=\"set_collision_matrix\", layer_a=\"Player\", layer_b=\"Enemy\", collide=False)\n\n# Create a bouncy physics material and assign it\nmanage_physics(action=\"create_physics_material\", name=\"Bouncy\", bounciness=0.9, dynamic_friction=0.2)\nmanage_physics(action=\"assign_physics_material\", target=\"Ball\", material_path=\"Assets/Physics Materials/Bouncy.physicMaterial\")\n\n# Add and configure a hinge joint\nmanage_physics(action=\"add_joint\", target=\"Door\", joint_type=\"hinge\", connected_body=\"DoorFrame\")\nmanage_physics(action=\"configure_joint\", target=\"Door\", joint_type=\"hinge\",\n               motor={\"targetVelocity\": 90, \"force\": 100},\n               limits={\"min\": -90, \"max\": 0, \"bounciness\": 0})\n\n# Raycast and overlap\nmanage_physics(action=\"raycast\", origin=[0, 10, 0], direction=[0, -1, 0], max_distance=50)\nmanage_physics(action=\"overlap\", shape=\"sphere\", position=[0, 0, 0]","isInternal":false,"tokens":12589,"sizeBytes":50166},{"name":"workflows.md","path":"unity-mcp-skill/references/workflows.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/unity-mcp-skill/references/workflows.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Unity-MCP Workflow Patterns\n\nCommon workflows and patterns for effective Unity-MCP usage.\n\n## Table of Contents\n\n- [Setup & Verification](#setup--verification)\n- [Scene Creation Workflows](#scene-creation-workflows)\n- [Script Development Workflows](#script-development-workflows)\n- [Asset Management Workflows](#asset-management-workflows)\n- [Testing Workflows](#testing-workflows)\n- [Debugging Workflows](#debugging-workflows)\n- [UI Creation Workflows](#ui-creation-workflows)\n- [Camera & Cinemachine Workflows](#camera--cinemachine-workflows)\n- [ProBuilder Workflows](#probuilder-workflows)\n- [Graphics & Rendering Workflows](#graphics--rendering-workflows)\n- [Package Management Workflows](#package-management-workflows)\n- [Package Deployment Workflows](#package-deployment-workflows)\n- [API Verification Workflows](#api-verification-workflows)\n- [Batch Operations](#batch-operations)\n\n---\n\n## Setup & Verification\n\n### Initial Connection Verification\n\n```python\n# 1. Check editor state\n# Read mcpforunity://editor/state\n\n# 2. Verify ready_for_tools == true\n# If false, wait for recommended_retry_after_ms\n\n# 3. Check active scene\n# Read mcpforunity://editor/state → active_scene\n\n# 4. List available instances (multi-instance)\n# Read mcpforunity://instances\n```\n\n### Before Any Operation\n\n```python\n# Quick readiness check pattern:\neditor_state = read_resource(\"mcpforunity://editor/state\")\n\nif not editor_state[\"ready_for_tools\"]:\n    # Check blocking_reasons\n    # Wait recommended_retry_after_ms\n    pass\n\nif editor_state[\"is_compiling\"]:\n    # Wait for compilation to complete\n    pass\n```\n\n---\n\n## Scene Generator Build Workflow\n\n### Fresh Scene Before Building\n\n**Always start a generated scene build with `manage_scene(action=\"create\")`** to get a clean empty scene. This avoids conflicts with existing default objects (Camera, Light) that would cause \"already exists\" errors when the execution plan tries to create its own.\n\n```python\n# Step 0: Create fresh empty scene (replaces current scene entirely)\nmanage_scene(action=\"create\", name=\"MyGeneratedScene\", path=\"Assets/Scenes/\")\n\n# Now proceed with the phased execution plan...\n# Phase 1: Environment (camera, lights) — no conflicts\n# Phase 2: Objects (GameObjects)\n# Phase 3: Materials\n# etc.\n```\n\n### Wiring Object References Between Components\n\nAfter creating scripts and attaching components, use `set_property` to wire cross-references between GameObjects. Use the `{\"name\": \"ObjectName\"}` format to reference scene objects by name:\n\n```python\n# Wire a list of target GameObjects into a script's serialized field\nmanage_components(\n    action=\"set_property\",\n    target=\"BeeManager\",\n    component_type=\"BeeManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Flower_3\"}]\n)\n```\n\n### Physics Requirements for Trigger-Based Interactions\n\nWhen scripts use `OnTriggerEnter` / `OnTriggerStay` / `OnTriggerExit`, at least one of the two colliding objects **must** have a `Rigidbody` component. Common pattern:\n\n```python\n# Moving objects (bees, players) need Rigidbody for triggers to fire\nbatch_execute(commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"Bee_1\", \"component_type\": \"Rigidbody\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"Bee_1\",\n        \"component_type\": \"Rigidbody\",\n        \"properties\": {\"useGravity\": false, \"isKinematic\": true}\n    }}\n])\n```\n\n### Script Overwrites with `manage_script(action=\"update\")`\n\nWhen a generated script needs to be rewritten (e.g., to add auto-wiring logic), use `update` instead of deleting and recreating:\n\n```python\nmanage_script(\n    action=\"update\",\n    path=\"Assets/Scripts/MyScript.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class MyScript : MonoBehaviour { ... }\"\n)\n# manage_script update auto-triggers import + compile — just wait and check console\n# Read mcpforunity://editor/state → wait until is_compiling == false\nread_console(types=[\"error\"], count=10)\n```\n\n---\n\n## Scene Creation Workflows\n\n### Create Complete Scene from Scratch\n\n```python\n# 1. Create new scene\nmanage_scene(action=\"create\", name=\"GameLevel\", path=\"Assets/Scenes/\")\n\n# 2. Batch create environment objects\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Ground\", \"primitive_type\": \"Plane\",\n        \"position\": [0, 0, 0], \"scale\": [10, 1, 10]\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Light\", \"primitive_type\": \"Cube\"\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Player\", \"primitive_type\": \"Capsule\",\n        \"position\": [0, 1, 0]\n    }}\n])\n\n# 3. Add light component (delete cube mesh, add light)\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshRenderer\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshFilter\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"BoxCollider\")\nmanage_components(action=\"add\", target=\"Light\", component_type=\"Light\")\nmanage_components(action=\"set_property\", target=\"Light\", component_type=\"Light\",\n    property=\"type\", value=\"Directional\")\n\n# 4. Set up camera\nmanage_gameobject(action=\"modify\", target=\"Main Camera\", position=[0, 5, -10],\n    rotation=[30, 0, 0])\n\n# 5. Verify with screenshot\nmanage_camera(action=\"screenshot\")\n\n# 6. Save scene\nmanage_scene(action=\"save\")\n```\n\n### Populate Scene with Grid of Objects\n\n```python\n# Create 5x5 grid of cubes using batch\ncommands = []\nfor x in range(5):\n    for z in range(5):\n        commands.append({\n            \"tool\": \"manage_gameobject\",\n            \"params\": {\n                \"action\": \"create\",\n                \"name\": f\"Cube_{x}_{z}\",\n                \"primitive_type\": \"Cube\",\n                \"position\": [x * 2, 0, z * 2]\n            }\n        })\n\n# Execute in batches of 25\nbatch_execute(commands=commands[:25], parallel=True)\n```\n\n### Clone and Arrange Objects\n\n```python\n# Find template object\nresult = find_gameobjects(search_term=\"Template\", search_method=\"by_name\")\ntemplate_id = result[\"ids\"][0]\n\n# Duplicate in a line\nfor i in range(10):\n    manage_gameobject(\n        action=\"duplicate\",\n        target=template_id,\n        new_name=f\"Instance_{i}\",\n        offset=[i * 2, 0, 0]\n    )\n```\n\n---\n\n## Script Development Workflows\n\n### Create New Script and Attach\n\n```python\n# 1. Create script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/EnemyAI.cs\",\n    contents='''using UnityEngine;\n\npublic class EnemyAI : MonoBehaviour\n{\n    public float speed = 5f;\n    public Transform target;\n\n    void Update()\n    {\n        if (target != null)\n        {\n            Vector3 direction = (target.position - transform.position).normalized;\n            transform.position += direction * speed * Time.deltaTime;\n        }\n    }\n}'''\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for errors\nconsole = read_console(types=[\"error\"], count=10)\nif console[\"messages\"]:\n    # Handle compilation errors\n    print(\"Compilation errors:\", console[\"messages\"])\nelse:\n    # 4. Attach to GameObject\n    manage_gameobject(action=\"modify\", target=\"Enemy\", components_to_add=[\"EnemyAI\"])\n\n    # 5. Set component properties\n    manage_components(\n        action=\"set_property\",\n        target=\"Enemy\",\n        component_type=\"EnemyAI\",\n        properties={\n            \"speed\": 10.0\n        }\n    )\n```\n\n### Edit Existing Script Safely\n\n```python\n# 1. Get current SHA\nsha_info = get_sha(uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\")\n\n# 2. Find the method to edit\nmatches = find_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    pattern=\"void Update\\\\(\\\\)\"\n)\n\n# 3. Apply structured edit\nscript_apply_edits(\n    name=\"PlayerController\",\n    path=\"Assets/Scripts\",\n    edits=[{\n        \"op\": \"replace_method\",\n        \"methodName\": \"Update\",\n        \"replacement\": '''void Update()\n    {\n        float h = Input.GetAxis(\"Horizontal\");\n        float v = Input.GetAxis(\"Vertical\");\n        transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);\n    }'''\n    }]\n)\n\n# 4. Validate\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    level=\"standard\"\n)\n\n# 5. Wait for compilation (script_apply_edits auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 6. Check console\nread_console(types=[\"error\"], count=10)\n```\n\n### Add Method to Existing Class\n\n```python\nscript_apply_edits(\n    name=\"GameManager\",\n    path=\"Assets/Scripts\",\n    edits=[\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": '''\n    public void ResetGame()\n    {\n        SceneManager.LoadScene(SceneManager.GetActiveScene().name);\n    }'''\n        },\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"using UnityEngine;\",\n            \"position\": \"after\",\n            \"text\": \"\\nusing UnityEngine.SceneManagement;\"\n        }\n    ]\n)\n```\n\n---\n\n## Asset Management Workflows\n\n### Create and Apply Material\n\n```python\n# 1. Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    shader=\"Standard\",\n    properties={\n        \"_Color\": [0.2, 0.5, 1.0, 1.0],\n        \"_Metallic\": 0.5,\n        \"_Glossiness\": 0.8\n    }\n)\n\n# 2. Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"Player\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    slot=0\n)\n\n# 3. Verify visually\nmanage_camera(action=\"screenshot\")\n```\n\n### Create Procedural Texture\n\n```python\n# 1. Create base texture\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    width=256,\n    height=256,\n    fill_color=[255, 255, 255, 255]\n)\n\n# 2. Apply checkerboard pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    pattern=\"checkerboard\",\n    palette=[[0, 0, 0, 255], [255, 255, 255, 255]],\n    pattern_size=32\n)\n\n# 3. Create material with texture\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/CheckerMaterial.mat\",\n    shader=\"Standard\"\n)\n\n# 4. Assign texture to material (via manage_material set_material_shader_property)\n```\n\n### Organize Assets into Folders\n\n```python\n# 1. Create folder structure\nbatch_execute(commands=[\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Prefabs\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Materials\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Scripts\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Textures\"}}\n])\n\n# 2. Move existing assets\nmanage_asset(action=\"move\", path=\"Assets/MyMaterial.mat\", destination=\"Assets/Materials/MyMaterial.mat\")\nmanage_asset(action=\"move\", path=\"Assets/MyScript.cs\", destination=\"Assets/Scripts/MyScript.cs\")\n```\n\n### Search and Process Assets\n\n```python\n# Find all prefabs\nresult = manage_asset(\n    action=\"search\",\n    path=\"Assets\",\n    search_pattern=\"*.prefab\",\n    page_size=50,\n    generate_preview=False\n)\n\n# Process each prefab\nfor asset in result[\"assets\"]:\n    prefab_path = asset[\"path\"]\n    # Get prefab info\n    info = manage_prefabs(action=\"get_info\", prefab_path=prefab_path)\n    print(f\"Prefab: {prefab_path}, Children: {info['childCount']}\")\n```\n\n### Instantiate Prefab in Scene\n\nUse `manage_gameobject` (not `manage_prefabs`) to place prefab instances in the scene.\n\n```python\n# Full path\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"\n)\n\n# Smart lookup — just the prefab name works too\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Batch-spawn multiple instances\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": f\"Enemy_{i}\",\n        \"prefab_path\": \"Enemy\", \"position\": [i * 3, 0, 0], \"parent\": \"Enemies\"\n    }}\n    for i in range(5)\n])\n```\n\n> **Note:** `manage_prefabs` is for headless prefab editing (inspect, modify contents, create from GameObject). To *instantiate* a prefab into the scene, always use `manage_gameobject(action=\"create\", prefab_path=\"...\")`.\n\n---\n\n## Testing Workflows\n\n### Run Specific Tests\n\n```python\n# 1. List available tests\n# Read mcpforunity://tests/EditMode\n\n# 2. Run specific tests\nresult = run_tests(\n    mode=\"EditMode\",\n    test_names=[\"MyTests.TestPlayerMovement\", \"MyTests.TestEnemySpawn\"],\n    include_failed_tests=True\n)\njob_id = result[\"job_id\"]\n\n# 3. Wait for results\nfinal_result = get_test_job(\n    job_id=job_id,\n    wait_timeout=60,\n    include_failed_tests=True\n)\n\n# 4. Check results\nif final_result[\"status\"] == \"complete\":\n    for test in final_result.get(\"failed_tests\", []):\n        print(f\"FAILED: {test['name']}: {test['message']}\")\n```\n\n### Run Tests by Category\n\n```python\n# Run all unit tests\nresult = run_tests(\n    mode=\"EditMode\",\n    category_names=[\"Unit\"],\n    include_failed_tests=True\n)\n\n# Poll until complete\nwhile True:\n    status = get_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n    if status[\"status\"] in [\"complete\", \"failed\"]:\n        break\n```\n\n### Test-Driven Development Pattern\n\n```python\n# 1. Write test first\ncreate_script(\n    path=\"Assets/Tests/Editor/PlayerTests.cs\",\n    contents='''using NUnit.Framework;\nusing UnityEngine;\n\npublic class PlayerTests\n{\n    [Test]\n    public void TestPlayerStartsAtOrigin()\n    {\n        var player = new GameObject(\"TestPlayer\");\n        Assert.AreEqual(Vector3.zero, player.transform.position);\n        Object.DestroyImmediate(player);\n    }\n}'''\n)\n\n# 2. Wait for compilation (create_script auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Run test (expect pass for this simple test)\nresult = run_tests(mode=\"EditMode\", test_names=[\"PlayerTests.TestPlayerStartsAtOrigin\"])\nget_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n```\n\n---\n\n## Debugging Workflows\n\n### Diagnose Compilation Errors\n\n```python\n# 1. Check console for errors\nerrors = read_console(\n    types=[\"error\"],\n    count=20,\n    include_stacktrace=True,\n    format=\"detailed\"\n)\n\n# 2. For each error, find the file and line\nfor error in errors[\"messages\"]:\n    # Parse error message for file:line info\n    # Use find_in_file to locate the problematic code\n    pass\n\n# 3. After fixing, refresh and check again\nrefresh_unity(mode=\"force\", scope=\"scripts\", compile=\"request\", wait_for_ready=True)\nread_console(types=[\"error\"], count=10)\n```\n\n### Investigate Missing References\n\n```python\n# 1. Find the GameObject\nresult = find_gameobjects(search_term=\"Player\", search_method=\"by_name\")\n\n# 2. Get all components\n# Read mcpforunity://scene/gameobject/{id}/components\n\n# 3. Check for null references in serialized fields\n# Look for fields with null/missing values\n\n# 4. Find the referenced object\nresult = find_gameobjects(search_term=\"Target\", search_method=\"by_name\")\n\n# 5. Set the reference\nmanage_components(\n    action=\"set_property\",\n    target=\"Player\",\n    component_type=\"PlayerController\",\n    property=\"target\",\n    value={\"instanceID\": result[\"ids\"][0]}  # Reference by ID\n)\n```\n\n### Check Scene State\n\n```python\n# 1. Get hierarchy\nhierarchy = manage_scene(action=\"get_hierarchy\", page_size=100, include_transform=True)\n\n# 2. Find objects at unexpected positions\nfor item in hierarchy[\"data\"][\"items\"]:\n    if item.get(\"transform\", {}).get(\"position\", [0,0,0])[1] < -100:\n        print(f\"Object {item['name']} fell through floor!\")\n\n# 3. Visual verification\nmanage_camera(action=\"screenshot\")\n```\n\n---\n\n## UI Creation Workflows\n\nUnity has two UI systems: **UI Toolkit** (modern, recommended) and **uGUI** (Canvas-based, legacy). Use `manage_ui` for UI Toolkit workflows, and `batch_execute` with `manage_gameobject` + `manage_components` for uGUI.\n\n> **Template warning:** This section is a skill template library, not a guaranteed source of truth. Examples may be inaccurate for your Unity version, package setup, or project conventions.\n> **Use safely:**\n> 1. **Always read `mcpforunity://project/info` first** to detect installed packages and input system.\n> 2. Validate component/property names against the current project.\n> 3. Prefer targeting by instance ID or full path over generic names.\n> 4. Treat numeric enum values as placeholders and verify before reuse.\n\n### Step 0: Detect Project UI Capabilities\n\n**Before creating any UI**, read project info to determine which packages and input system are available.\n\n```python\n# Read mcpforunity://project/info — returns:\n# {\n#   \"renderPipeline\": \"BuiltIn\" | \"Universal\" | \"HighDefinition\" | \"Custom\",\n#   \"activeInputHandler\": \"Old\" | \"New\" | \"Both\",\n#   \"packages\": {\n#     \"ugui\": true/false,        — com.unity.ugui (Canvas, Image, Button, etc.)\n#     \"textmeshpro\": true/false,  — com.unity.textmeshpro (TextMeshProUGUI)\n#     \"inputsystem\": true/false,  — com.unity.inputsystem (new Input System)\n#     \"uiToolkit\": true/false,    — UI Toolkit (always true for Unity 2021.3+)\n#     \"screenCapture\": true/false  — ScreenCapture module enabled\n#   }\n# }\n```\n\n**Decision matrix:**\n\n| project_info field | Value | What to use |\n|---|---|---|\n| `packages.uiToolkit` | `true` | **Preferred:** Use `manage_ui` for UI Toolkit (UXML/USS) |\n| `packages.ugui` | `true` | Canvas-based UI (Image, Button, etc.) via `batch_execute` |\n| `packages.textmeshpro` | `true` | `TextMeshProUGUI` for text (uGUI) |\n| `packages.textmeshpro` | `false` | `UnityEngine.UI.Text` (legacy, lower quality) |\n| `activeInputHandler` | `\"Old\"` | `StandaloneInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"New\"` | `InputSystemUIInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"Both\"` | Either works; prefer `InputSystemUIInputModule` for UI |\n\n### UI Toolkit Workflows (manage_ui)\n\nUI Toolkit uses a web-like approach: **UXML** (like HTML) for structure, **USS** (like CSS) for styling. This is the preferred UI system for new projects.\n\n> **Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n#### Create a Complete UI Screen\n\n```python\n# 1. Create UXML document (structure)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='''<ui:UXML xmlns:ui=\"UnityEngine.UIElements\" xmlns:uie=\"UnityEditor.UIElements\">\n    <ui:Style src=\"Assets/UI/MainMenu.uss\" />\n    <ui:VisualElement name=\"root\" class=\"root-container\">\n        <ui:Label text=\"My Game\" class=\"title\" />\n        <ui:Button text=\"Play\" name=\"play-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Settings\" name=\"settings-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Quit\" name=\"quit-btn\" class=\"menu-button\" />\n    </ui:VisualElement>\n</ui:UXML>'''\n)\n\n# 2. Create USS stylesheet (styling)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents='''.root-container {\n    flex-grow: 1;\n    justify-content: center;\n    align-items: center;\n    background-color: rgba(0, 0, 0, 0.8);\n}\n.title {\n    font-size: 48px;\n    color: white;\n    -unity-font-style: bold;\n    margin-bottom: 40px;\n}\n.menu-button {\n    width: 300px;\n    height: 60px;\n    font-size: 24px;\n    margin: 8px;\n    background-color: rgb(50, 120, 200);\n    color: white;\n    border-radius: 8px;\n}\n.menu-button:hover {\n    background-color: rgb(70, 140, 220);\n}'''\n)\n\n# 3. Create a GameObject and attach UIDocument\nmanage_gameobject(action=\"create\", name=\"UIRoot\")\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\"\n    # panel_settings auto-created if omitted\n)\n\n# 4. Verify the visual tree\nmanage_ui(action=\"get_visual_tree\", target=\"UIRoot\", max_depth=5)\n```\n\n#### Update Existing UI\n\n```python\n# Read current content\nresult = manage_ui(action=\"read\", path=\"Assets/UI/MainMenu.uss\")\n# Modify and update\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents=\".title { font-size: 64px; color: yellow; }\"\n)\n```\n\n#### Custom PanelSettings\n\n```python\n# Create PanelSettings with ScaleWithScreenSize\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/GamePanelSettings.asset\",\n    scale_mode=\"ScaleWithScreenSize\",\n    reference_resolution={\"width\": 1920, \"height\": 1080}\n)\n\n# Attach UIDocument with custom PanelSettings\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/GamePanelSettings.asset\"\n)\n```\n\n### uGUI (Canvas-Based) Workflows\n\nThe sections below cover legacy Canvas-based UI using `batch_execute`. Use these when working with existing uGUI projects or when UI Toolkit is not suitable.\n\n### RectTransform Sizing (Critical for All UI Children)\n\nEvery GameObject under a Canvas gets a `RectTransform` instead of `Transform`. **Without setting anchor/size, UI elements default to zero size and won't be visible.** Use `set_property` on `RectTransform`:\n\n```python\n# Stretch to fill parent (common for panels/backgrounds)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyPanel\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 0],        # bottom-left corner\n        \"anchorMax\": [1, 1],        # top-right corner\n        \"sizeDelta\": [0, 0],        # no extra size beyond anchors\n        \"anchoredPosition\": [0, 0]  # centered on anchors\n    }\n}}\n\n# Fixed-size centered element (e.g. 300x50 button)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyButton\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0.5, 0.5],\n        \"anchorMax\": [0.5, 0.5],\n        \"sizeDelta\": [300, 50],\n        \"anchoredPosition\": [0, 0]\n    }\n}}\n\n# Top-anchored bar (e.g. health bar at top of screen)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"TopBar\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 1],        # left-top\n        \"anchorMax\": [1, 1],        # right-top (stretch horizontally)\n        \"sizeDelta\": [0, 60],       # 60px tall, full width\n        \"anchoredPosition\": [0, -30] # offset down by half height\n    }\n}}\n```\n\n> **Note:** Vector2 properties accept both `[x, y]` array format and `{\"x\": ..., \"y\": ...}` object format.\n\n### Create Canvas (Foundation for All UI)\n\nEvery UI element must be under a Canvas. A Canvas requires three components: `Canvas`, `CanvasScaler`, and `GraphicRaycaster`.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"Canvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"CanvasScaler\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"GraphicRaycaster\"\n    }},\n    # renderMode: 0=ScreenSpaceOverlay, 1=ScreenSpaceCamera, 2=WorldSpace\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0\n    }},\n    # CanvasScaler: uiScaleMode 1=ScaleWithScreenSize\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"uiScaleMode\", \"value\": 1\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"referenceResolution\",\n        \"value\": [1920, 1080]\n    }}\n])\n```\n\n### Create EventSystem (Required Once Per Scene for UI Interaction)\n\nIf no EventSystem exists in the scene, buttons and other interactive UI elements won't respond to input. Create one alongside your first Canvas. **Check `project_info.activeInputHandler` to pick the correct input module.**\n\n```python\n# For activeInputHandler == \"New\" or \"Both\" (project has Input System package):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.InputSystem.UI.InputSystemUIInputModule\"\n    }}\n])\n\n# For activeInputHandler == \"Old\" (legacy Input Manager only):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"\n    }}\n])\n```\n\n### Create Panel (Background Container)\n\nA Panel is an Image component used as a background/container for other UI elements.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.1, 0.1, 0.1, 0.8]\n    }},\n    # Size the panel (stretch to 60% of canvas, centered)\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.2, 0.1], \"anchorMax\": [0.8, 0.9],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Text (TextMeshPro)\n\nTextMeshProUGUI automatically adds a RectTransform when added to a child of a Canvas. If `packages.textmeshpro` is `false`, use `UnityEngine.UI.Text` instead.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"TitleText\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\n            \"text\": \"My Game Title\",\n            \"fontSize\": 48,\n            \"alignment\": 514,\n            \"color\": [1, 1, 1, 1]\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0.8], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n> **TextMeshPro alignment values:** 257=TopLeft, 258=TopCenter, 260=TopRight, 513=MiddleLeft, 514=MiddleCenter, 516=MiddleRight, 1025=BottomLeft, 1026=BottomCenter, 1028=BottomRight.\n\n### Create Button (With Label)\n\nA Button needs an `Image` (visual) + `Button` (interaction) on the parent, and a child with `TextMeshProUGUI` for the label.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Button\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.2, 0.6, 1.0, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [300, 60], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Child text label (stretches to fill button)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton_Label\", \"parent\": \"StartButton\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Start Game\", \"fontSize\": 24, \"alignment\": 514}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Slider (With Reference Wiring)\n\nA Slider requires a specific hierarchy and **must have its `fillRect` and `handleRect` references wired** to function.\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HealthSlider\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Slider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderBG\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.3, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Fill Area + Fill\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"FillArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"FillArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderFill\", \"parent\": \"FillArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderFill\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.8, 0.2, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Handle Area + Handle\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HandleArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HandleArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderHandle\", \"parent\": \"HandleArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderHandle\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderHandle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.5, 0], \"anchorMax\": [0.5, 1], \"sizeDelta\": [20, 0]}\n    }}\n])\n\n# Step 2: Wire Slider references (CRITICAL — slider won't work without this)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"fillRect\",\n        \"value\": {\"name\": \"SliderFill\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"handleRect\",\n        \"value\": {\"name\": \"SliderHandle\"}\n    }}\n])\n```\n\n### Create Input Field (With Reference Wiring)\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"NameInput\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 50], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Text Area child (clips text to input bounds)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputTextArea\", \"parent\": \"NameInput\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputTextArea\", \"component_type\": \"RectMask2D\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputTextArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-16, -8]}\n    }},\n    # Placeholder\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputPlaceholder\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputPlaceholder\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Enter name...\", \"fontStyle\": 2, \"color\": [0.5, 0.5, 0.5, 0.5]}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Actual text display\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputText\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputText\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }}\n])\n\n# Step 2: Wire TMP_InputField references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textViewport\",\n        \"value\": {\"name\": \"InputTextArea\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textComponent\",\n        \"value\": {\"name\": \"InputText\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"placeholder\",\n        \"value\": {\"name\": \"InputPlaceholder\"}\n    }}\n])\n```\n\n### Create Toggle (With Reference Wiring)\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SoundToggle\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SoundToggle\", \"component_type\": \"Toggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [200, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background box\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleBG\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0.5], \"anchorMax\": [0, 0.5], \"sizeDelta\": [26, 26], \"anchoredPosition\": [13, 0]}\n    }},\n    # Checkmark\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleCheckmark\", \"parent\": \"ToggleBG\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleCheckmark\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleCheckmark\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.1, 0.1], \"anchorMax\": [0.9, 0.9], \"sizeDelta\": [0, 0]}\n    }},\n    # Label\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleLabel\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleLabel\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Sound Effects\", \"fontSize\": 18, \"alignment\": 513}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-35, 0], \"anchoredPosition\": [17.5, 0]}\n    }}\n])\n\n# Wire Toggle references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"Toggle\", \"property\": \"graphic\",\n        \"value\": {\"name\": \"ToggleCheckmark\"}\n    }}\n])\n```\n\n### Add Layout Group (Vertical/Horizontal/Grid)\n\nLayout groups auto-arrange child elements, so you can skip manual RectTransform positioning for children.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\",\n        \"properties\": {\n            \"spacing\": 10,\n            \"childAlignment\": 4,\n            \"childForceExpandWidth\": True,\n            \"childForceExpandHeight\": False,\n            \"padding\": {\"left\": 20, \"right\": 20, \"top\": 20, \"bottom\": 20}\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\",\n        \"properties\": { \"verticalFit\": 2 }\n    }}\n])\n```\n\n> **childAlignment values:** 0=UpperLeft, 1=UpperCenter, 2=UpperRight, 3=MiddleLeft, 4=MiddleCenter, 5=MiddleRight, 6=LowerLeft, 7=LowerCenter, 8=LowerRight.\n> **ContentSizeFitter fit modes:** 0=Unconstrained, 1=MinSize, 2=PreferredSize.\n\n### Complete Example: Main Menu Screen\n\nCombines multiple templates into a full menu screen in two batch calls (default 25 command limit per batch, configurable in Unity MCP Tools window up to 100). **Assumes `project_info` has been read and `activeInputHandler` is known.**\n\n```python\n# Batch 1: Canvas + EventSystem + Panel + Title\nbatch_execute(fail_fast=True, commands=[\n    # Canvas\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"GraphicRaycaster\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\", \"properties\": {\"uiScaleMode\": 1, \"referenceResolution\": [1920, 1080]}}},\n    # EventSystem — use StandaloneInputModule OR InputSystemUIInputModule based on project_info\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"}},\n    # Panel (centered, 60% width)\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.1, 0.1, 0.15, 0.9]}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0.2, 0.15], \"anchorMax\": [0.8, 0.85], \"sizeDelta\": [0, 0]}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\", \"properties\": {\"spacing\": 20, \"childAlignment\": 4, \"childForceExpandWidth\": True, \"childForceExpandHeight\": False}}},\n    # Title\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Title\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"My Game\", \"fontSize\": 64, \"alignment\": 514, \"color\": [1, 1, 1, 1]}}}\n])\n\n# Batch 2: Buttons\nbatch_execute(fail_fast=True, commands=[\n    # Play Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.6, 1.0, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayLabel\", \"parent\": \"PlayButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Play\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Settings Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.35, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsLabel\", \"parent\": \"SettingsButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Settings\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Quit Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.8, 0.2, 0.2, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitLabel\", \"parent\": \"QuitButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Quit\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}}\n])\n```\n\n### UI Component Quick Reference\n\n| UI Element | Required Components | Notes |\n| ---------- | ------------------- | ----- |\n| **Canvas** | Canvas + CanvasScaler + GraphicRaycaster | Root for all UI. One per screen. |\n| **EventSystem** | EventSystem + input module (see below) | One per scene. Required for interaction. |\n| **Panel** | Image + RectTransform sizing | Container. Set color for background. |\n| **Text** | TextMeshProUGUI (or Text if no TMP) + RectTransform | Check `packages.textmeshpro`. |\n| **Button** | Image + Button + child(TextMeshProUGUI) + RectTransform | Image = visual, Button = click handler. |\n| **Slider** | Slider + Image + children + **wire fillRect/handleRect** | Won't function without wiring. |\n| **Toggle** | Toggle + children + **wire graphic** | Wire checkmark Image to `graphic`. |\n| **Input Field** | Image + TMP_InputField + children + **wire textViewport/textComponent/placeholder** | Won't function without wiring. |\n| **Layout Group** | VerticalLayoutGroup / HorizontalLayoutGroup / GridLayoutGroup | Auto-arranges children; skip manual RectTransform on children. |\n\n---\n\n## Input System: Old vs New\n\nUnity has two input systems that affect UI interaction, script input handling, and EventSystem confi","isInternal":false,"tokens":13333,"sizeBytes":50032},{"name":"_category_.json","path":"website/docs/reference/tools/animation/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/_category_.json","title":"Animation Skill","category":"anthropic-skill","format":"json","content":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/_category_.json)","tokens":300,"sizeBytes":226},{"name":"index.md","path":"website/docs/reference/tools/animation/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/index.md","title":"Animation Skill","category":"anthropic-skill","format":"markdown","content":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/index.md)","tokens":300,"sizeBytes":212},{"name":"manage_animation.md","path":"website/docs/reference/tools/animation/manage_animation.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/manage_animation.md","title":"Animation Skill","category":"anthropic-skill","format":"markdown","content":"# Animation Skill\n\nPath: `website/docs/reference/tools/animation/manage_animation.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/manage_animation.md)","tokens":300,"sizeBytes":234},{"name":"_category_.json","path":"website/docs/reference/tools/asset_gen/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/_category_.json","title":"Asset_gen Skill","category":"anthropic-skill","format":"json","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/_category_.json)","tokens":300,"sizeBytes":226},{"name":"generate_audio.md","path":"website/docs/reference/tools/asset_gen/generate_audio.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_audio.md","title":"Asset_gen Skill","category":"anthropic-skill","format":"markdown","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_audio.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_audio.md)","tokens":300,"sizeBytes":230},{"name":"generate_image.md","path":"website/docs/reference/tools/asset_gen/generate_image.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_image.md","title":"Asset_gen Skill","category":"anthropic-skill","format":"markdown","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_image.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_image.md)","tokens":300,"sizeBytes":230},{"name":"generate_model.md","path":"website/docs/reference/tools/asset_gen/generate_model.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_model.md","title":"Asset_gen Skill","category":"anthropic-skill","format":"markdown","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_model.md)","tokens":300,"sizeBytes":230},{"name":"import_model_file.md","path":"website/docs/reference/tools/asset_gen/import_model_file.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model_file.md","title":"Asset_gen Skill","category":"anthropic-skill","format":"markdown","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model_file.md)","tokens":300,"sizeBytes":236},{"name":"import_model.md","path":"website/docs/reference/tools/asset_gen/import_model.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model.md","title":"Asset_gen Skill","category":"anthropic-skill","format":"markdown","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model.md)","tokens":300,"sizeBytes":226},{"name":"index.md","path":"website/docs/reference/tools/asset_gen/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/index.md","title":"Asset_gen Skill","category":"anthropic-skill","format":"markdown","content":"# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/index.md)","tokens":300,"sizeBytes":212},{"name":"_category_.json","path":"website/docs/reference/tools/core/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/_category_.json","title":"Core Skill","category":"anthropic-skill","format":"json","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/_category_.json)","tokens":300,"sizeBytes":211},{"name":"apply_text_edits.md","path":"website/docs/reference/tools/core/apply_text_edits.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/apply_text_edits.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/apply_text_edits.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/apply_text_edits.md)","tokens":300,"sizeBytes":219},{"name":"batch_execute.md","path":"website/docs/reference/tools/core/batch_execute.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/batch_execute.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/batch_execute.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/batch_execute.md)","tokens":300,"sizeBytes":213},{"name":"create_script.md","path":"website/docs/reference/tools/core/create_script.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/create_script.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/create_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/create_script.md)","tokens":300,"sizeBytes":213},{"name":"debug_request_context.md","path":"website/docs/reference/tools/core/debug_request_context.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/debug_request_context.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/debug_request_context.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/debug_request_context.md)","tokens":300,"sizeBytes":229},{"name":"delete_script.md","path":"website/docs/reference/tools/core/delete_script.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/delete_script.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/delete_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/delete_script.md)","tokens":300,"sizeBytes":213},{"name":"execute_custom_tool.md","path":"website/docs/reference/tools/core/execute_custom_tool.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_custom_tool.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/execute_custom_tool.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_custom_tool.md)","tokens":300,"sizeBytes":225},{"name":"execute_menu_item.md","path":"website/docs/reference/tools/core/execute_menu_item.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_menu_item.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/execute_menu_item.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/execute_menu_item.md)","tokens":300,"sizeBytes":221},{"name":"find_gameobjects.md","path":"website/docs/reference/tools/core/find_gameobjects.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_gameobjects.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/find_gameobjects.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_gameobjects.md)","tokens":300,"sizeBytes":219},{"name":"find_in_file.md","path":"website/docs/reference/tools/core/find_in_file.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_in_file.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/find_in_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/find_in_file.md)","tokens":300,"sizeBytes":211},{"name":"get_sha.md","path":"website/docs/reference/tools/core/get_sha.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/get_sha.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/get_sha.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/get_sha.md)","tokens":300,"sizeBytes":201},{"name":"index.md","path":"website/docs/reference/tools/core/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/index.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/index.md)","tokens":300,"sizeBytes":197},{"name":"manage_asset.md","path":"website/docs/reference/tools/core/manage_asset.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_asset.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_asset.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_asset.md)","tokens":300,"sizeBytes":211},{"name":"manage_build.md","path":"website/docs/reference/tools/core/manage_build.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_build.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_build.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_build.md)","tokens":300,"sizeBytes":211},{"name":"manage_camera.md","path":"website/docs/reference/tools/core/manage_camera.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_camera.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_camera.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_camera.md)","tokens":300,"sizeBytes":213},{"name":"manage_components.md","path":"website/docs/reference/tools/core/manage_components.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_components.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_components.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_components.md)","tokens":300,"sizeBytes":221},{"name":"manage_editor.md","path":"website/docs/reference/tools/core/manage_editor.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_editor.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_editor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_editor.md)","tokens":300,"sizeBytes":213},{"name":"manage_gameobject.md","path":"website/docs/reference/tools/core/manage_gameobject.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_gameobject.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_gameobject.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_gameobject.md)","tokens":300,"sizeBytes":221},{"name":"manage_graphics.md","path":"website/docs/reference/tools/core/manage_graphics.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_graphics.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_graphics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_graphics.md)","tokens":300,"sizeBytes":217},{"name":"manage_material.md","path":"website/docs/reference/tools/core/manage_material.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_material.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_material.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_material.md)","tokens":300,"sizeBytes":217},{"name":"manage_packages.md","path":"website/docs/reference/tools/core/manage_packages.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_packages.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_packages.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_packages.md)","tokens":300,"sizeBytes":217},{"name":"manage_physics.md","path":"website/docs/reference/tools/core/manage_physics.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_physics.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_physics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_physics.md)","tokens":300,"sizeBytes":215},{"name":"manage_prefabs.md","path":"website/docs/reference/tools/core/manage_prefabs.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_prefabs.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_prefabs.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_prefabs.md)","tokens":300,"sizeBytes":215},{"name":"manage_scene.md","path":"website/docs/reference/tools/core/manage_scene.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_scene.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_scene.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_scene.md)","tokens":300,"sizeBytes":211},{"name":"manage_script_capabilities.md","path":"website/docs/reference/tools/core/manage_script_capabilities.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script_capabilities.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_script_capabilities.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script_capabilities.md)","tokens":300,"sizeBytes":239},{"name":"manage_script.md","path":"website/docs/reference/tools/core/manage_script.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_script.md)","tokens":300,"sizeBytes":213},{"name":"manage_tools.md","path":"website/docs/reference/tools/core/manage_tools.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_tools.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/manage_tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/manage_tools.md)","tokens":300,"sizeBytes":211},{"name":"read_console.md","path":"website/docs/reference/tools/core/read_console.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/read_console.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/read_console.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/read_console.md)","tokens":300,"sizeBytes":211},{"name":"refresh_unity.md","path":"website/docs/reference/tools/core/refresh_unity.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/refresh_unity.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/refresh_unity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/refresh_unity.md)","tokens":300,"sizeBytes":213},{"name":"script_apply_edits.md","path":"website/docs/reference/tools/core/script_apply_edits.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/script_apply_edits.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/script_apply_edits.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/script_apply_edits.md)","tokens":300,"sizeBytes":223},{"name":"set_active_instance.md","path":"website/docs/reference/tools/core/set_active_instance.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/set_active_instance.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/set_active_instance.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/set_active_instance.md)","tokens":300,"sizeBytes":225},{"name":"validate_script.md","path":"website/docs/reference/tools/core/validate_script.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/validate_script.md","title":"Core Skill","category":"anthropic-skill","format":"markdown","content":"# Core Skill\n\nPath: `website/docs/reference/tools/core/validate_script.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/core/validate_script.md)","tokens":300,"sizeBytes":217},{"name":"_category_.json","path":"website/docs/reference/tools/docs/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/_category_.json","title":"Docs Skill","category":"anthropic-skill","format":"json","content":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/_category_.json)","tokens":300,"sizeBytes":211},{"name":"index.md","path":"website/docs/reference/tools/docs/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/index.md","title":"Docs Skill","category":"anthropic-skill","format":"markdown","content":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/index.md)","tokens":300,"sizeBytes":197},{"name":"unity_docs.md","path":"website/docs/reference/tools/docs/unity_docs.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_docs.md","title":"Docs Skill","category":"anthropic-skill","format":"markdown","content":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/unity_docs.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_docs.md)","tokens":300,"sizeBytes":207},{"name":"unity_reflect.md","path":"website/docs/reference/tools/docs/unity_reflect.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_reflect.md","title":"Docs Skill","category":"anthropic-skill","format":"markdown","content":"# Docs Skill\n\nPath: `website/docs/reference/tools/docs/unity_reflect.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/docs/unity_reflect.md)","tokens":300,"sizeBytes":213},{"name":"index.md","path":"website/docs/reference/tools/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/index.md","title":"Tools Skill","category":"anthropic-skill","format":"markdown","content":"# Tools Skill\n\nPath: `website/docs/reference/tools/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/index.md)","tokens":300,"sizeBytes":188},{"name":"_category_.json","path":"website/docs/reference/tools/probuilder/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/_category_.json","title":"Probuilder Skill","category":"anthropic-skill","format":"json","content":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/_category_.json)","tokens":300,"sizeBytes":229},{"name":"index.md","path":"website/docs/reference/tools/probuilder/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/index.md","title":"Probuilder Skill","category":"anthropic-skill","format":"markdown","content":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/index.md)","tokens":300,"sizeBytes":215},{"name":"manage_probuilder.md","path":"website/docs/reference/tools/probuilder/manage_probuilder.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/manage_probuilder.md","title":"Probuilder Skill","category":"anthropic-skill","format":"markdown","content":"# Probuilder Skill\n\nPath: `website/docs/reference/tools/probuilder/manage_probuilder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/probuilder/manage_probuilder.md)","tokens":300,"sizeBytes":239},{"name":"_category_.json","path":"website/docs/reference/tools/profiling/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/_category_.json","title":"Profiling Skill","category":"anthropic-skill","format":"json","content":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/_category_.json)","tokens":300,"sizeBytes":226},{"name":"index.md","path":"website/docs/reference/tools/profiling/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/index.md","title":"Profiling Skill","category":"anthropic-skill","format":"markdown","content":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/index.md)","tokens":300,"sizeBytes":212},{"name":"manage_profiler.md","path":"website/docs/reference/tools/profiling/manage_profiler.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/manage_profiler.md","title":"Profiling Skill","category":"anthropic-skill","format":"markdown","content":"# Profiling Skill\n\nPath: `website/docs/reference/tools/profiling/manage_profiler.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/profiling/manage_profiler.md)","tokens":300,"sizeBytes":232},{"name":"_category_.json","path":"website/docs/reference/tools/scripting_ext/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/_category_.json","title":"Scripting_ext Skill","category":"anthropic-skill","format":"json","content":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/_category_.json)","tokens":300,"sizeBytes":238},{"name":"execute_code.md","path":"website/docs/reference/tools/scripting_ext/execute_code.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/execute_code.md","title":"Scripting_ext Skill","category":"anthropic-skill","format":"markdown","content":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/execute_code.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/execute_code.md)","tokens":300,"sizeBytes":238},{"name":"index.md","path":"website/docs/reference/tools/scripting_ext/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/index.md","title":"Scripting_ext Skill","category":"anthropic-skill","format":"markdown","content":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/index.md)","tokens":300,"sizeBytes":224},{"name":"manage_scriptable_object.md","path":"website/docs/reference/tools/scripting_ext/manage_scriptable_object.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/manage_scriptable_object.md","title":"Scripting_ext Skill","category":"anthropic-skill","format":"markdown","content":"# Scripting_ext Skill\n\nPath: `website/docs/reference/tools/scripting_ext/manage_scriptable_object.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/scripting_ext/manage_scriptable_object.md)","tokens":300,"sizeBytes":262},{"name":"_category_.json","path":"website/docs/reference/tools/testing/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/_category_.json","title":"Testing Skill","category":"anthropic-skill","format":"json","content":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/_category_.json)","tokens":300,"sizeBytes":220},{"name":"get_test_job.md","path":"website/docs/reference/tools/testing/get_test_job.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/get_test_job.md","title":"Testing Skill","category":"anthropic-skill","format":"markdown","content":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/get_test_job.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/get_test_job.md)","tokens":300,"sizeBytes":220},{"name":"index.md","path":"website/docs/reference/tools/testing/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/index.md","title":"Testing Skill","category":"anthropic-skill","format":"markdown","content":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/index.md)","tokens":300,"sizeBytes":206},{"name":"run_tests.md","path":"website/docs/reference/tools/testing/run_tests.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/run_tests.md","title":"Testing Skill","category":"anthropic-skill","format":"markdown","content":"# Testing Skill\n\nPath: `website/docs/reference/tools/testing/run_tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/testing/run_tests.md)","tokens":300,"sizeBytes":214},{"name":"_category_.json","path":"website/docs/reference/tools/ui/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/_category_.json","title":"Ui Skill","category":"anthropic-skill","format":"json","content":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/_category_.json)","tokens":300,"sizeBytes":205},{"name":"index.md","path":"website/docs/reference/tools/ui/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/index.md","title":"Ui Skill","category":"anthropic-skill","format":"markdown","content":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/index.md)","tokens":300,"sizeBytes":191},{"name":"manage_ui.md","path":"website/docs/reference/tools/ui/manage_ui.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/manage_ui.md","title":"Ui Skill","category":"anthropic-skill","format":"markdown","content":"# Ui Skill\n\nPath: `website/docs/reference/tools/ui/manage_ui.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/ui/manage_ui.md)","tokens":300,"sizeBytes":199},{"name":"_category_.json","path":"website/docs/reference/tools/vfx/_category_.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/_category_.json","title":"Vfx Skill","category":"anthropic-skill","format":"json","content":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/_category_.json)","tokens":300,"sizeBytes":208},{"name":"index.md","path":"website/docs/reference/tools/vfx/index.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/index.md","title":"Vfx Skill","category":"anthropic-skill","format":"markdown","content":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/index.md)","tokens":300,"sizeBytes":194},{"name":"manage_shader.md","path":"website/docs/reference/tools/vfx/manage_shader.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_shader.md","title":"Vfx Skill","category":"anthropic-skill","format":"markdown","content":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_shader.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_shader.md)","tokens":300,"sizeBytes":210},{"name":"manage_texture.md","path":"website/docs/reference/tools/vfx/manage_texture.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_texture.md","title":"Vfx Skill","category":"anthropic-skill","format":"markdown","content":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_texture.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_texture.md)","tokens":300,"sizeBytes":212},{"name":"manage_vfx.md","path":"website/docs/reference/tools/vfx/manage_vfx.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_vfx.md","title":"Vfx Skill","category":"anthropic-skill","format":"markdown","content":"# Vfx Skill\n\nPath: `website/docs/reference/tools/vfx/manage_vfx.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/vfx/manage_vfx.md)","tokens":300,"sizeBytes":204},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## What This Project Is\n\n**MCP for Unity** is a bridge that lets AI assistants (Claude, Cursor, Windsurf, etc.) control the Unity Editor through the Model Context Protocol (MCP). It enables AI-driven game development workflows - creating GameObjects, editing scripts, managing assets, running tests, and more.\n\n## Architecture\n\n```text\nAI Assistant (Claude/Cursor)\n        ↓ MCP Protocol (stdio/HTTP)\nPython Server (Server/src/)\n        ↓ WebSocket + HTTP\nUnity Editor Plugin (MCPForUnity/)\n        ↓ Unity Editor API\nScene, Assets, Scripts\n```\n\n**Two codebases, one system:**\n- `Server/` - Python MCP server using FastMCP\n- `MCPForUnity/` - Unity C# Editor package\n\n### Three Layers on the Python Side\n\nThe Python server has three distinct layers. These are **not** auto-generated from each other:\n\n| Layer | Location | Framework | Purpose |\n|-------|----------|-----------|---------|\n| **MCP Tools** | `Server/src/services/tools/` | FastMCP (`@mcp_for_unity_tool`) | Exposed to AI assistants via MCP protocol |\n| **CLI Commands** | `Server/src/cli/commands/` | Click (`@click.command`) | Terminal interface for developers |\n| **Resources** | `Server/src/services/resources/` | FastMCP (`@mcp_for_unity_resource`) | Read-only state exposed to AI assistants |\n\nMCP tools call Unity via WebSocket (`send_with_unity_instance`). CLI commands call Unity via HTTP (`run_command`). Both route to the same C# `HandleCommand` methods.\n\n### Transport Modes\n\n- **Stdio**: Single-agent only. Separate Python process per client. Legacy TCP bridge to Unity. New connections stomp old ones.\n- **HTTP**: Multi-agent ready. Single shared Python server. WebSocket hub at `/hub/plugin`. Session isolation via `client_id`.\n\n## Code Philosophy\n\n### 1. Domain Symmetry\nPython MCP tools mirror C# Editor tools. Each domain exists in both:\n- `Server/src/services/tools/manage_material.py` ↔ `MCPForUnity/Editor/Tools/ManageMaterial.cs`\n- CLI commands (`Server/src/cli/commands/`) also mirror these but are a separate implementation.\n\n### 2. Minimal Abstraction\nAvoid premature abstraction. Three similar lines of code is better than a helper that's used once. Only abstract when you have 3+ genuine use cases.\n\n### 3. Delete Rather Than Deprecate\nWhen removing functionality, delete it completely. No `_unused` renames, no `// removed` comments, no backwards-compatibility shims for internal code.\n\n### 4. Test Coverage Required\nEvery new feature needs tests. Run them before PRs.\n\n### 5. Keep Tools Focused\nEach MCP tool does one thing well. Resist the urge to add \"convenient\" parameters that bloat the API surface.\n\n### 6. Use Resources for Reading\nKeep them smart and focused rather than \"read everything\" type resources. Resources should be quick and LLM-friendly.\n\n## Key Patterns\n\n### Python MCP Tool Registration\nTools in `Server/src/services/tools/` are auto-discovered. Use the `@mcp_for_unity_tool` decorator:\n```python\nfrom services.registry import mcp_for_unity_tool\n\n@mcp_for_unity_tool(\n    description=\"Does something in Unity.\",\n    group=\"core\",  # core (default), vfx, animation, ui, scripting_ext, testing, probuilder, profiling, docs, asset_gen\n)\nasync def manage_something(\n    ctx: Context,\n    action: Annotated[Literal[\"create\", \"delete\"], \"Action to perform\"],\n) -> dict[str, Any]:\n    unity_instance = await get_unity_instance_from_context(ctx)\n    params = {\"action\": action}\n    response = await send_with_unity_instance(async_send_command_with_retry, unity_instance, \"manage_something\", params)\n    return response\n```\n\nThe `group` parameter controls tool visibility. Only `\"core\"` is enabled by default. Non-core groups (vfx, animation, etc.) start disabled and are toggled via `manage_tools`.\n\n### Python CLI Error Handling\nCLI commands (not MCP tools) use the `@handle_unity_errors` decorator:\n```python\n@handle_unity_errors\nasync def my_command(ctx, ...):\n    result = await call_unity_tool(...)\n```\n\n### C# Tool Registration\nTools are auto-discovered by `CommandRegistry` via reflection. Use the `[McpForUnityTool]` attribute:\n```csharp\n[McpForUnityTool(\"manage_something\", AutoRegister = false, Group = \"core\")]\npublic static class ManageSomething\n{\n    // Sync handler (most tools):\n    public static object HandleCommand(JObject @params)\n    {\n        var p = new ToolParams(@params);\n        // ...\n        return new SuccessResponse(\"Done.\", new { data = result });\n    }\n\n    // OR async handler (for long-running operations like play-test, refresh, batch):\n    public static async Task<object> HandleCommand(JObject @params)\n    {\n        // CommandRegistry detects Task return type automatically\n        await SomeAsyncOperation();\n        return new SuccessResponse(\"Done.\");\n    }\n}\n```\n\nAsync handlers use `EditorApplication.update` polling with `TaskCompletionSource` — see `RefreshUnity.cs` for the canonical pattern.\n\n### C# Parameter Handling\nUse `ToolParams` for consistent parameter validation:\n```csharp\nvar p = new ToolParams(parameters);\nvar pageSize = p.GetInt(\"page_size\", \"pageSize\") ?? 50;\nvar name = p.RequireString(\"name\");\n```\n\n### C# Resources\nResources use `[McpForUnityResource]` and follow the same `HandleCommand` pattern as tools. They provide read-only state to AI assistants.\n\n### Paging Large Results\nAlways page results that could be large (hierarchies, components, search results):\n- Use `page_size` and `cursor` parameters\n- Return `next_cursor` when more results exist\n\n### Composing Tools Internally (C#)\nUse `CommandRegistry.InvokeCommandAsync` to call other tools from within a handler:\n```csharp\nvar result = await CommandRegistry.InvokeCommandAsync(\"read_console\", consoleParams);\n```\n\n### Unity API Compatibility Shims\nWe support a wide Unity version range (2021+ → 6.x → CoreCLR 6.8). When an API is renamed, deprecated, or removed across versions, **don't sprinkle `#if UNITY_x_y_OR_NEWER` at every call site** — add a shim in `MCPForUnity/Runtime/Helpers/Unity*Compat.cs` and route every caller through it.\n\nThe catalog of active shims, the policy for when to add one, what does NOT belong in a shim, and the reflection-cache pattern all live in **`MCPForUnity/Runtime/Helpers/UnityCompatShims.cs`** — the XML doc on that empty marker class is the source of truth and ships inside the UPM package, so end-users can `F12`/Go-to-definition into it. Sources for current deprecations: Unity 6.x upgrade guides and the [CoreCLR 2026 thread](https://discussions.unity.com/t/path-to-coreclr-2026-upgrade-guide/1714279).\n\nWhen you touch a shim or anything else gated by `#if UNITY_*_OR_NEWER`, run `tools/check-unity-versions.sh` to compile-check across the CI matrix locally before committing — the matrix lives in `tools/unity-versions.json`.\n\n## Commands\n\n### Running Tests\n```bash\n# Python (all tests)\ncd Server && uv run pytest tests/ -v\n\n# Python (single test file)\ncd Server && uv run pytest tests/test_manage_material.py -v\n\n# Python (single test by name)\ncd Server && uv run pytest tests/ -k \"test_create_material\" -v\n\n# Unity - open TestProjects/UnityMCPTests in Unity, use Test Runner window\n\n# Local multi-version compile check (parity with CI matrix, see tools/unity-versions.json)\ntools/check-unity-versions.sh           # compile-only across installed Unity Hub editors\ntools/check-unity-versions.sh --full    # full EditMode test run\n\n# License-free Roslyn compile of MCPForUnity, the same gate compile-check.yml runs on every PR.\n# No Editor launch, ~1 min per version. EXTRA_REFS must hold Newtonsoft.Json.dll and\n# nunit.framework.dll (copy them from TestProjects/UnityMCPTests/Library/PackageCache);\n# the script header has the full recipe, including the Windows/Git Bash form.\nUNITY_DATA=/path/to/Editor/Data UNITY_VERSION=2021.3.45f2 EXTRA_REFS=/path/to/refs tools/compile-check.sh\n```\n\n#### Local headless test harness\nOne command boots a headless Hub-licensed Editor against `TestProjects/UnityMCPTests` and runs the smoke + EditMode + PlayMode legs over the bridge — the same entrypoint CI uses (`.github/workflows/e2e-bridge.yml`):\n\n```bash\npython tools/local_harness.py\n```\n\nKey flags: `--legs smoke,editmode,playmode` (subset to run), `--project-path` (target project, default `TestProjects/UnityMCPTests`), `--reuse` (attach to an already-resident bridge instead of booting one), `--keep-alive` (leave the Editor running after the legs), `--no-warmup` (skip the warm-up import phase).\n\nExit codes: `0` pass, `1` blocking-leg regression, `2` bridge unreachable / setup failure, `3` project does not compile, `4` no Unity license / Hub seat, `5` Editor binary/version not found. Requires a Hub-activated Editor locally (no ULF/serial).\n\n### Local Development\n1. Set **Server Source Override** in MCP for Unity Advanced Settings to your local `Server/` path\n2. Enable **Dev Mode** checkbox to force fresh installs\n3. Use `mcp_source.py` to switch Unity package sources\n4. Test on Windows and Mac if possible, and multiple clients (Claude Desktop and Claude Code are tricky for configuration as of this writing)\n\n### Adding a New Tool\n1. Add Python MCP tool in `Server/src/services/tools/manage_<domain>.py` using `@mcp_for_unity_tool`\n2. Add Python CLI commands in `Server/src/cli/commands/<domain>.py` using Click\n3. Add C# implementation in `MCPForUnity/Editor/Tools/Manage<Domain>.cs` with `[McpForUnityTool]`\n4. Add Python tests in `Server/tests/test_manage_<domain>.py`\n5. Add Unity tests in `TestProjects/UnityMCPTests/Assets/Tests/`\n\n## What Not To Do\n\n- Don't add features without tests\n- Don't create helper functions for one-time operations\n- Don't add error handling for scenarios that can't happen\n- Don't commit to `main` directly - branch off `beta` for PRs\n- Don't add docstrings/comments to code you didn't change\n","isInternal":false,"tokens":2375,"sizeBytes":9848},{"name":"mcp.json","path":".claude/mcp.json","rawUrl":"https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/mcp.json","title":"Model Context Protocol (MCP) Configuration","category":"mcp-config","format":"json","content":"{\n  \"mcpServers\": {\n    \"UnityMCP\": {\n      \"type\": \"http\",\n      \"url\": \"http://localhost:8080/mcp\"\n    }\n  }\n}\n","frontmatter":{"mcpServers":{"UnityMCP":{"type":"http","url":"http://localhost:8080/mcp"}}},"isInternal":false,"tokens":41,"sizeBytes":113}],"systemPromptSnippet":"<yakaai_skills repo=\"CoplayDev/unity-mcp\">\n<!-- File: .claude/skills/blender-to-unity/manual-verify.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Blender-to-unity Skill\n\nPath: `.claude/skills/blender-to-unity/manual-verify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/manual-verify.md)\n\n<!-- File: .claude/skills/blender-to-unity/references/bridge-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.claude/skills/blender-to-unity/references/bridge-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/blender-to-unity/references/bridge-fidelity.md)\n\n<!-- File: .claude/skills/blender-to-unity/SKILL.md (Tokens: ~2555 | Category: anthropic-skill) -->\n---\nname: blender-to-unity\ndescription: Hand off a model from Blender (via BlenderMCP) into Unity (via MCP for Unity) — export the current Blender model, import it through import_model_file, and place it in the open scene. Use when the user has BlenderMCP and MCP for Unity both connected and wants to bring a Blender model into Unity. Does NOT drive Blender's own generators; BlenderMCP owns how the model got into Blender.\n---\n\n# Blender → Unity Model Handoff\n\nBring whatever model is currently in Blender into the open Unity scene. The seam is the\nlocal filesystem: Blender exports a file, Unity imports it. The two servers never talk\ndirectly.\n\n## Preconditions\n- Both `mcp__blender__*` tools and MCP for Unity tools are connected.\n- A model exists in the Blender scene (confirm with `mcp__blender__get_scene_info` /\n  `mcp__blender__get_object_info`). If empty, stop and tell the user — this skill does not generate models.\n- **`import_model_file` is in the `asset_gen` tool group, which is off by default** (only `core`\n  loads). Enable it first with `manage_tools` (enable the `asset_gen` group), **or** call the C#\n  handler straight through `batch_execute` —\n  `{\"tool\":\"import_model_file\",\"params\":{\"sourcePath\":...,\"name\":...,\"outputFolder\":...}}` (camelCase)\n  — which dispatches by name regardless of group gating.\n\n## Steps\n1. **Resolve the Unity project path.** Read `mcpforunity://editor/state` for the project\n   root (the editor dataPath's parent). Decide the export format:\n   - **GLB (glTFast) when the model has a rig, animation, PBR (metallic/roughness), emission,\n     or transparency** — glTFast carries all of these automatically, no post-processing\n     (see [references/bridge-fidelity.md](references/bridge-fidelity.md)). Multi-material zones\n     survive either format, so they alone don't force GLB.\n   - **FBX otherwise** — when glTFast isn't installed, the model is plain geometry, or you\n     specifically need the built-in importer's humanoid-avatar pipeline. FBX drops emission/metallic\n     (Step 5 restores emission) and surfaces animation only with `animation_type` set (Step 3).\n2. **Export from Blender to a temp path** via `mcp__blender__execute_blender_code`:\n   ```python\n   import bpy, os, tempfile\n   out = os.path.join(tempfile.gettempdir(), \"blender_to_unity.fbx\")\n   # Export the selection if any, else the whole scene:\n   bpy.ops.export_scene.fbx(filepath=out, use_selection=bool(bpy.context.selected_objects),\n                            apply_unit_scale=True, bake_space_transform=True)\n   print(out)\n   ```\n   (glTF branch: `out_glb = os.path.join(tempfile.gettempdir(), \"blender_to_unity.glb\")`, then\n   `bpy.ops.export_scene.gltf(filepath=out_glb, export_format='GLB', use_active_scene=True)`\n   — its default `use_active_scene=False` can silently export a *different* open scene.)\n3. **Import into Unity** with `import_model_file`:\n   `import_model_file(source_path=<temp path>, name=<asset name>, target_size=<final size in meters>)`.\n   For a **rigged/animated FBX**, also pass `animation_type=\"generic\"` (or `\"humanoid\"`; `\"legacy\"`\n   targets the old Animation-component system) — the importer defaults to `\"none\"`, which\n   deliberately imports the mesh with **zero animation clips**. GLB ignores this (glTFast imports\n   animation itself), so it's an FBX-only knob.\n   It returns `{ asset_path, asset_guid }`. Pass `target_size` as the intended final size, but treat\n   it only as a hint: it rescales at import solely when the project's **Auto-normalize** pref is on,\n   and even then is unreliable for Blender FBX (see the **Scale** note). Step 4 does the reliable\n   normalization.\n4. **Place it in the scene, normalized to size.** Ensure the scene has a camera + directional\n   light (`manage_scene` / `manage_gameobject`). Instantiate the model at the chosen position via\n   `manage_gameobject(action=\"create\", prefab_path=<asset_path>, name=<asset name>, position=[x,y,z])`.\n   Then normalize its size deterministically — Blender FBX commonly imports ~100× too large — by\n   measuring the placed model's world bounds and scaling so its largest dimension equals your target\n   size. Run via `execute_code` (substitute your object name and target meters):\n   ```csharp\n   var go = GameObject.Find(\"<asset name>\");\n   var rs = go.GetComponentsInChildren<Renderer>();\n   var b = rs[0].bounds; for (int i = 1; i < rs.Length; i++) b.Encapsulate(rs[i].bounds);\n   float maxDim = Mathf.Max(b.size.x, Mathf.Max(b.size.y, b.size.z));\n   float target = 2f; // intended size in meters\n   if (maxDim > 0.0001f) go.transform.localScale *= target / maxDim;\n   ```\n5. **Restore emission FBX dropped (FBX path).** Blender scenes commonly store their color/glow\n   in *material emission* (and other Principled-node inputs). FBX carries base/diffuse color but\n   **not emission**, so neon / \"Tron\" scenes import as dark bodies with black accents. If the\n   import looks flat vs. Blender, restore it:\n   a. Dump the emissive materials from Blender via `execute_blender_code`:\n      ```python\n      import bpy, json\n      out = {}\n      for m in bpy.data.materials:\n          if not (m.use_nodes and m.node_tree): continue\n          col, s = (0, 0, 0), 0.0\n          p = next((n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None)\n          es = next((k for k in ('Emission Color', 'Emission') if p and k in p.inputs), None)  # 4.x / 3.x name\n          if es:\n              col = tuple(p.inputs[es].default_value)[:3]\n              s = float(p.inputs['Emission Strength'].default_value)\n          e = next((n for n in m.node_tree.nodes if n.type == 'EMISSION'), None)\n          if e and s == 0:\n              col = tuple(e.inputs['Color'].default_value)[:3]; s = float(e.inputs['Strength'].default_value)\n          if s > 0 and sum(col) > 0.01:\n              out[m.name] = [round(col[0], 3), round(col[1], 3), round(col[2], 3), round(s, 3)]\n      print(json.dumps(out))\n      ```\n   b. In Unity (`execute_code`): extract the FBX's materials so they're editable\n      (`AssetDatabase.ExtractAsset` per `Material`, then `ImportAsset(fbx, ForceUpdate)`), then for\n      each dumped name set `_EmissionColor = color * Mathf.Clamp(strength*0.45f, 1.5f, 5f)`,\n      `EnableKeyword(\"_EMISSION\")`, and `globalIlluminationFlags = RealtimeEmissive`. Match names\n      **case-insensitively** — FBX mangles case and can split one material into variants\n      (`EdgeCyan` → `EdgeCyan` + `EDGE_CYAN`); set every match. Add a global Bloom volume and enable\n      the camera's `renderPostProcessing` so the emission actually glows.\n6. **Verify** with `manage_camera(action=\"screenshot\", include_image=true)` and report the\n   asset path + a screenshot.\n\n## Notes\n- **Scale.** Models from Blender almost always arrive at the wrong scale — its FBX unit handling\n  makes them land ~100× too large in Unity. `import_model_file`'s `target_size` only rescales at\n  import when the project's Auto-normalize pref is enabled, and its importer-level normalization is\n  unreliable for Blender FBX (it can over- or under-shoot, e.g. a `target_size=2` model measured 200 m).\n  The robust fix is the Step 4 measure-bounds-then-set-`localScale` routine, which hits the target\n  size deterministically regardless of the import scale or the Auto-normalize pref.\n- **Materials & emission.** FBX carries base/diffuse color and transforms fine, but **drops\n  emission and any node-based color** — so Blender neon / \"Tron\" scenes (color stored in\n  emission) import as dark bodies with black accents. Two fixes: **(a) prefer glTF/GLB when glTFast\n  is installed** — glTF's PBR model carries `emissiveFactor` + `KHR_materials_emissive_strength`\n  natively, so emission survives with no post-step (`bpy.ops.export_scene.gltf(filepath=out, export_format='GLB', use_active_scene=True)`);\n  **(b) with FBX, run Step 5** to dump Blender's emission and reapply it. Also check the mesh for a\n  `color_attributes` (vertex color) layer — the *data* survives FBX, but URP Lit won't *display* it;\n  that needs a vertex-color-reading shader, not `_EmissionColor`.\n- FBX is the default because glTFast is optional in MCP for Unity. If the import errors with\n  \"GLB import requires glTFast\", re-export as FBX (or install glTFast from the Dependencies tab).\n- **Format fidelity.** [references/bridge-fidelity.md](references/bridge-fidelity.md) is a tested\n  matrix of what each format carries. Summary: **GLB (glTFast)** keeps textures, metallic/roughness,\n  emission, transparency, and animation automatically; **FBX** drops metallic + emission, needs\n  `ModelImporter.animationType = Generic` to surface transform animation, and needs material/texture\n  extraction to assign an embedded texture. Both bake modifiers and carry geometry + vertex-color\n  *data* (URP Lit won't *display* vertex colors). Neither carries procedural/node materials — bake\n  them to image textures in Blender first.\n- **Animation doesn't auto-play.** An imported clip won't move the model until an `AnimatorController`\n  drives it — the placed model has an `Animator` with a **null controller**, so it looks frozen. Build\n  one with `manage_animation` (`controller_create` → add the clip as a looping state → `controller_assign`\n  onto the instance) rather than hand-rolling `execute_code`. See bridge-fidelity gotcha #7.\n- **Multi-material zones survive.** A mesh split into material slots in Blender (e.g. skin/shirt/pants\n  regions) imports as submeshes with one material each — base colors carry over GLB natively — so you\n  can \"dress\" a model with material zones and it arrives intact.\n- Keep one model per handoff; for batches, repeat the loop with distinct names.\n- This skill never sends API keys or file bytes over the MCP bridge — Unity reads the file from disk.\n- `import_model_file` copies only the single source file; for multi-file exports (a text `.gltf` with an external `.bin`, or an `.obj` with a sibling `.mtl`/textures), zip them first and pass the `.zip` — a bare `.gltf`/`.obj` will lose its sidecars.\n\n<!-- File: .claude/skills/mcp-source/SKILL.md (Tokens: ~807 | Category: anthropic-skill) -->\n---\nname: mcp-source\ndescription: Switch MCP for Unity package source in connected Unity projects. Use /mcp-source [main|beta|branch|local] to swap between upstream releases, your remote branch, or local dev checkout.\n---\n\n# Switch MCP for Unity Package Source\n\nYou are switching the `com.coplaydev.unity-mcp` package source in one or more Unity projects.\n\n## allowed-tools\n\nBash, Read, Edit, ReadMcpResourceTool, ListMcpResourcesTool\n\n## Instructions\n\n### 1. Parse arguments\n\nThe user's argument is: `$ARGUMENTS`\n\nValid values: `main`, `beta`, `branch`, `local`, or empty.\n\nIf empty or not one of the four valid values, ask the user to choose:\n- **main** — upstream main branch (stable releases)\n- **beta** — upstream beta branch (pre-release)\n- **branch** — your current remote branch (for testing a PR)\n- **local** — local file reference to your checkout (for live dev iteration)\n\n### 2. Detect repo context\n\nRun these git commands from the current working directory to find the unity-mcp repo:\n\n```bash\ngit rev-parse --show-toplevel    # → repo_root\ngit rev-parse --abbrev-ref HEAD  # → branch_name\ngit remote get-url origin        # → origin_url\n```\n\nConvert SSH origins to HTTPS: if `origin_url` starts with `git@github.com:`, transform it to `https://github.com/{owner}/{repo}.git`.\n\n### 3. Discover target Unity projects\n\nTry two approaches to find `Packages/manifest.json` files to update:\n\n**Approach A — MCP resources (preferred):**\nRead `mcpforunity://project/info` for each connected Unity instance (use `ListMcpResourcesTool` to find available instances). Extract `projectRoot` and use `{projectRoot}/Packages/manifest.json`.\n\n**Approach B — filesystem fallback:**\nIf no MCP instances are connected, search upward from the current working directory for `Packages/manifest.json` files using Bash:\n```bash\nfind \"$(pwd)\" -maxdepth 3 -name \"manifest.json\" -path \"*/Packages/manifest.json\" 2>/dev/null\n```\n\nIf multiple manifests are found, update all of them (confirming with the user first).\n\n### 4. Build the package URL\n\nBased on the user's selection, construct the dependency value:\n\n| Selection | URL |\n|-----------|-----|\n| `main`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main` |\n| `beta`    | `https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#beta` |\n| `branch`  | `{origin_https}?path=/MCPForUnity#{branch_name}` |\n| `local`   | `file:{repo_root}/MCPForUnity` |\n\nFor `branch`: use the HTTPS-normalized origin URL and current git branch name.\nFor `local`: use the absolute path to the repo root with `file:` prefix (no `//`), e.g. `file:/Users/davidsarno/unity-mcp/MCPForUnity`.\n\n### 5. Update each manifest\n\nFor each discovered `manifest.json`:\n\n1. Read the file with the Read tool\n2. Find the `\"com.coplaydev.unity-mcp\"` dependency line\n3. Use the Edit tool to replace the old value with the new URL\n4. Report what was changed: old value → new value, file path\n\n### 6. Report results\n\nAfter updating, tell the user:\n- Which manifests were updated\n- The old and new package source values\n- Remind them: \"Unity will re-resolve the package automatically. If it doesn't, open Package Manager and click Refresh.\"\n\n<!-- File: .claude/skills/unity-mcp-skill/references/tools-reference.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/tools-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/tools-reference.md)\n\n<!-- File: .claude/skills/unity-mcp-skill/references/workflows.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.claude/skills/unity-mcp-skill/references/workflows.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/.claude/skills/unity-mcp-skill/references/workflows.md)\n\n<!-- File: .claude/skills/unity-mcp-skill/SKILL.md (Tokens: ~3984 | Category: anthropic-skill) -->\n---\nname: unity-mcp-orchestrator\ndescription: Orchestrate Unity Editor via MCP (Model Context Protocol) tools and resources. Use when working with Unity projects through MCP for Unity - creating/modifying GameObjects, editing scripts, managing scenes, running tests, or any Unity Editor automation. Provides best practices, tool schemas, and workflow patterns for effective Unity-MCP integration.\n---\n\n# Unity-MCP Operator Guide\n\nThis skill helps you effectively use the Unity Editor with MCP tools and resources.\n\n## Template Notice\n\nExamples in `references/workflows.md` and `references/tools-reference.md` are reusable templates. They may be inaccurate across Unity versions, package setups (UGUI/TMP/Input System), and project-specific conventions. Please check console, compilation errors, or use screenshot after implementation.\n\nBefore applying a template:\n- Validate targets/components first via resources and `find_gameobjects`.\n- Treat names, enum values, and property payloads as placeholders to adapt.\n\n## Quick Start: Resource-First Workflow\n\n**Always read relevant resources before using tools.** This prevents errors and provides the necessary context.\n\n```\n1. Check editor state     → mcpforunity://editor/state\n2. Understand the scene   → mcpforunity://scene/gameobject-api\n3. Find what you need     → find_gameobjects or resources\n4. Take action            → tools (manage_gameobject, create_script, script_apply_edits, apply_text_edits, validate_script, delete_script, get_sha, etc.)\n5. Verify results         → read_console, manage_camera(action=\"screenshot\"), resources\n```\n\n**If a tool you need is not in your tool list, it is not necessarily missing.** Check these before troubleshooting the connection:\n\n- **Project custom tools** (C# `[McpForUnityTool]`): with project-scoped tools enabled on the server, they are *not* callable by name. List them via `mcpforunity://custom-tools` and run them with `execute_custom_tool(tool_name=\"...\", parameters={...})`. With it disabled, they are registered as ordinary tools and appear in your list.\n- **Disabled tool groups**: over HTTP, a session starts with only the `core` group enabled. Over stdio, all groups start enabled and are then synced to the tool toggles in the Unity editor, so a tool can still be hidden. `manage_tools(action=\"list_groups\")` shows the groups, `manage_tools(action=\"activate\", group=\"...\")` enables one.\n\n## Critical Best Practices\n\n### 1. After Writing/Editing Scripts: Wait for Compilation and Check Console\n\n```python\n# After create_script or script_apply_edits:\n# Both tools already trigger AssetDatabase.ImportAsset + RequestScriptCompilation automatically.\n# No need to call refresh_unity — just wait for compilation to finish, then check console.\n\n# 1. Poll editor state until compilation completes\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 2. Check for compilation errors\nread_console(types=[\"error\"], count=10, include_stacktrace=True)\n```\n\n**Why:** Unity must compile scripts before they're usable. `create_script` and `script_apply_edits` already trigger import and compilation automatically — calling `refresh_unity` afterward is redundant.\n\n### 2. Use `batch_execute` for Multiple Operations\n\n```python\n# 10-100x faster than sequential calls\nbatch_execute(\n    commands=[\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube1\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube2\", \"primitive_type\": \"Cube\"}},\n        {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Cube3\", \"primitive_type\": \"Cube\"}}\n    ],\n    parallel=True  # Hint only: Unity may still execute sequentially\n)\n```\n\n**Max 25 commands per batch by default (configurable in Unity MCP Tools window, max 100).** Use `fail_fast=True` for dependent operations.\n\n**Tip:** Also use `batch_execute` for discovery — batch multiple `find_gameobjects` calls instead of calling them one at a time:\n```python\nbatch_execute(commands=[\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Camera\", \"search_method\": \"by_component\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"Player\", \"search_method\": \"by_tag\"}},\n    {\"tool\": \"find_gameobjects\", \"params\": {\"search_term\": \"GameManager\", \"search_method\": \"by_name\"}}\n])\n```\n\n### 3. Use Screenshots to Verify Visual Results\n\n```python\n# Basic screenshot (saves to Assets/, returns file path only)\nmanage_camera(action=\"screenshot\")\n\n# Inline screenshot (returns base64 PNG directly to the AI)\nmanage_camera(action=\"screenshot\", include_image=True)\n\n# Use a specific camera and cap resolution for smaller payloads\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n\n# Batch surround: captures front/back/left/right/top/bird_eye around the scene\nmanage_camera(action=\"screenshot\", batch=\"surround\", max_resolution=256)\n\n# Batch surround centered on a specific object\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Positioned screenshot: place a temp camera and capture in one call\nmanage_camera(action=\"screenshot\", view_target=\"Player\", view_position=[0, 10, -10], max_resolution=512)\n\n# Scene View screenshot: capture what the developer sees in the editor\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n```\n\n**Best practices for AI scene understanding:**\n- Use `include_image=True` when you need to *see* the scene, not just save a file.\n- Use `batch=\"surround\"` for a comprehensive overview (6 angles, one command).\n- Use `view_target`/`view_position` to capture from a specific viewpoint without needing a scene camera.\n- Use `capture_source=\"scene_view\"` to see the editor viewport (gizmos, wireframes, grid).\n- Keep `max_resolution` at 256–512 to balance quality vs. token cost.\n\n```python\n# Agentic camera loop: point, shoot, analyze\nmanage_gameobject(action=\"look_at\", target=\"MainCamera\", look_at_target=\"Player\")\nmanage_camera(action=\"screenshot\", camera=\"MainCamera\", include_image=True, max_resolution=512)\n# → Analyze image, decide next action\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Scene View for editor-level inspection (shows gizmos, debug overlays, etc.)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Player\", include_image=True)\n```\n\n### 4. Check Console After Major Changes\n\n```python\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\"],  # Focus on problems\n    count=10,\n    format=\"detailed\"\n)\n```\n\n### 5. Always Check `mcpforunity://editor/state` Before Complex Operations\n\n```python\n# Read mcpforunity://editor/state to check:\n# - is_compiling: Wait if true\n# - is_domain_reload_pending: Wait if true  \n# - ready_for_tools: Only proceed if true\n# - blocking_reasons: Why tools might fail\n```\n\n## Parameter Type Conventions\n\nThese are common patterns, not strict guarantees. `manage_components.set_property` payload shapes can vary by component/property; if a template fails, inspect the component resource payload and adjust.\n\n### Vectors (position, rotation, scale, color)\n```python\n# Both forms accepted:\nposition=[1.0, 2.0, 3.0]        # List\nposition=\"[1.0, 2.0, 3.0]\"     # JSON string\n```\n\n### Booleans\n```python\n# Both forms accepted:\ninclude_inactive=True           # Boolean\ninclude_inactive=\"true\"         # String\n```\n\n### Colors\n```python\n# Auto-detected format:\ncolor=[255, 0, 0, 255]         # 0-255 range\ncolor=[1.0, 0.0, 0.0, 1.0]    # 0.0-1.0 normalized (auto-converted)\n```\n\n### Paths\n```python\n# Assets-relative (default):\npath=\"Assets/Scripts/MyScript.cs\"\n\n# URI forms:\nuri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\"\nuri=\"file:///full/path/to/file.cs\"\n```\n\n## Core Tool Categories\n\n| Category | Key Tools | Use For |\n|----------|-----------|---------|\n| **Scene** | `manage_scene`, `find_gameobjects` | Scene operations, finding objects. Multi-scene editing (additive load, close, set active, move GO between scenes), scene templates (`3d_basic`, `2d_basic`, `empty`, `default`), scene validation with `auto_repair`. For build settings, use `manage_build(action=\"scenes\")`. |\n| **Objects** | `manage_gameobject`, `manage_components` | Creating/modifying GameObjects |\n| **Scripts** | `create_script`, `script_apply_edits`, `validate_script` | C# code management (auto-refreshes on create/edit) |\n| **Assets** | `manage_asset`, `manage_prefabs` | Asset operations. **Prefab instantiation** is done via `manage_gameobject(action=\"create\", prefab_path=\"...\")`, not `manage_prefabs`. |\n| **Editor** | `manage_editor`, `execute_menu_item`, `read_console` | Editor control, package deployment (`deploy_package`/`restore_package`), undo/redo (`undo`/`redo` actions) |\n| **Testing** | `run_tests`, `get_test_job` | Unity Test Framework |\n| **Batch** | `batch_execute` | Parallel/bulk operations |\n| **Camera** | `manage_camera` | Camera management (Unity Camera + Cinemachine). **Tier 1** (always available): create, target, lens, priority, list, screenshot. **Tier 2** (requires `com.unity.cinemachine`): brain, body/aim/noise pipeline, extensions, blending, force/release. 7 presets: follow, third_person, freelook, dolly, static, top_down, side_scroller. Resource: `mcpforunity://scene/cameras`. Use `ping` to check Cinemachine availability. See [tools-reference.md](references/tools-reference.md#camera-tools). |\n| **Animation** | `manage_animation`, `manage_sprite` | Animator control, clips and controllers. **2D sprite sheets**: `manage_sprite(action=\"get_info\")` returns a PNG or JPEG sheet as an image to count the grid from, then `full_setup` slices it and builds clips and a controller; clip names decide the states (idle, walk/run, attack-type triggers). Off by default over HTTP: `manage_tools(action=\"activate\", group=\"animation\")`. |\n| **Graphics** | `manage_graphics` | Rendering and post-processing management. 33 actions across 5 groups: **Volume** (create/configure volumes and effects, URP/HDRP), **Bake** (lightmaps, light probes, reflection probes, Edit mode only), **Stats** (draw calls, batches, memory), **Pipeline** (quality levels, pipeline settings), **Features** (URP renderer features: add, remove, toggle, reorder). Resources: `mcpforunity://scene/volumes`, `mcpforunity://rendering/stats`, `mcpforunity://pipeline/renderer-features`. Use `ping` to check pipeline status. See [tools-reference.md](references/tools-reference.md#graphics-tools). |\n| **Packages** | `manage_packages` | Install, remove, search, and manage Unity packages and scoped registries. Query actions: list installed, search registry, get info, ping, poll status. Mutating actions: add/remove packages, embed for editing, add/remove scoped registries, force resolve. Validates identifiers, warns on git URLs, checks dependents before removal (`force=true` to override). See [tools-reference.md](references/tools-reference.md#package-tools). |\n| **Physics** | `manage_physics` | Manage 3D and 2D physics (21 actions). Settings, collision matrix, materials, joints (14 types). Queries: `raycast`, `raycast_all`, `linecast`, `shapecast` (sphere/box/capsule sweep), `overlap`. Forces: `apply_force` (AddForce/AddTorque/AddExplosionForce with ForceMode). Rigidbody: `get_rigidbody`, `configure_rigidbody` (mass, drag, gravity, constraints, collision detection). Validation: scene-wide checks. Simulation: `simulate_step` in edit mode. See [tools-reference.md](references/tools-reference.md#physics-tools). |\n| **ProBuilder** | `manage_probuilder` | 3D modeling, mesh editing, complex geometry. **When `com.unity.probuilder` is installed, prefer ProBuilder shapes over primitive GameObjects** for editable geometry, multi-material faces, or complex shapes. Supports 12 shape types, face/edge/vertex editing, smoothing, and per-face materials. See [ProBuilder Guide](references/probuilder-guide.md). |\n| **UI** | `manage_ui`, `batch_execute` with `manage_gameobject` + `manage_components` | **UI Toolkit**: Use `manage_ui` to create UXML/USS files, attach UIDocument, inspect visual trees. **uGUI (Canvas)**: Use `batch_execute` for Canvas, Panel, Button, Text, Slider, Toggle, Input Field. **Read `mcpforunity://project/info` first** to detect uGUI/TMP/Input System/UI Toolkit availability. (see [UI workflows](references/workflows.md#ui-creation-workflows)) |\n| **Docs** | `unity_reflect`, `unity_docs` | API verification and documentation lookup. **`unity_reflect`** inspects live C# APIs via reflection (requires Unity connection): `search` types across assemblies, `get_type` for member summary, `get_member` for full signatures. **`unity_docs`** fetches official docs from docs.unity3d.com (no Unity connection needed): `get_doc` (ScriptReference), `get_manual` (Manual pages), `get_package_doc` (package docs), `lookup` (parallel search all sources + project assets). **Trust hierarchy: reflection > project assets > docs.** Workflow: `unity_reflect` search -> get_type -> get_member -> `unity_docs` lookup. See [tools-reference.md](references/tools-reference.md#docs-tools). |\n| **More** | `manage_material`, `manage_texture`, `manage_shader`, `manage_vfx`, `manage_profiler`, `execute_code`, `manage_scriptable_object`, `generate_image`, `generate_model`, `generate_audio`, `import_model`, `import_model_file`, `blender_bridge` | Materials; textures, shaders and VFX (`vfx` group); profiling (`profiling`); in-editor C# and ScriptableObjects (`scripting_ext`); AI asset generation, Sketchfab and on-disk model import, Blender (`asset_gen`). Every tool has a section in [tools-reference.md](references/tools-reference.md). |\n\n## Common Workflows\n\n### Creating a New Script and Using It\n\n```python\n# 1. Create the script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/PlayerController.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class PlayerController : MonoBehaviour\\n{\\n    void Update() { }\\n}\"\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for compilation errors\nread_console(types=[\"error\"], count=10)\n\n# 4. Only then attach to GameObject\nmanage_gameobject(action=\"modify\", target=\"Player\", components_to_add=[\"PlayerController\"])\n```\n\n### Finding and Modifying GameObjects\n\n```python\n# 1. Find by name/tag/component (returns IDs only)\nresult = find_gameobjects(search_term=\"Enemy\", search_method=\"by_tag\", page_size=50)\n\n# 2. Get full data via resource\n# mcpforunity://scene/gameobject/{instance_id}\n\n# 3. Modify using the ID\nmanage_gameobject(action=\"modify\", target=instance_id, position=[10, 0, 0])\n```\n\n### Running and Monitoring Tests\n\n```python\n# 1. Start test run (async)\nresult = run_tests(mode=\"EditMode\", test_names=[\"MyTests.TestSomething\"])\njob_id = result[\"job_id\"]\n\n# 2. Poll for completion\nresult = get_test_job(job_id=job_id, wait_timeout=60, include_failed_tests=True)\n```\n\n## Pagination Pattern\n\nLarge queries return paginated results. Always follow `next_cursor`:\n\n```python\ncursor = 0\nall_items = []\nwhile True:\n    result = manage_scene(action=\"get_hierarchy\", page_size=50, cursor=cursor)\n    all_items.extend(result[\"data\"][\"items\"])\n    if not result[\"data\"].get(\"next_cursor\"):\n        break\n    cursor = result[\"data\"][\"next_cursor\"]\n```\n\n## Multi-Instance Workflow\n\nWhen multiple Unity Editors are running:\n\n```python\n# 1. List instances via resource: mcpforunity://instances\n# 2. Set active instance\nset_active_instance(instance=\"MyProject@abc123\")\n# 3. All subsequent calls route to that instance\n```\n\n## Error Recovery\n\n| Symptom | Cause | Solution |\n|---------|-------|----------|\n| Tools return \"busy\" | Compilation in progress | Wait, check `mcpforunity://editor/state` |\n| \"stale_file\" error | File changed since SHA | Re-fetch SHA with `get_sha`, retry |\n| Connection lost | Domain reload | Wait ~5s, reconnect |\n| Commands fail silently | Wrong instance | Check `set_active_instance` |\n\n## Reference Files\n\nFor detailed schemas and examples:\n\n- **[tools-reference.md](references/tools-reference.md)**: Every tool's main actions, parameters, and examples, with links to the full parameter tables\n- **[resources-reference.md](references/resources-reference.md)**: All available resources and their data\n- **[workflows.md](references/workflows.md)**: Extended workflow examples and patterns\n- **[probuilder-guide.md](references/probuilder-guide.md)**: ProBuilder modeling patterns\n\n<!-- File: TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/CHANGELOG.md)\n\n<!-- File: TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/LICENSE.md)\n\n<!-- File: TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Com.unity.asset-store-tools Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/com.unity.asset-store-tools/package.json)\n\n<!-- File: TestProjects/AssetStoreUploads/Packages/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/manifest.json)\n\n<!-- File: TestProjects/AssetStoreUploads/Packages/packages-lock.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Packages Skill\n\nPath: `TestProjects/AssetStoreUploads/Packages/packages-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/AssetStoreUploads/Packages/packages-lock.json)\n\n<!-- File: TestProjects/UnityMCPTests/Packages/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Packages Skill\n\nPath: `TestProjects/UnityMCPTests/Packages/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/Packages/manifest.json)\n\n<!-- File: TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Com.unity.testtools.codecoverage Skill\n\nPath: `TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/TestProjects/UnityMCPTests/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json)\n\n<!-- File: tools/unity-versions.json (Tokens: ~641 | Category: anthropic-skill) -->\n{\n  \"$comment\": \"Single source of truth for Unity versions exercised by CI and tools/check-unity-versions.* local script. Versions are pinned to specific patch releases (no floating tags) per acceptance criteria in CoplayDev/unity-mcp#1107. Every id MUST have a corresponding GameCI Docker image at unityci/editor:ubuntu-<id>-base-3 since both CI (game-ci/unity-test-runner@v4) and local --docker mode pull from there. Verify availability before bumping: https://hub.docker.com/v2/repositories/unityci/editor/tags/?name=<id>\",\n  \"$coverageGap\": \"UNITY_6000_5_OR_NEWER and UNITY_6000_6_OR_NEWER branches are NOT exercised by this matrix because GameCI has not yet published Docker images for Unity 6000.5+/6000.6+. Bump the 'rolling' row to a 6000.5+/6000.6+ patch once https://hub.docker.com/r/unityci/editor publishes one. Tracked branches in code: UnityObjectIdCompat.cs (EntityId path).\",\n  \"defaultVersion\": \"6000.0.75f1\",\n  \"$defaultVersionComment\": \"Unity version used when CI runs the narrow matrix (default PR feedback path). Must be one of the ids in 'versions' below. Today's pick is 6.0 LTS — the version most users target. The 'floor' role still identifies the package's minimum supported version separately.\",\n  \"versions\": [\n    {\n      \"id\": \"2021.3.45f2\",\n      \"role\": \"floor\",\n      \"notes\": \"Package minimum (matches MCPForUnity/package.json 'unity' field and TestProjects/UnityMCPTests/ProjectSettings/ProjectVersion.txt). Legacy branch: all UNITY_2022_*/UNITY_6000_* flags OFF.\"\n    },\n    {\n      \"id\": \"2022.3.62f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Last 2022 LTS. Exercises UNITY_2022_1/2/3_OR_NEWER branches; UNITY_2023_*/UNITY_6000_* OFF. Catches FindObjectsByType-style regressions (the #1105 path).\"\n    },\n    {\n      \"id\": \"6000.0.75f1\",\n      \"role\": \"lts\",\n      \"notes\": \"Unity 6.0 LTS (latest patch on GameCI). UNITY_6000_0_OR_NEWER ON (27 files), UNITY_2023_*_OR_NEWER ON, UNITY_6000_3/4/5/6 OFF.\"\n    },\n    {\n      \"id\": \"6000.4.8f1\",\n      \"role\": \"rolling\",\n      \"notes\": \"Latest 6.x available on GameCI. UNITY_6000_0/1/2/3/4_OR_NEWER ON; UNITY_6000_5/6 OFF (no GameCI image yet — see $coverageGap).\"\n    }\n  ]\n}\n\n<!-- File: tools/UPDATE_DOCS_PROMPT.md (Tokens: ~768 | Category: anthropic-skill) -->\n# LLM Prompt for Updating Documentation\n\nCopy and paste this prompt into your LLM after you add, remove, rename or change an MCP tool or resource. Review its changes, then make sure the checks in step 5 pass.\n\n---\n\n## Prompt\n\nI've just changed MCP tools or resources in this MCP for Unity repository. Please update the documentation to match.\n\n1. **Read the current tools and resources**:\n   - `Server/src/services/tools/`: tools (`@mcp_for_unity_tool`, including its `group`)\n   - `Server/src/services/resources/`: resources (`@mcp_for_unity_resource`)\n   - `Server/src/cli/commands/`: the Click CLI commands that mirror the tools\n\n2. **Regenerate the reference pages.** `website/docs/reference/tools/**` and `website/docs/reference/resources/index.md` are generated from the registry:\n   ```bash\n   cd Server && uv run python ../tools/generate_docs_reference.py\n   ```\n   Do not hand-edit them, except for usage examples between `<!-- examples:start -->` and `<!-- examples:end -->`, which the generator keeps.\n\n3. **Update the hand-maintained files**:\n   - **manifest.json**: the `tools` array must list exactly the registered tools as `{\"name\", \"description\"}` entries; put new ones in alphabetical position. Resources are not listed. `Server/tests/test_manifest_tools.py` fails when a tool is missing, extra or listed twice, but it compares names only: when a tool's purpose changes, check its one-line description by hand.\n   - **Tool groups**: if a tool adds a group or changes what a group covers, update the group's blurb in `TOOL_GROUPS` (`Server/src/services/registry/tool_registry.py`; it feeds the generated group pages, the `tool_groups` resource and `manage_tools`) and the group lists in `website/docs/guides/tool-groups.md` and `website/docs/contributing/dev-setup.md`.\n   - **Tool count**: `README.md`, `docs/i18n/README-zh.md` and `website/docs/guides/tool-groups.md` state how many tools ship. Update the number if it changed.\n   - **CLI docs**: the group table in `website/docs/reference/cli.md` and the \"Complete Command Reference\" table in `website/docs/guides/cli.md` must match the Click command tree (`cd Server && uv run unity-mcp --help`, then `--help` on each group).\n   - **Skill**: if agents need new guidance for the change, update the skill. It has two copies, `unity-mcp-skill/` and `.claude/skills/unity-mcp-skill/`; keep both copies identical.\n\n4. **Leave the release notes alone.** `README.md` has no tool or resource lists; it links to the website catalog. Its \"Recent Updates\" block (the latest 5 releases) and `website/docs/releases.md` are generated from GitHub Releases, whose notes GitHub builds from merged PR titles. After each release, `release.yml` dispatches `.github/workflows/sync-releases.yml`, which runs `tools/sync_release_notes.py` and merges the result into `beta` through its own PR. The \"最近更新\" block in `docs/i18n/README-zh.md` is not synced; it is updated by hand at release time.\n\n5. **After updating**, run these checks:\n   ```bash\n   cd Server\n   uv run python ../tools/generate_docs_reference.py --check\n   uv run pytest tests/test_manifest_tools.py\n   ```\n\nPlease show me the exact changes you're making to each file, and explain any discrepancies you find.\n\n---\n\n<!-- File: unity-mcp-skill/references/probuilder-guide.md (Tokens: ~4431 | Category: anthropic-skill) -->\n# ProBuilder Workflow Guide\n\nPatterns and best practices for AI-driven ProBuilder mesh editing through MCP for Unity.\n\n## Availability\n\nProBuilder is an **optional** Unity package (`com.unity.probuilder`). Check `mcpforunity://project/info` or call `manage_probuilder(action=\"ping\")` to verify it's installed before using any ProBuilder tools. If available, **prefer ProBuilder over primitive GameObjects** for any geometry that needs editing, multi-material faces, or non-trivial shapes.\n\n## Core Workflow: Always Get Info First\n\nBefore any mesh edit, call `get_mesh_info` with `include='faces'` to understand the geometry:\n\n```python\n# Step 1: Get face info with directions\nresult = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"faces\"})\n\n# Response includes per-face:\n#   index: 0, normal: [0, 1, 0], center: [0, 0.5, 0], direction: \"top\"\n#   index: 1, normal: [0, -1, 0], center: [0, -0.5, 0], direction: \"bottom\"\n#   index: 2, normal: [0, 0, 1], center: [0, 0, 0.5], direction: \"front\"\n#   ...\n\n# Step 2: Use the direction labels to pick faces\n# Want to extrude the top? Find the face with direction=\"top\"\nmanage_probuilder(action=\"extrude_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0], \"distance\": 1.5})\n```\n\n### Include Parameter\n\n| Value | Returns | Use When |\n|-------|---------|----------|\n| `\"summary\"` | Counts, bounds, materials | Quick check / validation |\n| `\"faces\"` | + normals, centers, directions | Selecting faces for editing |\n| `\"edges\"` | + edge vertex pairs with world positions (max 200) | Edge-based operations |\n| `\"all\"` | Everything | Full mesh analysis |\n\n## Shape Creation\n\n### All 12 Shape Types\n\n```python\n# Basic shapes\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cube\", \"name\": \"MyCube\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Sphere\", \"name\": \"MySphere\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cylinder\", \"name\": \"MyCyl\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Plane\", \"name\": \"MyPlane\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Cone\", \"name\": \"MyCone\"})\nmanage_probuilder(action=\"create_shape\", properties={\"shape_type\": \"Prism\", \"name\": \"MyPrism\"})\n\n# Parametric shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"MyTorus\",\n    \"rows\": 16, \"columns\": 24, \"innerRadius\": 0.5, \"outerRadius\": 1.0\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Pipe\", \"name\": \"MyPipe\",\n    \"radius\": 1.0, \"height\": 2.0, \"thickness\": 0.2\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Arch\", \"name\": \"MyArch\",\n    \"radius\": 2.0, \"angle\": 180, \"segments\": 12\n})\n\n# Architectural shapes\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"MyStairs\", \"steps\": 10\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"CurvedStair\", \"name\": \"Spiral\", \"steps\": 12\n})\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"MyDoor\"\n})\n\n# Custom polygon\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [[0,0,0], [5,0,0], [5,0,5], [2.5,0,7], [0,0,5]],\n    \"extrudeHeight\": 3.0, \"name\": \"Pentagon\"\n})\n```\n\n## Common Editing Operations\n\n### Extrude a Roof\n\n```python\n# 1. Create a building base\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"Building\", \"size\": [4, 3, 6]\n})\n\n# 2. Find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Building\",\n    properties={\"include\": \"faces\"})\n# Find face with direction=\"top\" -> e.g. index 2\n\n# 3. Extrude upward for a flat roof extension\nmanage_probuilder(action=\"extrude_faces\", target=\"Building\",\n    properties={\"faceIndices\": [2], \"distance\": 0.5})\n```\n\n### Cut a Hole (Delete Faces)\n\n```python\n# 1. Get face info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n# Find the face with direction=\"front\" -> e.g. index 4\n\n# 2. Subdivide to create more faces\nmanage_probuilder(action=\"subdivide\", target=\"Wall\",\n    properties={\"faceIndices\": [4]})\n\n# 3. Get updated face info (indices changed after subdivide!)\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"Wall\",\n    properties={\"include\": \"faces\"})\n\n# 4. Delete the center face(s) for the hole\nmanage_probuilder(action=\"delete_faces\", target=\"Wall\",\n    properties={\"faceIndices\": [6]})\n```\n\n### Bevel Edges\n\n```python\n# Get edge info\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"MyCube\",\n    properties={\"include\": \"edges\"})\n\n# Bevel specific edges\nmanage_probuilder(action=\"bevel_edges\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.1})\n```\n\n### Detach Faces to New Object\n\n```python\n# Detach and keep original (default)\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": False})\n\n# Detach and remove from source\nmanage_probuilder(action=\"detach_faces\", target=\"MyCube\",\n    properties={\"faceIndices\": [0, 1], \"deleteSourceFaces\": True})\n```\n\n### Select Faces by Direction\n\n```python\n# Select all upward-facing faces\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"direction\": \"up\", \"tolerance\": 0.7})\n\n# Grow selection from a seed face\nmanage_probuilder(action=\"select_faces\", target=\"MyMesh\",\n    properties={\"growFrom\": [0], \"growAngle\": 45})\n```\n\n### Double-Sided Geometry\n\n```python\n# Create inside faces for a room (duplicate and flip normals)\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"Room\",\n    properties={\"faceIndices\": [0, 1, 2, 3, 4, 5]})\n```\n\n### Create Polygon from Existing Vertices\n\n```python\n# Connect existing vertices into a new face (auto-finds winding order)\nmanage_probuilder(action=\"create_polygon\", target=\"MyMesh\",\n    properties={\"vertexIndices\": [0, 3, 7, 4]})\n```\n\n## Vertex Operations\n\n```python\n# Move vertices by offset. Only the listed indices move: faces that meet at a corner\n# usually each have their own vertex there, so moving one face's corners opens a gap.\nmanage_probuilder(action=\"move_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"offset\": [0, 1, 0]})\n\n# Weld nearby vertices (proximity-based merge)\nmanage_probuilder(action=\"weld_vertices\", target=\"MyCube\",\n    properties={\"vertexIndices\": [0, 1, 2, 3], \"radius\": 0.1})\n\n# Insert vertex on an edge\nmanage_probuilder(action=\"insert_vertex\", target=\"MyCube\",\n    properties={\"edge\": {\"a\": 0, \"b\": 1}, \"point\": [0.5, 0, 0]})\n\n# Add evenly-spaced points along edges\nmanage_probuilder(action=\"append_vertices_to_edge\", target=\"MyCube\",\n    properties={\"edgeIndices\": [0, 1], \"count\": 3})\n```\n\n## Smoothing Workflow\n\n### Auto-Smooth (Recommended Default)\n\n```python\n# Apply auto-smoothing with default 30 degree threshold\nmanage_probuilder(action=\"auto_smooth\", target=\"MyMesh\",\n    properties={\"angleThreshold\": 30})\n```\n\n- **Low angle (15-25)**: More hard edges, faceted look\n- **Medium angle (30-45)**: Good default, smooth curves + sharp corners\n- **High angle (60-80)**: Very smooth, only sharpest edges remain hard\n\n### Manual Smoothing Groups\n\n```python\n# Set specific faces to smooth group 1\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [0, 1, 2], \"smoothingGroup\": 1})\n\n# Set other faces to hard edges (group 0)\nmanage_probuilder(action=\"set_smoothing\", target=\"MyMesh\",\n    properties={\"faceIndices\": [3, 4, 5], \"smoothingGroup\": 0})\n```\n\n## Mesh Cleanup Pattern\n\nAfter editing, always clean up:\n\n```python\n# 1. Center the pivot (important after extrusions that shift geometry)\nmanage_probuilder(action=\"center_pivot\", target=\"MyMesh\")\n\n# 2. Optionally freeze transform if you moved/rotated the object\nmanage_probuilder(action=\"freeze_transform\", target=\"MyMesh\")\n\n# 3. Validate mesh health\nresult = manage_probuilder(action=\"validate_mesh\", target=\"MyMesh\")\n# Check result.data.healthy -- if false, repair\n\n# 4. Auto-repair if needed\nmanage_probuilder(action=\"repair_mesh\", target=\"MyMesh\")\n```\n\n## Building Complex Objects with ProBuilder\n\nWhen ProBuilder is available, prefer it over primitive GameObjects for complex geometry. ProBuilder lets you create, edit, and combine shapes into detailed objects without external 3D tools.\n\n### Example: Simple House\n\n```python\n# 1. Create base building\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Cube\", \"name\": \"House\", \"width\": 6, \"height\": 3, \"depth\": 8\n})\n\n# 2. Get face info to find the top face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"top\" -> e.g. index 2\n\n# 3. Extrude the top face to create a flat raised section\nmanage_probuilder(action=\"extrude_faces\", target=\"House\",\n    properties={\"faceIndices\": [2], \"distance\": 0.3})\n\n# 4. Add a peaked roof as a separate Prism; its ridge runs along Z, like the house.\n#    (Moving the top face's vertices would pull it away from the walls; see Vertex Operations.)\n#    Shapes are centered on their position: the walls now reach y = 1.8,\n#    so a roof 2 high sits on them at y = 1.8 + 1.\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Prism\", \"name\": \"Roof\",\n    \"width\": 6, \"height\": 2, \"depth\": 8, \"position\": [0, 2.8, 0]\n})\n\n# 5. Cut a doorway: subdivide front face, delete center sub-face\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\n# Find direction=\"front\", subdivide it\nmanage_probuilder(action=\"subdivide\", target=\"House\",\n    properties={\"faceIndices\": [4]})\n\n# Re-query, find bottom-center face, delete it\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"House\",\n    properties={\"include\": \"faces\"})\nmanage_probuilder(action=\"delete_faces\", target=\"House\",\n    properties={\"faceIndices\": [12]})\n\n# 6. Add a door frame with arch\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Door\", \"name\": \"Doorway\",\n    \"position\": [0, 0, 4], \"width\": 1.5, \"height\": 2.5\n})\n\n# 7. Add stairs to the door\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Stair\", \"name\": \"FrontSteps\",\n    \"position\": [0, 0, 5], \"steps\": 3, \"width\": 2\n})\n\n# 8. Smooth organic parts, keep architectural edges sharp\nmanage_probuilder(action=\"auto_smooth\", target=\"House\",\n    properties={\"angleThreshold\": 30})\n\n# 9. Assign materials per face\nmanage_probuilder(action=\"set_face_material\", target=\"House\",\n    properties={\"faceIndices\": [0, 1, 2, 3], \"materialPath\": \"Assets/Materials/Brick.mat\"})\n# A Prism's faces 1 and 3 are its two slopes\nmanage_probuilder(action=\"set_face_material\", target=\"Roof\",\n    properties={\"faceIndices\": [1, 3], \"materialPath\": \"Assets/Materials/Roof.mat\"})\n\n# 10. Cleanup\nmanage_probuilder(action=\"center_pivot\", target=\"House\")\nmanage_probuilder(action=\"validate_mesh\", target=\"House\")\n```\n\n### Example: Pillared Corridor (Batch)\n\n```python\n# Create multiple columns efficiently\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cylinder\", \"name\": f\"Pillar_{i}\",\n                       \"radius\": 0.3, \"height\": 4, \"segments\": 12,\n                       \"position\": [i * 3, 0, 0]}\n    }} for i in range(6)\n] + [\n    # Floor\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Floor\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 0, 0]}\n    }},\n    # Ceiling\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Plane\", \"name\": \"Ceiling\",\n                       \"width\": 18, \"height\": 6, \"position\": [7.5, 4, 0]}\n    }},\n])\n\n# Bevel all pillar tops for decoration\nfor i in range(6):\n    info = manage_probuilder(action=\"get_mesh_info\", target=f\"Pillar_{i}\",\n        properties={\"include\": \"edges\"})\n    # Find top ring edges, bevel them\n    manage_probuilder(action=\"bevel_edges\", target=f\"Pillar_{i}\",\n        properties={\"edgeIndices\": [0, 1, 2, 3], \"amount\": 0.05})\n\n# Smooth the pillars\nfor i in range(6):\n    manage_probuilder(action=\"auto_smooth\", target=f\"Pillar_{i}\",\n        properties={\"angleThreshold\": 45})\n```\n\n### Example: Custom L-Shaped Room\n\n```python\n# Use polygon shape for non-rectangular footprint\nmanage_probuilder(action=\"create_poly_shape\", properties={\n    \"points\": [\n        [0, 0, 0], [10, 0, 0], [10, 0, 6],\n        [4, 0, 6], [4, 0, 10], [0, 0, 10]\n    ],\n    \"extrudeHeight\": 3.0,\n    \"name\": \"LRoom\"\n})\n\n# Create inside faces for the room interior\ninfo = manage_probuilder(action=\"get_mesh_info\", target=\"LRoom\",\n    properties={\"include\": \"faces\"})\n# Duplicate and flip all faces to make interior visible\nall_faces = list(range(info[\"data\"][\"faceCount\"]))\nmanage_probuilder(action=\"duplicate_and_flip\", target=\"LRoom\",\n    properties={\"faceIndices\": all_faces})\n\n# Cut a window: subdivide a wall face, delete center\n# (follow the get_mesh_info -> subdivide -> get_mesh_info -> delete pattern)\n```\n\n### Example: Torus Knot / Decorative Ring\n\n```python\n# Create a torus\nmanage_probuilder(action=\"create_shape\", properties={\n    \"shape_type\": \"Torus\", \"name\": \"Ring\",\n    \"innerRadius\": 0.3, \"outerRadius\": 2.0,\n    \"rows\": 24, \"columns\": 32\n})\n\n# Smooth it for organic look\nmanage_probuilder(action=\"auto_smooth\", target=\"Ring\",\n    properties={\"angleThreshold\": 60})\n\n# Assign metallic material\nmanage_probuilder(action=\"set_face_material\", target=\"Ring\",\n    properties={\"faceIndices\": [], \"materialPath\": \"Assets/Materials/Gold.mat\"})\n# Note: empty faceIndices = all faces\n```\n\n## Batch Patterns\n\nUse `batch_execute` for multi-step workflows to reduce round-trips:\n\n```python\nbatch_execute(commands=[\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column1\", \"position\": [0, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column2\", \"position\": [5, 0, 0]}\n    }},\n    {\"tool\": \"manage_probuilder\", \"params\": {\n        \"action\": \"create_shape\",\n        \"properties\": {\"shape_type\": \"Cube\", \"name\": \"Column3\", \"position\": [10, 0, 0]}\n    }},\n])\n```\n\n## Known Limitations\n\n### Not Yet Working\n\nThese actions exist in the API but have known bugs that prevent them from working correctly:\n\n| Action | Issue | Workaround |\n|--------|-------|------------|\n| `set_pivot` | Vertex positions don't persist through `ToMesh()`/`RefreshMesh()`. The `positions` property setter is overwritten when ProBuilder rebuilds the mesh. Needs `SetVertices(IList<Vertex>)` or direct `m_Positions` field access. | Use `center_pivot` instead, or position objects via Transform. |\n| `convert_to_probuilder` | `MeshImporter` constructor throws internally. May need ProBuilder's editor-only `ProBuilderize` API instead of runtime `MeshImporter`. | Create shapes natively with `create_shape` or `create_poly_shape` instead of converting existing meshes. |\n\n### General Limitations\n\n- Face indices are **not stable** across edits -- always re-query `get_mesh_info` after any modification\n- Edge data is capped at **200 edges** in `get_mesh_info` results\n- Face data is capped at **100 faces** in `get_mesh_info` results\n- `subdivide` uses `ConnectElements.Connect` internally (ProBuilder has no public `Subdivide` API), which connects face midpoints rather than traditional quad subdivision\n\n## Key Rules\n\n1. **Always get_mesh_info before editing** -- face indices are not stable across edits\n2. **Re-query after modifications** -- subdivide, extrude, delete all change face indices\n3. **Use direction labels** -- don't guess face indices, use the direction field\n4. **Cleanup after editing** -- center_pivot + validate is good practice\n5. **Auto-smooth for organic shapes** -- 30 degrees is a good default\n6. **Prefer ProBuilder over primitives** -- when the package is available and you need editable geometry\n7. **Use batch_execute** -- for creating multiple shapes or repetitive operations\n8. **Screenshot to verify** -- use `manage_camera(action=\"screenshot\", include_image=True)` to check visual results after complex edits\n\n<!-- File: unity-mcp-skill/references/resources-reference.md (Tokens: ~3864 | Category: anthropic-skill) -->\n# Unity-MCP Resources Reference\n\nResources provide read-only access to Unity state. Use resources to inspect before using tools to modify.\n\n## Table of Contents\n\n- [Editor State Resources](#editor-state-resources)\n- [Camera Resources](#camera-resources)\n- [Graphics Resources](#graphics-resources)\n- [Scene & GameObject Resources](#scene--gameobject-resources)\n- [Prefab Resources](#prefab-resources)\n- [Project Resources](#project-resources)\n- [Instance Resources](#instance-resources)\n- [Test Resources](#test-resources)\n\n---\n\n## URI Scheme\n\nAll resources use `mcpforunity://` scheme:\n\n```\nmcpforunity://{category}/{resource_path}[?query_params]\n```\n\n**Categories:** `editor`, `scene`, `prefab`, `project`, `pipeline`, `rendering`, `menu-items`, `custom-tools`, `tests`, `instances`\n\n---\n\n## Editor State Resources\n\n### mcpforunity://editor/state\n\n**Purpose:** Editor readiness snapshot - check before tool operations.\n\n**Returns:**\n```json\n{\n  \"unity_version\": \"2022.3.10f1\",\n  \"is_compiling\": false,\n  \"is_domain_reload_pending\": false,\n  \"play_mode\": {\n    \"is_playing\": false,\n    \"is_paused\": false\n  },\n  \"active_scene\": {\n    \"path\": \"Assets/Scenes/Main.unity\",\n    \"name\": \"Main\"\n  },\n  \"ready_for_tools\": true,\n  \"blocking_reasons\": [],\n  \"recommended_retry_after_ms\": null,\n  \"staleness\": {\n    \"age_ms\": 150,\n    \"is_stale\": false\n  }\n}\n```\n\n**Key Fields:**\n- `ready_for_tools`: Only proceed if `true`\n- `is_compiling`: Wait if `true`\n- `blocking_reasons`: Array explaining why tools might fail\n- `recommended_retry_after_ms`: Suggested wait time\n\n### mcpforunity://editor/selection\n\n**Purpose:** Currently selected objects.\n\n**Returns:**\n```json\n{\n  \"activeObject\": \"Player\",\n  \"activeGameObject\": \"Player\",\n  \"activeInstanceID\": 12345,\n  \"count\": 3,\n  \"gameObjects\": [\"Player\", \"Enemy\", \"Wall\"],\n  \"assetGUIDs\": []\n}\n```\n\n### mcpforunity://editor/active-tool\n\n**Purpose:** Current editor tool state.\n\n**Returns:**\n```json\n{\n  \"activeTool\": \"Move\",\n  \"isCustom\": false,\n  \"pivotMode\": \"Center\",\n  \"pivotRotation\": \"Global\"\n}\n```\n\n### mcpforunity://editor/windows\n\n**Purpose:** All open editor windows.\n\n**Returns:**\n```json\n{\n  \"windows\": [\n    {\n      \"title\": \"Scene\",\n      \"typeName\": \"UnityEditor.SceneView\",\n      \"isFocused\": true,\n      \"position\": {\"x\": 0, \"y\": 0, \"width\": 800, \"height\": 600}\n    }\n  ]\n}\n```\n\n### mcpforunity://editor/prefab-stage\n\n**Purpose:** Current prefab editing context.\n\n**Returns:**\n```json\n{\n  \"isOpen\": true,\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"prefabRootName\": \"Player\",\n  \"isDirty\": false\n}\n```\n\n---\n\n## Camera Resources\n\n### mcpforunity://scene/cameras\n\n**Purpose:** List all cameras in the scene (Unity Camera + CinemachineCamera) with full status. Read this before using `manage_camera` to understand the current camera setup.\n\n**Returns:**\n```json\n{\n  \"brain\": {\n    \"exists\": true,\n    \"gameObject\": \"Main Camera\",\n    \"instanceID\": 55504,\n    \"activeCameraName\": \"Cam_Cinematic\",\n    \"activeCameraID\": -39420,\n    \"isBlending\": false\n  },\n  \"cinemachineCameras\": [\n    {\n      \"instanceID\": -39420,\n      \"name\": \"Cam_Cinematic\",\n      \"isLive\": true,\n      \"priority\": 50,\n      \"follow\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"lookAt\": {\"name\": \"CameraTarget\", \"instanceID\": -26766},\n      \"body\": \"CinemachineThirdPersonFollow\",\n      \"aim\": \"CinemachineRotationComposer\",\n      \"noise\": \"CinemachineBasicMultiChannelPerlin\",\n      \"extensions\": []\n    }\n  ],\n  \"unityCameras\": [\n    {\n      \"instanceID\": 55504,\n      \"name\": \"Main Camera\",\n      \"depth\": 0.0,\n      \"fieldOfView\": 50.0,\n      \"hasBrain\": true\n    }\n  ],\n  \"cinemachineInstalled\": true\n}\n```\n\n**Key Fields:**\n- `brain`: CinemachineBrain status — which camera is active, blend state\n- `cinemachineCameras`: All CinemachineCamera components with pipeline info (body, aim, noise, extensions)\n- `unityCameras`: All Unity Camera components with depth and FOV\n- `cinemachineInstalled`: Whether Cinemachine package is available\n\n**Use with:** `manage_camera` tool for creating/configuring cameras\n\n---\n\n## Graphics Resources\n\n### mcpforunity://scene/volumes\n\n**Purpose:** List all Volume components in the scene with effects and parameters. Read this before using `manage_graphics` volume actions.\n\n**Returns:**\n```json\n{\n  \"pipeline\": \"Universal (URP)\",\n  \"volumes\": [\n    {\n      \"name\": \"PostProcessVolume\",\n      \"instance_id\": -24600,\n      \"is_global\": true,\n      \"weight\": 1.0,\n      \"priority\": 0,\n      \"blend_distance\": 0,\n      \"profile\": \"MyProfile\",\n      \"profile_path\": \"Assets/Settings/MyProfile.asset\",\n      \"effects\": [\n        {\n          \"type\": \"Bloom\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"threshold\", \"scatter\"]\n        },\n        {\n          \"type\": \"Vignette\",\n          \"active\": true,\n          \"overridden_params\": [\"intensity\", \"smoothness\"]\n        }\n      ]\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `is_global`: Whether the volume applies everywhere or only within its collider bounds\n- `effects[].overridden_params`: Which parameters are actively overridden (not using defaults)\n- `profile_path`: Empty string for embedded profiles, asset path for shared profiles\n\n**Use with:** `manage_graphics` volume actions (volume_create, volume_add_effect, volume_set_effect, etc.)\n\n### mcpforunity://rendering/stats\n\n**Purpose:** Current rendering performance counters (draw calls, batches, triangles, memory).\n\n**Returns:**\n```json\n{\n  \"draw_calls\": 42,\n  \"batches\": 35,\n  \"set_pass_calls\": 12,\n  \"triangles\": 15234,\n  \"vertices\": 8456,\n  \"dynamic_batches\": 5,\n  \"static_batches\": 20,\n  \"shadow_casters\": 3,\n  \"render_textures\": 8,\n  \"render_textures_bytes\": 16777216,\n  \"visible_skinned_meshes\": 2\n}\n```\n\n**Use with:** `manage_graphics` stats actions (stats_get, stats_list_counters, stats_get_memory)\n\n### mcpforunity://pipeline/renderer-features\n\n**Purpose:** URP renderer features on the active renderer (SSAO, Decals, etc.).\n\n**Returns:**\n```json\n{\n  \"rendererDataName\": \"PC_Renderer\",\n  \"features\": [\n    {\n      \"index\": 0,\n      \"name\": \"ScreenSpaceAmbientOcclusion\",\n      \"type\": \"ScreenSpaceAmbientOcclusion\",\n      \"isActive\": true,\n      \"properties\": { \"m_Settings\": \"Generic\" }\n    }\n  ]\n}\n```\n\n**Key Fields:**\n- `index`: Position in the feature list (use for feature_toggle, feature_remove, feature_configure)\n- `isActive`: Whether the feature is enabled\n- `rendererDataName`: Which URP renderer data asset is active\n\n**Use with:** `manage_graphics` feature actions (feature_list, feature_add, feature_remove, feature_toggle, etc.)\n\n---\n\n## Scene & GameObject Resources\n\n### mcpforunity://scene/gameobject-api\n\n**Purpose:** Documentation for GameObject resources (read this first).\n\n### mcpforunity://scene/gameobject/{instance_id}\n\n**Purpose:** Basic GameObject data (metadata, no component properties).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID from `find_gameobjects`\n\n**Returns:**\n```json\n{\n  \"instanceID\": 12345,\n  \"name\": \"Player\",\n  \"tag\": \"Player\",\n  \"layer\": 8,\n  \"layerName\": \"Player\",\n  \"active\": true,\n  \"activeInHierarchy\": true,\n  \"isStatic\": false,\n  \"transform\": {\n    \"position\": [0, 1, 0],\n    \"rotation\": [0, 0, 0],\n    \"scale\": [1, 1, 1]\n  },\n  \"parent\": {\"instanceID\": 0},\n  \"children\": [{\"instanceID\": 67890}],\n  \"componentTypes\": [\"Transform\", \"Rigidbody\", \"PlayerController\"],\n  \"path\": \"/Player\"\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/components\n\n**Purpose:** All components with full property serialization (paginated).\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `page_size` (int): Default 25, max 100\n- `cursor` (int): Pagination cursor\n- `include_properties` (bool): Default true, set false for just types\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"components\": [\n    {\n      \"type\": \"Transform\",\n      \"properties\": {\n        \"position\": {\"x\": 0, \"y\": 1, \"z\": 0},\n        \"rotation\": {\"x\": 0, \"y\": 0, \"z\": 0, \"w\": 1}\n      }\n    },\n    {\n      \"type\": \"Rigidbody\",\n      \"properties\": {\n        \"mass\": 1.0,\n        \"useGravity\": true\n      }\n    }\n  ],\n  \"cursor\": 0,\n  \"pageSize\": 25,\n  \"nextCursor\": null,\n  \"hasMore\": false\n}\n```\n\n### mcpforunity://scene/gameobject/{instance_id}/component/{component_name}\n\n**Purpose:** Single component with full properties.\n\n**Parameters:**\n- `instance_id` (int): GameObject instance ID\n- `component_name` (string): e.g., \"Rigidbody\", \"Camera\", \"Transform\"\n\n**Returns:**\n```json\n{\n  \"gameObjectID\": 12345,\n  \"gameObjectName\": \"Player\",\n  \"component\": {\n    \"type\": \"Rigidbody\",\n    \"properties\": {\n      \"mass\": 1.0,\n      \"drag\": 0,\n      \"angularDrag\": 0.05,\n      \"useGravity\": true,\n      \"isKinematic\": false\n    }\n  }\n}\n```\n\n---\n\n## Prefab Resources\n\n### mcpforunity://prefab-api\n\n**Purpose:** Documentation for prefab resources.\n\n### mcpforunity://prefab/{encoded_path}\n\n**Purpose:** Prefab asset information.\n\n**Parameters:**\n- `encoded_path` (string): URL-encoded path, e.g., `Assets%2FPrefabs%2FPlayer.prefab`\n\n**Path Encoding:**\n```\nAssets/Prefabs/Player.prefab → Assets%2FPrefabs%2FPlayer.prefab\n```\n\n**Returns:**\n```json\n{\n  \"assetPath\": \"Assets/Prefabs/Player.prefab\",\n  \"guid\": \"abc123...\",\n  \"prefabType\": \"Regular\",\n  \"rootObjectName\": \"Player\",\n  \"rootComponentTypes\": [\"Transform\", \"PlayerController\"],\n  \"childCount\": 5,\n  \"isVariant\": false,\n  \"parentPrefab\": null\n}\n```\n\n### mcpforunity://prefab/{encoded_path}/hierarchy\n\n**Purpose:** Full prefab hierarchy with nested prefab info.\n\n**Returns:**\n```json\n{\n  \"prefabPath\": \"Assets/Prefabs/Player.prefab\",\n  \"total\": 6,\n  \"items\": [\n    {\n      \"name\": \"Player\",\n      \"instanceId\": 12345,\n      \"path\": \"/Player\",\n      \"activeSelf\": true,\n      \"childCount\": 2,\n      \"componentTypes\": [\"Transform\", \"PlayerController\"]\n    },\n    {\n      \"name\": \"Model\",\n      \"path\": \"/Player/Model\",\n      \"isNestedPrefab\": true,\n      \"nestedPrefabPath\": \"Assets/Prefabs/PlayerModel.prefab\"\n    }\n  ]\n}\n```\n\n---\n\n## Project Resources\n\n### mcpforunity://project/info\n\n**Purpose:** Static project configuration.\n\n**Returns:**\n```json\n{\n  \"projectRoot\": \"/Users/dev/MyProject\",\n  \"projectName\": \"MyProject\",\n  \"unityVersion\": \"2022.3.10f1\",\n  \"platform\": \"StandaloneWindows64\",\n  \"assetsPath\": \"/Users/dev/MyProject/Assets\"\n}\n```\n\n### mcpforunity://project/tags\n\n**Purpose:** All tags defined in TagManager.\n\n**Returns:**\n```json\n[\"Untagged\", \"Respawn\", \"Finish\", \"EditorOnly\", \"MainCamera\", \"Player\", \"GameController\", \"Enemy\"]\n```\n\n### mcpforunity://project/layers\n\n**Purpose:** All layers with indices (0-31).\n\n**Returns:**\n```json\n{\n  \"0\": \"Default\",\n  \"1\": \"TransparentFX\",\n  \"2\": \"Ignore Raycast\",\n  \"4\": \"Water\",\n  \"5\": \"UI\",\n  \"8\": \"Player\",\n  \"9\": \"Enemy\"\n}\n```\n\n### mcpforunity://menu-items\n\n**Purpose:** All available Unity menu items.\n\n**Returns:**\n```json\n[\n  \"File/New Scene\",\n  \"File/Open Scene\",\n  \"File/Save\",\n  \"Edit/Undo\",\n  \"Edit/Redo\",\n  \"GameObject/Create Empty\",\n  \"GameObject/3D Object/Cube\",\n  \"Window/General/Console\"\n]\n```\n\n### mcpforunity://custom-tools\n\n**Purpose:** Custom tools available in the active Unity project.\n\n**Returns:**\n```json\n{\n  \"project_id\": \"MyProject\",\n  \"tool_count\": 3,\n  \"tools\": [\n    {\n      \"name\": \"capture_screenshot\",\n      \"description\": \"Capture screenshots in Unity\",\n      \"parameters\": [\n        {\"name\": \"filename\", \"type\": \"string\", \"required\": true},\n        {\"name\": \"width\", \"type\": \"int\", \"required\": false},\n        {\"name\": \"height\", \"type\": \"int\", \"required\": false}\n      ]\n    }\n  ]\n}\n```\n\n---\n\n## Instance Resources\n\n### mcpforunity://instances\n\n**Purpose:** All running Unity Editor instances (for multi-instance workflows).\n\n**Returns:**\n```json\n{\n  \"transport\": \"http\",\n  \"instance_count\": 2,\n  \"instances\": [\n    {\n      \"id\": \"MyProject@abc123\",\n      \"name\": \"MyProject\",\n      \"hash\": \"abc123\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T10:30:00Z\"\n    },\n    {\n      \"id\": \"TestProject@def456\",\n      \"name\": \"TestProject\",\n      \"hash\": \"def456\",\n      \"unity_version\": \"2022.3.10f1\",\n      \"connected_at\": \"2024-01-15T11:00:00Z\"\n    }\n  ],\n  \"warnings\": []\n}\n```\n\n**Use with:** `set_active_instance(instance=\"MyProject@abc123\")`\n\n---\n\n## Test Resources\n\n### mcpforunity://tests\n\n**Purpose:** All tests in the project.\n\n**Returns:**\n```json\n[\n  {\n    \"name\": \"TestSomething\",\n    \"full_name\": \"MyTests.TestSomething\",\n    \"mode\": \"EditMode\"\n  },\n  {\n    \"name\": \"TestOther\",\n    \"full_name\": \"MyTests.TestOther\",\n    \"mode\": \"PlayMode\"\n  }\n]\n```\n\n### mcpforunity://tests/{mode}\n\n**Purpose:** Tests filtered by mode.\n\n**Parameters:**\n- `mode` (string): \"EditMode\" or \"PlayMode\"\n\n**Example:** `mcpforunity://tests/EditMode`\n\n---\n\n## Best Practices\n\n### 1. Check Editor State First\n\n```python\n# Before any complex operation:\n# Read mcpforunity://editor/state\n# Check ready_for_tools == true\n```\n\n### 2. Use Find Then Read Pattern\n\n```python\n# 1. find_gameobjects to get IDs\nresult = find_gameobjects(search_term=\"Player\")\n\n# 2. Read resource for full data\n# mcpforunity://scene/gameobject/{id}\n```\n\n### 3. Paginate Large Queries\n\n```python\n# Start with include_properties=false for component lists\n# mcpforunity://scene/gameobject/{id}/components?include_properties=false&page_size=25\n\n# Then read specific components as needed\n# mcpforunity://scene/gameobject/{id}/component/Rigidbody\n```\n\n### 4. URL-Encode Prefab Paths\n\n```python\n# Wrong:\n# mcpforunity://prefab/Assets/Prefabs/Player.prefab\n\n# Correct:\n# mcpforunity://prefab/Assets%2FPrefabs%2FPlayer.prefab\n```\n\n### 5. Multi-Instance Awareness\n\n```python\n# Always check mcpforunity://instances when:\n# - First connecting\n# - Commands fail unexpectedly\n# - Working with multiple projects\n```\n\n<!-- File: unity-mcp-skill/references/tools-reference.md (Tokens: ~12589 | Category: anthropic-skill) -->\n# Unity-MCP Tools Reference\n\nEvery built-in MCP tool, with its main actions, parameters, and usage examples. For a tool's full parameter table, open its generated page: `https://coplaydev.github.io/unity-mcp/reference/tools/<group>/<tool>` (tools with no group, such as `manage_tools`, are under `core`).\n\nEach section names the tool's group when it is not `core`. A tool outside `core` can be hidden (over HTTP, only `core` starts enabled); enable its group with `manage_tools(action=\"activate\", group=\"<group>\")`.\n\n> **Template warning:** Examples in this file are skill templates and may be inaccurate for some Unity versions, packages, or project setups. Validate parameters and payload shapes against your active tool schema and runtime behavior.\n\n## Table of Contents\n\n- [Infrastructure Tools](#infrastructure-tools)\n- [Scene Tools](#scene-tools)\n- [GameObject Tools](#gameobject-tools)\n- [Script Tools](#script-tools)\n- [Asset Tools](#asset-tools)\n- [Material & Shader Tools](#material--shader-tools)\n- [UI Tools](#ui-tools)\n- [Editor Control Tools](#editor-control-tools)\n- [Build Tools](#build-tools)\n- [Testing Tools](#testing-tools)\n- [Search Tools](#search-tools)\n- [Custom Tools](#custom-tools)\n- [Camera Tools](#camera-tools)\n- [Graphics Tools](#graphics-tools)\n- [Package Tools](#package-tools)\n- [Physics Tools](#physics-tools)\n- [ProBuilder Tools](#probuilder-tools)\n- [Profiler Tools](#profiler-tools)\n- [Docs Tools](#docs-tools)\n- [Animation Tools](#animation-tools)\n- [VFX Tools](#vfx-tools)\n- [Scripting Extension Tools](#scripting-extension-tools)\n- [Asset Generation Tools](#asset-generation-tools)\n\n---\n\n## Project Info Resource\n\nRead `mcpforunity://project/info` to detect project capabilities before making assumptions about UI, input, or rendering setup.\n\n**Returned fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `projectRoot` | string | Absolute path to project root |\n| `projectName` | string | Project folder name |\n| `unityVersion` | string | e.g. `\"2022.3.20f1\"` |\n| `platform` | string | Active build target e.g. `\"StandaloneWindows64\"` |\n| `assetsPath` | string | Absolute path to Assets folder |\n| `renderPipeline` | string | `\"BuiltIn\"`, `\"Universal\"`, `\"HighDefinition\"`, or `\"Custom\"` |\n| `activeInputHandler` | string | `\"Old\"`, `\"New\"`, or `\"Both\"` |\n| `packages.ugui` | bool | `com.unity.ugui` installed (Canvas, Image, Button, etc.) |\n| `packages.textmeshpro` | bool | `com.unity.textmeshpro` installed (TMP_Text, TMP_InputField) |\n| `packages.inputsystem` | bool | `com.unity.inputsystem` installed (InputAction, PlayerInput) |\n| `packages.uiToolkit` | bool | Always `true` for Unity 2021.3+ (UIDocument, VisualElement, UXML/USS) |\n| `packages.screenCapture` | bool | `com.unity.modules.screencapture` enabled (ScreenCapture API for screenshots) |\n\n**Key decision points:**\n\n- **UI system**: If `packages.uiToolkit` is true (always for Unity 2021+), use `manage_ui` for UI Toolkit workflows (UXML/USS). If `packages.ugui` is true, use Canvas + uGUI components via `batch_execute`. UI Toolkit is preferred for new UI — it uses a frontend-like workflow (UXML for structure, USS for styling).\n- **Text**: If `packages.textmeshpro` is true, use `TextMeshProUGUI` instead of legacy `Text`.\n- **Input**: Use `activeInputHandler` to decide EventSystem module — `StandaloneInputModule` (Old) vs `InputSystemUIInputModule` (New). See [workflows.md — Input System](workflows.md#input-system-old-vs-new).\n- **Shaders**: Use `renderPipeline` to pick correct shader names — `Standard` (BuiltIn) vs `Universal Render Pipeline/Lit` (URP) vs `HDRP/Lit` (HDRP).\n\n---\n\n## Infrastructure Tools\n\n### batch_execute\n\nExecute multiple MCP commands in a single batch (10-100x faster).\n\n```python\nbatch_execute(\n    commands=[                    # list[dict], required, max 25\n        {\"tool\": \"tool_name\", \"params\": {...}},\n        ...\n    ],\n    parallel=False,              # bool, optional - advisory only (Unity may still run sequentially)\n    fail_fast=False,             # bool, optional - stop on first failure\n    max_parallelism=None         # int, optional - max parallel workers\n)\n```\n\n`batch_execute` is not transactional: earlier commands are not rolled back if a later command fails.\n\n### set_active_instance\n\nRoute commands to a specific Unity instance (multi-instance workflows).\n\n```python\nset_active_instance(\n    instance=\"ProjectName@abc123\"  # str, required - Name@hash or hash prefix\n)\n```\n\n### refresh_unity\n\nRefresh asset database and trigger script compilation.\n\n```python\nrefresh_unity(\n    mode=\"if_dirty\",             # \"if_dirty\" | \"force\"\n    scope=\"all\",                 # \"assets\" | \"scripts\" | \"all\"\n    compile=\"none\",              # \"none\" | \"request\"\n    wait_for_ready=True          # bool - wait until editor ready\n)\n```\n\n### manage_tools\n\nShow, enable, or hide tool groups for the current session. Always visible (no group).\n\n```python\nmanage_tools(action=\"list_groups\")                  # every group, whether it is on, and its tools\nmanage_tools(action=\"activate\", group=\"animation\")  # \"deactivate\" hides a group again\nmanage_tools(action=\"sync\")                         # re-read the tool toggles in the Unity editor\nmanage_tools(action=\"reset\")                        # back to the defaults\n```\n\nGroups: `core`, `animation`, `asset_gen`, `docs`, `probuilder`, `profiling`, `scripting_ext`, `testing`, `ui`, `vfx`. The `mcpforunity://tool-groups` resource lists the same catalog read-only. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_tools)\n\n### debug_request_context\n\nDiagnostics: returns the request's `client_id`, `session_id` and meta, the session's active Unity instance, and the server version. No parameters; always visible (no group).\n\n```python\ndebug_request_context()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/debug_request_context)\n\n---\n\n## Scene Tools\n\n### manage_scene\n\nScene CRUD operations, hierarchy queries, multi-scene editing, validation, and scene view control. Screenshots are `manage_camera` actions (see [Camera Tools](#camera-tools)); build-settings scenes are `manage_build(action=\"scenes\")`.\n\n```python\n# Get hierarchy (paginated)\nmanage_scene(\n    action=\"get_hierarchy\",\n    page_size=50,                # int, default 50, max 500\n    cursor=0,                    # int, pagination cursor\n    parent=None,                 # str|int, optional - filter by parent\n    include_transform=False      # bool - include local transforms\n)\n\n# Frame scene view on target\nmanage_scene(\n    action=\"scene_view_frame\",\n    scene_view_target=\"Player\"   # str|int - GO name, path, or instance ID to frame\n)\n\n# Other actions\nmanage_scene(action=\"get_active\")        # Current scene info\nmanage_scene(action=\"get_build_settings\") # Build settings\nmanage_scene(action=\"create\", name=\"NewScene\", path=\"Assets/Scenes/\")\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Main.unity\")\nmanage_scene(action=\"save\")\n\n# Scene templates: \"empty\" (no objects), \"default\", \"3d_basic\", \"2d_basic\"\nmanage_scene(action=\"create\", name=\"Level1\", path=\"Assets/Scenes/\", template=\"3d_basic\")\n\n# Multi-scene editing\nmanage_scene(action=\"load\", path=\"Assets/Scenes/Level2.unity\", additive=True)  # keep current scene\nmanage_scene(action=\"get_loaded_scenes\")\nmanage_scene(action=\"set_active_scene\", scene_name=\"Level2\")\nmanage_scene(action=\"move_to_scene\", target=\"Player\", scene_name=\"Level2\")     # moves a root GameObject\nmanage_scene(action=\"close_scene\", scene_name=\"Level2\", remove_scene=True)     # remove_scene=False only unloads\n\n# Validation: missing scripts, broken prefabs\nmanage_scene(action=\"validate\")\nmanage_scene(action=\"validate\", auto_repair=True)  # also removes missing scripts (undoable)\n```\n\n### find_gameobjects\n\nSearch for GameObjects (returns instance IDs only).\n\n```python\nfind_gameobjects(\n    search_term=\"Player\",        # str, required\n    search_method=\"by_name\",     # \"by_name\"|\"by_tag\"|\"by_layer\"|\"by_component\"|\"by_path\"|\"by_id\"\n    include_inactive=False,      # bool|str\n    page_size=50,                # int, default 50, max 500\n    cursor=0                     # int, pagination cursor\n)\n# Returns: {\"ids\": [12345, 67890], \"next_cursor\": 50, ...}\n```\n\n---\n\n## GameObject Tools\n\n### manage_gameobject\n\nCreate, modify, delete, duplicate GameObjects.\n\n```python\n# Create\nmanage_gameobject(\n    action=\"create\",\n    name=\"MyCube\",               # str, required\n    primitive_type=\"Cube\",       # \"Cube\"|\"Sphere\"|\"Capsule\"|\"Cylinder\"|\"Plane\"|\"Quad\"\n    position=[0, 1, 0],          # list[float] or JSON string \"[0,1,0]\"\n    rotation=[0, 45, 0],         # euler angles\n    scale=[1, 1, 1],\n    components_to_add=[\"Rigidbody\", \"BoxCollider\"],\n    save_as_prefab=False,\n    prefab_path=\"Assets/Prefabs/MyCube.prefab\"\n)\n\n# Prefab instantiation — place a prefab instance in the scene\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"                # optional parent GameObject\n)\n# Smart lookup — just the prefab name works too:\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Modify\nmanage_gameobject(\n    action=\"modify\",\n    target=\"Player\",             # name, path, or instance ID\n    search_method=\"by_name\",     # how to find target\n    position=[10, 0, 0],\n    rotation=[0, 90, 0],\n    scale=[2, 2, 2],\n    set_active=True,\n    layer=\"Player\",\n    components_to_add=[\"AudioSource\"],\n    components_to_remove=[\"OldComponent\"],\n    component_properties={       # nested dict for property setting\n        \"Rigidbody\": {\n            \"mass\": 10.0,\n            \"useGravity\": True\n        }\n    }\n)\n\n# Delete\nmanage_gameobject(action=\"delete\", target=\"OldObject\")\n\n# Duplicate\nmanage_gameobject(\n    action=\"duplicate\",\n    target=\"Player\",\n    new_name=\"Player2\",\n    offset=[5, 0, 0]             # position offset from original\n)\n\n# Move relative\nmanage_gameobject(\n    action=\"move_relative\",\n    target=\"Player\",\n    reference_object=\"Enemy\",    # optional reference\n    direction=\"left\",            # \"left\"|\"right\"|\"up\"|\"down\"|\"forward\"|\"back\"\n    distance=5.0,\n    world_space=True\n)\n\n# Look at target (rotates GO to face a point or another GO)\nmanage_gameobject(\n    action=\"look_at\",\n    target=\"MainCamera\",         # the GO to rotate\n    look_at_target=\"Player\",     # str (GO name/path) or list[float] world position\n    look_at_up=[0, 1, 0]        # optional up vector, default [0,1,0]\n)\n```\n\n### manage_components\n\nAdd, remove, or set properties on components.\n\n```python\n# Add component\nmanage_components(\n    action=\"add\",\n    target=12345,                # instance ID (preferred) or name\n    component_type=\"Rigidbody\",\n    search_method=\"by_id\"\n)\n\n# Remove component\nmanage_components(\n    action=\"remove\",\n    target=\"Player\",\n    component_type=\"OldScript\"\n)\n\n# Set single property\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Rigidbody\",\n    property=\"mass\",\n    value=5.0\n)\n\n# Set multiple properties\nmanage_components(\n    action=\"set_property\",\n    target=12345,\n    component_type=\"Transform\",\n    properties={\n        \"position\": [1, 2, 3],\n        \"localScale\": [2, 2, 2]\n    }\n)\n\n# Set object reference property (reference another GameObject by name)\nmanage_components(\n    action=\"set_property\",\n    target=\"GameManager\",\n    component_type=\"GameManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Bee_1\"}]\n)\n\n# Object reference formats supported:\n# - {\"name\": \"ObjectName\"}     → Find GameObject in scene by name\n# - {\"instanceID\": 12345}      → Direct instance ID reference\n# - {\"guid\": \"abc123...\"}      → Asset GUID reference\n# - {\"path\": \"Assets/...\"}     → Asset path reference\n# - \"Assets/Prefabs/My.prefab\" → String shorthand for asset paths\n# - \"ObjectName\"               → String shorthand for scene name lookup\n# - 12345                      → Integer shorthand for instanceID\n# - {\"guid\": \"...\", \"spriteName\": \"Hero_0\"} or {\"guid\": \"...\", \"fileID\": 12345}\n#                              → Sprite sub-asset of a sliced sheet (single-sprite textures resolve from guid/path alone)\n```\n\n---\n\n## Script Tools\n\n### create_script\n\nCreate a new C# script.\n\n```python\ncreate_script(\n    path=\"Assets/Scripts/MyScript.cs\",  # str, required\n    contents='''using UnityEngine;\n\npublic class MyScript : MonoBehaviour\n{\n    void Start() { }\n    void Update() { }\n}''',\n    script_type=\"MonoBehaviour\",  # optional hint\n    namespace=\"MyGame\"            # optional namespace\n)\n```\n\n### script_apply_edits\n\nApply structured edits to C# scripts (safer than raw text edits).\n\n```python\nscript_apply_edits(\n    name=\"MyScript\",             # script name (no .cs)\n    path=\"Assets/Scripts\",       # folder path\n    edits=[\n        # Replace entire method\n        {\n            \"op\": \"replace_method\",\n            \"methodName\": \"Update\",\n            \"replacement\": \"void Update() { transform.Rotate(Vector3.up); }\"\n        },\n        # Insert new method\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": \"void OnEnable() { Debug.Log(\\\"Enabled\\\"); }\"\n        },\n        # Delete method\n        {\n            \"op\": \"delete_method\",\n            \"methodName\": \"OldMethod\"\n        },\n        # Anchor-based insert\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"void Start()\",\n            \"position\": \"before\",  # \"before\" | \"after\"\n            \"text\": \"// Called before Start\\n\"\n        },\n        # Regex replace\n        {\n            \"op\": \"regex_replace\",\n            \"pattern\": \"Debug\\\\.Log\\\\(\",\n            \"text\": \"Debug.LogWarning(\"\n        },\n        # Prepend/append to file\n        {\"op\": \"prepend\", \"text\": \"// File header\\n\"},\n        {\"op\": \"append\", \"text\": \"\\n// File footer\"}\n    ]\n)\n```\n\n### apply_text_edits\n\nApply precise character-position edits (1-indexed lines/columns).\n\n```python\napply_text_edits(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    edits=[\n        {\n            \"startLine\": 10,\n            \"startCol\": 5,\n            \"endLine\": 10,\n            \"endCol\": 20,\n            \"newText\": \"replacement text\"\n        }\n    ],\n    precondition_sha256=\"abc123...\",  # optional, prevents stale edits\n    strict=True                        # optional, stricter validation\n)\n```\n\n### validate_script\n\nCheck script for syntax/semantic errors.\n\n```python\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    level=\"standard\",            # \"basic\" | \"standard\"\n    include_diagnostics=True     # include full error details\n)\n```\n\n### get_sha\n\nGet file hash without content (for preconditions).\n\n```python\nget_sha(uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\")\n# Returns: {\"sha256\": \"...\", \"lengthBytes\": 1234}\n```\n\n### delete_script\n\nDelete a script file.\n\n```python\ndelete_script(uri=\"mcpforunity://path/Assets/Scripts/OldScript.cs\")\n```\n\n### manage_script\n\nLegacy whole-file router with three actions: `create`, `read`, `delete`. `name` is the class name without `.cs`; `path` is its folder under `Assets/`. There is no update action: edit with `script_apply_edits` or `apply_text_edits`.\n\n```python\nmanage_script(action=\"read\", name=\"PlayerController\", path=\"Assets/Scripts\")  # returns the file contents\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script)\n\n### manage_script_capabilities\n\nLists the edit ops `script_apply_edits` supports (structured and text), the max edit payload size, and the active guards. No parameters; always visible (no group).\n\n```python\nmanage_script_capabilities()\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_script_capabilities)\n\n---\n\n## Asset Tools\n\n### manage_asset\n\nAsset operations: search, import, create, modify, delete.\n\n```python\n# Search assets (paginated)\nmanage_asset(\n    action=\"search\",\n    path=\"Assets\",               # search scope\n    search_pattern=\"*.prefab\",   # glob or \"t:MonoScript\" filter\n    filter_type=\"Prefab\",        # optional type filter\n    page_size=25,                # keep small to avoid large payloads\n    page_number=1,               # 1-based\n    generate_preview=False       # avoid base64 bloat\n)\n\n# Get asset info\nmanage_asset(action=\"get_info\", path=\"Assets/Prefabs/Player.prefab\")\n\n# Create asset\nmanage_asset(\n    action=\"create\",\n    path=\"Assets/Materials/NewMaterial.mat\",\n    asset_type=\"Material\",\n    properties={\"color\": [1, 0, 0, 1]}\n)\n\n# Duplicate/move/rename\nmanage_asset(action=\"duplicate\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\nmanage_asset(action=\"move\", path=\"Assets/A.prefab\", destination=\"Assets/Prefabs/A.prefab\")\nmanage_asset(action=\"rename\", path=\"Assets/A.prefab\", destination=\"Assets/B.prefab\")\n\n# Create folder\nmanage_asset(action=\"create_folder\", path=\"Assets/NewFolder\")\n\n# Delete\nmanage_asset(action=\"delete\", path=\"Assets/OldAsset.asset\")\n```\n\n### manage_prefabs\n\nPrefab assets: headless edits with `modify_contents`, or interactive editing in a prefab stage.\n\n```python\n# Get prefab info\nmanage_prefabs(action=\"get_info\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Get prefab hierarchy\nmanage_prefabs(action=\"get_hierarchy\", prefab_path=\"Assets/Prefabs/Player.prefab\")\n\n# Create prefab from scene GameObject\nmanage_prefabs(\n    action=\"create_from_gameobject\",\n    target=\"Player\",             # GameObject in scene\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    allow_overwrite=False\n)\n\n# Modify prefab contents (headless)\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",        # object within prefab\n    position=[0, 1, 0],\n    components_to_add=[\"AudioSource\"]\n)\n\n# Delete child GameObjects from prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    delete_child=[\"OldChild\", \"Turret/Barrel\"]  # single string or list\n)\n\n# Create child GameObject in prefab\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    create_child={\"name\": \"SpawnPoint\", \"primitive_type\": \"Sphere\", \"position\": [0, 2, 0]}\n)\n# A list creates several children in one save; \"source_prefab_path\" instead of\n# \"primitive_type\" nests a prefab instance: {\"name\": \"Gun\", \"source_prefab_path\": \"Assets/Prefabs/Gun.prefab\"}\n\n# Set component properties on prefab contents\nmanage_prefabs(\n    action=\"modify_contents\",\n    prefab_path=\"Assets/Prefabs/Player.prefab\",\n    target=\"ChildObject\",\n    component_properties={\"Rigidbody\": {\"mass\": 5.0}, \"MyScript\": {\"health\": 100}}\n)\n\n# Interactive: open a prefab stage, edit with manage_gameobject/manage_components, save, close\nmanage_prefabs(action=\"open_prefab_stage\", prefab_path=\"Assets/Prefabs/Enemy.prefab\")\nmanage_prefabs(action=\"save_prefab_stage\")\nmanage_prefabs(action=\"close_prefab_stage\")  # back to the main scene\n```\n\n---\n\n## Material & Shader Tools\n\n### manage_material\n\nCreate and modify materials.\n\n```python\n# Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/Red.mat\",\n    shader=\"Standard\",\n    properties={\"_Color\": [1, 0, 0, 1]}\n)\n\n# Get material info\nmanage_material(action=\"get_material_info\", material_path=\"Assets/Materials/Red.mat\")\n\n# Set shader property\nmanage_material(\n    action=\"set_material_shader_property\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_Metallic\",\n    value=0.8\n)\n\n# Set color\nmanage_material(\n    action=\"set_material_color\",\n    material_path=\"Assets/Materials/Red.mat\",\n    property=\"_BaseColor\",\n    color=[0, 1, 0, 1]           # RGBA\n)\n\n# Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"MyCube\",\n    material_path=\"Assets/Materials/Red.mat\",\n    slot=0                       # material slot index\n)\n\n# Set renderer color directly\nmanage_material(\n    action=\"set_renderer_color\",\n    target=\"MyCube\",\n    color=[1, 0, 0, 1],\n    mode=\"create_unique\"          # Creates a unique .mat asset per object (persistent)\n    # Other modes: \"property_block\" (default, not persistent),\n    #              \"shared\" (mutates shared material — avoid for primitives),\n    #              \"instance\" (runtime only, not persistent)\n)\n```\n\n### manage_texture\n\nCreate procedural textures. Group: `vfx`.\n\n```python\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checker.png\",\n    width=64,\n    height=64,\n    fill_color=[255, 255, 255, 255]  # or [1.0, 1.0, 1.0, 1.0]\n)\n\n# Apply pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checker.png\",\n    pattern=\"checkerboard\",      # \"checkerboard\"|\"stripes\"|\"dots\"|\"grid\"|\"brick\"\n    palette=[[0,0,0,255], [255,255,255,255]],\n    pattern_size=8\n)\n\n# Apply gradient\nmanage_texture(\n    action=\"apply_gradient\",\n    path=\"Assets/Textures/Gradient.png\",\n    gradient_type=\"linear\",      # \"linear\"|\"radial\"\n    gradient_angle=45,\n    palette=[[255,0,0,255], [0,0,255,255]]\n)\n```\n\n### manage_shader\n\nCreate, read, update, or delete `.shader` files. Group: `vfx`. `name` is the file name without `.shader`; `path` is its folder under `Assets/`. To use the shader, pass the name declared in its `Shader \"...\"` line to `manage_material`.\n\n```python\nmanage_shader(action=\"create\", name=\"UnlitTint\", path=\"Assets/Shaders\",\n              contents='Shader \"Custom/UnlitTint\" { ... }')\n```\n\n[Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/vfx/manage_shader)\n\n---\n\n## UI Tools\n\n### manage_ui\n\nManage Unity UI Toolkit elements: UXML documents, USS stylesheets, UIDocument components, and visual tree inspection. Group: `ui`.\n\n```python\n# Create a UXML file\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='<ui:UXML xmlns:ui=\"UnityEngine.UIElements\"><ui:Label text=\"Hello\" /></ui:UXML>'\n)\n\n# Create a USS stylesheet\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 32px; color: white; }\"\n)\n\n# Read a UXML/USS file\nmanage_ui(\n    action=\"read\",\n    path=\"Assets/UI/MainMenu.uxml\"\n)\n# Returns: {\"success\": true, \"data\": {\"contents\": \"...\", \"path\": \"...\"}}\n\n# Update an existing file\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/Styles.uss\",\n    contents=\".title { font-size: 48px; color: yellow; -unity-font-style: bold; }\"\n)\n\n# Attach UIDocument to a GameObject\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UICanvas\",                    # GameObject name or path\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/Panel.asset\",  # optional, auto-creates if omitted\n    sort_order=0                          # optional, default 0\n)\n\n# Create PanelSettings asset\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/Panel.asset\",\n    scale_mode=\"ScaleWithScreenSize\",     # optional: \"ConstantPixelSize\"|\"ConstantPhysicalSize\"|\"ScaleWithScreenSize\"\n    reference_resolution={\"width\": 1920, \"height\": 1080}  # optional, for ScaleWithScreenSize\n)\n\n# Inspect the visual tree of a UIDocument\nmanage_ui(\n    action=\"get_visual_tree\",\n    target=\"UICanvas\",                    # GameObject with UIDocument\n    max_depth=10                          # optional, default 10\n)\n# Returns: hierarchy of VisualElements with type, name, classes, styles, text, children\n```\n\n**UI Toolkit workflow:**\n\n1. Create UXML (structure, like HTML) and USS (styling, like CSS) files\n2. Create a PanelSettings asset (or let `attach_ui_document` auto-create one)\n3. Create an empty GameObject and attach UIDocument with the UXML source\n4. Use `get_visual_tree` to inspect the result\n\n**Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML files, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n---\n\n## Editor Control Tools\n\n### manage_editor\n\nControl Unity Editor state, undo/redo. Prefab stages are `manage_prefabs` actions.\n\n```python\nmanage_editor(action=\"play\")               # Enter play mode\nmanage_editor(action=\"pause\")              # Pause play mode\nmanage_editor(action=\"stop\")               # Exit play mode\n\nmanage_editor(action=\"set_active_tool\", tool_name=\"Move\")  # Move/Rotate/Scale/etc.\n\nmanage_editor(action=\"add_tag\", tag_name=\"Enemy\")\nmanage_editor(action=\"remove_tag\", tag_name=\"OldTag\")\n\nmanage_editor(action=\"add_layer\", layer_name=\"Projectiles\")\nmanage_editor(action=\"remove_layer\", layer_name=\"OldLayer\")\n\nmanage_editor(action=\"undo\")               # Returns the name of the undone step\nmanage_editor(action=\"redo\")\n\n# Package deployment (no confirmation dialog — designed for LLM-driven iteration)\nmanage_editor(action=\"deploy_package\")     # Copy configured MCPForUnity source into installed package\nmanage_editor(action=\"restore_package\")    # Revert to pre-deployment backup\n```\n\n**Deploy workflow:** Set the source path in MCP for Unity Advanced Settings first. `deploy_package` copies the source into the project's package location, creates a backup, and triggers `AssetDatabase.Refresh`. Follow with `refresh_unity(wait_for_ready=True)` to wait for recompilation.\n\n### execute_menu_item\n\nExecute any Unity menu item.\n\n```python\nexecute_menu_item(menu_path=\"File/Save Project\")\nexecute_menu_item(menu_path=\"GameObject/3D Object/Cube\")\nexecute_menu_item(menu_path=\"Window/General/Console\")\n```\n\n### read_console\n\nRead or clear Unity console messages.\n\n```python\n# Get recent messages\nread_console(\n    action=\"get\",\n    types=[\"error\", \"warning\", \"log\"],  # or [\"all\"]\n    count=10,                    # max messages (ignored with paging)\n    filter_text=\"NullReference\", # optional text filter\n    page_size=50,\n    cursor=0,\n    format=\"detailed\",           # \"plain\"|\"detailed\"|\"json\"\n    include_stacktrace=True\n)\n\n# Clear console\nread_console(action=\"clear\")\n```\n\n---\n\n## Build Tools\n\n### manage_build\n\nPlayer builds, platform switching, player settings, build-settings scenes, build profiles, and batch builds. Actions: `build`, `status`, `platform`, `settings`, `scenes`, `profiles`, `batch`, `cancel`. `build` and `batch` return a `job_id`; poll it with `status`, stop it with `cancel`. `platform`, `settings` (with `property`) and `scenes` read when the value is omitted and write when it is given. `profiles` and `profile` need Unity 6+.\n\n```python\nmanage_build(action=\"scenes\", scenes='[\"Assets/Scenes/Menu.unity\", \"Assets/Scenes/Level1.unity\"]')  # replaces the list\nmanage_build(action=\"build\", target=\"windows64\", output_path=\"Builds/Win/Game.exe\", development=\"true\")\nmanage_build(action=\"status\", job_id=\"<job_id>\")\n```\n\nTargets: `windows64`, `osx`, `linux64`, `android`, `ios`, `webgl`, `uwp`, `tvos`, `visionos`. Switching `platform` reimports assets. [Full parameters](https://coplaydev.github.io/unity-mcp/reference/tools/core/manage_build)\n\n---\n\n## Testing Tools\n\nGroup: `testing`.\n\n### run_tests\n\nStart async test execution.\n\n```python\nresult = run_tests(\n    mode=\"EditMode\",             # \"EditMode\"|\"PlayMode\"\n    test_names=[\"MyTests.TestA\", \"MyTests.TestB\"],  # specific tests\n    group_names=[\"Integration*\"],  # regex patterns\n    category_names=[\"Unit\"],     # NUnit categories\n    assembly_names=[\"Tests\"],    # assembly filter\n    include_failed_tests=True,   # include failure details\n    include_details=False        # include all test details\n)\n# Returns: {\"job_id\": \"abc123\", ...}\n```\n\n### get_test_job\n\nPoll test job status.\n\n```python\nresult = get_test_job(\n    job_id=\"abc123\",\n    wait_timeout=60,             # wait up to N seconds\n    include_failed_tests=True,\n    include_details=False\n)\n# Returns: {\"status\": \"complete\"|\"running\"|\"failed\", \"results\": {...}}\n```\n\n---\n\n## Search Tools\n\n### find_in_file\n\nSearch file contents with regex.\n\n```python\nfind_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/MyScript.cs\",\n    pattern=\"public void \\\\w+\",  # regex pattern\n    max_results=200,\n    ignore_case=True\n)\n# Returns: line numbers, content excerpts, match positions\n```\n\n---\n\n## Custom Tools\n\n### execute_custom_tool\n\nExecute project-specific custom tools.\n\n```python\nexecute_custom_tool(\n    tool_name=\"my_custom_tool\",\n    parameters={\"param1\": \"value\", \"param2\": 42}\n)\n```\n\nDiscover available custom tools via `mcpforunity://custom-tools` resource.\n\n---\n\n## Camera Tools\n\n### manage_camera\n\nUnified camera management (Unity Camera + Cinemachine). Works without Cinemachine using basic Camera; unlocks presets, pipelines, and blending when Cinemachine is installed. Use `ping` to check availability.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target camera (name, path, or instance ID) |\n| `search_method` | string | No | `by_id`, `by_name`, `by_path` |\n| `properties` | dict \\| string | No | Action-specific parameters |\n\n**Screenshot parameters** (for `screenshot` and `screenshot_multiview` actions):\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `capture_source` | string | `\"game_view\"` (default) or `\"scene_view\"` (editor viewport) |\n| `view_target` | string\\|int\\|list | Target to focus on (GO name/path/ID or [x,y,z]). game_view: aims camera; scene_view: frames viewport |\n| `camera` | string | Camera to capture from (defaults to Camera.main). game_view only |\n| `include_image` | bool | Return base64 PNG inline (default false) |\n| `max_resolution` | int | Downscale cap in px (default 640) |\n| `batch` | string | `\"surround\"` (6 angles) or `\"orbit\"` (configurable grid). game_view only |\n| `view_position` | list[float] | World position [x,y,z] to place camera. game_view only |\n| `view_rotation` | list[float] | Euler rotation [x,y,z] (overrides view_target). game_view only |\n\n**Actions by category:**\n\n**Setup:**\n- `ping` — Check Cinemachine availability and version\n- `ensure_brain` — Ensure CinemachineBrain exists on main camera. Properties: `camera` (target camera), `defaultBlendStyle`, `defaultBlendDuration`\n- `get_brain_status` — Get Brain state (active camera, blend status)\n\n**Creation:**\n- `create_camera` — Create camera with optional preset. Properties: `name`, `preset` (follow/third_person/freelook/dolly/static/top_down/side_scroller), `follow`, `lookAt`, `priority`, `fieldOfView`. Falls back to basic Camera without Cinemachine.\n\n**Configuration:**\n- `set_target` — Set Follow and/or LookAt targets. Properties: `follow`, `lookAt` (GO name/path/ID)\n- `set_priority` — Set camera priority for Brain selection. Properties: `priority` (int)\n- `set_lens` — Configure lens. Properties: `fieldOfView`, `nearClipPlane`, `farClipPlane`, `orthographicSize`, `dutch`\n- `set_body` — Configure Body component (Cinemachine). Properties: `bodyType` (to swap), plus component-specific properties\n- `set_aim` — Configure Aim component (Cinemachine). Properties: `aimType` (to swap), plus component-specific properties\n- `set_noise` — Configure Noise (Cinemachine). Properties: `amplitudeGain`, `frequencyGain`\n\n**Extensions (Cinemachine):**\n- `add_extension` — Add extension. Properties: `extensionType` (CinemachineConfiner2D, CinemachineDeoccluder, CinemachineImpulseListener, CinemachineFollowZoom, CinemachineRecomposer, etc.)\n- `remove_extension` — Remove extension by type. Properties: `extensionType`\n\n**Control:**\n- `list_cameras` — List all cameras with status\n- `set_blend` — Configure default blend on Brain. Properties: `style` (Cut/EaseInOut/Linear/etc.), `duration`\n- `force_camera` — Override Brain to use specific camera\n- `release_override` — Release camera override\n\n**Capture:**\n- `screenshot` — Capture screenshot. Supports `capture_source=\"game_view\"` (default, camera-based) or `\"scene_view\"` (editor viewport). game_view supports inline base64, batch surround/orbit, positioned capture. scene_view supports `view_target` for framing.\n- `screenshot_multiview` — Shorthand for screenshot with batch='surround' and include_image=true.\n\n**Examples:**\n\n```python\n# Check Cinemachine availability\nmanage_camera(action=\"ping\")\n\n# Create a third-person camera following the player\nmanage_camera(action=\"create_camera\", properties={\n    \"name\": \"FollowCam\", \"preset\": \"third_person\",\n    \"follow\": \"Player\", \"lookAt\": \"Player\", \"priority\": 20\n})\n\n# Ensure Brain exists on main camera\nmanage_camera(action=\"ensure_brain\")\n\n# Configure body component\nmanage_camera(action=\"set_body\", target=\"FollowCam\", properties={\n    \"bodyType\": \"CinemachineThirdPersonFollow\",\n    \"cameraDistance\": 5.0, \"shoulderOffset\": [0.5, 0.5, 0]\n})\n\n# Set aim\nmanage_camera(action=\"set_aim\", target=\"FollowCam\", properties={\n    \"aimType\": \"CinemachineRotationComposer\"\n})\n\n# Add camera shake\nmanage_camera(action=\"set_noise\", target=\"FollowCam\", properties={\n    \"amplitudeGain\": 0.5, \"frequencyGain\": 1.0\n})\n\n# Set priority to make this the active camera\nmanage_camera(action=\"set_priority\", target=\"FollowCam\", properties={\"priority\": 50})\n\n# Force a specific camera\nmanage_camera(action=\"force_camera\", target=\"CinematicCam\")\n\n# Release override (return to priority-based selection)\nmanage_camera(action=\"release_override\")\n\n# Configure blend transitions\nmanage_camera(action=\"set_blend\", properties={\"style\": \"EaseInOut\", \"duration\": 2.0})\n\n# Add deoccluder extension\nmanage_camera(action=\"add_extension\", target=\"FollowCam\", properties={\n    \"extensionType\": \"CinemachineDeoccluder\"\n})\n\n# Screenshot from a specific camera (game_view, default)\nmanage_camera(action=\"screenshot\", camera=\"FollowCam\", include_image=True, max_resolution=512)\n\n# Scene View screenshot (captures editor viewport — gizmos, wireframes, grid)\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", include_image=True)\n\n# Scene View screenshot framed on a specific object\nmanage_camera(action=\"screenshot\", capture_source=\"scene_view\", view_target=\"Canvas\", include_image=True)\n\n# Multi-view screenshot (6-angle contact sheet)\nmanage_camera(action=\"screenshot_multiview\", max_resolution=480)\n\n# Batch surround centered on a target: one contact sheet of 6 labeled angles\nmanage_camera(action=\"screenshot\", batch=\"surround\", view_target=\"Player\", max_resolution=256)\n\n# Batch orbit: grid of orbit_angles x orbit_elevations tiles around a target\nmanage_camera(action=\"screenshot\", batch=\"orbit\", view_target=\"Player\",\n              orbit_angles=8,              # azimuth steps (default 8, max 36)\n              orbit_elevations=[0, 30],    # degrees (default [0, 30, -15])\n              orbit_distance=10,           # optional, auto-fit if omitted\n              orbit_fov=60, max_resolution=256)\n\n# Positioned capture: temp camera at a viewpoint (view_rotation overrides the view_target aim)\nmanage_camera(action=\"screenshot\", view_target=\"Enemy\", view_position=[0, 10, -10], max_resolution=512)\n\n# List all cameras\nmanage_camera(action=\"list_cameras\")\n```\n\n**Tier system:**\n- Tier 1 actions (ping, create_camera, set_target, set_lens, set_priority, list_cameras, screenshot, screenshot_multiview) work without Cinemachine — they fall back to basic Unity Camera.\n- Tier 2 actions (ensure_brain, get_brain_status, set_body, set_aim, set_noise, add/remove_extension, set_blend, force_camera, release_override) require `com.unity.cinemachine`. If called without Cinemachine, they return an error with a fallback suggestion.\n\n**Resource:** Read `mcpforunity://scene/cameras` for current camera state before modifying.\n\n---\n\n## Graphics Tools\n\n### manage_graphics\n\nUnified rendering and graphics management: volumes/post-processing, light baking, rendering stats, pipeline configuration, and URP renderer features. Requires URP or HDRP for volume/feature actions. Use `ping` to check pipeline status and available features.\n\n**Parameters:**\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | Action to perform (see categories below) |\n| `target` | string | Sometimes | Target object name or instance ID |\n| `effect` | string | Sometimes | Effect type name (e.g., `Bloom`, `Vignette`) |\n| `properties` | dict | No | Action-specific properties to set |\n| `parameters` | dict | No | Effect parameter values |\n| `settings` | dict | No | Bake or pipeline settings |\n| `name` | string | No | Name for created objects |\n| `profile_path` | string | No | Asset path for VolumeProfile |\n| `path` | string | No | Asset path (for `volume_create_profile`) |\n| `position` | list[float] | No | Position [x,y,z] |\n\n**Actions by category:**\n\n**Status:**\n- `ping` — Check render pipeline type, available features, and package status\n\n**Volume (require URP/HDRP):**\n- `volume_create` — Create a Volume GameObject with optional effects. Properties: `name`, `is_global` (default true), `weight` (0-1), `priority`, `profile_path` (existing profile), `effects` (list of effect defs)\n- `volume_add_effect` — Add effect override to a Volume. Params: `target` (Volume GO), `effect` (e.g., \"Bloom\")\n- `volume_set_effect` — Set effect parameters. Params: `target`, `effect`, `parameters` (dict of param name to value)\n- `volume_remove_effect` — Remove effect override. Params: `target`, `effect`\n- `volume_get_info` — Get Volume details (profile, effects, parameters). Params: `target`\n- `volume_set_properties` — Set Volume component properties (weight, priority, isGlobal). Params: `target`, `properties`\n- `volume_list_effects` — List all available volume effects for the active pipeline\n- `volume_create_profile` — Create a standalone VolumeProfile asset. Params: `path`, `effects` (optional)\n\n**Bake (Edit mode only):**\n- `bake_start` — Start lightmap bake. Params: `async_bake` (default true)\n- `bake_cancel` — Cancel in-progress bake\n- `bake_status` — Check bake progress\n- `bake_clear` — Clear baked lightmap data\n- `bake_reflection_probe` — Bake a specific reflection probe. Params: `target`\n- `bake_get_settings` — Get current Lightmapping settings\n- `bake_set_settings` — Set Lightmapping settings. Params: `settings` (dict)\n- `bake_create_light_probe_group` — Create a Light Probe Group. Params: `name`, `position`, `grid_size` [x,y,z], `spacing`\n- `bake_create_reflection_probe` — Create a Reflection Probe. Params: `name`, `position`, `size` [x,y,z], `resolution`, `mode`, `hdr`, `box_projection`\n- `bake_set_probe_positions` — Set Light Probe positions manually. Params: `target`, `positions` (array of [x,y,z])\n\n**Stats:**\n- `stats_get` — Get rendering counters (draw calls, batches, triangles, vertices, etc.)\n- `stats_list_counters` — List all available ProfilerRecorder counters\n- `stats_set_scene_debug` — Set Scene View debug/draw mode. Params: `mode`\n- `stats_get_memory` — Get rendering memory usage\n\n**Pipeline:**\n- `pipeline_get_info` — Get active render pipeline info (type, quality level, asset paths)\n- `pipeline_set_quality` — Switch quality level. Params: `level` (name or index)\n- `pipeline_get_settings` — Get pipeline asset settings\n- `pipeline_set_settings` — Set pipeline asset settings. Params: `settings` (dict)\n\n**Features (URP only):**\n- `feature_list` — List renderer features on the active URP renderer\n- `feature_add` — Add a renderer feature. Params: `feature_type`, `name`, `material` (for full-screen effects)\n- `feature_remove` — Remove a renderer feature. Params: `index` or `name`\n- `feature_configure` — Set feature properties. Params: `index` or `name`, `properties` (dict)\n- `feature_toggle` — Enable/disable a feature. Params: `index` or `name`, `active` (bool)\n- `feature_reorder` — Reorder features. Params: `order` (list of indices)\n\n**Examples:**\n\n```python\n# Check pipeline status\nmanage_graphics(action=\"ping\")\n\n# Create a global post-processing volume with Bloom and Vignette\nmanage_graphics(action=\"volume_create\", name=\"PostProcessing\", is_global=True,\n    effects=[\n        {\"type\": \"Bloom\", \"parameters\": {\"intensity\": 1.5, \"threshold\": 0.9}},\n        {\"type\": \"Vignette\", \"parameters\": {\"intensity\": 0.4}}\n    ])\n\n# Add an effect to an existing volume\nmanage_graphics(action=\"volume_add_effect\", target=\"PostProcessing\", effect=\"ColorAdjustments\")\n\n# Configure effect parameters\nmanage_graphics(action=\"volume_set_effect\", target=\"PostProcessing\",\n    effect=\"ColorAdjustments\", parameters={\"postExposure\": 0.5, \"saturation\": 10})\n\n# Get volume info\nmanage_graphics(action=\"volume_get_info\", target=\"PostProcessing\")\n\n# List all available effects for the active pipeline\nmanage_graphics(action=\"volume_list_effects\")\n\n# Create a VolumeProfile asset\nmanage_graphics(action=\"volume_create_profile\", path=\"Assets/Settings/MyProfile.asset\",\n    effects=[{\"type\": \"Bloom\"}, {\"type\": \"Tonemapping\"}])\n\n# Start async lightmap bake\nmanage_graphics(action=\"bake_start\", async_bake=True)\n\n# Check bake progress\nmanage_graphics(action=\"bake_status\")\n\n# Create a Light Probe Group with a 3x2x3 grid\nmanage_graphics(action=\"bake_create_light_probe_group\", name=\"ProbeGrid\",\n    position=[0, 1, 0], grid_size=[3, 2, 3], spacing=2.0)\n\n# Create a Reflection Probe\nmanage_graphics(action=\"bake_create_reflection_probe\", name=\"RoomProbe\",\n    position=[0, 2, 0], size=[10, 5, 10], resolution=256, hdr=True)\n\n# Get rendering stats\nmanage_graphics(action=\"stats_get\")\n\n# Get memory usage\nmanage_graphics(action=\"stats_get_memory\")\n\n# Get pipeline info\nmanage_graphics(action=\"pipeline_get_info\")\n\n# Switch quality level\nmanage_graphics(action=\"pipeline_set_quality\", level=\"High\")\n\n# List URP renderer features\nmanage_graphics(action=\"feature_list\")\n\n# Add a full-screen renderer feature\nmanage_graphics(action=\"feature_add\", feature_type=\"FullScreenPassRendererFeature\",\n    name=\"NightVision\", material=\"Assets/Materials/NightVision.mat\")\n\n# Toggle a feature off\nmanage_graphics(action=\"feature_toggle\", index=0, active=False)\n\n# Reorder features\nmanage_graphics(action=\"feature_reorder\", order=[2, 0, 1])\n```\n\n**Resources:**\n- `mcpforunity://scene/volumes` — Lists all Volume components in the scene with their profiles and effects\n- `mcpforunity://rendering/stats` — Current rendering performance counters\n- `mcpforunity://pipeline/renderer-features` — URP renderer features on the active renderer\n\n---\n\n## Package Tools\n\n### manage_packages\n\nManage Unity packages: query, install, remove, embed, and configure registries. Install/remove trigger domain reload.\n\n**Query Actions (read-only):**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `list_packages` | — | List all installed packages (async, returns job_id) |\n| `search_packages` | `query` | Search Unity registry by keyword (async, returns job_id) |\n| `get_package_info` | `package` | Get details about a specific installed package |\n| `list_registries` | — | List all scoped registries (names, URLs, scopes); immediate result |\n| `ping` | — | Check package manager availability, Unity version, package count |\n| `status` | `job_id` (required for list/search; optional for add/remove/embed) | Poll async job status; omit job_id to poll latest add/remove/embed job |\n\n**Mutating Actions:**\n\n| Action | Parameters | Description |\n|--------|-----------|-------------|\n| `add_package` | `package` | Install a package (name, name@version, git URL, or file: path) |\n| `remove_package` | `package`, `force` (optional) | Remove a package; blocked if dependents exist unless `force=true` |\n| `embed_package` | `package` | Copy package to local Packages/ for editing |\n| `resolve_packages` | — | Force re-resolution of all packages |\n| `add_registry` | `name`, `url`, `scopes` | Add a scoped registry (e.g., OpenUPM) |\n| `remove_registry` | `name` or `url` | Remove a scoped registry |\n\n**Input validation:**\n- Valid package IDs: `com.unity.inputsystem`, `com.unity.cinemachine@3.1.6`\n- Git URLs: allowed with warning (\"ensure this is a trusted source\")\n- `file:` paths: allowed with warning\n- Invalid names (uppercase, missing dots): rejected\n\n**Example — List installed packages:**\n```python\nmanage_packages(action=\"list_packages\")\n# Returns job_id, then poll:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Search for a package:**\n```python\nmanage_packages(action=\"search_packages\", query=\"input system\")\n```\n\n**Example — Install a package:**\n```python\nmanage_packages(action=\"add_package\", package=\"com.unity.inputsystem\")\n# Poll until complete:\nmanage_packages(action=\"status\", job_id=\"<job_id>\")\n```\n\n**Example — Remove with dependency check:**\n```python\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\")\n# Error: \"Cannot remove: 3 package(s) depend on it: ...\"\nmanage_packages(action=\"remove_package\", package=\"com.unity.modules.ui\", force=True)\n# Proceeds anyway\n```\n\n**Example — Add OpenUPM registry:**\n```python\nmanage_packages(\n    action=\"add_registry\",\n    name=\"OpenUPM\",\n    url=\"https://package.openupm.com\",\n    scopes=[\"com.cysharp\", \"com.neuecc\"]\n)\n```\n\n---\n\n## Physics Tools\n\n### `manage_physics`\n\nManage 3D and 2D physics: settings, collision matrix, materials, joints, queries, validation, and simulation. All actions support `dimension=\"3d\"` (default) or `dimension=\"2d\"` where applicable.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `action` | string | Yes | See action groups below |\n| `dimension` | string | No | `\"3d\"` (default) or `\"2d\"` |\n| `settings` | object | For set_settings | Key-value physics settings dict |\n| `layer_a` / `layer_b` | string | For collision matrix | Layer name or index |\n| `collide` | bool | For set_collision_matrix | `true` to enable, `false` to disable |\n| `name` | string | For create_physics_material | Material asset name |\n| `path` | string | No | Asset folder path (create) or asset path (configure) |\n| `dynamic_friction` / `static_friction` / `bounciness` | float | No | Material properties (0–1) |\n| `friction_combine` / `bounce_combine` | string | No | `Average`, `Minimum`, `Multiply`, `Maximum` |\n| `material_path` | string | For assign_physics_material | Path to physics material asset |\n| `target` | string | For joints/queries/validate | GameObject name or instance ID |\n| `joint_type` | string | For joints | 3D: `fixed`, `hinge`, `spring`, `character`, `configurable`; 2D: `distance`, `fixed`, `friction`, `hinge`, `relative`, `slider`, `spring`, `target`, `wheel` |\n| `connected_body` | string | For add_joint | Connected body GameObject |\n| `motor` / `limits` / `spring` / `drive` | object | For configure_joint | Joint sub-config objects |\n| `properties` | object | For configure_joint/material | Direct property dict |\n| `origin` / `direction` | float[] | For raycast | Ray origin and direction `[x,y,z]` or `[x,y]` |\n| `max_distance` | float | No | Max raycast distance |\n| `shape` | string | For overlap | `sphere`, `box`, `capsule` (3D); `circle`, `box`, `capsule` (2D) |\n| `position` | float[] | For overlap | `[x,y,z]` or `[x,y]` |\n| `size` | float or float[] | For overlap | Radius (sphere/circle) or half-extents `[x,y,z]` (box) |\n| `layer_mask` | string | No | Layer name or int mask for queries |\n| `start` / `end` | float[] | For linecast | Start and end points `[x,y,z]` or `[x,y]` |\n| `point1` / `point2` | float[] | For shapecast capsule | Capsule endpoints (3D alternative) |\n| `height` | float | For shapecast capsule | Capsule height |\n| `capsule_direction` | int | For shapecast capsule | 0=X, 1=Y (default), 2=Z |\n| `angle` | float | For 2D shapecasts | Rotation angle in degrees |\n| `force` | float[] | For apply_force | Force vector `[x,y,z]` or `[x,y]` |\n| `force_mode` | string | For apply_force | `Force`, `Impulse`, `Acceleration`, `VelocityChange` (3D); `Force`, `Impulse` (2D) |\n| `force_type` | string | For apply_force | `normal` (default) or `explosion` (3D only) |\n| `torque` | float[] | For apply_force | Torque `[x,y,z]` (3D) or `[z]` (2D) |\n| `explosion_position` | float[] | For apply_force explosion | Explosion center `[x,y,z]` |\n| `explosion_radius` | float | For apply_force explosion | Explosion sphere radius |\n| `explosion_force` | float | For apply_force explosion | Explosion force magnitude |\n| `upwards_modifier` | float | For apply_force explosion | Y-axis offset (default 0) |\n| `steps` | int | For simulate_step | Number of steps (1–100) |\n| `step_size` | float | No | Step size in seconds (default: `Time.fixedDeltaTime`) |\n\n**Action groups:**\n\n- **Settings:** `ping`, `get_settings`, `set_settings`\n- **Collision Matrix:** `get_collision_matrix`, `set_collision_matrix`\n- **Materials:** `create_physics_material`, `configure_physics_material`, `assign_physics_material`\n- **Joints:** `add_joint`, `configure_joint`, `remove_joint`\n- **Queries:** `raycast`, `raycast_all`, `linecast`, `shapecast`, `overlap`\n- **Forces:** `apply_force`\n- **Rigidbody:** `get_rigidbody`, `configure_rigidbody`\n- **Validation:** `validate`\n- **Simulation:** `simulate_step`\n\n```python\n# Check physics status\nmanage_physics(action=\"ping\")\n\n# Get/set gravity\nmanage_physics(action=\"get_settings\", dimension=\"3d\")\nmanage_physics(action=\"set_settings\", dimension=\"3d\", settings={\"gravity\": [0, -20, 0]})\n\n# Collision matrix\nmanage_physics(action=\"get_collision_matrix\")\nmanage_physics(action=\"set_collision_matrix\", layer_a=\"Player\", layer_b=\"Enemy\", collide=False)\n\n# Create a bouncy physics material and assign it\nmanage_physics(action=\"create_physics_material\", name=\"Bouncy\", bounciness=0.9, dynamic_friction=0.2)\nmanage_physics(action=\"assign_physics_material\", target=\"Ball\", material_path=\"Assets/Physics Materials/Bouncy.physicMaterial\")\n\n# Add and configure a hinge joint\nmanage_physics(action=\"add_joint\", target=\"Door\", joint_type=\"hinge\", connected_body=\"DoorFrame\")\nmanage_physics(action=\"configure_joint\", target=\"Door\", joint_type=\"hinge\",\n               motor={\"targetVelocity\": 90, \"force\": 100},\n               limits={\"min\": -90, \"max\": 0, \"bounciness\": 0})\n\n# Raycast and overlap\nmanage_physics(action=\"raycast\", origin=[0, 10, 0], direction=[0, -1, 0], max_distance=50)\nmanage_physics(action=\"overlap\", shape=\"sphere\", position=[0, 0, 0]\n\n<!-- File: unity-mcp-skill/references/workflows.md (Tokens: ~13333 | Category: anthropic-skill) -->\n# Unity-MCP Workflow Patterns\n\nCommon workflows and patterns for effective Unity-MCP usage.\n\n## Table of Contents\n\n- [Setup & Verification](#setup--verification)\n- [Scene Creation Workflows](#scene-creation-workflows)\n- [Script Development Workflows](#script-development-workflows)\n- [Asset Management Workflows](#asset-management-workflows)\n- [Testing Workflows](#testing-workflows)\n- [Debugging Workflows](#debugging-workflows)\n- [UI Creation Workflows](#ui-creation-workflows)\n- [Camera & Cinemachine Workflows](#camera--cinemachine-workflows)\n- [ProBuilder Workflows](#probuilder-workflows)\n- [Graphics & Rendering Workflows](#graphics--rendering-workflows)\n- [Package Management Workflows](#package-management-workflows)\n- [Package Deployment Workflows](#package-deployment-workflows)\n- [API Verification Workflows](#api-verification-workflows)\n- [Batch Operations](#batch-operations)\n\n---\n\n## Setup & Verification\n\n### Initial Connection Verification\n\n```python\n# 1. Check editor state\n# Read mcpforunity://editor/state\n\n# 2. Verify ready_for_tools == true\n# If false, wait for recommended_retry_after_ms\n\n# 3. Check active scene\n# Read mcpforunity://editor/state → active_scene\n\n# 4. List available instances (multi-instance)\n# Read mcpforunity://instances\n```\n\n### Before Any Operation\n\n```python\n# Quick readiness check pattern:\neditor_state = read_resource(\"mcpforunity://editor/state\")\n\nif not editor_state[\"ready_for_tools\"]:\n    # Check blocking_reasons\n    # Wait recommended_retry_after_ms\n    pass\n\nif editor_state[\"is_compiling\"]:\n    # Wait for compilation to complete\n    pass\n```\n\n---\n\n## Scene Generator Build Workflow\n\n### Fresh Scene Before Building\n\n**Always start a generated scene build with `manage_scene(action=\"create\")`** to get a clean empty scene. This avoids conflicts with existing default objects (Camera, Light) that would cause \"already exists\" errors when the execution plan tries to create its own.\n\n```python\n# Step 0: Create fresh empty scene (replaces current scene entirely)\nmanage_scene(action=\"create\", name=\"MyGeneratedScene\", path=\"Assets/Scenes/\")\n\n# Now proceed with the phased execution plan...\n# Phase 1: Environment (camera, lights) — no conflicts\n# Phase 2: Objects (GameObjects)\n# Phase 3: Materials\n# etc.\n```\n\n### Wiring Object References Between Components\n\nAfter creating scripts and attaching components, use `set_property` to wire cross-references between GameObjects. Use the `{\"name\": \"ObjectName\"}` format to reference scene objects by name:\n\n```python\n# Wire a list of target GameObjects into a script's serialized field\nmanage_components(\n    action=\"set_property\",\n    target=\"BeeManager\",\n    component_type=\"BeeManagerScript\",\n    property=\"targetObjects\",\n    value=[{\"name\": \"Flower_1\"}, {\"name\": \"Flower_2\"}, {\"name\": \"Flower_3\"}]\n)\n```\n\n### Physics Requirements for Trigger-Based Interactions\n\nWhen scripts use `OnTriggerEnter` / `OnTriggerStay` / `OnTriggerExit`, at least one of the two colliding objects **must** have a `Rigidbody` component. Common pattern:\n\n```python\n# Moving objects (bees, players) need Rigidbody for triggers to fire\nbatch_execute(commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"Bee_1\", \"component_type\": \"Rigidbody\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"Bee_1\",\n        \"component_type\": \"Rigidbody\",\n        \"properties\": {\"useGravity\": false, \"isKinematic\": true}\n    }}\n])\n```\n\n### Script Overwrites with `manage_script(action=\"update\")`\n\nWhen a generated script needs to be rewritten (e.g., to add auto-wiring logic), use `update` instead of deleting and recreating:\n\n```python\nmanage_script(\n    action=\"update\",\n    path=\"Assets/Scripts/MyScript.cs\",\n    contents=\"using UnityEngine;\\n\\npublic class MyScript : MonoBehaviour { ... }\"\n)\n# manage_script update auto-triggers import + compile — just wait and check console\n# Read mcpforunity://editor/state → wait until is_compiling == false\nread_console(types=[\"error\"], count=10)\n```\n\n---\n\n## Scene Creation Workflows\n\n### Create Complete Scene from Scratch\n\n```python\n# 1. Create new scene\nmanage_scene(action=\"create\", name=\"GameLevel\", path=\"Assets/Scenes/\")\n\n# 2. Batch create environment objects\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Ground\", \"primitive_type\": \"Plane\",\n        \"position\": [0, 0, 0], \"scale\": [10, 1, 10]\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Light\", \"primitive_type\": \"Cube\"\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"Player\", \"primitive_type\": \"Capsule\",\n        \"position\": [0, 1, 0]\n    }}\n])\n\n# 3. Add light component (delete cube mesh, add light)\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshRenderer\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"MeshFilter\")\nmanage_components(action=\"remove\", target=\"Light\", component_type=\"BoxCollider\")\nmanage_components(action=\"add\", target=\"Light\", component_type=\"Light\")\nmanage_components(action=\"set_property\", target=\"Light\", component_type=\"Light\",\n    property=\"type\", value=\"Directional\")\n\n# 4. Set up camera\nmanage_gameobject(action=\"modify\", target=\"Main Camera\", position=[0, 5, -10],\n    rotation=[30, 0, 0])\n\n# 5. Verify with screenshot\nmanage_camera(action=\"screenshot\")\n\n# 6. Save scene\nmanage_scene(action=\"save\")\n```\n\n### Populate Scene with Grid of Objects\n\n```python\n# Create 5x5 grid of cubes using batch\ncommands = []\nfor x in range(5):\n    for z in range(5):\n        commands.append({\n            \"tool\": \"manage_gameobject\",\n            \"params\": {\n                \"action\": \"create\",\n                \"name\": f\"Cube_{x}_{z}\",\n                \"primitive_type\": \"Cube\",\n                \"position\": [x * 2, 0, z * 2]\n            }\n        })\n\n# Execute in batches of 25\nbatch_execute(commands=commands[:25], parallel=True)\n```\n\n### Clone and Arrange Objects\n\n```python\n# Find template object\nresult = find_gameobjects(search_term=\"Template\", search_method=\"by_name\")\ntemplate_id = result[\"ids\"][0]\n\n# Duplicate in a line\nfor i in range(10):\n    manage_gameobject(\n        action=\"duplicate\",\n        target=template_id,\n        new_name=f\"Instance_{i}\",\n        offset=[i * 2, 0, 0]\n    )\n```\n\n---\n\n## Script Development Workflows\n\n### Create New Script and Attach\n\n```python\n# 1. Create script (automatically triggers import + compilation)\ncreate_script(\n    path=\"Assets/Scripts/EnemyAI.cs\",\n    contents='''using UnityEngine;\n\npublic class EnemyAI : MonoBehaviour\n{\n    public float speed = 5f;\n    public Transform target;\n\n    void Update()\n    {\n        if (target != null)\n        {\n            Vector3 direction = (target.position - transform.position).normalized;\n            transform.position += direction * speed * Time.deltaTime;\n        }\n    }\n}'''\n)\n\n# 2. Wait for compilation to finish\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Check for errors\nconsole = read_console(types=[\"error\"], count=10)\nif console[\"messages\"]:\n    # Handle compilation errors\n    print(\"Compilation errors:\", console[\"messages\"])\nelse:\n    # 4. Attach to GameObject\n    manage_gameobject(action=\"modify\", target=\"Enemy\", components_to_add=[\"EnemyAI\"])\n\n    # 5. Set component properties\n    manage_components(\n        action=\"set_property\",\n        target=\"Enemy\",\n        component_type=\"EnemyAI\",\n        properties={\n            \"speed\": 10.0\n        }\n    )\n```\n\n### Edit Existing Script Safely\n\n```python\n# 1. Get current SHA\nsha_info = get_sha(uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\")\n\n# 2. Find the method to edit\nmatches = find_in_file(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    pattern=\"void Update\\\\(\\\\)\"\n)\n\n# 3. Apply structured edit\nscript_apply_edits(\n    name=\"PlayerController\",\n    path=\"Assets/Scripts\",\n    edits=[{\n        \"op\": \"replace_method\",\n        \"methodName\": \"Update\",\n        \"replacement\": '''void Update()\n    {\n        float h = Input.GetAxis(\"Horizontal\");\n        float v = Input.GetAxis(\"Vertical\");\n        transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);\n    }'''\n    }]\n)\n\n# 4. Validate\nvalidate_script(\n    uri=\"mcpforunity://path/Assets/Scripts/PlayerController.cs\",\n    level=\"standard\"\n)\n\n# 5. Wait for compilation (script_apply_edits auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 6. Check console\nread_console(types=[\"error\"], count=10)\n```\n\n### Add Method to Existing Class\n\n```python\nscript_apply_edits(\n    name=\"GameManager\",\n    path=\"Assets/Scripts\",\n    edits=[\n        {\n            \"op\": \"insert_method\",\n            \"afterMethod\": \"Start\",\n            \"code\": '''\n    public void ResetGame()\n    {\n        SceneManager.LoadScene(SceneManager.GetActiveScene().name);\n    }'''\n        },\n        {\n            \"op\": \"anchor_insert\",\n            \"anchor\": \"using UnityEngine;\",\n            \"position\": \"after\",\n            \"text\": \"\\nusing UnityEngine.SceneManagement;\"\n        }\n    ]\n)\n```\n\n---\n\n## Asset Management Workflows\n\n### Create and Apply Material\n\n```python\n# 1. Create material\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    shader=\"Standard\",\n    properties={\n        \"_Color\": [0.2, 0.5, 1.0, 1.0],\n        \"_Metallic\": 0.5,\n        \"_Glossiness\": 0.8\n    }\n)\n\n# 2. Assign to renderer\nmanage_material(\n    action=\"assign_material_to_renderer\",\n    target=\"Player\",\n    material_path=\"Assets/Materials/PlayerMaterial.mat\",\n    slot=0\n)\n\n# 3. Verify visually\nmanage_camera(action=\"screenshot\")\n```\n\n### Create Procedural Texture\n\n```python\n# 1. Create base texture\nmanage_texture(\n    action=\"create\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    width=256,\n    height=256,\n    fill_color=[255, 255, 255, 255]\n)\n\n# 2. Apply checkerboard pattern\nmanage_texture(\n    action=\"apply_pattern\",\n    path=\"Assets/Textures/Checkerboard.png\",\n    pattern=\"checkerboard\",\n    palette=[[0, 0, 0, 255], [255, 255, 255, 255]],\n    pattern_size=32\n)\n\n# 3. Create material with texture\nmanage_material(\n    action=\"create\",\n    material_path=\"Assets/Materials/CheckerMaterial.mat\",\n    shader=\"Standard\"\n)\n\n# 4. Assign texture to material (via manage_material set_material_shader_property)\n```\n\n### Organize Assets into Folders\n\n```python\n# 1. Create folder structure\nbatch_execute(commands=[\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Prefabs\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Materials\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Scripts\"}},\n    {\"tool\": \"manage_asset\", \"params\": {\"action\": \"create_folder\", \"path\": \"Assets/Textures\"}}\n])\n\n# 2. Move existing assets\nmanage_asset(action=\"move\", path=\"Assets/MyMaterial.mat\", destination=\"Assets/Materials/MyMaterial.mat\")\nmanage_asset(action=\"move\", path=\"Assets/MyScript.cs\", destination=\"Assets/Scripts/MyScript.cs\")\n```\n\n### Search and Process Assets\n\n```python\n# Find all prefabs\nresult = manage_asset(\n    action=\"search\",\n    path=\"Assets\",\n    search_pattern=\"*.prefab\",\n    page_size=50,\n    generate_preview=False\n)\n\n# Process each prefab\nfor asset in result[\"assets\"]:\n    prefab_path = asset[\"path\"]\n    # Get prefab info\n    info = manage_prefabs(action=\"get_info\", prefab_path=prefab_path)\n    print(f\"Prefab: {prefab_path}, Children: {info['childCount']}\")\n```\n\n### Instantiate Prefab in Scene\n\nUse `manage_gameobject` (not `manage_prefabs`) to place prefab instances in the scene.\n\n```python\n# Full path\nmanage_gameobject(\n    action=\"create\",\n    name=\"Enemy_1\",\n    prefab_path=\"Assets/Prefabs/Enemy.prefab\",\n    position=[5, 0, 3],\n    parent=\"Enemies\"\n)\n\n# Smart lookup — just the prefab name works too\nmanage_gameobject(action=\"create\", name=\"Enemy_2\", prefab_path=\"Enemy\", position=[10, 0, 3])\n\n# Batch-spawn multiple instances\nbatch_execute(commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": f\"Enemy_{i}\",\n        \"prefab_path\": \"Enemy\", \"position\": [i * 3, 0, 0], \"parent\": \"Enemies\"\n    }}\n    for i in range(5)\n])\n```\n\n> **Note:** `manage_prefabs` is for headless prefab editing (inspect, modify contents, create from GameObject). To *instantiate* a prefab into the scene, always use `manage_gameobject(action=\"create\", prefab_path=\"...\")`.\n\n---\n\n## Testing Workflows\n\n### Run Specific Tests\n\n```python\n# 1. List available tests\n# Read mcpforunity://tests/EditMode\n\n# 2. Run specific tests\nresult = run_tests(\n    mode=\"EditMode\",\n    test_names=[\"MyTests.TestPlayerMovement\", \"MyTests.TestEnemySpawn\"],\n    include_failed_tests=True\n)\njob_id = result[\"job_id\"]\n\n# 3. Wait for results\nfinal_result = get_test_job(\n    job_id=job_id,\n    wait_timeout=60,\n    include_failed_tests=True\n)\n\n# 4. Check results\nif final_result[\"status\"] == \"complete\":\n    for test in final_result.get(\"failed_tests\", []):\n        print(f\"FAILED: {test['name']}: {test['message']}\")\n```\n\n### Run Tests by Category\n\n```python\n# Run all unit tests\nresult = run_tests(\n    mode=\"EditMode\",\n    category_names=[\"Unit\"],\n    include_failed_tests=True\n)\n\n# Poll until complete\nwhile True:\n    status = get_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n    if status[\"status\"] in [\"complete\", \"failed\"]:\n        break\n```\n\n### Test-Driven Development Pattern\n\n```python\n# 1. Write test first\ncreate_script(\n    path=\"Assets/Tests/Editor/PlayerTests.cs\",\n    contents='''using NUnit.Framework;\nusing UnityEngine;\n\npublic class PlayerTests\n{\n    [Test]\n    public void TestPlayerStartsAtOrigin()\n    {\n        var player = new GameObject(\"TestPlayer\");\n        Assert.AreEqual(Vector3.zero, player.transform.position);\n        Object.DestroyImmediate(player);\n    }\n}'''\n)\n\n# 2. Wait for compilation (create_script auto-triggers import + compile)\n# Read mcpforunity://editor/state → wait until is_compiling == false\n\n# 3. Run test (expect pass for this simple test)\nresult = run_tests(mode=\"EditMode\", test_names=[\"PlayerTests.TestPlayerStartsAtOrigin\"])\nget_test_job(job_id=result[\"job_id\"], wait_timeout=30)\n```\n\n---\n\n## Debugging Workflows\n\n### Diagnose Compilation Errors\n\n```python\n# 1. Check console for errors\nerrors = read_console(\n    types=[\"error\"],\n    count=20,\n    include_stacktrace=True,\n    format=\"detailed\"\n)\n\n# 2. For each error, find the file and line\nfor error in errors[\"messages\"]:\n    # Parse error message for file:line info\n    # Use find_in_file to locate the problematic code\n    pass\n\n# 3. After fixing, refresh and check again\nrefresh_unity(mode=\"force\", scope=\"scripts\", compile=\"request\", wait_for_ready=True)\nread_console(types=[\"error\"], count=10)\n```\n\n### Investigate Missing References\n\n```python\n# 1. Find the GameObject\nresult = find_gameobjects(search_term=\"Player\", search_method=\"by_name\")\n\n# 2. Get all components\n# Read mcpforunity://scene/gameobject/{id}/components\n\n# 3. Check for null references in serialized fields\n# Look for fields with null/missing values\n\n# 4. Find the referenced object\nresult = find_gameobjects(search_term=\"Target\", search_method=\"by_name\")\n\n# 5. Set the reference\nmanage_components(\n    action=\"set_property\",\n    target=\"Player\",\n    component_type=\"PlayerController\",\n    property=\"target\",\n    value={\"instanceID\": result[\"ids\"][0]}  # Reference by ID\n)\n```\n\n### Check Scene State\n\n```python\n# 1. Get hierarchy\nhierarchy = manage_scene(action=\"get_hierarchy\", page_size=100, include_transform=True)\n\n# 2. Find objects at unexpected positions\nfor item in hierarchy[\"data\"][\"items\"]:\n    if item.get(\"transform\", {}).get(\"position\", [0,0,0])[1] < -100:\n        print(f\"Object {item['name']} fell through floor!\")\n\n# 3. Visual verification\nmanage_camera(action=\"screenshot\")\n```\n\n---\n\n## UI Creation Workflows\n\nUnity has two UI systems: **UI Toolkit** (modern, recommended) and **uGUI** (Canvas-based, legacy). Use `manage_ui` for UI Toolkit workflows, and `batch_execute` with `manage_gameobject` + `manage_components` for uGUI.\n\n> **Template warning:** This section is a skill template library, not a guaranteed source of truth. Examples may be inaccurate for your Unity version, package setup, or project conventions.\n> **Use safely:**\n> 1. **Always read `mcpforunity://project/info` first** to detect installed packages and input system.\n> 2. Validate component/property names against the current project.\n> 3. Prefer targeting by instance ID or full path over generic names.\n> 4. Treat numeric enum values as placeholders and verify before reuse.\n\n### Step 0: Detect Project UI Capabilities\n\n**Before creating any UI**, read project info to determine which packages and input system are available.\n\n```python\n# Read mcpforunity://project/info — returns:\n# {\n#   \"renderPipeline\": \"BuiltIn\" | \"Universal\" | \"HighDefinition\" | \"Custom\",\n#   \"activeInputHandler\": \"Old\" | \"New\" | \"Both\",\n#   \"packages\": {\n#     \"ugui\": true/false,        — com.unity.ugui (Canvas, Image, Button, etc.)\n#     \"textmeshpro\": true/false,  — com.unity.textmeshpro (TextMeshProUGUI)\n#     \"inputsystem\": true/false,  — com.unity.inputsystem (new Input System)\n#     \"uiToolkit\": true/false,    — UI Toolkit (always true for Unity 2021.3+)\n#     \"screenCapture\": true/false  — ScreenCapture module enabled\n#   }\n# }\n```\n\n**Decision matrix:**\n\n| project_info field | Value | What to use |\n|---|---|---|\n| `packages.uiToolkit` | `true` | **Preferred:** Use `manage_ui` for UI Toolkit (UXML/USS) |\n| `packages.ugui` | `true` | Canvas-based UI (Image, Button, etc.) via `batch_execute` |\n| `packages.textmeshpro` | `true` | `TextMeshProUGUI` for text (uGUI) |\n| `packages.textmeshpro` | `false` | `UnityEngine.UI.Text` (legacy, lower quality) |\n| `activeInputHandler` | `\"Old\"` | `StandaloneInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"New\"` | `InputSystemUIInputModule` for EventSystem (uGUI) |\n| `activeInputHandler` | `\"Both\"` | Either works; prefer `InputSystemUIInputModule` for UI |\n\n### UI Toolkit Workflows (manage_ui)\n\nUI Toolkit uses a web-like approach: **UXML** (like HTML) for structure, **USS** (like CSS) for styling. This is the preferred UI system for new projects.\n\n> **Important:** Always use `<ui:Style>` (with the `ui:` namespace prefix) in UXML, not bare `<Style>`. UI Builder will fail to open files that use `<Style>` without the prefix.\n\n#### Create a Complete UI Screen\n\n```python\n# 1. Create UXML document (structure)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uxml\",\n    contents='''<ui:UXML xmlns:ui=\"UnityEngine.UIElements\" xmlns:uie=\"UnityEditor.UIElements\">\n    <ui:Style src=\"Assets/UI/MainMenu.uss\" />\n    <ui:VisualElement name=\"root\" class=\"root-container\">\n        <ui:Label text=\"My Game\" class=\"title\" />\n        <ui:Button text=\"Play\" name=\"play-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Settings\" name=\"settings-btn\" class=\"menu-button\" />\n        <ui:Button text=\"Quit\" name=\"quit-btn\" class=\"menu-button\" />\n    </ui:VisualElement>\n</ui:UXML>'''\n)\n\n# 2. Create USS stylesheet (styling)\nmanage_ui(\n    action=\"create\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents='''.root-container {\n    flex-grow: 1;\n    justify-content: center;\n    align-items: center;\n    background-color: rgba(0, 0, 0, 0.8);\n}\n.title {\n    font-size: 48px;\n    color: white;\n    -unity-font-style: bold;\n    margin-bottom: 40px;\n}\n.menu-button {\n    width: 300px;\n    height: 60px;\n    font-size: 24px;\n    margin: 8px;\n    background-color: rgb(50, 120, 200);\n    color: white;\n    border-radius: 8px;\n}\n.menu-button:hover {\n    background-color: rgb(70, 140, 220);\n}'''\n)\n\n# 3. Create a GameObject and attach UIDocument\nmanage_gameobject(action=\"create\", name=\"UIRoot\")\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\"\n    # panel_settings auto-created if omitted\n)\n\n# 4. Verify the visual tree\nmanage_ui(action=\"get_visual_tree\", target=\"UIRoot\", max_depth=5)\n```\n\n#### Update Existing UI\n\n```python\n# Read current content\nresult = manage_ui(action=\"read\", path=\"Assets/UI/MainMenu.uss\")\n# Modify and update\nmanage_ui(\n    action=\"update\",\n    path=\"Assets/UI/MainMenu.uss\",\n    contents=\".title { font-size: 64px; color: yellow; }\"\n)\n```\n\n#### Custom PanelSettings\n\n```python\n# Create PanelSettings with ScaleWithScreenSize\nmanage_ui(\n    action=\"create_panel_settings\",\n    path=\"Assets/UI/GamePanelSettings.asset\",\n    scale_mode=\"ScaleWithScreenSize\",\n    reference_resolution={\"width\": 1920, \"height\": 1080}\n)\n\n# Attach UIDocument with custom PanelSettings\nmanage_ui(\n    action=\"attach_ui_document\",\n    target=\"UIRoot\",\n    source_asset=\"Assets/UI/MainMenu.uxml\",\n    panel_settings=\"Assets/UI/GamePanelSettings.asset\"\n)\n```\n\n### uGUI (Canvas-Based) Workflows\n\nThe sections below cover legacy Canvas-based UI using `batch_execute`. Use these when working with existing uGUI projects or when UI Toolkit is not suitable.\n\n### RectTransform Sizing (Critical for All UI Children)\n\nEvery GameObject under a Canvas gets a `RectTransform` instead of `Transform`. **Without setting anchor/size, UI elements default to zero size and won't be visible.** Use `set_property` on `RectTransform`:\n\n```python\n# Stretch to fill parent (common for panels/backgrounds)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyPanel\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 0],        # bottom-left corner\n        \"anchorMax\": [1, 1],        # top-right corner\n        \"sizeDelta\": [0, 0],        # no extra size beyond anchors\n        \"anchoredPosition\": [0, 0]  # centered on anchors\n    }\n}}\n\n# Fixed-size centered element (e.g. 300x50 button)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"MyButton\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0.5, 0.5],\n        \"anchorMax\": [0.5, 0.5],\n        \"sizeDelta\": [300, 50],\n        \"anchoredPosition\": [0, 0]\n    }\n}}\n\n# Top-anchored bar (e.g. health bar at top of screen)\n{\"tool\": \"manage_components\", \"params\": {\n    \"action\": \"set_property\", \"target\": \"TopBar\",\n    \"component_type\": \"RectTransform\",\n    \"properties\": {\n        \"anchorMin\": [0, 1],        # left-top\n        \"anchorMax\": [1, 1],        # right-top (stretch horizontally)\n        \"sizeDelta\": [0, 60],       # 60px tall, full width\n        \"anchoredPosition\": [0, -30] # offset down by half height\n    }\n}}\n```\n\n> **Note:** Vector2 properties accept both `[x, y]` array format and `{\"x\": ..., \"y\": ...}` object format.\n\n### Create Canvas (Foundation for All UI)\n\nEvery UI element must be under a Canvas. A Canvas requires three components: `Canvas`, `CanvasScaler`, and `GraphicRaycaster`.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"Canvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"CanvasScaler\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MainCanvas\", \"component_type\": \"GraphicRaycaster\"\n    }},\n    # renderMode: 0=ScreenSpaceOverlay, 1=ScreenSpaceCamera, 2=WorldSpace\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0\n    }},\n    # CanvasScaler: uiScaleMode 1=ScaleWithScreenSize\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"uiScaleMode\", \"value\": 1\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MainCanvas\",\n        \"component_type\": \"CanvasScaler\", \"property\": \"referenceResolution\",\n        \"value\": [1920, 1080]\n    }}\n])\n```\n\n### Create EventSystem (Required Once Per Scene for UI Interaction)\n\nIf no EventSystem exists in the scene, buttons and other interactive UI elements won't respond to input. Create one alongside your first Canvas. **Check `project_info.activeInputHandler` to pick the correct input module.**\n\n```python\n# For activeInputHandler == \"New\" or \"Both\" (project has Input System package):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.InputSystem.UI.InputSystemUIInputModule\"\n    }}\n])\n\n# For activeInputHandler == \"Old\" (legacy Input Manager only):\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.EventSystem\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"EventSystem\",\n        \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"\n    }}\n])\n```\n\n### Create Panel (Background Container)\n\nA Panel is an Image component used as a background/container for other UI elements.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.1, 0.1, 0.1, 0.8]\n    }},\n    # Size the panel (stretch to 60% of canvas, centered)\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.2, 0.1], \"anchorMax\": [0.8, 0.9],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Text (TextMeshPro)\n\nTextMeshProUGUI automatically adds a RectTransform when added to a child of a Canvas. If `packages.textmeshpro` is `false`, use `UnityEngine.UI.Text` instead.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"TitleText\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\n            \"text\": \"My Game Title\",\n            \"fontSize\": 48,\n            \"alignment\": 514,\n            \"color\": [1, 1, 1, 1]\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"TitleText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0.8], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n> **TextMeshPro alignment values:** 257=TopLeft, 258=TopCenter, 260=TopRight, 513=MiddleLeft, 514=MiddleCenter, 516=MiddleRight, 1025=BottomLeft, 1026=BottomCenter, 1028=BottomRight.\n\n### Create Button (With Label)\n\nA Button needs an `Image` (visual) + `Button` (interaction) on the parent, and a child with `TextMeshProUGUI` for the label.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton\", \"component_type\": \"Button\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"Image\", \"property\": \"color\",\n        \"value\": [0.2, 0.6, 1.0, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [300, 60], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Child text label (stretches to fill button)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"StartButton_Label\", \"parent\": \"StartButton\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Start Game\", \"fontSize\": 24, \"alignment\": 514}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"StartButton_Label\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0, 0], \"anchorMax\": [1, 1],\n            \"sizeDelta\": [0, 0], \"anchoredPosition\": [0, 0]\n        }\n    }}\n])\n```\n\n### Create Slider (With Reference Wiring)\n\nA Slider requires a specific hierarchy and **must have its `fillRect` and `handleRect` references wired** to function.\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HealthSlider\", \"parent\": \"MainCanvas\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Slider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"HealthSlider\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderBG\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.3, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Fill Area + Fill\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"FillArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"FillArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderFill\", \"parent\": \"FillArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderFill\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.8, 0.2, 1.0]\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderFill\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Handle Area + Handle\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"HandleArea\", \"parent\": \"HealthSlider\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HandleArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SliderHandle\", \"parent\": \"HandleArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SliderHandle\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SliderHandle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.5, 0], \"anchorMax\": [0.5, 1], \"sizeDelta\": [20, 0]}\n    }}\n])\n\n# Step 2: Wire Slider references (CRITICAL — slider won't work without this)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"fillRect\",\n        \"value\": {\"name\": \"SliderFill\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"HealthSlider\",\n        \"component_type\": \"Slider\", \"property\": \"handleRect\",\n        \"value\": {\"name\": \"SliderHandle\"}\n    }}\n])\n```\n\n### Create Input Field (With Reference Wiring)\n\n```python\n# Step 1: Create hierarchy\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"NameInput\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [400, 50], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Text Area child (clips text to input bounds)\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputTextArea\", \"parent\": \"NameInput\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputTextArea\", \"component_type\": \"RectMask2D\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputTextArea\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-16, -8]}\n    }},\n    # Placeholder\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputPlaceholder\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputPlaceholder\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Enter name...\", \"fontStyle\": 2, \"color\": [0.5, 0.5, 0.5, 0.5]}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputPlaceholder\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }},\n    # Actual text display\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"InputText\", \"parent\": \"InputTextArea\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"InputText\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"InputText\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}\n    }}\n])\n\n# Step 2: Wire TMP_InputField references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textViewport\",\n        \"value\": {\"name\": \"InputTextArea\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"textComponent\",\n        \"value\": {\"name\": \"InputText\"}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"NameInput\",\n        \"component_type\": \"TMP_InputField\", \"property\": \"placeholder\",\n        \"value\": {\"name\": \"InputPlaceholder\"}\n    }}\n])\n```\n\n### Create Toggle (With Reference Wiring)\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"SoundToggle\", \"parent\": \"MenuPanel\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"SoundToggle\", \"component_type\": \"Toggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\n            \"anchorMin\": [0.5, 0.5], \"anchorMax\": [0.5, 0.5],\n            \"sizeDelta\": [200, 30], \"anchoredPosition\": [0, 0]\n        }\n    }},\n    # Background box\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleBG\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleBG\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleBG\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0.5], \"anchorMax\": [0, 0.5], \"sizeDelta\": [26, 26], \"anchoredPosition\": [13, 0]}\n    }},\n    # Checkmark\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleCheckmark\", \"parent\": \"ToggleBG\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleCheckmark\", \"component_type\": \"Image\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleCheckmark\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0.1, 0.1], \"anchorMax\": [0.9, 0.9], \"sizeDelta\": [0, 0]}\n    }},\n    # Label\n    {\"tool\": \"manage_gameobject\", \"params\": {\n        \"action\": \"create\", \"name\": \"ToggleLabel\", \"parent\": \"SoundToggle\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"ToggleLabel\", \"component_type\": \"TextMeshProUGUI\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"TextMeshProUGUI\",\n        \"properties\": {\"text\": \"Sound Effects\", \"fontSize\": 18, \"alignment\": 513}\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"ToggleLabel\",\n        \"component_type\": \"RectTransform\",\n        \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [-35, 0], \"anchoredPosition\": [17.5, 0]}\n    }}\n])\n\n# Wire Toggle references (CRITICAL)\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"SoundToggle\",\n        \"component_type\": \"Toggle\", \"property\": \"graphic\",\n        \"value\": {\"name\": \"ToggleCheckmark\"}\n    }}\n])\n```\n\n### Add Layout Group (Vertical/Horizontal/Grid)\n\nLayout groups auto-arrange child elements, so you can skip manual RectTransform positioning for children.\n\n```python\nbatch_execute(fail_fast=True, commands=[\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"VerticalLayoutGroup\",\n        \"properties\": {\n            \"spacing\": 10,\n            \"childAlignment\": 4,\n            \"childForceExpandWidth\": True,\n            \"childForceExpandHeight\": False,\n            \"padding\": {\"left\": 20, \"right\": 20, \"top\": 20, \"bottom\": 20}\n        }\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"add\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\"\n    }},\n    {\"tool\": \"manage_components\", \"params\": {\n        \"action\": \"set_property\", \"target\": \"MenuPanel\",\n        \"component_type\": \"ContentSizeFitter\",\n        \"properties\": { \"verticalFit\": 2 }\n    }}\n])\n```\n\n> **childAlignment values:** 0=UpperLeft, 1=UpperCenter, 2=UpperRight, 3=MiddleLeft, 4=MiddleCenter, 5=MiddleRight, 6=LowerLeft, 7=LowerCenter, 8=LowerRight.\n> **ContentSizeFitter fit modes:** 0=Unconstrained, 1=MinSize, 2=PreferredSize.\n\n### Complete Example: Main Menu Screen\n\nCombines multiple templates into a full menu screen in two batch calls (default 25 command limit per batch, configurable in Unity MCP Tools window up to 100). **Assumes `project_info` has been read and `activeInputHandler` is known.**\n\n```python\n# Batch 1: Canvas + EventSystem + Panel + Title\nbatch_execute(fail_fast=True, commands=[\n    # Canvas\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuCanvas\", \"component_type\": \"GraphicRaycaster\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"Canvas\", \"property\": \"renderMode\", \"value\": 0}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuCanvas\", \"component_type\": \"CanvasScaler\", \"properties\": {\"uiScaleMode\": 1, \"referenceResolution\": [1920, 1080]}}},\n    # EventSystem — use StandaloneInputModule OR InputSystemUIInputModule based on project_info\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.EventSystem\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"EventSystem\", \"component_type\": \"UnityEngine.EventSystems.StandaloneInputModule\"}},\n    # Panel (centered, 60% width)\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"MenuPanel\", \"parent\": \"MenuCanvas\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.1, 0.1, 0.15, 0.9]}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0.2, 0.15], \"anchorMax\": [0.8, 0.85], \"sizeDelta\": [0, 0]}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"MenuPanel\", \"component_type\": \"VerticalLayoutGroup\", \"properties\": {\"spacing\": 20, \"childAlignment\": 4, \"childForceExpandWidth\": True, \"childForceExpandHeight\": False}}},\n    # Title\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"Title\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"Title\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"My Game\", \"fontSize\": 64, \"alignment\": 514, \"color\": [1, 1, 1, 1]}}}\n])\n\n# Batch 2: Buttons\nbatch_execute(fail_fast=True, commands=[\n    # Play Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.2, 0.6, 1.0, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"PlayLabel\", \"parent\": \"PlayButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Play\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"PlayLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Settings Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.3, 0.3, 0.35, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"SettingsLabel\", \"parent\": \"SettingsButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Settings\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"SettingsLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}},\n    # Quit Button\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitButton\", \"parent\": \"MenuPanel\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Image\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitButton\", \"component_type\": \"Button\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitButton\", \"component_type\": \"Image\", \"property\": \"color\", \"value\": [0.8, 0.2, 0.2, 1.0]}},\n    {\"tool\": \"manage_gameobject\", \"params\": {\"action\": \"create\", \"name\": \"QuitLabel\", \"parent\": \"QuitButton\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"add\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\"}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"TextMeshProUGUI\", \"properties\": {\"text\": \"Quit\", \"fontSize\": 32, \"alignment\": 514}}},\n    {\"tool\": \"manage_components\", \"params\": {\"action\": \"set_property\", \"target\": \"QuitLabel\", \"component_type\": \"RectTransform\", \"properties\": {\"anchorMin\": [0, 0], \"anchorMax\": [1, 1], \"sizeDelta\": [0, 0]}}}\n])\n```\n\n### UI Component Quick Reference\n\n| UI Element | Required Components | Notes |\n| ---------- | ------------------- | ----- |\n| **Canvas** | Canvas + CanvasScaler + GraphicRaycaster | Root for all UI. One per screen. |\n| **EventSystem** | EventSystem + input module (see below) | One per scene. Required for interaction. |\n| **Panel** | Image + RectTransform sizing | Container. Set color for background. |\n| **Text** | TextMeshProUGUI (or Text if no TMP) + RectTransform | Check `packages.textmeshpro`. |\n| **Button** | Image + Button + child(TextMeshProUGUI) + RectTransform | Image = visual, Button = click handler. |\n| **Slider** | Slider + Image + children + **wire fillRect/handleRect** | Won't function without wiring. |\n| **Toggle** | Toggle + children + **wire graphic** | Wire checkmark Image to `graphic`. |\n| **Input Field** | Image + TMP_InputField + children + **wire textViewport/textComponent/placeholder** | Won't function without wiring. |\n| **Layout Group** | VerticalLayoutGroup / HorizontalLayoutGroup / GridLayoutGroup | Auto-arranges children; skip manual RectTransform on children. |\n\n---\n\n## Input System: Old vs New\n\nUnity has two input systems that affect UI interaction, script input handling, and EventSystem confi\n\n<!-- File: website/docs/reference/tools/animation/_category_.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Animation Skill\n\nPath: `website/docs/reference/tools/animation/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/_category_.json)\n\n<!-- File: website/docs/reference/tools/animation/index.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Animation Skill\n\nPath: `website/docs/reference/tools/animation/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/index.md)\n\n<!-- File: website/docs/reference/tools/animation/manage_animation.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Animation Skill\n\nPath: `website/docs/reference/tools/animation/manage_animation.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/animation/manage_animation.md)\n\n<!-- File: website/docs/reference/tools/asset_gen/_category_.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/_category_.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/_category_.json)\n\n<!-- File: website/docs/reference/tools/asset_gen/generate_audio.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_audio.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_audio.md)\n\n<!-- File: website/docs/reference/tools/asset_gen/generate_image.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_image.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_image.md)\n\n<!-- File: website/docs/reference/tools/asset_gen/generate_model.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/generate_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/generate_model.md)\n\n<!-- File: website/docs/reference/tools/asset_gen/import_model_file.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model_file.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model_file.md)\n\n<!-- File: website/docs/reference/tools/asset_gen/import_model.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/import_model.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/import_model.md)\n\n<!-- File: website/docs/reference/tools/asset_gen/index.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Asset_gen Skill\n\nPath: `website/docs/reference/tools/asset_gen/index.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/CoplayDev/unity-mcp/HEAD/website/docs/reference/tools/asset_gen/index.md)\n\n<!-- ... +61 more modular skills available via /api/skills/CoplayDev/unity-mcp?path={path} -->\n</yakaai_skills>"}