Unreal Engine C++ and Blueprint analysis examples
These are recorded MCP calls, not a live demo or a recreated IDE. They were captured with NarshaMCP v0.13.7, Lyra Starter Game, UE 5.8.1, and the Editor closed. They demonstrate those specific runs, not universal parsing coverage or a performance benchmark.
The request and response excerpts below preserve the recorded values. Comments identify omitted fields and array elements; the excerpts do not include the complete responses.
What offline parsing adds
Section titled “What offline parsing adds”The demonstrated improvement is project context an agent can inspect beyond source text. These are the product’s recorded responses, not an independent accuracy test or a comparison against every other MCP.
- A saved value: the source check did not find
FireDelayTimeSecs. Binary analysis returned its default as 0.1 inGA_Weapon_Fire. That gives an agent a concrete saved setting to inspect; it is not a runtime-evaluated pin value. - Call sites across formats: source search found the C++ declaration and definition of
StartRangedWeaponTargeting. The MCP response added 2 Blueprint call sites, including their owning events. Matches are qualified, with score 0.75; the score is not an accuracy percentage. - Behavior structure: the StateTree response reported 9 states and 19 property bindings. An agent can inspect the returned tasks and transitions before an editing session. The published excerpt shows selected states, not the whole tree.
Scope of the comparison
Section titled “Scope of the comparison”The source check searched readable .h and .cpp files under the sample project’s Source/ and Plugins/. This is a source-text baseline, not a measured failure rate for AI agents. A binary file can contain readable strings; finding those strings alone does not reconstruct its graph or typed values.
The recorded MCP reads ran after setup and indexing with the Editor closed. Supported disk reads therefore remove an Editor or commandlet launch from the research workflow. They do not remove the initial installation, project build, or indexing requirement. Some responses use metadata caches produced by binary parsing; each query is not necessarily a fresh parse of the package. An unsaved Editor change is not part of the file on disk.
These examples show the project data available for analysis. They do not measure comparative speed, memory use, token savings, or answer accuracy.
C++ ↔ Blueprint
Section titled “C++ ↔ Blueprint”Which Blueprints call this C++ function?
Find the owning Blueprint event and the matched C++ symbol. NarshaMCP v0.13.7 · Lyra Starter Game · UE 5.8.1 · Editor closed.
Recorded request and response excerpts. // comments identify omitted fields and array elements.
find_cpp_to_bp — Expand request & response
MCP request
{"name": "ue_analyze_symbols", "arguments": {"operation": "find_cpp_to_bp", "function_name": "ULyraGameplayAbility_RangedWeapon::StartRangedWeaponTargeting", "limit": 5}}Recorded response excerpt
{ "function_name": "ULyraGameplayAbility_RangedWeapon::StartRangedWeaponTargeting", "total_callers": 2, "truncated": false, "blueprint_callers": [ { "blueprint_name": "GA_Weapon_Fire", "blueprint_path": "/Game/Weapons/GA_Weapon_Fire", "owning_function": "K2_ActivateAbility", "node_name": "K2Node_CallFunction_31", "match_tier": "qualified", "confidence": 0.75 }, { "blueprint_name": "GA_WeaponNetShooter", "blueprint_path": "/ShooterCore/Weapons/NetShooter_PROTO/GA_WeaponNetShooter", "owning_function": "K2_ActivateAbility", "node_name": "K2Node_CallFunction_31", "match_tier": "qualified", "confidence": 0.75 } ] // [truncated] blueprint_callers[] fields omitted: call_type, is_pure; keys omitted: operation, skip_dedup, success}find_bp_to_cpp — Expand request & response
MCP request
{"name": "ue_analyze_symbols", "arguments": {"operation": "find_bp_to_cpp", "blueprint_name": "GA_Weapon_Fire", "limit": 2, "offset": 18}}Recorded response excerpt
{ "blueprint_name": "GA_Weapon_Fire", "total_calls": 33, "offset": 18, "truncated": true, "cpp_calls": [ { "full_name": "LyraGameplayAbility_RangedWeapon::StartRangedWeaponTargeting", "owning_function": "K2_ActivateAbility", "node_name": "K2Node_CallFunction_31", "is_pure": false }, { "full_name": "KismetSystemLibrary::SetTimerDelegate", "owning_function": "K2_ActivateAbility", "node_name": "K2Node_CallFunction_4", "is_pure": false } ] // [truncated] cpp_calls[] fields omitted: function_name, owner_class; keys omitted: operation, returned, success, total_count}trace_hierarchy — Expand request & response
MCP request
{"name": "ue_analyze_symbols", "arguments": {"operation": "trace_hierarchy", "class_name": "ALyraCharacter", "direction": "down"}}Recorded response excerpt
{ "class_name": "ALyraCharacter", "cpp_descendants_count": 1, "bp_descendants_count": 10, "descendants": [ {"depth": 1, "name": "ALyraCharacterWithAbilities", "relation": "child", "source": "pdb"}, {"depth": 1, "name": "Character_Default", "relation": "child_blueprint", "source": "blueprint"}, {"depth": 2, "name": "B_Hero_Default", "relation": "child_blueprint", "source": "blueprint"}, {"depth": 2, "name": "B_ShootingTarget", "relation": "child_blueprint", "source": "blueprint"} ], "interface_parents": ["IAbilitySystemInterface", "IGameplayCueInterface", "IGameplayTagAssetInterface", "ILyraTeamAgentInterface"] // [truncated] descendants: 4 of 11 elements; descendants[] fields omitted: parent; keys omitted: 13 of 18}The forward lookup reports two Blueprint callers with match_tier: "qualified" and confidence: 0.75. This is the tool’s match score, not an independently measured accuracy rate. The reverse lookup reports 33 calls; its excerpt is truncated, starts at offset 18, and shows two calls. The hierarchy excerpt shows four of eleven descendants.
Inside a Blueprint
Section titled “Inside a Blueprint”What is inside GA_Weapon_Fire?
Read events, variable defaults, and node connections from the asset. NarshaMCP v0.13.7 · Lyra Starter Game · UE 5.8.1 · Editor closed.
Recorded request and response excerpts. // comments identify omitted fields and array elements.
get_event_graph — Expand request & response
MCP request
{"name": "ue_manage_blueprint", "arguments": {"operation": "get_event_graph", "blueprint_name": "GA_Weapon_Fire"}}Recorded response excerpt
{ "blueprint_name": "GA_Weapon_Fire", "count": 5, "events": [ {"node_title": "FireComplete", "node_class": "K2Node_CustomEvent"}, {"node_title": "FailureMontage Delay Complete", "node_class": "K2Node_CustomEvent"} ] // [truncated] events: 2 of 5 elements; events[] fields omitted: node_id, owning_function; keys omitted: operation, success}search_variables — Expand request & response
MCP request
{"name": "ue_manage_blueprint", "arguments": {"operation": "search_variables", "blueprint_name": "GA_Weapon_Fire", "pattern": "*Fire*"}}Recorded response excerpt
{ "parent_class": "LyraGameplayAbility_RangedWeapon", "total_count": 2, "results": [ { "name": "CharacterFireMontage", "default_value": "AM_MM_Rifle_Fire", "default_value_type": "Object", "edit_condition": "EditDefaultsOnly" }, { "name": "FireDelayTimeSecs", "default_value": "0.1", "default_value_type": "Double", "edit_condition": "EditDefaultsOnly" } ] // [truncated] results[] fields omitted: 9 of 13; keys omitted: 14 of 17}get_raw_nodes — Expand request & response
MCP request
{"name": "ue_manage_blueprint", "arguments": {"operation": "get_raw_nodes", "blueprint_name": "GA_Weapon_Fire", "page": 1, "page_size": 1}}Recorded response excerpt
{ "total_nodes": 98, "has_more": true, "nodes": [ { "id": "K2Node_AsyncAction_ListenForGameplayMessages_0", "node_class": "K2Node_AsyncAction_ListenForGameplayMessages", "owning_function": "K2_OnAbilityAdded", "pins": [ { "name": "execute", "category": "exec", "direction": "input", "linked_to": [ {"node_id": "K2Node_Event_1", "pin_name": "then", "export_index": 70} ] }, {"name": "then", "category": "exec", "direction": "output", "linked_to": []} ] } ] // [truncated] nodes[].pins: 2 of 12 elements; nodes[].pins[].linked_to[] fields omitted: owning_function; nodes[].pins[] fields omitted: container_type, default_value, pin_id, sub_category; nodes[] fields omitted: 5 of 9; keys omitted: 10 of 13}The event excerpt shows two of five events. The variable result contains two defaults. The node request uses pagination; the published excerpt omits some fields as marked in its comments. Neither the homepage nor the excerpt represents the entire graph. Data pins are returned as connections, not evaluated values; only execution order is traced.
StateTree structure
Section titled “StateTree structure”How does this StateTree transition?
Inspect tasks and outgoing transitions without opening the Editor. NarshaMCP v0.13.7 · Lyra Starter Game · UE 5.8.1 · Editor closed.
Recorded request and response excerpts. // comments identify omitted fields and array elements.
get_summary — Expand request & response
MCP request
{"name": "ue_manage_ai", "arguments": {"operation": "get_summary", "ai_type": "statetree", "asset_name": "L_STT_FollowPlayer"}}Recorded response excerpt
{ "asset_name": "L_STT_FollowPlayer", "root_state": "Root", "state_count": 9, "property_binding_count": 19, "states": [ { "name": "Wait 3s Follow", "tasks": ["StateTreeDebugTextTask", "StateTreeDelayTask"], "transitions": [ {"trigger": "OnStateCompleted", "to_state": "Wait 3s Follow TooClose"}, {"trigger": "OnStateCompleted", "to_state": "Follow"} ] }, { "name": "Follow", "tasks": ["STT_Follow"], "transitions": [ {"trigger": "OnStateSucceeded", "to_state": "Root"}, {"trigger": "OnStateFailed", "to_state": "Wait 3s FailFollow"} ] } ] // [truncated] states: 2 of 9 elements; states[] fields omitted: conditions, enabled, state_type; keys omitted: 11 of 16}The asset reports nine states and nineteen property bindings. The excerpt includes two states and omits conditions and other fields as marked. The homepage draws only the selected Wait 3s Follow → Follow → Root path; alternative and failure transitions remain visible in the recorded excerpt. This is structural data, not a simulation of runtime behavior.
How to interpret results
Section titled “How to interpret results”- Match quality depends on available source, PDBs, and supported asset data. A successful build is needed for PDB analysis; engine symbols are needed to include engine classes.
- Cooked assets are not readable. Latent, asynchronous, and delegate edges are approximated.
- A large result can return a local
detail_handle. Resolve it withue_cache_control/resolve_detail_handle, or request a narrower read with alimit. - Asset writes need a running Editor. These read-only examples do not demonstrate editing.
See compatibility for maturity and constraints, or get started to reproduce a read on your own project.