Skip to main content
Glama

ue4ss-bridge

PyPI version PyPI Downloads Python 3.10+ License: MIT

Live engine inspection and an MCP bridge for UE4SS games. Inspect objects, invoke functions, run Lua, and connect AI coding agents (Claude Code, Claude Desktop, Cursor, Codex, any MCP client) to the running game, without restarting it.

Developer tool, not a gameplay mod. The mod changes nothing on its own and adds no gameplay content. It is a communication bridge for mod authors, reverse engineers and developers who want external scripts or AI coding agents to interact with the live engine while it runs.

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\ (GitHub release, Dawnwalker Nexus, Laughless Saint Nexus)

ue4ss-bridge (Python)

An MCP server and CLI that write those files and read the answers. Finds the running game by itself.

Your machine: uvx ue4ss-bridge or pip install ue4ss-bridge

What it does

UEBridge runs queries on the game thread of the running game, with no relaunch per question:

  • AI coding agents (MCP). Connect Claude Code, Claude Desktop, Cursor, Codex or any Model Context Protocol client to the running game.

  • Live object inspection. Find live instances of a UClass, read every reflected property and its current value, list the UFunctions on the class chain.

  • Runtime manipulation. Set properties, call UFunctions with arguments, evaluate raw Lua.

  • Snapshot and diff. Keep a property walk under a label, play, then ask what changed.

  • Event streams. Watch properties on a timer or hook a UFunction, then poll the recorded events.

  • Class hierarchy and aim. List every loaded subclass of a base class; line-trace from the camera to find out what the player is looking at.

  • Engine commands and dumps. Run console commands or trigger the UE4SS dumpers (usmap, jmap, uht, cxx, actors, objects, static_meshes) programmatically.

Related MCP server: Unreal-MCP-Ghost

How it works and the security model

AI agent / script  ->  ue4ss-bridge (MCP stdio or HTTP, or CLI)  ->  request.json
                                                                     UEBridge mod: ExecuteInGameThread
                       ue4ss-bridge  <-  response.json            <-

File-based IPC:

  1. Every 50 ms the in-game Lua loop checks for request.json in ue4ss\bridge\.

  2. When one appears, the request runs on the game thread via ExecuteInGameThread.

  3. The result is written to response.json.

Security and privacy

  • No open network sockets or ports.

  • No background daemon or subprocess execution.

  • No downloads, no telemetry, no changes to the game binary, no admin rights.

  • Only software already running on your PC with write access to the game folder can talk to it.

Compatibility. Game-agnostic: any Unreal Engine title running UE4SS. UEBridge registers no hooks of its own; its Lua runs entirely through engine-thread execution, so it is unaffected by the hook settings of your UE4SS build. hook_function registers a UE4SS hook only for the function you name, and only while you ask for it. Verified on:

  • The Lantern of the Laughless Saint (Steam build, UE 5.8, project The_Holy_Fool)

  • The Blood of Dawnwalker (Steam build, UE 5.5.4)

Renamed from ue-bridge

Why. The old name collided with grapeot/ue-bridge, an Unreal Editor TCP bridge.

What changed. The PyPI package is ue4ss-bridge, the Python module is ue4ss_bridge, and the command is ue4ss-bridge. Environment variables are UE4SS_BRIDGE_GAME_DIR and UE4SS_BRIDGE_DATA_DIR.

What did not. The mod folder is still ue4ss\Mods\UEBridge\, settings.lua keeps its keys and its place, the UEB helper table keeps its name, the log prefix is still [UEBridge], and the request/response file layout is unchanged.

Nothing to update. ue-bridge is still installed as a command alias, so an existing MCP client config keeps launching. The old environment variable names are still read. pip install -U ue-bridge keeps working: that package is now a stub that depends on ue4ss-bridge.

Requirements

  • UE4SS installed for your game.

  • Python 3.10+ (only for the CLI or MCP server; uvx handles it for you).

Install the mod

1. Extract. Extract the release zip into the folder that holds the ue4ss folder and the game executable:

<game>\<Project>\Binaries\Win64\

The archive carries the folder path, so the files land in ue4ss\Mods\UEBridge\ on their own. **No mods.txt edit**: the included enabled.txt turns the mod on.

2. Verify. Launch the game and check ue4ss\UE4SS.log for:

[UEBridge] v1.2.1 ready

3. Uninstall. Delete ue4ss\Mods\UEBridge\ and, if present, ue4ss\bridge\.

Configuration (scripts\settings.lua)

That copy always wins. A settings.lua at the mod root (where 1.0.0 put it) is read only when scripts\ has none, and the mod logs one line naming it as ignored when both exist, so delete the root file after an in-place upgrade. Edit, save, then ue4ss-bridge reload (or the reload_mod tool), or restart the game.

Key

Default

Effect

enabled

true

false disables the bridge without uninstalling; nothing is polled

allow_writes

true

false is strict read-only: set_property, call_function, console_command, hook_function and eval_lua are refused

allow_eval

true

false refuses raw Lua (eval_lua); the structured inspection tools keep working

poll_ms

50

request file check interval in milliseconds (50 is the floor; lower values are clamped)

bridge_dir

unset

absolute path override for the request/response folder

Connect a tool or an AI agent (the MCP server)

The program that writes and reads the IPC files is ue4ss-bridge, a Python package. It finds any running UE4SS game on its own (an exe in a Binaries\Win64 folder with ue4ss\ beside it), so there are no paths to configure. Pass --game-dir or set UE4SS_BRIDGE_GAME_DIR to pin one. The pre-1.2.0 UE_BRIDGE_GAME_DIR and UE_BRIDGE_DATA_DIR are still read as a fallback.

Install

uvx ue4ss-bridge

or with pip:

pip install ue4ss-bridge

Quick check. With the game up and the mod loaded:

uvx ue4ss-bridge status
game: The_Holy_Fool | process: The_Holy_Fool-Win64-Shipping.exe | running: True | bridge dir: C:\...\Binaries\Win64\ue4ss\bridge

uvx ue4ss-bridge hello returns the mod's version, protocol and permissions.

Claude Code

claude mcp add ue4ss-bridge -- uvx ue4ss-bridge

Claude Desktop

Add this to claude_desktop_config.json (%APPDATA%\Claude\ on Windows, ~/Library/Application Support/Claude/ on macOS):

{
  "mcpServers": {
    "ue4ss-bridge": {
      "command": "uvx",
      "args": ["ue4ss-bridge"]
    }
  }
}

Cursor and other MCP clients

