Skip to content

v0.5.1

Choose a tag to compare

@Winlifes Winlifes released this 13 Jul 03:52

Added

  • The MCP Server window's Tool Exposure row now includes a settings button that opens the full Tool Exposure window with the active core or full profile pre-selected.
  • get_test_job now reports possiblyStuck, the stalled phase, inactivity duration, and current test when Test Runner callbacks stop. Runner startup uses a 30-second threshold while a known running test gets 120 seconds to avoid premature warnings for normal long tests.
  • execute_code gained a skip_refresh option that bypasses the pre-compile AssetDatabase.Refresh + wait-for-ready. Use it for read-only inspection snippets or during a live Play Mode session you must not disturb: the default refresh can trigger an import/domain reload (from your own or another actor's pending changes in a shared editor) that wipes Play Mode runtime state. When skipped, external file edits since the last compile are not picked up.
  • Screenshot captures now auto-fall back to a file when the payload would exceed a safe transport size, instead of emitting an oversized base64 payload that reliably drops the client socket. The threshold is measured on the raw PNG (512 KB) so the ~1.33x base64 expansion still lands under the drop point; capture_multiview's default (inline) path is covered too -- it spills all frames to files when their combined size is too large. The response carries the same { path, bytes, fell_back_to_file: true } shape as an explicit save_to_file. Small captures are still returned inline; save_to_file remains an explicit override.
  • Added dedicated capability tools for asset import settings, dependency/broken-reference inspection, mesh and material inspection, 2D/3D physics queries, particle preview control, project settings, Undo/Redo, component batch operations, lighting, and reflection-based PlayableDirector evaluation. Reverse dependency scans are bounded and yield between batches; mutating setters validate the whole request before writing.

Changed

  • Project Skills now manage only a delimited Funplay block inside shared AGENTS.md and CLAUDE.md files, preserving all hand-authored content outside it. Exact legacy generated files migrate automatically; edited legacy single-marker files are left unchanged with an explicit migration error instead of being overwritten.

Fixed

  • Built-in tools that accept a GameObject target now consistently resolve names, hierarchy paths, and instance IDs through ObjectsHelper, including inactive objects and additively loaded scenes. get_console_logs also supports an opt-in include_stack_trace argument with independently capped, normalized stack output.
  • MCPBrokerTransportTests (8 of the package's 61 EditMode tests) hardcoded the broker source path as Assets/unity-mcp/Editor/MCP/Server/Broker/keepalive-broker.cs.txt, which only exists when this repo's own source is checked out directly under Assets/ -- it always failed in any project that installs the package properly (embedded, git, or registry), since there the source lives under Packages/<name> or Library/PackageCache/<name>@version. Both the filesystem lookup (ResolveBrokerSourcePath, used by 7 tests via CreateBrokerPaths) and the AssetDatabase lookup (BrokerSource_IsVisibleToAssetDatabaseForUnityPackageExport) now resolve through PackageInfo.FindForAssembly first and only fall back to the old Assets/unity-mcp path when the assembly isn't part of a package (preserving this repo's own dev-checkout layout).
  • Tool argument parsing no longer silently coerces a malformed value to default(T) / Vector3.zero and runs with it. A missing required value now returns MISSING_PARAM; a value that cannot be parsed into its parameter type (a non-numeric int, a two-component 'x,y' passed where an 'x,y,z' vector is expected, an out-of-range enum, etc.) returns INVALID_PARAM with the parameter name, provided value, and expected format. This applies to reflected and manually registered tools, and set_transform / create_primitive validate vectors before modifying the scene.
  • Several Profiler/memory tools returned error/precondition conditions (get_object_memory with an empty target, memory_list_snapshots with no snapshots, get_frame_timing with no timing available, frame_debugger_get_events with no events) as bare human-readable strings on the success channel, so callers -- and the plugin's own IsError() check -- treated the failure as success. They now return structured { success: false, code } errors.
  • Every tool response is now uniformly parseable as { success, ... }. Legacy tools that returned a bare human-readable string on success (while only errors were structured JSON) are wrapped in { success: true, message } by the result serializer. Image data URIs and strings that are already a { success: ... } envelope pass through untouched, so screenshots still render as images and error envelopes are never double-wrapped.

Contributors