1. 项目概述当AI助手“看见”你的Unity场景如果你在Unity开发中曾尝试向ChatGPT或Copilot询问“为什么我的角色卡在墙里了”得到的回复却是一堆关于刚体、碰撞器的通用建议而完全无视了你场景中那个被错误设置了“Is Kinematic”的模型那么你就能立刻理解这个项目的价值所在。Unity-MCP或者说基于MCP协议实现的AI与Unity引擎自然语言交互其核心目标就是解决这个“盲人摸象”的问题。它让AI工具不再仅仅是一个能读代码的“文员”而是变成一个能实时“看见”你整个Unity编辑器状态、场景结构、组件配置乃至运行时数据的“现场工程师”。简单来说这是一个桥梁项目。它的一端连接着支持MCP协议的各种AI助手如Claude Code、Cursor、Windsurf甚至是未来可能支持的自定义AI客户端另一端则深度嵌入Unity编辑器。通过这个桥梁你用自然语言提出的问题——“我的玩家预制体上挂了哪些脚本”AI不仅能理解问题还能通过MCP服务器直接查询你当前打开的Unity项目返回一个精确的列表PlayerMovement.cs,Health.cs,InventoryManager.cs。这种从“基于猜测的通用回答”到“基于上下文的精准操作”的转变是开发工作流的一次质变。这个项目适合所有层级的Unity开发者。对于新手它像一个永不疲倦的导师能根据你的实际项目解答具体问题对于资深开发者它是一个强大的自动化工具能将繁琐的编辑器操作如批量重命名资源、配置光照烘焙设置转化为一句简单的自然语言指令。它的价值不在于替代你思考而在于消除信息差让你能将精力集中在真正的创意和逻辑实现上。2. MCP协议深度解析AI与工具对话的“普通话”在深入Unity-MCP的实现之前我们必须先理解其基石——MCP协议。MCP即模型上下文协议你可以把它理解为AI工具与外部应用程序如Unity、Figma、数据库进行“深度对话”时所使用的“普通话”或标准协议。它由Anthropic提出并推动其设计初衷就是为了解决大语言模型与复杂软件环境交互时的“上下文缺失”痛点。2.1 为什么传统AI集成方式在游戏开发中“水土不服”传统的AI编码助手其工作模式本质上是“离线”的。你复制一段代码或错误信息粘贴给它它基于其训练数据中的海量公开代码和文档进行模式匹配和生成。这种方式对于纯文本的算法题、API用法查询可能有效但面对游戏开发这种高度依赖图形化编辑器、复杂资产关联和实时状态的环境时就显得力不从心。游戏项目的“上下文”是立体的、动态的远不止是.cs文件里的文本。它包括场景层次结构GameObject的父子关系、激活状态。组件与属性一个GameObject上挂载的所有Component及其公开字段的当前值。资产引用材质球引用了哪些贴图预制体嵌套了哪些子预制体编辑器状态当前选中的对象是什么正在播放游戏吗控制台有哪些错误项目设置物理引擎参数、输入管理器配置、图形管线设置。这些信息无法通过简单的“复制粘贴”完整地传递给AI。MCP协议的核心创新就是定义了一套标准的请求-响应机制允许AI客户端按需、实时地向MCP服务器查询这些丰富的上下文信息。2.2 MCP的核心组件与通信模型一个典型的MCP交互涉及三个角色MCP客户端通常是你的AI助手如Cursor里的AI。它理解你的自然语言指令并将其转化为对MCP服务器的标准化请求。MCP服务器嵌入在目标工具如Unity中的后台服务。它监听客户端的请求访问工具的内部数据或执行操作并将结果格式化后返回。MCP协议本身定义了一系列标准的“工具Tools”和“资源Resources”。服务器向客户端宣告自己支持哪些工具例如“获取当前选中对象”、“执行编辑器命令”客户端则可以选择调用这些工具。通信流程示例 当你问AI“把场景里所有叫‘Enemy’的物体染成红色。”AI客户端解析指令发现需要先“查找对象”再“修改材质”。客户端向Unity的MCP服务器发起请求调用list_gameobjects工具并传入过滤参数name: “Enemy”。Unity MCP服务器在内存中遍历当前场景找到所有匹配的GameObject将它们的唯一标识符如GUID或实例ID列表返回。AI客户端收到列表后再发起第二个请求调用set_material_color工具传入对象标识符列表和颜色值RGB(255,0,0)。Unity MCP服务器执行修改操作并返回成功状态。AI客户端将最终结果用自然语言总结给你“已找到15个名为‘Enemy’的对象并已将它们的材质主颜色设置为红色。”这个过程完全在后台进行对你而言只是一次对话。MCP协议标准化了步骤2、3、4、5中的数据格式使得不同的AI客户端可以和不同的工具服务器无缝协作。注意MCP不是一个具体的软件而是一份开放标准。这意味着Unity可以实现自己的MCP服务器Blender也可以VS Code也可以。只要它们遵循同一套“普通话”AI客户端就能与它们交流。这避免了生态锁定的问题是该项目能吸引广泛关注的关键。3. Unity-MCP的整体架构与设计思路理解了MCP是什么我们再来拆解“Unity-MCP”这个具体实现。我们的目标是在Unity编辑器内构建一个功能完备的MCP服务器使其能够响应外部AI客户端的查询与操作指令。整个架构可以划分为四个核心层次。3.1 通信层建立AI与Unity的“数据管道”这是最底层负责处理网络通信。MCP协议通常使用标准输入输出stdio或WebSocket作为传输层。对于Unity编辑器这种桌面应用stdio是更常见和稳定的选择。实现选择我们会在Unity中创建一个MCPCommunicationServer类它不依赖于Unity的网络API如UNET而是利用C#的Process类启动一个后台线程该线程通过管道Pipe与AI客户端进程进行stdin/stdout通信。这种方式兼容性最好无论AI客户端是本地应用还是远程服务只要它能通过子进程或管道连接就能工作。消息格式MCP协议使用JSON-RPC 2.0规范。这意味着每条消息都是一个结构化的JSON对象包含jsonrpc,id,method,params等字段。我们的服务器需要能解析传入的JSON-RPC请求并构造合规的响应或通知。序列化使用Newtonsoft.JsonJson.NET或Unity 2021内置的UnityEngine.JsonUtility进行JSON的序列化与反序列化。考虑到MCP消息结构的复杂性Json.NET是更强大和灵活的选择。设计考量为什么不用HTTP虽然HTTP更通用但stdio方式更轻量无需处理端口占用、防火墙等问题特别适合本地工具间的紧密集成。它简化了部署用户只需在AI客户端配置中指向我们的Unity编辑器进程即可。3.2 协议层实现MCP标准的“工具箱”这一层负责实现MCP协议定义的核心能力集。MCP将能力抽象为“工具Tools”和“资源Resources”。对于Unity-MCP我们需要设计一系列贴合编辑器操作的“工具”。核心工具设计示例project/get_info获取项目基本信息如Unity版本、项目名称、目标平台。hierarchy/list列出场景中的GameObject支持按名称、标签、组件类型过滤。components/get获取指定GameObject上挂载的所有组件及其可序列化字段的当前值。components/set修改指定组件上某个字段的值如Transform.position,Rigidbody.mass。assets/find在项目资产数据库中搜索资源。editor/execute_menu_item执行一个编辑器菜单命令如GameObject/Create Empty。console/get_logs获取控制台最新的错误、警告或日志信息。scene/save保存当前场景。每个工具都对应一个C#方法。当通信层解析出一个JSON-RPC请求如{“method”: “hierarchy/list”, “params”: {“filter”: {“with_component”: “Rigidbody”}}}协议层就会找到注册的HandleHierarchyList方法执行查询并将结果封装成JSON-RPC响应返回。实操心得工具的设计要遵循“原子化”和“幂等性”原则。一个工具只做一件事如“获取列表”并且多次调用同一参数的工具应产生相同的结果幂等。这有利于AI客户端进行复杂的多步骤规划和错误重试。3.3 Unity交互层打通编辑器内部的“任督二脉”这是最具Unity特色的一层。协议层定义了“做什么”而这一层负责“怎么做”——即如何安全、高效地访问和修改Unity编辑器的内部状态。访问场景与对象通过UnityEngine.SceneManagement.SceneManager获取当前场景遍历GameObject。这里的关键是处理对象的唯一标识。不能使用内存地址因为重载场景后会变。通常使用GlobalObjectId全局对象ID或instanceID在单次编辑器会话中稳定来在通信中标识对象。反射与序列化为了获取和设置组件属性需要大量使用C#反射System.Reflection。例如当AI请求查看一个Light组件的属性时我们需要遍历其所有公共字段和属性获取当前值并将其转换为JSON可表示的类型字符串、数字、布尔、数组、对象。编辑器API调用许多操作需要通过UnityEditor命名空间下的API完成例如创建对象PrefabUtility.InstantiatePrefab、执行菜单项EditorApplication.ExecuteMenuItem、标记场景为脏EditorSceneManager.MarkSceneDirty。这部分代码必须包裹在#if UNITY_EDITOR预处理指令中因为UnityEditor在游戏运行时Build中不可用。线程安全Unity的API绝大多数都不是线程安全的。而我们的MCP通信层可能在后台线程接收请求。因此所有涉及Unity对象操作的代码都必须通过UnityEditor.EditorApplication.delayCall或Dispatcher派发到主线程执行否则会导致编辑器崩溃。避坑指南直接反射修改对象存在风险。对于某些属性如Transform.parent直接设置可能会破坏场景关系。更好的做法是为常用组件和操作封装安全的辅助方法。例如提供一个safe_set_parent工具它内部会处理好父子关系更新和撤销记录。3.4 安全与权限层为AI助手戴上“紧箍咒”让AI拥有直接操作编辑器的能力是强大的但也危险。一个错误的指令可能导致场景被清空、资产被误删。因此一个健壮的Unity-MCP必须包含严格的安全控制。操作范围沙箱默认情况下工具的操作范围应被限制。例如assets/delete工具可能默认被禁用。可以设计一个“安全模式”在此模式下所有可能造成数据丢失的操作删除、覆盖保存都需要显式确认或根本无法执行。操作确认与撤销对于高风险操作服务器可以向客户端返回一个需要确认的请求。更好的做法是与Unity的撤销系统集成。每一个通过MCP执行的修改操作都应该包装在Undo.RecordObject和Undo.SetCurrentGroupName中这样用户可以通过CtrlZ轻松回退AI的操作。资源访问控制可以设计白名单或黑名单限制AI可以访问的特定文件夹如避免读取敏感的设计文档或特定类型的资产。指令日志与审计所有来自AI客户端的请求和服务器执行的操作都应被详细记录到日志文件中。当出现问题时可以回溯查看是哪条指令导致了异常。个人经验在初期开发中我强烈建议实现一个“只读”模式。在此模式下所有修改类工具set,create,delete都返回“权限拒绝”错误只允许查询类工具运行。这既能用于测试也能让用户在完全信任AI工作流之前有一个安全的试用阶段。4. 核心功能实现与关键技术细节理论架构清晰后我们来深入几个核心功能的具体实现这是将蓝图变为代码的关键一步。4.1 实现场景层次结构的查询与过滤这是最基础也是最常用的功能。AI需要知道场景里有什么。// 伪代码示例处理 hierarchy/list 工具 public JObject HandleHierarchyList(JObject parameters) { // 1. 解析过滤参数 string nameFilter parameters.Valuestring(name); string tagFilter parameters.Valuestring(tag); string componentFilter parameters.Valuestring(with_component); // 2. 获取当前场景所有根物体 ListGameObject allObjects new ListGameObject(); Scene activeScene SceneManager.GetActiveScene(); activeScene.GetRootGameObjects(allObjects); // 3. 递归收集所有子物体包括非激活的 ListGameObject collected new ListGameObject(); foreach (var root in allObjects) { CollectAllChildren(root, collected); } // 4. 应用过滤 var filtered collected.Where(go (string.IsNullOrEmpty(nameFilter) || go.name.Contains(nameFilter)) (string.IsNullOrEmpty(tagFilter) || go.CompareTag(tagFilter)) (string.IsNullOrEmpty(componentFilter) || go.GetComponent(componentFilter) ! null) ).ToList(); // 5. 构建响应 JArray resultArray new JArray(); foreach (var go in filtered) { resultArray.Add(new JObject { [id] GetObjectUniqueId(go), // 使用GlobalObjectId [name] go.name, [isActive] go.activeInHierarchy, [tag] go.tag, // 可以附加更多信息如layer、静态标志等 }); } return new JObject { [objects] resultArray }; } private void CollectAllChildren(GameObject root, ListGameObject output) { output.Add(root); foreach (Transform child in root.transform) { CollectAllChildren(child.gameObject, output); } }关键技术点全局对象IDGlobalObjectId.GetGlobalObjectIdSlow(gameObject).ToString()可以生成一个在项目范围内唯一且持久的标识符即使场景重载也有效非常适合作为对象在MCP对话中的引用句柄。包含非激活对象使用activeInHierarchy而非activeSelf来判断是否在场景中激活因为父物体禁用会导致子物体activeInHierarchy为false。查询时应包含所有对象但标注其激活状态由AI客户端决定是否需要过滤。性能考量大型场景可能有数万个对象。频繁的全场景遍历会影响编辑器性能。可以考虑缓存场景结构并在场景发生修改时通过EditorApplication.hierarchyChanged事件更新缓存。4.2 动态组件属性探查与修改让AI不仅能“看到”对象还能“看到”和“调整”对象身上的每一个螺丝钉属性。// 伪代码示例获取组件属性 public JObject HandleComponentsGet(JObject parameters) { string objectId parameters.Valuestring(object_id); GameObject go ResolveGameObjectFromId(objectId); // 根据ID找到对象 if (go null) return ErrorResponse(Object not found); string componentType parameters.Valuestring(component_type); Component comp go.GetComponent(componentType); // 通过类型名查找组件 if (comp null) return ErrorResponse(Component not found); // 使用反射获取所有公共字段和属性 Type type comp.GetType(); JObject props new JObject(); // 获取字段 foreach (FieldInfo field in type.GetFields(BindingFlags.Public | BindingFlags.Instance)) { if (!field.IsPublic) continue; // 跳过标记为[NonSerialized]或[HideInInspector]的字段 if (field.IsDefined(typeof(NonSerializedAttribute), false) || field.IsDefined(typeof(HideInInspector), false)) continue; object value field.GetValue(comp); props[field.Name] SerializeUnityObjectToJson(value); } // 获取属性具有get访问器的 foreach (PropertyInfo prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (!prop.CanRead) continue; // 同样跳过隐藏的属性 if (prop.IsDefined(typeof(HideInInspector), false)) continue; try { object value prop.GetValue(comp); props[prop.Name] SerializeUnityObjectToJson(value); } catch (Exception ex) { // 某些属性如material可能在特定情况下抛出异常记录并跳过 Debug.LogWarning($Failed to get property {prop.Name}: {ex.Message}); } } return new JObject { [component] new JObject { [type] componentType, [properties] props } }; } // 伪代码示例序列化Unity特殊类型 private JToken SerializeUnityObjectToJson(object value) { if (value null) return JValue.CreateNull(); if (value is UnityEngine.Object uObj) { // 对于UnityEngine.Object如Material, Texture返回其名称和引用ID return new JObject { [$type] unity_object, [name] uObj.name, [id] GetAssetUniqueId(uObj) }; } if (value is Vector3 vec3) { return new JArray(vec3.x, vec3.y, vec3.z); } if (value is Quaternion quat) { return new JArray(quat.x, quat.y, quat.z, quat.w); } // ... 处理其他Unity类型Color, Bounds等 // 基本类型int, float, string, bool直接返回 return JToken.FromObject(value); }实操心得属性过滤至关重要不是所有公共字段/属性都适合暴露给AI。像gameObject、transform、GetInstanceID这些继承自UnityEngine.Object的成员暴露它们可能导致循环引用或信息冗余。需要建立一个白名单或黑名单机制。处理复杂类型Unity的Vector3、Color等是结构体需要特殊序列化为数组或对象以便JSON传输和AI理解。SerializeUnityObjectToJson函数是这里的核心。撤销支持在对应的HandleComponentsSet中修改属性前务必调用Undo.RecordObject(comp, “MCP: Set property”)以支持编辑器撤销。4.3 与AI客户端的配置与连接实战服务器写好了如何让AI客户端如Cursor知道并连接它呢这需要一个标准的配置。对于支持MCP的客户端通常需要一个配置文件如mcp.json或claude_desktop_config.json来声明服务器。// 示例Cursor编辑器的MCP配置 (位于用户配置目录) { mcpServers: { unity-editor: { command: python, args: [ -c, import subprocess, sys; subprocess.run([sys.executable, -m, unity_mcp.bridge]) ], env: { UNITY_PROJECT_PATH: C:/MyUnityProject, UNITY_EDITOR_PATH: C:/Program Files/Unity/Hub/Editor/2022.3.48f1/Editor/Unity.exe } } } }更优的本地集成方案 上述配置依赖一个Python桥接脚本因为它需要启动Unity编辑器进程并与之通信。一个更直接、更稳定的方案是开发一个独立的本地守护进程。Unity侧开发一个Editor Window它启动一个本地TCP/WebSocket服务器例如在localhost:8765并等待连接。MCP配置将客户端的命令指向一个我们编写的轻量级连接器Connector可执行文件。这个连接器的工作就是连接到localhost:8765并将stdio重定向到该网络连接。连接器可以用任何语言编写如Go、Rust它体积小、启动快负责网络通信和协议转发。这样做的好处是Unity编辑器进程的启动和停止由用户控制MCP服务器随编辑器启动而可用随编辑器关闭而终止。连接器只负责建立网络桥梁稳定且资源占用低。配置步骤用户打开Unity项目。在Unity编辑器中点击“启动MCP服务器”按钮。在Cursor的设置中添加MCP服务器命令指向我们提供的连接器可执行文件。Cursor启动连接器连接器连接到Unity的本地服务器MCP通道建立。5. 高级应用场景与效能提升当基础查询和修改功能稳定后Unity-MCP的潜力才真正开始爆发。它可以从一个“问答机”进化成一个“智能副驾驶”。5.1 复杂工作流的自然语言编排想象一下这些场景“为场景中所有标记为‘Static’的物体生成光照贴图UV。”这条指令会被分解为1) 查询所有带Static标志的物体2) 为每个物体的MeshRenderer组件调用GenerateLightmapUV菜单命令。MCP服务器可以顺序执行这些步骤。“检查所有材质球把使用‘Standard’着色器的都替换成‘URP/Lit’。”这需要遍历Assets目录检查每个材质并进行条件替换。AI可以规划一个包含循环和条件判断的多步计划通过MCP逐一执行。“在我的玩家预制体上添加一个刚体并设置质量为10取消重力影响。”这是一个典型的“创建-配置”工作流。AI会先调用component/add工具添加Rigidbody再连续调用components/set工具配置其mass和useGravity属性。效能提升关键为了让AI更好地规划我们需要提供更丰富的“工具描述”。在MCP初始化时服务器会向客户端宣告自己支持的所有工具及其详细的参数模式。例如components/set工具的描述应包含“此工具用于修改Unity组件属性。参数object_id(字符串目标对象ID),component_type(字符串组件类名),property_path(字符串属性名支持点号路径如‘transform.localPosition’),value(任意新值)。” 清晰的描述能极大提升AI调用工具的准确率。5.2 与版本控制系统和CI/CD的联动在团队开发中Unity-MCP可以扮演更自动化的角色。代码审查助手AI可以读取当前更改的C#脚本并通过MCP查询脚本所引用的场景对象和预制体从而给出更准确的代码审查意见。例如“你修改的EnemyAI脚本被Scene1和Prefabs/Enemies中的5个预制体使用修改AttackRange字段可能会影响这些实体的行为。”自动化测试生成AI可以根据场景中的UI布局通过MCP获取所有Button对象的引用和它们的onClick事件绑定自动生成对应的UI自动化测试脚本框架。资产规范化检查在CI流水线中可以运行一个“无头模式”的Unity实例并连接一个MCP客户端脚本。该脚本可以自动检查项目所有纹理尺寸是否为2的幂、所有音频是否已压缩、所有预制体是否引用了丢失的组件等并生成报告。5.3 调试与性能分析的智能辅助这是MCP协议结合运行时数据可以发挥巨大作用的领域。我们需要扩展MCP服务器使其不仅能访问编辑器状态还能在游戏运行模式Play Mode下访问运行时数据。运行时对象查询AI可以询问“当前场景中有多少个Monster实例它们的平均血量是多少” MCP服务器需要连接到运行中的游戏通过Object.FindObjectsOfType查询并计算。性能热点定位AI可以指令“录制10秒的性能数据然后列出实例数最多的前5个脚本。” 这需要MCP服务器与Unity Profiler API交互采集数据并分析。动态问题诊断当游戏在运行时出现异常AI可以立刻获取控制台最新的错误堆栈并通过MCP查询堆栈中涉及的脚本对象和场景对象的当前状态提供结合了代码和运行时上下文的诊断建议而不是仅仅分析静态的错误信息。实现挑战运行时访问需要更复杂的安全机制和通信同步因为游戏运行时循环是独立的。通常需要设计一个在游戏内运行的轻量级“运行时桥接”组件通过本地回环网络与编辑器内的MCP服务器通信。6. 常见问题、故障排查与优化实践在实际开发和集成中你会遇到各种各样的问题。这里记录了一些典型坑位和解决方案。6.1 连接与通信故障问题现象可能原因排查步骤与解决方案AI客户端提示“无法连接到MCP服务器”或“连接超时”。1. Unity MCP服务器未启动。2. 防火墙/安全软件阻止了本地端口通信。3. 连接器Connector路径配置错误。1. 确认Unity编辑器中的MCP服务器窗口显示“已监听”状态。2. 临时关闭防火墙测试或将连接器/Unity加入白名单。3. 在终端手动运行连接器命令看是否有错误输出。检查AI客户端配置中的command和args是否完全正确。连接成功但AI无法识别任何工具。1. MCP服务器初始化失败未正确宣告工具列表。2. 协议版本不兼容。1. 查看Unity编辑器控制台日志检查MCP服务器初始化时是否有异常抛出。2. 确保使用的MCP协议版本与AI客户端兼容。检查服务器启动时发送的initialize请求响应。执行操作时AI返回“权限错误”或“未实现”。1. 请求的工具名错误或参数格式不对。2. 该工具在服务器端被禁用如处于“只读模式”。1. 在AI客户端开启详细日志查看它实际发送的JSON-RPC请求与服务器端支持的工具列表对比。2. 检查Unity MCP服务器的设置面板确认当前运行模式。6.2 性能与稳定性问题问题编辑器在启用MCP后变卡顿。分析频繁的全文场景遍历、复杂的反射操作或大量的JSON序列化会消耗CPU资源。网络通信如果处理不当也可能阻塞主线程。解决实现缓存对静态数据如项目资产列表、场景结构进行缓存仅在相关资源发生变化时监听AssetDatabase.import等事件才更新缓存。优化反射对常用组件Transform,Renderer,Collider等的属性访问不要每次都使用GetFields可以预先计算并缓存其FieldInfo和PropertyInfo。异步与分页对于可能返回大量数据的查询如列出所有资产实现分页机制。将JSON序列化等CPU密集型操作放到后台线程通过await异步处理避免阻塞主线程。精简响应不是所有查询都需要返回对象的完整属性。可以提供“轻量级”查询选项只返回ID和名称等基本信息。问题执行修改操作后编辑器状态异常或撤销堆栈混乱。分析没有正确集成撤销系统或者多个MCP请求并发修改同一对象导致状态不一致。解决强制单线程化确保所有通过MCP发起的编辑器状态修改都在Unity主线程上顺序执行。使用一个任务队列将所有修改操作排队处理。完善撤销每一个修改操作都必须包裹在Undo.RecordObject中。对于创建或删除对象使用Undo.RegisterCreatedObjectUndo和Undo.DestroyObjectImmediate。操作分组将一次自然语言指令触发的多个原子操作如创建对象、设置多个属性合并到一个撤销组中Undo.SetCurrentGroupName这样用户一次撤销就能回退整个指令。6.3 与不同AI客户端的兼容性不同的AI客户端Cursor, Claude Desktop, Windsurf对MCP协议的支持程度和细节可能略有不同。工具描述格式确保工具的描述description、参数模式inputSchema严格遵循JSON Schema规范。有些客户端对格式要求更严格。长响应处理某些客户端对单个响应的大小可能有限制。如果查询结果很大如序列化了一个包含大量顶点的Mesh考虑进行压缩或流式传输如果MCP协议支持。自定义工具扩展除了标准工具可以暴露一些针对Unity的“高级工具”如editor/playmode切换运行模式、assetbundle/build构建AssetBundle。在服务器初始化时宣告这些工具并在文档中说明方便AI客户端开发者或高级用户利用。最后的建议从一个小而精的功能子集开始。先实现hierarchy/list和components/get这两个只读工具确保连接稳定、通信无误。然后逐步添加components/set等修改工具并同步完善安全控制和撤销机制。在内部小范围试用收集真实场景下的指令不断优化工具的设计和AI提示词让整个系统越来越智能和可靠。这个项目的最终目标不是创造一个万能的黑盒而是一个高度透明、可控、能极大提升开发效率的智能协作界面。