Pass uvx ue4ss-bridge (or, with pip, ue4ss-bridge / python -m ue4ss_bridge) as the MCP server command. Cursor reads .cursor/mcp.json in the project root, or Cursor Settings > Features > MCP; Windsurf, Continue, VS Code and Codex each take the same JSON block in their MCP settings file.

HTTP (one long-running server, several clients)

ue4ss-bridge --http serves streamable-HTTP MCP on http://127.0.0.1:8930/mcp, loopback only (--port changes the port):

claude mcp add --transport http ue4ss-bridge http://127.0.0.1:8930/mcp

Shell, for scripts and for testing the channel

ue4ss-bridge status
ue4ss-bridge hello
ue4ss-bridge eval "return UEB.world()"
ue4ss-bridge props first:PlayerController
ue4ss-bridge types ^Narrative
ue4ss-bridge subclasses /Script/Engine.Pawn
ue4ss-bridge target 5000                    # what the camera is pointed at
ue4ss-bridge snapshot first:PlayerController before --super   # --super: include inherited properties (props too)
ue4ss-bridge diff before                    # or: diff <ref> <label> for another object
ue4ss-bridge watch first:PlayerController Pawn pawnwatch --interval 500
ue4ss-bridge hook /Script/Engine.PlayerController:ClientRestart restarts
ue4ss-bridge events                         # or: events <label>
ue4ss-bridge streams
ue4ss-bridge unwatch pawnwatch              # or: unwatch "*"

Example prompts

Once an agent is connected, ask it about the running game in plain language:

  • "Inspect the player pawn and list every health, stamina and combat property."

  • "Which enemy characters are spawned in the world right now?"

  • "What UFunctions on the player controller relate to movement, interaction or camera?"

  • "Snapshot the player controller, then tell me what changed after I open the map."

  • "Watch the player pawn's health, then tell me every time it dropped while I fought."

  • "What am I looking at right now, and which materials are on it?"

  • "List every Blueprint class derived from the enemy base class."

  • "Set the player's walk speed to 1200."

  • "Trigger a USMAP dump so I can open the cooked assets in FModel."

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.

snapshot_object(ref, label, include_super, pattern)

Keep an inspect_object walk in the game under a label. Read-only.

diff_object(label, ref, update)

Re-walk and report {changed, added, removed, same} against that snapshot, by dotted property path. ref defaults to the snapshot's own reference. At most 500 rows per list; truncated counts the rows dropped per list. Read-only.

list_snapshots()

Labels held, with object path, wall-clock taken timestamp (whole seconds since the epoch) and property count. Read-only.

forget_snapshot(label)

Drop one snapshot, or all with "*". Read-only.

list_subclasses(ref, limit, pattern)

Every loaded class derived from a base class, Blueprint classes included: {base, count, types} with {name, kind, path, parent} rows sorted by path. Read-only; about 1.5 s.

targeted_actor(distance, channel, ref)

Line trace from the camera (or from ref's own location and forward vector): the actor, component, impact point and normal, bone, physical material and materials hit. Read-only.

watch_property(ref, names, label, interval_ms, every)

Sample properties on a timer and record every change under a label. interval_ms defaults to 250 with a 100 ms floor. Read-only.

hook_function(function, label, max_args)

Record every call of a UFunction with its parameters. Counts as a write.

poll_events(since, label, limit, clear)

Drain what the watches and hooks recorded: {events, next, dropped, buffered}. Read-only.

list_streams() / stop_stream(label)

Watches and hooks running / stop one, or all with "*".

reload_mod()

Re-read settings.lua and re-run the mod in place, no game restart. Read-only, so it is the way back after allow_eval was turned off.

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). first: returns whichever instance UE4SS finds first, which can be a template, a cutscene copy or a pooled actor rather than the live one; for the player pawn or controller prefer the exact path reported by world_info.

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 and SoftClassProperty values are skipped by default (reading one has hard-crashed a game inside UE4SS's own property reader).

Snapshots live in the game process, keyed by label rather than by object address. They survive UEB.reload() and are lost when the game exits. A diff ignores object and struct addresses and uses the same depth and array caps as the original walk, so an unchanged object diffs empty.

Streams (watches and hooks) also live in the game process and survive UEB.reload(). They share one buffer of 2000 events with a rising sequence number; poll_events reports dropped when the cap evicted rows before you read them. Labels are unique. A watch holds its object between passes and rechecks it with IsValid() each pass, looking it up again only when it is gone or a read failed, so it follows first:PlayerController across respawns; its interval defaults to 250 ms and is floored at 100 ms, because a lookup costs 10 to 25 ms of game-thread time on a game without object hash tables. It records resumed when it adopts a different object (by address and full name) after the previous one stopped being valid or was lost, resetting the baseline so the first sample on the new object is not a change; the same object back after a blip records nothing. When the reference goes away it records one lost event and retries about once a second. A hook's callback copies parameters and nothing else: calling a hooked function from eval_lua in the same session has crashed the game, so read hook output through poll_events.

Wire protocol (3)

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": 3}

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] ... ready in UE4SS.log.

  • Picked up, no response: the game thread is blocked (loading screen) or the request is long. dump uses a 600 s timeout for that reason. If the process is gone, the error names the in-flight operation from bridge\lastop.log and the newest crash report.

  • One request at a time. A request.json younger than 10 s is another client's; older is a leftover and is reclaimed.

Developing

git clone https://github.com/littleRabbit94/ue4ss-bridge.git
cd ue4ss-bridge
uv venv --python 3.11 .venv
uv pip install --python .venv\Scripts\python.exe -e .   # the package and its one dependency (mcp)
.venv\Scripts\python.exe -m ue4ss_bridge status       # from the repo root
python tools/build-release.py                         # dist/ue4ss-bridge-<version>.zip

The mod half is ue4ss/UEBridge/; copy or link it into the game's ue4ss\Mods\ to run the checkout rather than a release zip.

Edit ue4ss/UEBridge/scripts/main.lua, then ue4ss-bridge reload: the mod re-runs its source in place and retires the old poll loop, no relaunch.

Credits and license

Available Tools

26 tools
batchA

Run several bridge operations in ONE round trip and return a result per call.

A round trip costs a poll interval plus latency against single-digit ms of actual work, so a sequence of small calls is nearly all waiting. Each entry is a dict with an "op" key:

