unity-mcp-cli 0.58.0 → 0.59.0
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.
- package/README.md +83 -0
- package/dist/commands/open.js +8 -0
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +87 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/wait-for-ready.d.ts +2 -0
- package/dist/commands/wait-for-ready.js +93 -0
- package/dist/commands/wait-for-ready.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/probe.d.ts +15 -0
- package/dist/utils/probe.js +58 -0
- package/dist/utils/probe.js.map +1 -0
- package/dist/utils/unity-process.d.ts +10 -0
- package/dist/utils/unity-process.js +85 -0
- package/dist/utils/unity-process.js.map +1 -0
- package/docs/README.es.md +65 -0
- package/docs/README.ja.md +65 -0
- package/docs/README.zh-CN.md +65 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,9 +36,11 @@ Cross-platform CLI tool for **[Unity MCP](https://github.com/IvanMurzak/Unity-MC
|
|
|
36
36
|
- :white_check_mark: **Install plugin** — add Unity-MCP plugin to `manifest.json` with all required scoped registries
|
|
37
37
|
- :white_check_mark: **Remove plugin** — remove Unity-MCP plugin from `manifest.json`
|
|
38
38
|
- :white_check_mark: **Configure** — enable/disable MCP tools, prompts, and resources
|
|
39
|
+
- :white_check_mark: **Status check** — see Unity process, local server, and cloud server connection status at a glance
|
|
39
40
|
- :white_check_mark: **Run tools** — execute MCP tools directly from the command line
|
|
40
41
|
- :white_check_mark: **Setup MCP** — write AI agent MCP config files for any of 14 supported agents
|
|
41
42
|
- :white_check_mark: **Setup skills** — generate skill files for AI agents via the MCP server
|
|
43
|
+
- :white_check_mark: **Wait for ready** — poll until Unity Editor and MCP server are connected and accepting tool calls
|
|
42
44
|
- :white_check_mark: **Open & Connect** — launch Unity with optional MCP environment variables for automated server connection
|
|
43
45
|
- :white_check_mark: **Cross-platform** — Windows, macOS, and Linux
|
|
44
46
|
- :white_check_mark: **CI-friendly** — auto-detects non-interactive terminals and disables spinners/colors
|
|
@@ -94,9 +96,11 @@ npx unity-mcp-cli install-plugin /path/to/unity/project
|
|
|
94
96
|
- [`install-unity`](#install-unity)
|
|
95
97
|
- [`open`](#open)
|
|
96
98
|
- [`run-tool`](#run-tool)
|
|
99
|
+
- [`wait-for-ready`](#wait-for-ready)
|
|
97
100
|
- [`setup-mcp`](#setup-mcp)
|
|
98
101
|
- [`setup-skills`](#setup-skills)
|
|
99
102
|
- [`remove-plugin`](#remove-plugin)
|
|
103
|
+
- [`status`](#status)
|
|
100
104
|
- [Global Options](#global-options)
|
|
101
105
|
- [Full Automation Example](#full-automation-example)
|
|
102
106
|
- [How It Works](#how-it-works)
|
|
@@ -320,6 +324,44 @@ unity-mcp-cli run-tool assets-list ./MyGame --raw | jq '.results'
|
|
|
320
324
|
|
|
321
325
|

|
|
322
326
|
|
|
327
|
+
## `wait-for-ready`
|
|
328
|
+
|
|
329
|
+
Wait until Unity Editor and MCP server are connected and ready to accept tool calls. Polls the server at a configurable interval until it responds successfully or the timeout is reached. Useful for automation scripts and AI agent orchestration where `open` launches Unity but the agent needs to know when it can start calling tools.
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
| Option | Required | Description |
|
|
336
|
+
|---|---|---|
|
|
337
|
+
| `[path]` | No | Unity project path (positional or `--path`) — used to read config and detect port |
|
|
338
|
+
| `--url <url>` | No | Direct server URL override (bypasses config) |
|
|
339
|
+
| `--token <token>` | No | Bearer token override (bypasses config) |
|
|
340
|
+
| `--timeout <ms>` | No | Maximum time to wait in milliseconds (default: 120000) |
|
|
341
|
+
| `--interval <ms>` | No | Polling interval in milliseconds (default: 3000) |
|
|
342
|
+
|
|
343
|
+
**Example — wait with default timeout (120s):**
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
unity-mcp-cli open ./MyGame
|
|
347
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
348
|
+
unity-mcp-cli run-tool tests-run ./MyGame --input '{"testMode":"EditMode"}'
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Example — shorter timeout for CI:**
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
unity-mcp-cli wait-for-ready ./MyGame --timeout 60000 --interval 2000
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Example — explicit server URL:**
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
unity-mcp-cli wait-for-ready --url http://localhost:8080 --timeout 30000
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+

|
|
364
|
+
|
|
323
365
|
## `setup-mcp`
|
|
324
366
|
|
|
325
367
|
Write MCP config files for AI agents, enabling headless/CI setup without the Unity Editor UI. Supports all 14 agents (Claude Code, Cursor, Gemini, Codex, etc.).
|
|
@@ -397,6 +439,41 @@ This command:
|
|
|
397
439
|
|
|
398
440
|

|
|
399
441
|
|
|
442
|
+
## `status`
|
|
443
|
+
|
|
444
|
+
Check Unity Editor and MCP server connection status. Shows whether Unity is running, whether the local MCP server is reachable, and whether the config-resolved server (e.g., cloud) is reachable.
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
unity-mcp-cli status ./MyGame
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
| Option | Required | Description |
|
|
451
|
+
|---|---|---|
|
|
452
|
+
| `[path]` | No | Unity project path (positional or `--path`) |
|
|
453
|
+
| `--url <url>` | No | Direct server URL override (bypasses config) |
|
|
454
|
+
| `--token <token>` | No | Bearer token override (bypasses config) |
|
|
455
|
+
| `--timeout <ms>` | No | Probe timeout in milliseconds (default: 5000) |
|
|
456
|
+
|
|
457
|
+
**Example output:**
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
Unity-MCP Status
|
|
461
|
+
Project: /path/to/MyGame
|
|
462
|
+
──────────────────────────────────────────────────
|
|
463
|
+
Unity Editor Process
|
|
464
|
+
✔ Unity is running (PID: 53740)
|
|
465
|
+
Local MCP Server
|
|
466
|
+
URL: http://localhost:22958
|
|
467
|
+
✖ Not available (connection refused)
|
|
468
|
+
Config Server
|
|
469
|
+
URL: https://ai-game.dev/mcp
|
|
470
|
+
✔ Connected
|
|
471
|
+
──────────────────────────────────────────────────
|
|
472
|
+
✔ MCP server is reachable — ready for tool calls
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+

|
|
476
|
+
|
|
400
477
|
## Global Options
|
|
401
478
|
|
|
402
479
|
These options are available on all commands:
|
|
@@ -439,6 +516,12 @@ unity-mcp-cli setup-mcp claude-code ./MyAIGame
|
|
|
439
516
|
unity-mcp-cli open ./MyAIGame \
|
|
440
517
|
--url http://localhost:8080 \
|
|
441
518
|
--keep-connected
|
|
519
|
+
|
|
520
|
+
# 7. Wait for Unity Editor and MCP server to be ready
|
|
521
|
+
unity-mcp-cli wait-for-ready ./MyAIGame
|
|
522
|
+
|
|
523
|
+
# 8. Run tests to verify everything works
|
|
524
|
+
unity-mcp-cli run-tool tests-run ./MyAIGame --input '{"testMode":"EditMode"}'
|
|
442
525
|
```
|
|
443
526
|
|
|
444
527
|

|
package/dist/commands/open.js
CHANGED
|
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import { findEditorPath, getProjectEditorVersion, launchEditor, printEditorNotFoundHelp } from '../utils/unity-editor.js';
|
|
5
|
+
import { findUnityProcess } from '../utils/unity-process.js';
|
|
5
6
|
import * as ui from '../utils/ui.js';
|
|
6
7
|
import { verbose } from '../utils/ui.js';
|
|
7
8
|
export const openCommand = new Command('open')
|
|
@@ -30,6 +31,13 @@ export const openCommand = new Command('open')
|
|
|
30
31
|
}
|
|
31
32
|
verbose(`open invoked for project: ${projectPath}`);
|
|
32
33
|
verbose(`--no-connect: ${options.connect === false}`);
|
|
34
|
+
// Check if Unity is already running with this project
|
|
35
|
+
const existingProcess = findUnityProcess(projectPath);
|
|
36
|
+
if (existingProcess) {
|
|
37
|
+
ui.success(`Unity is already running with this project (PID: ${existingProcess.pid})`);
|
|
38
|
+
ui.info('Skipping launch. Use the running instance or close it first.');
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
33
41
|
// Determine editor version
|
|
34
42
|
let version = options.unity;
|
|
35
43
|
if (!version) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as ui from '../utils/ui.js';
|
|
3
|
+
import { verbose } from '../utils/ui.js';
|
|
4
|
+
import { resolveAndValidateProjectPath, resolveConnection } from '../utils/connection.js';
|
|
5
|
+
import { generatePortFromDirectory } from '../utils/port.js';
|
|
6
|
+
import { findUnityProcess } from '../utils/unity-process.js';
|
|
7
|
+
import { probe } from '../utils/probe.js';
|
|
8
|
+
export const statusCommand = new Command('status')
|
|
9
|
+
.description('Check Unity Editor and MCP server connection status')
|
|
10
|
+
.argument('[path]', 'Unity project path (used for config and auto port detection)')
|
|
11
|
+
.option('--path <path>', 'Unity project path (config and auto port detection)')
|
|
12
|
+
.option('--url <url>', 'Direct server URL override (bypasses config)')
|
|
13
|
+
.option('--token <token>', 'Bearer token override (bypasses config)')
|
|
14
|
+
.option('--timeout <ms>', 'Probe timeout in milliseconds (default: 5000)', '5000')
|
|
15
|
+
.action(async (positionalPath, options) => {
|
|
16
|
+
const projectPath = resolveAndValidateProjectPath(positionalPath, options);
|
|
17
|
+
const { url: configUrl, token } = resolveConnection(projectPath, options);
|
|
18
|
+
const localPort = generatePortFromDirectory(projectPath);
|
|
19
|
+
const localUrl = `http://localhost:${localPort}`;
|
|
20
|
+
const timeoutMs = parseInt(options.timeout ?? '5000', 10);
|
|
21
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
22
|
+
ui.error(`Invalid --timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const headers = {
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
};
|
|
28
|
+
if (token) {
|
|
29
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
30
|
+
}
|
|
31
|
+
ui.heading('Unity-MCP Status');
|
|
32
|
+
ui.label('Project', projectPath);
|
|
33
|
+
ui.divider();
|
|
34
|
+
// 1. Unity process detection
|
|
35
|
+
ui.heading('Unity Editor Process');
|
|
36
|
+
const proc = findUnityProcess(projectPath);
|
|
37
|
+
if (proc) {
|
|
38
|
+
ui.success(`Unity is running (PID: ${proc.pid})`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
ui.warn('Unity is not running with this project');
|
|
42
|
+
}
|
|
43
|
+
// 2. Local server check
|
|
44
|
+
ui.heading('Local MCP Server');
|
|
45
|
+
ui.label('URL', localUrl);
|
|
46
|
+
const localSpinner = ui.startSpinner(`Probing ${localUrl}...`);
|
|
47
|
+
const localResult = await probe(localUrl, headers, timeoutMs);
|
|
48
|
+
if (localResult.ok) {
|
|
49
|
+
localSpinner.success('Connected');
|
|
50
|
+
verbose(`Local server response: ${JSON.stringify(localResult.data)}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
localSpinner.error(`Not available (${localResult.reason})`);
|
|
54
|
+
}
|
|
55
|
+
// 3. Config-resolved server check (if different from local)
|
|
56
|
+
let configResult = null;
|
|
57
|
+
if (configUrl !== localUrl) {
|
|
58
|
+
ui.heading('Config Server');
|
|
59
|
+
ui.label('URL', configUrl);
|
|
60
|
+
const configSpinner = ui.startSpinner(`Probing ${configUrl}...`);
|
|
61
|
+
configResult = await probe(configUrl, headers, timeoutMs);
|
|
62
|
+
if (configResult.ok) {
|
|
63
|
+
configSpinner.success('Connected');
|
|
64
|
+
verbose(`Config server response: ${JSON.stringify(configResult.data)}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
configSpinner.error(`Not available (${configResult.reason})`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ui.divider();
|
|
71
|
+
// Summary — reuse probe results, no duplicate calls
|
|
72
|
+
const localOk = localResult.ok;
|
|
73
|
+
const configOk = configResult ? configResult.ok : localOk;
|
|
74
|
+
if (localOk || configOk) {
|
|
75
|
+
ui.success('MCP server is reachable — ready for tool calls');
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
else if (proc) {
|
|
79
|
+
ui.warn('Unity is running but MCP server is not responding yet');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
ui.error('Unity is not running and MCP server is not reachable');
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAoB,MAAM,mBAAmB,CAAC;AAS5D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,qDAAqD,CAAC;KAClE,QAAQ,CAAC,QAAQ,EAAE,8DAA8D,CAAC;KAClF,MAAM,CAAC,eAAe,EAAE,qDAAqD,CAAC;KAC9E,MAAM,CAAC,aAAa,EAAE,8CAA8C,CAAC;KACrE,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;KACpE,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,EAAE,MAAM,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,cAAkC,EAAE,OAAsB,EAAE,EAAE;IAC3E,MAAM,WAAW,GAAG,6BAA6B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,oBAAoB,SAAS,EAAE,CAAC;IAEjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,EAAE,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,OAAO,+CAA+C,CAAC,CAAC;QACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/B,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACjC,EAAE,CAAC,OAAO,EAAE,CAAC;IAEb,6BAA6B;IAC7B,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACpD,CAAC;IAED,wBAAwB;IACxB,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/B,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE1B,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,QAAQ,KAAK,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;QACnB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,OAAO,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,KAAK,CAAC,kBAAkB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,4DAA4D;IAC5D,IAAI,YAAY,GAAuB,IAAI,CAAC;IAC5C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5B,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE3B,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,SAAS,KAAK,CAAC,CAAC;QACjE,YAAY,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1D,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;YACpB,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACnC,OAAO,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,KAAK,CAAC,kBAAkB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,EAAE,CAAC,OAAO,EAAE,CAAC;IAEb,oDAAoD;IACpD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1D,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,EAAE,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as ui from '../utils/ui.js';
|
|
3
|
+
import { verbose } from '../utils/ui.js';
|
|
4
|
+
import { resolveAndValidateProjectPath, resolveConnection } from '../utils/connection.js';
|
|
5
|
+
import { generatePortFromDirectory } from '../utils/port.js';
|
|
6
|
+
import { probe } from '../utils/probe.js';
|
|
7
|
+
const MAX_PROBE_TIMEOUT_MS = 10000;
|
|
8
|
+
/**
|
|
9
|
+
* Build the list of base URLs to probe.
|
|
10
|
+
* When --url is explicit, only that URL is probed.
|
|
11
|
+
* Otherwise, probe both the config-resolved URL and the deterministic local port
|
|
12
|
+
* (if they differ), succeeding on whichever responds first.
|
|
13
|
+
*/
|
|
14
|
+
function resolveProbeUrls(projectPath, options) {
|
|
15
|
+
const { url: configUrl } = resolveConnection(projectPath, options);
|
|
16
|
+
const urls = [configUrl];
|
|
17
|
+
if (!options.url) {
|
|
18
|
+
const localPort = generatePortFromDirectory(projectPath);
|
|
19
|
+
const localUrl = `http://localhost:${localPort}`;
|
|
20
|
+
if (localUrl !== configUrl) {
|
|
21
|
+
urls.push(localUrl);
|
|
22
|
+
verbose(`Will probe both config URL (${configUrl}) and local URL (${localUrl})`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return urls;
|
|
26
|
+
}
|
|
27
|
+
export const waitForReadyCommand = new Command('wait-for-ready')
|
|
28
|
+
.description('Wait until Unity Editor and MCP server are ready to accept tool calls')
|
|
29
|
+
.argument('[path]', 'Unity project path (used for config and auto port detection)')
|
|
30
|
+
.option('--path <path>', 'Unity project path (config and auto port detection)')
|
|
31
|
+
.option('--url <url>', 'Direct server URL override (bypasses config)')
|
|
32
|
+
.option('--token <token>', 'Bearer token override (bypasses config)')
|
|
33
|
+
.option('--timeout <ms>', 'Maximum time to wait in milliseconds (default: 120000)', '120000')
|
|
34
|
+
.option('--interval <ms>', 'Polling interval in milliseconds (default: 3000)', '3000')
|
|
35
|
+
.action(async (positionalPath, options) => {
|
|
36
|
+
const projectPath = resolveAndValidateProjectPath(positionalPath, options);
|
|
37
|
+
const { token } = resolveConnection(projectPath, options);
|
|
38
|
+
const probeUrls = resolveProbeUrls(projectPath, options);
|
|
39
|
+
const timeoutMs = parseInt(options.timeout ?? '120000', 10);
|
|
40
|
+
const intervalMs = parseInt(options.interval ?? '3000', 10);
|
|
41
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
42
|
+
ui.error(`Invalid --timeout value: "${options.timeout}". Must be a positive integer (milliseconds).`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
if (!Number.isFinite(intervalMs) || intervalMs <= 0) {
|
|
46
|
+
ui.error(`Invalid --interval value: "${options.interval}". Must be a positive integer (milliseconds).`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const headers = {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
};
|
|
52
|
+
if (token) {
|
|
53
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
54
|
+
}
|
|
55
|
+
for (const url of probeUrls) {
|
|
56
|
+
verbose(`Probe target: ${url}`);
|
|
57
|
+
}
|
|
58
|
+
verbose(`Timeout: ${timeoutMs}ms, Interval: ${intervalMs}ms`);
|
|
59
|
+
const spinner = ui.startSpinner('Waiting for Unity Editor and MCP server...');
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
while (true) {
|
|
62
|
+
const elapsed = Date.now() - startTime;
|
|
63
|
+
if (elapsed >= timeoutMs) {
|
|
64
|
+
spinner.error(`Timed out after ${(timeoutMs / 1000).toFixed(1)}s waiting for MCP server`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
const remaining = Math.ceil((timeoutMs - elapsed) / 1000);
|
|
68
|
+
spinner.text = `Waiting for Unity Editor and MCP server... (${remaining}s remaining)`;
|
|
69
|
+
const probeTimeout = Math.min(intervalMs, MAX_PROBE_TIMEOUT_MS);
|
|
70
|
+
// Race probes: resolve as soon as any succeeds, don't wait for slow ones
|
|
71
|
+
const ready = await new Promise(resolve => {
|
|
72
|
+
let pending = probeUrls.length;
|
|
73
|
+
for (const url of probeUrls) {
|
|
74
|
+
probe(url, headers, probeTimeout).then(result => {
|
|
75
|
+
if (result.ok)
|
|
76
|
+
resolve(result);
|
|
77
|
+
else if (--pending === 0)
|
|
78
|
+
resolve(null);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
if (ready?.ok) {
|
|
83
|
+
const totalSeconds = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
84
|
+
spinner.success(`MCP server is ready at ${ready.baseUrl} (connected in ${totalSeconds}s)`);
|
|
85
|
+
process.exit(0);
|
|
86
|
+
}
|
|
87
|
+
const remainingMs = timeoutMs - (Date.now() - startTime);
|
|
88
|
+
if (remainingMs <= 0)
|
|
89
|
+
continue;
|
|
90
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(intervalMs, remainingMs)));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=wait-for-ready.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-ready.js","sourceRoot":"","sources":["../../src/commands/wait-for-ready.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,8 @@ import { runToolCommand } from './commands/run-tool.js';
|
|
|
10
10
|
import { runSystemToolCommand } from './commands/run-system-tool.js';
|
|
11
11
|
import { setupMcpCommand } from './commands/setup-mcp.js';
|
|
12
12
|
import { setupSkillsCommand } from './commands/setup-skills.js';
|
|
13
|
+
import { statusCommand } from './commands/status.js';
|
|
14
|
+
import { waitForReadyCommand } from './commands/wait-for-ready.js';
|
|
13
15
|
import { configureStyledHelp, error as uiError, setVerbose } from './utils/ui.js';
|
|
14
16
|
const require = createRequire(import.meta.url);
|
|
15
17
|
const pkg = require('../package.json');
|
|
@@ -31,6 +33,8 @@ const subcommands = [
|
|
|
31
33
|
runSystemToolCommand,
|
|
32
34
|
setupMcpCommand,
|
|
33
35
|
setupSkillsCommand,
|
|
36
|
+
statusCommand,
|
|
37
|
+
waitForReadyCommand,
|
|
34
38
|
];
|
|
35
39
|
for (const cmd of subcommands) {
|
|
36
40
|
cmd.option('-v, --verbose', 'Enable verbose diagnostic output');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAElF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,GAAG;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,kBAAkB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAElF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,GAAG;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,mBAAmB;CACpB,CAAC;AAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IAChE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAE1C,gDAAgD;AAChD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,EAAE;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,EAA2B,CAAC;IACtE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,qCAAqC;AACrC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,OAAO,CAAE,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const PING_ENDPOINT = "/api/system-tools/ping";
|
|
2
|
+
export interface ProbeSuccess {
|
|
3
|
+
ok: true;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
data: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface ProbeFailure {
|
|
8
|
+
ok: false;
|
|
9
|
+
reason: string;
|
|
10
|
+
}
|
|
11
|
+
export type ProbeResult = ProbeSuccess | ProbeFailure;
|
|
12
|
+
/**
|
|
13
|
+
* Probe an MCP server's ping endpoint. Returns structured result.
|
|
14
|
+
*/
|
|
15
|
+
export declare function probe(baseUrl: string, headers: Record<string, string>, timeoutMs: number): Promise<ProbeResult>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { verbose } from './ui.js';
|
|
2
|
+
export const PING_ENDPOINT = '/api/system-tools/ping';
|
|
3
|
+
/**
|
|
4
|
+
* Probe an MCP server's ping endpoint. Returns structured result.
|
|
5
|
+
*/
|
|
6
|
+
export async function probe(baseUrl, headers, timeoutMs) {
|
|
7
|
+
const endpoint = `${baseUrl}${PING_ENDPOINT}`;
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
10
|
+
try {
|
|
11
|
+
const response = await fetch(endpoint, {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers,
|
|
14
|
+
body: '{}',
|
|
15
|
+
signal: controller.signal,
|
|
16
|
+
});
|
|
17
|
+
const text = await response.text();
|
|
18
|
+
if (response.ok) {
|
|
19
|
+
let data;
|
|
20
|
+
try {
|
|
21
|
+
data = JSON.parse(text);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
data = text;
|
|
25
|
+
}
|
|
26
|
+
return { ok: true, baseUrl, data };
|
|
27
|
+
}
|
|
28
|
+
verbose(`[${baseUrl}] HTTP ${response.status} — not ready yet`);
|
|
29
|
+
return { ok: false, reason: `HTTP ${response.status}` };
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
const cause = err instanceof Error && 'cause' in err ? err.cause : null;
|
|
33
|
+
const code = cause?.code ?? '';
|
|
34
|
+
const isAbort = err instanceof Error && err.name === 'AbortError';
|
|
35
|
+
let reason;
|
|
36
|
+
if (isAbort) {
|
|
37
|
+
reason = 'timed out';
|
|
38
|
+
verbose(`[${baseUrl}] probe timed out`);
|
|
39
|
+
}
|
|
40
|
+
else if (code === 'ECONNREFUSED') {
|
|
41
|
+
reason = 'connection refused';
|
|
42
|
+
verbose(`[${baseUrl}] connection refused`);
|
|
43
|
+
}
|
|
44
|
+
else if (code === 'ECONNRESET') {
|
|
45
|
+
reason = 'connection reset';
|
|
46
|
+
verbose(`[${baseUrl}] connection reset`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
reason = err instanceof Error ? err.message : String(err);
|
|
50
|
+
verbose(`[${baseUrl}] probe failed: ${reason}`);
|
|
51
|
+
}
|
|
52
|
+
return { ok: false, reason };
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/utils/probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAetD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,OAAe,EACf,OAA+B,EAC/B,SAAiB;IAEjB,MAAM,QAAQ,GAAG,GAAG,OAAO,GAAG,aAAa,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC;YAAC,CAAC;YACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,IAAI,OAAO,UAAU,QAAQ,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,KAAmC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvG,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;QAElE,IAAI,MAAc,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,WAAW,CAAC;YACrB,OAAO,CAAC,IAAI,OAAO,mBAAmB,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,MAAM,GAAG,oBAAoB,CAAC;YAC9B,OAAO,CAAC,IAAI,OAAO,sBAAsB,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,MAAM,GAAG,kBAAkB,CAAC;YAC5B,OAAO,CAAC,IAAI,OAAO,oBAAoB,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,OAAO,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface UnityProcess {
|
|
2
|
+
pid: number;
|
|
3
|
+
projectPath: string;
|
|
4
|
+
commandLine: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Check if a Unity Editor process is running with the given project path.
|
|
8
|
+
* Returns process info if found, null otherwise.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findUnityProcess(projectPath: string): UnityProcess | null;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { platform } from 'os';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { verbose } from './ui.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if a Unity Editor process is running with the given project path.
|
|
7
|
+
* Returns process info if found, null otherwise.
|
|
8
|
+
*/
|
|
9
|
+
export function findUnityProcess(projectPath) {
|
|
10
|
+
const isWindows = platform() === 'win32';
|
|
11
|
+
const resolvedTarget = path.resolve(projectPath);
|
|
12
|
+
const normalizedTarget = isWindows ? resolvedTarget.toLowerCase() : resolvedTarget;
|
|
13
|
+
const processes = listUnityProcesses();
|
|
14
|
+
for (const proc of processes) {
|
|
15
|
+
const normalizedProc = isWindows ? proc.projectPath.toLowerCase() : proc.projectPath;
|
|
16
|
+
if (normalizedProc === normalizedTarget) {
|
|
17
|
+
verbose(`Found Unity process PID ${proc.pid} with project: ${proc.projectPath}`);
|
|
18
|
+
return proc;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
verbose(`No Unity process found for project: ${projectPath}`);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* List all running Unity Editor processes with their project paths.
|
|
26
|
+
*/
|
|
27
|
+
function listUnityProcesses() {
|
|
28
|
+
const os = platform();
|
|
29
|
+
const results = [];
|
|
30
|
+
try {
|
|
31
|
+
let lines;
|
|
32
|
+
if (os === 'win32') {
|
|
33
|
+
const psCommand = `powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"Name='Unity.exe'\\" | Select-Object ProcessId,CommandLine | ForEach-Object { $_.ProcessId.ToString() + '|||' + $_.CommandLine }"`;
|
|
34
|
+
const output = execSync(psCommand, { encoding: 'utf-8', timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
35
|
+
lines = output.split('\n').filter(l => l.trim().length > 0);
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
const sepIdx = line.indexOf('|||');
|
|
38
|
+
if (sepIdx === -1)
|
|
39
|
+
continue;
|
|
40
|
+
const pid = parseInt(line.substring(0, sepIdx).trim(), 10);
|
|
41
|
+
const commandLine = line.substring(sepIdx + 3).trim();
|
|
42
|
+
if (!Number.isFinite(pid) || pid === 0)
|
|
43
|
+
continue;
|
|
44
|
+
const projectPathMatch = commandLine.match(/-projectPath\s+"([^"]+)"/i)
|
|
45
|
+
?? commandLine.match(/-projectPath\s+(\S+)/i);
|
|
46
|
+
if (projectPathMatch) {
|
|
47
|
+
results.push({
|
|
48
|
+
pid,
|
|
49
|
+
projectPath: path.resolve(projectPathMatch[1].trim()),
|
|
50
|
+
commandLine,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// macOS / Linux
|
|
57
|
+
const output = execSync("ps -eo pid,args | grep -i '[U]nity' || true", { encoding: 'utf-8', timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
58
|
+
lines = output.split('\n').filter(l => l.trim().length > 0);
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
const match = line.trim().match(/^(\d+)\s+(.*)$/);
|
|
61
|
+
if (!match)
|
|
62
|
+
continue;
|
|
63
|
+
const pid = parseInt(match[1], 10);
|
|
64
|
+
const commandLine = match[2];
|
|
65
|
+
if (!commandLine.includes('-projectPath'))
|
|
66
|
+
continue;
|
|
67
|
+
const projectPathMatch = commandLine.match(/-projectPath\s+"([^"]+)"/)
|
|
68
|
+
?? commandLine.match(/-projectPath\s+(\S+)/);
|
|
69
|
+
if (projectPathMatch) {
|
|
70
|
+
results.push({
|
|
71
|
+
pid,
|
|
72
|
+
projectPath: path.resolve(projectPathMatch[1].trim()),
|
|
73
|
+
commandLine,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
verbose(`Failed to list Unity processes: ${err instanceof Error ? err.message : String(err)}`);
|
|
81
|
+
}
|
|
82
|
+
verbose(`Found ${results.length} Unity process(es)`);
|
|
83
|
+
return results;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=unity-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unity-process.js","sourceRoot":"","sources":["../../src/utils/unity-process.ts"],"names":[],"mappings":"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"}
|
package/docs/README.es.md
CHANGED
|
@@ -36,9 +36,11 @@ Herramienta CLI multiplataforma para **[Unity MCP](https://github.com/IvanMurzak
|
|
|
36
36
|
- :white_check_mark: **Instalar plugin** — agrega el plugin Unity-MCP a `manifest.json` con todos los registros de ambito requeridos
|
|
37
37
|
- :white_check_mark: **Eliminar plugin** — elimina el plugin Unity-MCP de `manifest.json`
|
|
38
38
|
- :white_check_mark: **Configurar** — activa/desactiva herramientas, prompts y recursos MCP
|
|
39
|
+
- :white_check_mark: **Verificar estado** — visualiza el proceso de Unity, servidor local y conexion al servidor en la nube de un vistazo
|
|
39
40
|
- :white_check_mark: **Ejecutar herramientas** — ejecuta herramientas MCP directamente desde la linea de comandos
|
|
40
41
|
- :white_check_mark: **Configurar MCP** — escribe archivos de configuracion MCP para agentes de IA en cualquiera de los 14 agentes soportados
|
|
41
42
|
- :white_check_mark: **Configurar habilidades** — genera archivos de habilidades para agentes de IA a traves del servidor MCP
|
|
43
|
+
- :white_check_mark: **Esperar disponibilidad** — sondea hasta que Unity Editor y el servidor MCP esten conectados y acepten llamadas de herramientas
|
|
42
44
|
- :white_check_mark: **Abrir y conectar** — inicia Unity con variables de entorno MCP opcionales para la conexion automatica al servidor
|
|
43
45
|
- :white_check_mark: **Multiplataforma** — Windows, macOS y Linux
|
|
44
46
|
- :white_check_mark: **Compatible con CI** — detecta automaticamente terminales no interactivas y desactiva spinners/colores
|
|
@@ -94,9 +96,11 @@ npx unity-mcp-cli install-plugin /path/to/unity/project
|
|
|
94
96
|
- [`install-unity`](#install-unity)
|
|
95
97
|
- [`open`](#open)
|
|
96
98
|
- [`run-tool`](#run-tool)
|
|
99
|
+
- [`wait-for-ready`](#wait-for-ready)
|
|
97
100
|
- [`setup-mcp`](#setup-mcp)
|
|
98
101
|
- [`setup-skills`](#setup-skills)
|
|
99
102
|
- [`remove-plugin`](#remove-plugin)
|
|
103
|
+
- [`status`](#status)
|
|
100
104
|
- [Opciones globales](#global-options)
|
|
101
105
|
- [Ejemplo de automatizacion completa](#full-automation-example)
|
|
102
106
|
- [Como funciona](#how-it-works)
|
|
@@ -320,6 +324,44 @@ unity-mcp-cli run-tool assets-list ./MyGame --raw | jq '.results'
|
|
|
320
324
|
|
|
321
325
|

|
|
322
326
|
|
|
327
|
+
## `wait-for-ready`
|
|
328
|
+
|
|
329
|
+
Espera hasta que Unity Editor y el servidor MCP esten conectados y listos para aceptar llamadas de herramientas. Sondea el servidor a un intervalo configurable hasta que responda correctamente o se alcance el tiempo limite. Util para scripts de automatizacion y orquestacion de agentes de IA donde `open` inicia Unity pero el agente necesita saber cuando puede empezar a llamar herramientas.
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
| Opcion | Requerido | Descripcion |
|
|
336
|
+
|---|---|---|
|
|
337
|
+
| `[path]` | No | Ruta al proyecto de Unity (posicional o `--path`) — se usa para leer la configuracion y detectar el puerto |
|
|
338
|
+
| `--url <url>` | No | URL directa del servidor (omite la configuracion) |
|
|
339
|
+
| `--token <token>` | No | Token Bearer (omite la configuracion) |
|
|
340
|
+
| `--timeout <ms>` | No | Tiempo maximo de espera en milisegundos (por defecto: 120000) |
|
|
341
|
+
| `--interval <ms>` | No | Intervalo de sondeo en milisegundos (por defecto: 3000) |
|
|
342
|
+
|
|
343
|
+
**Ejemplo — esperar con timeout por defecto (120s):**
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
unity-mcp-cli open ./MyGame
|
|
347
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
348
|
+
unity-mcp-cli run-tool tests-run ./MyGame --input '{"testMode":"EditMode"}'
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Ejemplo — timeout mas corto para CI:**
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
unity-mcp-cli wait-for-ready ./MyGame --timeout 60000 --interval 2000
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Ejemplo — URL explicita del servidor:**
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
unity-mcp-cli wait-for-ready --url http://localhost:8080 --timeout 30000
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+

|
|
364
|
+
|
|
323
365
|
## `setup-mcp`
|
|
324
366
|
|
|
325
367
|
Escribe archivos de configuracion MCP para agentes de IA, permitiendo la configuracion headless/CI sin la interfaz del Editor de Unity. Soporta los 14 agentes (Claude Code, Cursor, Gemini, Codex, etc.).
|
|
@@ -397,6 +439,23 @@ Este comando:
|
|
|
397
439
|
|
|
398
440
|

|
|
399
441
|
|
|
442
|
+
## `status`
|
|
443
|
+
|
|
444
|
+
Verifica el estado de conexion del Unity Editor y el servidor MCP. Muestra si Unity esta en ejecucion, si el servidor MCP local esta accesible y si el servidor configurado (ej. nube) esta accesible.
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
unity-mcp-cli status ./MyGame
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
| Opcion | Requerido | Descripcion |
|
|
451
|
+
|---|---|---|
|
|
452
|
+
| `[path]` | No | Ruta al proyecto de Unity (posicional o `--path`) |
|
|
453
|
+
| `--url <url>` | No | URL directa del servidor (omite la configuracion) |
|
|
454
|
+
| `--token <token>` | No | Token Bearer (omite la configuracion) |
|
|
455
|
+
| `--timeout <ms>` | No | Tiempo de espera del sondeo en milisegundos (por defecto: 5000) |
|
|
456
|
+
|
|
457
|
+

|
|
458
|
+
|
|
400
459
|
## Opciones globales
|
|
401
460
|
|
|
402
461
|
Estas opciones estan disponibles en todos los comandos:
|
|
@@ -439,6 +498,12 @@ unity-mcp-cli setup-mcp claude-code ./MyAIGame
|
|
|
439
498
|
unity-mcp-cli open ./MyAIGame \
|
|
440
499
|
--url http://localhost:8080 \
|
|
441
500
|
--keep-connected
|
|
501
|
+
|
|
502
|
+
# 7. Wait for Unity Editor and MCP server to be ready
|
|
503
|
+
unity-mcp-cli wait-for-ready ./MyAIGame
|
|
504
|
+
|
|
505
|
+
# 8. Run tests to verify everything works
|
|
506
|
+
unity-mcp-cli run-tool tests-run ./MyAIGame --input '{"testMode":"EditMode"}'
|
|
442
507
|
```
|
|
443
508
|
|
|
444
509
|

|
package/docs/README.ja.md
CHANGED
|
@@ -36,9 +36,11 @@
|
|
|
36
36
|
- :white_check_mark: **プラグインのインストール** — 必要なスコープレジストリとともにUnity-MCPプラグインを`manifest.json`に追加
|
|
37
37
|
- :white_check_mark: **プラグインの削除** — Unity-MCPプラグインを`manifest.json`から削除
|
|
38
38
|
- :white_check_mark: **設定** — MCPツール、プロンプト、リソースの有効化/無効化
|
|
39
|
+
- :white_check_mark: **ステータス確認** — Unityプロセス、ローカルサーバー、クラウドサーバーの接続状態を一目で確認
|
|
39
40
|
- :white_check_mark: **ツールの実行** — コマンドラインからMCPツールを直接実行
|
|
40
41
|
- :white_check_mark: **MCPのセットアップ** — 14種類のサポート対象エージェントのAIエージェントMCP設定ファイルを書き出し
|
|
41
42
|
- :white_check_mark: **スキルのセットアップ** — MCPサーバー経由でAIエージェント用のスキルファイルを生成
|
|
43
|
+
- :white_check_mark: **準備完了待機** — Unity EditorとMCPサーバーが接続されてツール呼び出しを受け付けるまでポーリング
|
|
42
44
|
- :white_check_mark: **起動と接続** — MCP環境変数を設定してUnityを起動し、自動的にサーバーに接続
|
|
43
45
|
- :white_check_mark: **クロスプラットフォーム** — Windows、macOS、Linuxに対応
|
|
44
46
|
- :white_check_mark: **CI対応** — 非インタラクティブターミナルを自動検出し、スピナーやカラーを無効化
|
|
@@ -94,9 +96,11 @@ npx unity-mcp-cli install-plugin /path/to/unity/project
|
|
|
94
96
|
- [`install-unity`](#install-unity)
|
|
95
97
|
- [`open`](#open)
|
|
96
98
|
- [`run-tool`](#run-tool)
|
|
99
|
+
- [`wait-for-ready`](#wait-for-ready)
|
|
97
100
|
- [`setup-mcp`](#setup-mcp)
|
|
98
101
|
- [`setup-skills`](#setup-skills)
|
|
99
102
|
- [`remove-plugin`](#remove-plugin)
|
|
103
|
+
- [`status`](#status)
|
|
100
104
|
- [グローバルオプション](#global-options)
|
|
101
105
|
- [完全自動化の例](#full-automation-example)
|
|
102
106
|
- [仕組み](#how-it-works)
|
|
@@ -320,6 +324,44 @@ unity-mcp-cli run-tool assets-list ./MyGame --raw | jq '.results'
|
|
|
320
324
|
|
|
321
325
|

|
|
322
326
|
|
|
327
|
+
## `wait-for-ready`
|
|
328
|
+
|
|
329
|
+
Unity EditorとMCPサーバーが接続され、ツール呼び出しを受け付ける準備ができるまで待機します。設定可能な間隔でサーバーをポーリングし、正常に応答するかタイムアウトに達するまで待ちます。`open`でUnityを起動した後、エージェントがツールの呼び出しを開始できるタイミングを知る必要がある自動化スクリプトやAIエージェントのオーケストレーションに便利です。
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
| オプション | 必須 | 説明 |
|
|
336
|
+
|---|---|---|
|
|
337
|
+
| `[path]` | いいえ | Unityプロジェクトのパス(位置引数または`--path`)— 設定の読み取りとポートの検出に使用 |
|
|
338
|
+
| `--url <url>` | いいえ | サーバーURLの直接指定(設定をバイパス) |
|
|
339
|
+
| `--token <token>` | いいえ | Bearerトークンの直接指定(設定をバイパス) |
|
|
340
|
+
| `--timeout <ms>` | いいえ | 最大待機時間(ミリ秒単位、デフォルト:120000) |
|
|
341
|
+
| `--interval <ms>` | いいえ | ポーリング間隔(ミリ秒単位、デフォルト:3000) |
|
|
342
|
+
|
|
343
|
+
**例 — デフォルトタイムアウト(120秒)で待機:**
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
unity-mcp-cli open ./MyGame
|
|
347
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
348
|
+
unity-mcp-cli run-tool tests-run ./MyGame --input '{"testMode":"EditMode"}'
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**例 — CI用の短いタイムアウト:**
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
unity-mcp-cli wait-for-ready ./MyGame --timeout 60000 --interval 2000
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**例 — サーバーURLを明示的に指定:**
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
unity-mcp-cli wait-for-ready --url http://localhost:8080 --timeout 30000
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+

|
|
364
|
+
|
|
323
365
|
## `setup-mcp`
|
|
324
366
|
|
|
325
367
|
AIエージェント用のMCP設定ファイルを書き出し、Unity Editor UIなしでヘッドレス/CIセットアップを可能にします。14種類すべてのエージェント(Claude Code、Cursor、Geminiなど)をサポートしています。
|
|
@@ -397,6 +439,23 @@ unity-mcp-cli remove-plugin ./MyGame
|
|
|
397
439
|
|
|
398
440
|

|
|
399
441
|
|
|
442
|
+
## `status`
|
|
443
|
+
|
|
444
|
+
Unity EditorとMCPサーバーの接続状態を確認します。Unityが実行中かどうか、ローカルMCPサーバーが到達可能かどうか、設定されたサーバー(例:クラウド)が到達可能かどうかを表示します。
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
unity-mcp-cli status ./MyGame
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
| オプション | 必須 | 説明 |
|
|
451
|
+
|---|---|---|
|
|
452
|
+
| `[path]` | いいえ | Unityプロジェクトのパス(位置引数または`--path`) |
|
|
453
|
+
| `--url <url>` | いいえ | サーバーURLの直接指定(設定をバイパス) |
|
|
454
|
+
| `--token <token>` | いいえ | Bearerトークンの直接指定(設定をバイパス) |
|
|
455
|
+
| `--timeout <ms>` | いいえ | プローブタイムアウト(ミリ秒単位、デフォルト:5000) |
|
|
456
|
+
|
|
457
|
+

|
|
458
|
+
|
|
400
459
|
## グローバルオプション
|
|
401
460
|
|
|
402
461
|
以下のオプションはすべてのコマンドで使用できます:
|
|
@@ -439,6 +498,12 @@ unity-mcp-cli setup-mcp claude-code ./MyAIGame
|
|
|
439
498
|
unity-mcp-cli open ./MyAIGame \
|
|
440
499
|
--url http://localhost:8080 \
|
|
441
500
|
--keep-connected
|
|
501
|
+
|
|
502
|
+
# 7. Wait for Unity Editor and MCP server to be ready
|
|
503
|
+
unity-mcp-cli wait-for-ready ./MyAIGame
|
|
504
|
+
|
|
505
|
+
# 8. Run tests to verify everything works
|
|
506
|
+
unity-mcp-cli run-tool tests-run ./MyAIGame --input '{"testMode":"EditMode"}'
|
|
442
507
|
```
|
|
443
508
|
|
|
444
509
|

|
package/docs/README.zh-CN.md
CHANGED
|
@@ -36,9 +36,11 @@
|
|
|
36
36
|
- :white_check_mark: **安装插件** — 将 Unity-MCP 插件连同所有必需的作用域注册表添加到 `manifest.json`
|
|
37
37
|
- :white_check_mark: **移除插件** — 从 `manifest.json` 中移除 Unity-MCP 插件
|
|
38
38
|
- :white_check_mark: **配置** — 启用/禁用 MCP 工具、提示和资源
|
|
39
|
+
- :white_check_mark: **状态检查** — 一目了然查看 Unity 进程、本地服务器和云服务器的连接状态
|
|
39
40
|
- :white_check_mark: **运行工具** — 直接从命令行执行 MCP 工具
|
|
40
41
|
- :white_check_mark: **设置 MCP** — 为 14 个受支持的 AI 代理中的任何一个编写 MCP 配置文件
|
|
41
42
|
- :white_check_mark: **设置技能** — 通过 MCP 服务器为 AI 代理生成技能文件
|
|
43
|
+
- :white_check_mark: **等待就绪** — 轮询直到 Unity 编辑器和 MCP 服务器已连接并可接受工具调用
|
|
42
44
|
- :white_check_mark: **打开并连接** — 启动 Unity,可选设置 MCP 环境变量以实现自动服务器连接
|
|
43
45
|
- :white_check_mark: **跨平台** — 支持 Windows、macOS 和 Linux
|
|
44
46
|
- :white_check_mark: **CI 友好** — 自动检测非交互式终端并禁用加载动画/颜色
|
|
@@ -94,9 +96,11 @@ npx unity-mcp-cli install-plugin /path/to/unity/project
|
|
|
94
96
|
- [`install-unity`](#install-unity)
|
|
95
97
|
- [`open`](#open)
|
|
96
98
|
- [`run-tool`](#run-tool)
|
|
99
|
+
- [`wait-for-ready`](#wait-for-ready)
|
|
97
100
|
- [`setup-mcp`](#setup-mcp)
|
|
98
101
|
- [`setup-skills`](#setup-skills)
|
|
99
102
|
- [`remove-plugin`](#remove-plugin)
|
|
103
|
+
- [`status`](#status)
|
|
100
104
|
- [全局选项](#global-options)
|
|
101
105
|
- [完整自动化示例](#full-automation-example)
|
|
102
106
|
- [工作原理](#how-it-works)
|
|
@@ -320,6 +324,44 @@ unity-mcp-cli run-tool assets-list ./MyGame --raw | jq '.results'
|
|
|
320
324
|
|
|
321
325
|

|
|
322
326
|
|
|
327
|
+
## `wait-for-ready`
|
|
328
|
+
|
|
329
|
+
等待 Unity 编辑器和 MCP 服务器连接就绪并可接受工具调用。以可配置的间隔轮询服务器,直到成功响应或达到超时时间。适用于自动化脚本和 AI 代理编排场景,其中 `open` 启动 Unity 后代理需要知道何时可以开始调用工具。
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
| 选项 | 必需 | 描述 |
|
|
336
|
+
|---|---|---|
|
|
337
|
+
| `[path]` | 否 | Unity 项目路径(位置参数或 `--path`)— 用于读取配置和检测端口 |
|
|
338
|
+
| `--url <url>` | 否 | 直接覆盖服务器 URL(绕过配置) |
|
|
339
|
+
| `--token <token>` | 否 | 覆盖 Bearer 令牌(绕过配置) |
|
|
340
|
+
| `--timeout <ms>` | 否 | 最大等待时间(毫秒)(默认:120000) |
|
|
341
|
+
| `--interval <ms>` | 否 | 轮询间隔(毫秒)(默认:3000) |
|
|
342
|
+
|
|
343
|
+
**示例 — 使用默认超时(120秒)等待:**
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
unity-mcp-cli open ./MyGame
|
|
347
|
+
unity-mcp-cli wait-for-ready ./MyGame
|
|
348
|
+
unity-mcp-cli run-tool tests-run ./MyGame --input '{"testMode":"EditMode"}'
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**示例 — CI 环境使用更短的超时:**
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
unity-mcp-cli wait-for-ready ./MyGame --timeout 60000 --interval 2000
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**示例 — 显式指定服务器 URL:**
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
unity-mcp-cli wait-for-ready --url http://localhost:8080 --timeout 30000
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+

|
|
364
|
+
|
|
323
365
|
## `setup-mcp`
|
|
324
366
|
|
|
325
367
|
为 AI 代理编写 MCP 配置文件,支持无界面/CI 环境设置,无需 Unity 编辑器 UI。支持全部 14 个代理(Claude Code、Cursor、Gemini、Codex 等)。
|
|
@@ -397,6 +439,23 @@ unity-mcp-cli remove-plugin ./MyGame
|
|
|
397
439
|
|
|
398
440
|

|
|
399
441
|
|
|
442
|
+
## `status`
|
|
443
|
+
|
|
444
|
+
检查 Unity 编辑器和 MCP 服务器的连接状态。显示 Unity 是否正在运行、本地 MCP 服务器是否可达、以及配置的服务器(例如云端)是否可达。
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
unity-mcp-cli status ./MyGame
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
| 选项 | 必需 | 描述 |
|
|
451
|
+
|---|---|---|
|
|
452
|
+
| `[path]` | 否 | Unity 项目路径(位置参数或 `--path`) |
|
|
453
|
+
| `--url <url>` | 否 | 直接覆盖服务器 URL(绕过配置) |
|
|
454
|
+
| `--token <token>` | 否 | 覆盖 Bearer 令牌(绕过配置) |
|
|
455
|
+
| `--timeout <ms>` | 否 | 探测超时时间(毫秒)(默认:5000) |
|
|
456
|
+
|
|
457
|
+

|
|
458
|
+
|
|
400
459
|
## 全局选项
|
|
401
460
|
|
|
402
461
|
以下选项适用于所有命令:
|
|
@@ -439,6 +498,12 @@ unity-mcp-cli setup-mcp claude-code ./MyAIGame
|
|
|
439
498
|
unity-mcp-cli open ./MyAIGame \
|
|
440
499
|
--url http://localhost:8080 \
|
|
441
500
|
--keep-connected
|
|
501
|
+
|
|
502
|
+
# 7. Wait for Unity Editor and MCP server to be ready
|
|
503
|
+
unity-mcp-cli wait-for-ready ./MyAIGame
|
|
504
|
+
|
|
505
|
+
# 8. Run tests to verify everything works
|
|
506
|
+
unity-mcp-cli run-tool tests-run ./MyAIGame --input '{"testMode":"EditMode"}'
|
|
442
507
|
```
|
|
443
508
|
|
|
444
509
|

|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unity-mcp-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
4
4
|
"description": "Cross-platform CLI tool for AI Game Developer (Skills & MCP). Full AI develop and test loop. Efficient token usage, advanced tools. Creates Unity project, installs plugins, configures tools, and manages HTTP connection with Unity Editor and a game made with Unity. Works with Claude Code, Gemini, Copilot, Cursor and any other absolutely for free.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|