Skip to content

LLM Easy Shell

TCP shell interface for driving the Unreal Editor from any external client (LLM agent loop, CLI, test harness). One-line commands in, JSON out — no UE editor knowledge required.

Quick value: 35+ editor commands · 25+ built-in Python abilities · TCP server on ports 15151–15200 · works alongside any LLM agent framework.

🎯 For a minimal-dependency, read-only variant, see LLM Easy Shell Lite (9 commands, 2 engine plugin dependencies, free).


Core Features

  • Scene read/write — List, view, spawn, delete, move, rename actors and components
  • Property reflectionset / cat over any UObject, struct, or asset property
  • Asset operations — Browse, create, copy, delete, save assets via /Assets/... paths
  • Function dispatchcall any reflected UFUNCTION on actor or component
  • PIE controlplay, stop, pause, gamestate, select, focus
  • Live Codinglivecoding / lc / reload, --restart editor with crash detection
  • Logs — Editor log, error log, compile log, Niagara validation messages
  • UI introspectionuitree / uifind / uiinfo / uipress / uitype / uishot
  • Ability framework — Plugins register C++ commands at startup (auto-discovered)
  • PyAbility framework — Drop a .py into PyAbilities/.../abilities/ to register a command
  • TCP server — Plain text in / JSON out, ports 15151–15200
  • Multi-platform — Win64, Mac, Linux (Live Coding subcommand: Windows only)

Quick Preview

bash
# Agent loop — one line per action
> info
{"ok":true,"project":"MyGame","engine":"5.7.4","pie":"stopped","port":15151}

> spawn /Game/Blueprints/BP_Enemy at 100,200,50
{"ok":true,"actor":"/Actor/BP_Enemy_C_42"}

> set /Actor/BP_Enemy_C_42.Health=200
{"ok":true}

> call /Actor/BP_Enemy_C_42.SetActive true
{"ok":true,"result":"activated"}

> uishot
{"ok":true,"file":"Saved/Screenshots/2026-06-15.png"}

Send a one-line command → Get a one-line JSON response. The agent loop never stalls.


Technical Information

Features: 35+ editor commands (scene read/write, asset read/write, property/function discovery, PIE control, Live Coding, logs, UI introspection, screenshots), TCP server on ports 15151–15200, Ability framework for plugin-registered C++ commands, PyAbility framework for .py-defined commands, 25+ built-in Python abilities, command trace logging.

Code Modules: LLMEasyShell (Editor)

Number of Blueprints: 0

Number of C++ Classes: ~115

Network Replicated: No

Supported Development Platforms: Windows: Yes, Mac: Yes, Linux: Yes

Supported Target Build Platforms: Windows, Mac, Linux

Documentation Link: Documentation.md in plugin folder

