uefn-mcp-lab-guard · git:20261016.5b4e0c6 · 2026-10-16 · sha256 ce094c549365de9c
uefn-mcp-lab-guard git:20261016.5b4e0c6A
Immutable. This exact content never changes and is served at /api/v1/blob/ce094c549365de9c.
--- name: uefn-mcp-lab-guard description: UEFN MCP lab guard: path forms (GUID vs LAB_ROOT), shell, what the guard refuses. Use before any MCP tool that WRITES, or any script that sets LAB_ROOT/LAB_AGGRESSIVE. last_reviewed: 2026-10-16 sources: [original] --- # uefn-mcp-lab-guard ## Rules 1. Asset paths and tool arguments: ALWAYS GUID form `/<guid>/<project>/...` (here `/09e4e8d3-83f9-4ee0-9777-072ed3984380/root_ai_lab`). The editor refuses `/root_ai_lab` as an asset path (`outside this project's valid asset roots`). 2. `LAB_ROOT` (the guard's environment variable): the form depends on the guard. Read the header of `Claude/hooks/mcp_lab.py` in the project and use the documented form (after T-014: `/root_ai_lab`; wrong form = every write refused with `path outside /<guid>/root_ai_lab`). Do not confuse it with the argument form. 3. Shell: use PowerShell for anything that touches `LAB_ROOT` or paths starting with `/`. Git Bash rewrites `/09e4...` in `C:/Program Files/Git/...` and the lab does not start; if unavoidable `MSYS_NO_PATHCONV=1`. 4. Activation: `$env:LAB_AGGRESSIVE="1"; $env:LAB_ROOT=...` set by `Content`. 5. Ledger `Claude/logs/explore-ledger.jsonl`: every call has `r` = ok / rejected / refused / no_answer. Cite a recipe only from an `ok` line with the exact arguments. 6. The guard refuses: strings that start with `/` outside the lab and outside the accepted source roots (`/Script`, `/Engine`, `/Niagara`, `/Game`, `/FortniteGame`) per create/duplicate/place/add; drive paths in writes; editor quit/restart. It is blind inside `execute_tool_script` (it only sees the outer call). ## Don't - Bypassing a refusal: report the exact message and stop. - Using paths from another project (`root_pillars`), closing or killing a running editor (relaunch only through `uefn_session.py recover`, opt-in), writing outside the lab, exploiting B-002 (`values` as a JSON string). - Improvising when a recipe fails: exact error and stop. ## Recipes (recipes.json, status tool-ok or proven) - `AssetTools/find_assets` with `folder_path` and `asset_type` (filtered read in the lab). - `AssetTools/list_folders` with a non-recursive `root_path`. - `GetLogEntries#filter_noise`: pattern `^(?!.*LogModelContextProtocol)`. ## To try (not verified) - Duplicates from other projects with `extra-root` (e.g. `/mech-drone`): unverified, requires `extra-root` in LAB-PROJECT.txt. ## Known editor traps (UEFN 42.20) - Never call `get_lod_count`, `get_number_verts`, `get_num_triangles`, `get_num_sections` or `agg_geom.export_text()` on a static mesh: they crash the editor. - Creating an asset with an existing name opens a modal "Overwrite Existing Object" that blocks the MCP: use a new name or check first. - A tool tagged `[experimental]` is ask-the-owner-first. A call that hangs while UEFN is in the background: report it, do not loop. - With Revision Control disconnected `StartSession` fails (Validation failed): reconnect it first.