{"op": "world"} {"op": "reload"} {"op": "find", "ref": ...} {"op": "get", "ref": ..., "name": ...} {"op": "set", "ref": ..., "name": ..., "value": ...} {"op": "call", "ref": ..., "function": ..., "args": [...]} {"op": "props", "ref": ..., "include_super": bool, "read_soft": bool, "pattern": str} {"op": "funcs", "ref": ...} {"op": "snapshot", "ref": ..., "label": str, "include_super": bool, "pattern": str} {"op": "diff", "label": str, "ref": ... (optional), "update": bool} {"op": "snapshots"} {"op": "forget", "label": str} {"op": "objects", "class_name": ..., "limit": int} {"op": "types", "pattern": ..., "limit": int} {"op": "subclasses", "ref": , "limit": int, "pattern": str} {"op": "target", "distance": num, "channel": int, "ref": ... (optional)} {"op": "watch", "ref": ..., "names": [str], "label": str, "interval_ms": int, "every": bool} {"op": "hook", "function": , "label": str, "max_args": int} {"op": "events", "since": int, "label": str, "limit": int, "clear": bool} {"op": "streams"} {"op": "unwatch", "label": str} {"op": "console", "command": ...} {"op": "dump", "kind": ...}

Each result is {op, ok, result} or {op, ok: false, error}. One failing call does not abandon the rest, so a batch is safe to use for exploration.

ParametersJSON Schema
NameRequiredDescriptionDefault
callsYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since there are no annotations, the description carries the disclosure burden. It documents per-call result shape ({op, ok, result} or error), states that one failing call does not abandon the rest, and notes round-trip cost. It also labels the batch as safe for exploration. It doesn't outline side effects of specific mutating ops, but the failure semantics are sufficient for a wrapper tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is front-loaded with purpose and rationale, followed by an efficient code-block list of op shapes. The length is justified by the 23 op variants; every line communicates a distinct contract, and the closing result format is compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description covers the two things an agent must know to invoke the batch correctly: how to encode each call and what to expect back. The omission of detailed field semantics (ref, update, kind) is a minor gap and keeps it just shy of fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only 'calls: array of objects' with 0% description coverage, so the description must compensate. It does substantially: every supported op key and its parameter skeleton is enumerated. It leaves 'ref' and several op-specific fields (include_super, read_soft, update, kind) semantically undefined, which prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb ('Run'), resource ('bridge operations'), and a distinguishing constraint ('in ONE round trip'), and 'return a result per call' clarifies what the batch produces. This clearly separates it from the individual sibling tools such as get_property or call_function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the cost model — a round trip costs a poll interval plus latency versus single-digit ms of work — and therefore identifies when batching small calls is valuable. It doesn't explicitly say 'use instead of N individual calls' or name the alternative, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bridge_statusB

Whether a UE4SS game is running and the UEBridge mod is answering. Reports the game found, mod version, permissions, round-trip time.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reports the output fields but does not disclose whether the tool has side effects. Since no annotations are provided, the description carries the burden of indicating that this is a read-only status check, which it fails to do explicitly. It also does not clarify if any permissions are required beyond reporting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, with the primary purpose front-loaded in the first sentence. It is concise, with no fluff or redundant details, and each word contributes to understanding the tool's function and output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context for a status-check tool: it names the outputs (game found, mod version, permissions, round-trip time) and the overall purpose. Since there is no output schema, specifying the return fields is sufficient. It lacks a note on typical use cases, but for a simple status tool, this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and the schema coverage is 100% (vacuously). The description does not add any parameter-specific meaning, which is acceptable given there are none. Per the baseline rule for high schema coverage, a score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: checking whether a UE4SS game is running and the UEBridge mod is answering. It also enumerates the reported fields, making the tool's function unambiguous. However, it could be slightly more direct by starting with 'Checks' or 'Reports status', but it is still clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given on when to use this tool versus alternatives like inspect_object or world_info. The description does not mention conditions or scenarios, leaving the agent to infer that this is a preliminary health check. This is a notable gap given the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

call_functionA

Call a UFunction on an object with positional JSON args and return its result. Refused when allow_writes = false.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
argsNo
functionYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The refusal condition ('Refused when allow_writes = false') reveals that the tool may perform write operations, which is useful behavioral info. However, it does not elaborate on side effects, error behavior, or whether it is read-only in other cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, two sentences, with no redundant information. It directly states the purpose and a key constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers core action and a refusal condition, but lacks details on expected output format, error handling, or prerequisites for calling functions. It is adequate for a simple call but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The phrase 'positional JSON args' clarifies the 'args' parameter, but 'ref' and 'function' are not explicitly explained. Since the schema has no descriptions, the description only partially compensates for parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: calling a UFunction on an object with positional JSON arguments and returning the result. It distinguishes itself from sibling tools like get_property or set_property by focusing on function invocation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions a refusal condition based on allow_writes, but does not explicitly guide when to use this tool over alternatives such as eval_lua or list_functions. The condition gives some context but lacks direct comparative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

console_commandA

Execute a console command in the running world. Output is not captured. Refused when allow_writes = false.

ParametersJSON Schema
NameRequiredDescriptionDefault
commandYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of disclosing side effects. It transparently states that 'Output is not captured' and that the tool is refused under a specific condition, which are important behavioral traits. It does not mention other potential side effects (e.g., persistence or state changes), but the disclosed information is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loading the core action and immediately providing critical caveats (output not captured, refusal condition). No unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple nature and the absence of an output schema, the description covers the essential information: what it does, the key limitation (output not captured), and a condition that affects invocation. It could arguably mention that the command may have arbitrary side effects, but that is implied by 'console command' in a world context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully describes the single parameter 'command' as a string, so the description adds no extra semantic depth. The parameter is self-explanatory given the tool's purpose, and the baseline of 3 is appropriate since schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Execute a console command') and the resource ('in the running world'), making the purpose understandable. It does not explicitly differentiate from sibling tools like eval_lua or call_function, but 'console command' is distinct enough in most contexts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a condition for refusal ('Refused when allow_writes = false'), which gives some guidance on when the tool might be blocked. However, it does not explicitly state when to use this tool over alternatives or mention any prerequisites, so the guidance is only partial.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_objectA

Re-walk an object and report what changed since the snapshot stored under label. Read-only.

ref defaults to the reference the snapshot was taken with; pass one to compare a different object against the stored walk.

Returns {label, path, changed, added, removed, same}, where same is the number of top-level properties with no changed, added or removed rows, and each changed row is {path, before, after} with a dotted path into the property ("Mesh.RelativeLocation.X", "Inventory[3].Count"). Object-valued properties compare by their path, not their address, so an unchanged object diffs empty. If the reference now resolves to a different object the old path comes back as stored_path and the diff still runs.