Example Project: (see the GitHub repo's Plugins/LLMEasyShell/ for reference .uplugin / Documentation.md and the bundled Python ability set)

Important/Additional Notes: Editor-only plugin. For a minimal-dependency, read-only variant, see LLM Easy Shell Lite. UE 5.7+.


Build Environment

Required Host Plugins

The following engine plugins must be enabled in the host project before compilation. They are declared in LLMEasyShell.uplugin and the host .uproject must enable each one:

  • PythonScriptPlugin — backs the PyAbility framework and Python-driven abilities (python <name> ...)
  • GameplayAbilities — required by built-in abilities that introspect the Gameplay Ability System
  • GameplayTagsEditor — editor-side gameplay tag inspection
  • EnhancedInput — input mapping queries via discover / cat
  • PoseSearch — Motion Matching database introspection
  • Chooser — Chooser table introspection
  • StructUtils — runtime struct property reflection
  • Niagara — VFX introspection + validation message capture
  • EditorScriptingUtilities — asset registry and editor scripting helpers

Verifying a Clean Build

bash
cd "/c/Program Files/Epic Games/UE_5.7/Engine/Build/BatchFiles"
./RunUAT.bat BuildPlugin \
  -plugin="D:/path/to/LLMEasyShell.uplugin" \
  -package="D:/Temp/LLMEasyShell" \
  -platform=Win64 \
  -configuration=Development \
  -rocket

The -rocket flag enables Epic's IWYU + ABI-strict build configuration, matching the Fab submission environment. Confirm zero errors and zero consequential warnings (deprecation warnings such as C4996 are treated as errors by marketplace scanners).

UE Version Compatibility

  • Minimum: UE 5.7 (EngineVersion: "5.7.0" in .uplugin)
  • Tested: UE 5.7.4

Command Reference (35+ commands)

Scene

CommandDescription
ls /Level/ActorsList Actors in current level
cat /Actor/{name}View Actor / component / asset details
spawn /Game/.../BP_ActorSpawn actor (class path)
rm /Actor/{name}Delete actor
mv /Actor/{name} 100,200,50Move (Location only)
cp /Actor/{src} /Actor/{dst}Clone actor

Property / Function

CommandDescription
set /Actor/{name}.Property=ValueSet any reflected property
call /Actor/{name}.Function arg1Call any UFUNCTION
addcomp /Actor/{name} TypeNameAdd component
discover /Actor/{name} --funcsList available functions
discover /Actor/{name} --propsList properties

Assets

CommandDescription
ls /Assets/Browse asset registry
cat /Assets/.../Asset.AssetView asset properties
new /Assets/.../Asset.Asset ClassCreate new asset
cp /Assets/A.A /Assets/B.BDuplicate asset
mv /Assets/A.A /Assets/B.BRename / move asset
rm /Assets/.../Asset.AssetDelete asset
save /Assets/.../Asset.AssetSave modified asset
mkdir /Assets/FolderCreate asset folder

Search / Info

CommandDescription
find Actor {pattern}Search Actors by name
find Asset {pattern}Search assets by name
find /Game {pattern}Search assets by path
infoProject + editor + PIE state
gamestatePIE game state (wave / health / gold / ...)
helpList all commands

Editor Control

CommandDescription
playStart PIE
stopStop PIE
pausePause / resume PIE
select /Actor/{name}Select Actor in viewport
focus /Actor/{name}Focus camera on Actor
undo / redoEditor undo / redo
saveSave the level

Live Coding / Restart

CommandDescription
livecoding / lc / reloadTrigger Live Coding compile
log --compileLast Live Coding compile log
log --restartRestart editor with crash detection

Logs

CommandDescription
log --errorsEditor error log
msglog --niagaraNiagara validation messages
livelogTail current editor log

UI Introspection

CommandDescription
uitreeDump current UMG widget tree
uifind {pattern}Find UMG widget by name
uiinfo /Widget/{name}Inspect widget properties
uipress /Widget/{name}Simulate click on a button
uitype /Widget/{name} "text"Simulate text input
uishotSlate composite screenshot

Python Abilities

CommandDescription
python {name} {args...}Invoke any PyAbility
python reloadRescan abilities/ and clear Python module cache

Python Abilities (25+ built-in)

LLMEasyShell ships with a reference set of Python abilities in PyAbilities/LLMShellAbilities/abilities/. Each ability is a standalone .py module that registers one or more python <name> subcommands.

Drop your own .py into the abilities/ folder, restart the editor (or run python reload), and the ability becomes invocable as python <name>.

CategoryAbilities
Asset / blueprintasset, blueprint, bpcomp, bpprop, reparent
Property / reflectionproperty, reactive
Gameplaygameplay, gameplayability, gameplaytag
Animationanim
Curves / tablescurve, datatable, chooser
Levels / scenelevel, scene, editor
Material / VFXmaterial, vfx, umg
Pose / motionposesearch
Navigationnavigation
Performanceperf
HD3D demo sethd3d, hd3dpostprocess, hd3dscene

Authoring a New Python Ability

python
# PyAbilities/LLMShellAbilities/abilities/my_ability.py
from ._base import PyAbilityBase

class MyAbility(PyAbilityBase):
    name = "my_ability"
    description = "Does something useful"

    def invoke(self, args):
        # your logic here
        return {"ok": True, "result": "..."}

# Auto-register on import
ABILITY = MyAbility()

TCP Protocol

The TCP server speaks a minimal text protocol.

Request

Plain ASCII command terminated by \n:

info
ls /Level/Actors
set /Actor/MyActor.Location=100,200,50
python bpprop set BP_Hero.AttackRange=1200

Response

Each command returns a single-line JSON object terminated by \n:

KeyTypeMeaning
okboolSuccess / failure
resultanyCommand-specific payload
errorstringHuman-readable error message (only if ok=false)
tracestringOptional command trace id for debugging
json
{"ok": true, "result": {"actor_count": 12, "level": "Lvl_Main"}}
json
{"ok": false, "error": "Actor /Actor/MyActor not found"}

Port Allocation

The listener binds to the first free port in 15151–15200. The chosen port is logged at editor startup and recorded in Saved/LLMEasyShell/port.txt.


How to Use

  1. Install the plugin to your project's Plugins/ folder.
  2. Enable the 9 engine plugins listed under Required Host Plugins in your project's Plugins browser.
  3. Restart the editor. LLMEasyShell starts a TCP listener on the first free port in 15151–15200.
  4. Connect to the listener from any TCP client to issue commands:
    # Plain TCP — send "info\n" -> receive JSON
    # Or wire it up to an LLM agent that POSTs commands and parses JSON results
  5. To author new C++ commands, derive from ULLMEasyShellAbilityCommandObject and register via the ability registry (auto-discovered at startup).
  6. To author new Python commands, drop a .py into PyAbilities/LLMShellAbilities/abilities/ and run python reload.

Comparison: Easy Shell vs Lite

LLMEasyShell ships in two independent variants. They listen on disjoint TCP port ranges and do not conflict at runtime. Install either or both.

LLMEasyShell (this plugin)LLMEasyShell Lite
PurposeFull read + write + automationRead-only exploration
Commands35+ (read + write + control)9 (query only)
Python abilities25+ built-in abilitiesFramework + 1 demo
ScreenshotsYes (PIE + Win32 paths)No
Live CodingYesNo
TCP port15151–1520015201–15250
Engine plugin deps92
CLI binaryllm-shell.exellmshelllite.exe

FAQ

Q: Can I use LLMEasyShell on Mac or Linux? Yes — the editor module compiles on Win64, Mac, and Linux. The Live Coding subcommand is Windows-only (UE constraint).

Q: How is this different from LLMEasyShell Lite? Lite is a 9-command, read-only subset on ports 15201–15250 with only 2 engine plugin dependencies. Use Lite for safe exploration; use the full plugin for write automation.

Q: Can I register my own commands? Yes. C++ commands: derive from ULLMEasyShellAbilityCommandObject. Python commands: drop a .py into PyAbilities/LLMShellAbilities/abilities/.

Q: Is this safe to leave running in production? No — this is an editor automation tool. The TCP server exposes full editor write capability. Disable it in shipping builds; never expose it to untrusted networks.


LLMEasyShell v1.0.0 | YominUnreal

Powered by VitePress