Skip to content

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).