Each of the three lists holds at most 500 rows; truncated counts the rows dropped per list when exceeded.

update=True replaces the snapshot with this walk after diffing, for a rolling diff. An unknown label raises and names the ones that exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNo
labelYes
updateNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses read-only behavior, the exact return shape, truncation limits, the meaning of `stored_path` when the reference resolves to a different object, and the error behavior for unknown labels.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds essential information: purpose, parameter behavior, return format, edge cases, truncation, and error handling. It is front-loaded with the core purpose, then proceeds logically into details without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, so the description is the only source of runtime semantics. It fully covers invocation, return values, limits, mutation behavior, and failure modes. An agent has enough information to call diff_object correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain every parameter, and it does. It explains `label` as the snapshot identifier, `ref` as overriding the snapshot's reference, and `update` as replacing the snapshot after diffing. This goes well beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Re-walk an object and report what changed since the snapshot stored under label.' This clearly differentiates diff_object from siblings like snapshot_object or inspect_object by focusing on comparison against a stored snapshot. It also explicitly marks itself read-only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use the tool: when you need to compare an object's current walk against a snapshot, optionally with a rolling diff via update=True. It does not explicitly name sibling alternatives or state when not to use it, but the described use case is sufficiently specific.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dumpA

Trigger a UE4SS dumper: usmap, jmap, uht, cxx, actors, objects, static_meshes. Output lands in the ue4ss directory; jmap and uht take minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses output location and runtime expectations for certain kinds, but does not mention side effects such as file overwriting, required game state, or potential errors. With no annotations, the description bears full responsibility and could be more transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and to the point, with no fluff. The list of kinds is compact, and additional notes about output location and timing are useful without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description covers the essential aspects: what it does, the parameter's meaning, output location, and timing caveats. It could mention return values or error conditions, but overall it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'kind' is not described in the schema, but the description lists possible values in the text (usmap, jmap, etc.), providing partial semantic coverage. It does not exhaustively enumerate all valid options or explain the effect of each kind.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Trigger a UE4SS dumper') and lists the specific dump kinds (usmap, jmap, uht, cxx, actors, objects, static_meshes). It is unambiguous and distinct from sibling tools like inspect_object or eval_lua.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides some usage context (output lands in the ue4ss directory, jmap and uht take minutes) but does not explicitly say when to prefer this tool over alternatives or when not to use it. The guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eval_luaA

Run a Lua chunk inside the game on the game thread and return what it returns.

The full UE4SS Lua API is available (StaticFindObject, FindFirstOf, FindAllOf, RegisterHook, ForEachUObject, ...) plus the UEB helper table: UEB.resolve(ref), UEB.props(ref), UEB.funcs(ref), UEB.get(ref, name), UEB.set(ref, name, value), UEB.call(ref, fn, args), UEB.objects(class, limit), UEB.types(pattern, limit), UEB.console(cmd), UEB.world(), UEB.dump(kind), UEB.snapshot(ref, label), UEB.diff(ref, label), UEB.snapshots(), UEB.forget(label), UEB.subclasses(ref, limit, pattern), UEB.target(distance, channel, ref), UEB.watch(ref, names, label, interval_ms, every), UEB.hook(fnpath, label, max_args), UEB.events(since, label, limit, clear), UEB.streams(), UEB.unwatch(label). UEHelpers is in scope too. print() output is captured and returned alongside the result. Refused when the mod's settings.lua sets allow_eval = false; the other tools keep working.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
timeoutNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that execution happens on the game thread, captures print() output, and is refused when allow_eval=false. It does not cover error handling or side effects, but the refusal condition is a valuable behavioral note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long due to the detailed API listing, which is useful for an eval tool but could be trimmed. The main purpose is front-loaded, and the structure is clear, though the API enumeration may be oververbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains the return value (Lua result and print output) and the available Lua environment. It lacks error-handling details but is otherwise sufficiently complete for an agent to understand the tool's capabilities and constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters. It implicitly covers 'code' but does not describe the timeout parameter or its purpose. The extensive API list adds context but not parameter-specific semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Run a Lua chunk inside the game on the game thread and return what it returns.' This is a specific verb and resource, and it distinguishes from sibling tools like call_function or console_command by emphasizing arbitrary Lua execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the general-purpose Lua execution tool but does not explicitly state when to prefer it over alternatives. It mentions the refusal condition (allow_eval=false) and that other tools keep working, but lacks direct comparison to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_objectB

Resolve an object reference and return its full name, class and address.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions the primary behavior (resolving and returning information) but does not disclose any side effects, error cases, permissions required, or other behavioral traits. Since no annotations are provided, the description carries full responsibility but only partially covers transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no redundant words. It is well-structured and easy to read, containing exactly the essential information without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of parameter descriptions and output schema, the description is incomplete. It does not explain what constitutes an object reference, what format the path should take, or what the returned name, class, and address look like, leaving significant gaps for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'path' has no description and the schema coverage is 0%. The word 'path' is generic and ambiguous; the description does not explain what kind of path or object reference it expects, leaving the parameter's meaning entirely unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resolves an object reference and returns its full name, class, and address, which is a specific and unambiguous purpose that distinguishes it from sibling tools like 'list_functions' or 'get_property'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any conditions or prerequisites for using it. It simply states what it does without context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_objectsD

Live (non-default) instances of a short class name, e.g. 'PlayerController'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
class_nameYes

TDQS

D1.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations describing side effects, read-only status, or potential impacts. The description does not indicate whether the tool queries, modifies, or creates anything, so the agent cannot anticipate behavioral outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and to the point, but its brevity sacrifices clarity. It is a single sentence without wasted words, yet it omits essential details and does not follow a clear 'verb + object' structure, making it less effective despite being concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is incomplete for the given context. It does not mention the output format, return value, or any interaction with the system. Given the sibling tools, it is likely a query but lacks any information about what the caller receives or how to interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description indirectly references 'class_name' by mentioning a 'short class name' but provides no detail about the 'limit' parameter. With zero schema descriptions for parameters, the agent has insufficient information about the meaning, constraints, or default behaviors of the inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a fragment, not a clear verb phrase. It mentions 'instances of a short class name' which implies finding objects, but it does not explicitly state the tool's function. The tool name 'find_objects' provides some clarity, but the description alone is ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus siblings like 'find_object' or 'list_types'. The description does not mention any conditions, prerequisites, or alternatives, leaving the agent to guess the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forget_snapshotB

