MCP server that exposes tools to Claude for inspecting and querying Unreal Engine 5 blueprints, interfaces, materials, and data assets. Routes tool calls to the Unreal host via IPC.
Server has 16 tools with consistent naming (verb_noun pattern) and detailed descriptions. However, critical gaps exist: input schemas are not explicitly visible in the provided code (only function signatures), parameter descriptions are embedded in docstrings rather than schema annotations, and output schemas are completely undocumented. Error handling is minimal, most tools return JSON from a remote call without guidance on recovery. The reload_host tool includes validation logic, but others lack input constraints. Descriptions are verbose (often 200+ chars) and technical, which aids domain experts but may confuse LLM parameter selection. No tool annotations (readOnlyHint, destructiveHint) are present despite clear risk levels.
Search asset registry by class type and optional name filter.
Find Blueprints that bind/broadcast a delegate or implement an interface. interface_implementations uses reflection/JSON (no full-project T3D). Pass event_name and/or blueprint_name/path_prefix for T3D event_bindings and interface_message_calls. max_assets caps unscoped T3D scans (default 32).
Thin Blueprint inspection by default: components, variables, signatures, interfaces. Default omits functions[].body (GET_BLUEPRINT_BODY_OMITTED). include_body=True returns T3D exec summaries for single-entry function graphs only. Multi-entry EventGraphs hard-omit body (EVENTGRAPH_BODY_UNATTRIBUTED) — use include_flow / query_blueprint_flow with flow_event_name or EventGraph::Event addressing for attributed walks. Implemented interface function signatures are joined additively under functions[].interface_contract (native inputs/outputs are never overwritten). Budgets above hard caps are clamped visibly (QUERY_LIMIT_CLAMPED + applied_limits.clamped). Never returns a full live snapshot.
Read property values from a PrimaryDataAsset *instance* (configured values). Pass an instance asset name, not a Data Asset Blueprint class. Class/Blueprint matches return DATA_ASSET_WRONG_KIND.
Inspect a Blueprint Interface: function signatures, input/output pins. Returns full function contract.
Input schemas not explicitly defined in JSON Schema format. Parameter types and constraints are embedded in Python function signatures and docstrings, not exposed as structured schema metadata. FastMCP may auto-generate schemas, but they are not visible in the provided code.
Output schemas completely undocumented. Tools return JSON from remote calls, but the structure, field names, and types are not documented. LLMs cannot plan downstream tool calls or extract required fields without trial-and-error.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). reload_host is clearly destructive (reloads modules), but no annotation signals this to clients. Agents cannot distinguish safe reads from risky writes.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
Inspect a Material or MaterialFunction: exposed parameters (scalar, vector, texture), output slot connections, and material function calls.
Inspect a UserDefinedStruct: field names and types.
All variables on a Blueprint: name, type, type_normalized, container, optional defaults. Set include_locals=True to also parse function-scope LocalVariables from T3D (skipped on the thin default path). Visibility is best-effort when PropertyFlags are present.
List all Blueprint assets in the project. Optionally filter by path prefix or name substring.
List all components on a Blueprint actor. Quick dependency check without full inspection.
List all Blueprint Interfaces defined in the project.
Check if the UE5 editor host is reachable. Returns pong on success.
Bounded graph-local exec/data flow for one Blueprint (never dumps a full graph). Captures live, prepares an index, and walks from an entry root or an exact node/pin identity. Prefer graph_name like CanInteract or EventGraph::Interact; omit root_identity_* to auto-root at the entry. Returns production-shaped graphs[] records (node/hop/terminal) with applied_limits and reason_codes.
Query a Blueprint symbol (function, variable, or event) by name and optional type filters.
Query the Grimoire SQLite cache. Set tool to 'query_blueprints', 'query_functions', or 'query_references'. query_blueprints: filter by parent_class, has_function, has_variable, references_type (matches variable/function pin types or implemented interface names). query_functions: filter by name_filter, input_type, output_type. query_references: requires type_name.
Purge cached ue5_host handler modules and reimport from disk on the next call. Requires confirm=True. Reloads handlers/interface_reflection/flow/etc without restarting the editor or the TCP listener. Does not reload lab (use lab_reload). Chicken-and-egg: if the running host predates this tool, purge once via the Output Log snippet in importantcmds.md, then this tool works thereafter.
Error handling lacks recovery guidance. Tools return JSON from remote calls without categorizing errors as retryable, user-fixable, or fatal. A remote timeout or 'blueprint not found' error is returned as-is, giving LLMs no actionable next step.
Descriptions are verbose (200+ chars) and domain-specific, optimized for human experts rather than LLM parameter selection. Baseline for A+ tools is 50-200 chars. Overly long descriptions waste tokens and bury key distinctions between similar tools.