2025-10-24 12:50:29 +08:00
< img width = "676" height = "380" alt = "MCP for Unity" src = "docs/images/logo.png" / >
2025-03-18 19:00:50 +08:00
2025-09-24 02:41:29 +08:00
| [English ](README.md ) | [简体中文 ](README-zh.md ) |
|----------------------|---------------------------------|
2025-10-12 07:30:02 +08:00
#### Proudly sponsored and maintained by [Coplay](https://www.coplay.dev/?ref=unity-mcp) -- the best AI assistant for Unity.
2025-08-10 03:05:47 +08:00
[](https://discord.gg/y4p8KfzrN4)
2025-10-10 00:02:21 +08:00
[](https://www.coplay.dev/?ref=unity-mcp)
2025-07-14 04:29:58 +08:00
[](https://unity.com/releases/editor/archive)
2025-11-01 03:44:10 +08:00
[](https://www.python.org)
2025-07-14 04:29:58 +08:00
[](https://modelcontextprotocol.io/introduction)
2025-08-10 03:05:47 +08:00


2025-07-14 04:29:58 +08:00
[](https://opensource.org/licenses/MIT)
2025-07-30 04:07:21 +08:00
**Create your Unity apps with LLMs!**
2025-07-14 04:29:58 +08:00
2025-08-21 03:59:49 +08:00
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.
2025-07-14 04:29:58 +08:00
2025-11-01 03:44:10 +08:00
< img width = "406" height = "704" alt = "MCP for Unity screenshot" src = "docs/images/readme_ui.png" >
2025-10-24 12:50:29 +08:00
2025-09-05 23:32:00 +08:00
---
2025-07-14 04:29:58 +08:00
2025-09-05 23:32:00 +08:00
### 💬 Join Our [Discord](https://discord.gg/y4p8KfzrN4)
2025-07-30 04:07:21 +08:00
2025-08-21 03:59:49 +08:00
**Get help, share ideas, and collaborate with other MCP for Unity developers!**
2025-03-18 19:21:33 +08:00
2025-04-09 09:14:25 +08:00
---
2025-03-18 19:00:50 +08:00
2025-04-09 09:14:25 +08:00
## Key Features 🚀
2025-03-18 19:00:50 +08:00
2025-10-24 12:50:29 +08:00
* **🗣️ 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.
2025-03-18 19:00:50 +08:00
2025-07-14 14:01:25 +08:00
< details open >
2025-10-24 12:50:29 +08:00
< summary > < strong > Tools< / strong > < / summary >
2025-03-18 19:00:50 +08:00
2025-04-09 09:14:25 +08:00
Your LLM can use functions like:
2025-03-19 04:06:28 +08:00
Move Get commands to editor resources + Run Python tests every update (#368)
* Add a function to reload the domain
Closes #357
* feat: restructure server instructions into workflow-focused format
- Reorganized instructions from flat bullet list into categorized workflow sections
- Emphasized critical script management workflow with numbered steps
- Improved readability and scannability for AI agents using the MCP server
It doesn't make sense to repeat the fucnction tools, they're already parsed
* docs: reorder tool list alphabetically in README + add reload_domain tool
* feat: add Unity editor state and project info resources
- Implemented resources for querying active tool, editor state, prefab stage, selection, and open windows
- Added project configuration resources for layers and project metadata
- Organized new resources into Editor and Project namespaces for better structure
* feat: clarify script management workflow in system prompt
- Expanded guidance to include scripts created by any tool, not just manage_script
- Added "etc" to tools examples for better clarity
* refactor: remove reload_domain tool and update script management workflow
- Removed reload_domain tool as Unity automatically recompiles scripts when modified
- Updated script management instructions to rely on editor_state polling and console checking instead of manual domain reload
- Simplified workflow by removing unnecessary manual recompilation step
* Change name of menu items resource as the LLM seems it
* refactor: reorganize tests into src/tests/integration directory
- Moved all test files from root tests/ to MCPForUnity/UnityMcpServer~/src/tests/integration/ for better organization
- Added conftest.py with telemetry and dependency stubs to simplify test setup
- Removed redundant path manipulation and module loading code from individual test files
* feat: expand Unity test workflow triggers
- Run tests on all branches instead of only main
- Add pull request trigger to catch issues before merge
- Maintain path filtering to run only when relevant files change
* chore: add GitHub Actions workflow for Python tests
- Configured automated testing on push and pull requests using pytest
- Set up uv for dependency management and Python 3.10 environment
- Added test results artifact upload for debugging failed runs
* refactor: update import path for fastmcp Context
* docs: update development setup instructions to use uv
- Changed installation commands from pip to uv pip for better dependency management
- Updated test running instructions to use uv run pytest
- Added examples for running integration and unit tests separately
* Formatting [skip ci]
* refactor: optimize CI workflow with path filters and dependency installation
- Added path filters to only trigger tests when Python source or workflow files change
- Split dependency installation into sync and dev install steps for better clarity
- Fixed YAML indentation for improved readability
* Update .github/workflows/python-tests.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: standardize test mode values to match Unity's naming convention
- Changed default mode from "edit" to "EditMode" in C# code
- Updated Python tool to use "EditMode" and "PlayMode" instead of lowercase variants
* refactor: convert test imports to relative imports
- Changed absolute imports to relative imports in integration tests for better package structure
- Removed test packages from pyproject.toml package list
* refactor: use Field with default_factory for mutable default in TagsResponse
* refactor: remove duplicate PrefabStageUtility call
* Update this as well [skip ci]
* Update MCPForUnity/UnityMcpServer~/src/tests/integration/test_script_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* chore: remove pull_request triggers from test workflows [skip ci]
It's already covered by pushes
* refactor: update resource function return types to include MCPResponse union
* refactor: remove manual domain reload tool
- Removed reload_domain tool as Unity handles script recompilation automatically
- Updated documentation to reflect automatic compilation workflow
- Simplified script management workflow instructions in server description
* refactor: add context support to resource handlers
- Updated all resource handlers to accept Context parameter for Unity instance routing
- Replaced direct async_send_command_with_retry calls with async_send_with_unity_instance wrapper
- Added imports for get_unity_instance_from_context and async_send_with_unity_instance helpers
* fix: correct grammar in menu items documentation
* docs: update README with expanded tools and resources documentation
- Added new tools: manage_prefabs, create_script, delete_script, get_sha
- Added new resources: editor state, windows, project info, layers, and tags
- Clarified manage_script as compatibility router with recommendation to use newer edit tools
- Fixed run_test to run_tests for consistency
* refactor: convert unity_instances function to async [skip ci]
- Changed function signature from synchronous to async
- Added await keywords to ctx.info() and ctx.error() calls to properly handle async context methods
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-11-06 04:06:48 +08:00
* `execute_menu_item` : Executes Unity Editor menu items (e.g., "File/Save Project").
* `manage_asset` : Performs asset operations (import, create, modify, delete, etc.).
* `manage_editor` : Controls and queries the editor's state and settings.
* `manage_gameobject` : Manages GameObjects: create, modify, delete, find, and component operations.
* `manage_prefabs` : Performs prefab operations (create, modify, delete, etc.).
* `manage_scene` : Manages scenes (load, save, create, get hierarchy, etc.).
* `manage_script` : Compatibility router for legacy script operations (create, read, delete). Prefer `apply_text_edits` or `script_apply_edits` for edits.
* `manage_shader` : Performs shader CRUD operations (create, read, modify, delete).
* `read_console` : Gets messages from or clears the console.
* `run_tests` : Runs tests in the Unity Editor.
* `set_active_instance` : Routes subsequent tool calls to a specific Unity instance (when multiple are running).
* `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.
* `create_script` : Create a new C# script at the given project path.
* `delete_script` : Delete a C# script by URI or Assets-relative path.
* `get_sha` : Get SHA256 and basic metadata for a Unity C# script without returning file contents.
2025-04-09 09:14:25 +08:00
< / details >
2025-03-19 04:06:28 +08:00
2025-10-24 12:50:29 +08:00
< details open >
< summary > < strong > Resources< / strong > < / summary >
Your LLM can retrieve the following resources:
Move Get commands to editor resources + Run Python tests every update (#368)
* Add a function to reload the domain
Closes #357
* feat: restructure server instructions into workflow-focused format
- Reorganized instructions from flat bullet list into categorized workflow sections
- Emphasized critical script management workflow with numbered steps
- Improved readability and scannability for AI agents using the MCP server
It doesn't make sense to repeat the fucnction tools, they're already parsed
* docs: reorder tool list alphabetically in README + add reload_domain tool
* feat: add Unity editor state and project info resources
- Implemented resources for querying active tool, editor state, prefab stage, selection, and open windows
- Added project configuration resources for layers and project metadata
- Organized new resources into Editor and Project namespaces for better structure
* feat: clarify script management workflow in system prompt
- Expanded guidance to include scripts created by any tool, not just manage_script
- Added "etc" to tools examples for better clarity
* refactor: remove reload_domain tool and update script management workflow
- Removed reload_domain tool as Unity automatically recompiles scripts when modified
- Updated script management instructions to rely on editor_state polling and console checking instead of manual domain reload
- Simplified workflow by removing unnecessary manual recompilation step
* Change name of menu items resource as the LLM seems it
* refactor: reorganize tests into src/tests/integration directory
- Moved all test files from root tests/ to MCPForUnity/UnityMcpServer~/src/tests/integration/ for better organization
- Added conftest.py with telemetry and dependency stubs to simplify test setup
- Removed redundant path manipulation and module loading code from individual test files
* feat: expand Unity test workflow triggers
- Run tests on all branches instead of only main
- Add pull request trigger to catch issues before merge
- Maintain path filtering to run only when relevant files change
* chore: add GitHub Actions workflow for Python tests
- Configured automated testing on push and pull requests using pytest
- Set up uv for dependency management and Python 3.10 environment
- Added test results artifact upload for debugging failed runs
* refactor: update import path for fastmcp Context
* docs: update development setup instructions to use uv
- Changed installation commands from pip to uv pip for better dependency management
- Updated test running instructions to use uv run pytest
- Added examples for running integration and unit tests separately
* Formatting [skip ci]
* refactor: optimize CI workflow with path filters and dependency installation
- Added path filters to only trigger tests when Python source or workflow files change
- Split dependency installation into sync and dev install steps for better clarity
- Fixed YAML indentation for improved readability
* Update .github/workflows/python-tests.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: standardize test mode values to match Unity's naming convention
- Changed default mode from "edit" to "EditMode" in C# code
- Updated Python tool to use "EditMode" and "PlayMode" instead of lowercase variants
* refactor: convert test imports to relative imports
- Changed absolute imports to relative imports in integration tests for better package structure
- Removed test packages from pyproject.toml package list
* refactor: use Field with default_factory for mutable default in TagsResponse
* refactor: remove duplicate PrefabStageUtility call
* Update this as well [skip ci]
* Update MCPForUnity/UnityMcpServer~/src/tests/integration/test_script_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* chore: remove pull_request triggers from test workflows [skip ci]
It's already covered by pushes
* refactor: update resource function return types to include MCPResponse union
* refactor: remove manual domain reload tool
- Removed reload_domain tool as Unity handles script recompilation automatically
- Updated documentation to reflect automatic compilation workflow
- Simplified script management workflow instructions in server description
* refactor: add context support to resource handlers
- Updated all resource handlers to accept Context parameter for Unity instance routing
- Replaced direct async_send_command_with_retry calls with async_send_with_unity_instance wrapper
- Added imports for get_unity_instance_from_context and async_send_with_unity_instance helpers
* fix: correct grammar in menu items documentation
* docs: update README with expanded tools and resources documentation
- Added new tools: manage_prefabs, create_script, delete_script, get_sha
- Added new resources: editor state, windows, project info, layers, and tags
- Clarified manage_script as compatibility router with recommendation to use newer edit tools
- Fixed run_test to run_tests for consistency
* refactor: convert unity_instances function to async [skip ci]
- Changed function signature from synchronous to async
- Added await keywords to ctx.info() and ctx.error() calls to properly handle async context methods
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-11-06 04:06:48 +08:00
* `unity_instances` : Lists all running Unity Editor instances with their details (name, path, port, status).
* `menu_items` : Retrieves all available menu items in the Unity Editor.
* `tests` : Retrieves all available tests in the Unity Editor. Can select tests of a specific type (e.g., "EditMode", "PlayMode").
* `editor_active_tool` : Currently active editor tool (Move, Rotate, Scale, etc.) and transform handle settings.
* `editor_prefab_stage` : Current prefab editing context if a prefab is open in isolation mode.
* `editor_selection` : Detailed information about currently selected objects in the editor.
* `editor_state` : Current editor runtime state including play mode, compilation status, active scene, and selection summary.
* `editor_windows` : All currently open editor windows with their titles, types, positions, and focus state.
* `project_info` : Static project information including root path, Unity version, and platform.
* `project_layers` : All layers defined in the project's TagManager with their indices (0-31).
* `project_tags` : All tags defined in the project's TagManager.
2025-10-24 12:50:29 +08:00
< / details >
2025-04-09 09:14:25 +08:00
---
2025-03-19 04:06:28 +08:00
2025-09-05 23:32:00 +08:00
## How It Works
2025-03-19 04:06:28 +08:00
2025-08-21 03:59:49 +08:00
MCP for Unity connects your tools using two components:
2025-03-19 04:06:28 +08:00
2025-10-24 12:50:29 +08:00
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).
2025-03-19 04:06:28 +08:00
2025-09-05 23:32:00 +08:00
< img width = "562" height = "121" alt = "image" src = "https://github.com/user-attachments/assets/9abf9c66-70d1-4b82-9587-658e0d45dc3e" / >
2025-03-19 04:06:28 +08:00
2025-04-09 09:14:25 +08:00
---
2025-03-19 04:06:28 +08:00
2025-04-09 09:14:25 +08:00
## Installation ⚙️
2025-03-19 04:06:28 +08:00
2025-04-09 09:14:25 +08:00
### Prerequisites
2025-03-19 04:06:28 +08:00
2025-11-01 03:44:10 +08:00
* **Python:** Version 3.10 or newer. [Download Python ](https://www.python.org/downloads/ )
2025-10-24 12:50:29 +08:00
* **Unity Hub & Editor:** Version 2021.3 LTS or newer. [Download Unity ](https://unity.com/download )
* **uv (Python toolchain manager):**
2025-04-09 09:14:25 +08:00
```bash
2025-09-06 00:15:54 +08:00
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
2025-09-18 11:50:15 +08:00
winget install --id=astral-sh.uv -e
2025-09-06 00:15:54 +08:00
# Docs: https://docs.astral.sh/uv/getting-started/installation/
2025-04-09 09:14:25 +08:00
```
2025-09-06 00:15:54 +08:00
2025-10-24 12:50:29 +08:00
* **An MCP Client:** : [Claude Desktop ](https://claude.ai/download ) | [Claude Code ](https://github.com/anthropics/claude-code ) | [Cursor ](https://www.cursor.com/en/downloads ) | [Visual Studio Code Copilot ](https://code.visualstudio.com/docs/copilot/overview ) | [Windsurf ](https://windsurf.com ) | Others work with manual config
2025-09-05 23:32:00 +08:00
2025-10-24 12:50:29 +08:00
* < details > < summary >< strong > [Optional] Roslyn for Advanced Script Validation</ strong ></ summary >
2025-07-24 11:31:47 +08:00
For **Strict** validation level that catches undefined namespaces, types, and methods:
**Method 1: NuGet for Unity (Recommended)**
1. Install [NuGetForUnity ](https://github.com/GlitchEnzo/NuGetForUnity )
2. Go to `Window > NuGet Package Manager`
2025-09-24 12:24:01 +08:00
3. Search for `Microsoft.CodeAnalysis` , select version 4.14.0, and install the package
4. Also install package `SQLitePCLRaw.core` and `SQLitePCLRaw.bundle_e_sqlite3` .
2025-07-24 11:31:47 +08:00
5. Go to `Player Settings > Scripting Define Symbols`
6. Add `USE_ROSLYN`
7. Restart Unity
**Method 2: Manual DLL Installation**
1. Download Microsoft.CodeAnalysis.CSharp.dll and dependencies from [NuGet ](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp/ )
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
2025-08-10 03:05:47 +08:00
**Note:** Without Roslyn, script validation falls back to basic structural checks. Roslyn enables full C# compiler diagnostics with precise error reporting.</ details >
2025-03-19 04:06:28 +08:00
2025-09-05 23:32:00 +08:00
---
2025-09-06 02:08:58 +08:00
### 🌟 Step 1: Install the Unity Package
2025-08-15 06:18:33 +08:00
2025-08-15 07:02:25 +08:00
#### To install via Git URL
2025-03-18 19:00:50 +08:00
2025-10-24 12:50:29 +08:00
1. Open your Unity project.
2. Go to `Window > Package Manager` .
3. Click `+` -> `Add package from git URL...` .
4. Enter:
2025-04-09 09:14:25 +08:00
```
2025-10-04 08:23:28 +08:00
https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity
2025-04-09 09:14:25 +08:00
```
2025-10-24 12:50:29 +08:00
5. Click `Add` .
2025-04-09 09:14:25 +08:00
2025-08-15 07:02:25 +08:00
#### To install via OpenUPM
2025-08-15 06:18:33 +08:00
2025-10-24 12:50:29 +08:00
1. Install the [OpenUPM CLI ](https://openupm.com/docs/getting-started-cli.html )
2. Open a terminal (PowerShell, Terminal, etc.) and navigate to your Unity project directory
3. Run `openupm add com.coplaydev.unity-mcp`
2025-08-15 06:18:33 +08:00
2025-08-10 03:05:47 +08:00
**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.
2025-09-06 02:08:58 +08:00
### 🛠️ Step 2: Configure Your MCP Client
2025-08-21 03:59:49 +08:00
Connect your MCP Client (Claude, Cursor, etc.) to the Python server set up in Step 1 (auto) or via Manual Configuration (below).
2025-03-18 19:00:50 +08:00
2025-08-10 06:38:11 +08:00
**Option A: Auto-Setup (Recommended for Claude/Cursor/VSC Copilot)**
2025-03-18 19:00:50 +08:00
2025-10-24 12:50:29 +08:00
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).*
2025-08-14 05:23:52 +08:00
2025-08-14 22:29:17 +08:00
< details > < summary > < strong > Client-specific troubleshooting< / strong > < / summary >
2025-08-14 05:23:52 +08:00
2025-08-21 03:59:49 +08:00
- **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**) ](https://github.com/CoplayDev/unity-mcp/wiki/1.-Fix-Unity-MCP-and-Cursor,-VSCode-&-Windsurf ): 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.
2025-08-14 22:29:17 +08:00
- **Claude Code** [(**help link**) ](https://github.com/CoplayDev/unity-mcp/wiki/2.-Fix-Unity-MCP-and-Claude-Code ): 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.</ details >
2025-04-09 09:14:25 +08:00
**Option B: Manual Configuration**
2025-08-10 06:38:11 +08:00
If Auto-Setup fails or you use a different client:
2025-04-09 09:14:25 +08:00
2025-10-24 12:50:29 +08:00
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.
2025-04-09 09:14:25 +08:00
< details >
2025-08-14 05:23:52 +08:00
< summary > < strong > Click for Client-Specific JSON Configuration Snippets...< / strong > < / summary >
2025-09-06 02:08:58 +08:00
---
**Claude Code**
If you're using Claude Code, you can register the MCP server using the below commands:
**macOS:**
```bash
2025-10-24 13:01:26 +08:00
claude mcp add --scope user UnityMCP -- uv --directory /Users/USERNAME/Library/AppSupport/UnityMCP/UnityMcpServer/src run server.py
2025-09-06 02:08:58 +08:00
```
**Windows:**
```bash
2025-10-24 13:01:26 +08:00
claude mcp add --scope user UnityMCP -- "C:/Users/USERNAME/AppData/Local/Microsoft/WinGet/Links/uv.exe" --directory "C:/Users/USERNAME/AppData/Local/UnityMCP/UnityMcpServer/src" run server.py
2025-09-06 02:08:58 +08:00
```
2025-08-14 05:23:52 +08:00
**VSCode (all OS)**
```json
{
"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` .
2025-04-09 09:14:25 +08:00
**Windows:**
```json
{
"mcpServers": {
"UnityMCP": {
"command": "uv",
"args": [
"run",
"--directory",
2025-09-04 09:13:19 +08:00
"C:\\Users\\YOUR_USERNAME\\AppData\\Local\\UnityMCP\\UnityMcpServer\\src",
2025-04-09 09:14:25 +08:00
"server.py"
]
}
// ... other servers might be here ...
}
}
```
(Remember to replace YOUR_USERNAME and use double backslashes \\)
**macOS:**
```json
{
"mcpServers": {
"UnityMCP": {
"command": "uv",
"args": [
"run",
"--directory",
2025-09-04 09:13:19 +08:00
"/Users/YOUR_USERNAME/Library/AppSupport/UnityMCP/UnityMcpServer/src",
2025-04-09 09:14:25 +08:00
"server.py"
]
}
// ... other servers might be here ...
}
}
```
2025-08-10 03:05:47 +08:00
2025-09-04 09:13:19 +08:00
(Replace YOUR_USERNAME. Note: AppSupport is a symlink to "Application Support" to avoid quoting issues)
2025-04-09 09:14:25 +08:00
**Linux:**
```json
{
"mcpServers": {
"UnityMCP": {
"command": "uv",
"args": [
"run",
"--directory",
2025-09-04 09:13:19 +08:00
"/home/YOUR_USERNAME/.local/share/UnityMCP/UnityMcpServer/src",
2025-04-09 09:14:25 +08:00
"server.py"
]
}
// ... other servers might be here ...
}
}
```
(Replace YOUR_USERNAME)
2025-07-28 11:57:18 +08:00
2025-07-30 04:07:21 +08:00
< / details >
2025-07-28 11:57:18 +08:00
2025-04-09 09:14:25 +08:00
---
## Usage ▶️
2025-08-21 03:59:49 +08:00
1. **Open your Unity Project.** The MCP for Unity package should connect automatically. Check status via Window > MCP for Unity.
2025-04-09 09:14:25 +08:00
2025-08-21 03:59:49 +08:00
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.
2025-04-09 09:14:25 +08:00
3. **Interact!** Unity tools should now be available in your MCP Client.
Feature/session based instance routing (#369)
* Add support for multiple Unity instances
* fix port detection
* add missing unity_instance parameter
* add instance params for resources
* Fix CodeRabbit review feedback
- Fix partial framed response handling in port discovery
Add _recv_exact() helper to ensure complete frame reading
Prevents healthy Unity instances from being misidentified as offline
- Remove unused default_conn variables in server.py (2 files)
Fixes Ruff F841 lint error that would block CI/CD
- Preserve sync/async nature of resources in wrapper
Check if original function is coroutine before wrapping
Prevents 'dict object is not awaitable' runtime errors
- Fix reconnection to preserve instance_id
Add instance_id tracking to UnityConnection dataclass
Reconnection now targets the same Unity instance instead of any available one
Prevents operations from being applied to wrong project
- Add instance logging to manage_asset for debugging
Helps troubleshoot multi-instance scenarios
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix CodeRabbit feedback: reconnection fallback and annotations safety
Address 3 CodeRabbit review comments:
1. Critical: Guard reconnection fallback to prevent wrong instance routing
- When instance_id is set but rediscovery fails, now raises ConnectionError
- Added 'from e' to preserve exception chain for better debugging
- Prevents silently connecting to different Unity instance
- Ensures multi-instance routing integrity
2. Minor: Guard __annotations__ access in resource registration
- Use getattr(func, '__annotations__', {}) instead of direct access
- Prevents AttributeError for functions without type hints
3. Minor: Remove unused get_type_hints import
- Clean up unused import in resources/__init__.py
All changes applied to both Server/ and MCPForUnity/ directories.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix instance sorting and logging issues
- Fix sorting logic for instances without heartbeat data: use epoch timestamp instead of current time to properly deprioritize instances with None last_heartbeat
- Use logger.exception() instead of logger.error() in disconnect_all() to include stack traces for better debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* update uv.lock to prepare for merging into main
* Restore Python 3.10 lockfiles and package list_unity_instances tool
* Deduplicate Unity instance discovery by port
* Scope status-file reload checks to the active instance
* refactor: implement FastMCP middleware for session-based instance routing
Replaces module-level session_state.py with UnityInstanceMiddleware class
that follows FastMCP best practices. Middleware intercepts all tool calls
via on_call_tool hook and injects active Unity instance into request state.
Key changes:
- Add UnityInstanceMiddleware class with on_call_tool hook
- Tools now use ctx.get_state("unity_instance") instead of direct session_state calls
- Remove unity_instance parameter from all tool schemas to prevent LLM hallucination
- Convert list_unity_instances tool to unity_instances resource (read-only data)
- Update error messages to reference unity://instances resource
- Add set_state/get_state methods to DummyContext test helper
- All 67 tests passing (55 passed, 5 skipped, 7 xpassed)
Architecture benefits:
- Centralized session management in middleware
- Standard FastMCP patterns (middleware + request state)
- Cleaner separation of concerns
- Prevents AI hallucination of invalid instance IDs
* fix: convert resource templates to static resources for discoverability
Convert MCP resources from URI templates with query parameters to static
resources to fix discoverability in MCP clients like Claude Code.
Changes:
- Remove {?force_refresh} from unity://instances
- Remove {?unity_instance} from mcpforunity://menu-items
- Remove {?unity_instance} from mcpforunity://tests
- Keep {mode} path parameter in mcpforunity://tests/{mode} (legitimate)
Root cause: Query parameters {?param} trigger ResourceTemplate registration,
which are listed via resources/templates/list instead of resources/list.
Claude Code's ListMcpResourcesTool only queries resources/list, making
templates undiscoverable.
Solution: Remove optional query parameters from URIs. Instance routing is
handled by middleware/context, and force_refresh was cache control that
doesn't belong in resource identity.
Impact: Resources now discoverable via standard resources/list endpoint and
work with all MCP clients including Claude Code and Cursor.
Requires FastMCP >=2.13.0 for proper RFC 6570 query parameter support.
* feat: improve material properties and sync Server resources
Material Property Improvements (ManageAsset.cs):
- Add GetMainColorPropertyName() helper that auto-detects shader color properties
- Tries _BaseColor (URP), _Color (Standard), _MainColor, _Tint, _TintColor
- Update both named and array color property handling to use auto-detection
- Add warning messages when color properties don't exist on materials
- Split HasProperty check from SetColor to enable error reporting
This fixes the issue where simple color array format [r,g,b,a] defaulted to
_Color property, causing silent failures with URP Lit shader which uses _BaseColor.
Server Resource Sync:
- Sync Server/resources with MCPForUnity/UnityMcpServer~/src/resources
- Remove query parameters from resource URIs for discoverability
- Use session-based instance routing via get_unity_instance_from_context()
* fix: repair instance routing and simplify get_unity_instance_from_context
PROBLEM:
Instance routing was failing - scripts went to wrong Unity instances.
Script1 (intended: ramble) -> went to UnityMCPTests ❌
Script2 (intended: UnityMCPTests) -> went to ramble ❌
ROOT CAUSE:
Two incompatible approaches for accessing active instance:
1. Middleware: ctx.set_state() / ctx.get_state() - used by most tools
2. Legacy: ctx.request_context.meta - used by script tools
Script tools were reading from wrong location, middleware had no effect.
FIX:
1. Updated get_unity_instance_from_context() to read from ctx.get_state()
2. Removed legacy request_context.meta code path (98 lines removed)
3. Single source of truth: middleware state only
TESTING:
- Added comprehensive test suite (21 tests) covering all scenarios
- Tests middleware state management, session isolation, race conditions
- Tests reproduce exact 4-script failure scenario
- All 88 tests pass (76 passed + 5 skipped + 7 xpassed)
- Verified fix with live 4-script test: 100% success rate
Files changed:
- Server/tools/__init__.py: Simplified from 75 lines to 15 lines
- MCPForUnity/UnityMcpServer~/src/tools/__init__.py: Same simplification
- tests/test_instance_routing_comprehensive.py: New comprehensive test suite
* refactor: standardize instance extraction and remove dead imports
- Standardize all 18 tools to use get_unity_instance_from_context() helper
instead of direct ctx.get_state() calls for consistency
- Remove dead session_state imports from with_unity_instance decorator
that would cause ModuleNotFoundError at runtime
- Update README.md with concise instance routing documentation
* fix: critical timezone and import bugs from code review
- Remove incorrect port safety check that treated reclaimed ports as errors
(GetPortWithFallback may legitimately return same port if it became available)
- Fix timezone-aware vs naive datetime mixing in unity_connection.py sorting
(use timestamp() for comparison to avoid TypeError)
- Normalize all datetime comparisons in port_discovery.py to UTC
(file_mtime and last_heartbeat now consistently timezone-aware)
- Add missing send_with_unity_instance import in Server/tools/manage_script.py
(was causing NameError at runtime on lines 108 and 488)
All 88 tests pass (76 passed + 5 skipped + 7 xpassed)
---------
Co-authored-by: Sakura <sakurachan@qq.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-06 01:43:36 +08:00
2025-09-05 23:32:00 +08:00
Example Prompt: `Create a 3D player controller` , `Create a tic-tac-toe game in 3D` , `Create a cool shader and apply to a cube` .
2025-04-09 09:14:25 +08:00
Feature/session based instance routing (#369)
* Add support for multiple Unity instances
* fix port detection
* add missing unity_instance parameter
* add instance params for resources
* Fix CodeRabbit review feedback
- Fix partial framed response handling in port discovery
Add _recv_exact() helper to ensure complete frame reading
Prevents healthy Unity instances from being misidentified as offline
- Remove unused default_conn variables in server.py (2 files)
Fixes Ruff F841 lint error that would block CI/CD
- Preserve sync/async nature of resources in wrapper
Check if original function is coroutine before wrapping
Prevents 'dict object is not awaitable' runtime errors
- Fix reconnection to preserve instance_id
Add instance_id tracking to UnityConnection dataclass
Reconnection now targets the same Unity instance instead of any available one
Prevents operations from being applied to wrong project
- Add instance logging to manage_asset for debugging
Helps troubleshoot multi-instance scenarios
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix CodeRabbit feedback: reconnection fallback and annotations safety
Address 3 CodeRabbit review comments:
1. Critical: Guard reconnection fallback to prevent wrong instance routing
- When instance_id is set but rediscovery fails, now raises ConnectionError
- Added 'from e' to preserve exception chain for better debugging
- Prevents silently connecting to different Unity instance
- Ensures multi-instance routing integrity
2. Minor: Guard __annotations__ access in resource registration
- Use getattr(func, '__annotations__', {}) instead of direct access
- Prevents AttributeError for functions without type hints
3. Minor: Remove unused get_type_hints import
- Clean up unused import in resources/__init__.py
All changes applied to both Server/ and MCPForUnity/ directories.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Fix instance sorting and logging issues
- Fix sorting logic for instances without heartbeat data: use epoch timestamp instead of current time to properly deprioritize instances with None last_heartbeat
- Use logger.exception() instead of logger.error() in disconnect_all() to include stack traces for better debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* update uv.lock to prepare for merging into main
* Restore Python 3.10 lockfiles and package list_unity_instances tool
* Deduplicate Unity instance discovery by port
* Scope status-file reload checks to the active instance
* refactor: implement FastMCP middleware for session-based instance routing
Replaces module-level session_state.py with UnityInstanceMiddleware class
that follows FastMCP best practices. Middleware intercepts all tool calls
via on_call_tool hook and injects active Unity instance into request state.
Key changes:
- Add UnityInstanceMiddleware class with on_call_tool hook
- Tools now use ctx.get_state("unity_instance") instead of direct session_state calls
- Remove unity_instance parameter from all tool schemas to prevent LLM hallucination
- Convert list_unity_instances tool to unity_instances resource (read-only data)
- Update error messages to reference unity://instances resource
- Add set_state/get_state methods to DummyContext test helper
- All 67 tests passing (55 passed, 5 skipped, 7 xpassed)
Architecture benefits:
- Centralized session management in middleware
- Standard FastMCP patterns (middleware + request state)
- Cleaner separation of concerns
- Prevents AI hallucination of invalid instance IDs
* fix: convert resource templates to static resources for discoverability
Convert MCP resources from URI templates with query parameters to static
resources to fix discoverability in MCP clients like Claude Code.
Changes:
- Remove {?force_refresh} from unity://instances
- Remove {?unity_instance} from mcpforunity://menu-items
- Remove {?unity_instance} from mcpforunity://tests
- Keep {mode} path parameter in mcpforunity://tests/{mode} (legitimate)
Root cause: Query parameters {?param} trigger ResourceTemplate registration,
which are listed via resources/templates/list instead of resources/list.
Claude Code's ListMcpResourcesTool only queries resources/list, making
templates undiscoverable.
Solution: Remove optional query parameters from URIs. Instance routing is
handled by middleware/context, and force_refresh was cache control that
doesn't belong in resource identity.
Impact: Resources now discoverable via standard resources/list endpoint and
work with all MCP clients including Claude Code and Cursor.
Requires FastMCP >=2.13.0 for proper RFC 6570 query parameter support.
* feat: improve material properties and sync Server resources
Material Property Improvements (ManageAsset.cs):
- Add GetMainColorPropertyName() helper that auto-detects shader color properties
- Tries _BaseColor (URP), _Color (Standard), _MainColor, _Tint, _TintColor
- Update both named and array color property handling to use auto-detection
- Add warning messages when color properties don't exist on materials
- Split HasProperty check from SetColor to enable error reporting
This fixes the issue where simple color array format [r,g,b,a] defaulted to
_Color property, causing silent failures with URP Lit shader which uses _BaseColor.
Server Resource Sync:
- Sync Server/resources with MCPForUnity/UnityMcpServer~/src/resources
- Remove query parameters from resource URIs for discoverability
- Use session-based instance routing via get_unity_instance_from_context()
* fix: repair instance routing and simplify get_unity_instance_from_context
PROBLEM:
Instance routing was failing - scripts went to wrong Unity instances.
Script1 (intended: ramble) -> went to UnityMCPTests ❌
Script2 (intended: UnityMCPTests) -> went to ramble ❌
ROOT CAUSE:
Two incompatible approaches for accessing active instance:
1. Middleware: ctx.set_state() / ctx.get_state() - used by most tools
2. Legacy: ctx.request_context.meta - used by script tools
Script tools were reading from wrong location, middleware had no effect.
FIX:
1. Updated get_unity_instance_from_context() to read from ctx.get_state()
2. Removed legacy request_context.meta code path (98 lines removed)
3. Single source of truth: middleware state only
TESTING:
- Added comprehensive test suite (21 tests) covering all scenarios
- Tests middleware state management, session isolation, race conditions
- Tests reproduce exact 4-script failure scenario
- All 88 tests pass (76 passed + 5 skipped + 7 xpassed)
- Verified fix with live 4-script test: 100% success rate
Files changed:
- Server/tools/__init__.py: Simplified from 75 lines to 15 lines
- MCPForUnity/UnityMcpServer~/src/tools/__init__.py: Same simplification
- tests/test_instance_routing_comprehensive.py: New comprehensive test suite
* refactor: standardize instance extraction and remove dead imports
- Standardize all 18 tools to use get_unity_instance_from_context() helper
instead of direct ctx.get_state() calls for consistency
- Remove dead session_state imports from with_unity_instance decorator
that would cause ModuleNotFoundError at runtime
- Update README.md with concise instance routing documentation
* fix: critical timezone and import bugs from code review
- Remove incorrect port safety check that treated reclaimed ports as errors
(GetPortWithFallback may legitimately return same port if it became available)
- Fix timezone-aware vs naive datetime mixing in unity_connection.py sorting
(use timestamp() for comparison to avoid TypeError)
- Normalize all datetime comparisons in port_discovery.py to UTC
(file_mtime and last_heartbeat now consistently timezone-aware)
- Add missing send_with_unity_instance import in Server/tools/manage_script.py
(was causing NameError at runtime on lines 108 and 488)
All 88 tests pass (76 passed + 5 skipped + 7 xpassed)
---------
Co-authored-by: Sakura <sakurachan@qq.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-06 01:43:36 +08:00
### Working with Multiple Unity Instances
MCP for Unity supports multiple Unity Editor instances simultaneously. Each instance is isolated per MCP client session.
**To direct tool calls to a specific instance:**
1. List available instances: Ask your LLM to check the `unity_instances` resource
2. Set the active instance: Use `set_active_instance` with the instance name (e.g., `MyProject@abc123` )
3. All subsequent tools route to that instance until changed
**Example:**
```
User: "List all Unity instances"
LLM: [Shows ProjectA@abc123 and ProjectB@def456]
User: "Set active instance to ProjectA@abc123"
LLM: [Calls set_active_instance("ProjectA@abc123")]
User: "Create a red cube"
LLM: [Creates cube in ProjectA]
```
2025-04-09 09:14:25 +08:00
---
2025-09-05 23:32:00 +08:00
## Development & Contributing 🛠️
2025-07-30 04:07:21 +08:00
2025-10-24 12:50:29 +08:00
### Development Setup and Guidelines
2025-10-04 06:53:09 +08:00
2025-10-24 12:50:29 +08:00
See [README-DEV.md ](docs/README-DEV.md ) for complete development setup and workflow documentation.
2025-07-30 04:07:21 +08:00
2025-10-24 12:50:29 +08:00
### Adding Custom Tools
2025-07-30 04:07:21 +08:00
2025-10-24 12:50:29 +08:00
MCP for Unity uses a Python MCP Server tied with Unity's C# scripts for tools. If you'd like to extend the functionality with your own tools, learn how to do so in ** [CUSTOM_TOOLS.md ](docs/CUSTOM_TOOLS.md )**.
2025-04-09 09:14:25 +08:00
2025-10-24 12:50:29 +08:00
### How to Contribute
2025-04-09 09:14:25 +08:00
1. **Fork** the main repository.
2025-10-24 12:50:29 +08:00
2. **Create an issue** to discuss your idea or bug.
3. **Create a branch** (`feature/your-idea` or `bugfix/your-fix` ).
4. **Make changes.**
5. **Commit** (feat: Add cool new feature).
6. **Push** your branch.
7. **Open a Pull Request** against the main branch, referencing the issue you created earlier.
2025-04-09 09:14:25 +08:00
---
2025-09-05 00:09:34 +08:00
## 📊 Telemetry & Privacy
2025-10-11 16:01:51 +08:00
MCP for Unity includes **privacy-focused, anonymous telemetry** to help us improve the product. We collect usage analytics and performance data, but **never** your code, project names, or personal information.
2025-09-05 00:09:34 +08:00
- **🔒 Anonymous**: Random UUIDs only, no personal data
- **🚫 Easy opt-out**: Set `DISABLE_TELEMETRY=true` environment variable
2025-10-04 06:53:09 +08:00
- **📖 Transparent**: See [TELEMETRY.md ](docs/TELEMETRY.md ) for full details
2025-09-05 00:09:34 +08:00
Your privacy matters to us. All telemetry is optional and designed to respect your workflow.
---
2025-04-09 09:14:25 +08:00
## Troubleshooting ❓
< details >
< summary > < strong > Click to view common issues and fixes...< / strong > < / summary >
- **Unity Bridge Not Running/Connecting:**
- Ensure Unity Editor is open.
2025-08-21 03:59:49 +08:00
- Check the status window: Window > MCP for Unity.
2025-04-09 09:14:25 +08:00
- Restart Unity.
- **MCP Client Not Connecting / Server Not Starting:**
2025-09-05 23:32:00 +08:00
- **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:
```bash
cd /path/to/your/UnityMCP/UnityMcpServer/src
uv run server.py
```
2025-10-24 12:50:29 +08:00
- **Configuration Failed:**
- Use the Manual Configuration steps. The plugin may lack permissions to write to the MCP client's config file.
2025-04-09 09:14:25 +08:00
< / details >
2025-08-10 03:05:47 +08:00
Still stuck? [Open an Issue ](https://github.com/CoplayDev/unity-mcp/issues ) or [Join the Discord ](https://discord.gg/y4p8KfzrN4 )!
2025-04-09 09:14:25 +08:00
2025-07-14 14:01:25 +08:00
---
## License 📜
2025-08-10 03:05:47 +08:00
MIT License. See [LICENSE ](LICENSE ) file.
2025-07-14 14:01:25 +08:00
2025-04-09 09:14:25 +08:00
---
2025-08-10 03:05:47 +08:00
## Star History
2025-07-14 04:29:58 +08:00
2025-08-10 03:05:47 +08:00
[](https://www.star-history.com/#CoplayDev/unity-mcp& Date)
2025-07-14 04:29:58 +08:00
2025-10-10 00:02:21 +08:00
## Unity AI Tools by Coplay
2025-07-14 04:29:58 +08:00
2025-10-12 07:30:02 +08:00
Coplay offers 2 AI tools for Unity
2025-10-11 16:01:51 +08:00
- **MCP for Unity** is available freely under the MIT license.
- **Coplay** is a premium Unity AI assistant that sits within Unity and is more than the MCP for Unity.
2025-10-10 00:02:21 +08:00
2025-10-11 16:01:51 +08:00
(These tools have different tech stacks. See this blog post [comparing Coplay to MCP for Unity ](https://www.coplay.dev/blog/comparing-coplay-and-unity-mcp ).)
2025-10-04 10:22:19 +08:00
2025-10-24 12:50:29 +08:00
< img alt = "Coplay" src = "docs/images/coplay-logo.png" / >
2025-10-04 10:22:19 +08:00
## Disclaimer
This project is a free and open-source tool for the Unity Editor, and is not affiliated with Unity Technologies.