Drop one stored snapshot, or all of them with label="*". Read-only; frees memory in the game process.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral burden. It does disclose a side effect, 'frees memory in the game process,' but it also states 'Read-only,' which is misleading since dropping snapshots is destructive. It does not mention irreversibility, whether references to snapshots become invalid, or any other consequence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the main action, but the 'Read-only' phrase is contradictory and muddles the message. Not every clause earns its place because the misleading label detracts from the otherwise efficient sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema and no annotations, the description covers the main action and a meaningful side effect. Still, it leaves uncertainty about the return value, whether the operation is reversible, and what 'Read-only' actually means in this destructive context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter, label, has no schema description coverage, so the description compensates by explaining that it selects one stored snapshot or all snapshots via label='*'. It adds the crucial wildcard behavior beyond the bare parameter name, though it does not specify matching rules or where labels come from.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'Drop', and names its resource, 'stored snapshot', making the core action clear. It also distinguishes itself from snapshot-related siblings by implying deletion rather than creation or listing, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when memory used by stored snapshots should be freed. However, it gives no explicit guidance about when not to use it, how it compares to list_snapshots or snapshot_object, or any prerequisite such as listing snapshots first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_propertyA

Read one property of an object. An unknown property name raises rather than returning junk.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
nameYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It explicitly notes that 'an unknown property name raises rather than returning junk,' which is a key behavioral detail. However, it does not mention whether the operation is purely read-only, though the verb 'read' implies that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. Every word adds meaning, and the key behavioral note is included without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-property read, the description covers the essential behavior (raising on unknown names). It lacks explicit details about return types or error conditions beyond the note, but given the simplicity of the operation, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides no descriptions for 'ref' or 'name', and the description does not explain them. While 'ref' as an object reference and 'name' as a property name are inferable, the lack of explicit definition leaves ambiguity—especially for 'ref,' which could refer to different kinds of references.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Read one property of an object.' It distinguishes from siblings like set_property (mutation) and inspect_object (likely whole-object inspection) by focusing on a single read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool—when you need one property of an object—but it does not explicitly contrast with alternatives like inspect_object or mention when a different tool would be preferred. The guidance is minimal but sufficient for the simple case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hook_functionA

Record every call of a UFunction, with its parameters. Counts as a write.

function is a UFunction path ('/Script/Engine.PlayerController:ClientRestart'). max_args caps how many parameters are copied per call (default 8). Read the calls with poll_events.

The callback copies parameters and the calling object's name and does nothing else. A native hook registers cleanly, but an eval that then CALLS the hooked function crashed the game with an access violation, so read hook output through poll_events and do not call a hooked function from eval_lua in the same session.

Hooking intercepts game code, so it is refused when allow_writes = false. Stop a hook with stop_stream, which unregisters it.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYes
functionYes
max_argsNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the callback copies parameters and the calling object's name and does nothing else, that calling a hooked function from eval_lua can crash the game with an access violation, and that it counts as a write requiring allow_writes. This is unusually candid and actionable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is substantial, every sentence earns its place: purpose, write semantics, parameter explanation, output retrieval, crash warning, permission gating, and stop mechanism. Safety-critical details are front-loaded and clearly separated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-risk hooking tool with no annotations and no output schema, the description covers invocation, parameter meaning, output retrieval via poll_events, unregistration via stop_stream, write-permission constraints, and a crash hazard. The only minor omission is the `label` parameter, but the tool is still safe and callable with this description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate. It explains `function` as a UFunction path with a concrete example and `max_args` as a per-call parameter cap with default 8. However, the required `label` parameter is never described, leaving a gap for a required input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete action ('Record every call of a UFunction, with its parameters'), names the resource (a UFunction path), and explicitly notes that it counts as a write. This distinguishes it clearly from read-style siblings like poll_events and from call_function or eval_lua.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to read hook output via poll_events, to stop a hook with stop_stream, and to avoid calling a hooked function from eval_lua in the same session. It also states that hooking is refused when allow_writes=false, giving concrete selection and safety guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_objectB

Every reflected property of an object with its current value. Use on CDOs and live actors.

pattern is an optional Lua pattern matched against the property name, e.g. "^Camera" or "Speed"; one pawn can be 300 properties, so filtering is usually what you want.

