Repository navigation
Releases
v2.36.0 — Unity 6.6 modernization and maintenance audit
Companion to plugin v2.41.0. Released plugins keep working: features are negotiated through capabilities, and published tool schemas keep their required arguments.
🧭 Unity 6.6 modernization
- Unity 6.6 workflows, multi-project agent routing, multiplayer orchestration (MPPM, ParrelSync) and observable editor queues.
- Paginated test results, build workflows, request cancellation and response budgets.
- Stricter editor discovery: a port is adopted only when its ping proves a Unity bridge (#39).
🔒 Security
unity_advanced_toolno longer runs core tools that change the editor (execute code, menu items, scripts, packages, builds, Undo...): call them directly so your client's per-tool approval applies. Read-only core tools are still proxied.- Malformed proxied tool names are rejected instead of reaching arbitrary local paths.
🛠 Fixes
- Plugin-only tools no longer vanish from
unity_list_advanced_toolsafter the first call, and undispatchable names are no longer advertised. - When another registered editor is busy, you are asked to choose instead of being routed to the only responsive one.
unity_testing_run_testskeeps the started job ID and honours itsfilteralias.- Terrain, animation, profiler, prefab and UMA arguments are translated to the keys the plugin reads (several were silently ignored);
overwriteandlimitoptions added.
⚡ Performance
- Faster lookups in the advanced catalog, lighter test-job polling, queue status polls capped at 500 ms.
- The npm package shrinks from 13.5 MB to about 107 kB.
📦 Install
npx anklebreaker-unity-mcp@latest
Verification
293/293 tests, CI green on Node 18, 20, 22 and 24 on Windows and Linux.
Full changelog: CHANGELOG.md
v2.35.6 — object-reference animation curves (2D sprite animation)
Companion to plugin v2.39.5.
🎬 2D sprite animation now works through the MCP (thanks @VM233, #30)
Animating SpriteRenderer.m_Sprite requires an object-reference curve. unity_animation_set_clip_curve goes through AnimationCurve, which can only express float values — so sprite-frame animation had no route through the MCP at all, and had to be hand-written as .anim YAML. That's fragile across Unity versions and produced curve type is invalid import errors.
New unity_animation_set_object_reference_curve:
{
"clipPath": "Assets/Anim/GreenLizardIdle.anim",
"type": "SpriteRenderer",
"propertyName": "m_Sprite",
"keyframes": [
{ "time": 0, "assetPath": "Assets/Art/lizard.png", "name": "lizard_0" },
{ "time": 0.083, "assetPath": "Assets/Art/lizard.png", "name": "lizard_1" }
]
}- Unity writes the binding itself (
AnimationUtility.SetObjectReferenceCurve) — no hand-built YAML. namepicks a singleSpritesub-asset out of a sliced sprite sheet;typeandpropertyNamedefault toSpriteRenderer/m_Sprite, so the common case is justclipPath+keyframes.- Fails closed: if any keyframe can't be resolved the whole call is rejected and lists which ones — a clip that silently animates to the wrong sprites is worse than an error.
unity_animation_clip_info now reports object-reference curves (objectReferenceCurves with binding path, property, type, and each keyframe's time + resolved asset path). A correct sprite clip previously reported curveCount: 0 and looked empty, so there was no way to verify a generated clip.
🧹 Changed
- Advanced tier 268 → 269 tools (347 total), synced across the pinned tier test and
manifest.json.
📦 Install
npx anklebreaker-unity-mcp@latest
Verification
60/60 tests, all four CI matrix jobs green. A real 3-frame sprite clip was built through the actual MCP tool, read back via clip_info, and force-reimported in Unity: 0 console errors, all sprite references resolved.
Full changelog: CHANGELOG.md
v2.35.5 — Unity error messages restored + fail-closed routing
Patch release from a 43-run audit of both repos (33 dimensions + 10 blind-spot dimensions, 168 agents, every CRITICAL/HIGH finding adversarially verified before it was acted on). Companion plugin: v2.39.4.
Recommended for all users.
🔍 Every Unity error message was being thrown away
The queue ticket carries the Unity-side exception in errorMessage, but the poller read statusData.error — a field that never exists on that shape. So every failure across all 337 routes collapsed to a generic "Queue processing failed". Agents got no diagnostic and typically retried the identical failing call — which, for a non-idempotent write, means doing it twice.
It was worse than it looked. Two other features detect older plugins by reading "Unknown API endpoint" out of that same error text:
- advanced-tool did-you-mean suggestions
component_batch_wiregraceful degrade
Both had been silently broken in production. All three are repaired by reading the right field.
Why the test suite never caught it: the mock bridge emitted the wrong field name too, so 59 passing tests were validating a fiction. The mock now mirrors the plugin's real wire shape exactly, and the assertion that accepted success:false as an acceptable substitute (letting the real message vanish unnoticed) now demands the verbatim text — and is proven to fail without the fix.
⚙️ Also fixed
- A vanished project no longer redirects your writes to a different one. When an agent's selected Unity instance disappeared, the code cleared the selection and switched off the "you must select an instance" gate — so the same call fell through to the default port, which in any multi-project session is a different live Unity, reporting success the whole way. It now fails closed and asks you to re-select.
- A transient hiccup no longer downgrades the whole session. Any lingering submit error (Unity not up yet, a domain reload longer than the retry window) permanently latched the connection into legacy mode — losing agent attribution, per-action undo grouping and read batching, with nothing to ever reset it. Only a definitive HTTP 404 now proves a plugin lacks queue mode.
➕ Added
Schema opt-ins for the plugin's new data-loss guards: unity_asset_delete → recursive / permanent; unity_scene_open and unity_scene_new → saveFirst / discardUnsavedChanges; unity_scene_save → path (required for a never-saved scene, and doubles as Save-As). Several of these previously dropped every parameter but path.
🧹 Changed
- License declared correctly —
package.jsondeclared none andmanifest.jsonsaidMIT, while the shipped LICENSE is the AnkleBreaker Open License v1.0. manifest.jsonversion was stale at 2.35.2 and is now synced.- A test that compared network arrival order for calls the code fires concurrently was replaced with one that checks the guarantee actually made (
results[i]aligns withreferences[i]) — strictly stronger than what it replaced.
📦 Install
npx anklebreaker-unity-mcp@latest
Verification
60/60 tests, all four CI matrix jobs (ubuntu + windows × node 20 + 22) green, route registry 337 in sync, companion plugin compiles clean against a live Unity 6000.3.9f1 editor.
Full changelog: CHANGELOG.md
v2.35.4 — ProBuilder tools, per-action undo, lazy discovery & reliability
Grouped release of all server work since v2.30.0 (the whole Development-Fable-Improvements line, now merged to main). Additive + hardening — every existing capability is preserved. Companion plugin: v2.39.3.
✨ New capabilities
- ProBuilder tool suite — 14
unity_probuilder_*tools (create_shape, extrude/bevel/subdivide/delete/translate/flip faces, set_face_material, boolean CSG, combine, probuilderize, center_pivot, export_mesh) for building editable geometry straight from the agent. - Per-action / per-agent undo —
unity_undo_lastreverts the most recent MCP action as one step, or a specific agent's last action. - Three-level lazy tool discovery —
unity_list_advanced_toolsgoes summary → category → single schema, so finding one tool costs ~1KB instead of a ~30KB dump; newsearch=andtool=lookups. - Compact-registry mode —
UNITY_MCP_COMPACT_TOOLS=1keeps all tools while fitting constrained clients (fixes the Codex-Desktop-on-Windowsspawn ENAMETOOLONG/ oversized-registry case).
⚡ Efficiency & correctness
- Compact JSON by default — ~44% fewer tokens on large payloads (deep hierarchies, asset lists).
UNITY_MCP_PRETTY_JSON=1restores indentation. isErrorflag on logical failures so clients stop reading errors as success; did-you-mean suggestions on unknown tool names.- Locale-safe numeric params — decimal-comma locales no longer silently drop float values.
🛡️ Reliability
- Capability handshake — the server negotiates features on the plugin's
protocolVersionand degrades gracefully across version drift (works with older plugins). - Queue duplicate-execution guard (transient poll errors during domain reload),
play_modefalse-negative recovery,component_batch_wiregraceful degrade. - Protocol test harness + CI (mock bridge + MCP stdio client; 59 mock tests + a live suite) across ubuntu + windows / node 20 & 22.
📦 Install
npx anklebreaker-unity-mcp@latest
(or pin anklebreaker-unity-mcp@2.35.4)
🙏 Thanks
Community contributions forward-ported with credit: @D3vCrow (capability handshake, compact-JSON / isError / did-you-mean), @rcasaleiro (context-route fix). Bug reporters: @JESVN (constrained-client tool registry) and the battle-test / ProBuilder reporters whose reports drove the reliability + data-safety work.
Full changelog: CHANGELOG.md.
v2.30.0
Added
unity_screenshot_editor_windowtool — capture any Editor window (Inspector, Project, Console, custom windows) to a PNG file. Unlikeunity_screenshot_game/unity_screenshot_scene(which render a camera), it grabs the actual editor UI via the Win32PrintWindowAPI, so it works even when the window is hidden behind others, without raising it or stealing focus. Windows editor only — returns a clear unsupported-platform error on macOS/Linux. Defaults toAssets/Screenshots/, accepts any user-chosen.pngpath; argswindow(required),path,maxDimension. Companion to theunity-mcp-plugin2.32.0 change.
Publishing this release triggers the npm-publish workflow → npm publish --access public.
v2.29.0 — MPPM tools & Unity 6.5 instanceId
Grouped release of work since v2.28.2.
Added
- MPPM virtual player & scenario tools —
unity_mppm_list_players,unity_mppm_activate_player,unity_mppm_deactivate_playerandunity_mppm_create_scenario. Companion tounity-mcp-plugin2.31.0.
Changed
instanceIdtool parameters declared asstring— Unity 6.5 entity ids are 64-bit values that exceed JavaScript's safe-integer range; sent as JSON numbers they were rounded, breaking object-by-instanceIdresolution. All 26instanceIdinput schemas ineditor-tools.jsare now strings. Companion tounity-mcp-plugin2.28.0. (#24)
See CHANGELOG.md for full detail.
v2.28.2 — Codex CLI compatibility (stdout hygiene)
Fixed
- MCP JSON-RPC framing corrupted by debug logs on stdout — Two
console.debug(...)call sites insrc/unity-editor-bridge.js(queue submit log) andsrc/tool-tiers.js(lazy-load log) wrote diagnostic lines to stdout, which the MCP stdio transport reserves exclusively for JSON-RPC messages. Strict clients (Codex CLI) closed the transport on the first non-JSON chunk; lenient clients (Claude Desktop, Claude Code) tolerated it, which is why the bug escaped earlier detection. Both call sites now useconsole.error(...)so logs go to stderr.
Closes
- #11 (Windows Codex transport closes after successful Unity MCP connect on read-only tool calls)
Full Changelog: v2.28.1...v2.28.2
v2.28.1 — fix npm publish workflow
Fixed
- npm publish workflow — Added
--allow-same-versiontonpm versioncommand to prevent CI failure whenpackage.jsonalready matches the release tag
Full Changelog: https://github.com/AnkleBreaker-Studio/unity-mcp-server/blob/main/CHANGELOG.md
v2.26.0 — Test Runner & Compilation Errors
What's New
Added
- Unity Test Runner tools —
unity_run_tests,unity_get_test_job,unity_list_testsfor running and monitoring Unity tests via MCP — by @vatanaksoytezer - Compilation errors tool —
unity_get_compilation_errorsadded to CORE_TOOLS tier — by @XuX26 - Bridge functions — new bridge endpoints for testing and compilation error routes
Full Changelog: v2.25.0...v2.26.0
v2.25.0 — Parallel-Safe Instance Routing
Parallel-Safe Instance Routing for Multi-Agent Workflows
When multiple AI agents (e.g. Claude Cowork tasks) share the same MCP stdio process, unity_select_instance calls could overwrite each other's routing state, causing one agent's commands to be sent to the wrong Unity Editor.
What's new
-
Per-request port override — Each
unity_*tool call can now include an optionalportparameter that bypasses shared state entirely. The port is extracted by middleware before the tool handler runs, used for routing, then cleaned from the args. Safe because MCP stdio transport processes requests sequentially. -
Dynamic schema injection — The
portparameter is automatically injected into everyunity_*tool schema (exceptunity_list_instances,unity_select_instance, andunity_hub_*) in the ListTools handler, so AI assistants see it as a legitimate parameter and pass it consistently. -
Enhanced
unity_select_instanceresponse — Now returns explicit routing instructions telling the AI to includeportin all subsequent calls for parallel safety.
Files changed
src/index.js— CallTool middleware (port extraction, override, cleanup) + ListTools schema injectionsrc/instance-discovery.js—setPortOverride()/clearPortOverride()/ updatedgetActiveBridgeUrl()src/tools/instance-tools.js— Enhanced select_instance description and response
No plugin update required
This is a server-side change only. The Unity Editor plugin does not need to be updated.