Testing¶
13 tools. Back to the index.
check_blueprint_errors¶
Read-only.
Check a blueprint for compilation errors, warnings, structural issues, and orphaned nodes. Read-only: it does NOT recompile the Blueprint (it reports the cached Status).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
Returns: { blueprint_path: string, resolved_object_path: string, blueprint_class: string, is_blueprint: bool, error_status: string, error_message: string, errors: [string], warnings: [string], error_count: int, warning_count: int, blueprint_compiled: bool, compilation_status: string, is_static_analysis: bool, recompiled_blueprint: bool, orphaned_node_heuristic: string }
get_blueprint_debug_info¶
Read-only.
Retrieve comprehensive debug information about a blueprint including structure, metadata, and complexity analysis. Read-only: it does NOT recompile the Blueprint.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
Returns: { blueprint_path: string, resolved_object_path: string, blueprint_class: string, debug_status: string, debug_level: string, debug_message: string, file_size_bytes: int, file_size_mb: number, function_count: int, event_count: int, variable_count: int, component_count: int, total_nodes: int, parent_class: string, blueprint_compiled: bool, compilation_status: string, function_names: [string], variable_info: [{ name, type, category, is_public, is_editable }], component_info: [{ name, class, is_root }], complexity_score: number, complexity_level: string }
list_validators¶
Read-only.
List the editor data validators the DataValidation subsystem has enabled (ForEachEnabledValidator): class_name, class_path and enabled for each, plus validator_count. Read-only; errors when the DataValidation plugin subsystem is unavailable. validate_asset runs them on one asset.
No parameters.
Returns: { validators: [{ class_name: string, class_path: string, enabled: bool }], validator_count: number }
profile_blueprint_execution¶
Destructive.
STATIC complexity analysis of a blueprint (node/function/variable counts + heuristic score). It does NOT profile any runtime execution. WARNING, SIDE EFFECT: by default it RECOMPILES the Blueprint purely to time the compile, which marks the asset dirty and can surface new compile errors on an asset you only meant to READ -- pass compile_for_timing=false for a genuinely read-only analysis. Three response fields are misnamed and each is flagged as such in the payload: execution_time is the COMPILE time in ms, cpu_usage is the heuristic complexity score (not CPU), and memory_usage is the .uasset size on disk (not memory).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
compile_for_timing |
boolean | no | Optional (default true): recompile the Blueprint to measure compile time. Pass false for a pure read-only analysis (execution_time/compilation_score_ms then report 0). |
Returns: { blueprint_path: string, resolved_object_path: string, blueprint_class: string, execution_time: number, memory_usage: int, cpu_usage: number, performance_rating: string, profile_status: string, total_nodes: int, function_count: int, event_count: int, variable_count: int, component_count: int, complexity_score: number, memory_score_mb: number, compilation_score_ms: number, blueprint_compiled: bool, is_static_analysis: bool, runtime_profiled: bool, recompiled_blueprint: bool, execution_time_is_compile_time_ms: bool, cpu_usage_is_complexity_score: bool, memory_usage_is_disk_file_size_bytes: bool, under_readonly_root: bool, side_effects: [string], recommendations?: [string] }
remove_blueprint_breakpoint¶
Destructive, idempotent.
Remove a debugging breakpoint from a specific node within a blueprint graph via FKismetDebugUtilities::RemoveBreakpointFromNode. Idempotent (already_absent when none exists).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
node_name |
string | yes | Name or title of the graph node to remove the breakpoint from (title-contains match) |
Returns: { blueprint_path: string, node_name: string, removed: bool, already_absent: bool, found_in_graph: bool, node_class?: string, node_title?: string }
run_map_check¶
Destructive.
Run editor Map Check on the current level and report message counts, each message resolved back to the actor/component the engine attached to it.
| Parameter | Type | Required | Description |
|---|---|---|---|
check_deprecated_only |
boolean | no | When true, only run deprecated-asset checks (optional, default false) |
base_libraries |
array | no | Package roots to classify each message's class against (optional, default: the project's Read Only Content Roots). An explicit [] disables the classification. Reported as data in class_root/class_root_is_base_library; the tool never judges which root is "upstream". |
Returns: { world: string, map_check_ran: bool, check_deprecated_only: bool, base_libraries: [string], error_count: number, warning_count: number, info_count: number, total_messages: number, messages_truncated: bool, messages: [{ severity: number, text: string, token_source: string, object_path: string, object_resolved: bool, actor_name: string, actor_label: string, actor_path: string, actor_class: string, actor_guid: string, component_name: string, class_asset_path: string, class_root: string, class_root_is_base_library: bool }] }
set_blueprint_breakpoint¶
Destructive, idempotent.
Set a real debugging breakpoint on a specific node within a blueprint graph via FKismetDebugUtilities::CreateBreakpoint. Idempotent (guarded by FindBreakpointForNode).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
node_name |
string | yes | Name or title of the graph node to set as a breakpoint (title-contains match) |
Returns: { blueprint_path: string, node_name: string, breakpoint_set: bool, already_existed: bool, found_in_graph: bool, node_class?: string, node_title?: string }
test_blueprint_function¶
Destructive.
Static analysis of one function graph of a blueprint (node/pin counts + heuristics). WARNING: it does NOT execute the function; it RECOMPILES the Blueprint (FKismetEditorUtilities::CompileBlueprint) and reports the COMPILE time as execution_time.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
function_name |
string | yes | Name of the function graph to analyze within the blueprint |
compile_for_timing |
boolean | no | Optional (default true): recompile the Blueprint to measure compile time. Pass false to skip the recompile side effect (execution_time then reports 0). |
Returns: { blueprint_path: string, resolved_object_path: string, function_name: string, test_success: bool, test_result: string, execution_time: number, memory_usage: int, node_count: int, connection_count: int, performance_rating: string, function_exists: bool, blueprint_compiled: bool, is_static_analysis: bool, function_was_executed: bool, recompiled_blueprint: bool, execution_time_is_compile_time_ms: bool, memory_usage_is_disk_file_size_bytes: bool, connection_count_is_pin_count: bool, under_readonly_root: bool, issues?: [string] }
trace_blueprint_execution¶
Read-only.
STATIC listing of a blueprint's graphs and their nodes. It does NOT trace anything at runtime, despite the name: trace_status reports "StaticAnalysisOnly", and total_execution_paths does NOT count execution paths -- it counts GRAPHS, kept under that name only for compatibility, alongside the honest alias graphs_analyzed and the flag total_execution_paths_is_graph_count. Collapsed composite subgraphs are invisible unless you pass include_composites=true. TO ACTUALLY OBSERVE RUNTIME use set_blueprint_breakpoint (+ PIE) or watch_pie_property instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the blueprint (resolved via mcp_common::ResolveAssetFlexible; ambiguity errors out listing candidates) |
include_composites |
boolean | no | Optional (default false): also descend into collapsed composite subgraphs (UEdGraph::SubGraphs). Macro-instance graphs are NOT followed (they usually live in another Blueprint / an engine macro library). |
Returns: { blueprint_path: string, resolved_object_path: string, blueprint_class: string, trace_status: string, trace_level: string, trace_message: string, file_size_bytes: int, file_size_mb: number, total_execution_paths: int, graphs_analyzed: int, total_execution_paths_is_graph_count: bool, is_static_analysis: bool, traced_runtime: bool, includes_composite_subgraphs: bool, limitations: [string], function_count: int, event_count: int, execution_flow: [string], function_calls: [string], event_calls: [string], blueprint_compiled: bool, compilation_status: string }
validate_asset¶
Read-only.
Run the enabled editor data validators (UEditorValidatorSubsystem::IsAssetValid, Script use case) on one asset: validation_result (Valid, Invalid or NotValidated), is_valid (NotValidated counts as valid), errors and warnings. Read-only; validators_run counts the enabled validators, not those that applied.
| Parameter | Type | Required | Description |
|---|---|---|---|
asset_path |
string | yes | Object/package path of the asset, e.g. "/Game/MyGame/M_Example". |
Returns: { asset_path: string, resolved_object_path: string, validation_result: string, is_valid: bool, errors: [string], warnings: [string], error_count: number, warning_count: number, validators_run: number }
validate_assets_in_path¶
Read-only.
Run the enabled editor data validators (Script use case, as validate_asset does) on every asset under a content path, recursively by default, up to max_results assets; truncated tells when more were found. Loads each asset but changes and saves nothing. Per asset: validation_result (Valid, Invalid or NotValidated), is_valid (NotValidated counts as valid), errors and warnings; totals in num_valid, num_invalid and num_not_validated. A path with no assets returns zero counts, not an error. Use validate_asset for one asset, list_validators to see which validators run.
| Parameter | Type | Required | Description |
|---|---|---|---|
path |
string | yes | Package path to scan, e.g. "/Game/MyGame". |
recursive |
boolean | no | Whether to scan sub-paths (optional, default true) |
max_results |
number | no | Maximum number of assets to validate (optional, default 1000, valid 1-100000) |
Returns: { path: string, recursive: bool, num_assets: number, num_valid: number, num_invalid: number, num_not_validated: number, total_found: number, truncated: bool, results: [{ asset_path: string, asset_name: string, asset_class: string, validation_result: string, is_valid: bool, error_count: number, warning_count: number, errors: [string], warnings: [string] }] }
validate_blueprint¶
Read-only.
Validate a blueprint asset by checking its structure, file size, and validity. Static (asset-registry + on-disk) check only: it does NOT compile the Blueprint.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_path |
string | yes | Object path, package path, or bare short name of the asset (resolved via mcp_common::ResolveAssetFlexible; an ambiguous short name errors out listing every candidate instead of picking one silently) |
Returns: { blueprint_path: string, resolved_object_path: string, blueprint_class: string, is_blueprint: bool, validation_status: string, validation_message: string, is_static_analysis: bool, file_size_bytes?: int, file_size_mb?: number }
watch_pie_property¶
Destructive.
Sample one or SEVERAL properties across a PIE session, arming BEFORE PIE starts so a write that happens in BeginPlay is still observable. Answers "what did this value do during play", NOT "who wrote it": it SAMPLES rather than intercepting writes, so identifies_writer is always false and a transient A->B->A between two samples is invisible. THE ORDER MATTERS: action="start" arms and returns immediately (it cannot block the game thread), THEN you start PIE, and afterwards action="status" returns the recorded samples. Arming while PIE is ALREADY running is honoured but flagged (armed_while_pie_running) -- the BeginPlay window has already passed for that session, which is precisely the failure this tool exists to avoid, so stop PIE, arm, then start PIE. It self-disarms on duration_seconds or max_samples (it can never leak a ticker) and the recorded samples survive until action="clear".
| Parameter | Type | Required | Description |
|---|---|---|---|
action |
string | no | Optional: "start" (default) | "status" | "stop" | "clear" | "list". |
property_name |
string | no | Property to sample on the matched object. Required for "start" unless properties is given. |
properties |
array | no | Optional array of property names sampled TOGETHER, in the SAME tick, as one ROW. This is what answers correlation questions ("movement_mode changed in the same tick immersion crossed the threshold"), which N separate watches cannot: each would dedupe on its own clock and the columns would not line up. The row is the dedup unit -- if ANY field changes the whole row is recorded -- and each sample carries a values object with the per-property breakdown. With one property there is no values object. |
class_name |
string | no | Optional actor class filter (exact UClass name; a Blueprint class needs the "_C" suffix). At least one of class_name / actor_label is required for "start". |
actor_label |
string | no | Optional actor filter, matched against the editor label OR the object name. |
component |
string | no | Optional component name: sample the property on that component of the matched actor instead of on the actor. |
sample_interval_seconds |
number | no | Optional periodic sampling interval (default 0.1, min 0.01). |
duration_seconds |
number | no | Optional auto-disarm after this many real seconds (default 300; 0 = no time cap, disarms only on max_samples or an explicit stop). |
max_samples |
number | no | Optional hard cap on recorded samples (default 400). |
watch_id |
number | no | Target watch for "status" / "stop" / "clear" (omit = all of them). |
Returns: { action: string, watch_id?: int, armed?: bool, watches: [{ watch_id, property_name, class_name, actor_label, component, sample_interval_seconds, duration_seconds, max_samples, active, saw_pie_world, armed_while_pie_running, sample_count, elapsed_real_seconds, stop_reason, distinct_objects_seen, samples?: [{ phase, object_path, actor_label, value_text, value, elapsed_real_seconds, world_time_seconds, world, changed_from_previous }] }], identifies_writer: bool, sampling_only: bool, armed_pre_pie?: bool, pie_running?: bool, class_resolved?: bool, hint?: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }. The five world_* / net_mode / pie_instance fields identify the PIE world the ticker is sampling AT THE MOMENT OF THE CALL (all null / pie_instance -1 when no PIE session is running, which is the normal state right after arming).