flockbay-cli 0.10.9 → 0.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +3 -12
  2. package/dist/codex/flockbayMcpStdioBridge.cjs +54 -57
  3. package/dist/codex/flockbayMcpStdioBridge.mjs +54 -57
  4. package/dist/{index-FbVwPVUa.mjs → index-CxdeT2En.mjs} +3661 -8200
  5. package/dist/{index-BG_P2ZhF.cjs → index-Dl2GS1Q9.cjs} +3676 -8216
  6. package/dist/index.cjs +3 -2
  7. package/dist/index.mjs +3 -2
  8. package/dist/lib.cjs +1 -1
  9. package/dist/lib.mjs +1 -1
  10. package/dist/{runCodex-CbaAW7SY.cjs → runCodex-DR4g3Jwa.cjs} +114 -193
  11. package/dist/{runCodex-BZLbUq_B.mjs → runCodex-ID85oBMw.mjs} +84 -163
  12. package/dist/{runGemini-Bpk5BicJ.cjs → runGemini-Bfmt6ks1.cjs} +174 -103
  13. package/dist/{runGemini-Ch6pixIP.mjs → runGemini-DgDnHYry.mjs} +139 -68
  14. package/dist/{types-D4INIyRf.cjs → types-BKG04fBA.cjs} +293 -16
  15. package/dist/{types-C4663W73.mjs → types-CledKhsa.mjs} +283 -8
  16. package/package.json +4 -3
  17. package/tools/unreal-mcp/UPSTREAM_VERSION.md +8 -0
  18. package/tools/unreal-mcp/upstream/Docs/README.md +8 -0
  19. package/tools/unreal-mcp/upstream/Docs/Tools/README.md +7 -0
  20. package/tools/unreal-mcp/upstream/Docs/Tools/actor_tools.md +184 -0
  21. package/tools/unreal-mcp/upstream/Docs/Tools/blueprint_tools.md +268 -0
  22. package/tools/unreal-mcp/upstream/Docs/Tools/editor_tools.md +104 -0
  23. package/tools/unreal-mcp/upstream/Docs/Tools/node_tools.md +274 -0
  24. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Config/FilterPlugin.ini +8 -0
  25. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/Commands/UnrealMCPBlueprintCommands.cpp +1160 -0
  26. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/Commands/UnrealMCPBlueprintNodeCommands.cpp +924 -0
  27. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/Commands/UnrealMCPCommonUtils.cpp +709 -0
  28. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/Commands/UnrealMCPEditorCommands.cpp +863 -0
  29. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/Commands/UnrealMCPProjectCommands.cpp +72 -0
  30. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/Commands/UnrealMCPUMGCommands.cpp +544 -0
  31. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/MCPServerRunnable.cpp +321 -0
  32. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/UnrealMCPBridge.cpp +419 -0
  33. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Private/UnrealMCPModule.cpp +21 -0
  34. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/Commands/UnrealMCPBlueprintCommands.h +34 -0
  35. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/Commands/UnrealMCPBlueprintNodeCommands.h +27 -0
  36. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/Commands/UnrealMCPCommonUtils.h +59 -0
  37. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/Commands/UnrealMCPEditorCommands.h +40 -0
  38. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/Commands/UnrealMCPProjectCommands.h +20 -0
  39. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/Commands/UnrealMCPUMGCommands.h +82 -0
  40. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/MCPServerRunnable.h +34 -0
  41. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/UnrealMCPBridge.h +64 -0
  42. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/Public/UnrealMCPModule.h +22 -0
  43. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/Source/UnrealMCP/UnrealMCP.Build.cs +78 -0
  44. package/tools/unreal-mcp/upstream/MCPGameProject/Plugins/UnrealMCP/UnrealMCP.uplugin +36 -0
  45. package/tools/unreal-mcp/upstream/Python/README.md +40 -0
  46. package/tools/unreal-mcp/upstream/Python/pyproject.toml +22 -0
  47. package/tools/unreal-mcp/upstream/Python/scripts/actors/test_cube.py +203 -0
  48. package/tools/unreal-mcp/upstream/Python/scripts/blueprints/test_create_and_spawn_blueprints_with_different_components.py +497 -0
  49. package/tools/unreal-mcp/upstream/Python/scripts/blueprints/test_create_and_spawn_cube_blueprint.py +194 -0
  50. package/tools/unreal-mcp/upstream/Python/scripts/node/test_component_reference.py +267 -0
  51. package/tools/unreal-mcp/upstream/Python/scripts/node/test_create_bird_blueprint_with_input_and_camera.py +618 -0
  52. package/tools/unreal-mcp/upstream/Python/scripts/node/test_input_mapping.py +366 -0
  53. package/tools/unreal-mcp/upstream/Python/scripts/node/test_physics_variables.py +390 -0
  54. package/tools/unreal-mcp/upstream/Python/tools/blueprint_tools.py +420 -0
  55. package/tools/unreal-mcp/upstream/Python/tools/editor_tools.py +369 -0
  56. package/tools/unreal-mcp/upstream/Python/tools/node_tools.py +430 -0
  57. package/tools/unreal-mcp/upstream/Python/tools/project_tools.py +64 -0
  58. package/tools/unreal-mcp/upstream/Python/tools/umg_tools.py +333 -0
  59. package/tools/unreal-mcp/upstream/Python/unreal_mcp_server.py +398 -0
  60. package/tools/unreal-mcp/upstream/Python/uv.lock +521 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Code on the go controlling Claude/Codex sessions from your mobile device.
