Go to file
dsarno 3e83f993bf
Improved ci prompt testing suite (#270)
* CI: streamline Unity licensing (ULF/EBL); drop cache mounts & EBL-in-container; NL suite: clarify T-E/T-J, anchor positions, EOF brace targeting, SHA preconditions

* CI: support both ULF + EBL; validate ULF before -manualLicenseFile; robust readiness wait; use game-ci @v2 actions

* CI: activate EBL via container using UNITY_IMAGE; fix readiness regex grouping

* CI: minimal patch — guard manualLicenseFile by ulf.ok, expand error patterns, keep return-license @v2 for linter

* CI: harden ULF staging (printf+chmod); pass ULF_OK via env; use manual_args array for -manualLicenseFile

* CI: assert EBL activation writes entitlement to host mount; fail fast if missing

* CI: use heredoc in wait step to avoid nested-quote issues; remove redundant EBL artifact copy; drop job-level if and unused UNITY_VERSION

* CI: harden wait step (container status check, broader ready patterns, longer timeout); make license return non-blocking

* CI: wait step — confirm bridge readiness via status JSON (unity_port) + host socket probe

* CI: YAML-safe readiness fallback (grep/sed unity_port + bash TCP probe); workflow_dispatch trigger + ASCII step names

* CI: refine license error pattern to ignore benign LicensingClient channel startup; only match true activation/return failures

* Improve Unity bridge wait logic in CI workflow

- Increase timeout from 600s to 900s for Unity startup
- Add 'bound' to readiness pattern to catch more bridge signals
- Refine error detection to focus only on license failures
- Remove non-license error patterns that could cause false failures
- Improve error reporting with descriptive messages
- Fix regex escaping for unity port parsing
- Fix case sensitivity in sed commands

* Add comprehensive Unity workflow improvements

- Add project warm-up step to pre-import Library before bridge startup
- Expand license mounts to capture full Unity config and local-share directories
- Update bridge container to use expanded directory mounts instead of narrow license paths
- Provide ULF licenses in both legacy and standard local-share paths
- Improve EBL activation to capture complete Unity authentication context
- Update verification logic to check full config directories for entitlements

These changes eliminate cold import delays during bridge startup and provide
Unity with all necessary authentication data, reducing edge cases and improving
overall workflow reliability.

* Refine Unity workflow licensing and permissions

- Make EBL verification conditional on ULF presence to allow ULF-only runs
- Remove read-only mounts from warm-up container for Unity user directories
- Align secrets gate with actual licensing requirements (remove UNITY_SERIAL only)
- Keep return-license action at v2 (latest available version)

These changes prevent workflow failures when EBL has issues but ULF is valid,
allow Unity to write preferences during warm-up, and ensure secrets detection
matches the actual licensing logic used by the workflow steps.

* fix workflow YAML parse

* Normalize NL/T JUnit names and robust summary

* Fix Python import syntax in workflow debug step

* Improve prompt clarity for XML test fragment format

- Add detailed XML format requirements with exact specifications
- Emphasize NO prologue, epilogue, code fences, or extra characters
- Add specific instructions for T-D and T-J tests to write fragments immediately
- Include exact XML template and TESTID requirements
- Should fix T-D and T-J test failures in CI by ensuring proper fragment format

* Fix problematic regex substitution in test name canonicalization

- Replace unsafe regex substitution that could create malformed names
- New approach: preserve correctly formatted names, extract titles safely
- Prevents edge cases where double processing could corrupt test names
- Uses proper em dash (—) separator consistently
- More robust handling of various input formats

* CI: NL/T hardening — enforce filename-derived IDs, robust backfill, single-testcase guard; tighten prompt emissions; disallow Bash

* fix: keep file ID when canonicalizing test names

* CI: move Unity Pro license return to teardown after stopping Unity; keep placeholder at original site

* CI: remove revert helper & baseline snapshot; stop creating scripts dir; prompt: standardize T-B validation to level=standard

* CI: remove mini workflow and obsolete NL prompts; redact email in all Unity log dumps

* NL/T prompt: enforce allowed ops, require per-test fragment emission (incl. failures), add T-F..T-J XML templates

* NL suite: enforce strict NL-4 emission; remove brittle relabeling; keep canonicalization + backfill

* NL/T: minimize transcript; tighten NL-4 console reads; add final errors scan in T-J

* ci: add local validate-nlt-coverage helper

* CI: add staged report fragment promotion step (reports/_staging -> reports/) to support multi-edit reporting

* CI: add staged report fragment promotion step (reports/_staging -> reports/) to support multi-edit reporting

* CI: minor polish and guardrails; keep staged reports promotion and placeholder detection

* read_console: default count=50; normalize types str->list; tolerate legacy payload shapes

* read_console: harden response parsing for legacy shapes (data as list, tuple entries)

* Docs: refresh CI workflow and prompts (remove mini suite refs; per-test emissions, staging, guard)

* CI: move T coverage check after staged promotion; accept _staging as present; dedupe promotion step

* CI: make T retry conditional on explicit coverage probe (not failure()); respect _staging in probe
2025-09-07 15:47:56 -07:00
.claude Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
.github Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
TestProjects/UnityMCPTests Fix: Unity Editor reload crash + debug-noise reduction (#266) 2025-09-06 10:58:11 -07:00
UnityMcpBridge Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
scripts Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
tests Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
tools Fix: Unity Editor reload crash + debug-noise reduction (#266) 2025-09-06 10:58:11 -07:00
.gitignore feat: Automatic Background Compile and Domain Reload for MCP Script Edits and New Script Creation (#248) 2025-09-02 09:36:50 -07:00
CursorHelp.md Rename namespace and public facing plugin output from "Unity MCP" to "MCP for Unity" (#225) 2025-08-20 15:59:49 -04:00
LICENSE chore: update package metadata and license to CoplayDev organization 2025-08-08 15:54:43 -04:00
README-DEV.md Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
README.md Revise README for improved clarity and organization 2025-09-05 11:08:58 -07:00
deploy-dev.bat Rename namespace and public facing plugin output from "Unity MCP" to "MCP for Unity" (#225) 2025-08-20 15:59:49 -04:00
logo.png docs: add Coplay sponsorship and logo to README 2025-08-06 20:59:02 -04:00
mcp_source.py Claude‑friendly edit tools + framed transport + live Unity NL test framework (#243) 2025-08-30 09:55:38 -07:00
prune_tool_results.py Improved ci prompt testing suite (#270) 2025-09-07 15:47:56 -07:00
restore-dev.bat Rename namespace and public facing plugin output from "Unity MCP" to "MCP for Unity" (#225) 2025-08-20 15:59:49 -04:00
test_unity_socket_framing.py Claude‑friendly edit tools + framed transport + live Unity NL test framework (#243) 2025-08-30 09:55:38 -07:00

README.md

MCP for Unity

Proudly sponsored and maintained by Coplay -- the best AI assistant for Unity. Read the backstory here.

Discord python GitHub commit activity GitHub Issues or Pull Requests

Create your Unity apps with LLMs!

MCP for Unity acts as a bridge, allowing AI assistants (like Claude, Cursor) to interact directly with your Unity Editor via a local MCP (Model Context Protocol) Client. Give your LLM tools to manage assets, control scenes, edit scripts, and automate tasks within Unity.


💬 Join Our Discord

Get help, share ideas, and collaborate with other MCP for Unity developers!


Key Features 🚀

  • 🗣️ Natural Language Control: Instruct your LLM to perform Unity tasks.
  • 🛠️ Powerful Tools: Manage assets, scenes, materials, scripts, and editor functions.
  • 🤖 Automation: Automate repetitive Unity workflows.
  • 🧩 Extensible: Designed to work with various MCP Clients.
Available Tools

Your LLM can use functions like:

  • read_console: Gets messages from or clears the console.
  • manage_script: Manages C# scripts (create, read, update, delete).
  • manage_editor: Controls and queries the editor's state and settings.
  • manage_scene: Manages scenes (load, save, create, get hierarchy, etc.).
  • manage_asset: Performs asset operations (import, create, modify, delete, etc.).
  • manage_shader: Performs shader CRUD operations (create, read, modify, delete).
  • manage_gameobject: Manages GameObjects: create, modify, delete, find, and component operations.
  • execute_menu_item: Executes a menu item via its path (e.g., "File/Save Project").
  • apply_text_edits: Precise text edits with precondition hashes and atomic multi-edit batches.
  • script_apply_edits: Structured C# method/class edits (insert/replace/delete) with safer boundaries.
  • validate_script: Fast validation (basic/standard) to catch syntax/structure issues before/after writes.

How It Works

MCP for Unity connects your tools using two components:

  1. MCP for Unity Bridge: A Unity package running inside the Editor. (Installed via Package Manager).
  2. MCP for Unity Server: A Python server that runs locally, communicating between the Unity Bridge and your MCP Client. (Installed automatically by the package on first run or via Auto-Setup; manual setup is available as a fallback).
image

Installation ⚙️

Prerequisites

  • Python: Version 3.12 or newer. Download Python

  • Unity Hub & Editor: Version 2021.3 LTS or newer. Download Unity

  • uv (Python toolchain manager):

    # macOS / Linux
    curl -LsSf https://astral.sh/uv/install.sh | sh
    
    # Windows (PowerShell)
    winget install Astral.Sh.Uv
    
    # Docs: https://docs.astral.sh/uv/getting-started/installation/
    
  • An MCP Client: : Claude Desktop | Claude Code | Cursor | Visual Studio Code Copilot | Windsurf | Others work with manual config

  • [Optional] Roslyn for Advanced Script Validation

    For Strict validation level that catches undefined namespaces, types, and methods:

    Method 1: NuGet for Unity (Recommended)

    1. Install NuGetForUnity
    2. Go to Window > NuGet Package Manager
    3. Search for Microsoft.CodeAnalysis.CSharp and install the package
    4. Go to Player Settings > Scripting Define Symbols
    5. Add USE_ROSLYN
    6. Restart Unity

    Method 2: Manual DLL Installation

    1. Download Microsoft.CodeAnalysis.CSharp.dll and dependencies from NuGet
    2. Place DLLs in Assets/Plugins/ folder
    3. Ensure .NET compatibility settings are correct
    4. Add USE_ROSLYN to Scripting Define Symbols
    5. Restart Unity

    Note: Without Roslyn, script validation falls back to basic structural checks. Roslyn enables full C# compiler diagnostics with precise error reporting.


🌟 Step 1: Install the Unity Package

To install via Git URL

  1. Open your Unity project.
  2. Go to Window > Package Manager.
  3. Click + -> Add package from git URL....
  4. Enter:
    https://github.com/CoplayDev/unity-mcp.git?path=/UnityMcpBridge
    
  5. Click Add.
  6. The MCP server is installed automatically by the package on first run or via Auto-Setup. If that fails, use Manual Configuration (below).

To install via OpenUPM

  1. Install the OpenUPM CLI
  2. Open a terminal (PowerShell, Terminal, etc.) and navigate to your Unity project directory
  3. Run openupm add com.coplaydev.unity-mcp

Note: If you installed the MCP Server before Coplay's maintenance, you will need to uninstall the old package before re-installing the new one.

🛠️ Step 2: Configure Your MCP Client

Connect your MCP Client (Claude, Cursor, etc.) to the Python server set up in Step 1 (auto) or via Manual Configuration (below).

MCPForUnity-Readme-Image

Option A: Auto-Setup (Recommended for Claude/Cursor/VSC Copilot)

  1. In Unity, go to Window > MCP for Unity.
  2. Click Auto-Setup.
  3. Look for a green status indicator 🟢 and "Connected ✓". (This attempts to modify the MCP Client's config file automatically).
Client-specific troubleshooting
  • VSCode: uses Code/User/mcp.json with top-level servers.unityMCP and "type": "stdio". On Windows, MCP for Unity writes an absolute uv.exe (prefers WinGet Links shim) to avoid PATH issues.
  • Cursor / Windsurf (help link): if uv is missing, the MCP for Unity window shows "uv Not Found" with a quick [HELP] link and a "Choose uv Install Location" button.
  • Claude Code (help link): if claude isn't found, the window shows "Claude Not Found" with [HELP] and a "Choose Claude Location" button. Unregister now updates the UI immediately.

Option B: Manual Configuration

If Auto-Setup fails or you use a different client:

  1. Find your MCP Client's configuration file. (Check client documentation).
    • Claude Example (macOS): ~/Library/Application Support/Claude/claude_desktop_config.json
    • Claude Example (Windows): %APPDATA%\Claude\claude_desktop_config.json
  2. Edit the file to add/update the mcpServers section, using the exact paths from Step 1.
Click for Client-Specific JSON Configuration Snippets...

Claude Code

If you're using Claude Code, you can register the MCP server using the below commands: 🚨make sure to run these from your Unity project's home directory🚨

macOS:

claude mcp add UnityMCP -- uv --directory /Users/USERNAME/Library/AppSupport/UnityMCP/UnityMcpServer/src run server.py

Windows:

claude mcp add UnityMCP -- "C:/Users/USERNAME/AppData/Local/Microsoft/WinGet/Links/uv.exe" --directory "C:/Users/USERNAME/AppData/Local/UnityMCP/UnityMcpServer/src" run server.py

VSCode (all OS)

{
  "servers": {
    "unityMCP": {
      "command": "uv",
      "args": ["--directory","<ABSOLUTE_PATH_TO>/UnityMcpServer/src","run","server.py"],
      "type": "stdio"
    }
  }
}

On Windows, set command to the absolute shim, e.g. C:\\Users\\YOU\\AppData\\Local\\Microsoft\\WinGet\\Links\\uv.exe.

Windows:

{
  "mcpServers": {
    "UnityMCP": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "C:\\Users\\YOUR_USERNAME\\AppData\\Local\\UnityMCP\\UnityMcpServer\\src",
        "server.py"
      ]
    }
    // ... other servers might be here ...
  }
}

(Remember to replace YOUR_USERNAME and use double backslashes \)

macOS:

{
  "mcpServers": {
    "UnityMCP": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/Users/YOUR_USERNAME/Library/AppSupport/UnityMCP/UnityMcpServer/src",
        "server.py"
      ]
    }
    // ... other servers might be here ...
  }
}

(Replace YOUR_USERNAME. Note: AppSupport is a symlink to "Application Support" to avoid quoting issues)

Linux:

{
  "mcpServers": {
    "UnityMCP": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/home/YOUR_USERNAME/.local/share/UnityMCP/UnityMcpServer/src",
        "server.py"
      ]
    }
    // ... other servers might be here ...
  }
}

(Replace YOUR_USERNAME)


Usage ▶️

  1. Open your Unity Project. The MCP for Unity package should connect automatically. Check status via Window > MCP for Unity.

  2. Start your MCP Client (Claude, Cursor, etc.). It should automatically launch the MCP for Unity Server (Python) using the configuration from Installation Step 2.

  3. Interact! Unity tools should now be available in your MCP Client.

    Example Prompt: Create a 3D player controller, Create a tic-tac-toe game in 3D, Create a cool shader and apply to a cube.


Development & Contributing 🛠️

For Developers

If you're contributing to MCP for Unity or want to test core changes, we have development tools to streamline your workflow:

  • Development Deployment Scripts: Quickly deploy and test your changes to MCP for Unity Bridge and Python Server
  • Automatic Backup System: Safe testing with easy rollback capabilities
  • Hot Reload Workflow: Fast iteration cycle for core development

📖 See README-DEV.md for complete development setup and workflow documentation.

Contributing 🤝

Help make MCP for Unity better!

  1. Fork the main repository.
  2. Create a branch (feature/your-idea or bugfix/your-fix).
  3. Make changes.
  4. Commit (feat: Add cool new feature).
  5. Push your branch.
  6. Open a Pull Request against the main branch.

Troubleshooting

Click to view common issues and fixes...
  • Unity Bridge Not Running/Connecting:
    • Ensure Unity Editor is open.
    • Check the status window: Window > MCP for Unity.
    • Restart Unity.
  • MCP Client Not Connecting / Server Not Starting:
    • Verify Server Path: Double-check the --directory path in your MCP Client's JSON config. It must exactly match the installation location:
      • Windows: %USERPROFILE%\AppData\Local\UnityMCP\UnityMcpServer\src
      • macOS: ~/Library/AppSupport/UnityMCP/UnityMcpServer\src
      • Linux: ~/.local/share/UnityMCP/UnityMcpServer\src
    • Verify uv: Make sure uv is installed and working (uv --version).
    • Run Manually: Try running the server directly from the terminal to see errors:
      cd /path/to/your/UnityMCP/UnityMcpServer/src
      uv run server.py
      
  • Auto-Configure Failed:
    • Use the Manual Configuration steps. Auto-configure might lack permissions to write to the MCP client's config file.

Still stuck? Open an Issue or Join the Discord!


License 📜

MIT License. See LICENSE file.


Star History

Star History Chart

Sponsor

Coplay Logo