Skip to content

Commit 6c50e0c

Browse files
committed
update for bug fix
1 parent f7d85b4 commit 6c50e0c

5 files changed

Lines changed: 75 additions & 36 deletions

File tree

MCPForUnity/Editor/Services/PackageJobManager.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ private static void TryRecoverJob(PackageJob job, long nowMs)
129129
{
130130
string packageName = ExtractPackageName(job.Package);
131131
var allPackages = PackageInfo.GetAllRegisteredPackages();
132-
var info = allPackages.FirstOrDefault(p =>
133-
string.Equals(p.name, packageName, StringComparison.OrdinalIgnoreCase));
132+
var info = FindPackageInfo(allPackages, packageName, job.Package);
134133

135134
if (job.Operation == "add")
136135
{
@@ -177,6 +176,34 @@ private static void TryRecoverJob(PackageJob job, long nowMs)
177176
}
178177
}
179178

179+
/// <summary>
180+
/// Find a PackageInfo by name, falling back to packageId or git/local source for non-standard identifiers.
181+
/// </summary>
182+
private static PackageInfo FindPackageInfo(PackageInfo[] allPackages, string packageName, string originalIdentifier)
183+
{
184+
// Direct name match (handles normal com.company.package identifiers)
185+
var info = allPackages.FirstOrDefault(p =>
186+
string.Equals(p.name, packageName, StringComparison.OrdinalIgnoreCase));
187+
if (info != null)
188+
return info;
189+
190+
// For git URLs / file: paths, packageName == originalIdentifier and won't match .name.
191+
// Try matching by packageId or source (git/local).
192+
bool isGitOrFile = originalIdentifier.StartsWith("http", StringComparison.OrdinalIgnoreCase)
193+
|| originalIdentifier.StartsWith("git", StringComparison.OrdinalIgnoreCase)
194+
|| originalIdentifier.StartsWith("file:", StringComparison.OrdinalIgnoreCase)
195+
|| originalIdentifier.EndsWith(".git", StringComparison.OrdinalIgnoreCase);
196+
197+
if (!isGitOrFile)
198+
return null;
199+
200+
return allPackages.FirstOrDefault(p =>
201+
p.source == PackageSource.Git || p.source == PackageSource.Local
202+
? p.packageId != null && p.packageId.Contains(originalIdentifier)
203+
|| p.resolvedPath != null && p.resolvedPath.Contains(originalIdentifier)
204+
: false);
205+
}
206+
180207
internal static string ExtractPackageName(string packageIdentifier)
181208
{
182209
if (string.IsNullOrEmpty(packageIdentifier))

MCPForUnity/Editor/Tools/ManagePackages.cs

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -38,35 +38,42 @@ public static object HandleCommand(JObject @params)
3838

3939
string action = actionResult.Value.ToLowerInvariant();
4040

41-
switch (action)
42-
{
43-
case "add_package":
44-
return AddPackage(p);
45-
case "remove_package":
46-
return RemovePackage(p);
47-
case "status":
48-
return GetStatus(p);
49-
case "list_packages":
50-
return ListPackages(p);
51-
case "search_packages":
52-
return SearchPackages(p);
53-
case "get_package_info":
54-
return GetPackageInfo(p);
55-
case "list_registries":
56-
return ListRegistries();
57-
case "add_registry":
58-
return AddRegistry(p);
59-
case "remove_registry":
60-
return RemoveRegistry(p);
61-
case "embed_package":
62-
return EmbedPackage(p);
63-
case "resolve_packages":
64-
return ResolvePackages();
65-
case "ping":
66-
return Ping();
67-
default:
68-
return new ErrorResponse(
69-
$"Unknown action: '{action}'. Supported actions: add_package, remove_package, status, list_packages, search_packages, get_package_info, list_registries, add_registry, remove_registry, embed_package, resolve_packages, ping.");
41+
try
42+
{
43+
switch (action)
44+
{
45+
case "add_package":
46+
return AddPackage(p);
47+
case "remove_package":
48+
return RemovePackage(p);
49+
case "status":
50+
return GetStatus(p);
51+
case "list_packages":
52+
return ListPackages(p);
53+
case "search_packages":
54+
return SearchPackages(p);
55+
case "get_package_info":
56+
return GetPackageInfo(p);
57+
case "list_registries":
58+
return ListRegistries();
59+
case "add_registry":
60+
return AddRegistry(p);
61+
case "remove_registry":
62+
return RemoveRegistry(p);
63+
case "embed_package":
64+
return EmbedPackage(p);
65+
case "resolve_packages":
66+
return ResolvePackages();
67+
case "ping":
68+
return Ping();
69+
default:
70+
return new ErrorResponse(
71+
$"Unknown action: '{action}'. Supported actions: add_package, remove_package, status, list_packages, search_packages, get_package_info, list_registries, add_registry, remove_registry, embed_package, resolve_packages, ping.");
72+
}
73+
}
74+
catch (Exception ex)
75+
{
76+
return new ErrorResponse(ex.Message, new { stackTrace = ex.StackTrace });
7077
}
7178
}
7279

@@ -391,7 +398,7 @@ private static object ListRegistries()
391398
}).ToArray();
392399

