Blueprint Authoring Workflow
The Blueprint Authoring Cycle
orient (bp_brief / bp_inspect) → probe (bp_dry_run) → create (bp_create) → author (narrow writes) → commit (bp_commit) → verify (bp_inspect / pie_test_bp)
Skip steps for trivial edits — a single-variable tweak on an already-read BP goes straight from bp_variable to bp_commit.
Step 1: Orient (Read Before Write)
At least one read-class tool MUST fire before any write. This satisfies the write guard.
bp_brief(blueprint_path) — compact one-call overview (parent, components, variables, graphs, dispatchers). Use FIRST.
bp_inspect({queries: [...]}) — 21 targeted ops: overview, get_variables, get_functions, get_nodes, get_connections, export_spec, health_check, etc. Batched — every op in one call shares loaded BP cache.
bp_export(blueprint_path) — full GraphSpec JSON dump for cloning or diffing.
search_assets — find unknown Blueprint paths by name/prefix.
Step 2: Probe (Optional, Recommended for Complex Work)
bp_dry_run(op=check_intent, intent=[...]) — fast static validation. Catches bogus class paths, wrong K2_ function names, unsupported variable types BEFORE an apply cycle.
bp_dry_run(op=check_spec, blueprint_path, spec_json) — runs the composer's real dry-run (non-destructive, snapshot + rollback). Returns blockers + warnings.
Step 3: Create Asset
bp_create(op=from_parent, blueprint_path, parent_class, components?, variables?, interfaces?) — create Actor/Pawn/Character/Component/Object BP with inline bootstrap.
bp_create(op=from_actor, actor_label, package_path, name) — bake a placed level actor into a new BP.
bp_create(op=interface|enum|struct) — create BPIs / Enums / Structs.
Step 4: Author (Narrow Writes)
All narrow writes defer compile — stack many, then commit once.
Variables
bp_variable({blueprint_path, variables: [...]}) — batched CRUD.
Type vocabulary: bool, int, int64, float, double, string, name, text, byte, Vector, Rotator, Transform, Color, LinearColor, object refs (/Script/Engine.Actor), BP class refs, enums, containers (Array<T>, Set<T>, Map<K,V>).
Field gotchas:
read_only (NOT blueprint_read_only — extra underscore is silently ignored)
default_value or default (NOT value — silently ignored)
category only (NOT cat or display_category)
Components
bp_component({blueprint_path, components: [...]}) — batched CRUD with inline property writes (collision, transforms, mesh refs, attach sockets).
Graphs
bp_graph({blueprint_path, graphs: [...]}) — function/macro/event graph CRUD. Auto-creates FunctionEntry + FunctionResult nodes — reference via $entry.<pin> / $result.<param>.
Nodes
bp_nodes({blueprint_path, graph, nodes: [...]}) — batched add/remove on ONE graph.
~40 node types: event, custom_event, function_call, variable_get, variable_set, branch, sequence, cast, make_struct, break_struct, spawn_actor, input_action, timeline, math, comparison, select, for_each_loop, switch_*, make_array, format_text, call_dispatcher, bind_dispatcher.
Declare stable_id for each node, reference with $stable_id from bp_wire.
Wiring
bp_wire({blueprint_path, graph, edges: [...], defaults: [...], pin_ops: [...]}) — batched exec + data edges + pin defaults + pin ops.
ALWAYS include exec AND data edges in ONE call — partial wiring is the #1 failure mode.
Edge format: $<stable_id>.<pin> for new nodes, $<32-char-hex-guid>.<pin> for existing un-tagged nodes.
Enhanced Input
bp_input({actions: [...], bindings: [...], bind?: {...}}) — create IAs + IMCs + key mappings + modifiers + triggers in ONE call.
Class-Level Settings
bp_class({blueprint_path, operations: [...]}) — reparent, add_interface, set_cdo_property (dot-notation like "CharacterMovement.MaxWalkSpeed").
Step 5: Commit
bp_commit(blueprint_path) — single compile + auto-layout + health report.
Returns: compile_status, errors[], warnings[], orphan_pins, dangling_exec_chains, unreachable_nodes.
- UpToDateWithWarnings is NOT success — investigate every warning.
- Multi-commit across fix passes is normal (author → commit → read errors → narrow fix → commit again).
Step 6: Verify
bp_brief / bp_inspect for structural confirmation
pie_test_bp for runtime-behavioral verification (30+ assertion types)
- A compile-clean BP that fails PIE is the #1 silent-bug source
Hard Rules
- Read before write — at least one read-class tool must fire first
- Batch arrays —
variables[], components[], graphs[], nodes[], edges[], operations[] are designed for one call with many items
- One bp_wire call per graph for the initial wiring pass (exec + data together)
- One bp_commit per target BP per authoring pass
- snake_case node types —
event, function_call, variable_get, branch, spawn_actor
- Pure functions have NO exec pins —
variable_get, math, K2_GetActorLocation, make_struct, break_struct, Array_Length
- Function inputs are OUTPUT pins on FunctionEntry — reference via
$entry.<ParamName>, do NOT create variable_get
- Latent nodes (Delay, RetriggerableDelay) only work in EventGraphs
math node is SCALAR-ONLY — use KismetMathLibrary function_calls for Vector/Rotator math
function_call class field is class (NOT scope — silently ignored)
comparison op is lowercase — equal, not_equal, greater, less (NOT PascalCase)
Compound Escape Hatches
bp_author(blueprint_path, spec_json) — full GraphSpec one-shot when you have the complete spec
repair_blueprint(blueprint_path) — rescue corrupted BPs (duplicate graphs, orphan nodes, broken references)
bp_skills({topics: [...]}) — load skill docs before first use of unfamiliar tools (batch 3-8 topics)
1---2name: blueprint-authoring3description: Blueprint authoring workflow for the Flopperam Unreal Engine MCP. Covers the full create, author, commit, verify cycle using the narrow bp_* tool surface. Use when creating or editing Blueprints, adding variables/components/events/functions, wiring graphs, or debugging compile errors.4---56# Blueprint Authoring Workflow78## The Blueprint Authoring Cycle910```11orient (bp_brief / bp_inspect) → probe (bp_dry_run) → create (bp_create) → author (narrow writes) → commit (bp_commit) → verify (bp_inspect / pie_test_bp)12```1314Skip steps for trivial edits — a single-variable tweak on an already-read BP goes straight from `bp_variable` to `bp_commit`.1516## Step 1: Orient (Read Before Write)1718At least one read-class tool MUST fire before any write. This satisfies the write guard.1920- `bp_brief(blueprint_path)` — compact one-call overview (parent, components, variables, graphs, dispatchers). Use FIRST.21- `bp_inspect({queries: [...]})` — 21 targeted ops: `overview`, `get_variables`, `get_functions`, `get_nodes`, `get_connections`, `export_spec`, `health_check`, etc. Batched — every op in one call shares loaded BP cache.22- `bp_export(blueprint_path)` — full GraphSpec JSON dump for cloning or diffing.23- `search_assets` — find unknown Blueprint paths by name/prefix.2425## Step 2: Probe (Optional, Recommended for Complex Work)2627- `bp_dry_run(op=check_intent, intent=[...])` — fast static validation. Catches bogus class paths, wrong K2_ function names, unsupported variable types BEFORE an apply cycle.28- `bp_dry_run(op=check_spec, blueprint_path, spec_json)` — runs the composer's real dry-run (non-destructive, snapshot + rollback). Returns blockers + warnings.2930## Step 3: Create Asset3132- `bp_create(op=from_parent, blueprint_path, parent_class, components?, variables?, interfaces?)` — create Actor/Pawn/Character/Component/Object BP with inline bootstrap.33- `bp_create(op=from_actor, actor_label, package_path, name)` — bake a placed level actor into a new BP.34- `bp_create(op=interface|enum|struct)` — create BPIs / Enums / Structs.3536## Step 4: Author (Narrow Writes)3738All narrow writes defer compile — stack many, then commit once.3940### Variables41`bp_variable({blueprint_path, variables: [...]})` — batched CRUD.4243Type vocabulary: `bool`, `int`, `int64`, `float`, `double`, `string`, `name`, `text`, `byte`, `Vector`, `Rotator`, `Transform`, `Color`, `LinearColor`, object refs (`/Script/Engine.Actor`), BP class refs, enums, containers (`Array<T>`, `Set<T>`, `Map<K,V>`).4445Field gotchas:46- `read_only` (NOT `blueprint_read_only` — extra underscore is silently ignored)47- `default_value` or `default` (NOT `value` — silently ignored)48- `category` only (NOT `cat` or `display_category`)4950### Components51`bp_component({blueprint_path, components: [...]})` — batched CRUD with inline property writes (collision, transforms, mesh refs, attach sockets).5253### Graphs54`bp_graph({blueprint_path, graphs: [...]})` — function/macro/event graph CRUD. Auto-creates FunctionEntry + FunctionResult nodes — reference via `$entry.<pin>` / `$result.<param>`.5556### Nodes57`bp_nodes({blueprint_path, graph, nodes: [...]})` — batched add/remove on ONE graph.5859~40 node types: `event`, `custom_event`, `function_call`, `variable_get`, `variable_set`, `branch`, `sequence`, `cast`, `make_struct`, `break_struct`, `spawn_actor`, `input_action`, `timeline`, `math`, `comparison`, `select`, `for_each_loop`, `switch_*`, `make_array`, `format_text`, `call_dispatcher`, `bind_dispatcher`.6061Declare `stable_id` for each node, reference with `$stable_id` from bp_wire.6263### Wiring64`bp_wire({blueprint_path, graph, edges: [...], defaults: [...], pin_ops: [...]})` — batched exec + data edges + pin defaults + pin ops.6566**ALWAYS include exec AND data edges in ONE call** — partial wiring is the #1 failure mode.6768Edge format: `$<stable_id>.<pin>` for new nodes, `$<32-char-hex-guid>.<pin>` for existing un-tagged nodes.6970### Enhanced Input71`bp_input({actions: [...], bindings: [...], bind?: {...}})` — create IAs + IMCs + key mappings + modifiers + triggers in ONE call.7273### Class-Level Settings74`bp_class({blueprint_path, operations: [...]})` — reparent, add_interface, set_cdo_property (dot-notation like `"CharacterMovement.MaxWalkSpeed"`).7576## Step 5: Commit7778`bp_commit(blueprint_path)` — single compile + auto-layout + health report.7980Returns: `compile_status`, `errors[]`, `warnings[]`, `orphan_pins`, `dangling_exec_chains`, `unreachable_nodes`.8182- **UpToDateWithWarnings is NOT success** — investigate every warning.83- Multi-commit across fix passes is normal (author → commit → read errors → narrow fix → commit again).8485## Step 6: Verify8687- `bp_brief` / `bp_inspect` for structural confirmation88- `pie_test_bp` for runtime-behavioral verification (30+ assertion types)89- A compile-clean BP that fails PIE is the #1 silent-bug source9091## Hard Rules9293- **Read before write** — at least one read-class tool must fire first94- **Batch arrays** — `variables[]`, `components[]`, `graphs[]`, `nodes[]`, `edges[]`, `operations[]` are designed for one call with many items95- **One bp_wire call per graph** for the initial wiring pass (exec + data together)96- **One bp_commit per target BP** per authoring pass97- **snake_case node types** — `event`, `function_call`, `variable_get`, `branch`, `spawn_actor`98- **Pure functions have NO exec pins** — `variable_get`, math, `K2_GetActorLocation`, `make_struct`, `break_struct`, `Array_Length`99- **Function inputs are OUTPUT pins** on FunctionEntry — reference via `$entry.<ParamName>`, do NOT create variable_get100- **Latent nodes** (Delay, RetriggerableDelay) only work in EventGraphs101- **`math` node is SCALAR-ONLY** — use KismetMathLibrary function_calls for Vector/Rotator math102- **`function_call` class field is `class`** (NOT `scope` — silently ignored)103- **`comparison` op is lowercase** — `equal`, `not_equal`, `greater`, `less` (NOT PascalCase)104105## Compound Escape Hatches106107- `bp_author(blueprint_path, spec_json)` — full GraphSpec one-shot when you have the complete spec108- `repair_blueprint(blueprint_path)` — rescue corrupted BPs (duplicate graphs, orphan nodes, broken references)109- `bp_skills({topics: [...]})` — load skill docs before first use of unfamiliar tools (batch 3-8 topics)