* 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.
* Editor: prevent material/mesh instantiation in edit mode
- GameObjectSerializer: in edit mode, normalize material/mesh access
- material -> sharedMaterial
- materials -> sharedMaterials
- mesh -> sharedMesh
- also guard materials/sharedMaterial/sharedMaterials property names
- Tests: add strong instanceID equality checks for Renderer/MeshFilter
- prove no instantiation by shared instanceID before/after
- cover multi-material, null cases; prune brittle presence/console tests
- Clean up and relax ManageGameObject tests to avoid false negatives
* Address review: simplify edit-mode guard; include protected/internal [SerializeField]; fix tests to destroy temp primitives and use dictionary access; strengthen instanceID assertions
* Fix resource leaks in test files
- ManageGameObjectTests.cs: Destroy temporary primitive GameObject after extracting sharedMesh
- MaterialMeshInstantiationTests.cs: Destroy instantiated uniqueMesh after test completion
These fixes prevent resource leaks in Unity test files by properly cleaning up temporary objects created during tests.
* Fix reflection bug in GetComponentData tests
- Replace incorrect reflection-based field access with proper dictionary key access
- GetComponentData() returns Dictionary<string, object> where 'properties' is a key, not a field
- Tests now properly access the properties dictionary and run assertions
- Fixes ineffective tests that were silently failing due to reflection returning null
* deps: add tomli>=2.3.0 dependency to UnityMcpServer package
* feat: dynamically fetch package version from pyproject.toml for telemetry
* Add pydantic
* feat: add resource registry for MCP resource auto-discovery
* feat: add telemetry decorator for tracking MCP resource usage
* feat: add auto-discovery and registration system for MCP resources
* feat: add resource registration to MCP server initialization
* feat: add MCPResponse model class for standardized API responses
* refactor: replace Debug.Log calls with McpLog wrapper for consistent logging
* feat: add test discovery endpoints for Unity Test Framework integration
We haven't connected them as yet, still thinking about how to do this neatly
* Fix server setup
* refactor: reduce log verbosity by changing individual resource/tool registration logs to debug level
* chore: bump mcp[cli] dependency from 1.15.0 to 1.17.0
* refactor: remove Context parameter and add uri keyword argument in resource decorator
The Context parameter doesn't work on our version of FastMCP
* chore: upgrade Python base image to 3.13 and simplify Dockerfile setup
* fix: apply telemetry decorator before mcp.tool to ensure proper wrapping order
* fix: swap order of telemetry and resource decorators to properly wrap handlers
* fix: update log prefixes for consistency in logging methods
* Fix compile errors
* feat: extend command registry to support both tools and resources
* Run get tests as a coroutine because it doesn't return results immediately
This works but it spams logs like crazy, maybe there's a better/simpler way
* refactor: migrate from coroutines to async/await for test retrieval and command execution
* feat: add optional error field to MCPResponse model
* Increased timeout because loading tests can take some time
* Make message optional so error responses that only have success and error don't cause Pydantic errors
* Set max_retries to 5
This connection module needs a lookover. The retries should be an exponential backoff and we could structure why it's failing so much
* Use pydantic model to structure the error output
* fix: initialize data field in GetTestsResponse to avoid potential errors
* Don't return path parameter
* feat: add Unity test runner execution with structured results and Python bindings
* refactor: simplify GetTests by removing mode filtering and related parsing logic
* refactor: move test runner functionality into dedicated service interface
* feat: add resource retrieval telemetry tracking with new record type and helper function
* fix: convert tool functions to async and await ctx.info calls
* refactor: reorganize menu item functionality into separate execute and get commands
An MCP resource for retrieval, and a simple command to execute. Because it's a resource, it's easier for the user to see what's in the menu items
* refactor: rename manage_menu_item to execute_menu_item and update tool examples to use async/await
We'll eventually put a section for resources
* Revert "fix: convert tool functions to async and await ctx.info calls"
This reverts commit 012ea6b7439bd1f2593864d98d03d9d95d7bdd03.
* fix: replace tomllib with tomli for Python 3.10 compatibility in telemetry module
* Remove confusing comment
* refactor: improve error handling and simplify test retrieval logic in GetTests commands
* No cache by default
* docs: remove redundant comment for HandleCommand method in ExecuteMenuItem
* Copy UnityMcpBridge into a new MCPForUnity folder
This is to close#284
* refactor: rename UnityMcpBridge directory to MCPForUnity in docs
* chore: rename UnityMcpBridge directory to MCPForUnity across workflow files
* chore: rename UnityMcpBridge directory to MCPForUnity across all files
* refactor: update import paths from UnityMcpBridge to MCPForUnity across test files
* fix: update module import paths to use MCPForUnity instead of UnityMcpBridge
* chore: update unity-mcp package path to MCPForUnity directory
* feat: add OneTimeSetUp to initialize CommandRegistry before tests run
Hopefully fix the CI failures
* Apply recent fix to new folder
* Temporarily trigger tests to see if CI works
* Revert "Temporarily trigger tests to see if CI works"
It works!
This reverts commit 8c6eaaad07545cef047769f2c52fe506545a8161.
* 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>
* 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
CodeRabbit fixes:
- Fix Python test assertions to use assert instead of print/return
- Update version consistency: server_version.txt from 3.2.0 to 3.3.0
- Assembly definition references already correctly configured
Greptile style fixes:
- Add missing newlines at end of Unity meta files and source files
- Fix test logic assumptions: use GreaterOrEqual instead of exact counts
- Make test assertions more robust for fuzzy matching algorithms
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The TryResolve_PrefersPlayerAssemblies test was failing in CI because it referenced
TicTacToe3D.cs which exists only locally and is not committed to the repository.
- Replace test reference from "TicTacToe3D" to "CustomComponent"
- CustomComponent exists in Assets/Scripts/TestAsmdef/ and is tracked in git
- CustomComponent is properly compiled into the TestAsmdef Player assembly
- Add explicit assertion to verify resolution from correct TestAsmdef assembly
- Test maintains same functionality: verifying ComponentResolver finds user scripts from Player assemblies
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change from fail-fast to collect-and-continue at component iteration level
- Previously: first component error would halt processing of remaining components
- Now: all components are processed, errors collected and returned together
- Maintain existing collect-and-continue behavior within individual components
- Add comprehensive tests validating the collect-and-continue behavior works correctly
- All valid properties are applied even when invalid ones fail
- Processing continues through exceptions with proper error aggregation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Critical Bug Fixes:
- Fix operator precedence bug in ManageAsset.cs that could cause null reference exceptions
- Fix GameObject memory leak in primitive creation when name validation fails
- Add proper cleanup with DestroyImmediate when primitive creation fails
ComponentResolver Integration:
- Replace fragile string-based GetComponent() calls with robust ComponentResolver
- Add ComponentResolver integration in ManageAsset.cs for component lookups
- Add fallback to string-based lookup in ManageGameObject.cs for compatibility
Enhanced Error Handling:
- Surface specific ComponentResolver error context in ScriptableObject creation failures
- Add support for setting private [SerializeField] fields in property matching
- Improve debugging with detailed error messages
Assembly Definition Fixes:
- Configure TestAsmdef as Editor-only to prevent build bloat
- Add explicit TestAsmdef reference to test assembly for proper component resolution
- Fix ComponentResolverTests to use accessible CustomComponent instead of TicTacToe3D
Code Quality:
- Disable nullable reference types for legacy codebase to eliminate 100+ warnings
- Maintain backward compatibility while improving reliability
All 45 unit tests pass, ensuring no regressions while significantly improving robustness.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add intelligent property name suggestions when property setting fails
- Implement GetAllComponentProperties to enumerate available properties
- Add rule-based AI algorithm for property name matching (camelCase, spaces, etc.)
- Include comprehensive error messages with suggestions and full property lists
- Add Levenshtein distance calculation for fuzzy string matching
- Cache suggestions to improve performance on repeated queries
- Add comprehensive unit tests (11 tests) covering all ComponentResolver scenarios
- Add InternalsVisibleTo attribute for test access to internal classes
Examples of improved error messages:
- "Max Reach Distance" → "Did you mean: maxReachDistance?"
- Shows all available properties when property not found
- Handles Unity Inspector display names vs actual field names
All tests passing (21/21) including new ComponentResolver test suite.
The system eliminates silent property setting failures and provides
actionable feedback to developers.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 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