Verse-MCP:基于Rust与MCP协议的UEFN开发AI助手工具
1. 项目概述一个为Verse和UEFN开发者准备的AI助手“外挂”如果你正在用Epic Games的UEFNUnreal Editor for Fortnite和Verse语言做Fortnite创意模式开发那你大概率经历过这样的痛苦编辑器里拖了个设备想用Verse代码控制它却死活找不到它在代码里到底叫什么名字UI界面写好了一到多人游戏就乱套状态在不同玩家之间“串门”最要命的是当你问AI助手比如Claude、Cursor的AI功能一个Verse API时它经常自信满满地给你编一个根本不存在的函数名——因为Verse太新了训练数据太少AI只能靠“猜”。这个叫verse-mcp的项目就是来解决这些“痛点”的。它是一个用Rust写的MCPModel Context Protocol服务器。简单说MCP就像是一个给AI助手用的“插件”或“工具箱”标准。这个verse-mcp工具箱里装了几件对UEFN开发者特别有用的工具它能直接扫描你地图项目里那些二进制的.uasset文件告诉你里面到底放了哪些设备、叫什么、怎么配置的它内置了一个Verse文档的搜索引擎能让AI的答案“落地”不再胡编乱造它还能帮你分析代码中的editable属性甚至提供多人游戏UI的编写模板。我作为一个从Web开发转战游戏开发的“新人”在UEFN里摸爬滚打了一阵后深感工具链的缺失。官方文档告诉你语法但没告诉你怎么把代码和编辑器里花花绿绿的界面连接起来。这个项目就是把我踩过的坑、需要的工具打包成了一个实实在在的、能和AI协同工作的命令行工具。无论你是刚接触Verse的新手还是想提升开发效率的老手这个工具都能让你少走很多弯路。2. 核心设计思路为什么是MCP以及它如何“读懂”你的地图2.1 为什么选择MCP协议在决定构建这个工具时我评估过几种方案写一个独立的桌面应用、开发编辑器插件、或者做一个VS Code扩展。最终选择基于MCP协议来构建服务器主要基于以下几点考量1. 生态兼容性与未来性MCP是由Anthropic推动的一个开放协议旨在让AI助手如Claude Desktop、Cursor等能够安全、标准化地调用外部工具和数据。它不是一个封闭的SDK而是一个协议标准。这意味着只要AI客户端支持MCP我的工具就能无缝接入无需为每个客户端单独开发适配。这避免了“一个编辑器一个插件”的碎片化困境。2. 关注点分离MCP服务器只负责提供“能力”——扫描地图、查询文档。它不关心UI如何呈现也不处理复杂的用户交互逻辑。这些由AI客户端来负责。这种架构让工具本身非常轻量和专注只需要用Rust写好核心的业务逻辑解析文件、检索数据并暴露成标准的MCP工具即可。3. 提升AI助手的可靠性这是最直接的动力。Verse的API和UEFN的实践知识散落在官方文档、社区帖子和实际的.uasset二进制文件中。通过MCP我可以让AI助手在回答问题时不是依赖它可能过时或错误的训练数据而是实时地去查询我提供的、经过处理的“事实来源”如文档索引、地图扫描结果。这从根本上减少了“幻觉”让AI的回答变得可验证、可追溯。2.2 核心技术选型Rust与.uasset解析项目的技术栈围绕“高效”和“可靠”两个核心构建。主语言Rust选择Rust而非Python或Node.js首要原因是性能和对系统级操作的支持。扫描一个大型UEFN项目可能涉及成千上万个.uasset文件这些文件可能分布在数GB的资产中。Rust的零成本抽象和强大的并发能力通过rayon库使得并行文件扫描和解析非常高效。其次内存安全特性保证了长时间运行的服务器稳定性避免了解释型语言在长时间运行后可能发生的内存泄漏问题。最后Rust优秀的打包能力可以将所有依赖包括SQLite文档数据库静态编译成一个单一的可执行文件vm分发和部署极其简单。核心挑战解析.uasset文件UEFN基于Unreal Engine 5将地图中放置的每一个设备Device、触发器Trigger、接收器Receiver的具体状态位置、旋转、属性配置都序列化成了二进制的.uasset文件存放在Content/__ExternalActors__和Content/__ExternalObjects__目录下。这些文件是Unreal Engine私有的资产格式没有公开的文本格式如JSON或XML。为了读取这些信息项目依赖了unreal_asset这个Rust库。这个库逆向工程了UE资产的文件格式允许我们以编程方式读取其中的数据块。我们的解析器主要做以下几件事遍历目录使用rayon并行遍历指定UEFN项目路径下的上述两个关键目录。解析二进制数据对每个.uasset文件使用unreal_asset解析其头部信息、导出对象列表。提取设备信息从解析出的对象数据中识别出代表“设备”的特定数据结构并提取关键字段device_type: 设备类型如TrackDummyJumpPad。label: 在编辑器中给设备设置的标签Name。triggers/receivers: 该设备连接到的触发器和接收器网络信息。properties: 在UEFN细节面板中配置的各种属性值如速度、伤害、开关状态。结构化输出将提取的信息按设备类型分组整理成JSON等结构化格式通过MCP工具返回。注意.uasset的格式可能随UE版本更新而变化。unreal_asset库在积极维护但依然存在解析新版本资产失败的风险。因此工具内置了缓存和强制刷新机制在解析异常时可以提供降级方案或明确报错。为什么不用官方Verse DigestEpic会提供一种称为“Digest”的托管Verse API索引文件。最初我也考虑过直接利用它。但Digest更多是关于API签名有哪些类、函数、参数而缺乏项目上下文。它无法告诉你“你的地图里到底放了一个叫‘超级跳板’的JumpPad设备”。而.uasset扫描恰恰补全了这最关键的项目上下文信息使得工具从“通用API查询”升级为“项目感知的智能助手”。3. 工具详解与实战应用verse-mcp目前主要提供了四个核心MCP工具。下面我们逐一拆解它们的功能、输入输出以及在实际开发中如何运用。3.1scan_map_devices你的地图设备清单生成器这是工具的基石功能。它直接窥探你的UEFN项目内部生成一份详细的设备部署报告。输入参数project_path(字符串必需): 你的UEFN项目根目录的绝对路径。例如/Users/YourName/Documents/MyUEFNProject。force_refresh(布尔值可选): 默认为false。如果设为true则会忽略缓存强制重新扫描所有.uasset文件。输出内容工具会返回一个结构化的JSON对象通常包含{ “scan_policy”: “fresh_scan” // 本次扫描的策略使用缓存、强制刷新、因文件变更而刷新等 “summary”: { “total_devices”: 47 “device_types_count”: 15 “scan_duration_ms”: 1200 } “devices_by_type”: { “JumpPad”: [ { “asset_path”: “Content/__ExternalActors__/Level/ABCDEF.uasset” “label”: “PlayerSpawnJump” “properties”: { “LaunchStrength”: 1500.0 “bEnabled”: true } “triggers”: [“TriggerVolume_1”] “receivers”: [] } ] “TrackDummy”: [ ... ] // ... 其他设备类型 } }实战场景与技巧设备引用查找这是最常用的场景。在Verse代码中你需要通过GetDevice或类似函数并传入一个DeviceName来获取设备引用。但这个DeviceName往往不是你在编辑器里看到的标签Label而是资产内部的一个唯一标识符。通过扫描你可以快速找到地图中所有TrackDummy设备并看到它们对应的asset_path或内部名称从而确定代码中该写什么。实操心得不要试图肉眼在编辑器里数设备或猜名字。尤其是当地图复杂、设备隐藏在各种预制体中时scan_map_devices是唯一可靠的全景图。我习惯在开始写任何设备交互代码前先跑一遍扫描把关键设备的标识符复制到代码注释里。属性配置检查你可以在UEFN细节面板里配置设备的属性如跳板的弹力。但有时你会忘记自己是否配置过或者配置的值是多少。扫描结果中的properties字段能一目了然地展示所有已配置的属性方便你在写代码时直接使用这些硬编码值或作为参考。触发器/接收器网络分析对于复杂的游戏逻辑设备之间通过触发器和接收器连线。扫描结果可以帮你可视化这个网络理解“按下这个按钮后会依次激活哪些设备”有助于调试逻辑链条。缓存机制解析为了提高性能工具实现了智能缓存。首次扫描一个项目路径时它会记录每个.uasset文件的最后修改时间mtime和解析结果。下次扫描时会先比较文件的mtime。只有当文件发生变化或用户明确指定force_refresh: true时才会重新解析。这避免了每次查询都进行全量I/O操作在大型项目上能节省数秒到数十秒的时间。如果你在UEFN编辑器中修改了地图并保存工具通常能自动检测到变化并更新缓存。3.2query-docsVerse文档的精准搜索引擎AI助手胡编乱造API这个工具就是解药。它内置了一个从官方Verse文档构建的SQLite索引支持语义搜索。输入参数query(字符串必需): 你的搜索查询。关键要具体limit(整数可选): 返回结果的数量默认可能为5或10。offset(整数可选): 用于分页跳过前N个结果。fetch_source_urls(布尔值可选): 是否在返回结果的同时去抓取并包含原始网页的内容。默认为false因为这会增加响应时间和数据量。max_fetches(整数可选): 当fetch_source_urls为true时限制抓取的URL数量。输出内容返回一个包含排名结果的列表每个结果通常包括title/heading: 文档标题。snippet: 匹配查询的文本片段。content: 该条目索引的完整文本内容默认就提供这是与一般搜索引擎不同的地方。source_url: 原始文档的URL。rank_score: 相关度分数。如果请求了fetch_source_urls还会包含fetched_content这是经过清洗和格式化的原始页面文本。设计哲学与使用约束这个工具不是为了替代浏览器搜索而是为了给AI提供“即时、准确、项目相关”的文档片段。因此它有几个重要的设计决策索引内容而非链接传统的搜索引擎只返回链接和摘要。而query-docs在构建索引时就将文档的正文内容代码示例、参数说明等提取并存储了。这意味着AI在得到搜索结果的同时就已经拿到了关键的参考信息无需再“点开链接猜测内容”。这大大提升了信息获取的效率和准确性。查询必须具体这是避免无效调用的关键。不要搜索“verse”或“uefn docs”这种宽泛的词。应该搜索像“editableproperty initialization syntax”或“GameUICreateWidgetfor multiplayer”这样具体的问题。好的查询应该包含关键词和上下文。调用频率限制在工具的实现说明中明确提到“每个问题不要调用此工具超过3次”。这是一个非常重要的实践准则。它迫使AI或使用AI的你在提问前先组织好思路用最精准的查询去获取信息而不是漫无目的地“试错”。如果3次还找不到说明可能需要重新构思问题或者所需信息可能不在当前索引中。实战示例假设你在写一个需要处理玩家输入的UI不确定该用哪个事件。差的查询“verse input events”(太宽泛)好的查询“Verse API for handling button click events on a CanvasWidget in UEFN with multiplayer context”AI结合使用的流程用户问AI“怎么在Verse里给按钮添加点击事件并且要能在多人游戏里工作”AI内部调用query-docs传入上述好的查询。工具返回排名最高的结果可能是关于CanvasButton的OnPressed事件以及关于Player上下文和网络复制的说明。AI根据返回的准确文档内容生成包含正确API名称和用法的代码示例并提醒你注意事件是否需要在服务器端执行。3.3fetch-doc-source获取完整的文档页面这是query-docs的补充工具。当query-docs返回的结果中某个source_url看起来特别相关但你或AI需要阅读该页面的全部内容而不仅仅是索引的片段时可以使用此工具。输入参数url(字符串必需): 从query-docs结果中获取的source_url。输出内容返回抓取、清理并格式化后的完整网页文本内容通常还会包含一些元数据如标题、主要章节。使用场景当你需要深入了解一个复杂的API或者查看一个完整的教程页面时。由于query-docs默认已经提供了索引的content大多数情况下不需要额外调用此工具。它主要用于“深度阅读”场景。3.4reload-project-metadata清除项目扫描缓存这个工具很简单但很重要。它用于手动清除指定项目的扫描缓存。输入参数project_path(字符串必需): 需要清除缓存的项目路径。工作原理与时机当你遇到以下情况时可能需要使用它缓存异常你确信UEFN项目中的文件已经更改比如用外部工具批量修改了.uasset但scan_map_devices仍然返回旧的缓存结果。这可能是因为文件系统监控的延迟或错误。工具更新后如果verse-mcp工具本身更新了.uasset的解析逻辑你可能希望用新逻辑重新扫描所有文件而不是沿用旧的、可能不兼容的缓存。调试在开发或调试verse-mcp本身时需要强制刷新数据。调用此工具后下次对同一项目路径执行scan_map_devices时将会触发一次全新的扫描并生成新的缓存。4. 从安装到集成打造你的Verse智能开发环境4.1 安装与验证安装过程被设计得极其简单通过一个Shell脚本完成。# 使用curl下载并执行安装脚本 curl -fsSL “https://raw.githubusercontent.com/quangdang46/verse-mcp/main/install.sh?$(date %s)” | bash脚本做了什么从GitHub仓库下载最新的vmverse-mcp的简称二进制文件。将其放置于$HOME/.local/bin目录下这是Linux/macOS上常见的用户本地二进制文件目录。尝试将该目录加入当前Shell的PATH环境变量。安装后验证vm --version如果安装成功这会输出vm的当前版本号。如果提示“command not found”说明$HOME/.local/bin不在你的PATH中。手动添加PATH如果需要# 对于 Bash 或 Zsh echo ‘export PATH“$HOME/.local/bin:$PATH”’ ~/.bashrc # 或 ~/.zshrc source ~/.bashrc # 或 source ~/.zshrc # 对于 Fish shell echo ‘set -gx PATH $HOME/.local/bin $PATH’ ~/.config/fish/config.fish source ~/.config/fish/config.fish注意事项安装脚本需要从GitHub下载。请确保你的网络环境能够访问raw.githubusercontent.com。如果下载失败你也可以手动从项目的Release页面下载对应平台的二进制文件并赋予可执行权限后放入PATH包含的目录中。4.2 运行模式与配置vm支持两种运行模式对应不同的MCP传输方式。1. 标准输入输出模式Stdio默认这是最简单、最常用的模式适用于与Claude Desktop、Cursor等直接集成。# 直接运行程序会等待通过标准输入接收MCP协议消息 vm在这种模式下AI客户端如Cursor会作为一个子进程启动vm并通过管道stdin/stdout与之通信。所有数据交换都在内存中完成效率高无需网络。2. HTTP服务器模式这种模式将vm作为一个HTTP服务运行允许通过网络访问。这在某些高级集成场景下有用比如你想让一个远程的AI服务也能调用你的本地地图扫描工具。# 在本地 8080 端口启动 HTTP MCP 服务 vm --transport http --port 8080 # 指定主机和端口 vm --transport http --host 0.0.0.0 --port 2003启动后MCP端点通常位于http://主机:端口/mcp。客户端需要通过HTTP SSEServer-Sent Events或WebSocket与该端点通信。4.3 与AI客户端集成这是发挥verse-mcp威力的关键一步。你需要在你使用的AI客户端中配置MCP服务器。以 Claude Desktop 为例找到Claude Desktop的配置文件夹。通常在macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.jsonLinux:~/.config/Claude/claude_desktop_config.json编辑或创建claude_desktop_config.json文件。添加verse-mcp的配置{ “mcpServers”: { “verse-mcp”: { “command”: “vm” // 假设 vm 已在 PATH 中。否则需要提供完整路径如 “/Users/you/.local/bin/vm” } } }保存文件并完全重启Claude Desktop。重启后Claude就应该能识别并使用verse-mcp提供的工具了。以 Cursor 为例Cursor的配置方式可能略有不同通常在其设置Settings中找到“MCP Servers”或“Advanced”相关选项以类似JSON格式添加配置。请参考Cursor的官方文档。配置HTTP模式如果你运行在HTTP模式配置则指向URL{ “mcpServers”: { “verse-mcp-http”: { “url”: “http://127.0.0.1:2003/mcp” } } }验证集成是否成功启动配置好的AI客户端新建一个对话。尝试问一个与UEFN/Verse相关的问题例如“帮我扫描一下我放在桌面的UEFN项目‘MyBattleRoyale’里有哪些设备” 观察AI的回复。如果它能够理解并尝试调用工具可能会向你确认项目完整路径就说明集成成功了。5. 实战开发工作流与避坑指南将verse-mcp融入日常的UEFN开发能显著改变你的工作方式。下面是一个典型的“AI辅助Verse开发”工作流以及我积累的一些避坑经验。5.1 高效工作流示例场景为地图中的多个“宝藏箱”添加随机奖励逻辑。信息探查使用scan_map_devices你问AI“我的项目在/Users/Dev/FortniteProjects/TreasureHunt里我想找到所有类型为TreasureChest的设备并知道它们的名字。”AI调用scan_map_devices返回结果。你发现地图里有10个TreasureChest它们的标签分别是Chest_StartChest_Forest …Chest_BossRoom。同时AI还告诉你在Verse中引用它们可能需要用到类似DeviceName(“/Game/Path/To/Chest_Start”)的标识符来自asset_path的转换。API确认与学习使用query-docs你继续问“我想在Verse里写一个函数当玩家打开宝箱时从一个奖励列表中随机选取一个物品生成。该怎么写特别是随机数和生成物品的API。”AI调用query-docs搜索“Verse random number generation”和“Verse spawn item or pickup”。它从索引中找到了GetRandomInt函数和SpawnPickup或SpawnActor的相关文档及示例。AI根据这些确切的文档生成代码框架并提醒你随机数种子可能需要考虑网络同步。代码编写与属性关联你开始写代码需要为宝箱设置一个editable的奖励列表。你问AI“editable属性怎么定义一个字符串数组”AI通过query-docs确认语法给出示例editable var RewardOptions: []string []。同时它可能会提醒你在UEFN细节面板中编辑这个数组需要点击一个小箭头展开。你还可以让AI分析现有代码中所有editable属性检查是否有遗漏初始化的。UI与多人游戏适配使用AI提供的模式你想在玩家打开宝箱时显示一个获得奖励的UI提示。你问“怎么为每个玩家单独创建并显示一个临时UI2秒后消失”AI不仅调用query-docs查询CreateWidget和RemoveWidget还会结合其内置的关于多人游戏UI的最佳实践知识这部分可能来自训练数据但通过MCP工具可以变得更可靠提供一个模板将Widget存储在Player的某个属性中使用SpawnTimer延迟移除并确保UI创建逻辑在正确的端服务器/客户端运行。在整个过程中AI不再是“凭感觉瞎猜”而是变成了一个拥有“实时地图数据”和“精准文档库”的超级助手。你减少了在编辑器、文档网站和代码编辑器之间来回切换的次数思维流更加连贯。5.2 常见问题与排查技巧即使工具设计得再完善在实际使用中也会遇到各种问题。以下是我遇到的一些典型情况及解决方法。1. 工具安装后AI客户端无法识别或调用失败。检查PATH确保vm命令在终端中可以直接运行。如果不行检查安装目录是否在PATH中或者尝试在MCP配置中使用绝对路径。检查配置文件确认AI客户端的MCP配置文件格式正确没有拼写错误如mcpServers的拼写并且保存后重启了客户端。很多客户端只在启动时读取一次配置。查看客户端日志Claude Desktop、Cursor等通常有开发者控制台或日志文件。查看其中是否有关于加载MCP服务器失败的错误信息例如“command not found”或“connection refused”。手动测试工具在终端运行vm --help确保它能正常启动。也可以尝试用简单的命令与它交互虽然MCP协议是结构化的但可以测试进程是否存活。2.scan_map_devices返回空结果或错误。确认项目路径确保提供的project_path是UEFN项目的根目录即包含Content.uproject文件的文件夹。不要指向Content子目录。检查项目类型确保这是一个UEFNFortnite项目而不是普通的Unreal Engine项目。UEFN项目的.uproject文件内容有所不同。检查UEFN编辑器状态如果UEFN编辑器正打开该项目并处于“运行”或“模拟”状态某些.uasset文件可能被锁定导致读取失败。尝试关闭编辑器或停止模拟后再扫描。使用force_refresh如果怀疑缓存有问题在调用时加上force_refresh: true参数强制重新扫描。查看错误信息MCP工具调用失败时通常会返回结构化的错误信息。关注其中的error字段可能会提示“路径不是有效的UEFN项目”或“解析资产文件XXX失败”。3.query-docs搜不到想要的内容。优化查询词这是最常见的原因。避免单字或泛泛而谈的词。尝试组合关键词例如将“怎么让角色跳得更高”转化为“Verse character movement jump velocity or z-impulse property”。思考官方文档可能会用的术语。了解索引范围当前verse-mcp内置的文档索引主要来源于Epic官方提供的Verse语言参考和UEFN相关文档。一些非常新的、社区独有的技巧可能不在其中。如果官方文档确实没有AI可能会回退到其训练数据中的知识此时需要你多加辨别。遵守调用限制记住“每个问题不超过3次调用”的建议。如果前两次查询不理想仔细审视你的问题描述在第三次查询时尽可能精确。如果还不行可能需要拆分问题或者换一种问法。4. 工具运行缓慢特别是扫描大型地图时。这是正常现象首次扫描一个包含数GB资产的大型地图可能需要几十秒甚至更长时间因为要并行读取和解析大量二进制文件。耐心等待。利用缓存首次扫描后的后续查询会快很多因为直接读取缓存。只有当你修改地图并保存后下次扫描才会重新解析变动的文件。关注输出中的scan_duration_ms了解扫描耗时管理预期。如果耗时异常长如几分钟可能是遇到了大量非常复杂的资产或磁盘I/O瓶颈。5. 多人游戏UI相关的建议看起来不工作。注意网络上下文AI提供的UI模板是通用模式。你必须深刻理解Unreal的网络复制模型。例如创建Widget通常应该在客户端进行if not Server then ...而决定“何时”创建Widget的逻辑如“宝箱被打开”必须在服务器端权威执行然后通过RPC或复制变量通知客户端。测试测试再测试在UEFN编辑器中务必使用“多人游戏预览”模式至少2个客户端来测试你的UI逻辑。单机预览无法暴露网络同步问题。Verse仍在快速发展Verse语言和UEFN的API仍在快速迭代。AI基于MCP工具提供的信息虽然准确但也要留意你使用的UEFN版本是否与文档版本匹配。遇到诡异问题去官方社区或Discord频道查看是否有更新或已知问题。5.3 进阶技巧与扩展思路当你熟悉了基础用法后可以尝试一些更进阶的玩法1. 结合脚本自动化你可以写一个简单的Shell脚本或Python脚本定期用vm扫描你的项目并将设备列表输出为一个JSON文件。然后你可以用其他工具如代码生成器读取这个JSON自动生成一些Verse代码框架比如为地图中所有Checkpoint设备生成一个管理数组。2. 探索HTTP模式的可能性如果你在团队中工作可以将vm以HTTP模式运行在一台内部服务器上并配置适当的权限。这样团队中任何成员的AI助手都可以连接到这个共享的MCP服务器查询项目文档甚至扫描某个共享开发地图的最新状态促进知识共享。3. 贡献与自定义verse-mcp是开源项目。如果你发现它对某些特定类型的.uasset解析不全或者你想增加新的分析功能例如分析所有触发器网络的连接性找出孤立的节点可以阅读其Rust代码尝试贡献代码。你也可以 fork 该项目为其添加针对你自己团队内部Verse代码库的私有文档索引打造更强大的专属助手。从Web开发转向UEFN游戏开发最大的挑战之一是生态工具的不成熟。verse-mcp正是为了填补这一空白而生。它通过MCP这个桥梁将AI的通用能力与UEFN开发的具体需求连接起来把原本需要手动查找、记忆、试错的信息变成了可查询、可验证、可操作的数据流。虽然它不能代替你学习Verse语法和理解游戏逻辑但它能极大地降低信息获取的摩擦让你更专注于创意和实现本身。