ue-bridge
Talk to a running UE4SS game: inspect objects, call functions, run Lua, while it plays. Two parts, released separately:
| Part | What | Where it goes |
|---|---|---|
| UEBridge (Lua mod) | Polls ue4ss\bridge\request.json, runs the request on the game thread, writes response.json. Game-agnostic. |
The game: ue4ss\Mods\UEBridge\ (Nexus / GitHub release zip) |
| ue-bridge (Python) | An MCP server and CLI that write those files and read the answers. Finds the running game by itself. | Your machine: uvx ue-bridge or pip install ue-bridge |
AI agent / script -> ue-bridge (MCP stdio or HTTP, or CLI) -> request.json
UEBridge mod: ExecuteInGameThread
ue-bridge <- response.json <-
No sockets in the game, no admin rights, no changes to the game binary. The mod opens no network connection and starts no process. Only software already running on the same machine with write access to the game folder can talk to it.
Install the mod
Extract the release zip into the game's install folder. It carries the path, so the files land in
<game>\<Project>\Binaries\Win64\ue4ss\Mods\UEBridge. enabled.txt in that folder starts the
mod; no mods.txt edit. UE4SS.log shows [UEBridge] v1.0.0 ready when it loaded.
scripts\settings.lua in the mod folder:
| Key | Default | Effect |
|---|---|---|
enabled |
true |
false stops polling entirely |
poll_ms |
250 |
request file check interval |
allow_eval |
true |
false refuses raw Lua (eval_lua); structured tools still work |
allow_writes |
true |
false is read-only: set_property, call_function, console_command and eval_lua are refused |
bridge_dir |
unset | absolute path override for the request/response folder |
Install the server and point an agent at it
Any MCP client works. The server finds the running game (an exe in a Binaries\Win64 folder with
ue4ss\ beside it), so no path needs configuring; pass --game-dir or set UE_BRIDGE_GAME_DIR to
pin one.
stdio (Claude Code, Claude Desktop, Cursor, Windsurf, Codex, Continue, ...):
{ "mcpServers": { "ue-bridge": { "command": "uvx", "args": ["ue-bridge"] } } }
claude mcp add ue-bridge -- uvx ue-bridge
HTTP (one long-running server, several clients): ue-bridge --http serves streamable-HTTP MCP
on http://127.0.0.1:8930/mcp, loopback only.
claude mcp add --transport http ue-bridge http://127.0.0.1:8930/mcp
Shell, for scripts and for testing the channel:
ue-bridge status
ue-bridge hello
ue-bridge eval "return UEB.world()"
ue-bridge props first:PlayerController
ue-bridge types ^Narrative
Tools
| Tool | Does |
|---|---|
bridge_status |
Game found, running, mod answering, mod version and permissions, round-trip time. Call first. |
eval_lua(code, timeout) |
Any Lua chunk on the game thread. Whole UE4SS API plus the UEB helpers in scope; print output captured. |
world_info |
World, player controller, pawn, game instance, game mode. |
find_object(path) / find_objects(class, limit) |
Resolve one reference / list live instances of a class. |
list_types(pattern, limit) |
Loaded reflected types matching a Lua pattern. |
inspect_object(ref, include_super, pattern) |
Every reflected property with its value. |
list_functions(ref) |
Every UFunction on the class chain. |
get_property / set_property |
One property. set returns {previous, current}. |
call_function(ref, fn, args) |
Call a UFunction with positional args. |
console_command(cmd) |
Run a console command. |
batch(calls) |
Several of the above in one round trip. |
dump(kind) |
UE4SS dumpers: usmap, jmap, uht, cxx, actors, objects, static_meshes. |
Every tool except eval_lua goes through the structured batch op, so they keep working when a
user turns allow_eval off.
Object references: /Script/Pkg.Object (any full path), first:ShortClassName (first live
instance), cdo:/Script/Pkg.Class (class default object).
Serialisation: UObjects become {"__object": fullname, "address": n}, FName/FString/FText
become strings, TArray becomes a list (first 200), structs are walked through their reflected
type including inherited fields. SoftObjectProperty values are skipped by default (reading one
has hard-crashed a game inside UE4SS's own property reader).
Wire protocol (1)
request : {"id": str, "op": "hello"|"ping"|"eval"|"batch", "code": str, "calls": [ {op, ...} ]}
response: {"id", "ok": bool, "result", "output": [str], "error": str|null, "ms": int, "protocol": 1}
hello returns the mod's version, protocol and permissions; the server refuses to proceed on a
protocol mismatch. Anything that can write a JSON file can be a client.
Failure modes
- Request never picked up: no game running, or the mod is not installed or is disabled.
Check for
[UEBridge] ... readyinUE4SS.log. - Picked up, no response: the game thread is blocked (loading screen) or the request is long.
dumpuses a 600 s timeout for that reason. If the process is gone, the error names the in-flight operation frombridge\lastop.logand the newest crash report. - One request at a time. A
request.jsonyounger than 10 s is another client's; older is a leftover and is reclaimed.
Developing
uv venv --python 3.11 .venv
uv pip install --python .venv\Scripts\python.exe "mcp>=1.8,<2"
.venv\Scripts\python.exe -m ue_bridge status # from the repo root
python tools/build-release.py # dist/UEBridge-<version>.zip
Edit ue4ss/UEBridge/scripts/main.lua, then ue-bridge eval "return UEB.reload()": the mod
re-runs its source in place and retires the old poll loop, no relaunch.
MIT.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ue_bridge-1.0.0.tar.gz.
File metadata
- Download URL: ue_bridge-1.0.0.tar.gz
- Upload date:
- Size: 21.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b975afeb351366f7564818cd33af36aca859d80e212ce4e389d8c2a68b389a5
|
|
| MD5 |
1042d39d8d7448eb8ed86be9f52ba48f
|
|
| BLAKE2b-256 |
0e00dc31515c36871eee130f8ad61081d69cfcc022e7013286a77d76398ad6aa
|
File details
Details for the file ue_bridge-1.0.0-py3-none-any.whl.
File metadata
- Download URL: ue_bridge-1.0.0-py3-none-any.whl
- Upload date:
- Size: 13.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4d66bab4d2b30af41e187d7ef4a58e4f78053afe12b350b662092a1885a7838
|
|
| MD5 |
84c51b67645b4be487968aa46ea39c77
|
|
| BLAKE2b-256 |
0e9baeee3f5660406fd0c73fd4b0b178942c86749a542ba936f59d5645586723
|