mcpforunityserver 10.0.2__tar.gz → 10.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. {mcpforunityserver-10.0.2/src/mcpforunityserver.egg-info → mcpforunityserver-10.1.0}/PKG-INFO +2 -2
  2. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/README.md +1 -1
  3. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/pyproject.toml +1 -1
  4. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/asset_gen.py +44 -1
  5. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0/src/mcpforunityserver.egg-info}/PKG-INFO +2 -2
  6. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/mcpforunityserver.egg-info/SOURCES.txt +2 -0
  7. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/registry/tool_registry.py +1 -1
  8. mcpforunityserver-10.1.0/src/services/tools/generate_audio.py +79 -0
  9. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/generate_model.py +4 -1
  10. mcpforunityserver-10.1.0/tests/test_asset_gen_audio.py +145 -0
  11. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_asset_gen_model.py +10 -1
  12. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/LICENSE +0 -0
  13. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/setup.cfg +0 -0
  14. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/__init__.py +0 -0
  15. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/__init__.py +0 -0
  16. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/animation.py +0 -0
  17. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/asset.py +0 -0
  18. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/audio.py +0 -0
  19. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/batch.py +0 -0
  20. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/build.py +0 -0
  21. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/camera.py +0 -0
  22. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/code.py +0 -0
  23. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/component.py +0 -0
  24. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/docs.py +0 -0
  25. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/editor.py +0 -0
  26. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/gameobject.py +0 -0
  27. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/graphics.py +0 -0
  28. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/instance.py +0 -0
  29. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/lighting.py +0 -0
  30. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/material.py +0 -0
  31. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/packages.py +0 -0
  32. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/physics.py +0 -0
  33. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/prefab.py +0 -0
  34. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/probuilder.py +0 -0
  35. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/profiler.py +0 -0
  36. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/reflect.py +0 -0
  37. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/scene.py +0 -0
  38. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/script.py +0 -0
  39. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/shader.py +0 -0
  40. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/texture.py +0 -0
  41. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/tool.py +0 -0
  42. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/ui.py +0 -0
  43. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/commands/vfx.py +0 -0
  44. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/main.py +0 -0
  45. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/__init__.py +0 -0
  46. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/config.py +0 -0
  47. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/confirmation.py +0 -0
  48. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/connection.py +0 -0
  49. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/constants.py +0 -0
  50. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/output.py +0 -0
  51. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/parsers.py +0 -0
  52. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/cli/utils/suggestions.py +0 -0
  53. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/core/__init__.py +0 -0
  54. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/core/config.py +0 -0
  55. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/core/constants.py +0 -0
  56. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/core/logging_decorator.py +0 -0
  57. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/core/telemetry.py +0 -0
  58. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/core/telemetry_decorator.py +0 -0
  59. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/main.py +0 -0
  60. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/mcpforunityserver.egg-info/dependency_links.txt +0 -0
  61. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/mcpforunityserver.egg-info/entry_points.txt +0 -0
  62. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/mcpforunityserver.egg-info/requires.txt +0 -0
  63. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/mcpforunityserver.egg-info/top_level.txt +0 -0
  64. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/models/__init__.py +0 -0
  65. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/models/models.py +0 -0
  66. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/models/unity_response.py +0 -0
  67. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/__init__.py +0 -0
  68. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/api_key_service.py +0 -0
  69. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/custom_tool_service.py +0 -0
  70. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/registry/__init__.py +0 -0
  71. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/registry/resource_registry.py +0 -0
  72. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/__init__.py +0 -0
  73. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/active_tool.py +0 -0
  74. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/cameras.py +0 -0
  75. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/custom_tools.py +0 -0
  76. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/editor_state.py +0 -0
  77. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/gameobject.py +0 -0
  78. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/layers.py +0 -0
  79. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/menu_items.py +0 -0
  80. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/prefab.py +0 -0
  81. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/prefab_stage.py +0 -0
  82. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/project_info.py +0 -0
  83. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/renderer_features.py +0 -0
  84. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/rendering_stats.py +0 -0
  85. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/selection.py +0 -0
  86. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/tags.py +0 -0
  87. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/tests.py +0 -0
  88. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/tool_groups.py +0 -0
  89. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/unity_instances.py +0 -0
  90. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/volumes.py +0 -0
  91. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/resources/windows.py +0 -0
  92. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/state/external_changes_scanner.py +0 -0
  93. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/__init__.py +0 -0
  94. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/batch_execute.py +0 -0
  95. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/debug_request_context.py +0 -0
  96. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/execute_code.py +0 -0
  97. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/execute_custom_tool.py +0 -0
  98. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/execute_menu_item.py +0 -0
  99. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/find_gameobjects.py +0 -0
  100. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/find_in_file.py +0 -0
  101. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/generate_image.py +0 -0
  102. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/import_model.py +0 -0
  103. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/import_model_file.py +0 -0
  104. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_animation.py +0 -0
  105. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_asset.py +0 -0
  106. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_build.py +0 -0
  107. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_camera.py +0 -0
  108. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_components.py +0 -0
  109. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_editor.py +0 -0
  110. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_gameobject.py +0 -0
  111. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_graphics.py +0 -0
  112. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_material.py +0 -0
  113. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_packages.py +0 -0
  114. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_physics.py +0 -0
  115. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_prefabs.py +0 -0
  116. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_probuilder.py +0 -0
  117. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_profiler.py +0 -0
  118. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_scene.py +0 -0
  119. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_script.py +0 -0
  120. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_scriptable_object.py +0 -0
  121. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_shader.py +0 -0
  122. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_texture.py +0 -0
  123. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_tools.py +0 -0
  124. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_ui.py +0 -0
  125. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/manage_vfx.py +0 -0
  126. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/preflight.py +0 -0
  127. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/read_console.py +0 -0
  128. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/refresh_unity.py +0 -0
  129. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/run_tests.py +0 -0
  130. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/script_apply_edits.py +0 -0
  131. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/set_active_instance.py +0 -0
  132. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/unity_docs.py +0 -0
  133. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/unity_reflect.py +0 -0
  134. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/services/tools/utils.py +0 -0
  135. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/__init__.py +0 -0
  136. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/legacy/port_discovery.py +0 -0
  137. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/legacy/stdio_port_registry.py +0 -0
  138. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/legacy/unity_connection.py +0 -0
  139. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/models.py +0 -0
  140. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/plugin_hub.py +0 -0
  141. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/plugin_registry.py +0 -0
  142. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/unity_instance_middleware.py +0 -0
  143. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/transport/unity_transport.py +0 -0
  144. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/utils/focus_nudge.py +0 -0
  145. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/utils/log_paths.py +0 -0
  146. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/src/utils/module_discovery.py +0 -0
  147. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_asset_gen_image.py +0 -0
  148. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_asset_gen_import.py +0 -0
  149. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_asset_gen_import_file.py +0 -0
  150. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_asset_gen_scaffold.py +0 -0
  151. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_cli.py +0 -0
  152. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_cli_commands_characterization.py +0 -0
  153. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_core_infrastructure_characterization.py +0 -0
  154. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_custom_tool_service_user_scope.py +0 -0
  155. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_execute_code.py +0 -0
  156. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_focus_nudge.py +0 -0
  157. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_log_paths.py +0 -0
  158. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_animation.py +0 -0
  159. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_build.py +0 -0
  160. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_camera.py +0 -0
  161. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_editor.py +0 -0
  162. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_graphics.py +0 -0
  163. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_packages.py +0 -0
  164. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_physics.py +0 -0
  165. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_prefabs.py +0 -0
  166. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_probuilder.py +0 -0
  167. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_profiler.py +0 -0
  168. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_scene.py +0 -0
  169. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_manage_vfx_actions.py +0 -0
  170. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_models_characterization.py +0 -0
  171. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_param_normalizer.py +0 -0
  172. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_plugin_hub_wait_env.py +0 -0
  173. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_stdio_instance_resolution.py +0 -0
  174. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_tool_registry_metadata.py +0 -0
  175. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_tool_test_symmetry.py +0 -0
  176. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_transport_characterization.py +0 -0
  177. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_unity_docs.py +0 -0
  178. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_unity_reflect.py +0 -0
  179. {mcpforunityserver-10.0.2 → mcpforunityserver-10.1.0}/tests/test_utilities_characterization.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcpforunityserver
3
- Version: 10.0.2
3
+ Version: 10.1.0
4
4
  Summary: MCP for Unity Server: A Unity package for Unity Editor integration via the Model Context Protocol (MCP).
5
5
  Author-email: Marcus Sanatan <msanatan@gmail.com>, David Sarno <david.sarno@gmail.com>, Wu Shutong <martinwfire@gmail.com>
6
6
  License-Expression: MIT
@@ -115,7 +115,7 @@ Use this to run the latest released version from the repository. Change the vers
115
115
  "command": "uvx",
116
116
  "args": [
117
117
  "--from",
118
- "git+https://github.com/CoplayDev/unity-mcp@v10.0.2#subdirectory=Server",
118
+ "git+https://github.com/CoplayDev/unity-mcp@v10.1.0#subdirectory=Server",
119
119
  "mcp-for-unity",
120
120
  "--transport",
121
121
  "stdio"
@@ -71,7 +71,7 @@ Use this to run the latest released version from the repository. Change the vers
71
71
  "command": "uvx",
72
72
  "args": [
73
73
  "--from",
74
- "git+https://github.com/CoplayDev/unity-mcp@v10.0.2#subdirectory=Server",
74
+ "git+https://github.com/CoplayDev/unity-mcp@v10.1.0#subdirectory=Server",
75
75
  "mcp-for-unity",
76
76
  "--transport",
77
77
  "stdio"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcpforunityserver"
3
- version = "10.0.2"
3
+ version = "10.1.0"
4
4
  description = "MCP for Unity Server: A Unity package for Unity Editor integration via the Model Context Protocol (MCP)."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,4 +1,4 @@
1
- """AI asset generation CLI commands (3D model gen/import, 2D image gen).
1
+ """AI asset generation CLI commands (3D model gen/import, 2D image gen, audio gen).
2
2
 
3
3
  Thin pass-through to Unity over HTTP: these commands carry NO API keys and NO
4
4
  file bytes. The C# side reads provider keys from the OS secure store, performs
@@ -38,6 +38,7 @@ def _emit(result, config, verb):
38
38
  @click.option("--target-size", default=None, type=float, help="Normalize largest dimension (meters).")
39
39
  @click.option("--texture/--no-texture", "texture", default=None, help="Generate textures.")
40
40
  @click.option("--tier", default=None, help="Provider quality/cost tier.")
41
+ @click.option("--model", default=None, help="Provider model id/version (omit for the GUI-selected default).")
41
42
  @click.option("--name", default=None, help="Base name for the imported asset.")
42
43
  @click.option("--output-folder", default=None, help="Destination folder under Assets/.")
43
44
  @handle_unity_errors
@@ -51,6 +52,7 @@ def generate_model(
51
52
  target_size: Optional[float],
52
53
  texture: Optional[bool],
53
54
  tier: Optional[str],
55
+ model: Optional[str],
54
56
  name: Optional[str],
55
57
  output_folder: Optional[str],
56
58
  ):
@@ -74,6 +76,7 @@ def generate_model(
74
76
  "targetSize": target_size,
75
77
  "texture": texture,
76
78
  "tier": tier,
79
+ "model": model,
77
80
  "name": name,
78
81
  "outputFolder": output_folder,
79
82
  }
@@ -197,6 +200,46 @@ def generate_image(
197
200
  _emit(result, config, "Generation")
198
201
 
199
202
 
203
+ @asset_gen.command("generate-audio")
204
+ @click.option("--provider", default=None, help="Provider id (fal).")
205
+ @click.option("--prompt", default=None, help="Text prompt describing the sound or music.")
206
+ @click.option("--model", default=None, help="fal model id (omit for the GUI-selected default).")
207
+ @click.option("--duration", default=None, type=float, help="Requested length in seconds (soft-clamped per model).")
208
+ @click.option("--name", default=None, help="Base name for the imported asset.")
209
+ @click.option("--output-folder", default=None, help="Destination folder under Assets/.")
210
+ @handle_unity_errors
211
+ def generate_audio(
212
+ provider: Optional[str],
213
+ prompt: Optional[str],
214
+ model: Optional[str],
215
+ duration: Optional[float],
216
+ name: Optional[str],
217
+ output_folder: Optional[str],
218
+ ):
219
+ """Generate audio (SFX / music) with a fal.ai model.
220
+
221
+ \b
222
+ Examples:
223
+ unity-mcp asset-gen generate-audio --provider fal --prompt "8-bit coin pickup"
224
+ unity-mcp asset-gen generate-audio --prompt "calm ambient loop" --duration 30
225
+ """
226
+ config = get_config()
227
+
228
+ params: dict[str, Any] = {"action": "generate"}
229
+ optional = {
230
+ "provider": provider,
231
+ "prompt": prompt,
232
+ "model": model,
233
+ "duration": duration,
234
+ "name": name,
235
+ "outputFolder": output_folder,
236
+ }
237
+ params.update({k: v for k, v in optional.items() if v is not None})
238
+
239
+ result = run_command("generate_audio", params, config)
240
+ _emit(result, config, "Generation")
241
+
242
+
200
243
  @asset_gen.command("status")
201
244
  @click.option("--job-id", "job_id", required=True, help="Job id returned by a generate/import command.")
202
245
  @handle_unity_errors
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcpforunityserver
3
- Version: 10.0.2
3
+ Version: 10.1.0
4
4
  Summary: MCP for Unity Server: A Unity package for Unity Editor integration via the Model Context Protocol (MCP).
5
5
  Author-email: Marcus Sanatan <msanatan@gmail.com>, David Sarno <david.sarno@gmail.com>, Wu Shutong <martinwfire@gmail.com>
6
6
  License-Expression: MIT
@@ -115,7 +115,7 @@ Use this to run the latest released version from the repository. Change the vers
115
115
  "command": "uvx",
116
116
  "args": [
117
117
  "--from",
118
- "git+https://github.com/CoplayDev/unity-mcp@v10.0.2#subdirectory=Server",
118
+ "git+https://github.com/CoplayDev/unity-mcp@v10.1.0#subdirectory=Server",
119
119
  "mcp-for-unity",
120
120
  "--transport",
121
121
  "stdio"
@@ -92,6 +92,7 @@ src/services/tools/execute_custom_tool.py
92
92
  src/services/tools/execute_menu_item.py
93
93
  src/services/tools/find_gameobjects.py
94
94
  src/services/tools/find_in_file.py
95
+ src/services/tools/generate_audio.py
95
96
  src/services/tools/generate_image.py
96
97
  src/services/tools/generate_model.py
97
98
  src/services/tools/import_model.py
@@ -139,6 +140,7 @@ src/transport/legacy/unity_connection.py
139
140
  src/utils/focus_nudge.py
140
141
  src/utils/log_paths.py
141
142
  src/utils/module_discovery.py
143
+ tests/test_asset_gen_audio.py
142
144
  tests/test_asset_gen_image.py
143
145
  tests/test_asset_gen_import.py
144
146
  tests/test_asset_gen_import_file.py
@@ -25,7 +25,7 @@ TOOL_GROUPS: dict[str, str] = {
25
25
  "testing": "Test runner & async test jobs",
26
26
  "probuilder": "ProBuilder 3D modeling – requires com.unity.probuilder package",
27
27
  "profiling": "Unity Profiler session control, counters, memory snapshots & Frame Debugger",
28
- "asset_gen": "AI asset generation – 3D model gen/import & 2D image gen (bring-your-own-key)",
28
+ "asset_gen": "AI asset generation – 3D model gen/import, 2D image gen & audio gen (bring-your-own-key)",
29
29
  }
30
30
 
31
31
  DEFAULT_ENABLED_GROUPS: set[str] = {"core"}
@@ -0,0 +1,79 @@
1
+ """
2
+ Defines the generate_audio tool for AI audio (SFX / music) generation in Unity.
3
+
4
+ Thin pass-through: this tool carries NO API keys and NO file bytes. The C# side
5
+ reads the user's fal.ai key from the OS secure store, performs the provider
6
+ HTTPS call, downloads the result, and imports it as an AudioClip.
7
+ """
8
+ from typing import Annotated, Any, Literal
9
+
10
+ from fastmcp import Context
11
+ from mcp.types import ToolAnnotations
12
+
13
+ from services.registry import mcp_for_unity_tool
14
+ from services.tools import get_unity_instance_from_context
15
+ from transport.unity_transport import send_with_unity_instance
16
+ from transport.legacy.unity_connection import async_send_command_with_retry
17
+
18
+
19
+ @mcp_for_unity_tool(
20
+ group="asset_gen",
21
+ description=(
22
+ "Generate audio (sound effects and background music) with fal.ai models and import "
23
+ "them as AudioClips into the Unity project. Bring-your-own-key: the fal key lives in "
24
+ "the editor's secure store (shared with image generation) and never crosses the bridge.\n\n"
25
+ "MODELS (all via fal.ai): fal-ai/stable-audio-25/text-to-audio (music + SFX, <=190s), "
26
+ "cassetteai/sound-effects-generator (SFX, <=30s), cassetteai/music-generator (music), "
27
+ "fal-ai/lyria2 (music). Omit model to use the model selected in the "
28
+ "MCP for Unity -> Asset Generation tab.\n\n"
29
+ "ACTIONS:\n"
30
+ "- generate: Submit an audio job from a text prompt. Returns { job_id }; poll with the "
31
+ "status action. Params: provider (fal), prompt, model, duration (seconds), name, "
32
+ "output_folder.\n"
33
+ "- status: Poll an async job by job_id -> { state, progress, assetPath?, error? }.\n"
34
+ "- cancel: Cancel an in-flight job by job_id.\n"
35
+ "- list_providers: List configured audio providers and capabilities (no key values)."
36
+ ),
37
+ annotations=ToolAnnotations(
38
+ title="Generate Audio",
39
+ destructiveHint=False,
40
+ ),
41
+ )
42
+ async def generate_audio(
43
+ ctx: Context,
44
+ action: Annotated[Literal["generate", "status", "cancel", "list_providers"],
45
+ "Action to perform."],
46
+
47
+ provider: Annotated[str, "Provider id (fal)."] | None = None,
48
+ prompt: Annotated[str, "Text prompt describing the sound or music."] | None = None,
49
+ model: Annotated[str, "fal model id (e.g. fal-ai/stable-audio-25/text-to-audio). "
50
+ "Omit to use the GUI-selected default."] | None = None,
51
+ duration: Annotated[float, "Requested length in seconds (soft-clamped per model)."] | None = None,
52
+ name: Annotated[str, "Base name for the imported asset."] | None = None,
53
+ output_folder: Annotated[str, "Destination folder under Assets/ for the import."] | None = None,
54
+ job_id: Annotated[str, "Job id for status/cancel."] | None = None,
55
+ ) -> dict[str, Any]:
56
+ unity_instance = await get_unity_instance_from_context(ctx)
57
+
58
+ params_dict = {
59
+ "action": action.lower(),
60
+ "provider": provider,
61
+ "prompt": prompt,
62
+ "model": model,
63
+ "duration": duration,
64
+ "name": name,
65
+ "outputFolder": output_folder,
66
+ "jobId": job_id,
67
+ }
68
+
69
+ # Remove None values
70
+ params_dict = {k: v for k, v in params_dict.items() if v is not None}
71
+
72
+ result = await send_with_unity_instance(
73
+ async_send_command_with_retry,
74
+ unity_instance,
75
+ "generate_audio",
76
+ params_dict,
77
+ )
78
+
79
+ return result if isinstance(result, dict) else {"success": False, "message": str(result)}
@@ -26,7 +26,7 @@ from transport.legacy.unity_connection import async_send_command_with_retry
26
26
  "- generate: Submit a generation job (text->3D or image->3D). Returns { job_id } "
27
27
  "immediately; poll with the status action. Params: provider, mode (text|image), "
28
28
  "prompt, image_path|image_url, format (glb|fbx|obj|usdz), target_size, texture, "
29
- "tier, name, output_folder.\n"
29
+ "tier, model, name, output_folder.\n"
30
30
  "- status: Poll an async job by job_id -> { state, progress, assetPath?, error? }.\n"
31
31
  "- cancel: Cancel an in-flight job by job_id.\n"
32
32
  "- list_providers: List configured 3D providers and capabilities (no key values)."
@@ -50,6 +50,8 @@ async def generate_model(
50
50
  target_size: Annotated[float, "Normalize the largest dimension to this size (meters)."] | None = None,
51
51
  texture: Annotated[bool, "Whether to generate textures for the model."] | None = None,
52
52
  tier: Annotated[str, "Provider quality/cost tier."] | None = None,
53
+ model: Annotated[str, "Provider model id/version (e.g. Tripo v3.1, Meshy meshy-6). "
54
+ "Omit for the GUI-selected default."] | None = None,
53
55
  name: Annotated[str, "Base name for the imported asset."] | None = None,
54
56
  output_folder: Annotated[str, "Destination folder under Assets/ for the import."] | None = None,
55
57
  job_id: Annotated[str, "Job id for status/cancel."] | None = None,
@@ -67,6 +69,7 @@ async def generate_model(
67
69
  "targetSize": target_size,
68
70
  "texture": texture,
69
71
  "tier": tier,
72
+ "model": model,
70
73
  "name": name,
71
74
  "outputFolder": output_folder,
72
75
  "jobId": job_id,
@@ -0,0 +1,145 @@
1
+ """Tests for the generate_audio asset-gen tool and CLI command (fal.ai).
2
+
3
+ Pass-through tool: NO API keys, NO file bytes. Unity transport fully mocked.
4
+ """
5
+
6
+ import asyncio
7
+ import pytest
8
+ from unittest.mock import patch, MagicMock, AsyncMock
9
+ from click.testing import CliRunner
10
+
11
+ from cli.commands.asset_gen import asset_gen
12
+ from cli.utils.config import CLIConfig
13
+ from services.registry import get_registered_tools
14
+
15
+ from services.tools import generate_audio as generate_audio_module
16
+ from services.tools.generate_audio import generate_audio
17
+
18
+
19
+ COMMAND = "generate_audio"
20
+ ALLOWED_KEYS = {
21
+ "action", "provider", "prompt", "model", "duration", "name", "outputFolder", "jobId",
22
+ }
23
+
24
+
25
+ def _call_tool(**kwargs):
26
+ ctx = MagicMock()
27
+ with patch.object(generate_audio_module, "get_unity_instance_from_context",
28
+ new=AsyncMock(return_value="unity-1")):
29
+ with patch.object(generate_audio_module, "send_with_unity_instance",
30
+ new=AsyncMock(return_value={"success": True, "data": {}})) as mock_send:
31
+ result = asyncio.run(generate_audio(ctx, **kwargs))
32
+ return result, mock_send.call_args.args
33
+
34
+
35
+ def _sent_command(sent_args):
36
+ return sent_args[2]
37
+
38
+
39
+ def _sent_params(sent_args):
40
+ return sent_args[3]
41
+
42
+
43
+ @pytest.fixture
44
+ def runner():
45
+ return CliRunner()
46
+
47
+
48
+ @pytest.fixture
49
+ def mock_config():
50
+ return CLIConfig(host="127.0.0.1", port=8080, timeout=30, format="text", unity_instance=None)
51
+
52
+
53
+ @pytest.fixture
54
+ def cli_runner(runner, mock_config):
55
+ def _invoke(args):
56
+ with patch("cli.commands.asset_gen.get_config", return_value=mock_config):
57
+ with patch("cli.commands.asset_gen.run_command",
58
+ return_value={"success": True, "message": "OK", "data": {}}) as mock_run:
59
+ result = runner.invoke(asset_gen, args)
60
+ return result, mock_run
61
+ return _invoke
62
+
63
+
64
+ class TestGenerateAudioRegistration:
65
+ def test_tool_registered_under_asset_gen_group(self):
66
+ tools = get_registered_tools()
67
+ tool = next((t for t in tools if t["name"] == "generate_audio"), None)
68
+ assert tool is not None
69
+ assert tool["group"] == "asset_gen"
70
+
71
+
72
+ class TestGenerateAudioRouting:
73
+ def test_generate_routes_to_command(self):
74
+ _, sent = _call_tool(action="generate", provider="fal", prompt="8-bit coin pickup")
75
+ assert _sent_command(sent) == COMMAND
76
+ assert _sent_params(sent)["action"] == "generate"
77
+
78
+ def test_status_and_job_id_mapping(self):
79
+ _, sent = _call_tool(action="status", job_id="j5")
80
+ assert _sent_params(sent) == {"action": "status", "jobId": "j5"}
81
+
82
+ def test_param_camelcase_mapping(self):
83
+ _, sent = _call_tool(
84
+ action="generate", provider="fal", prompt="rain", duration=30.0,
85
+ output_folder="Assets/Generated/Audio",
86
+ )
87
+ params = _sent_params(sent)
88
+ assert params["outputFolder"] == "Assets/Generated/Audio"
89
+ assert params["duration"] == 30.0
90
+ for snake in ("output_folder", "job_id"):
91
+ assert snake not in params
92
+
93
+ def test_action_is_lowercased(self):
94
+ _, sent = _call_tool(action="GENERATE", prompt="p")
95
+ assert _sent_params(sent)["action"] == "generate"
96
+
97
+ def test_omitting_model_drops_it(self):
98
+ # Load-bearing precondition for the GUI-selected default: an omitted model must NOT be
99
+ # sent, so the C# side falls back to the panel selection / catalog default.
100
+ _, sent = _call_tool(action="generate", provider="fal", prompt="p")
101
+ params = _sent_params(sent)
102
+ assert "model" not in params
103
+ assert params == {"action": "generate", "provider": "fal", "prompt": "p"}
104
+
105
+ def test_explicit_model_passes_through(self):
106
+ _, sent = _call_tool(action="generate", provider="fal", prompt="p",
107
+ model="cassetteai/sound-effects-generator")
108
+ assert _sent_params(sent)["model"] == "cassetteai/sound-effects-generator"
109
+
110
+ def test_no_secret_keys_in_payload(self):
111
+ _, sent = _call_tool(
112
+ action="generate", provider="fal", prompt="p",
113
+ model="fal-ai/stable-audio-25/text-to-audio", duration=12.5, name="Sfx",
114
+ output_folder="Assets/Generated/Audio", job_id="j",
115
+ )
116
+ params = _sent_params(sent)
117
+ assert set(params.keys()).issubset(ALLOWED_KEYS)
118
+ joined = " ".join(params.keys()).lower()
119
+ for forbidden in ("key", "secret", "token", "apikey", "password"):
120
+ assert forbidden not in joined
121
+
122
+ def test_non_dict_response_guarded(self):
123
+ ctx = MagicMock()
124
+ with patch.object(generate_audio_module, "get_unity_instance_from_context",
125
+ new=AsyncMock(return_value="u")):
126
+ with patch.object(generate_audio_module, "send_with_unity_instance",
127
+ new=AsyncMock(return_value=42)):
128
+ result = asyncio.run(generate_audio(ctx, action="status", job_id="j"))
129
+ assert result["success"] is False
130
+ assert "42" in result["message"]
131
+
132
+
133
+ class TestGenerateAudioCLI:
134
+ def test_generate_audio_cli(self, cli_runner):
135
+ result, mock_run = cli_runner([
136
+ "generate-audio", "--provider", "fal", "--prompt", "ambient", "--duration", "30",
137
+ ])
138
+ assert result.exit_code == 0
139
+ command = mock_run.call_args.args[0]
140
+ params = mock_run.call_args.args[1]
141
+ assert command == COMMAND
142
+ assert params["action"] == "generate"
143
+ assert params["provider"] == "fal"
144
+ assert params["duration"] == 30.0
145
+ assert set(params.keys()).issubset(ALLOWED_KEYS)
@@ -22,7 +22,7 @@ COMMAND = "generate_model"
22
22
  # Every camelCase key the tool is allowed to send. Crucially, no key/secret param.
23
23
  ALLOWED_KEYS = {
24
24
  "action", "provider", "mode", "prompt", "imagePath", "imageUrl",
25
- "format", "targetSize", "texture", "tier", "name", "outputFolder", "jobId",
25
+ "format", "targetSize", "texture", "tier", "model", "name", "outputFolder", "jobId",
26
26
  }
27
27
 
28
28
 
@@ -130,6 +130,15 @@ class TestGenerateModelRouting:
130
130
  for snake in ("image_path", "image_url", "target_size", "output_folder", "job_id"):
131
131
  assert snake not in params
132
132
 
133
+ def test_model_param_passthrough(self):
134
+ _, sent = _call_tool(action="generate", provider="tripo", prompt="x", model="v3.1-20260211")
135
+ params = _sent_params(sent)
136
+ assert params["model"] == "v3.1-20260211"
137
+
138
+ def test_model_omitted_is_dropped(self):
139
+ _, sent = _call_tool(action="generate", provider="tripo", prompt="x")
140
+ assert "model" not in _sent_params(sent)
141
+
133
142
  def test_none_values_stripped(self):
134
143
  _, sent = _call_tool(action="generate", provider="tripo", prompt="x")
135
144
  params = _sent_params(sent)