393400
return new SuccessResponse(
394-
$"Found {result.Length} scoped registr(y/ies).",
401+
$"Found {result.Length} scoped {(result.Length == 1 ? "registry" : "registries")}.",
395402
new { registries = result, count = result.Length }
396403
);
397404
}

Server/src/cli/commands/packages.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,11 @@ def embed_package(package: str):
141141
result = run_command("manage_packages", {"action": "embed_package", "package": package}, config)
142142
click.echo(format_output(result, config.format))
143143
if result.get("success"):
144-
print_success(f"Package embedded: {package}")
144+
job_id = (result.get("data") or {}).get("job_id")
145+
if job_id:
146+
print_info(f"Embedding started. Poll with: unity-mcp packages status {job_id}")
147+
else:
148+
print_success(f"Package embedded: {package}")
145149

146150

147151
@packages.command("resolve")

Server/src/services/tools/manage_packages.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
ALL_ACTIONS = [
1212
"list_packages", "search_packages", "get_package_info", "ping", "status",
1313
"add_package", "remove_package", "embed_package", "resolve_packages",
14-
"add_registry", "remove_registry",
14+
"add_registry", "remove_registry", "list_registries",
1515
]
1616

1717

@@ -35,11 +35,12 @@ async def _send_packages_command(
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)\n\n"
38+
"- status: Poll async job status (job_id required for list/search; optional for add/remove/embed)\n\n"
3939
"INSTALL/REMOVE:\n"
4040
"- add_package: Install a package (name, name@version, git URL, or file: path)\n"
4141
"- remove_package: Remove a package (checks dependents; use force=true to override)\n\n"
4242
"REGISTRIES:\n"
43+
"- list_registries: List all scoped registries\n"
4344
"- add_registry: Add a scoped registry (e.g., OpenUPM)\n"
4445
"- remove_registry: Remove a scoped registry\n\n"
4546
"UTILITY:\n"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,7 @@ Manage Unity packages: query, install, remove, embed, and configure registries.
10861086
| `search_packages` | `query` | Search Unity registry by keyword (async, returns job_id) |
10871087
| `get_package_info` | `package` | Get details about a specific installed package |
10881088
| `ping` || Check package manager availability, Unity version, package count |
1089-
| `status` | `job_id` (optional) | Poll async job status; omit job_id for latest job |
1089+
| `status` | `job_id` (required for list/search; optional for add/remove/embed) | Poll async job status; omit job_id to poll latest add/remove/embed job |
10901090

10911091
**Mutating Actions:**
10921092

0 commit comments

Comments
 (0)