include_super defaults to False. SoftObjectProperty values are skipped (reading one has crashed a game inside UE4SS's own property reader, which no Lua pcall can catch).

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
patternNo
include_superNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description mentions that SoftObjectProperty values are skipped, which is a notable limitation. However, it does not explicitly state that the operation is read-only or side-effect-free, though this is implied by the inspection nature. No annotations are provided to contradict or supplement this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear opening sentence and separate parameter notes. It avoids unnecessary fluff, though it could be slightly more explicit about return format or usage comparisons without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must indicate what the tool returns. It states 'Every reflected property of an object with its current value', which implies a map or listing, but does not specify the exact structure (e.g., dictionary vs list). It also covers the skipping behavior, but lacks details on error handling or edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains pattern (optional Lua pattern) and include_super (defaults to False), providing examples. It does not explicitly explain ref, though it is clearly the object reference from context. The schema provides titles and defaults, but the description adds meaning for only two of the three parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it inspects every reflected property of an object with its current value, and it specifies usage on CDOs and actors. This distinguishes it from get_property (single property) and find_object (search for objects), though it does not explicitly mention alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives some guidance on when to use (on CDOs and actors) and how to filter with pattern, but does not explicitly compare to sibling tools like get_property or dump. The context implies a bulk inspection, but the description does not state when to prefer this over get_property or when to avoid it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_functionsC

Every reflected UFunction callable on an object, across its class chain.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility. It states the tool lists functions but does not clarify whether it has side effects, requires special permissions, or how it handles errors. The read-only nature is implied but not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and free of unnecessary words. It delivers the essential information in a single sentence without dilution.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool, the description is adequate for the basic action but lacks important context. It does not explain the 'ref' parameter, what the output format is, or how the results relate to the class hierarchy, leaving gaps for an agent attempting to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'ref' has no description in the schema, and the tool description does not explain what it represents. A user cannot infer whether it is an object reference, a string identifier, or something else, making the parameter effectively undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists callable functions on an object, with scope 'across its class chain'. The verb 'list' and resource 'functions' are specific. The only ambiguity is what 'ref' refers to, but the core purpose is understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives like call_function or inspect_object. The description does not mention any conditions, prerequisites, or comparisons to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_snapshotsA

Snapshots currently held in the game: label, object path, taken (a wall-clock timestamp in whole seconds), property count. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full behavioral burden. It clearly states the operation is read-only and specifies the timestamp format ('wall-clock timestamp in whole seconds') and returned fields. This gives an agent enough behavioral context to understand the tool's output and side-effect profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the resource first, then enumerates the key output fields, and ends with the read-only qualifier. Every clause adds useful information with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only listing tool, the description is fairly complete: it identifies the operation, the output fields, timestamp semantics, and safety profile. It could add explicit context about ordering or what happens when no snapshots exist, but those are minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts zero parameters, so there is no parameter semantic burden. The baseline of 4 applies, and the description's mention of returned fields further clarifies what the no-argument call will produce.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (snapshots currently held in the game) and enumerates the exact fields returned: label, object path, taken timestamp, and property count. It implicitly differentiates from sibling tools like snapshot_object and forget_snapshot by describing a listing operation, though it never uses an explicit verb like 'list'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as diff_object, snapshot_object, or forget_snapshot. It notes that the tool is read-only, but does not explain scenarios like enumerating snapshots before comparing or deleting them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_streamsA

Watches and hooks currently running: {label, kind, target, interval_ms, events, started, active, lost}. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden and does so well by explicitly stating 'Read-only.' It also reveals that only currently running watches/hooks are shown and lists the fields that will appear. This is sufficient transparency for a simple listing operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose and packs the output fields into a compact list. Every element earns its place, and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with no output schema, the description provides enough information to call and interpret the result: what is listed, which field names to expect, and that it is read-only. Minor ambiguity remains around terminology such as 'streams' versus 'watches and hooks,' but overall the definition is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to compensate for. The field list in the description adds useful context about what the response contains, which is more than baseline for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as currently running watches and hooks and enumerates the fields returned. It is easy to distinguish from sibling tools like watch_property, hook_function, and stop_stream. It stops short of an explicit verb like 'list' or 'enumerate', but the meaning is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'currently running' implies this tool is for inspecting active watches/hooks rather than creating or removing them. However, it does not explicitly reference sibling tools or state when to choose this over alternatives such as poll_events or stop_stream. Usage guidance is therefore only implied, not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_subclassesA

Every loaded class derived from a base class, Blueprint classes included.

ref is a class path ('/Script/Engine.PlayerController'); passing an object that is not a Class or BlueprintGeneratedClass raises. The base itself is excluded. pattern is an optional Lua pattern matched against the short name.

Returns {base, count, types}, where count is the number of matches before limit and each row is {name, kind, path, parent} with parent the immediate super class's short name. Rows are sorted by path. The engine keeps no reverse index, so this walks every UObject and tests IsChildOf: about 1.5 s on a large game.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
limitNo
patternNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and handles it well: it discloses that invalid ref inputs raise, the base class is excluded from results, pattern matching applies to the short name, results are sorted by path, and the underlying scan takes about 1.5 seconds on large games. These details meaningfully shape invocation expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but well organized: purpose first, then parameter notes, then return shape and performance caveat. Every sentence earns its place and avoids repetition, making the content easy to scan and act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, yet the description fully specifies the return structure ({base, count, types}), row shape ({name, kind, path, parent}), sorting, error behavior, and performance cost. An agent has everything necessary to decide whether to call the tool and understand its result without external context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters itself. It defines ref as a class path with a required type, notes that non-Class/BlueprintGeneratedClass inputs raise, explains pattern as an optional Lua pattern on short names, and clarifies limit via 'count is the number of matches before limit'. All three parameters are given meaningful semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately states the tool enumerates every loaded class derived from a base class, including Blueprint classes. This clearly identifies the operation and scope, and implicitly distinguishes it from sibling tools like list_types by focusing on the subclass relationship.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for using the tool: pass a class path, avoid non-Class/BlueprintGeneratedClass objects, and optionally use a Lua pattern. It does not explicitly name when-not-to-use or point to an alternative sibling, but the intended use is evident and no exclusions are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_typesA

Loaded reflected types whose name matches a Lua pattern (empty = all). Walks GUObjectArray (~400 ms).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
patternNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden. It transparently mentions the walk over GUObjectArray and the approximate runtime, giving useful side-effect information. No contradictions are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, with no filler or redundant information. It efficiently communicates the core behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives sufficient context for basic invocation: what it lists, how the pattern works, and a performance caveat. The limit parameter's meaning is not fully elaborated, but the default value mitigates ambiguity. Overall, it is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the 'pattern' parameter as a Lua pattern and clarifies that empty matches all. The 'limit' parameter is not described, though its default of 200 provides some context. Overall, partial parameter coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly indicates a listing operation for loaded reflected types, with a specific name-matching pattern. It distinguishes from siblings like find_object or dump by focusing on type enumeration, though the verb is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides guidance on the empty pattern meaning 'all' and notes the performance cost (~400 ms), implying when to use it. However, it does not explicitly contrast with alternatives like find_object or list_functions, so the usage context is only partially clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

poll_eventsA

Drain events recorded by watches and hooks. Read-only.

since is a sequence number, exclusive: pass back the next from the previous call to get only what is new. label filters to one stream. clear=True drops the returned rows.

Returns {events, next, dropped, buffered}. Each row is {seq, t, label, kind} plus, for a watch, {path, before, after}, and for a hook, {fn, self, args}. The buffer holds 2000 events across all streams; dropped counts what the cap evicted before you read it.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNo
labelNo
limitNo
sinceNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden and handles it well: it declares read-only behavior, explains clear semantics, discloses the 2000-event buffer cap, and defines what dropped counts. It also provides the exact return shape and row fields, which is especially valuable given no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose and safety first, then parameter semantics, then return contract. Every sentence carries essential information, with no filler or repetition of schema titles.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is nearly complete for an event-polling tool: it covers return values, row shapes, buffer behavior, and the incremental polling pattern. The main gap is the undocumented limit parameter, and there is no explicit statement of what happens when the buffer cap is approached beyond the dropped count.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does explain since (exclusive sequence number), label (single-stream filter), and clear (drops returned rows), but it does not explain the limit parameter or its relationship to the 2000-event buffer. This is a meaningful omission.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Drain events recorded by watches and hooks' names a specific verb, a clear resource, and the source of events. This distinguishes it from siblings like watch_property or stop_stream by framing it as the consumption side of the watch/hook lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the polling pattern ('pass back the next from the previous call') and the note that label filters to one stream. However, it never explicitly says when to choose this tool over siblings like list_streams or stop_stream, nor does it state exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reload_modA

Re-read settings.lua and re-run the UEBridge mod in place; no game restart.

Read-only: touches only the mod's own settings, so it works with allow_eval = false and allow_writes = false and is the recovery path after eval was turned off. Returns the settings now in effect (poll_ms, allow_eval, allow_writes) and the new generation number.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does so well: it explicitly states the operation is read-only, touches only the mod's settings, works under restricted flags, and describes the return values including settings and generation number.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core purpose appears in the first sentence, followed by concise details on safety and return values. Every sentence adds meaningful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description is fully sufficient: it states what happens, when to use it, why it is safe, and what the caller can expect in return. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters)Skip; the schema already covers everything. The description adds relevant context about what the operation does and returns, which is useful even though no parameter documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: re-read settings.lua and re-run the UEBridge mod in place, with the explicit outcome of no game restart. This clearly distinguishes it from status or evaluation tools like bridge_status and eval_lua.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear conditions for use: it works when allow_eval and allow_writes are falseais and is the recovery path after eval was turned off. It does not explicitly name alternative tools or when-not-to-use scenarios, but the recovery-path framing gives strong situational guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_propertyA

