Skip to content

Commit f7d85b4

Browse files
committed
Merge query into manage_package
1 parent bed864e commit f7d85b4

7 files changed

Lines changed: 42 additions & 80 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<details>
2121
<summary><strong>Recent Updates</strong></summary>
2222

23-
* **v9.5.4 (beta)** — New `manage_packages` and `query_packages` tools: install, remove, search, and manage Unity packages and scoped registries. Includes input validation, dependency checks on removal, and git URL warnings.
23+
* **v9.5.4 (beta)** — New `manage_packages` tool: install, remove, search, and manage Unity packages and scoped registries. Includes input validation, dependency checks on removal, and git URL warnings.
2424
* **v9.5.3** — New `manage_graphics` tool (33 actions): volume/post-processing, light baking, rendering stats, pipeline settings, URP renderer features. 3 new resources: `volumes`, `rendering_stats`, `renderer_features`.
2525
* **v9.5.2** — New `manage_camera` tool with Cinemachine support (presets, priority, noise, blending, extensions), `cameras` resource, priority persistence fix via SerializedProperty.
2626
* **v9.4.8** — New editor UI, real-time tool toggling via `manage_tools`, skill sync window, multi-view screenshot, one-click Roslyn installer, Qwen Code & Gemini CLI clients, ProBuilder mesh editing via `manage_probuilder`.
@@ -94,7 +94,7 @@ openupm add com.coplaydev.unity-mcp
9494
* **Extensible** — Works with various MCP Clients
9595

9696
### Available Tools
97-
`apply_text_edits``batch_execute``create_script``debug_request_context``delete_script``execute_custom_tool``execute_menu_item``find_gameobjects``find_in_file``get_sha``get_test_job``manage_animation``manage_asset``manage_camera``manage_components``manage_editor``manage_gameobject``manage_graphics``manage_material``manage_packages``manage_prefabs``manage_probuilder``manage_scene``manage_script``manage_script_capabilities``manage_scriptable_object``manage_shader``manage_texture``manage_tools``manage_ui``manage_vfx` `query_packages``read_console``refresh_unity``run_tests``script_apply_edits``set_active_instance``validate_script`
97+
`apply_text_edits``batch_execute``create_script``debug_request_context``delete_script``execute_custom_tool``execute_menu_item``find_gameobjects``find_in_file``get_sha``get_test_job``manage_animation``manage_asset``manage_camera``manage_components``manage_editor``manage_gameobject``manage_graphics``manage_material``manage_packages``manage_prefabs``manage_probuilder``manage_scene``manage_script``manage_script_capabilities``manage_scriptable_object``manage_shader``manage_texture``manage_tools``manage_ui``manage_vfx``read_console``refresh_unity``run_tests``script_apply_edits``set_active_instance``validate_script`
9898

9999
### Available Resources
100100
`cameras``custom_tools``renderer_features``rendering_stats``volumes``editor_active_tool``editor_prefab_stage``editor_selection``editor_state``editor_windows``gameobject``gameobject_api``gameobject_component``gameobject_components``get_tests``get_tests_for_mode``menu_items``prefab_api``prefab_hierarchy``prefab_info``project_info``project_layers``project_tags``tool_groups``unity_instances`

Server/src/services/tools/manage_packages.py

Lines changed: 12 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
from transport.unity_transport import send_with_unity_instance
99
from transport.legacy.unity_connection import async_send_command_with_retry
1010

