* Update github-repo-stats.yml
* pytest: make harness MCPForUnity-only; remove UnityMcpBridge paths from tests; route tools.manage_script via unity_connection for reliable monkeypatching; fix ctx usage; all tests green (39 pass, 5 skip, 7 xpass)
* Add missing meta for MaterialMeshInstantiationTests.cs (Assets)
* bridge/tools/manage_script: fix missing unity_connection prefix in validate_script; tests: tidy manage_script_uri unused symbols and arg names
* tests: rename to script_apply_edits_module; extract DummyContext to tests/test_helpers and import; add telemetry stubs in tests to avoid pyproject I/O
* tests: import cleanup and helper extraction; telemetry: prefer plain config and opt-in env override; test stubs and CWD fixes; exclude Bridge from pytest discovery
* chore: remove unintended .wt-origin-main gitlink and ignore folder
* tests: nit fixes (unused-arg stubs, import order, path-normalized ignore hook); telemetry: validate config endpoint; read_console: action optional
* Add development dependencies to pyproject.toml
- Add [project.optional-dependencies] section with dev group
- Include pytest>=8.0.0 and pytest-anyio>=0.6.0
- Add Development Setup section to README-DEV.md with installation and testing instructions
* Revert "Update github-repo-stats.yml"
This reverts commit 8ae595d2f4f2525b0e44ece948883ea37138add4.
* test: improve test clarity and modernize asyncio usage
- Add explanation for 200ms timeout in backpressure test
- Replace manual event loop creation with asyncio.run()
- Add assertion message with actual elapsed time for easier debugging
* refactor: remove duplicate DummyContext definitions across test files
Replace 7 duplicate DummyContext class definitions with imports from tests.test_helpers.
This follows DRY principles and ensures consistency across the test suite.
* chore: remove unused _load function from test_edit_strict_and_warnings.py
Dead code cleanup - function was no longer used after refactoring to dynamic tool registration.
* docs: add comment explaining CWD manipulation in telemetry test
Clarify why os.chdir() is necessary: telemetry.py calls get_package_version()
at module load time, which reads pyproject.toml using a relative path.
Acknowledges the fragility while explaining why it's currently required.
* Add a decorate that wraps around the `mcp.tool` decorator.
This will allow us to more easily collect tools
* Register tools that's defined in the tools folder
* Update Python tools to use new decorator
* Convert script_apply_edits tool
* Convert last remaining tools with new decorator
* Create an attribute so we can identify tools via Reflection
* Add attribute to all C# tools
* Use reflection to load tools
* Initialize command registry to load tools at startup
* Update tests
* Move Dev docs to docs folder
* Add docs for adding custom tools
* Update function docs for Python decorator
* Add working example of adding a screenshot tool
* docs: update relative links in README files
Updated the relative links in both README-DEV.md and README-DEV-zh.md to use direct filenames instead of paths relative to the docs directory, improving link correctness when files are accessed from the root directory.
* docs: update telemetry documentation path reference
Updated the link to TELEMETRY.md in README.md to point to the new docs/ directory location to ensure users can access the telemetry documentation correctly. Also moved the TELEMETRY.md file to the docs/ directory as part of the documentation restructuring.
* rename CursorHelp.md to docs/CURSOR_HELP.md
Moved the CursorHelp.md file to the docs directory to better organize documentation files and improve project structure.
* docs: update CUSTOM_TOOLS.md with improved tool naming documentation and path corrections
- Clarified that the `name` argument in `@mcp_for_unity_tool` decorator is optional and defaults to the function name
- Added documentation about using all FastMCP `mcp.tool` function decorator options
- Updated class naming documentation to mention snake_case conversion by default
- Corrected Python file path from `tools/screenshot_tool.py` to `UnityMcpServer~/src/tools/screenshot_tool.py`
- Enhanced documentation for tool discovery and usage examples
* docs: restructure development documentation and add custom tools guide
Rearranged the development section in README.md to better organize the documentation flow. Added a dedicated section for "Adding Custom Tools" with a link to the new CUSTOM_TOOLS.md file, and renamed the previous "For Developers" section to "Contributing to the Project" to better reflect its content. This improves discoverability and organization of the development setup documentation.
* docs: update developer documentation and add README links
- Added links to developer READMEs in CUSTOM_TOOLS.md to guide users to the appropriate documentation
- Fixed typo in README-DEV.md ("roote" → "root") for improved clarity
- These changes improve the developer experience by providing better documentation navigation and correcting technical inaccuracies
* feat(tools): enhance tool registration with wrapped function assignment
Updated the tool registration process to properly chain the mcp.tool decorator and telemetry wrapper, ensuring the wrapped function is correctly assigned to tool_info['func'] for proper tool execution and telemetry tracking. This change improves the reliability of tool registration and monitoring.
* Remove AI generated code that was never used...
* feat: Rebuild MCP server installation with embedded source
Refactored the server repair logic to implement a full rebuild of the MCP server installation using the embedded source. The new RebuildMcpServer method now:
- Uses embedded server source instead of attempting repair of existing installation
- Deletes the entire existing server directory before re-copying
- Handles UV process cleanup for the target path
- Simplifies the installation flow by removing the complex Python environment repair logic
- Maintains the same installation behavior but with a cleaner, more reliable rebuild approach
This change improves reliability of server installations by ensuring a clean slate rebuild rather than attempting to repair potentially corrupted environments.
* Add the rebuild server step
* docs: clarify tool description field requirements and client compatibility
* fix: move initialization flag after tool discovery to prevent race conditions
* refactor: remove redundant TryParseVersion overrides in platform detectors
* refactor: remove duplicate UV validation code from platform detectors
* Update UnityMcpBridge/Editor/Tools/CommandRegistry.cs
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* refactor: replace WriteToConfig reflection with direct McpConfigurationHelper call
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Adds a new 'get_component' action that retrieves a single component's
serialized data instead of all components, improving efficiency and
avoiding token limits when only specific component data is needed.
- Simplify validation to reject 'name' parameter whenever present for find action
- Remove ambiguity when both 'name' and 'search_term' are provided
- Update error message to clarify that 'name' should be removed
- Prevent silent failures when using 'name' instead of 'search_term' for find action
- Add clear error messages guiding users to correct parameter usage
- Validate that 'search_term' is only used with 'find' action
- Update parameter annotations to clarify when each parameter should be used
* refactor: migrate command routing to use CommandRegistry lookup instead of switch statement
* style: improve code formatting and indentation consistency
* refactor: clean up imports and type hints across tool modules
* Revert "feat: Implement Asset Store Compliance for Unity MCP Bridge"
This reverts commit 2fca7fc3da.
* Revert "feat(asset-store): implement post-installation prompt system for Asset Store compliance"
This reverts commit ab25a71bc5.
* chore: upgrade mcp[cli] dependency from 1.4.1 to 1.15.0
* style: fix formatting and whitespace in Python server files
* Remove description, probably a Python versionn change
* feat: add type hints and parameter descriptions to Unity MCP tools
* docs: improve shader management tool parameter descriptions and types
* refactor: add type annotations and improve documentation for script management tools
* refactor: improve type annotations and documentation in manage_scene tool
* refactor: add type annotations and improve parameter descriptions across MCP tools
* feat: add explicit name parameters to all MCP tool decorators
* refactor: remove unused Unity connection instance in manage_asset_tools
* chore: update type hints in manage_editor function parameters for better clarity
* feat: make name and path parameters optional for scene management operations
* refactor: remove unused get_unity_connection import from manage_asset.py
* chore: rename Operation parameter annotation to Operations for consistency
* feat: add logging to MCP clients for tool actions across MCP server components
* chore: add FastMCP type hint to register_all_tools parameter
* style: reformat docstring in apply_text_edits tool to use multiline string syntax
* refactor: update type hints from Dict/List/Tuple/Optional to modern Python syntax
* refactor: clean up imports and add type annotations to script editing tools
* refactor: update type hints to use | None syntax for optional parameters
* Minor fixes
* docs: improve tool descriptions with clearer action explanations
* refactor: remove legacy update action migration code from manage_script.py
* style: replace em dashes with regular hyphens in tool descriptions [skip ci]
* refactor: convert manage_script_capabilities docstring to multiline format [skip ci]
* refactor: remove unused UnityEngine references from menu item classes
* Add new tools to manage a prefab, particularly, making them staged.
This might be enough, but it's possible we may have to extract some logic from ManageGameObject
* feat: add AssetPathUtility for asset path normalization and update references in ManageAsset and ManagePrefabs
* feat: add prefab management tools and register them with the MCP server
* feat: update prefab management commands to use 'prefabPath' and add 'create_from_gameobject' action
* fix: update parameter references to 'prefabPath' in ManagePrefabs and manage_prefabs tools
* fix: clarify error message for missing 'prefabPath' in create_from_gameobject command
* fix: ensure pull request triggers for unity tests workflow
* Revert "fix: ensure pull request triggers for unity tests workflow"
This reverts commit 10bfe54b5b7f3c449852b1bf1bb72f498289a1a0.
* Remove delayed execution of executing menu item, fixing #279
This brings the Unity window into focus but that seems to be a better UX for devs.
Also streamline manage_menu_item tool info, as FastMCP recommends
* docs: clarify menu item tool description with guidance to use list action first
* feat: add version update for server_version.txt in bump-version workflow
* fix: simplify error message for failed menu item execution
* Move the current test to a Tools folder
* feat: add env object and disabled flag handling for MCP client configuration
* Format manual config specially for Windsurf and Kiro
* refactor: extract config JSON building logic into dedicated ConfigJsonBuilder class
* refactor: extract unity node population logic into centralized helper method
* refactor: only add env property to config for Windsurf and Kiro clients
If it ain't broke with the other clients, don't fix...
* fix: write UTF-8 without BOM encoding for config files to avoid Windows compatibility issues
* fix: enforce UTF-8 encoding without BOM when writing files to disk
* refactor: replace execute_menu_item with enhanced manage_menu_item tool supporting list/exists/refresh
* Update meta files for older Unity versions
* test: add unit tests for menu item management and execution
* feat: add tips for paths, script compilation, and menu item usage in asset creation strategy
* Use McpLog functionality instead of Unity's Debug
* Add telemetry
* Annotate parameters
More info to LLMs + better validation
* Remove the refresh command
It's only ever useful in the context of listing menu items
* Updated meta files since running in Unity 2021
* Slightly better README
* fix: rename server-version.txt to server_version.txt and update menu item description
- README path separators (todo in separate doc commit)
- manage_gameobject: pop prefabFolder not prefab_folder
- execute_menu_item: make sync to avoid blocking event loop
- telemetry: validate endpoint scheme (allow http/https only) and re-validate at send time
- Add server-side integer coercion for numeric parameters in all tools
- Fix parameter type validation issues (read_resource, find_in_file, read_console, manage_scene, manage_asset)
- Add proper tool descriptions with ctx parameter documentation
- Fix Context type annotations (use Context instead of Any for ctx)
- All tools now accept flexible numeric inputs (strings, floats) and coerce to integers
- Telemetry system working with all tool_execution events captured in BigQuery
- Remove invalid parameter type warnings from client-side validation
* commit '3e83f993bfe632034bf7302d4319e3cd16353eb8':
Improved ci prompt testing suite (#270)
chore: bump version to 3.3.2
Fix: Unity Editor reload crash + debug-noise reduction (#266)
Revise README for improved clarity and organization
docs: install uv via official installer (curl/winget)
Update README.md
docs: fix Windows uv path to use WinGet shim, keep macOS AppSupport symlink path
docs: update README.md with improved installation paths, documentation, and logo
fix: Update README installation paths to match ServerInstaller.cs
* CI: streamline Unity licensing (ULF/EBL); drop cache mounts & EBL-in-container; NL suite: clarify T-E/T-J, anchor positions, EOF brace targeting, SHA preconditions
* CI: support both ULF + EBL; validate ULF before -manualLicenseFile; robust readiness wait; use game-ci @v2 actions
* CI: activate EBL via container using UNITY_IMAGE; fix readiness regex grouping
* CI: minimal patch — guard manualLicenseFile by ulf.ok, expand error patterns, keep return-license @v2 for linter
* CI: harden ULF staging (printf+chmod); pass ULF_OK via env; use manual_args array for -manualLicenseFile
* CI: assert EBL activation writes entitlement to host mount; fail fast if missing
* CI: use heredoc in wait step to avoid nested-quote issues; remove redundant EBL artifact copy; drop job-level if and unused UNITY_VERSION
* CI: harden wait step (container status check, broader ready patterns, longer timeout); make license return non-blocking
* CI: wait step — confirm bridge readiness via status JSON (unity_port) + host socket probe
* CI: YAML-safe readiness fallback (grep/sed unity_port + bash TCP probe); workflow_dispatch trigger + ASCII step names
* CI: refine license error pattern to ignore benign LicensingClient channel startup; only match true activation/return failures
* Improve Unity bridge wait logic in CI workflow
- Increase timeout from 600s to 900s for Unity startup
- Add 'bound' to readiness pattern to catch more bridge signals
- Refine error detection to focus only on license failures
- Remove non-license error patterns that could cause false failures
- Improve error reporting with descriptive messages
- Fix regex escaping for unity port parsing
- Fix case sensitivity in sed commands
* Add comprehensive Unity workflow improvements
- Add project warm-up step to pre-import Library before bridge startup
- Expand license mounts to capture full Unity config and local-share directories
- Update bridge container to use expanded directory mounts instead of narrow license paths
- Provide ULF licenses in both legacy and standard local-share paths
- Improve EBL activation to capture complete Unity authentication context
- Update verification logic to check full config directories for entitlements
These changes eliminate cold import delays during bridge startup and provide
Unity with all necessary authentication data, reducing edge cases and improving
overall workflow reliability.
* Refine Unity workflow licensing and permissions
- Make EBL verification conditional on ULF presence to allow ULF-only runs
- Remove read-only mounts from warm-up container for Unity user directories
- Align secrets gate with actual licensing requirements (remove UNITY_SERIAL only)
- Keep return-license action at v2 (latest available version)
These changes prevent workflow failures when EBL has issues but ULF is valid,
allow Unity to write preferences during warm-up, and ensure secrets detection
matches the actual licensing logic used by the workflow steps.
* fix workflow YAML parse
* Normalize NL/T JUnit names and robust summary
* Fix Python import syntax in workflow debug step
* Improve prompt clarity for XML test fragment format
- Add detailed XML format requirements with exact specifications
- Emphasize NO prologue, epilogue, code fences, or extra characters
- Add specific instructions for T-D and T-J tests to write fragments immediately
- Include exact XML template and TESTID requirements
- Should fix T-D and T-J test failures in CI by ensuring proper fragment format
* Fix problematic regex substitution in test name canonicalization
- Replace unsafe regex substitution that could create malformed names
- New approach: preserve correctly formatted names, extract titles safely
- Prevents edge cases where double processing could corrupt test names
- Uses proper em dash (—) separator consistently
- More robust handling of various input formats
* CI: NL/T hardening — enforce filename-derived IDs, robust backfill, single-testcase guard; tighten prompt emissions; disallow Bash
* fix: keep file ID when canonicalizing test names
* CI: move Unity Pro license return to teardown after stopping Unity; keep placeholder at original site
* CI: remove revert helper & baseline snapshot; stop creating scripts dir; prompt: standardize T-B validation to level=standard
* CI: remove mini workflow and obsolete NL prompts; redact email in all Unity log dumps
* NL/T prompt: enforce allowed ops, require per-test fragment emission (incl. failures), add T-F..T-J XML templates
* NL suite: enforce strict NL-4 emission; remove brittle relabeling; keep canonicalization + backfill
* NL/T: minimize transcript; tighten NL-4 console reads; add final errors scan in T-J
* ci: add local validate-nlt-coverage helper
* CI: add staged report fragment promotion step (reports/_staging -> reports/) to support multi-edit reporting
* CI: add staged report fragment promotion step (reports/_staging -> reports/) to support multi-edit reporting
* CI: minor polish and guardrails; keep staged reports promotion and placeholder detection
* read_console: default count=50; normalize types str->list; tolerate legacy payload shapes
* read_console: harden response parsing for legacy shapes (data as list, tuple entries)
* Docs: refresh CI workflow and prompts (remove mini suite refs; per-test emissions, staging, guard)
* CI: move T coverage check after staged promotion; accept _staging as present; dedupe promotion step
* CI: make T retry conditional on explicit coverage probe (not failure()); respect _staging in probe
- Remove deprecated _trigger_sentinel_async function and all call sites
- Clean up force_sentinel_reload option handling (replaced with Unity's synchronous system)
- Addresses repeated CodeRabbit flagging of unused vestigial code
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add nl-unity-suite-full-additive.md: new additive test design that builds state progressively instead of requiring resets
- Update claude-nl-suite.yml workflow to use additive test suite
- Fix validation scoping bugs in ManageScript.cs:
- Correct scoped validation scope calculation (was using newText.Length instead of originalLength)
- Enable always-on final structural validation regardless of relaxed mode
- Unify regex_replace and anchor_insert to use same smart matching logic in manage_script_edits.py
- Additive tests demonstrate better real-world workflow testing and expose interaction bugs between operations
- Self-healing capability: tools can recover from and fix broken file states
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: rename namespace from UnityMcpBridge to MCPForUnity across all files
See thread in #6, we can't use Unity MCP because it violates their trademark.
That name makes us look affiliated. We can use MCP for Unity
* Change package display name, menu item and menu titles
These are front facing so has to change for Unity asset store review
* Misc name changes in logs and comments for better consistency
* chore: update editor window title from 'MCP Editor' to 'MCP for Unity'
* refactor: update branding from UNITY-MCP to MCP-FOR-UNITY across all log messages and warnings
* chore: rename Unity MCP to MCP For Unity across all files and bump version to 2.1.2
* docs: update restore script title to clarify Unity MCP naming
* Fix usage instructions
* chore: update log messages to use MCP For Unity branding instead of UnityMCP
* Add a README inside plugin, required for distributing via the asset store
* docs: update Unity port description and fix typo in troubleshooting section
* Address Rabbit feedback
* Update Editor prefs to use new name
Prevents overlap with other Unity MCPs, happy to revert if it's too much
* refactor: rename server logger and identifier from unity-mcp-server to mcp-for-unity-server
* Standardize casing of renamed project to "MCP for Unity", as it is on the asset store
* Remove unused folder
* refactor: rename Unity MCP to MCP for Unity across codebase
* Update dangling references
* docs: update product name from UnityMCP to MCP for Unity in README
* Update log and comments for new name