2025-10-23 06:54:29 +08:00
< img width = "676" height = "380" alt = "MCP for Unity" src = "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)
[](https://www.python.org)
[](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-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-04-09 09:14:25 +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 >
< summary > < strong > Available 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
2025-04-09 09:14:25 +08:00
* `read_console` : Gets messages from or clears the console.
* `manage_script` : Manages C# scripts (create, read, update, delete).
2025-09-05 23:32:00 +08:00
* `manage_editor` : Controls and queries the editor's state and settings.
2025-04-09 09:14:25 +08:00
* `manage_scene` : Manages scenes (load, save, create, get hierarchy, etc.).
* `manage_asset` : Performs asset operations (import, create, modify, delete, etc.).
2025-07-14 13:42:16 +08:00
* `manage_shader` : Performs shader CRUD operations (create, read, modify, delete).
2025-04-09 09:14:25 +08:00
* `manage_gameobject` : Manages GameObjects: create, modify, delete, find, and component operations.
2025-10-13 23:16:43 +08:00
* `execute_menu_item` : Executes Unity Editor menu items (e.g., "File/Save Project").
Claude‑friendly edit tools + framed transport + live Unity NL test framework (#243)
* CI: gate desktop-parity on Anthropic key; pass anthropic_api_key like NL suite
* Add quickprobe prompt and CI workflow (mcp-quickprobe.md, unity-mcp-quickprobe.yml)
* strictier tool use to prevent subagent spawning and force mcp tools
* update workflow filesto reduce likelihood of subagent spawning
* improve permissions for claude agent, fix mcpbridge timeout/token issue
* increase max turns to 10
* ci: align NL suite to new permissions schema; prevent subagent drift
* ci: NL suite -> mini prompt for e2e; add full NL/T prompt; server: ctx optional + project_root fallback; workflows: set UNITY_PROJECT_ROOT for CI
* ci: add checks:write; revert local project hardcodes (manifest, ProjectVersion.txt)
* tools: text-edit routing fixes (anchor_insert via text, CRLF calc); prompts: mini NL/T clarifications
* ci: use absolute UNITY_PROJECT_ROOT; prompts target TestProjects; server: accept relative UNITY_PROJECT_ROOT and bare spec URI
* ci: ignore Unity test project's packages-lock.json; remove from repo to avoid absolute paths
* CI: start persistent Unity Editor for MCP (guarded by license) + allow batch-mode bridge via UNITY_MCP_ALLOW_BATCH
* CI: hide license and pass via env to docker; fix invalid ref format
* CI: readiness probe uses handshake on Unity MCP port (deterministic)
* CI: fix YAML; use TCP handshake readiness probe (FRAMING=1)
* CI: prime Unity license via game-ci; mount ULF into container; extend readiness timeout
* CI: use ULF write + mount for Unity licensing; remove serial/email/pass from container
* CI: entitlement activation (UNITY_SERIAL=''); verify host ULF cache; keep mount
* CI: write ULF from secret and verify; drop entitlement activation step
* CI: detect any licensing path; GameCI prime; status dir env; log+probe readiness; fix YAML
* CI: add GameCI license prime; conditional ULF write; one-shot license validation; explicit status dir + license env
* CI: fix YAML (inline python), add Anthropic key detect via GITHUB_ENV; ready to run happy path
* CI: mount Unity token/ulf/cache dirs into container to share host license; create dirs before start
* CI: fix YAML indentation; write ULF on host; activate in container with shared mounts; mount .config and .cache too
* CI: gate Claude via outputs; mount all Unity license dirs; fix inline probe python; stabilize licensing flow
* CI: normalize detect to step outputs; ensure license dirs mounted and validated; fix indentation
* Bridge: honor UNITY_MCP_STATUS_DIR for heartbeat/status file (CI-friendly)
* CI: guard project path for activation/start; align tool allowlist; run MCP server with python; tighten secret scoping
* CI: finalize Unity licensing mounts + status dir; mode-detect (ULF/EBL); readiness logs+probe; Claude gating via outputs
* CI: fix YAML probe (inline python -c) and finalize happy-path Unity licensing and MCP/Claude wiring
* CI: inline python probe; unify Unity image and cache mounts; ready to test
* CI: fix docker run IMAGE placement; ignore cache find perms; keep same editor image
* CI: pass -manualLicenseFile to persistent Editor; keep mounts and single image
* CI: mount full GameCI cache to /root in persistent Unity; set HOME=/root; add optional license check
* CI: make -manualLicenseFile conditional; keep full /root mount and license check
* CI: set HOME=/github/home; mount GameCI cache there; adjust manualLicenseFile path; expand license check
* CI: EBL sign-in for persistent Unity (email/password/serial); revert HOME=/root and full /root mount; keep conditional manualLicenseFile and improved readiness
* CI: run full NL/T suite prompt (nl-unity-suite-full.md) instead of mini
* NL/T: require unified diffs + explicit verdicts in JUnit; CI: remove short sanity step, publish JUnit, upload artifacts
* NL/T prompt: require CDATA wrapping for JUnit XML fields; guidance for splitting embedded ]]>; keep VERDICT in CDATA only
* CI: remove in-container license check step; keep readiness and full suite
* NL/T prompt: add version header, stricter JUnit schema, hashing/normalization, anchors, statuses, atomic semantics, tool logging
* CI: increase Claude NL/T suite timeout to 30 minutes
* CI: pre-create reports dir and result files to avoid tool approval prompts
* CI: skip wait if container not running; skip Editor start if project missing; broaden MCP deps detection; expand allowed tools
* fixies to harden ManageScript
* CI: sanitize NL/T markdown report to avoid NUL/encoding issues
* revert breaking yyaml changes
* CI: prime license, robust Unity start/wait, sanitize markdown via heredoc
* Resolve merge: accept upstream renames/installer (fix/installer-cleanup-v2) and keep local framing/script-editing
- Restored upstream server.py, EditorWindow, uv.lock\n- Preserved ManageScript editing/validation; switched to atomic write + debounced refresh\n- Updated tools/__init__.py to keep script_edits/resources and adopt new logger name\n- All Python tests via uv: 7 passed, 6 skipped, 9 xpassed; Unity compile OK
* Fix Claude Desktop config path and atomic write issues
- Fix macOS path for Claude Desktop config: use ~/Library/Application Support/Claude/ instead of ~/.config/Claude/
- Improve atomic write pattern with backup/restore safety
- Replace File.Replace() with File.Move() for better macOS compatibility
- Add proper error handling and cleanup for file operations
- Resolves issue where installer couldn't find Claude Desktop config on macOS
* Editor: use macConfigPath on macOS for MCP client config writes (Claude Desktop, etc.). Fallback to linuxConfigPath only if mac path missing.
* Models: add macConfigPath to McpClient for macOS config path selection (fixes CS1061 in editor window).
* Editor: on macOS, prefer macConfigPath in ManualConfigEditorWindow (fallback to linux path); Linux/Windows unchanged.
* Fix McpClient: align with upstream/main, prep for framing split
* NL suite: shard workflow; tighten bridge readiness; add MCP preflight; use env-based shard vars
* NL suite: fix shard step indentation; move shard vars to env; remove invalid inputs
* MCP clients: split VSCode Copilot config paths into macConfigPath and linuxConfigPath
* Unity bridge: clean stale status; bind host; robust wait probe with IPv4/IPv6 + diagnostics
* CI: use MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect as executeMethod
* Action wiring: inline mcpServers in settings for all shards; remove redundant .claude/mcp.json step
* CI: embed mcpServers in settings for all shards; fix startup sanity step; lint clean
* CI: pin claude-code-base-action to e6f32c8; use claude_args --mcp-config; switch to allowed_tools; ensure MCP config per step
* CI: unpin claude-code-base-action to @beta (commit ref not found)
* CI: align with claude-code-base-action @beta; pass MCP via claude_args and allowedTools
* Editor: Fix apply_text_edits heuristic when edits shift positions; recompute method span on candidate text with fallback delta adjustment
* CI: unify MCP wiring across workflows; write .claude/mcp.json; switch to claude_args with --mcp-config/--allowedTools; remove unsupported inputs
* CI: collapse NL suite shards into a single run to avoid repeated test execution
* CI: minimize allowedTools for NL suite to essential Unity MCP + Bash("git:*") + Write
* CI: mkdir -p reports before run; remove unsupported --timeout-minutes from claude_args
* CI: broaden allowedTools to include find_in_file and mcp__unity__*
* CI: enable use_node_cache and switch NL suite model to claude-3-7-haiku-20250219
* CI: disable use_node_cache to avoid setup-node lockfile error
* CI: set NL suite model to claude-3-haiku-20240307
* CI: cap Haiku output with --max-tokens 2048 for NL suite
* CI: switch to claude-3-7-sonnet-latest and remove unsupported --max-tokens
* CI: update allowedTools to Bash(*) and explicit Unity MCP tool list
* CI: update NL suite workflow (latest tweaks)
* Tests: tighten NL suite prompt for logging, hash discipline, stale retry, evidence windows, diff cap, and VERDICT line
* Add disallowed tools to NL suite workflow
* docs: clarify stale write retry
* Add fallback JUnit report and adjust publisher
* Indent fallback JUnit XML in workflow
* fix: correct fallback JUnit report generation
* Update mcp-quickprobe.md
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* Update mcp-quickprobe.md
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* Update Response.cs
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* Update MCPForUnityBridge.cs
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* fix: correct McpTypes reference
* Add directory existence checks for symlink and XDG paths
* fix: only set installation flag after successful server install
* Update resource_tools.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* fix: respect mac config paths
* Use File.Replace for atomic config write
* Remove unused imports in manage_script
* bump server version
* Tests: update NL suite prompt and workflows; remove deprecated smoke/desktop-parity; quickprobe tidy
* Editor: atomic config write via File.Replace fallback; remove redundant backups and racey exists checks
* CI: harden NL suite - idempotent docker, gate on unity_ok, safer port probe, least-priv perms
* Editor: make atomic config write restoration safe (flag writeDone; copy-overwrite restore; cleanup in finally)
* CI: fix fallback JUnit heredoc by using printf lines (no EOF delimiter issues)
* CI: switch NL suite to mini prompt; mini prompt honors / and NL discipline
* CI: replace claude_args with allowed_tools/model/mcp_config per action schema
* CI: expand UNITY_PROJECT_ROOT via in MCP config heredoc
* EditorWindow: add cross-platform fallback for File.Replace; macOS-insensitive PathsEqual; safer uv resolve; honor macConfigPath
* CI: strengthen JUnit publishing for NL mini suite (normalize, debug list, publish both, fail_on_parse_error)
* CI: set job-wide JUNIT_OUT/MD_OUT; normalization uses env; publish references env and ungroup reports
* CI: publish a single normalized JUnit (reports/junit-for-actions.xml); fallback writes same; avoid checkName/reportPaths mismatch
* CI: align mini prompt report filenames; redact Unity log tail in diagnostics
* chore: sync workflow and mini prompt; redacted logs; JUnit normalization/publish tweaks
* CI: redact sensitive tokens in Stop Unity; docs: CI usage + edit tools
* prompts: update nl-unity-suite-full (mini-style setup + reporting discipline); remove obsolete prompts
* CI: harden NL workflows (timeout_minutes, robust normalization); prompts: unify JUnit suite name and reporting discipline
* prompts: add guarded write pattern (LF hash, stale_file retry) to full suite
* prompts: enforce continue-on-failure, driver flow, and status handling in full suite
* Make test list more explicit in prompt. Get rid of old test prompts for hygeine.
* prompts: add stale fast-retry (server hash) + in-memory buf guidance
* CI: standardize JUNIT_OUT to reports/junit-nl-suite.xml; fix artifact upload indentation; prompt copy cleanups
* prompts: reporting discipline — append-only fragments, batch writes, no model round-trip
* prompts: stale fast-retry preference, buffer/sha carry, snapshot revert, essential logging
* workflows(nl-suite): precreate report skeletons, assemble junit, synthesize markdown; restrict allowed_tools to append-only Bash + MCP tools
* thsis too
* Update README-DEV.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .github/workflows/claude-nl-suite-mini.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .github/workflows/claude-nl-suite.yml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* workflows(nl-mini): fix YAML indentation/trailing spaces under with: and cleanup heredoc spacing
* workflows(nl-suite): fix indentation on docker logs redaction line (YAML lint)
* Add write to allowlist
* nl-suite: harden reporting discipline (fragment-only writes, forbid alt paths); workflow: clean stray junit-*updated*.xml
* nl-suite: enforce end-of-suite single Write (no bash redirection); workflow: restrict allowed_tools to Write+MCP only
* prompts(nl-full): end-of-suite results must be valid XML with single <cases> root and only <testcase> children; no raw text outside CDATA
* workflows(nl-suite): make Claude step non-fatal; tolerant normalizer extracts <testcase> via regex on bad fragments
* nl-suite: fix stale classname to UnityMCP.NL-T in mini fallback; prompt: require re-read after every revert; correct PLAN/PROGRESS to 15
* nl-suite: fix fallback JUnit classname to UnityMCP.NL-T; prompt: forbid create_script and env/mkdir checks, enforce single baseline-byte revert flow and post-revert re-read; add corruption-handling guidance
* prompts(nl-full): after each write re-read raw bytes to refresh pre_sha; prefer script_apply_edits for anchors; avoid header/using changes
* prompts(nl-full): canonicalize outputs to /; allow small fragment appends via Write or Bash(printf/echo); forbid wrappers and full-file round-trips
* prompts(nl-full): finalize markdown formatting for guarded write, execution order, specs, status
* workflows(nl-suite, mini): header/lint fixes and constrained Bash append path; align allowed_tools
* prompts(nl-full): format Fast Restore, Guarded Write, Execution, Specs, Status as proper markdown lists and code fences
* workflows(nl-suite): keep header tidy and append-path alignment with prompt
* minor fix
* workflows(nl-suite): fix indentation and dispatch; align allowed_tools and revert helper
* prompts(nl-full): switch to read_resource for buf/sha; re-read only when needed; convert 'Print this once' to heading; note snapshot helper creates parent dirs
* workflows(nl-suite): normalize step removes bootstrap when real testcases present; recompute tests/failures
* workflows(nl-suite): enrich Markdown summary by extracting per-test <system-out> blocks (truncated)
* clarify prompt resilience instructions
* ci(nl-suite): revert prompt and workflow to known-good e0f8a72 for green run; remove extra MD details
* ci(nl-suite): minimal fixes — no-mkdir guard in prompt; drop bootstrap and recompute JUnit counts
* ci(nl-suite): richer JUnit→Markdown report (per-test system-out)
* Small guard to incorret asset read call.
* ci(nl-suite): refine MD builder — unescape XML entities, safe code fences, PASS/FAIL badges
* Update UnityMcpBridge/UnityMcpServer~/src/tools/resource_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .github/scripts/mark_skipped.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .github/scripts/mark_skipped.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .github/scripts/mark_skipped.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* server(manage_script): robust URI handling — percent-decode file://, normalize, strip host/leading slashes, return Assets-relative if present
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* tests(framing): reduce handshake poll window, nonblocking peek to avoid disconnect race; still enforce pre-handshake data drop
* tests(manage_script): add _split_uri tests for unity://path, file:// URLs (decoded/Assets-relative), and plain paths
* server+tests: fix handshake syntax error; robust file:// URI normalization in manage_script; add _split_uri tests; adjust stdout scan to ignore venv/site-packages
* bridge(framing): accept zero-length frames (treat as empty keepalive)
* tests(logging): use errors='replace' on decode fallback to avoid silent drops
* resources(list): restrict to Assets/, resolve symlinks, enforce .cs; add traversal/outside-path tests
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* misc: framing keepalive (zero-length), regex preview consistency, resource.list hardening, URI parsing, legacy update routing, test cleanups
* docs(tools): richer MCP tool descriptions; tests accept decorator kwargs; resource URI parsing hardened
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/UnityMcpServer~/src/tools/resource_tools.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/UnityMcpServer~/src/unity_connection.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* net+docs: hard-reject zero-length frames; TCP_NODELAY on connect; Assets detection case-insensitive; NL prompt statuses aligned
* prompt(nl-suite): constrain Write destinations under reports/, forbid traversal
* prompt+net: harden Write path rules; use monotonic deadline and plain-text advisory for non-framed peers
* unity_connection: restore recv timeout via try/finally; make global connection getter thread-safe with module lock and double-checked init
* NL/T prompt: pin structured edit ops for T-D/T-E; add schema-error guarded write behavior; keep existing path/URI and revert rules
* unity_connection: add FRAMED_MAX; use ValueError for framed length violations; lower framed receive log to debug; serialize connect() with per-instance lock
* ManageScript: use UTF8Encoding(without BOM) for atomic writes in ApplyTextEdits/EditScript to align with Create/Update and avoid BOM-related diffs/hash mismatches
* NL/T prompt: make helper deletion regex multiline-safe ((?ms) so ^ anchors line starts)
* ManageScript: emit structured overlap status {status:"overlap"} for overlapping edit ranges in apply_text_edits and edit paths
* NL/T prompt: clarify fallback vs failure — fallback only for unsupported/missing_field; treat bad_request as failure; note unsupported after fallback as failure
* NL/T prompt: pin deterministic overlap probe (apply_text_edits two ranges from same snapshot); gate too_large behind RUN_TOO_LARGE env hint
* TB update
* NL/T prompt: harden Output Rules — constrain Bash(printf|echo) to stdout-only; forbid redirection/here-docs/tee; only scripts/nlt-revert.sh may mutate FS
* Prompt: enumerate allowed script_apply_edits ops; add manage_editor/read_console guidance; fix T‑F atomic batch to single script_apply_edits. ManageScript: regex timeout for diagnostics; symlink ancestor guard; complete allowed-modes list.
* Fixes
* ManageScript: add rich overlap diagnostics (conflicts + hint) for both text range and structured batch paths
* ManageScript: return structured {status:"validation_failed"} diagnostics in create/update/edits and validate before commit
* ManageScript: echo canonical uri in responses (create/read/update/apply_text_edits/structured edits) to reinforce resource identity
* improve clarity of capabilities message
* Framing: allow zero-length frames on both ends (C# bridge, Python server). Prompt: harden T-F to single text-range apply_text_edits batch (descending order, one snapshot). URI: normalize file:// outside Assets by stripping leading slash.
* ManageScript: include new sha256 in success payload for apply_text_edits; harden TryResolveUnderAssets by rejecting symlinked ancestors up to Assets/.
* remove claudetest dir
* manage_script_edits: normalize method-anchored anchor_insert to insert_method (map text->replacement); improves CI compatibility for T‑A/T‑E without changing Editor behavior.
* tighten testing protocol around mkdir
* manage_script: validate create_script inputs (Assets/.cs/name/no traversal); add Assets/ guard to delete_script; validate level+Assets in validate_script; make legacy manage_script optional params; harden legacy update routing with base64 reuse and payload size preflight.
* Tighten prompt for testing
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/Editor/Tools/ManageScript.cs
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* manage_script_edits: honor ignore_case on anchor_insert and regex_replace in both direct and text-conversion paths (MULTILINE|IGNORECASE).
* remove extra file
* workflow: use python3 for inline scripts and port detection on ubuntu-latest.
* Tighten prompt + manage_script
* Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/UnityMcpServer~/src/tools/manage_script_edits.py
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update UnityMcpBridge/Editor/Tools/ManageScript.cs
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update .claude/prompts/nl-unity-suite-full.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* manage_script: improve file:// UNC handling; preserve POSIX absolute semantics internally; keep test-expected slash stripping for non-Assets paths.
* ManageScript.cs: add TimeSpan timeouts to all Regex uses (IsMatch/Match/new Regex) and keep CultureInvariant/Multiline options; reduces risk of catastrophic backtracking stalls.
* workflow: ensure reports/ exists in markdown build step to avoid FileNotFoundError when writing MD_OUT.
* fix brace
* manage_script_edits: expand backrefs for regex_replace in preview->text conversion and translate to \g<n> in local apply; keeps previews and actual edits consistent.
* anchor_insert: default to position=after, normalize surrounding newlines in Python conversion paths; C# path ensures trailing newline and skips duplicate insertion within class.
* feat(mcp): add get_sha tool; apply_text_edits normalization+overlap preflight+strict; no-op evidence in C#; update NL suite prompt; add unit tests
* feat(frames): accept zero-length heartbeat frames in client; add heartbeat test
* feat(edits): guard destructive regex_replace with structural preflight; add robust tests; prompt uses delete_method for temp helper
* feat(frames): bound heartbeat loop with timeout/threshold; align zero-length response with C#; update test
* SDK hardening: atomic multi-span text edits; stop forcing sequential for structured ops; forward options on apply_text_edits; add validate=relaxed support and scoped checks; update NL/T prompt; add tests for options forwarding, relaxed mode, and atomic batches
* Router: default applyMode=atomic for multi-span apply_text_edits; add tests
* CI prompt: pass options.validate=relaxed for T-B/C; options.applyMode=atomic for T-F; emphasize always writing testcase and restoring on errors
* Validation & DX: add validate=syntax (scoped), standardize evidence windows; early regex compile with hints; debug_preview for apply_text_edits
* Update UnityMcpBridge/Editor/Windows/MCPForUnityEditorWindow.cs
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* NL/T suite-driven edits: LongUnityScriptClaudeTest, bridge helpers, server_version; prepare framing tests
* Fix duplicate macConfigPath field in McpClient to resolve CS0102
* Editor threading: run EnsureServerInstalled on main thread; marshal EditorPrefs/DeleteKey + logging via delayCall
* Docs(apply_text_edits): strengthen guidance on 1-based positions, verify-before-edit, and recommend anchors/structured edits
* Docs(script_apply_edits): add safety guidance (anchors, method ops, validators) and recommended practices
* Framed VerifyBridgePing in editor window; docs hardening for apply_text_edits and script_apply_edits
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-31 00:55:38 +08:00
* `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.
2025-04-09 09:14:25 +08:00
< / details >
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-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-08-21 03:59:49 +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-04-09 09:14:25 +08:00
* **Python:** Version 3.12 or newer. [Download Python ](https://www.python.org/downloads/ )
2025-08-15 06:13:21 +08:00
* **Unity Hub & Editor:** Version 2021.3 LTS or newer. [Download Unity ](https://unity.com/download )
2025-09-06 00:15:54 +08:00
* **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-09-05 23:32:00 +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-07-24 11:31:47 +08:00
* < details > < summary >< strong > [Optional] Roslyn for Advanced Script Validation</ strong ></ summary >
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-04-09 09:14:25 +08:00
1. Open your Unity project.
2. Go to `Window > Package Manager` .
3. Click `+` -> `Add package from git URL...` .
4. Enter:
```
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
```
5. Click `Add` .
2025-08-21 03:59:49 +08:00
6. The MCP server is installed automatically by the package on first run or via Auto-Setup. If that fails, use Manual Configuration (below).
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-09-05 23:32:00 +08:00
1. Install the [OpenUPM CLI ](https://openupm.com/docs/getting-started-cli.html )
2025-08-15 06:18:33 +08:00
2. Open a terminal (PowerShell, Terminal, etc.) and navigate to your Unity project directory
3. Run `openupm add com.coplaydev.unity-mcp`
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-21 03:59:49 +08:00
< img width = "648" height = "599" alt = "MCPForUnity-Readme-Image" src = "https://github.com/user-attachments/assets/b4a725da-5c43-4bd6-80d6-ee2e3cca9596" / >
2025-07-14 13:42:16 +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-08-21 03:59:49 +08:00
1. In Unity, go to `Window > MCP for Unity` .
2025-08-10 06:38:11 +08:00
2. Click `Auto-Setup` .
2025-09-05 23:32:00 +08:00
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-09-05 23:32:00 +08:00
1. **Find your MCP Client's configuration file.** (Check client documentation).
2025-04-09 09:14:25 +08:00
* *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.
< 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:
🚨**make sure to run these from your Unity project's home directory**🚨
**macOS:**
```bash
claude mcp add UnityMCP -- uv --directory /Users/USERNAME/Library/AppSupport/UnityMCP/UnityMcpServer/src run server.py
```
**Windows:**
```bash
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
```
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.
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
---
2025-09-05 23:32:00 +08:00
## Development & Contributing 🛠️
2025-07-30 04:07:21 +08:00
2025-10-04 06:53:09 +08:00
### Adding Custom Tools
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 )**.
### Contributing to the Project
2025-07-30 04:07:21 +08:00
2025-09-05 23:32:00 +08:00
If you're contributing to MCP for Unity or want to test core changes, we have development tools to streamline your workflow:
2025-07-30 04:07:21 +08:00
2025-08-21 03:59:49 +08:00
- **Development Deployment Scripts**: Quickly deploy and test your changes to MCP for Unity Bridge and Python Server
2025-07-30 04:07:21 +08:00
- **Automatic Backup System**: Safe testing with easy rollback capabilities
- **Hot Reload Workflow**: Fast iteration cycle for core development
2025-10-04 06:53:09 +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
### Contributing 🤝
2025-04-09 09:14:25 +08:00
2025-08-21 03:59:49 +08:00
Help make MCP for Unity better!
2025-04-09 09:14:25 +08:00
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.
2025-08-10 03:05:47 +08:00
6. **Open a Pull Request** against the main branch.
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-04-09 09:14:25 +08:00
- **Auto-Configure Failed:**
2025-09-05 23:32:00 +08:00
- Use the Manual Configuration steps. Auto-configure might 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
## Disclaimer
This project is a free and open-source tool for the Unity Editor, and is not affiliated with Unity Technologies.