11-
QUERY_ACTIONS = ["list_packages", "search_packages", "get_package_info", "ping", "status"]
12-
MUTATE_ACTIONS = [
11+
ALL_ACTIONS = [
12+
"list_packages", "search_packages", "get_package_info", "ping", "status",
1313
"add_package", "remove_package", "embed_package", "resolve_packages",
1414
"add_registry", "remove_registry",
1515
]
16-
ALL_ACTIONS = QUERY_ACTIONS + MUTATE_ACTIONS
1716

1817

1918
async def _send_packages_command(
@@ -30,46 +29,13 @@ async def _send_packages_command(
3029
@mcp_for_unity_tool(
3130
group="core",
3231
description=(
33-
"Query Unity package information (read-only).\n\n"
32+
"Manage Unity packages: query, install, remove, embed, and configure registries.\n\n"
33+
"QUERY (read-only):\n"
3434
"- list_packages: List all installed packages\n"
3535
"- search_packages: Search Unity registry by keyword\n"
3636
"- get_package_info: Get details about a specific installed package\n"
3737
"- ping: Check package manager availability\n"
38-
"- status: Poll async job status (for add/remove/list/search operations)"
39-
),
40-
annotations=ToolAnnotations(
41-
title="Query Packages",
42-
readOnlyHint=True,
43-
destructiveHint=False,
44-
),
45-
)
46-
async def query_packages(
47-
ctx: Context,
48-
action: Annotated[str, "The query action to perform."],
49-
package: Annotated[Optional[str], "Package name for get_package_info."] = None,
50-
query: Annotated[Optional[str], "Search query for search_packages."] = None,
51-
job_id: Annotated[Optional[str], "Job ID for polling status."] = None,
52-
) -> dict[str, Any]:
53-
action_lower = action.lower()
54-
if action_lower not in QUERY_ACTIONS:
55-
return {
56-
"success": False,
57-
"message": f"Unknown query action '{action}'. Valid actions: {', '.join(QUERY_ACTIONS)}",
58-
}
59-
60-
params_dict: dict[str, Any] = {"action": action_lower}
61-
for key, val in [("package", package), ("query", query), ("job_id", job_id)]:
62-
if val is not None:
63-
params_dict[key] = val
64-
65-
return await _send_packages_command(ctx, params_dict)
66-
67-
68-
@mcp_for_unity_tool(
69-
group="core",
70-
description=(
71-
"Modify Unity packages: install, remove, embed, and configure registries. "
72-
"Triggers domain reload on add/remove.\n\n"
38+
"- status: Poll async job status (for add/remove/list/search operations)\n\n"
7339
"INSTALL/REMOVE:\n"
7440
"- add_package: Install a package (name, name@version, git URL, or file: path)\n"
7541
"- remove_package: Remove a package (checks dependents; use force=true to override)\n\n"
@@ -91,21 +57,25 @@ async def manage_packages(
9157
action: Annotated[str, "The package action to perform."],
9258
package: Annotated[Optional[str], "Package identifier (name, name@version, git URL, or file: path)."] = None,
9359
force: Annotated[Optional[bool], "Force removal even if other packages depend on it."] = None,
94-
name: Annotated[Optional[str], "Registry name for add_registry."] = None,
60+
query: Annotated[Optional[str], "Search query for search_packages."] = None,
61+
job_id: Annotated[Optional[str], "Job ID for polling status."] = None,
62+
name: Annotated[Optional[str], "Registry name for add_registry/remove_registry."] = None,
9563
url: Annotated[Optional[str], "Registry URL for add_registry."] = None,
9664
scopes: Annotated[Optional[list[str]], "Registry scopes for add_registry."] = None,
9765
) -> dict[str, Any]:
9866
action_lower = action.lower()
99-
if action_lower not in MUTATE_ACTIONS:
67+
if action_lower not in ALL_ACTIONS:
10068
return {
10169
"success": False,
102-
"message": f"Unknown action '{action}'. Valid actions: {', '.join(MUTATE_ACTIONS)}",
70+
"message": f"Unknown action '{action}'. Valid actions: {', '.join(ALL_ACTIONS)}",
10371
}
10472

10573
params_dict: dict[str, Any] = {"action": action_lower}
10674
param_map = {
10775
"package": package,
10876
"force": force,
77+
"query": query,
78+
"job_id": job_id,
10979
"name": name,
11080
"url": url,
11181
"scopes": scopes,

docs/i18n/README-zh.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<details>
2121
<summary><strong>最近更新</strong></summary>
2222

23-
* **v9.5.4 (beta)** — 新增 `manage_packages` `query_packages` 工具:安装、移除、搜索和管理 Unity 包及作用域注册表。包含输入验证、移除时依赖检查和 git URL 警告。
23+
* **v9.5.4 (beta)** — 新增 `manage_packages` 工具:安装、移除、搜索和管理 Unity 包及作用域注册表。包含输入验证、移除时依赖检查和 git URL 警告。
2424
* **v9.5.3** — 新增 `manage_graphics` 工具(33个操作):体积/后处理、光照烘焙、渲染统计、管线设置、URP渲染器特性。3个新资源:`volumes``rendering_stats``renderer_features`
2525
* **v9.5.2** — 新增 `manage_camera` 工具,支持 Cinemachine(预设、优先级、噪声、混合、扩展)、`cameras` 资源、通过 SerializedProperty 修复优先级持久化问题。
2626
* **v9.4.8** — 新编辑器 UI、通过 `manage_tools` 实时切换工具、技能同步窗口、多视图截图、一键 Roslyn 安装器、支持 Qwen Code 与 Gemini CLI 客户端、通过 `manage_probuilder` 进行 ProBuilder 网格编辑。
@@ -94,7 +94,7 @@ openupm add com.coplaydev.unity-mcp
9494
* **可扩展** — 可与多种 MCP Client 配合使用
9595

9696
### 可用工具
97-
`apply_text_edits``batch_execute``create_script``debug_request_context``delete_script``execute_custom_tool``execute_menu_item``find_gameobjects``find_in_file``get_sha``get_test_job``manage_animation``manage_asset``manage_camera``manage_components``manage_editor``manage_gameobject``manage_graphics``manage_material``manage_packages``manage_prefabs``manage_probuilder``manage_scene``manage_script``manage_script_capabilities``manage_scriptable_object``manage_shader``manage_texture``manage_tools``manage_ui``manage_vfx` `query_packages``read_console``refresh_unity``run_tests``script_apply_edits``set_active_instance``validate_script`
97+
`apply_text_edits``batch_execute``create_script``debug_request_context``delete_script``execute_custom_tool``execute_menu_item``find_gameobjects``find_in_file``get_sha``get_test_job``manage_animation``manage_asset``manage_camera``manage_components``manage_editor``manage_gameobject``manage_graphics``manage_material``manage_packages``manage_prefabs``manage_probuilder``manage_scene``manage_script``manage_script_capabilities``manage_scriptable_object``manage_shader``manage_texture``manage_tools``manage_ui``manage_vfx``read_console``refresh_unity``run_tests``script_apply_edits``set_active_instance``validate_script`
9898

9999
### 可用资源
100100
`cameras``custom_tools``renderer_features``rendering_stats``volumes``editor_active_tool``editor_prefab_stage``editor_selection``editor_state``editor_windows``gameobject``gameobject_api``gameobject_component``gameobject_components``get_tests``get_tests_for_mode``menu_items``prefab_api``prefab_hierarchy``prefab_info``project_info``project_layers``project_tags``tool_groups``unity_instances`

manifest.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,6 @@
153153
"name": "manage_vfx",
154154
"description": "Manage Visual Effects, particle systems, and trails"
155155
},
156-
{
157-
"name": "query_packages",
158-
"description": "Query Unity package information: list, search, info, and status"
159-
},
160156
{
161157
"name": "read_console",
162158
"description": "Read Unity Editor console output (logs, warnings, errors)"

unity-mcp-skill/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ uri="file:///full/path/to/file.cs"
164164
| **Batch** | `batch_execute` | Parallel/bulk operations |
165165
| **Camera** | `manage_camera` | Camera management (Unity Camera + Cinemachine). **Tier 1** (always available): create, target, lens, priority, list, screenshot. **Tier 2** (requires `com.unity.cinemachine`): brain, body/aim/noise pipeline, extensions, blending, force/release. 7 presets: follow, third_person, freelook, dolly, static, top_down, side_scroller. Resource: `mcpforunity://scene/cameras`. Use `ping` to check Cinemachine availability. See [tools-reference.md](references/tools-reference.md#camera-tools). |
166166
| **Graphics** | `manage_graphics` | Rendering and post-processing management. 33 actions across 5 groups: **Volume** (create/configure volumes and effects, URP/HDRP), **Bake** (lightmaps, light probes, reflection probes, Edit mode only), **Stats** (draw calls, batches, memory), **Pipeline** (quality levels, pipeline settings), **Features** (URP renderer features: add, remove, toggle, reorder). Resources: `mcpforunity://scene/volumes`, `mcpforunity://rendering/stats`, `mcpforunity://pipeline/renderer-features`. Use `ping` to check pipeline status. See [tools-reference.md](references/tools-reference.md#graphics-tools). |
167-
| **Packages** | `query_packages` (read-only), `manage_packages` (mutating) | Install, remove, search, and manage Unity packages and scoped registries. `query_packages`: list installed, search registry, get info, ping, poll status. `manage_packages`: add/remove packages, embed for editing, add/remove scoped registries, force resolve. Validates identifiers, warns on git URLs, checks dependents before removal (`force=true` to override). See [tools-reference.md](references/tools-reference.md#package-tools). |
167+
| **Packages** | `manage_packages` | Install, remove, search, and manage Unity packages and scoped registries. Query actions: list installed, search registry, get info, ping, poll status. Mutating actions: add/remove packages, embed for editing, add/remove scoped registries, force resolve. Validates identifiers, warns on git URLs, checks dependents before removal (`force=true` to override). See [tools-reference.md](references/tools-reference.md#package-tools). |
168168
| **ProBuilder** | `manage_probuilder` | 3D modeling, mesh editing, complex geometry. **When `com.unity.probuilder` is installed, prefer ProBuilder shapes over primitive GameObjects** for editable geometry, multi-material faces, or complex shapes. Supports 12 shape types, face/edge/vertex editing, smoothing, and per-face materials. See [ProBuilder Guide](references/probuilder-guide.md). |
169169
| **UI** | `manage_ui`, `batch_execute` with `manage_gameobject` + `manage_components` | **UI Toolkit**: Use `manage_ui` to create UXML/USS files, attach UIDocument, inspect visual trees. **uGUI (Canvas)**: Use `batch_execute` for Canvas, Panel, Button, Text, Slider, Toggle, Input Field. **Read `mcpforunity://project/info` first** to detect uGUI/TMP/Input System/UI Toolkit availability. (see [UI workflows](references/workflows.md#ui-creation-workflows)) |
170170

unity-mcp-skill/references/tools-reference.md

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,11 +1074,11 @@ manage_graphics(action="feature_reorder", order=[2, 0, 1])
10741074

10751075
## Package Tools
10761076

1077-
### query_packages (read-only)
1077+
### manage_packages
10781078

1079-
Query Unity package information. Use this for all read operations — it has `readOnlyHint=true` so clients know it's safe.
1079+
Manage Unity packages: query, install, remove, embed, and configure registries. Install/remove trigger domain reload.
10801080

1081-
**Actions:**
1081+
**Query Actions (read-only):**
10821082

10831083
| Action | Parameters | Description |
10841084
|--------|-----------|-------------|
@@ -1088,23 +1088,7 @@ Query Unity package information. Use this for all read operations — it has `re
10881088
| `ping` || Check package manager availability, Unity version, package count |
10891089
| `status` | `job_id` (optional) | Poll async job status; omit job_id for latest job |
10901090

1091-
**Example — List installed packages:**
1092-
```python
1093-
query_packages(action="list_packages")
1094-
# Returns job_id, then poll:
1095-
query_packages(action="status", job_id="<job_id>")
1096-
```
1097-
1098-
**Example — Search for a package:**
1099-
```python
1100-
query_packages(action="search_packages", query="input system")
1101-
```
1102-
1103-
### manage_packages (destructive)
1104-
1105-
Modify Unity packages. Has `destructiveHint=true` — install/remove trigger domain reload.
1106-
1107-
**Actions:**
1091+
**Mutating Actions:**
11081092

11091093
| Action | Parameters | Description |
11101094
|--------|-----------|-------------|
@@ -1121,11 +1105,23 @@ Modify Unity packages. Has `destructiveHint=true` — install/remove trigger dom
11211105
- `file:` paths: allowed with warning
11221106
- Invalid names (uppercase, missing dots): rejected
11231107

1108+
**Example — List installed packages:**
1109+
```python
1110+
manage_packages(action="list_packages")
1111+
# Returns job_id, then poll:
1112+
manage_packages(action="status", job_id="<job_id>")
1113+
```
1114+
1115+
**Example — Search for a package:**
1116+
```python
1117+
manage_packages(action="search_packages", query="input system")
1118+
```
1119+
11241120
**Example — Install a package:**
11251121
```python
11261122
manage_packages(action="add_package", package="com.unity.inputsystem")
11271123
# Poll until complete:
1128-
query_packages(action="status", job_id="<job_id>")
1124+
manage_packages(action="status", job_id="<job_id>")
11291125
```
11301126

11311127
**Example — Remove with dependency check:**

unity-mcp-skill/references/workflows.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,21 +1753,21 @@ manage_graphics(action="stats_get")
17531753

17541754
```python
17551755
# 1. Check what's installed
1756-
query_packages(action="ping")
1757-
query_packages(action="list_packages")
1756+
manage_packages(action="ping")
1757+
manage_packages(action="list_packages")
17581758
# Poll status until complete
1759-
query_packages(action="status", job_id="<job_id>")
1759+
manage_packages(action="status", job_id="<job_id>")
17601760

17611761
# 2. Install the package
17621762
manage_packages(action="add_package", package="com.unity.inputsystem")
17631763
# Poll until domain reload completes
1764-
query_packages(action="status", job_id="<job_id>")
1764+
manage_packages(action="status", job_id="<job_id>")
17651765

17661766
# 3. Verify no compilation errors
17671767
read_console(types=["error"], count=10)
17681768

17691769
# 4. Confirm it's installed
1770-
query_packages(action="get_package_info", package="com.unity.inputsystem")
1770+
manage_packages(action="get_package_info", package="com.unity.inputsystem")
17711771
```
17721772

17731773
### Add OpenUPM Registry and Install Package
@@ -1786,7 +1786,7 @@ manage_packages(action="resolve_packages")
17861786

17871787
# 3. Install a package from OpenUPM
17881788
manage_packages(action="add_package", package="com.cysharp.unitask")
1789-
query_packages(action="status", job_id="<job_id>")
1789+
manage_packages(action="status", job_id="<job_id>")
17901790
```
17911791

17921792
### Safe Package Removal
@@ -1798,7 +1798,7 @@ manage_packages(action="remove_package", package="com.unity.modules.ui")
17981798

17991799
# 2. Force removal if you're sure
18001800
manage_packages(action="remove_package", package="com.unity.modules.ui", force=True)
1801-
query_packages(action="status", job_id="<job_id>")
1801+
manage_packages(action="status", job_id="<job_id>")
18021802
```
18031803

18041804
### Install from Git URL (e.g., NuGetForUnity)
@@ -1809,7 +1809,7 @@ manage_packages(
18091809
action="add_package",
18101810
package="https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity"
18111811
)
1812-
query_packages(action="status", job_id="<job_id>")
1812+
manage_packages(action="status", job_id="<job_id>")
18131813
```
18141814

18151815
---

0 commit comments

Comments
 (0)