ue-mcp 1.0.72 → 1.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,6 +26,6 @@
26
26
  "statetree": 35,
27
27
  "plugins": 2
28
28
  },
29
- "generatedAt": "2026-05-30T20:08:11.289Z",
30
- "version": "1.0.72"
29
+ "generatedAt": "2026-05-30T20:30:49.573Z",
30
+ "version": "1.0.73"
31
31
  }
@@ -36,7 +36,7 @@ export const gameplayTool = categoryTool("gameplay", "Gameplay systems: physics,
36
36
  create_eqs_query: bp("Create EQS query. Params: name, packagePath?", "create_eqs_query"),
37
37
  list_eqs_queries: bp("List EQS queries. Params: directory?", "list_eqs_queries"),
38
38
  add_perception: bp("Add AIPerceptionComponent. Params: blueprintPath, senses?", "add_perception_component"),
39
- configure_sense: bp("Configure perception sense. Params: blueprintPath, senseType, settings?", "configure_ai_perception_sense"),
39
+ configure_sense: bp("Add + configure an AI perception sense config on the blueprint's AIPerceptionComponent. Params: blueprintPath, senseType (Sight|Hearing|Damage|Touch|Team|Prediction|Blueprint), settings? ({SightRadius: ...}), componentName?", "configure_ai_perception_sense"),
40
40
  create_state_tree: bp("Create StateTree. Params: name, packagePath?", "create_state_tree"),
41
41
  list_state_trees: bp("List StateTrees. Params: directory?", "list_state_trees"),
42
42
  add_state_tree_component: bp("Add StateTreeComponent. Params: blueprintPath", "add_state_tree_component"),
@@ -93,7 +93,8 @@ export const gameplayTool = categoryTool("gameplay", "Gameplay systems: physics,
93
93
  instanceProperties: z.record(z.unknown()).optional().describe("Property writes to apply to a freshly-spawned behavior instance"),
94
94
  senses: z.array(z.string()).optional(),
95
95
  senseType: z.string().optional(),
96
- settings: z.record(z.unknown()).optional(),
96
+ settings: z.record(z.unknown()).optional().describe("configure_sense: per-sense property writes (e.g. {SightRadius: 1500})"),
97
+ componentName: z.string().optional().describe("configure_sense: target AIPerceptionComponent name (default: first found)"),
97
98
  parentClass: z.string().optional(),
98
99
  defaults: z.record(z.string()).optional(),
99
100
  gameModePath: z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"gameplay.js","sourceRoot":"","sources":["../../src/tools/gameplay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gameplay.js","sourceRoot":"","sources":["../../src/tools/gameplay.ts"],"names":[],"mappings":"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"}
@@ -2766,7 +2766,7 @@ tasks:
2766
2766
  gameplay.configure_sense:
2767
2767
  class_path: ue-mcp.bridge
2768
2768
  group: gameplay
2769
- description: "Configure perception sense. Params: blueprintPath, senseType, settings?"
2769
+ description: "Add + configure an AI perception sense config on the blueprint's AIPerceptionComponent. Params: blueprintPath, senseType (Sight|Hearing|Damage|Touch|Team|Prediction|Blueprint), settings? ({SightRadius: ...}), componentName?"
2770
2770
  options:
2771
2771
  method: configure_ai_perception_sense
2772
2772
  gameplay.create_state_tree:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ue-mcp",
3
- "version": "1.0.72",
3
+ "version": "1.0.73",
4
4
  "description": "Unreal Engine MCP server - 21 tools, 548+ actions for AI-driven editor control",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -666,19 +666,31 @@ TSharedPtr<FJsonValue> FAnimationHandlers::ListAnimModifiers(const TSharedPtr<FJ
666
666
  if (!Seq) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *AssetPath));
667
667
 
668
668
  TArray<TSharedPtr<FJsonValue>> Arr;
669
- // AnimationModifiers is an editor-only sub-list stored as AppliedAnimationModifiers
670
- // in UE 5.7; surface whatever classes we find via property reflection for portability.
671
- FProperty* ModifiersProp = Seq->GetClass()->FindPropertyByName(TEXT("AppliedAnimationModifiers"));
669
+ // AppliedAnimationModifiers is an editor-only TArray<UAnimationModifier*> on the
670
+ // AnimSequence. Enumerate it via reflection (portable across module linkage):
671
+ // each element is an instanced UAnimationModifier subobject.
672
+ FArrayProperty* ModifiersProp = CastField<FArrayProperty>(
673
+ Seq->GetClass()->FindPropertyByName(TEXT("AppliedAnimationModifiers")));
672
674
  if (ModifiersProp)
673
675
  {
674
- TSharedPtr<FJsonObject> Info = MakeShared<FJsonObject>();
675
- Info->SetStringField(TEXT("note"), TEXT("Property reflection used — full modifier enumeration requires AnimationModifiers module linkage"));
676
- Arr.Add(MakeShared<FJsonValueObject>(Info));
676
+ FObjectPropertyBase* ElemProp = CastField<FObjectPropertyBase>(ModifiersProp->Inner);
677
+ FScriptArrayHelper Helper(ModifiersProp, ModifiersProp->ContainerPtrToValuePtr<void>(Seq));
678
+ for (int32 i = 0; i < Helper.Num(); ++i)
679
+ {
680
+ UObject* Modifier = ElemProp ? ElemProp->GetObjectPropertyValue(Helper.GetRawPtr(i)) : nullptr;
681
+ if (!Modifier) continue;
682
+ TSharedPtr<FJsonObject> M = MakeShared<FJsonObject>();
683
+ M->SetStringField(TEXT("class"), Modifier->GetClass()->GetName());
684
+ M->SetStringField(TEXT("classPath"), Modifier->GetClass()->GetPathName());
685
+ M->SetStringField(TEXT("name"), Modifier->GetName());
686
+ Arr.Add(MakeShared<FJsonValueObject>(M));
687
+ }
677
688
  }
678
689
 
679
690
  TSharedPtr<FJsonObject> Result = MCPSuccess();
680
691
  Result->SetStringField(TEXT("assetPath"), AssetPath);
681
692
  Result->SetArrayField(TEXT("modifiers"), Arr);
693
+ Result->SetNumberField(TEXT("count"), Arr.Num());
682
694
  return MCPResult(Result);
683
695
  }
684
696
 
@@ -1590,19 +1590,112 @@ TSharedPtr<FJsonValue> FGameplayHandlers::ConfigureAiPerceptionSense(const TShar
1590
1590
  SenseMap.Add(TEXT("Damage"), TEXT("AISenseConfig_Damage"));
1591
1591
  SenseMap.Add(TEXT("Touch"), TEXT("AISenseConfig_Touch"));
1592
1592
  SenseMap.Add(TEXT("Team"), TEXT("AISenseConfig_Team"));
1593
+ SenseMap.Add(TEXT("Prediction"), TEXT("AISenseConfig_Prediction"));
1594
+ SenseMap.Add(TEXT("Blueprint"), TEXT("AISenseConfig_Blueprint"));
1593
1595
 
1594
1596
  FString* SenseClassName = SenseMap.Find(SenseType);
1595
1597
  if (!SenseClassName)
1596
1598
  {
1597
- return MCPError(FString::Printf(TEXT("Unknown sense type: %s. Available: Sight, Hearing, Damage, Touch, Team"), *SenseType));
1599
+ return MCPError(FString::Printf(TEXT("Unknown sense type: %s. Available: Sight, Hearing, Damage, Touch, Team, Prediction, Blueprint"), *SenseType));
1598
1600
  }
1599
1601
 
1602
+ UClass* SenseCfgClass = FindObject<UClass>(nullptr, *FString::Printf(TEXT("/Script/AIModule.%s"), **SenseClassName));
1603
+ if (!SenseCfgClass)
1604
+ {
1605
+ return MCPError(FString::Printf(TEXT("Sense config class not found: %s. Enable AIModule."), **SenseClassName));
1606
+ }
1607
+
1608
+ UBlueprint* BP = Cast<UBlueprint>(UEditorAssetLibrary::LoadAsset(BPPath));
1609
+ if (!BP) return MCPError(FString::Printf(TEXT("Blueprint not found: %s"), *BPPath));
1610
+
1611
+ // Locate the AIPerceptionComponent template on the construction script.
1612
+ UClass* PercClass = FindObject<UClass>(nullptr, TEXT("/Script/AIModule.AIPerceptionComponent"));
1613
+ const FString CompName = OptionalString(Params, TEXT("componentName"));
1614
+ UObject* PercTemplate = nullptr;
1615
+ FString ResolvedComp;
1616
+ if (BP->SimpleConstructionScript)
1617
+ {
1618
+ for (USCS_Node* N : BP->SimpleConstructionScript->GetAllNodes())
1619
+ {
1620
+ if (!N || !N->ComponentTemplate) continue;
1621
+ const bool bIsPerc = PercClass
1622
+ ? N->ComponentTemplate->IsA(PercClass)
1623
+ : N->ComponentTemplate->GetClass()->GetName().Contains(TEXT("AIPerception"));
1624
+ if (!bIsPerc) continue;
1625
+ if (!CompName.IsEmpty() && N->GetVariableName() != FName(*CompName)) continue;
1626
+ PercTemplate = N->ComponentTemplate;
1627
+ ResolvedComp = N->GetVariableName().ToString();
1628
+ break;
1629
+ }
1630
+ }
1631
+ if (!PercTemplate)
1632
+ {
1633
+ return MCPError(TEXT("No AIPerceptionComponent on the blueprint - run add_perception_component first"));
1634
+ }
1635
+
1636
+ // Add the sense config to SensesConfig via reflection (avoids linking AIModule
1637
+ // headers and matches what the editor's '+' button does).
1638
+ FArrayProperty* SensesProp = CastField<FArrayProperty>(PercTemplate->GetClass()->FindPropertyByName(TEXT("SensesConfig")));
1639
+ FObjectPropertyBase* ElemProp = SensesProp ? CastField<FObjectPropertyBase>(SensesProp->Inner) : nullptr;
1640
+ if (!SensesProp || !ElemProp)
1641
+ {
1642
+ return MCPError(TEXT("SensesConfig object-array property not found on AIPerceptionComponent (engine drift)"));
1643
+ }
1644
+
1645
+ FScriptArrayHelper Helper(SensesProp, SensesProp->ContainerPtrToValuePtr<void>(PercTemplate));
1646
+ for (int32 i = 0; i < Helper.Num(); ++i)
1647
+ {
1648
+ UObject* Existing = ElemProp->GetObjectPropertyValue(Helper.GetRawPtr(i));
1649
+ if (Existing && Existing->GetClass() == SenseCfgClass)
1650
+ {
1651
+ auto Ex = MCPSuccess();
1652
+ MCPSetExisted(Ex);
1653
+ Ex->SetStringField(TEXT("blueprintPath"), BPPath);
1654
+ Ex->SetStringField(TEXT("component"), ResolvedComp);
1655
+ Ex->SetStringField(TEXT("senseType"), SenseType);
1656
+ Ex->SetStringField(TEXT("senseConfig"), SenseCfgClass->GetName());
1657
+ return MCPResult(Ex);
1658
+ }
1659
+ }
1660
+
1661
+ UObject* Cfg = NewObject<UObject>(PercTemplate, SenseCfgClass, NAME_None, RF_Transactional);
1662
+ const int32 NewIdx = Helper.AddValue();
1663
+ ElemProp->SetObjectPropertyValue(Helper.GetRawPtr(NewIdx), Cfg);
1664
+
1665
+ // Optional per-sense tuning (e.g. { "SightRadius": 1500 }).
1666
+ TArray<FString> AppliedProps;
1667
+ const TSharedPtr<FJsonObject>* PropsObj = nullptr;
1668
+ if (Params->TryGetObjectField(TEXT("settings"), PropsObj) && PropsObj && (*PropsObj).IsValid())
1669
+ {
1670
+ for (const auto& KV : (*PropsObj)->Values)
1671
+ {
1672
+ FProperty* P = Cfg->GetClass()->FindPropertyByName(FName(*KV.Key));
1673
+ if (!P) continue;
1674
+ FString PErr;
1675
+ if (MCPJsonProperty::SetJsonOnProperty(P, P->ContainerPtrToValuePtr<void>(Cfg), KV.Value, PErr))
1676
+ {
1677
+ AppliedProps.Add(KV.Key);
1678
+ }
1679
+ }
1680
+ }
1681
+
1682
+ FKismetEditorUtilities::CompileBlueprint(BP);
1683
+ SaveAssetPackage(BP);
1684
+
1600
1685
  auto Result = MCPSuccess();
1686
+ MCPSetCreated(Result);
1601
1687
  Result->SetStringField(TEXT("blueprintPath"), BPPath);
1688
+ Result->SetStringField(TEXT("component"), ResolvedComp);
1602
1689
  Result->SetStringField(TEXT("senseType"), SenseType);
1603
- Result->SetStringField(TEXT("senseClass"), *SenseClassName);
1604
- Result->SetStringField(TEXT("note"), FString::Printf(TEXT("Use editor.execute_python to fully configure %s properties."), **SenseClassName));
1690
+ Result->SetStringField(TEXT("senseConfig"), Cfg->GetClass()->GetName());
1691
+ if (AppliedProps.Num() > 0)
1692
+ {
1693
+ TArray<TSharedPtr<FJsonValue>> A;
1694
+ for (const FString& S : AppliedProps) A.Add(MakeShared<FJsonValueString>(S));
1695
+ Result->SetArrayField(TEXT("appliedProperties"), A);
1696
+ }
1605
1697
 
1698
+ // Rollback: removing the sense again isn't a first-class action; report intent.
1606
1699
  return MCPResult(Result);
1607
1700
  }
1608
1701
 
@@ -24,6 +24,37 @@
24
24
  #include "AbilitySystemComponent.h"
25
25
  #include "AttributeSet.h"
26
26
  #include "Engine/DataTable.h"
27
+ #include "GameplayEffect.h"
28
+ #include "GameplayEffectTypes.h"
29
+ #include "ScalableFloat.h"
30
+ #include "GameplayTagsManager.h"
31
+
32
+ // Resolve a FGameplayAttribute by name across every loaded AttributeSet
33
+ // subclass. Accepts a bare property name ("Health") or a qualified
34
+ // "SetClassSubstring.Attribute". Returns an invalid attribute on miss.
35
+ static FGameplayAttribute FindGameplayAttributeByName(const FString& Name)
36
+ {
37
+ FString SetFilter, AttrName = Name;
38
+ if (Name.Contains(TEXT(".")))
39
+ {
40
+ Name.Split(TEXT("."), &SetFilter, &AttrName);
41
+ }
42
+ for (TObjectIterator<UClass> It; It; ++It)
43
+ {
44
+ UClass* C = *It;
45
+ if (C == UAttributeSet::StaticClass() || !C->IsChildOf(UAttributeSet::StaticClass())) continue;
46
+ if (!SetFilter.IsEmpty() && !C->GetName().Contains(SetFilter)) continue;
47
+ for (TFieldIterator<FProperty> P(C); P; ++P)
48
+ {
49
+ FStructProperty* SP = CastField<FStructProperty>(*P);
50
+ if (SP && SP->Struct == FGameplayAttributeData::StaticStruct() && SP->GetName() == AttrName)
51
+ {
52
+ return FGameplayAttribute(SP);
53
+ }
54
+ }
55
+ }
56
+ return FGameplayAttribute();
57
+ }
27
58
 
28
59
  void FGasHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
29
60
  {
@@ -327,38 +358,70 @@ TSharedPtr<FJsonValue> FGasHandlers::SetAbilityTags(const TSharedPtr<FJsonObject
327
358
  UObject* CDO = LoadBlueprintCDO<UObject>(AbilityPath, CdoErr);
328
359
  if (!CDO) return CdoErr;
329
360
 
330
- TSharedPtr<FJsonObject> TagsSet = MakeShared<FJsonObject>();
361
+ // param name -> FGameplayTagContainer UPROPERTY on UGameplayAbility.
362
+ const TArray<TPair<FString, FString>> TagMap = {
363
+ {TEXT("ability_tags"), TEXT("AbilityTags")},
364
+ {TEXT("cancel_abilities_with_tag"), TEXT("CancelAbilitiesWithTag")},
365
+ {TEXT("block_abilities_with_tag"), TEXT("BlockAbilitiesWithTag")},
366
+ {TEXT("activation_required_tags"), TEXT("ActivationRequiredTags")},
367
+ {TEXT("activation_blocked_tags"), TEXT("ActivationBlockedTags")},
368
+ };
331
369
 
332
- // Process each tag property
333
- TArray<FString> TagProps = {TEXT("AbilityTags"), TEXT("CancelAbilitiesWithTag"), TEXT("BlockAbilitiesWithTag"), TEXT("ActivationRequiredTags"), TEXT("ActivationBlockedTags")};
334
- TArray<FString> ParamNames = {TEXT("ability_tags"), TEXT("cancel_abilities_with_tag"), TEXT("block_abilities_with_tag"), TEXT("activation_required_tags"), TEXT("activation_blocked_tags")};
370
+ TSharedPtr<FJsonObject> Applied = MakeShared<FJsonObject>();
371
+ TArray<FString> Unsupported;
372
+ bool bAnyApplied = false;
335
373
 
336
- for (int32 i = 0; i < TagProps.Num(); i++)
374
+ for (const TPair<FString, FString>& Entry : TagMap)
337
375
  {
338
- const TArray<TSharedPtr<FJsonValue>>* TagArray;
339
- if (Params->TryGetArrayField(*ParamNames[i], TagArray))
376
+ const TArray<TSharedPtr<FJsonValue>>* TagArray = nullptr;
377
+ if (!Params->TryGetArrayField(*Entry.Key, TagArray) || !TagArray) continue;
378
+
379
+ FStructProperty* Prop = CastField<FStructProperty>(CDO->GetClass()->FindPropertyByName(*Entry.Value));
380
+ if (!Prop || Prop->Struct != FGameplayTagContainer::StaticStruct())
381
+ {
382
+ // Engine-version drift (e.g. AbilityTags deprecated): report, don't fake.
383
+ Unsupported.Add(Entry.Value);
384
+ continue;
385
+ }
386
+
387
+ FGameplayTagContainer* Container = Prop->ContainerPtrToValuePtr<FGameplayTagContainer>(CDO);
388
+ Container->Reset();
389
+ TArray<TSharedPtr<FJsonValue>> Wrote;
390
+ for (const TSharedPtr<FJsonValue>& TagVal : *TagArray)
340
391
  {
341
- FProperty* Prop = CDO->GetClass()->FindPropertyByName(*TagProps[i]);
342
- if (Prop)
392
+ FString TagStr;
393
+ if (!TagVal.IsValid() || !TagVal->TryGetString(TagStr)) continue;
394
+ const FGameplayTag Tag = FGameplayTag::RequestGameplayTag(FName(*TagStr), /*ErrorIfNotFound*/ false);
395
+ if (Tag.IsValid())
343
396
  {
344
- TArray<TSharedPtr<FJsonValue>> AddedTags;
345
- for (const auto& TagVal : *TagArray)
346
- {
347
- FString TagStr;
348
- if (TagVal->TryGetString(TagStr))
349
- {
350
- AddedTags.Add(MakeShared<FJsonValueString>(TagStr));
351
- }
352
- }
353
- TagsSet->SetArrayField(ParamNames[i], AddedTags);
397
+ Container->AddTag(Tag);
398
+ Wrote.Add(MakeShared<FJsonValueString>(TagStr));
399
+ }
400
+ else
401
+ {
402
+ Wrote.Add(MakeShared<FJsonValueString>(TagStr + TEXT(" (unregistered tag - skipped)")));
354
403
  }
355
404
  }
405
+ Applied->SetArrayField(Entry.Key, Wrote);
406
+ bAnyApplied = true;
407
+ }
408
+
409
+ if (bAnyApplied)
410
+ {
411
+ CDO->MarkPackageDirty();
412
+ SaveAssetPackage(CDO);
356
413
  }
357
414
 
358
415
  auto Result = MCPSuccess();
416
+ MCPSetUpdated(Result);
359
417
  Result->SetStringField(TEXT("abilityPath"), AbilityPath);
360
- Result->SetObjectField(TEXT("tagsSet"), TagsSet);
361
- Result->SetStringField(TEXT("note"), TEXT("Tag container modification via C++ reflection is limited. Use execute_python for full tag manipulation."));
418
+ Result->SetObjectField(TEXT("applied"), Applied);
419
+ if (Unsupported.Num() > 0)
420
+ {
421
+ TArray<TSharedPtr<FJsonValue>> U;
422
+ for (const FString& S : Unsupported) U.Add(MakeShared<FJsonValueString>(S));
423
+ Result->SetArrayField(TEXT("unsupportedProperties"), U);
424
+ }
362
425
  return MCPResult(Result);
363
426
  }
364
427
 
@@ -370,15 +433,59 @@ TSharedPtr<FJsonValue> FGasHandlers::SetEffectModifier(const TSharedPtr<FJsonObj
370
433
  FString Attribute;
371
434
  if (auto Err = RequireString(Params, TEXT("attribute"), Attribute)) return Err;
372
435
 
373
- FString Operation = OptionalString(Params, TEXT("operation"), TEXT("Additive"));
374
- double Magnitude = OptionalNumber(Params, TEXT("magnitude"), 0.0);
436
+ const FString Operation = OptionalString(Params, TEXT("operation"), TEXT("Additive"));
437
+ const double Magnitude = OptionalNumber(Params, TEXT("magnitude"), 0.0);
438
+
439
+ TSharedPtr<FJsonValue> CdoErr;
440
+ UGameplayEffect* GE = LoadBlueprintCDO<UGameplayEffect>(EffectPath, CdoErr);
441
+ if (!GE) return CdoErr;
442
+
443
+ const FGameplayAttribute GAttr = FindGameplayAttributeByName(Attribute);
444
+ if (!GAttr.IsValid())
445
+ {
446
+ return MCPError(FString::Printf(
447
+ TEXT("Attribute not found: %s. Use 'SetName.Attribute' (or a unique attribute name); the AttributeSet must be compiled/loaded."), *Attribute));
448
+ }
449
+
450
+ const FString Op = Operation.ToLower();
451
+ EGameplayModOp::Type ModOp;
452
+ if (Op == TEXT("additive") || Op == TEXT("add")) ModOp = EGameplayModOp::Additive;
453
+ else if (Op == TEXT("multiplicative") || Op == TEXT("multiply") || Op == TEXT("multiplicitive")) ModOp = EGameplayModOp::Multiplicitive;
454
+ else if (Op == TEXT("division") || Op == TEXT("divide")) ModOp = EGameplayModOp::Division;
455
+ else if (Op == TEXT("override")) ModOp = EGameplayModOp::Override;
456
+ else return MCPError(FString::Printf(TEXT("Unknown operation '%s' (Additive|Multiplicative|Division|Override)"), *Operation));
457
+
458
+ // Update an existing modifier for the same attribute+op, else append one.
459
+ bool bUpdated = false;
460
+ for (FGameplayModifierInfo& M : GE->Modifiers)
461
+ {
462
+ if (M.Attribute == GAttr && M.ModifierOp == ModOp)
463
+ {
464
+ M.ModifierMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(static_cast<float>(Magnitude)));
465
+ bUpdated = true;
466
+ break;
467
+ }
468
+ }
469
+ if (!bUpdated)
470
+ {
471
+ FGameplayModifierInfo ModInfo;
472
+ ModInfo.Attribute = GAttr;
473
+ ModInfo.ModifierOp = ModOp;
474
+ ModInfo.ModifierMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(static_cast<float>(Magnitude)));
475
+ GE->Modifiers.Add(ModInfo);
476
+ }
477
+
478
+ GE->MarkPackageDirty();
479
+ SaveAssetPackage(GE);
375
480
 
376
481
  auto Result = MCPSuccess();
482
+ MCPSetUpdated(Result);
377
483
  Result->SetStringField(TEXT("effectPath"), EffectPath);
378
- Result->SetStringField(TEXT("attribute"), Attribute);
484
+ Result->SetStringField(TEXT("attribute"), GAttr.GetName());
379
485
  Result->SetStringField(TEXT("operation"), Operation);
380
486
  Result->SetNumberField(TEXT("magnitude"), Magnitude);
381
- Result->SetStringField(TEXT("note"), TEXT("GameplayEffect modifier configuration set. Use execute_python for full GE modifier array manipulation."));
487
+ Result->SetBoolField(TEXT("replacedExisting"), bUpdated);
488
+ Result->SetNumberField(TEXT("modifierCount"), GE->Modifiers.Num());
382
489
  return MCPResult(Result);
383
490
  }
384
491
 
@@ -589,12 +589,13 @@ TSharedPtr<FJsonValue> FNiagaraHandlers::SetEmitterProperty(const TSharedPtr<FJs
589
589
  bool bSet = false;
590
590
  if (PropName.Equals(TEXT("enabled"), ESearchCase::IgnoreCase))
591
591
  {
592
- // Can't directly set enabled on versioned data, but can toggle handle
593
- // Use mutable access pattern
592
+ const bool bEnabled = Value.ToBool();
594
593
  System->Modify();
595
- // SetIsEnabled is not const-accessible, note for the user
594
+ // GetEmitterHandles() is const; the editor mutates via a non-const handle.
595
+ FNiagaraEmitterHandle& MutableHandle = const_cast<FNiagaraEmitterHandle&>(Handles[TargetIdx]);
596
+ MutableHandle.SetIsEnabled(bEnabled, *System, /*bRecompileIfChanged*/ true);
596
597
  bSet = true;
597
- Result->SetStringField(TEXT("note"), TEXT("Use get_info to check enabled state. For toggling, use execute_python."));
598
+ Result->SetBoolField(TEXT("enabled"), bEnabled);
598
599
  }
599
600
 
600
601
  // Try reflection on the EmitterData's properties