Date: 2026-07-29
Status: active public roadmap
Build a small but serious Unity MCP service that can support an autonomous engineering loop:
- inspect project state
- run compile and test validation
- drive play mode and scripted scenarios
- capture screenshots, logs, and profiler evidence
- correlate findings back to code and assets
- produce actionable diagnoses and candidate fixes
The target is not just "Unity commands through MCP". The target is a trustworthy automation surface for coding agents, CUA-style operators, and future project-specific assistants.
- editor-first and removable by default
- zero player-build footprint unless a project explicitly opts into runtime probes
- capability-gated behavior instead of version guessing
- evidence-first outputs instead of opaque success flags
- narrow, composable operations instead of one giant universal tool
- support for more than one MCP client and more than one agent role
The architecture-hardening milestone that was previously only planned is now materially implemented in the public baseline.
Implemented:
- explicit per-project
BridgeRegistry - explicit per-project
ProjectContext - per-project mutation locking
- formal discovery and reconciliation
- exact process ownership matching by parsed
-projectPath - health and ANR classification scaffold
- structured grouped state:
transport_statestate_groups
- explicit context-cache pruning for stale offline projects
- public proof runners for:
- multi-project acceptance
- divergence and reconciliation cases
- health-policy classification
This means the current same-host editor lane is no longer only a transport experiment. It now has an explicit routing model, recovery model, and proof model.
What still remains after this milestone is less about basic multi-project survival and more about:
- richer read surfaces
- stronger artifact and timing evidence
- broader supported-client proof
- deeper scenario result browsing and diagnosis flows
Already implemented:
- standalone public repository and current
v0.3.53Git UPM package path underpackages/com.xuunity.light-mcp - bridge enable/disable lifecycle
- status and capability probing
- compact MCP status summaries with bridge stabilization fields and
includeFullPayload=truefull-payload opt-in - compact
ensure-readyreadiness summaries with--include-full-payloadrecovery for nested discovery/package/launch evidence - active editor-log identity in status/readiness surfaces and path-backed
editor_loggrep for definitive log-presence checks when the Unity Console buffer may be cleared or evicted - additive request-scoped
structured_timingandartifact_manifeston successful same-host editor responses andrequest-final-status - console tail
- scene snapshot
- deterministic Edit Mode scene open for boot-flow and scenario setup
- edit-mode tests
- compile validation without active platform switch
- authoritative post-settle refresh, compile, and test verdict fields in compact MCP operation summaries
- play mode control
- Game View screenshot and resolution control
- first scenario automation layer:
unity.scenario.validateunity.scenario.rununity.scenario.result
- compact
unity_scenario_run_and_waitdecision verdicts with trust class, failure class, recommended next action, compact step summaries, and lifecycle relaunch attribution; full terminal scenario payloads omit duplicatedrun_start.stepsunlessincludeStepPayloads=true - scenario
scene_opensteps and directunity_scene_open/request-scene-openfor deterministic boot-flow validation before Play Mode entry - project-defined hook poll-until steps and catalog-backed project-action steps
- passive project-hook readiness polls tolerate
status: not_starteduntil an explicit pass/fail predicate or timeout, avoiding an early false-negative - mutating
unity_project_action_invokeresults promote a versioned before/after/add/remove/change delta and remain non-decision-ready when that proof is missing, invalid, or reports destructive removal - closed-project SDK package restore through
unity_sdk_package_restoreandrequest-sdk-package-restore, with an idle-stable Package Manager graph, atomic package/dependency receipt, and verified editor-process exit - public config-applying project-action build templates for projects whose
representative build must call project-owned apply/build methods instead of
raw
unity_build_player - public reusable smoke runners for compact and JSON-heavy validation routes with durable post-change phase lines, quiet-tail heartbeats, and actionable versus non-blocking bridge-churn classification
- host-side editor session restore for host-opened validation runs
- lifecycle-reset finalization recovery by
request_id request-final-statusfor operator follow-up after transport churn- host-side persisted scenario result browsing:
request-scenario-results-listrequest-scenario-result-latestunity_scenario_results_listunity_scenario_result_latest
- first cancellation slice for the same-host editor lane:
request-cancelrequest_cancelledrequest_cancel_requested
- stale request inspection and cleanup for the same-host editor lane:
stale_request_artifactsrequest-stale-cleanup
- operator-facing separation of:
transport_outcomeoperation_outcomerecommended_next_action
- per-project discovery and reconciliation reporting
- per-project health and ANR classification reporting
- structured grouped transport and lifecycle state
- compile-first public post-change validation ordering
- batch operator ergonomics is implemented from
designs/XUUNITY_MCP_BATCH_OPERATOR_ERGONOMICS_DESIGN_2026-05-21.md: progress heartbeats, artifact probes, workspace side-effect summaries, project-defined hook summaries, and reclassification operator verdicts - license-aware batch helper fallback with
auto,off, andrequire-batchmodes, including safe GUI bridge fallback when batchmode is blocked and restore safety is known - native Windows
.cmdand.ps1launcher/setup paths with conservative docs around.cmdpreference and PowerShell ExecutionPolicy risk - public agent documentation, client templates, workflow templates, comparison, security, discovery, and install docs are in place
This is enough for:
- real compile gating
- basic Unity-aware validation
- controlled screenshot capture
- early automation experiments
- repeatable same-host multi-project routing and recovery
- production Git UPM consumption through
v0.3.53
This is not yet enough for:
- device profiling
- runtime bottleneck analysis
- rich scripted end-to-end gameplay scenarios
- autonomous regression investigation
- agent-safe mutation planning at scale
Near-term target:
- move from a strong same-host validation lane to broader ecosystem readiness
- do this first in the intended same-host editor validation scope
- avoid widening scope until the current lane is measurably hardened
Meaning of "operationally strong" here:
- repeatable healthy startup and validation across supported clients
- clear recovery after bridge churn and lifecycle resets
- stable compact operator status and finalization semantics
- richer evidence outputs per operation
- safer batch/GUI fallback behavior under license constraints
- broader proof across more than one Unity consumer and version
This is not the same as "full world-class device automation platform". It is the threshold for calling the current lane operationally strong.
Near-term emphasis after the architecture milestone:
- submit the package to OpenUPM now that the registry-native package path is in place
- keep hardening compact summaries and artifact/reporting surfaces where they reduce operator guesswork
- broaden proof across more supported clients and more real consumer projects
- improve read surfaces so diagnosis needs less shell fallback
Mutation-receipt honesty sits above the remaining UI work, because it does not
merely slow that work down — it invalidates its evidence. expectedSha256, atomic
rollback, post_validation, and reversible_patch_json all presume the change
table is truthful, so a receipt that reports applied for a write that changed
nothing defeats every guardrail on the surface at once. The first post-release
consumer run of the reference-driven UI slice hit exactly that on a TMP font
weight and only caught it by re-measuring the render.
Shipped for that reason ahead of the remaining UI breadth:
- ineffective writes report
no_opwith a transaction-levelno_op_count - enum properties are index-addressed, refuse out-of-range input, and accept a
member name through
stringValue - the isolated render persists its
ui.read.v1snapshot and returnssnapshot_path, soacceptance.semantic: "required"is satisfiable without a Play-mode run - transient render
overridesremove the mutate/restore round trip on a shared asset - asset-typed object references are writable, which retires the last reason to hand-edit prefab YAML
Still open on that lane:
- the reusable package lane now executes guarded uGUI interaction in Play mode
and proves the receipt, exactly-once delivery, semantic state change, and
refusal path; current source passes that assembly on Unity
2022.3and6000.0 - interaction and fixture lanes still need a Play-mode scenario per consumer
project; a
visual-only pass is a handoff state, not acceptance - an independent vision judge; a self-review is stored but never counts as proof
unassignedReferenceScope: requiredreports only fields carrying aRequired*attribute, so a project using no such convention gets an empty required report
Current recommendation:
- close package-discovery publication work and then broaden host/client proof
Most valuable next milestone:
- OpenUPM submission plus Linux/Windows live host smoke validation
Why this is next:
v0.3.12moved the package to the registry-native path andv0.3.53is the current public Git UPM line- macOS validation is strong enough for current same-host use
- Linux and Windows claims should remain conservative until executed on those hosts
- OpenUPM and external catalog pages are the next discoverability gap
Focus:
- OpenUPM submission and release metadata
- Linux and native Windows smoke proof
- broader supported-client proof
- broader lifecycle fault-injection proof
- request cancellation hygiene beyond the current host-side intent slice
- keep host prerequisite, compact-status, and final-status reports stable while closing the remaining lifecycle proof gaps
The engineering lane is strong; the remaining discoverability gap is external
distribution and citation footprint, not feature depth. The repository packaging
layer is already in place (standalone repo, llms.txt, DISCOVERY.md,
mcp-server.json, INSTALL, FEATURES, SECURITY, COMPARISON, GLOSSARY,
client docs, changelog, tagged releases). What remains, in order:
- Submit the package to OpenUPM (
com.xuunity.light-mcp; the registry-native package path is already in place). Highest-leverage remaining item. - Submit to MCP registries and catalogs — official MCP Registry, GitHub MCP
Registry,
mcp.so, Smithery where applicable, andawesome-mcp-servers. Reuse the in-repomcp-server.jsonas the source metadata. - Add entries to relevant
awesome-*lists (MCP, AI tooling, Unity, gamedev). - Publish external citation posts — one LinkedIn/blog, Unity Discussions, and one gamedev community — framed on safe, editor-only, local-first validation rather than broad runtime automation.
- Re-score discoverability 7–21 days after external pages index: check the category queries and whether an unprompted LLM recommendation names the project.
Keep install snippets in every submission pinned to the current release tag. Do not prioritize new core features ahead of this distribution work unless a release-blocking bug appears — the current blocker is external trust and citation footprint, not capability depth.
Goal:
- remove the most expensive operational ambiguity from the current lane
Focus:
- stdio server hardening
- cancellation semantics
- stale request cleanup
- stronger lifecycle fault-injection proof
- explicit host prerequisite reporting
Current progress:
- additive host prerequisite reporting is now implemented on compact
discovery/status/final-status surfaces through
host_prerequisites - first host-side cancellation slice is now implemented through best-effort
request-cancelsemantics for queuedfile_ipcrequests plus structured in-flight cancellation intent reporting - stale-request cleanup is now implemented through explicit stale artifact
inspection plus
request-stale-cleanup - remaining work is now broader lifecycle fault-injection proof, and possibly deeper Unity-side cancellation behavior if this lane later needs more than host-side cancellation intent
Exit criteria:
- lifecycle churn is tested, not only reasoned about
- stale requests do not accumulate silently
- tool failures land in a stable structured taxonomy
- the operator can distinguish setup failure, transport loss, and Unity-side failure quickly
Expected score impact:
+3 to +4
Goal:
- make every important operation easier to trust and debug
Focus:
- artifact manifest per operation
- structured timings per operation
- scenario result listing and last-result fetch
- clearer artifact path surfacing
- compact summary enrichment where it reduces operator guesswork
Current progress:
- additive request-scoped
artifact_manifestis implemented in the current same-host editor lane - additive request-scoped
structured_timingis implemented in the current same-host editor lane - host-side persisted scenario result browsing is implemented through:
request-scenario-results-listrequest-scenario-result-latestunity_scenario_results_listunity_scenario_result_latest
- batch operator ergonomics now has its implementation slice:
progress JSONL sidecars, generic artifact probe summaries, tracked workspace
side-effect accounting, project-defined hook summary promotion, and
operator_verdictfinal-status wording v0.3.39adds opt-in compact batch helper CLI output through--output compact, preserving full output as the default compatibility mode- unreleased source bounds compact batch helper output to whitelisted decision fields plus artifact pointers, with a successful-summary byte-budget guard
- compact-by-default scenario, refresh, compile, build-config compile, direct test, and MCP status-summary envelopes are now shipped with full-payload recovery paths
- remaining value in this phase is broader multi-project compact ceilings, broader proof, and surfacing evidence consistently across more operator flows
Exit criteria:
- a failed or timed-out run leaves enough structured evidence for a new chat to continue without journal archaeology
- scenario outputs are discoverable through first-class utilities
- timings and artifacts are part of the default debugging flow
Expected score impact:
+2 to +3
Goal:
- prove that the lane is stable outside one narrow local success case
Focus:
- repeatable validation in Codex, Claude Code, and Cursor
- proof on more than one Unity consumer project
- proof on a broader Unity version slice where feasible
- remove or sharply document client-specific quirks
Exit criteria:
- the same baseline flow works without ad hoc host repairs across supported clients
- the same core contract works on more than one real consumer
- known incompatibilities are explicit and bounded
Expected score impact:
+2 to +3
Goal:
- finish the missing pieces that block calling the lane mature within its current scope
Focus:
- scenario assertions and result browsing
- better read-surface helpers for diagnosis
- optional reduction of reflection dependency where practical
- tighter operational docs and decision trees
Exit criteria:
- common validation and regression tasks stay inside the MCP lane instead of falling back to shell scraping
- result interpretation is cheaper for both humans and agents
- the current lane is defensibly operationally strong
Expected score impact:
+1 to +2
Goal:
- make the current service operationally trustworthy
Deliverables:
- stronger stdio server hardening
- richer tool error taxonomy
- request cancellation and stale request cleanup
- artifact manifest per operation
- structured timing for every operation
- explicit host prerequisites report
- repeatable client validation in Codex, Claude Code, and Cursor
Done when:
- the same project can be onboarded and used across multiple clients without ad hoc host fixes
- every operation returns stable structured evidence
Current progress:
- lifecycle-reset ambiguity is materially reduced
- compact operator recovery by
request_idis now in place - compile-first validation order is now part of the reusable runner baseline
- request-scoped artifact manifests and structured timings are now in place
- explicit host prerequisite reporting is now in place on compact host-side discovery and recovery surfaces
- stale request inspection and cleanup are now in place for current same-host request artifacts
- remaining work in this wave is broader fault-injection proof and cancellation-hygiene polish
- this wave maps directly to Phase 1 and the beginning of Phase 2 in the proof-broadening plan
Goal:
- make project inspection useful enough for agent diagnosis
Deliverables:
- asset read/list/search operations
- prefab snapshot operations
- hierarchy subtree snapshot
- selected object/component snapshot
- package and define read operations
- scene list and open-scene snapshot
Done when:
- an agent can connect a runtime symptom back to concrete assets, packages, and scene objects without shell scraping
Goal:
- let agents drive deterministic Unity sessions instead of one-shot commands
Deliverables:
- scenario definition format for play-mode automation
- steps such as:
- enter play mode
- wait for condition
- invoke menu item
- invoke project-defined hook
- capture screenshot
- capture console slice
- assert scene/object state
- persisted scenario result bundle
- MCP operations:
unity.scenario.validateunity.scenario.rununity.scenario.result
Current state:
- initial baseline is implemented
- current step surface is intentionally small
- persisted result browsing and artifact surfacing are now in place
- next gap is richer assertions and sharper failure interpretation rather than first-time scenario bring-up
- current source closes the passive-readiness false-negative where
project_defined_hook_poll_untilpreviously treatedstatus: not_startedas an unmatched terminal state - this wave contributes to Phase 2 and Phase 4 of the proof-broadening plan
Done when:
- a scripted play-mode regression scenario can be authored once and replayed by any supported agent
Goal:
- support deep analysis without bloating the base package
Deliverables:
- optional dev-only runtime companion package
- explicit opt-in runtime probe mode
- frame timing capture
- memory sample capture
- marker and subsystem counters
- scene/runtime event breadcrumbs
Guardrails:
- runtime probe layer must be separate from the editor-only base package
- uninstall path must remain simple
- no silent player-build inclusion
Done when:
- a project can opt into runtime diagnostics for development builds without contaminating normal builds
Goal:
- support the real mobile troubleshooting loop
Deliverables:
- device session abstraction
- attach/run/stop for Android and iOS dev builds
- screenshot capture from device
- runtime log collection from device
- profiler capture pull/export
- thermal and frame pacing evidence where available
- artifact mapping back to build config, git revision, and scenario id
Likely operation families:
unity.device.listunity.device.deployunity.device.launchunity.device.logs.tailunity.device.screenshotunity.device.profiler.captureunity.device.session.stop
Done when:
- an agent can run a dev build on a device, collect evidence, and reason about a bottleneck with no manual profiler clicking
Goal:
- turn captures into diagnoses instead of raw blobs
Deliverables:
- normalized artifact manifests
- capture-to-code correlation helpers
- profiler summary extraction
- spike detection and bottleneck ranking
- scene/object/code suspect set generation
- comparison mode:
- before vs after
- device A vs device B
- branch vs branch
Done when:
- the service can surface a narrow suspect set for performance regressions instead of only dumping screenshots and logs
Goal:
- make the MCP usable by an automation specialist agent, not only by a coding agent
Deliverables:
- long-running session model
- scenario plans with resumable checkpoints
- artifact bundle IDs
- operation preconditions and side-effect declarations
- safe recovery after domain reload and editor restart
- explicit "human handoff required" states
- policy bands:
- read-only
- validation
- guarded mutation
- invasive diagnostics
Done when:
- a CUA-style agent can perform a multi-step Unity investigation with bounded risk and reliable resumption
Highest-value missing capabilities:
- deeper scene and asset inspection
- broader lifecycle fault-injection proof and deeper cancellation behavior
- broader supported-client proof
- device deploy and launch
- profiler capture and export
- runtime screenshot and logs
Second-wave mutation capabilities:
- guarded prefab or asset patch application
- controlled menu-item execution
- project-defined hook execution
- temporary instrumentation toggle
Mutation proof baseline now implemented: typed project-action invocation
separates hook execution success from acceptance and surfaces standardized
mutation-delta/destructive-drop evidence. Remaining work is project-hook
adoption and extending the same catalog-aware trust verdict to arbitrary raw
project_action scenario envelopes.
The service should grow as plugins, not as one monolith.
Recommended layers:
- base MCP server
- editor bridge
- optional runtime diagnostics companion
- host-side device adapters
- project-defined scenario adapters
- analysis adapters
Do next:
- close the remaining Phase 1 reliability hardening
- broaden supported-client and multi-consumer proof in Phase 3
- keep tightening Phase 2 evidence surfacing where operator friction remains
- close Phase 4 only after the evidence says the lane is already operationally strong
Do not do next:
- do not prioritize device automation before the current lane is hardened
- do not widen runtime-scope ambition to hide unresolved core reliability gaps
This keeps:
- the base install small
- project removal easy
- capability rollout incremental
The ambitious end-state is:
- connect to Unity project
- validate capabilities
- compile for multiple targets
- run edit and play mode scenarios
- produce editor and runtime screenshots
- deploy and launch on device
- capture profiler evidence
- detect bottlenecks
- correlate bottlenecks with code, assets, and scene structure
- hand back ranked findings and next actions
That is the right target for "full automation support through MCP".
- harden current core
- add scenario runner
- add deeper read surface
- add runtime companion for development builds
- add device session and profiler pipeline
- add evidence analysis and comparison
- add resumable autonomous workflows
- broad runtime support by default
- hidden downloads
- mandatory cloud relay
- broad reflection-based mutation without capability checks
- silent editor or project setting rewrites
- opaque "magic execute code" surfaces as the main extension model
The next milestone should be:
lifecycle-fault proof, scenario result utilities, and broader cross-client proof
That means:
- harden current operations further under induced transport churn
- expand scenario result evidence and artifact surfacing
- validate the same public smoke routes across more clients and consumers
- keep device profiling for the next wave, not this one
Reason:
- the base scenario control plane already exists
- the next highest leverage is trust, evidence quality, and reuse across consumers