Write one property of an object (number, bool or string).

Returns {previous, current}. Writes are never undone, so previous is what you restore from if the write turns out to be wrong. An unknown property name raises instead of silently doing nothing. Refused when the mod's settings.lua sets allow_writes = false.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
nameYes
valueYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses side effects (writes are never undone), return values ({previous, current}), error behavior (unknown property raises), and inhibition conditions (allow_writes = false). This is thorough and transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and to the point, covering essential behavioral aspects in a few sentences. It avoids unnecessary fluff and front-loads the core action and return type.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's primary purpose, side effects, error conditions, and return shape. It doesn't need to explain more for a simple property setter. A minor gap is not stating what a 'ref' is, but given sibling tools like inspect_object and find_object, the context is likely familiar. Overall, the tool is well-contextualized.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema lacks any parameter descriptions, and the description provides limited clarification. It implies ref is an object reference, name is a property name, and value is the value (with type restrictions), but these are not explicitly defined. The description does not adequately compensate for the 0% schema coverage, leaving ambiguity for parameter meanings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (write one property), the resource (an object), and the allowed types (number, bool, string). It distinguishes from sibling tools like get_property by explicitly focusing on writing, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it mentions that writes are irreversible, unknown property names raise errors, and refusal occurs when allow_writes is false. While it doesn't explicitly state 'use when you want to modify a property,' this is implied by the verb 'write' and the contrast with get_property. Minor gap in not naming alternative tools explicitly, but adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snapshot_objectA

Walk an object's reflected properties and keep the result in the game under label. Read-only.

The same walk as inspect_object, kept for diff_object. include_super and pattern are stored with the snapshot so the diff re-walks the same set. Reusing a label replaces the snapshot.

Returns {label, path, count, taken}, where taken is a wall-clock timestamp (os.time() in the game, whole seconds since the epoch). Snapshots live in the game process: they survive a UEB.reload() but not a game restart.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
labelYes
patternNo
include_superNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses several important behaviors beyond the schema: snapshots live in the game process, survive UEB.reload() but not a game restart, reusing a label replaces the snapshot, and the return value includes a wall-clock timestamp. Since no annotations are provided, the description carries the full burden and does so well, though it could mention whether the operation is read-only in more explicit terms.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then adds essential behavioral details in a structured way. Every sentence earns its place: the first defines the action, the second explains the relationship to siblings, the third covers storage semantics, and the fourth covers return value and lifecycle.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, the description covers the key facts an agent needs: what it does, how it relates to siblings, what parameters are stored, what the return value contains, and the snapshot lifecycle. It could be slightly more explicit about the exact format of ref, but the overall context is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that include_super and pattern are stored with the snapshot and affect the diff re-walk, adding meaning beyond the schema's bare type definitions. It does not explicitly define ref or label, but their names and the description's context make them reasonably clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool walks an object's reflected properties and stores the result under a label, explicitly distinguishing it from inspect_object and positioning it as the companion to diff_object. The verb 'walk' plus the resource ('object's reflected properties') and the storage behavior make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says this is the same walk as inspect_object but kept for diff_object, and explains that include_super and pattern are stored with the snapshot so the diff re-walks the same set. This gives clear when-to-use guidance and implicitly distinguishes it from inspect_object and diff_object.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_streamA

Stop one watch or hook by label, or all of them with label="*". Unregisters a hook.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the operation unregisters a hook, which is useful behavioral context beyond the verb 'stop.' It does not mention idempotence, error behavior, whether stopping all is irreversible, or what happens to active callbacks, so some behavioral gaps remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler; the primary action and special label behavior are front-loaded, and the second sentence clarifies the underlying side effect. Every clause adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description is nearly complete: it explains target selection, the all-case wildcard, and the unregistering effect. It lacks only minor operational details such as return value or error handling, which are not required for basic correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no description for label (0% coverage), so the description must compensate. It does: label identifies a single watch/hook or the special value '*' to stop all. This covers the key semantics for the only parameter, though it omits details like exact-match requirements or not-found behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Stop') and a concrete resource ('one watch or hook') and adds the special label '*' for stopping all. It is clear and distinct from sibling creation tools such as watch_property and hook_function, though it does not explicitly name an alternative or contrast itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: call this when you want to stop a watch/hook or all of them, and the label parameter is explained. However, it gives no explicit guidance about when not to use it or which sibling tools to prefer (e.g., watch_property/hook_function for creation), leaving the when-to-use decision mostly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

targeted_actorA

What the player is looking at: a line trace from the camera along its forward vector.