4
4
 
5
- Free. Open source. Code anywhere.
5
+ Code anywhere.
6
6
 
7
7
  Flockbay CLI is the command-line tool for running and controlling Flockbay sessions (including daemon and Codex mode).
8
8
 
@@ -41,16 +41,7 @@ This will:
41
41
  - `--claude-env KEY=VALUE` - Set environment variable for Claude Code (e.g., for [claude-code-router](https://github.com/musistudio/claude-code-router))
42
42
  - `--claude-arg ARG` - Pass additional argument to Claude CLI
43
43
 
44
- ## Environment Variables
45
-
46
- - `FLOCKBAY_SERVER_URL` - API base URL (default: https://api.flockbay.com)
47
- - `FLOCKBAY_WEBAPP_URL` - Web app base URL (default: https://flockbay.com)
48
- - `FLOCKBAY_HOME_DIR` - Home directory for local CLI state (default: `~/.flockbay`)
49
- - `FLOCKBAY_DISABLE_CAFFEINATE` - Disable macOS sleep prevention (set to `true`, `1`, or `yes`)
50
- - `FLOCKBAY_EXPERIMENTAL` - Enable experimental features (set to `true`, `1`, or `yes`)
51
-
52
- Legacy env vars are still supported for compatibility:
53
- - `FLOCKBAY_SERVER_URL`, `FLOCKBAY_WEBAPP_URL`, `FLOCKBAY_HOME_DIR`, `FLOCKBAY_DISABLE_CAFFEINATE`, `FLOCKBAY_EXPERIMENTAL`
44
+ Run `flockbay --help` for the complete list of options.
54
45
 
55
46
  ## Requirements
56
47
 
@@ -62,4 +53,4 @@ Legacy env vars are still supported for compatibility:
62
53
 
63
54
  ## License
64
55
 
65
- MIT
56
+ Proprietary. Copyright (c) 2024-2026 Flockbay. All rights reserved.
@@ -6,24 +6,7 @@ var index_js = require('@modelcontextprotocol/sdk/client/index.js');
6
6
  var streamableHttp_js = require('@modelcontextprotocol/sdk/client/streamableHttp.js');
7
7
  var z = require('zod');
8
8
 
9
- const INTERACTIVE_TOOL_TIMEOUT_MS = 14 * 24 * 60 * 60 * 1e3;
10
- function clampTimeoutMs(timeoutMs) {
11
- if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) return INTERACTIVE_TOOL_TIMEOUT_MS;
12
- return Math.max(1e3, Math.min(INTERACTIVE_TOOL_TIMEOUT_MS, Math.floor(timeoutMs)));
13
- }
14
9
  function getToolCallTimeoutMs(name, args) {
15
- if (name === "ask_user_question") return INTERACTIVE_TOOL_TIMEOUT_MS;
16
- const timeoutMs = typeof args?.timeoutMs === "number" ? args.timeoutMs : void 0;
17
- const bakeTimeoutMs = typeof args?.bakeTimeoutMs === "number" ? args.bakeTimeoutMs : void 0;
18
- if (name === "unreal_fast_preview") {
19
- const previewMs = timeoutMs ?? 6e5;
20
- const bakeMs = bakeTimeoutMs ?? 18e5;
21
- return clampTimeoutMs(previewMs + bakeMs + 5 * 6e4);
22
- }
23
- if (name === "unreal_headless_screenshot") {
24
- const shotsMs = timeoutMs ?? 6e5;
25
- return clampTimeoutMs(shotsMs + 2 * 6e4);
26
- }
27
10
  return void 0;
28
11
  }
29
12
  function parseArgs(argv) {
@@ -301,21 +284,6 @@ async function main() {
301
284
  "Docs Import",
302
285
  "Import markdown files into the Documentation Library (copy into backend DB)."
303
286
  );
304
- forwardTool(
305
- "unreal_headless_screenshot",
306
- {
307
- uprojectPath: z.z.string().describe("Absolute path to the .uproject file."),
308
- engineRoot: z.z.string().optional().describe("Unreal Engine install root (e.g. /Users/Shared/Epic Games/UE_5.7). Defaults to UE_ENGINE_ROOT / ENGINE_ROOT env vars."),
309
- resX: z.z.number().int().positive().optional().describe("Output resolution width (default 800)."),
310
- resY: z.z.number().int().positive().optional().describe("Output resolution height (default 450)."),
311
- fast: z.z.boolean().optional().describe("Enable fast screenshot mode (-FlockbayScreenshotFast)."),
312
- focus: z.z.string().optional().describe('Focus point "x;y;z" (or "x,y,z"), forwarded as -FlockbayScreenshotFocus=...'),
313
- extraArgs: z.z.array(z.z.string()).optional().describe("Additional Unreal command-line args (advanced)."),
314
- timeoutMs: z.z.number().int().positive().optional().describe("Timeout in ms (default 600000).")
315
- },
316
- "Unreal Headless Screenshot",
317
- "Run the Unreal Engine project in headless/offscreen mode and capture a screenshot using -FlockbayScreenshotMode."
318
- );
319
287
  forwardTool(
320
288
  "unreal_latest_screenshots",
321
289
  {
@@ -328,33 +296,62 @@ async function main() {
328
296
  "Fetch the latest PNG screenshots from Saved/Screenshots/Flockbay and return views for the UI to display."
329
297
  );
330
298
  forwardTool(
331
- "unreal_fast_preview",
299
+ "unreal_mcp_command",
332
300
  {
333
- uprojectPath: z.z.string().describe("Absolute path to the .uproject file."),
334
- engineRoot: z.z.string().optional().describe(
335
- "Unreal Engine install root (e.g. /Users/Shared/Epic Games/UE_5.7). Defaults to UE_ENGINE_ROOT / ENGINE_ROOT env vars."
336
- ),
337
- resX: z.z.number().int().positive().optional().describe("Output resolution width (default 800)."),
338
- resY: z.z.number().int().positive().optional().describe("Output resolution height (default 450)."),
339
- fast: z.z.boolean().optional().describe("Enable fast screenshot mode (-FlockbayScreenshotFast). Default true."),
340
- focus: z.z.string().optional().describe('Focus point "x;y;z" (or "x,y,z"), forwarded as -FlockbayScreenshotFocus=...'),
341
- extraArgs: z.z.array(z.z.string()).optional().describe("Additional Unreal command-line args (advanced)."),
342
- timeoutMs: z.z.number().int().positive().optional().describe("Timeout in ms (default 600000)."),
343
- expectedViews: z.z.array(z.z.string()).optional().describe('If provided, fail unless these view IDs exist (e.g. ["spawn_overview"]).'),
344
- mode: z.z.enum(["auto", "preview_only", "bake_and_preview"]).optional().describe(
345
- "auto=try preview, then bake+preview if preview fails. preview_only=never bake. bake_and_preview=always bake first. Default auto."
346
- ),
347
- bakeTimeoutMs: z.z.number().int().positive().optional().describe("Timeout in ms for bake step (default 1800000)."),
348
- bakeMap: z.z.string().optional().describe("Map asset path used for baking (defaults to Config/GameConfig.json map.levelName; fail-hard if empty)."),
349
- configRelPath: z.z.string().optional().describe("Game config path relative to project root (default Config/GameConfig.json)."),
350
- reuseIfUnchanged: z.z.boolean().optional().describe("If inputs match the last successful run, reuse prior artifacts (upload existing screenshots) instead of rerunning Unreal. Default true."),
351
- requireScatterBudget: z.z.boolean().optional().describe("Fail unless world.scatterBudget exists (prelaunch safety gate). Default false."),
352
- baselineKey: z.z.string().optional().describe('Baseline key for compare/pin (stored under .flockbay/baselines/fast-preview/<baselineKey>). Default "default".'),
353
- baselineAction: z.z.enum(["none", "compare", "set"]).optional().describe("compare=report differences vs baseline. set=overwrite baseline with this run. Default none."),
354
- failOnBaselineDiff: z.z.boolean().optional().describe("When baselineAction=compare, fail if screenshots differ from baseline. Default false.")
301
+ type: z.z.string().describe('UnrealMCP command type (e.g. "get_actors_in_level", "spawn_actor").'),
302
+ params: z.z.record(z.z.any()).optional().describe("Optional params object for the command."),
303
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
304
+ },
305
+ "Unreal Editor Command (UnrealMCP)",
306
+ "Send a single UnrealMCP command to the running Unreal Editor (engine plugin) and return the JSON response."
307
+ );
308
+ forwardTool(
309
+ "unreal_mcp_get_actors_in_level",
310
+ {
311
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
312
+ },
313
+ "Unreal Actors In Level (UnrealMCP)",
314
+ "List all actors in the current Unreal Editor level via the UnrealMCP engine plugin."
315
+ );
316
+ forwardTool(
317
+ "unreal_mcp_get_play_in_editor_status",
318
+ {
319
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
320
+ },
321
+ "Unreal Play Status (PIE)",
322
+ "Get Play-In-Editor status from the UnrealMCP engine plugin."
323
+ );
324
+ forwardTool(
325
+ "unreal_mcp_editor_health",
326
+ {
327
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 1500).")
328
+ },
329
+ "Unreal Editor Health (UnrealMCP)",
330
+ "Best-effort health check for Unreal Editor + UnrealMCP (detects if the editor is reachable)."
331
+ );
332
+ forwardTool(
333
+ "unreal_mcp_play_in_editor",
334
+ {
335
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
336
+ },
337
+ "Unreal Play In Editor (Viewport)",
338
+ "Start Play-In-Editor (PIE) in the active editor viewport via the UnrealMCP engine plugin."
339
+ );
340
+ forwardTool(
341
+ "unreal_mcp_play_in_editor_windowed",
342
+ {
343
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
344
+ },
345
+ "Unreal Play In Editor (New Window)",
346
+ "Start Play-In-Editor (PIE) in a new editor window via the UnrealMCP engine plugin."
347
+ );
348
+ forwardTool(
349
+ "unreal_mcp_stop_play_in_editor",
350
+ {
351
+ timeoutMs: z.z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
355
352
  },
356
- "Unreal Fast Preview (Evidence First)",
357
- "Run a fast headless Unreal preview and attach stable screenshot evidence + a run manifest to the session."
353
+ "Unreal Stop Play In Editor",
354
+ "Stop a running Play-In-Editor session via the UnrealMCP engine plugin."
358
355
  );
359
356
  forwardTool(
360
357
  "unreal_mechanic_run",
@@ -4,24 +4,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
4
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
5
5
  import { z } from 'zod';
6
6
 
7
- const INTERACTIVE_TOOL_TIMEOUT_MS = 14 * 24 * 60 * 60 * 1e3;
8
- function clampTimeoutMs(timeoutMs) {
9
- if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) return INTERACTIVE_TOOL_TIMEOUT_MS;
10
- return Math.max(1e3, Math.min(INTERACTIVE_TOOL_TIMEOUT_MS, Math.floor(timeoutMs)));
11
- }
12
7
  function getToolCallTimeoutMs(name, args) {
13
- if (name === "ask_user_question") return INTERACTIVE_TOOL_TIMEOUT_MS;
14
- const timeoutMs = typeof args?.timeoutMs === "number" ? args.timeoutMs : void 0;
15
- const bakeTimeoutMs = typeof args?.bakeTimeoutMs === "number" ? args.bakeTimeoutMs : void 0;
16
- if (name === "unreal_fast_preview") {
17
- const previewMs = timeoutMs ?? 6e5;
18
- const bakeMs = bakeTimeoutMs ?? 18e5;
19
- return clampTimeoutMs(previewMs + bakeMs + 5 * 6e4);
20
- }
21
- if (name === "unreal_headless_screenshot") {
22
- const shotsMs = timeoutMs ?? 6e5;
23
- return clampTimeoutMs(shotsMs + 2 * 6e4);
24
- }
25
8
  return void 0;
26
9
  }
27
10
  function parseArgs(argv) {
@@ -299,21 +282,6 @@ async function main() {
299
282
  "Docs Import",
300
283
  "Import markdown files into the Documentation Library (copy into backend DB)."
301
284
  );
302
- forwardTool(
303
- "unreal_headless_screenshot",
304
- {
305
- uprojectPath: z.string().describe("Absolute path to the .uproject file."),
306
- engineRoot: z.string().optional().describe("Unreal Engine install root (e.g. /Users/Shared/Epic Games/UE_5.7). Defaults to UE_ENGINE_ROOT / ENGINE_ROOT env vars."),
307
- resX: z.number().int().positive().optional().describe("Output resolution width (default 800)."),
308
- resY: z.number().int().positive().optional().describe("Output resolution height (default 450)."),
309
- fast: z.boolean().optional().describe("Enable fast screenshot mode (-FlockbayScreenshotFast)."),
310
- focus: z.string().optional().describe('Focus point "x;y;z" (or "x,y,z"), forwarded as -FlockbayScreenshotFocus=...'),
311
- extraArgs: z.array(z.string()).optional().describe("Additional Unreal command-line args (advanced)."),
312
- timeoutMs: z.number().int().positive().optional().describe("Timeout in ms (default 600000).")
313
- },
314
- "Unreal Headless Screenshot",
315
- "Run the Unreal Engine project in headless/offscreen mode and capture a screenshot using -FlockbayScreenshotMode."
316
- );
317
285
  forwardTool(
318
286
  "unreal_latest_screenshots",
319
287
  {
@@ -326,33 +294,62 @@ async function main() {
326
294
  "Fetch the latest PNG screenshots from Saved/Screenshots/Flockbay and return views for the UI to display."
327
295
  );
328
296
  forwardTool(
329
- "unreal_fast_preview",
297
+ "unreal_mcp_command",
330
298
  {
331
- uprojectPath: z.string().describe("Absolute path to the .uproject file."),
332
- engineRoot: z.string().optional().describe(
333
- "Unreal Engine install root (e.g. /Users/Shared/Epic Games/UE_5.7). Defaults to UE_ENGINE_ROOT / ENGINE_ROOT env vars."
334
- ),
335
- resX: z.number().int().positive().optional().describe("Output resolution width (default 800)."),
336
- resY: z.number().int().positive().optional().describe("Output resolution height (default 450)."),
337
- fast: z.boolean().optional().describe("Enable fast screenshot mode (-FlockbayScreenshotFast). Default true."),
338
- focus: z.string().optional().describe('Focus point "x;y;z" (or "x,y,z"), forwarded as -FlockbayScreenshotFocus=...'),
339
- extraArgs: z.array(z.string()).optional().describe("Additional Unreal command-line args (advanced)."),
340
- timeoutMs: z.number().int().positive().optional().describe("Timeout in ms (default 600000)."),
341
- expectedViews: z.array(z.string()).optional().describe('If provided, fail unless these view IDs exist (e.g. ["spawn_overview"]).'),
342
- mode: z.enum(["auto", "preview_only", "bake_and_preview"]).optional().describe(
343
- "auto=try preview, then bake+preview if preview fails. preview_only=never bake. bake_and_preview=always bake first. Default auto."
344
- ),
345
- bakeTimeoutMs: z.number().int().positive().optional().describe("Timeout in ms for bake step (default 1800000)."),
346
- bakeMap: z.string().optional().describe("Map asset path used for baking (defaults to Config/GameConfig.json map.levelName; fail-hard if empty)."),
347
- configRelPath: z.string().optional().describe("Game config path relative to project root (default Config/GameConfig.json)."),
348
- reuseIfUnchanged: z.boolean().optional().describe("If inputs match the last successful run, reuse prior artifacts (upload existing screenshots) instead of rerunning Unreal. Default true."),
349
- requireScatterBudget: z.boolean().optional().describe("Fail unless world.scatterBudget exists (prelaunch safety gate). Default false."),
350
- baselineKey: z.string().optional().describe('Baseline key for compare/pin (stored under .flockbay/baselines/fast-preview/<baselineKey>). Default "default".'),
351
- baselineAction: z.enum(["none", "compare", "set"]).optional().describe("compare=report differences vs baseline. set=overwrite baseline with this run. Default none."),
352
- failOnBaselineDiff: z.boolean().optional().describe("When baselineAction=compare, fail if screenshots differ from baseline. Default false.")
299
+ type: z.string().describe('UnrealMCP command type (e.g. "get_actors_in_level", "spawn_actor").'),
300
+ params: z.record(z.any()).optional().describe("Optional params object for the command."),
301
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
302
+ },
303
+ "Unreal Editor Command (UnrealMCP)",
304
+ "Send a single UnrealMCP command to the running Unreal Editor (engine plugin) and return the JSON response."
305
+ );
306
+ forwardTool(
307
+ "unreal_mcp_get_actors_in_level",
308
+ {
309
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
310
+ },
311
+ "Unreal Actors In Level (UnrealMCP)",
312
+ "List all actors in the current Unreal Editor level via the UnrealMCP engine plugin."
313
+ );
314
+ forwardTool(
315
+ "unreal_mcp_get_play_in_editor_status",
316
+ {
317
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
318
+ },
319
+ "Unreal Play Status (PIE)",
320
+ "Get Play-In-Editor status from the UnrealMCP engine plugin."
321
+ );
322
+ forwardTool(
323
+ "unreal_mcp_editor_health",
324
+ {
325
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 1500).")
326
+ },
327
+ "Unreal Editor Health (UnrealMCP)",
328
+ "Best-effort health check for Unreal Editor + UnrealMCP (detects if the editor is reachable)."
329
+ );
330
+ forwardTool(
331
+ "unreal_mcp_play_in_editor",
332
+ {
333
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
334
+ },
335
+ "Unreal Play In Editor (Viewport)",
336
+ "Start Play-In-Editor (PIE) in the active editor viewport via the UnrealMCP engine plugin."
337
+ );
338
+ forwardTool(
339
+ "unreal_mcp_play_in_editor_windowed",
340
+ {
341
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
342
+ },
343
+ "Unreal Play In Editor (New Window)",
344
+ "Start Play-In-Editor (PIE) in a new editor window via the UnrealMCP engine plugin."
345
+ );
346
+ forwardTool(
347
+ "unreal_mcp_stop_play_in_editor",
348
+ {
349
+ timeoutMs: z.number().int().positive().optional().describe("Socket timeout in ms (default 5000).")
353
350
  },
354
- "Unreal Fast Preview (Evidence First)",
355
- "Run a fast headless Unreal preview and attach stable screenshot evidence + a run manifest to the session."
351
+ "Unreal Stop Play In Editor",
352
+ "Stop a running Play-In-Editor session via the UnrealMCP engine plugin."
356
353
  );
357
354
  forwardTool(
358
355
  "unreal_mechanic_run",