A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
local, dockerized, Unity MCP server written in C#
The C# implementation of Model Context Protocol for Unity Editor
Unity MCP Sharp is a production-ready MCP server that enables AI assistants (Claude, Cursor, etc.) to directly interact with Unity Editor. Built with .NET 9.0 and the official MCP C# SDK, it provides 34 powerful tools for game development automation including scene manipulation, GameObject creation, prefab management, asset management, and real-time play mode control.
🚀 Quick Start • 📦 Installation • 🛠️ MCP Tools • 📖 Docs • ❓ Issues
| Category | Tools & Resources |
|---|---|
| Resources (Read-Only) | Project info, console logs, compilation status, play mode, active scene, scene objects, all scenes |
| Multi-Editor | List connected editors, select editor for session |
| Console & Compilation | Trigger compilation, refresh assets |
| GameObjects | Create, find, batch create, add components, set component fields, list scene objects |
| Scenes | List, open, close, save, get/set active scene |
| Assets | Create scripts, create assets with complex structures (ScriptableObjects, Materials, etc.) |
| Play Mode | Enter, exit, get play mode state |
| System | Run any Unity menu item programmatically |
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ AI Assistant │ │ Unity Editor │ │ Unity Package │
│ (IDE/LLM) │◄────────┤ │◄────────┤ (OpenUPM) │
└────────┬────────┘ MCP │ │ Editor └────────┬────────┘
│ (HTTP) │ │ API │
│ └──────────────────┘ │
│ │
│ │
└────────────────┐ ┌─────────────────┘
│ │
▼ ▼ WebSocket
┌──────────────────────────────┐
│ Unity MCP Server │
│ (Docker Container) │
│ ┌────────────────────┐ │
│ │ ASP.NET Core │ │
│ │ - HTTP Endpoint │ │
│ │ - WebSocket │ │
│ │ - JSON-RPC 2.0 │ │
│ └────────────────────┘ │
└──────────────────────────────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ MCP Session │ │ MCP Session │ │ MCP Session │
│ A │ │ B │ │ C │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬────────┴────────┬────────┘
│ │
▼ ▼
┌─────────────────────────────┐
│ MCP Server │
│ ┌───────────────────────┐ │
│ │ EditorSessionManager │ │ Session → Editor Mapping
│ │ McpSessionMiddleware │ │ AsyncLocal Context
│ └───────────────────────┘ │
└─────────────────────────────┘
│ │ │
┌────────┘ │ └────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│Unity Editor 1│ │Unity Editor 2│ │Unity Editor 3│
│ ProjectA │ │ ProjectB │ │ ProjectC │
│ SceneX │ │ SceneY │ │ SceneZ │
└──────────────┘ └──────────────┘ └──────────────┘
Tools → Unity MCP Server → Setup WizardTools → Unity MCP Server → Dashboard✅ Done! You're ready to use AI assistants with Unity.
openupm add com.mezookan.unity-mcp-sharp
+ → "Add package from git URL..."https://github.com/Abbabon/unity-mcp-sharp.gitAdd to Packages/manifest.json:
{
"dependencies": {
"com.mezookan.unity-mcp-sharp": "https://github.com/Abbabon/unity-mcp-sharp.git"
}
}
Install Docker Desktop (if not already installed)
Open the Setup Wizard
Tools → Unity MCP Server → Setup WizardStart the Server
Tools → Unity MCP Server → DashboardVerify Connection
Add to your project's .mcp.json file in the project root:
{
"mcpServers": {
"unity": {
"url": "http://localhost:3727/mcp"
}
}
}
Or add globally to ~/.claude.json:
{
"mcpServers": {
"unity": {
"url": "http://localhost:3727/mcp"
}
}
}
Tip: After adding the configuration, restart Claude Code or use /mcp to verify the server is connected.
Add to .vscode/settings.json:
{
"mcpServers": {
"unity": {
"url": "http://localhost:3727/mcp",
"transport": "sse"
}
}
}
Add to ~/.cursor/config.json:
{
"mcpServers": {
"unity": {
"url": "http://localhost:3727/mcp",
"transport": "sse"
}
}
}
Add to your Claude Desktop MCP configuration:
{
"mcpServers": {
"unity": {
"url": "http://localhost:3727/mcp",
"transport": "sse"
}
}
}
All tools are designed for optimal LLM interaction with confirmation messages, tool chaining hints, and side effect warnings.
New in v0.4: Resources are read-only, application-controlled data sources that provide fresh data on each access. They reduce LLM cognitive load by separating read operations from action-based tools.
unity://project/infoUnity project metadata including name, version, active scene, paths, and editor state.
Returns: Project information with name, Unity version, active scene, data path, play/pause state
💡 Tip: Use this first when starting work on a project to understand the environment.
🔄 Updates: Automatically when scenes change or play mode changes
unity://console/logsRecent console logs from Unity Editor (errors, warnings, debug logs).
Returns: Console logs with type, message, and stack traces
💡 Tip: Check this after creating scripts, entering play mode, or when compilation fails.
🔄 Updates: Automatically when new log messages appear
unity://compilation/statusCurrent compilation status and last compilation result.
Returns: Compilation status (idle/compiling) and success/failure state
🔗 Related: unity_trigger_script_compilation
🔄 Updates: Automatically when compilation starts or finishes
unity://editor/playmodeCurrent play mode state of Unity Editor.
Returns: Play mode state (Playing, Paused, or Stopped)
🔗 Related: unity_enter_play_mode, unity_exit_play_mode
🔄 Updates: Automatically when play mode changes
unity://scenes/activeInformation about the currently active Unity scene.
Returns: Scene name, path, isDirty status, root GameObject count, loaded state
💡 Tip: If isDirty is true, use unity_save_scene to save changes.
🔄 Updates: Automatically when active scene changes or scenes are loaded
unity://scenes/active/objectsComplete GameObject hierarchy of the active scene.
Returns: Hierarchical list with active/inactive state indicators
🔗 Related: unity_find_game_object, unity_create_game_object
🔄 Updates: Automatically when scenes change
unity://scenes/allList of all .unity scene files in the project.
Returns: List of scene paths relative to project root
🔗 Related: unity_open_scene, unity_get_active_scene
🔄 Updates: When asset database refreshes
unity_trigger_script_compilationForce Unity to recompile all C# scripts.
Returns: Confirmation that compilation was triggered
⚠️ Note: Unity temporarily disconnects during compilation. Use unity://compilation/status resource after to verify success.
unity_create_game_objectCreate a new GameObject in the currently active scene.
Parameters:
name (string, required): GameObject namex, y, z (float, default: 0): World positioncomponents (string, optional): Comma-separated components (e.g., "Rigidbody,BoxCollider")parent (string, optional): Parent GameObject nameReturns: Confirmation with name, position, components, and hierarchy location
📌 Example: Create a "Player" at position (0, 1, 0) with Rigidbody and CapsuleCollider
🔗 Related: unity_find_game_object, unity_add_component_to_object
unity_find_game_objectFind a GameObject by name, tag, or path with detailed information.
Parameters:
name (string, required): GameObject namesearchBy (string, default: "name"): Search mode: "name", "tag", or "path"Returns: Position, rotation, scale, active state, and all attached components
🔗 Related: unity_list_scene_objects, unity_add_component_to_object
unity_add_component_to_objectAdd a component to an existing GameObject.
Parameters:
gameObjectName (string, required): Target GameObjectcomponentType (string, required): Component type (e.g., "Rigidbody", "BoxCollider", custom scripts)Returns: Confirmation that component was added
💡 Tip: Use unity_find_game_object first to verify the GameObject exists.
unity_set_component_fieldSet a field or property value on a component attached to a GameObject.
Parameters:
gameObjectName (string, required): Name of the GameObject with the componentcomponentType (string, required): Type of the component (e.g., "Transform", "Rigidbody", custom scripts)fieldName (string, required): Field or property name to set (e.g., "enabled", "mass", "config")value (string, required): Value to set (primitive, asset path, or GameObject name)valueType (string, default: "string"): Type of value: "string", "int", "float", "bool", "asset", "gameObject"Returns: Confirmation that field was set
📌 Example: Set ScriptableObject reference: valueType: "asset", value: "Assets/Config/MyConfig.asset"
🔗 Related: unity_find_game_object, unity_add_component_to_object
unity_list_scene_objectsGet the complete GameObject hierarchy of the active scene.
Returns: Hierarchical list with active/inactive state indicators
🔗 Related: unity_find_game_object, unity_create_game_object
unity_batch_create_game_objectsCreate multiple GameObjects in a single operation (more efficient than one-by-one).
Parameters:
gameObjectsJson (string, required): JSON array of GameObject specsReturns: Confirmation that batch creation was initiated
unity_create_game_object_in_sceneCreate a GameObject in a specific scene (not necessarily the active one).
Parameters:
scenePath (string, required): Scene path (e.g., "Scenes/Level1.unity")name, x, y, z, components, parent: Same as unity_create_game_objectReturns: Confirmation with scene path, name, and position
⚠️ Note: If scene is not loaded, it will be opened additively first.
unity_create_prefabCreate a prefab asset from an existing GameObject in the scene.
Parameters:
gameObjectName (string, required): Name of the GameObject to convert to prefabassetFolderPath (string, required): Path within Assets folder (e.g., "Prefabs", "Prefabs/Characters")prefabName (string, optional): Name for the prefab file (defaults to GameObject name)createVariant (bool, default: false): Create a prefab variant instead of regular prefabReturns: Confirmation with prefab path and source GameObject name
📌 Example: Convert "Player" GameObject to prefab in Assets/Prefabs/Characters/Player.prefab
🔗 Related: unity_find_game_object, unity_get_prefab_info, unity_instantiate_prefab
💡 Tip: Use unity_find_game_object first to verify the GameObject exists. Folder will be created if it doesn't exist.
unity_instantiate_prefabInstantiate (spawn) a prefab into the currently active scene.
Parameters:
prefabPath (string, required): Path to prefab relative to Assets folder (e.g., "Prefabs/Character.prefab")x, y, z (float, default: 0): World positionrotationX, rotationY, rotationZ (float, default: 0): Euler angles rotationscaleX, scaleY, scaleZ (float, default: 1): Scale multipliersparent (string, optional): Parent GameObject nameinstanceName (string, optional): Custom name for the spawned instanceReturns: Confirmation with instance name, position, and prefab source path
📌 Example: Spawn "Enemy" prefab at (10, 0, 5) with 90° Y rotation
🔗 Related: unity_find_game_object, unity_list_scene_objects
💡 Tip: Instances maintain connection to prefab asset and can receive updates when prefab is modified.
unity_get_prefab_infoGet detailed information about a GameObject's prefab status and relationships.
Parameters:
gameObjectNameOrPath (string, required): GameObject name in scene or prefab asset pathReturns: JSON object with prefab information:
isPrefabAsset: Is this a prefab asset fileisPrefabInstance: Is this a prefab instance in a sceneisPrefabVariant: Is this a prefab variantassetPath: Path to the prefab assetisModified: Does the instance have overridesprefabInstanceStatus: Connection status to source prefab📌 Example: Check if "Player" is a prefab instance with modifications
🔗 Related: unity_create_prefab, unity_open_prefab
💡 Tip: Use this before unity_open_prefab to understand prefab relationships.
unity_open_prefabOpen a prefab asset in Prefab Mode (isolation mode) for editing.
Parameters:
prefabPath (string, required): Path to prefab relative to Assets folderinContext (bool, default: false): Open in Context mode (shows scene context) vs. Isolation modeReturns: Confirmation with prefab path and mode information
📌 Example: Open "Assets/Prefabs/Enemy.prefab" in isolation mode for editing
🔗 Related: unity_save_prefab, unity_close_prefab_stage
⚠️ Important: Only one prefab can be open in Prefab Mode at a time. Close current prefab before opening another.
💡 Tip: Use Isolation mode for focused editing, Context mode to see how prefab fits in scene.
unity_save_prefabSave changes made to a prefab currently open in Prefab Mode.
Parameters:
prefabPath (string, optional): Specific prefab to save (if not provided, saves currently open prefab)Returns: Confirmation indicating what was saved
📌 Example: Save modifications to the currently open prefab
🔗 Related: unity_open_prefab, unity_close_prefab_stage
⚠️ Important: Always call this after making changes in Prefab Mode to ensure changes are not lost.
💡 Tip: Can also apply overrides from prefab instances back to the source prefab asset.
unity_close_prefab_stageClose the currently open Prefab Mode and return to scene editing.
Parameters:
saveBeforeClosing (bool, default: true): Save prefab before closing (false discards unsaved changes)Returns: Confirmation indicating the Prefab Stage was closed
📌 Example: Close prefab editing mode and save changes
🔗 Related: unity_open_prefab, unity_save_prefab
⚠️ Important: Unsaved changes will be lost if saveBeforeClosing is false. Must close before opening another prefab.
💡 Tip: Set saveBeforeClosing to true (default) to avoid losing work.
unity_list_scenesList all .unity scene files in the project.
Returns: List of scene paths relative to project root
🔗 Related: unity_open_scene, unity_get_active_scene
unity_get_active_sceneGet information about the currently active scene.
Returns: Scene name, path, isDirty status, root GameObject count, loaded state
💡 Tip: Use unity_save_scene if isDirty is true to save changes.
unity_open_sceneOpen a Unity scene by path.
Parameters:
scenePath (string, required): Path relative to Assets folderadditive (bool, default: false): Keep other scenes open if trueReturns: Confirmation with scene path and mode (single/additive)
🔗 Related: unity_list_scenes, unity_get_active_scene
unity_close_sceneClose a specific scene (only works with multiple scenes open).
Parameters:
sceneIdentifier (string, required): Scene name or pathReturns: Confirmation that scene was closed
⚠️ Note: Cannot close the last open scene.
unity_save_sceneSave the active scene or a specific scene.
Parameters:
scenePath (string, optional): Specific scene to save (null = active)saveAll (bool, default: false): Save all open scenesReturns: Confirmation of which scene(s) were saved
⚠️ Important: Always save after making changes, otherwise they'll be lost!
unity_set_active_sceneSet which scene is active (where new GameObjects are created).
Parameters:
sceneIdentifier (string, required): Scene name or pathReturns: Confirmation that scene is now active
⚠️ Note: Only works when multiple scenes are open.
unity_create_scriptCreate a new C# MonoBehaviour script file.
Parameters:
scriptName (string, required): Script name (without .cs)folderPath (string, required): Path within Assets (e.g., "Scripts/Player")scriptContent (string, required): Full C# class codeReturns: Confirmation with file path and recompilation notice
🔗 Related: unity_get_compilation_status, unity_get_console_logs
unity_create_assetCreate any type of Unity asset with support for complex nested structures using SerializedObject API.
Parameters:
assetName (string, required): Asset name (without extension)folderPath (string, required): Path within AssetsassetTypeName (string, required): Full type name (e.g., "UnityEngine.Material", custom ScriptableObject)propertiesJson (string, optional): JSON properties to set (supports nested objects, arrays, Lists)Returns: Confirmation with asset name, type, and path
✨ New in v0.4: Enhanced with SerializedObject support for complex nested structures!
📌 Example properties:
{"shader":"Standard","color":"#FF0000"}{"width":256,"height":256}{
"primitives": [
{
"primitiveType": 0,
"position": {"x": 0, "y": 0, "z": 0},
"color": {"r": 1, "g": 0, "b": 0, "a": 1},
"scale": {"x": 1, "y": 1, "z": 1}
}
]
}
🎯 Supported Unity types: Vector3, Vector2, Color, Quaternion, Bounds, Rect, asset references, and more!
🔗 Related: unity_refresh_assets
unity_refresh_assetsRefresh Unity Asset Database to detect file changes.
Returns: Confirmation that refresh was initiated
💡 Use after: Batch file operations or when changes aren't detected automatically
⚠️ Note: Can take a few seconds for large projects. Use unity_get_compilation_status to check if recompilation is complete.
unity_enter_play_modeEnter Unity play mode (start running the game).
Returns: Confirmation message with important warning
⚠️ IMPORTANT: Changes made in play mode are NOT saved! GameObjects created will be destroyed when exiting.
🔗 Related: unity_get_play_mode_state, unity_exit_play_mode
unity_exit_play_modeExit Unity play mode (stop running the game).
Returns: Confirmation that play mode was exited
⚠️ Note: All changes made during play mode will be reverted.
unity_get_play_mode_stateGet current play mode state.
Returns: Current state (Playing, Paused, or Stopped)
🔗 Related: unity_enter_play_mode, unity_exit_play_mode
unity_run_menu_itemExecute any Unity Editor menu item by its path.
Parameters:
menuPath (string, required): Full menu path (e.g., "GameObject/Create Empty", "Edit/Undo")Returns: Confirmation that menu item was executed
💡 Use as: Fallback for operations not covered by dedicated tools
📌 Examples:
"GameObject/Create Empty""Edit/Undo""Assets/Refresh"unity_bring_editor_to_foregroundBring the Unity Editor window to the foreground.
Returns: Confirmation that the foreground request was sent
💡 Note: Most MCP operations automatically bring Unity to foreground when the "Auto Bring to Foreground" setting is enabled (default: on). Use this tool explicitly if auto-focus is disabled or you need to ensure Unity is visible before a series of operations.
🔧 Platform Support: Windows (SetForegroundWindow) and macOS (NSApplication.activate). Linux is not currently supported for auto-focus.
docker pull ghcr.io/abbabon/unity-mcp-server:latest
docker run -d \
--name unity-mcp-server \
-p 3727:3727 \
--restart unless-stopped \
ghcr.io/abbabon/unity-mcp-server:latest
| Tag | Description |
|---|---|
latest | Latest stable version from main branch |
v*.*.* | Specific version tags (e.g., v0.3.2) |
main | Latest build from main branch |
The project includes convenience scripts in Scripts~/:
# Build server + Docker image
./Scripts~/rebuild.sh
# Start MCP server container
./Scripts~/start-mcp-server.sh
# Run smoke tests
./Scripts~/test.sh
cd Server~
# Restore dependencies
dotnet restore
# Build
dotnet build
# Run locally
dotnet run
# Build Docker image (or use ./Scripts~/rebuild.sh)
docker build -t unity-mcp-server:test .
# Run with docker-compose
docker-compose up
The package is structured as a Unity UPM package:
.
├── Runtime/ # Runtime scripts (MCPClient, MCPServerManager)
├── Editor/ # Editor scripts (Dashboard, Integration, Menu Items)
├── Documentation~/ # User documentation (excluded from package)
├── Scripts~/ # Development scripts (excluded from package)
├── Server~/ # MCP server (excluded from package)
├── TestProject~/ # Test Unity project (excluded from package)
└── package.json # UPM manifest
Note: Directories with ~/ suffix are excluded from Unity package imports.
Access configuration via Tools → Unity MCP Server → Create MCP Configuration or through the Dashboard.
| Setting | Default | Description |
|---|---|---|
| Server URL | ws://localhost:3727/ws | WebSocket connection URL |
| Docker Image | ghcr.io/abbabon/unity-mcp-server:latest | Docker image to use |
| Auto-connect | true | Connect automatically on startup |
| Auto-start | false | Start container automatically |
| Auto Bring to Foreground | true | Automatically bring Unity to foreground when MCP operations require it |
| Tool Profile | Standard | Controls which MCP tools are exposed: Minimal (12), Standard (20), Full (28) |
| Retry Attempts | 3 | Connection retry attempts |
| Retry Delay | 2000ms | Delay between retries |
| Verbose Logging | false | Enable detailed logs |
| Max Log Buffer | 1000 | Maximum log entries to keep |
Tool profiles help reduce token usage by exposing only the MCP tools you need. Configure via the Dashboard Settings tab.
| Profile | Tools | Description |
|---|---|---|
| Minimal | 12 | Core tools for basic workflows (create, query, play mode) |
| Standard | 20 | Common tools including component manipulation and asset creation |
| Full | 28 | All tools including batch operations and multi-editor features |
Minimal Profile includes:
unity_get_project_info, unity_list_scene_objects, unity_find_game_objectunity_create_game_object, unity_delete_game_objectunity_create_script, unity_get_compilation_status, unity_get_console_logsunity_enter_play_mode, unity_exit_play_modeunity_open_scene, unity_save_sceneStandard Profile adds:
unity_add_component_to_object, unity_set_component_fieldunity_create_asset, unity_refresh_assets, unity_trigger_script_compilationunity_get_active_scene, unity_list_scenes, unity_get_play_mode_stateFull Profile adds:
unity_batch_create_game_objectsunity_create_game_object_in_scene, unity_close_scene, unity_set_active_sceneunity_list_editors, unity_select_editorunity_run_menu_item, unity_bring_editor_to_foregroundTo apply profile changes:
This is required because Cursor caches the tool list. Profile is stored per-project in MCPConfiguration.asset.
Solution: Install Docker Desktop and ensure it's running.
Download from docker.com
Possible causes:
Check logs:
docker logs unity-mcp-server
Or use the Logs tab in the Unity MCP Dashboard.
The package will automatically pull the image on first start. If this fails:
# Manually pull the image
docker pull ghcr.io/abbabon/unity-mcp-server:latest
Solution: The package automatically checks common Docker paths on macOS:
/usr/local/bin/docker (Docker Desktop)/opt/homebrew/bin/docker (Homebrew on Apple Silicon)/usr/bin/docker (Standard location)If still not found, ensure Docker Desktop is installed and running.
Starting with Unity 6.3, the Package Manager displays signature warnings for unsigned packages. This is informational only - the package still works correctly.
Options:
.tgz from GitHub Releases (if available)For more troubleshooting help, see the Troubleshooting Guide.
Contributions are welcome! Please:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)The project includes comprehensive GitHub Actions workflows:
# Update version in package.json
# Commit changes
git add package.json
git commit -m "Bump version to 1.0.0"
# Create and push tag
git tag v1.0.0
git push origin main --tags
This triggers the full CI/CD pipeline.
MIT License - see LICENSE file for details.
Thanks to these wonderful people who have contributed to this project!
Built with:
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
MCP server integration for DaVinci Resolve Studio
A Jetbrains IDE IntelliJ plugin aimed to provide coding agents the ability to leverage intelliJ's indexing of the codeba