distance is in centimetres (the engine's unit), default 5000. channel is a trace channel: 0 = Visibility, 1 = Camera. ref traces from that actor's own location and forward vector instead of the camera, which is how you ask what an NPC faces.

Returns {hit} alone on a miss, otherwise {hit, actor, actor_class, component, component_class, distance, impact_point, impact_normal, bone, phys_material, materials}. actor is the hit component's owner; materials are the component's material full names (first 32) when it exposes GetMaterials. Read-only: it works with allow_writes = false.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNo
channelNo
distanceNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the read-only nature ('Read-only: it works with allow_writes = false'), the miss behavior ('Returns {hit} alone on a miss'), the full hit result shape, and the materials truncation behavior ('first 32'). This is substantial behavioral disclosure. It doesn't mention performance cost or whether the trace respects collision complexity, but for a read-only query tool the disclosed behavior is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: a one-line plain-language summary, then parameter explanations, then return shape, then read-only note. Every sentence adds information. It could be slightly more scannable with line breaks, but it is not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only trace tool with 3 optional parameters and no output schema, the description covers the purpose, parameter semantics, return values, and safety profile. The only missing context is how to specify the ref actor (name vs. ID) and perhaps an example call. But the description is complete enough for an agent to invoke the tool correctly in most cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains all three parameters: distance (unit and default), channel (enum-like mapping), and ref (meaning and use case). The only minor gap is that it doesn't explicitly state that ref is an actor reference or how to specify it (e.g., by name or ID), but the description's explanation of ref is still meaningful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a plain-language statement of what the tool does ('What the player is looking at') and then gives a precise technical definition: a line trace from the camera along its forward vector. It clearly distinguishes itself from sibling tools like find_object/find_objects (which search by criteria) and inspect_object (which inspects a known object). The verb+resource+mechanism are all specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use the ref parameter ('which is how you ask what an NPC faces'), and the channel parameter's meaning is given with its values. It also states the default distance and unit. While it doesn't name sibling alternatives explicitly, the usage context is clear enough that an agent can decide when to call this tool versus find_object or inspect_object.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

watch_propertyA

Sample properties on a timer and record an event whenever a value changes. Read-only.

names is one property name or a list. every=True records every sample instead of only changes. Read the results with poll_events; nothing is pushed.

interval_ms is clamped to at least 100 and defaults to 250. A pass that looks the object up costs roughly 10 to 25 ms of game-thread time on a game without object hash tables, so keep watches few and slow (250 ms or more).

The object is held between passes and rechecked with IsValid() on each one; a lookup happens only when it is gone or a read failed, so the watch follows a reference such as 'first:PlayerController' across respawns without paying a scan per pass. {kind: "stream", event: "resumed"} is recorded when the watch adopts a different object (by address) after the previous one stopped being valid or was lost, with the baseline reset so the first sample on the new object is not reported as a change; the same object coming back after a blip records nothing. If the reference stops resolving (usually a map transition) it records one {kind: "stream", event: "lost"} row and keeps retrying at a slow cadence. Only stop_stream ends a watch.

Labels are unique: reusing one raises. Stop a watch with stop_stream.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
everyNo
labelYes
namesYes
interval_msNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden and does so thoroughly. It discloses interval clamping/defaulting, per-pass cost, object revalidation with IsValid(), resumed/lost event behavior, baseline resets, and that only stop_stream ends a watch. This goes far beyond what a typical description provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but each sentence carries substantive information, from purpose to parameters to event semantics to lifecycle. It is front-loaded with the core purpose and read-only note, then organized by parameter and behavior. No filler or tautology is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters, no annotations, and no output schema, this description is remarkably complete. It covers what the tool does, how parameters behave, performance implications, event semantics, lifecycle, and how to retrieve results via poll_events. An agent has enough context to invoke and manage the watch correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does. It explains names (one name or list), every (records every sample vs. changes only), interval_ms (clamped, default, performance guidance), label (unique, reuse raises), and ref implicitly through examples like 'first:PlayerController' and reference-following behavior. All five parameters are meaningfully described.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Sample properties on a timer and record an event whenever a value changes.' It also labels the operation as read-only, which clearly distinguishes it from mutation tools and frames its streaming nature. It is immediately distinguishable from siblings like get_property, poll_events, and stop_stream.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical guidance on when and how to use the tool: read results with poll_events, nothing is pushed, stop with stop_stream, and labels are unique. It also advises keeping watches few and slow due to game-thread cost. It does not explicitly contrast with one-shot alternatives like get_property, but the usage context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

world_infoD

Current world, player controller, pawn, game instance and game mode.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

D1.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden for behavioral transparency. It does not indicate whether the tool is read-only, what side effects it has, or whether it returns current state or modifies anything. The bare list of items gives no clue about behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short and free of fluff, but it is so terse that it sacrifices clarity. It fits in one sentence but fails to convey meaningful information about the tool's function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lists game-related entities but does not explain what the tool does with them—whether it retrieves, modifies, or reports their status. It lacks context about return format or purpose, making it incomplete for an agent deciding to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to describe. The baseline of 4 applies because the absence of parameters is clear and no description is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a noun phrase listing game objects (world, player controller, pawn, game instance, game mode) but does not state what the tool does with them. It lacks a verb like 'get' or 'list', making the purpose ambiguous compared to sibling tools like inspect_object or get_property.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as dump, get_property, or inspect_object. The description does not explain scenarios where world_info is preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv1.2.0
    • Addeddiff_object
    • Addedforget_snapshot
    • Addedhook_function
    • Addedlist_snapshots
    • Addedlist_streams
    • Addedlist_subclasses
    • Addedpoll_events
    • Addedreload_mod
    • Addedsnapshot_object
    • Addedstop_stream
    • Addedtargeted_actor
    • Addedwatch_property
  2. 14 tool updatesv1.0.0
    • First observedbatch
    • First observedbridge_status
    • First observedcall_function
    • First observedconsole_command
    • First observeddump
    • First observedeval_lua
    • First observedfind_object
    • First observedfind_objects
    • First observedget_property
    • First observedinspect_object
    • First observedlist_functions
    • First observedlist_types
    • First observedset_property
    • First observedworld_info

TDQS

B3.4/5.0

Scored across 26 tools

Disambiguation5/5

Each tool targets a distinct operation: object discovery, property inspection, function calling, stream management, snapshotting, and batch execution are clearly separated. Even similar tools like find_object/find_objects and inspect_object/snapshot_object/diff_object have well-defined boundaries.

Naming Consistency4/5

The set predominantly follows a verb_noun underscore pattern such as list_types, get_property, watch_property, and forget_snapshot. A few outliers like bridge_status, world_info, targeted_actor, and batch break the pattern slightly but do not create real confusion.

Tool Count4/5

26 tools is above the typical well-scoped range, but the server covers a broad UE4SS bridge domain including object discovery, property access, function invocation, event streams, snapshots, and batching. Each tool serves a distinct purpose, and batch is a convenience wrapper rather than redundant functionality.

Completeness5/5

The tool surface covers the full lifecycle of working with a live UE4SS game: inspecting state, reading/writing properties, calling functions, executing console/eval commands, watching changes, hooking functions, snapshotting/diffing, and recovering via reload_mod. There are no obvious dead ends for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers