关于 narshamcp
NarshaMCP 是本地 Unreal Engine MCP 服务,以 NarshaADK 名称在 Fab 分发。它提供 C++ 符号和二进制资源分析,以及 Blueprint、构建错误、AI 图表等项目数据工具;许多读取操作可在编辑器关闭时使用。
主要功能
- 01C++ PDB 符号与调用分析
- 02Blueprint 和 .uasset 检查
- 03构建日志错误扫描与修复
- 04StateTree 和 Behavior Tree 分析
- 05资源、配置与执行流搜索
适用场景
- 01追踪 C++ 与 Blueprint 间的调用
- 02检查 Blueprint 事件、变量和节点
- 03查找构建错误的可能修复方法
- 04在编辑器关闭时探索项目资源
MCP 相关
它作为本地 MCP 服务运行,向 MCP 客户端提供 Unreal Engine 项目分析和编辑工具。编辑操作需要 Unreal Editor;大多数读取操作可在编辑器关闭时运行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
NarshaADK:Unreal Engine MCP 服务
NarshaMCP 是一个 Unreal Engine MCP 服务。它以 NarshaADK 的名称在 Fab 上发布。
它会解析 C++ 源代码、PDB 符号和二进制 .uasset 文件,并通过 MCP 提供解析结果。它已通过 Claude Code 和 Codex 测试。大多数读取操作都可在 Unreal Editor 关闭时直接从磁盘进行;编辑则需要打开 Editor。
UE 5.7 UE 5.8 Early Access
Early Access。 不同版本中的工具名称、参数和输出格式可能会有所变化。
Fab 产品名为 NarshaADK。已安装的插件文件夹、代码模块和运行时可执行文件均名为 NarshaMCP。
快速开始
运行时是插件内预构建的 Windows 64 位可执行文件,会在你的计算机上运行。没有托管的 MCP 端点,也不需要 Python 或 Node.js。
- 在 Unreal Engine 5.7 或 5.8 的 C++ 项目中,从 Fab 安装 NarshaADK 并启用 NarshaMCP 插件,或者从最新版本下载适用于你的引擎版本的 ZIP,并解压到
YourProject/Plugins/。 - 构建一次 C++ 项目。首次构建会写入项目的 MCP 配置。
- 如果你手动配置客户端,请将其指向插件内附带的运行时:
{
"mcpServers": {
"narshamcp": {
"command": "<Project>/Plugins/NarshaMCP/Source/ThirdParty/bin/narshamcp.exe",
"args": ["connect", "--project-path", "<Project>"],
"env": { "RUST_LOG": "error" }
}
}
}
Fab 会将插件安装到引擎的 Plugins 文件夹中(<UE>/Engine/Plugins/Marketplace/NarshaMCP 或 <UE>/Engine/Plugins/Fab/NarshaMCP,其中 <UE> 是引擎安装文件夹),而非项目中。若通过 Fab 安装,请在命令中将 <Project>/Plugins/NarshaMCP 替换为该插件文件夹。对于以独立进程方式启动服务的客户端(例如 Cursor),请使用 --stdio 替代 connect。
完整步骤请参阅要求、安装和连接 MCP 客户端。
可以做什么
大多数工具都接受 operation 参数。下表列出了常见的读取操作。ue_tool_docs 会返回所有操作及其参数,客户端可通过 tools/list 列出工具。
| 工具 | 返回内容 | 读取操作 | 编辑器已关闭 | 成熟度 |
|---|---|---|---|---|
ue_analyze_symbols | 项目 PDB 中的符号、调用方、被调用方和类层次结构;将 C++/Blueprint 交叉引用与 Blueprint 包进行匹配 | search_symbols、find_callers、find_callees、trace_hierarchy、find_cpp_to_bp、find_bp_to_cpp、impact_analysis | 是 | 生产级 |
ue_manage_blueprint | Blueprint 资源的事件、节点、变量及默认值、父类和 AnimGraph | get_event_graph、get_raw_nodes、search_variables、get_variable_default、get_blueprint_metadata、list_blueprints、get_animgraph | 是;编辑需要打开编辑器 | Beta |
ue_fix_errors | 与修复方案相匹配的构建日志错误:缺失的 #include、缺失的 Build.cs 模块 | scan_build_log、preflight、preview | 是;build_and_fix 会运行构建,get_compiler_results 需要打开编辑器 | Beta |
ue_manage_ai | StateTree 和 Behavior Tree 的状态、任务、转换和绑定 | get_summary、get_structure、find_transitions、get_bindings | 是;编辑需要打开编辑器 | 生产级 |
ue_manage_material | Material 节点拓扑、图表摘要和实例层次结构 | get_graph_summary、get_nodes、get_hierarchy、search_materials | 是;基于名称的边需要打开编辑器 | 实验性 |
ue_manage_niagara | Niagara 系统、发射器、渲染器和参数 | get_emitter_details、get_structure、get_parameters、search_systems | 是 | 实验性 |
ue_manage_pcg | PCG 图表节点和流程 | get_structure、trace_flow、find_nodes、search_graphs | 是 | 实验性 |
ue_search_assets | 资源搜索和 DataTable 行;首次加载引用索引时,可能会在项目中保存缓存 | search、get_table、find_dependencies、find_references、find_impact | 是 | Beta |
ue_analyze_config | 跨引擎和项目层级的配置值;控制台变量声明 | search_config、explain_config、explore_cvar | 是 | Beta |
ue_trace_execution | 跨输入、技能、Blueprint 和 C++ 的执行路径 | trace_execution_flow、trace_from_input、trace_ability_flow、trace_gameplay_tag | 是 | Beta |
ue_generate_code | 带有 Unreal 宏和模块设置的 C++ 类框架 | generate_class | 是;返回文件内容供你保存 | Beta |
ue_grep、ue_glob、ue_read | 跨源代码、资源和配置的文本及名称搜索 | query、pattern 或 identifier;无 operation | 是 | 实验性 |
ue_check_health 会报告运行时版本以及索引是否已就绪。
使用前后对比
每个示例都展示请求、MCP 工具调用和 JSON 响应。内容采集自 NarshaMCP v0.13.7,在 Epic 的 Lyra Starter Game(UE 5.8.1)中进行,且编辑器已关闭。值与返回结果一致;已移除的键和数组元素会在代码块中标出。
C++ 和 Blueprint 交叉引用
请求。 哪些 Blueprint 调用了 StartRangedWeaponTargeting,GA_Weapon_Fire 调用了哪些 C++ 内容,以及哪些类派生自 ALyraCharacter?
之前。 grep -rn StartRangedWeaponTargeting 可以找到 C++ 声明和定义。Blueprint 调用位置位于二进制 .uasset 包中。
调用。 编辑器已关闭。
{"name": "ue_analyze_symbols", "arguments": {"operation": "find_cpp_to_bp", "function_name": "ULyraGameplayAbility_RangedWeapon::StartRangedWeaponTargeting", "limit": 5}}
输出。 与返回结果一致;截断处已标出。
{
"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
}
调用。 编辑器已关闭。
{"name": "ue_analyze_symbols", "arguments": {"operation": "find_bp_to_cpp", "blueprint_name": "GA_Weapon_Fire", "limit": 2, "offset": 18}}
输出。 与返回结果一致;截断处已标出。
{
"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
}
调用。 编辑器已关闭。
{"name": "ue_analyze_symbols", "arguments": {"operation": "trace_hierarchy", "class_name": "ALyraCharacter", "direction": "down"}}
输出。 与返回结果一致;截断处已标出。
{
"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
}
结果。 owning_function 是包含该调用的 Blueprint 事件,match_tier 和 confidence 记录了符号与节点的匹配方式。descendants[].source 对 C++ 子类为 pdb,对 Blueprint 子类为 blueprint。
蓝图事件、变量和节点
请求。 GA_Weapon_Fire 处理哪些事件,其开火延迟是多少,节点如何连线?
之前。 Content/Weapons/GA_Weapon_Fire.uasset 是二进制文件,在源代码中运行 grep -rn FireDelayTimeSecs 也找不到任何内容:该变量只存在于资源中。
调用。 编辑器已关闭。
{"name": "ue_manage_blueprint", "arguments": {"operation": "get_event_graph", "blueprint_name": "GA_Weapon_Fire"}}
输出。 按原样返回;省略部分已标记。
{
"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
}
调用。 编辑器已关闭。
{"name": "ue_manage_blueprint", "arguments": {"operation": "search_variables", "blueprint_name": "GA_Weapon_Fire", "pattern": "*Fire*"}}
输出。 按原样返回;省略部分已标记。
{
"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
}
调用。 编辑器已关闭。
{"name": "ue_manage_blueprint", "arguments": {"operation": "get_raw_nodes", "blueprint_name": "GA_Weapon_Fire", "page": 1, "page_size": 1}}
输出。 按原样返回;省略部分已标记。
{
"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
}
结果。 parent_class、events[].node_title 和 results[].default_value 均从 .uasset 中读取。pins[].linked_to 会列出每个引脚所连接的节点和引脚;当同一资源内出现重复的节点 ID 时,export_index 用于标识端点。
材质图摘要
请求。 M_TeamColorBasic 是如何构建的?
之前。 M_TeamColorBasic.uasset 是二进制文件;表达式图不在任何文本文件中。
调用。 编辑器已关闭。
{"name": "ue_manage_material", "arguments": {"operation": "get_graph_summary", "material_path": "/Game/Characters/Cosmetics/M_TeamColorBasic"}}
输出。 按原样返回;省略部分已标记。
{
"material_name": "M_TeamColorBasic",
"source": "uasset_metadata_cache",
"node_count": 4,
"connection_count": 3,
"stage_count": 3,
"output_chains": [
{"output_pin": "Material", "root_node": "MaterialExpressionVectorParameter_3", "upstream_node_count": 1},
{"output_pin": "Material", "root_node": "MaterialExpressionAdd_0", "upstream_node_count": 4}
]
// [truncated] output_chains: 2 of 3 elements; output_chains[] fields omitted: exclusive_node_count, role, top_node_types; keys omitted: 6 of 12
}
结果。 编辑器关闭时,响应会提供节点数、连接数,以及每个输出链的根节点。ue_manage_material 处于实验阶段;编辑器运行时,其 get_nodes 操作会额外提供节点名称和基于名称的边。
StateTree 状态和转换
请求。 L_STT_FollowPlayer StateTree 的作用是什么?
之前。 L_STT_FollowPlayer.uasset 是二进制文件,在源代码中运行 grep -rn L_STT_FollowPlayer 也找不到任何内容:没有代码描述这棵树。
调用。 编辑器已关闭。
{"name": "ue_manage_ai", "arguments": {"operation": "get_summary", "ai_type": "statetree", "asset_name": "L_STT_FollowPlayer"}}
输出。 按原样返回;省略部分已标记。
{
"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
}
结果。 states[].tasks 列出每个状态的任务,states[].transitions[].to_state 列出该状态的外向转换。
Niagara 发射器
请求。 NS_ImpactGlass 的 NE_ImpactCore 发射器会渲染什么?
之前。 NS_ImpactGlass.uasset 是二进制文件。
调用。 编辑器已关闭。
{"name": "ue_manage_niagara", "arguments": {"operation": "get_emitter_details", "asset_name": "NS_ImpactGlass", "emitter_name": "NE_ImpactCore"}}
输出。 按原样返回;省略部分已标记。
{
"system_name": "NS_ImpactGlass",
"emitter_name": "NE_ImpactCore",
"emitter_data": {
"loop_behavior": "Once",
"renderer_count": 2,
"renderers": [
{"renderer_type": "NiagaraSpriteRendererProperties", "facing_mode": "FaceCamera"},
{"renderer_type": "NiagaraSpriteRendererProperties", "facing_mode": "FaceCamera"}
],
"data_interface_count": 2,
"data_interfaces": [
{"di_type": "NiagaraDataInterfaceArrayFloat3"},
{"di_type": "NiagaraDataInterfaceArrayPosition"}
]
}
// [truncated] emitter_data.renderers[] fields omitted: 5 of 7; emitter_data.data_interfaces[] fields omitted: name; emitter_data fields omitted: 21 of 26; keys omitted: mode, operation, requested_path, success
}
结果。 renderers[].renderer_type 是渲染器类,data_interfaces[].di_type 是数据接口类型。ue_manage_niagara 处于实验阶段。
动画蓝图图表
请求。 ABP_Mannequin_Base 有多大,目标骨架是什么?
之前。 ABP_Mannequin_Base.uasset 是二进制文件。
调用。 编辑器已关闭。
{"name": "ue_manage_blueprint", "arguments": {"operation": "get_animgraph", "blueprint_name": "ABP_Mannequin_Base", "detail_level": "summary"}}
输出。 按原样返回;省略部分已标记。
{
"blueprint_name": "ABP_Mannequin_Base",
"target_skeleton": "SK_Mannequin",
"source": "metadata_category:anim_blueprints",
"anim_graph_node_count": 138,
"state_machine_count": 1,
"pose_link_count": 25,
"anim_node_types": {
"anim_state": 10,
"anim_state_transition": 27,
"anim_blend_space": 3,
"anim_linked_layer": 14
}
// [truncated] anim_node_types fields omitted: 15 of 19; keys omitted: 6 of 13
}
结果。 target_skeleton 指定骨架,anim_node_types 按类型统计图表中的节点数。提高 detail_level 可读取单个状态机。
PCG
Lyra 不包含 PCG 图,因此此处不展示 PCG。ue_manage_pcg 的 get_structure 可在编辑器关闭时读取 PCG 图,且处于实验阶段;它列于下方的对比表中。
示意图,并非实际捕获的会话。对于 C2065: 'UAbilitySystemComponent': undeclared identifier,ue_fix_errors 会添加 #include,将 GameplayAbilities 添加到 Build.cs,并切换为 IAbilitySystemInterface。
Claude Code 中的会话
## 要求- Windows 64 位
- Unreal Engine 5.7 或 5.8 的 C++ 项目。不支持仅使用 Blueprint 的项目。
- Visual Studio 2022 和 Unreal Engine C++ 构建工具
- MCP 客户端。已使用 Claude Code 和 Codex 进行测试。AI 客户端是独立产品,可能需要单独订阅。
- 无需安装 Python 和 Node.js;运行时是插件 ZIP 内预构建的可执行文件。
安装
从 Fab 安装。 从 Fab 列表页 安装 NarshaADK,并在 C++ 项目中启用 NarshaMCP 插件。
从 GitHub Releases 安装
- 从最新版本下载适用于你的引擎版本的 ZIP。
- 将 ZIP 解压到
YourProject/Plugins/。ZIP 已包含NarshaMCP文件夹,因此插件会放在YourProject/Plugins/NarshaMCP/。升级时,请先删除之前的Plugins/NarshaMCP/文件夹;如果你可能需要回退,请保留一份副本。 - 构建一次 C++ 项目。首次构建会运行本地设置并写入项目的 MCP 配置,除非插件以仅插件模式安装。
- 打开本地控制面板的 AI Clients 部分,并确认 Claude Code 或 Codex 的连接。
- 在客户端中验证:调用
ue_check_health。它会返回status和version。首次启动时会为构建生成的 PDB 编制索引。索引构建期间,符号操作会返回"status": "symbol_index_loading",并在已知总量后附带progress对象;构建完成后再次调用。symbol_index_degraded_budget表示内存预算限制了索引范围,等待不会解决此问题。
连接 MCP 客户端
首次构建会为你写入项目的 MCP 配置。如果你要手动配置客户端,请将其指向插件自带的运行时:
{
"mcpServers": {
"narshamcp": {
"command": "<Project>/Plugins/NarshaMCP/Source/ThirdParty/bin/narshamcp.exe",
"args": ["connect", "--project-path", "<Project>"],
"env": { "RUST_LOG": "error" }
}
}
}
- Claude Code:
claude mcp add narshamcp -- "<Project>/Plugins/NarshaMCP/Source/ThirdParty/bin/narshamcp.exe" connect --project-path "<Project>" - Codex,在
~/.codex/config.toml中配置,路径使用正斜杠:
[mcp_servers.narshamcp]
command = "<Project>/Plugins/NarshaMCP/Source/ThirdParty/bin/narshamcp.exe"
args = ["connect", "--project-path", "<Project>"]
connect 会将客户端连接到项目的后台守护进程;如果守护进程尚未运行,则会启动它。对于 Cursor 等将服务作为直接进程启动的客户端,请使用 --stdio 替代 connect。
Fab 会将插件安装到引擎的 Plugins 文件夹下(<UE>/Engine/Plugins/Marketplace/NarshaMCP 或 <UE>/Engine/Plugins/Fab/NarshaMCP,其中 <UE> 是你的引擎安装文件夹),而不是项目中。对于 Fab 安装,请在上面的命令中将 <Project>/Plugins/NarshaMCP 替换为该插件文件夹。
工作原理
| 层 | NarshaADK 读取的内容 |
|---|---|
| 源代码分析 | C++ 源代码,并解析 UPROPERTY、UFUNCTION 和 DOREPLIFETIME 等宏 |
| 编译器符号索引 | 构建生成的 PDB 调试数据:类层次结构、调用图和符号查询 |
| 二进制资源解析 | .uasset 包,无需命令程序或编辑器。修改资源的操作需要编辑器正在运行 |
符号索引根据你自己的构建生成的 PDB 编制,因此涵盖项目中的类;如果已安装引擎的调试符号,也会涵盖引擎中的类。此过程需要成功构建一次。
UE 5.8 内置的 Unreal MCP 在编辑器中运行。NarshaMCP 从磁盘读取项目,因此可以关闭编辑器;它还会为 C++ 调用图编制 PDB 索引。下表逐项比较两者的读取能力。
目前还无法做到的事
- 无法读取已烘焙的资源。烘焙会从打包后的游戏数据中移除编辑器节点图。
- Blueprint 数据引脚仅作为连接返回;不会计算其值。只追踪执行顺序。
- 对潜伏、异步和委托边的处理是近似的。
- 不支持纯 Blueprint 项目;必须使用 C++ 项目。
- 每项创建或编辑资源的操作、生成 Actor、自动化测试、
ue_fix_errorsget_compiler_results,以及ue_manage_materialget_nodes中的节点名称和基于名称的边,都需要运行中的 Editor。上表中列出的读取操作在 Editor 关闭时也能运行。 - 如果响应超出运行时的内联大小限制,系统会返回一个指向本地文件的
detail_handle,由ue_cache_controlresolve_detail_handle加载。可以请求范围更窄的读取,例如单个发射器或设置limit,以便在内联内容中获取数据。
与其他 Unreal MCP 服务相比,读取范围如何
各服务可以读取并提供给 Agent 的内容,以及 Editor 关闭时是否仍能读取。✅ 读取项目文件;无需运行 Editor · ● 在运行中的 Editor 中读取(设计如此)· — 不提供 · ? 在所示引脚处未经确认 · 上标 p = 部分支持。
| 读取内容 | NarshaADK v0.13.7 · 2026-09-13 | Unreal MCP(内置于 UE 5.8) UE 5.8.0 · 2026-06-27 | VibeUE kevinpbuckley/VibeUE@0ea59b3 · 2026-09-20(读取于 2026-09-22) | unreal-mcp(sam-david) sam-david/unreal-mcp@8b88ec3 · 2026-03-28(读取于 2026-09-22) | unreal-mcp(ZiggyMar) ZiggyMar/unreal-mcp@d1a8539 · 2026-09-07(读取于 2026-09-22) |
|---|---|---|---|---|---|
| Editor 关闭时读取 | ✅p | ● | ● | ✅p | ● |
| Blueprint 图表:节点、引脚、执行流 | ✅ | ● | ● | ? | ● |
| Blueprint 变量、函数、组件、默认值 | ✅ | ●p | ● | ●p | ● |
| 材质图表和表达式 | ✅p | ● | ● | ●p | ●p |
| Niagara 系统、发射器、模块 | ✅ | ● | ● | — | ●p |
| PCG 图表 | ✅ | ● | — | — | — |
| 动画 Blueprint、蒙太奇、混合空间 | ✅ | ●p | ●p | — | ●p |
| DataTable、结构体、枚举 | ✅ | ●p | ●p | — | ● |
| Widget / UMG 树 | ✅ | ● | ● | — | ● |
| 配置文件和控制台变量 | ✅p | ● | ● | — | ●p |
| 类层次结构:基类和祖先类 | ✅ | ●p | ●p | ●p | ● |
| 调用图:调用方和被调用方 | ✅ | — | — | — | ●p |
| 变更影响分析 | ✅ | ●p | ●p | ●p | ●p |
| 构建错误和日志 | ✅p | ●p | ●p | ✅p | ● |
| Unreal Insights 跟踪记录 | ✅ | — | ● | — | — |
| 资源引用和依赖项 | ✅ | ● | — | ● | ● |
| 创建或修改资源(写入) | ● | ● | ● | ● | ● |
其他服务更进一步之处
- 引擎内置服务作为引擎插件随 Unreal Engine 一同提供,无需单独下载。 NarshaADK 以独立插件包的形式安装,包内含有预构建的运行时。 (Unreal MCP(内置于 UE 5.8))
- sam-david 的服务通过引擎内置的 Python 远程执行功能驱动编辑器,因此大多数工具无需将插件编译到项目中即可使用。 NarshaADK 需要 C++ 项目(不支持仅使用蓝图的项目),而且读取符号时需要一次成功构建生成的 PDB 文件。 (sam-david/unreal-mcp@8b88ec3 · src/transports/connection-manager.ts、sam-david/unreal-mcp@8b88ec3 · src/transports/python-exec.ts、sam-david/unreal-mcp@8b88ec3 · src/tools/blueprint.ts)
- VibeUE 和 ZiggyMar 的服务采用 MIT 许可证开源,因此可以查看、分叉和修改。 NarshaADK 是一款商业产品:其 Unreal C++ 插件源代码随软件包提供,但其运行时的源代码不提供。 (kevinpbuckley/VibeUE@0ea59b3 · LICENSE、ZiggyMar/unreal-mcp@d1a8539 · LICENSE)
说明 — 每个标记涵盖和不涵盖的内容
- **关闭编辑器后读取 — NarshaADK:** 二进制资源解析、编译器符号索引、已解析的配置和构建日志解析都可在关闭编辑器后运行。标记为部分支持的行,其对应说明会指出该标记未涵盖的内容。写入资源、生成 Actor 和运行自动化需要编辑器。需要 C++ 项目,以及一次成功构建生成的 PDB;符号读取反映的是该次构建的结果,直到下一次构建。暂不支持已烘焙的资源。 - **关闭编辑器后读取 — Unreal MCP(内置于 UE 5.8):** 由编辑器通过 HTTP 提供的进程内工具集。此列是唯一不是从代码库读取得出的:它是在所示引擎版本下,通过枚举一个编辑器中的工具集实时测得的;工具集通过插件提供,因此枚举中缺少某个工具集,表示该安装中没有它,而不是引擎中没有它。 - **关闭编辑器后读取 — VibeUE:** 扩展编辑器自身的 MCP 端点;无需单独的服务。 - **关闭编辑器后读取 — unreal-mcp(sam-david):** 独立服务通过内置远程执行功能向编辑器发送 Python,并以 Remote Control API 作为后备,还可选用用于图表命令的桥接插件;只有构建工具可在关闭编辑器后读取,这些工具会将引擎构建工具作为子进程运行并返回解析后的编译器输出,而资源、Blueprint、材质、关卡和序列读取都需要编辑器。 - **关闭编辑器后读取 — unreal-mcp(ZiggyMar):** Node 服务通过本地 TCP 将工具调用转发给在编辑器内运行的 C++ 插件。日志、C++ 源代码和 C++ 编译工具可由服务进程读取文件或运行构建,但它们会先向编辑器查询项目位置。 - **Blueprint 图表:节点、引脚、执行流 — unreal-mcp(sam-david):** 图表节点列表工具会转发给一个可选的桥接插件,该插件的源代码在此提交中不包含于代码库;没有该插件时,工具会返回错误;无法核查该插件可能会返回的内容。 - **Blueprint 变量、函数、组件、默认值 — Unreal MCP(内置于 UE 5.8):** Blueprint 变量、函数和默认值都是具名读取;枚举结果中没有读取 Blueprint 组件列表的操作,因为 Blueprint 工具集中的组件单元用于绑定或列出事件,而读取组件的单元属于 Actor 工具集,并且需要一个已放置的 Actor。 - **Blueprint 变量、函数、组件、默认值 — unreal-mcp(sam-david):** 其 Blueprint 信息工具会返回父类和组件列表,后者通过生成临时 Actor 收集;其脚本读取的字段中不包含变量、函数和默认值,尽管工具说明中列出了这些内容。 - **材质图表和表达式 — NarshaADK:** 离线读取节点拓扑和图表摘要;编辑器运行时,按名称读取实时边。材质工具处于实验阶段。 - **材质图表和表达式 — unreal-mcp(sam-david):** 按名称和类列出材质的表达式节点;不会读取表达式之间的连接。 - **材质图表和表达式 — unreal-mcp(ZiggyMar):** 可读取材质公开的标量、颜色和纹理参数;没有读取表达式图表的工具,只有用于构建图表的写入工具。 - **Niagara 系统、发射器、模块 — unreal-mcp(sam-david):** Niagara 工具会生成系统并设置、重置或重新初始化其参数;没有工具会读取系统的发射器或模块。 - **Niagara 系统、发射器、模块 — unreal-mcp(ZiggyMar):** 可读取发射器、每个发射器是否已禁用,以及用户参数;不会读取发射器内部的模块。 - **PCG 图表 — VibeUE:** 自身没有 PCG 服务,且引擎的 PCG 工具集被列为未在此处启用;其技能文档将 PCG 操作交由引擎通用 Python 脚本处理,因此此处所有服务均不计标记。 - **PCG 图表 — unreal-mcp(sam-david):** 服务注册的模块中没有 PCG 工具。 - **PCG 图表 — unreal-mcp(ZiggyMar):** 注册的工具中没有 PCG 工具;只能通过直通工具委托给引擎内置服务来使用 PCG,因此此处不计标记。 - **动画 Blueprint、蒙太奇、混合空间 — Unreal MCP(内置于 UE 5.8):** 枚举到的骨骼网格体和物理资源工具集会返回骨骼、骨骼节点、插槽、变形目标和物理体;它们都不会返回动画 Blueprint 图表、蒙太奇的分段或混合空间。 - **动画 Blueprint、蒙太奇、混合空间 — VibeUE:** 可深入读取动画 Blueprint 图表和蒙太奇;混合空间仅会作为分配给播放器节点的资源路径出现,不会读取其内容。 - **动画 Blueprint、蒙太奇、混合空间 — unreal-mcp(sam-david):** 动画模块会创建动画 Blueprint 和蒙太奇,并读取动画序列的时长、帧数和骨架;没有工具会读取动画 Blueprint 图表、蒙太奇的分段或混合空间。 - **动画 Blueprint、蒙太奇、混合空间 — unreal-mcp(ZiggyMar):** 动画 Blueprint 状态机、状态和转换条件都有专用读取器;蒙太奇和混合空间没有各自的读取器,只能作为普通资源读取器返回的可编辑设置提供给 Agent。 - **DataTable、结构体、枚举 — Unreal MCP(内置于 UE 5.8):** DataTable 行和架构,以及通用对象属性列表;其行结构体工具会搜索行类型,而枚举中提到的唯一枚举读取位于 Niagara 工具集内。 - **DataTable、结构体、枚举 — VibeUE:** 由其自身服务读取枚举和结构体;此提交中没有 DataTable 服务头文件。DataTable 读取通过 VibeUE 扩展的端点上的 Epic 工具集提供给 Agent,因此标记在内置服务一列,而非此处。 - **DataTable、结构体、枚举 — unreal-mcp(sam-david):** 服务注册的模块中没有 DataTable、结构体或枚举工具。 - **Widget / UMG 树 — unreal-mcp(sam-david):** 唯一的 Widget 工具会在标签页中打开 Editor Utility Widget;没有工具会读取 Widget 树。 - **配置文件和控制台变量 — NarshaADK:** 从磁盘读取引擎和项目各层的配置文件;控制台变量是从引擎源代码解析出的声明、默认值和标志,并与这些层级的数据合并读取,而不是读取运行中引擎的当前值。 - **配置文件和控制台变量 — unreal-mcp(sam-david):** 服务注册的模块中没有读取 INI 或控制台变量的工具;插件工具会读取项目文件中的插件列表,而控制台命令通过通用命令工具执行,因此此处不计标记。 - **配置文件和控制台变量 — unreal-mcp(ZiggyMar):** 读取项目的默认 GameMode 和地图,以及旧版输入映射;没有工具会读取 INI 文件或控制台变量,控制台命令工具是通用控制台,而非配置读取器。 - **类层次结构:基类和继承关系 — Unreal MCP(内置于 UE 5.8):** 提供类查找、Blueprint 父类查找和子类搜索;枚举到的单元中没有返回类继承链的工具。 - **类层次结构:基类和继承关系 — VibeUE:** 其 Blueprint 服务会报告 Blueprint 自身的父类,可重写函数列表会列出每个函数所属的类;没有服务会返回继承链本身,也没有服务会报告 C++ 类层次结构。 - **类层次结构:基类和继承关系 — unreal-mcp(sam-david):** Blueprint 信息工具会报告 Blueprint 的直接父类;没有继承链遍历工具,也没有读取 C++ 类层次结构的工具。 - **调用图:调用方和被调用方 — Unreal MCP(内置于 UE 5.8):** 枚举到的工具集中没有符号或调用图工具。 - **调用图:调用方和被调用方 — VibeUE:** 其头文件中没有源代码或符号服务;用于发现模块、类和函数的桥接工具会检查编辑器的 Python API,而不是 C++ 调用方或被调用方。 - **调用图:调用方和被调用方 — unreal-mcp(sam-david):** 服务注册的模块中没有源代码或符号模块,因此不会读取 C++ 调用方和被调用方。 - **调用图:调用方和被调用方 — unreal-mcp(ZiggyMar):** 可读取函数的所有 Blueprint 调用点及其是否可执行,也可读取图表内按顺序排列的调用;不会追踪 C++ 代码中的调用。 - **变更影响分析 — Unreal MCP(内置于 UE 5.8):** 资源依赖项、引用方读取和子类搜索可回答对资源或类的更改会影响哪些内容;枚举结果中没有调用图,因此不会报告更改函数的影响。 - **变更影响分析 — VibeUE:** 只读查询会列出绑定到黑板键的所有 Behavior Tree 节点选择器,因此可预先评估重命名或移除的影响;没有服务会报告类或资源的更改会影响哪些内容。 - **变更影响分析 — unreal-mcp(sam-david):** 资源依赖项和引用方读取可回答对资源的更改会影响哪些内容;已注册的工具中没有任何工具会报告调用方或被调用方,因此不会报告更改函数的影响。 - **变更影响分析 — unreal-mcp(ZiggyMar):** 资源引用方读取,以及项目范围的 Blueprint 调用和变量追踪,可回答对资源、Blueprint 成员或由 Blueprint 调用的函数进行更改会影响哪些内容;不会追踪 C++ 代码中的调用,因此不会报告对其他 C++ 代码的影响。 - **构建错误和日志 — NarshaADK:** 可在关闭编辑器后检测并解析构建日志;实时编译器结果则从运行中的编辑器读取。 - **构建错误和日志 — Unreal MCP(内置于 UE 5.8):** 枚举到的日志工具集会返回编辑器日志条目;枚举中没有构建或编译器结果工具,因此编译器消息只能通过日志中的行提供给 Agent。 - **构建错误和日志 — VibeUE:** 桥接工具会返回编辑器日志条目,其自身的性能服务会在运行摘要中读取日志,而 Blueprint 服务会在编译 Blueprint 时返回其编译器消息;其构建流程使用 shell 脚本而非工具,因此不会读取 C++ 编译器输出。 - **构建错误和日志 — unreal-mcp(sam-david):** 其构建工具会在关闭编辑器后将引擎构建工具作为子进程运行,并返回从该输出中解析的编译器错误和警告;另一个工具会解析传入的构建日志。不会读取编辑器自身的日志。 - **Unreal Insights 跟踪 — Unreal MCP(内置于 UE 5.8):** 枚举到的工具中没有性能分析工具集。 - **Unreal Insights 跟踪 — unreal-mcp(sam-david):** 性能分析工具可启动和停止跟踪捕获或 CSV 性能分析,并发出 stat 命令;没有工具会读取已记录的跟踪数据。 - **Unreal Insights 跟踪 — unreal-mcp(ZiggyMar):** 注册的工具中没有性能分析或跟踪工具;控制台命令工具可发出 stat 命令,因此此处不计标记。 - **资源引用和依赖关系 — VibeUE:** 其自身的资源服务支持导入、导出、删除和选择;引用方只会作为尝试删除失败时的响应内容出现。引用和依赖关系查询通过 VibeUE 扩展的端点上的 Epic 工具集提供给 Agent,因此标记在内置服务一列,而非此处。 - **工具成熟度 — NarshaADK:** 此版本的工具成熟度:符号分析为 Production;Blueprint、配置、构建错误、资源搜索和 Sequencer 结构工具为 Beta;材质、Niagara、PCG 和 Insights 工具,以及 Sequencer 关键帧、播放和轨道工具均为 Experimental;Widget、动画和资源差异工具尚无成熟度评级。功能是否存在,是根据各对比开源项目在所示提交版本和日期的公开源代码、所示引擎版本内置服务的实时工具集枚举结果,以及 NarshaADK 在所示版本的自有工具注册表进行评估的。对比对象包括:发布了与其他 Unreal MCP 服务或引擎内置服务进行比较的内容的服务,以及作为基线的内置服务;并未涵盖所有 Unreal MCP 服务。这不是排名。如果证据仅支持比标记范围更窄的说法,README 中会有说明。与 Epic Games 或参与对比的项目无关联,也未获其认可。欢迎在本仓库的 Discussions 中提出更正。
支持的版本
| Unreal Engine | 插件包 |
|---|---|
| UE 5.8 | NarshaMCP-v<version>-UE5.8-Release-RustMCP.zip |
| UE 5.7 | NarshaMCP-v<version>-UE5.7-Release-RustMCP.zip |
每个版本均包含以下文件:
NarshaMCP-v<version>-UE5.7-Release-RustMCP.zip和NarshaMCP-v<version>-UE5.8-Release-RustMCP.zip是提交至 Fab 的同一款插件 ZIP。它们包含插件的 Unreal C++ 源代码,由你的项目构建,以及作为预构建可执行文件的运行时。运行时本身的源代码不包含在内。narshamcp-windows-x64.exe是独立的 Windows 运行时,与 ZIP 中的运行时逐字节相同。
每个版本的说明都会列出所有文件的 SHA-256 摘要。第三方软件声明随运行时一同提供:运行 narshamcp --licenses(或 narshamcp --licenses-json)。
许可证
NarshaADK 根据 Fab End User License Agreement(“Fab Standard License”)授权。从本仓库下载的副本由 Next Stage Inc. 直接按照相同条款授予:如果你连同任何控股实体以及与你受共同控制的任何实体,在过去 12 个月内从数字内容行业的商业活动中获得的收入未超过 Fab 收入门槛,则可免费适用 Personal tier(本文撰写时为 USD 100,000;Fab EULA 中注明了当前金额)。超过门槛则必须通过 Fab listing 获取 Professional license。LICENSE.md 载明该门槛及完整条款。
支持
文档和示例请见 narshaadk.ai。如有问题或要报告问题,请使用 Fab listing 上的支持渠道。
NarshaADK 由 Next Stage Inc. 构建并维护。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。

