unity-mcp-cli 0.58.0 → 0.60.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 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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
@@ -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,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const statusCommand: Command;
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const waitForReadyCommand: Command;
@@ -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;CACnB,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"}
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAQlC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IACnF,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QACrF,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;YACxC,OAAO,CAAC,2BAA2B,IAAI,CAAC,GAAG,kBAAkB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,IAAI,KAAe,CAAC;QAEpB,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,2MAA2M,CAAC;YAC9N,MAAM,MAAM,GAAG,QAAQ,CACrB,SAAS,EACT,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACtE,CAAC;YACF,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,MAAM,KAAK,CAAC,CAAC;oBAAE,SAAS;gBAE5B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEtD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;oBAAE,SAAS;gBAEjD,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,2BAA2B,CAAC;uBAClE,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAEhD,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG;wBACH,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACrD,WAAW;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gBAAgB;YAChB,MAAM,MAAM,GAAG,QAAQ,CACrB,6CAA6C,EAC7C,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACtE,CAAC;YACF,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK;oBAAE,SAAS;gBAErB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE7B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAAE,SAAS;gBAEpD,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC;uBACjE,WAAW,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAE/C,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG;wBACH,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACrD,WAAW;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,mCAAmC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,OAAO,CAAC,SAAS,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC"}
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
@@ -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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
+ ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
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
  ![AI Game Developer — Unity SKILLS and MCP](https://github.com/IvanMurzak/Unity-MCP/blob/main/docs/img/promo/hazzard-divider.svg?raw=true)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unity-mcp-cli",
3
- "version": "0.58.0",
3
+ "version": "0.60.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",