基于MCP协议与Cursor IDE实现AI驱动GameMaker Studio 2项目自动化操作

发布时间:2026/7/22 13:36:01
基于MCP协议与Cursor IDE实现AI驱动GameMaker Studio 2项目自动化操作 1. 项目概述当AI助手遇上游戏开发引擎如果你是一名独立游戏开发者或者对使用GameMaker Studio 2简称GMS2感兴趣那你一定对它的工作流程不陌生在IDE里拖拽对象、编写GML代码、调试、构建。这个过程充满创意但也伴随着大量的重复性劳动和上下文切换。比如你想创建一个新的精灵序列可能需要经历“在资源树右键 - 新建精灵 - 导入图片 - 设置碰撞遮罩 - 关联到对象”这一系列步骤。而“AI驱动GameMaker开发”这个项目正是为了解决这类效率痛点而生。它的核心目标是让AI智能体Agent能够理解你的自然语言指令并直接在你的GameMaker项目中执行具体的操作比如“创建一个名为Player的对象并为其添加一个sprites/hero.png的精灵”从而将开发者从繁琐的界面操作中解放出来更专注于游戏设计本身。这个项目的技术基石是MCP协议和Cursor IDE。MCPModel Context Protocol可以理解为AI模型与外部工具、数据源进行安全、结构化通信的“普通话”。它定义了一套标准让像Claude、GPT这样的AI模型能够发现、调用你本地环境中的各种功能。而Cursor IDE作为一款深度集成AI的代码编辑器其内置的Agent功能天然支持MCP协议。我们的项目本质上就是为GameMaker Studio 2开发环境“制作”一个MCP服务器Server。这个服务器像一个精通GMS2所有操作的“超级助手”它暴露出一系列工具Tools比如“创建对象”、“查找资源”、“运行游戏”。当你在Cursor的Agent聊天框里说“帮我建个敌人对象”Cursor的AI模型就会通过MCP协议调用我们服务器提供的“创建对象”工具并传入参数最终在真实的GMS2项目中完成创建。这不仅仅是简单的“AI写代码”。传统的AI编程助手是在你的代码文件里生成代码片段。而本项目实现的是AI直接操作项目结构。它跳过了“生成代码 - 开发者复制粘贴 - 手动在IDE中创建对应资源”的环节实现了从自然语言到项目资产Assets的无缝转换。这对于快速原型构建、批量资源处理、甚至是基于自然语言描述的自动化测试场景搭建都有着巨大的潜力。无论你是想快速验证一个游戏点子还是需要管理一个有上百个对象和精灵的中型项目这个AI驱动的工作流都能显著提升你的开发效率。2. 核心架构与MCP协议深度解析要实现AI对GameMaker项目的智能操作我们需要一个清晰、稳固且安全的架构。整个系统的核心是MCP协议它扮演着“交通规则”和“翻译官”的角色确保AI模型Client与我们编写的GameMaker操作服务Server能够顺畅对话。2.1 MCP协议AI与工具世界的桥梁MCP协议的设计哲学是让AI模型能够安全、可控地接入一个不断扩展的工具生态系统。你可以把它想象成电脑的“设备管理器”。AI模型客户端启动时会询问“我可以通过MCP连接哪些工具服务器” 然后这些被配置好的服务器会向AI“宣告”自己具备哪些能力。在我们的场景里Cursor IDE的Agent就是那个AI客户端而我们编写的“GameMaker操作服务器”就是其中一个被连接的设备。协议的核心是几个关键概念工具Tools服务器暴露给AI的可调用功能。每个工具都有明确的名称、描述和参数模式JSON Schema。例如我们的服务器会提供一个名为create_gameobject的工具描述是“在指定房间中创建一个新的游戏对象实例”其参数模式会定义需要传入object_name字符串和room_name字符串。资源Resources服务器可以提供一些静态或动态的只读数据供AI模型参考比如当前项目的资源树结构、GML函数的文档。这能极大地丰富AI的上下文让它做出更准确的决策。提示词Prompts服务器可以预定义一些高质量的提示词模板AI可以直接调用或参考。比如一个“为平台游戏角色编写移动脚本”的提示词模板。MCP通信基于标准输入输出stdio或HTTP传输格式为JSON-RPC。这种设计使得服务器可以用任何语言编写我们选择Python因其生态丰富也保证了通信过程与AI模型本身解耦非常清晰。2.2 项目架构设计从指令到项目变更的完整链路基于MCP协议我们设计了如下架构[开发者自然语言指令] - [Cursor IDE Agent] - [MCP Client] - [MCP协议通信] - [GameMaker MCP Server] - [GameMaker 项目操作] - [结果反馈]指令输入层开发者在Cursor IDE的Agent聊天框中输入如“在Room1里放一个Player对象”的指令。AI理解与调度层Cursor内置的AI模型如Claude 3理解指令意图并通过集成的MCP客户端查找可用的工具。它发现我们的服务器注册了create_object_instance工具于是准备调用。协议通信层MCP客户端按照JSON-RPC格式封装一个tools/call请求通过stdio发送给我们运行的Python服务器进程。业务逻辑层我们的Server这是本项目的核心。服务器收到请求后解析与验证解析JSON检查参数是否符合预定义的Schema。项目接口调用根据工具名和参数调用底层操作GameMaker项目的具体逻辑。这是最具挑战的部分因为需要与GMS2的工程文件.yyp和资源文件.yy打交道。执行与变更直接修改项目的JSON配置文件或通过其他方式如模拟键鼠、调用命令行工具来影响GMS2 IDE。结果返回层服务器将操作结果成功或失败附带详细信息封装成JSON-RPC响应返回给MCP客户端最终由Cursor Agent以自然语言形式呈现给开发者。这个架构的关键在于业务逻辑层的实现。GMS2项目本身是一个由众多JSON文件.yy文件和资源文件组成的文件夹。直接读写这些JSON文件是最可靠、最程序化的操作方式。例如创建一个对象就是在objects文件夹下新建一个object_name.yy文件并按照GMS2的规范填充其JSON结构。注意直接修改项目文件虽然直接但存在风险。必须在修改前确保GMS2 IDE已关闭该工程否则可能造成编辑冲突或数据丢失。更稳健的做法是我们的Server可以提供一个“锁定”机制或者在操作前自动检测IDE状态。3. 开发环境搭建与核心工具链选型工欲善其事必先利其器。搭建一个稳定、高效的开发环境是项目成功的第一步。这里我们选择Python作为服务器开发语言因为它拥有成熟的MCP协议实现库和丰富的文件操作、JSON处理库。3.1 基础环境配置首先确保你的系统已安装Python 3.10或更高版本。建议使用虚拟环境来隔离项目依赖。# 创建项目目录并进入 mkdir ai-gamemaker-mcp-server cd ai-gamemaker-mcp-server # 创建Python虚拟环境 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate接下来安装核心的MCP协议SDK。Anthropic官方维护的mcp库是一个很好的起点它提供了构建MCP服务器所需的底层框架。pip install mcp此外我们还需要一些辅助库pydantic用于数据验证和设置管理确保工具参数的规范性。watchfiles可选用于监控项目文件变化实现资源列表的动态更新。typer或click用于构建命令行界面方便启动和配置服务器。一个典型的requirements.txt文件可能如下所示mcp1.0.0 pydantic2.0.0 watchfiles0.20.0 typer0.9.03.2 Cursor IDE与MCP客户端配置Cursor IDE是本项目的“驾驶舱”。你需要确保使用的是支持Agent和MCP功能的版本。在Cursor的设置中通常会有“MCP Servers”或“AI Agent”相关的配置项。配置MCP服务器的方式一般是在Cursor的配置文件如cursor.json或通过设置UI中添加服务器启动命令。以下是一个示例配置片段它告诉Cursor如何启动我们的GameMaker MCP服务器{ mcpServers: { gamemaker-operator: { command: C:\\Users\\YourName\\ai-gamemaker-mcp-server\\venv\\Scripts\\python.exe, args: [ -m, your_server_module.main ], env: { GMS2_PROJECT_PATH: D:\\MyGames\\MyAwesomeGame } } } }关键点解析command指向你Python解释器的完整路径。这里使用了虚拟环境中的python确保依赖包可用。args指定要运行的模块。-m your_server_module.main意味着运行your_server_module包下的main.py文件。env设置环境变量。这里我们传递了关键的GMS2_PROJECT_PATH告诉服务器要操作哪个GameMaker项目。这种设计使得服务器可以动态切换项目更加灵活。配置完成后重启Cursor IDE。理论上在Agent对话中你应该能通过输入/mcp或类似指令看到已连接的服务器列表其中包含我们的gamemaker-operator。3.3 GameMaker项目接口分析与逆向工程这是整个项目最硬核的部分。GMS2项目文件.yyp和每个资源文件.yy本质上是结构化的JSON。我们的服务器需要精确地读写这些文件。第一步项目结构分析创建一个简单的GMS2测试项目手动执行几次“创建对象”、“添加精灵”的操作。然后关闭GMS2 IDE用文本编辑器打开项目文件夹。重点关注项目名.yyp这是项目入口文件。它包含了所有资源的引用列表resources数组每个引用都有idGUID和resourcePath相对路径。objects\\文件夹每个对象对应一个object_name.yy文件。sprites\\文件夹每个精灵对应一个sprite_name.yy文件。观察一个新建的object.yy文件其结构大致如下{ resourceType: GMObject, resourceVersion: 1.0, name: obj_player, spriteId: a1b2c3d4-e5f6-7890-abcd-ef1234567890, // 关联的精灵GUID visible: true, solid: false, persistent: false, parentId: null, maskSpriteId: null, overriddenProperties: [], eventList: [] }关键字段是name和spriteId。spriteId必须指向一个已存在的精灵资源的GUID。第二步生成与操作GUIDGMS2使用全局唯一标识符GUID来链接资源。任何新创建的资源都必须有一个全新的、格式正确的GUID。Python的uuid库可以生成UUID但GMS2的GUID是带花括号的格式如{a1b2c3d4-e5f6-7890-abcd-ef1234567890}。我们需要生成匹配的格式。import uuid def generate_gms2_guid(): 生成符合GMS2格式的GUID字符串。 return { str(uuid.uuid4()).upper() }第三步实现原子化操作任何对项目文件的修改都必须是原子化的即要么完全成功要么完全失败避免项目处于损坏的中间状态。这要求我们先在一个临时区域或内存中构建好完整的资源JSON。验证数据的正确性如引用的GUID是否存在。执行文件写入。更新主.yyp文件中的资源列表。例如创建对象的函数伪代码如下def create_object(project_path, object_name, sprite_guidNone): # 1. 生成新对象的GUID和文件路径 new_guid generate_gms2_guid() object_file_path os.path.join(project_path, objects, f{object_name}.yy) # 2. 构建对象JSON数据 object_data { resourceType: GMObject, resourceVersion: 1.0, name: object_name, spriteId: sprite_guid, # 可能为None # ... 其他默认属性 } # 3. 写入对象文件 with open(object_file_path, w, encodingutf-8) as f: json.dump(object_data, f, indent2) # 4. 读取项目文件在resources数组中添加新对象的引用 yyp_path os.path.join(project_path, MyGame.yyp) with open(yyp_path, r, encodingutf-8) as f: project json.load(f) new_resource_ref { id: new_guid, resourcePath: fobjects/{object_name}.yy } project[resources].append(new_resource_ref) # 5. 写回项目文件 with open(yyp_path, w, encodingutf-8) as f: json.dump(project, f, indent2) return new_guid实操心得在开发初期务必频繁备份你的测试项目。可以写一个简单的脚本在每次服务器操作前自动复制一份项目副本。因为直接操作文件的风险很高一个错误的GUID引用就可能导致GMS2无法打开项目。另外注意JSON的缩进格式通常是2个空格GMS2对此有严格要求格式错误同样会导致项目加载失败。4. MCP服务器核心功能实现有了对GMS2项目结构的理解和基础工具链我们现在可以着手实现MCP服务器的核心——即定义并实现那些将被AI调用的工具Tools。我们将遵循MCP的规范使用mcp库来构建服务器。4.1 服务器骨架与工具注册首先我们创建一个基础的服务器应用。MCP库通常采用装饰器或类继承的方式来声明工具。# main.py import asyncio from mcp.server import Server, NotificationOptions from mcp.server.models import InitializationOptions import mcp.server.stdio from pydantic import BaseModel, Field from typing import Optional import os import json # 定义工具参数模型 class CreateObjectParams(BaseModel): 创建游戏对象的参数 object_name: str Field(..., description新游戏对象的名称如 obj_enemy_basic) sprite_name: Optional[str] Field(None, description关联的精灵名称可选) class ListResourcesParams(BaseModel): 列出项目资源的参数 resource_type: Optional[str] Field(None, description资源类型过滤器如 GMObject, GMSprite) # 初始化MCP服务器 app Server(gamemaker-operator) # 通过装饰器注册工具 app.list_tools() async def handle_list_tools(): 返回服务器提供的工具列表 from mcp.types import Tool return [ Tool( namecreate_object, description在GameMaker项目中创建一个新的游戏对象GMObject。, inputSchemaCreateObjectParams.model_json_schema(), ), Tool( namelist_resources, description列出GameMaker项目中的所有或指定类型的资源。, inputSchemaListResourcesParams.model_json_schema(), ), # ... 可以注册更多工具 ] app.call_tool() async def handle_call_tool(name: str, arguments: dict) - list: 处理工具调用请求 if name create_object: params CreateObjectParams(**arguments) result await create_game_object(params.object_name, params.sprite_name) return [{ type: text, text: result }] elif name list_resources: params ListResourcesParams(**arguments) result await list_project_resources(params.resource_type) return [{ type: text, text: result }] else: raise ValueError(f未知工具: {name}) async def create_game_object(object_name: str, sprite_name: Optional[str]) - str: 实际创建游戏对象的业务逻辑 project_path os.getenv(GMS2_PROJECT_PATH) if not project_path: return 错误未设置 GMS2_PROJECT_PATH 环境变量。 # 这里调用我们在第3.3节实现的 create_object 函数 # 需要处理 sprite_name 到 sprite_guid 的转换 try: # ... 实现逻辑 ... new_guid create_object(project_path, object_name, resolved_sprite_guid) return f成功创建对象 {object_name}GUID: {new_guid} except Exception as e: return f创建对象失败: {str(e)} async def list_project_resources(resource_type: Optional[str]) - str: 列出项目资源 project_path os.getenv(GMS2_PROJECT_PATH) # ... 读取 .yyp 文件解析 resources 数组按类型过滤 ... # 将结果格式化为易读的字符串或JSON return formatted_result async def main(): 运行服务器 async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): await app.run( read_stream, write_stream, InitializationOptions( server_namegamemaker-operator, server_version0.1.0, capabilitiesapp.get_capabilities( notification_optionsNotificationOptions(), ), ), ) if __name__ __main__: asyncio.run(main())这段代码搭建了一个最小的MCP服务器框架。它定义了两个工具并通过环境变量GMS2_PROJECT_PATH来确定操作哪个项目。当Cursor的AI调用create_object工具时请求会路由到handle_call_tool进而执行我们的业务逻辑。4.2 关键工具实现创建、查询与修改让我们深入实现几个最核心的工具。工具一create_sprite创建精灵创建精灵比创建对象更复杂因为它涉及图像文件PNG的导入和.yy文件的生成。精灵的.yy文件包含了帧信息、碰撞遮罩设置、原点等。def create_sprite(project_path, sprite_name, image_path, origin_x0, origin_y0): 在项目中创建一个新精灵。 Args: project_path: 项目根目录 sprite_name: 精灵资源名如 spr_player image_path: 源图像文件的完整路径 origin_x, origin_y: 精灵原点坐标 # 1. 生成GUID sprite_guid generate_gms2_guid() # 2. 将图像文件复制到项目的 sprites/ 子目录下 import shutil target_image_dir os.path.join(project_path, sprites, sprite_name) os.makedirs(target_image_dir, exist_okTrue) # GMS2期望的图片文件名通常是 image.png target_image_path os.path.join(target_image_dir, image.png) shutil.copy2(image_path, target_image_path) # 3. 构建精灵的JSON数据这是一个简化版 sprite_data { resourceType: GMSprite, resourceVersion: 1.0, name: sprite_name, width: 32, # 需要从图片实际读取 height: 32, # 需要从图片实际读取 originX: origin_x, originY: origin_y, textureGroupId: None, # 通常为null frames: [ { id: generate_gms2_guid(), # 帧也有自己的GUID resourceVersion: 1.0, name: Image 1, modelName: Image, bboxMode: 0, textureGroupId: None } ], collisionMasks: [] # 碰撞遮罩初始可为空数组 } # 实际需要从图片文件读取宽高并填充更完整的frames信息 # 4. 写入 .yy 文件 sprite_yy_path os.path.join(project_path, sprites, f{sprite_name}.yy) with open(sprite_yy_path, w, encodingutf-8) as f: json.dump(sprite_data, f, indent2) # 5. 更新项目文件 (.yyp) update_project_resources(project_path, sprite_guid, fsprites/{sprite_name}.yy) return sprite_guid工具二add_event_to_object为对象添加事件GMS2对象的核心逻辑在于其事件Event。每个事件如“创建”、“步”、“绘制”可以包含多段GML代码。操作事件需要修改对象的.yy文件中的eventList数组。def add_event_to_object(project_path, object_name, event_type, event_number, gml_code): 为指定对象添加或更新一个事件。 Args: event_type: 事件类型如 “Create”, “Step”, “Draw” event_number: 事件子类型对于大多数事件是0但如键盘事件会有不同编号。 gml_code: 要插入的GML代码字符串。 object_path os.path.join(project_path, objects, f{object_name}.yy) with open(object_path, r, encodingutf-8) as f: obj json.load(f) # 查找是否已存在该事件 event_list obj.get(eventList, []) target_event None for event in event_list: if event.get(eventType) event_type and event.get(eventNum) event_number: target_event event break # 构建事件数据结构 new_action { id: generate_gms2_guid(), modelName: GML, modelId: GML, code: gml_code } if target_event: # 如果事件已存在追加action target_event.setdefault(actions, []).append(new_action) else: # 创建新事件 new_event { id: generate_gms2_guid(), modelName: GMEvent, eventType: event_type, eventNum: event_number, actions: [new_action] } event_list.append(new_event) obj[eventList] event_list # 写回文件 with open(object_path, w, encodingutf-8) as f: json.dump(obj, f, indent2) return f已为对象 {object_name} 的 {event_type} 事件添加代码。这个工具的实现使得AI可以通过一句指令如“为obj_player的Create事件添加hp 100;”直接完成对象逻辑的编写。4.3 资源发现与上下文增强为了让AI更智能我们不仅提供“执行”工具还可以提供“查询”工具和资源Resources让AI了解项目当前状态。动态资源列表我们可以实现一个工具或资源实时读取项目的.yyp文件将所有资源以结构化方式如按类型分组呈现给AI。这样当开发者说“给那个会飞的敌人对象添加事件”时AI能知道项目中哪些对象是“敌人”哪些拥有“会飞”的属性可能需要通过命名约定或标签推断更高级的实现可以解析对象属性。实现一个get_project_context资源 在MCP中资源是只读的上下文信息。我们可以在服务器初始化时或定期使用watchfiles扫描项目生成一个资源摘要。app.list_resources() async def handle_list_resources(): 列出可用的静态资源项目上下文 from mcp.types import Resource return [ Resource( urigamemaker://project/context, nameGameMaker Project Context, description当前加载的GameMaker项目的资源概览, mimeTypeapplication/json, ) ] app.read_resource() async def handle_read_resource(uri: str) - str: 读取资源内容 if uri gamemaker://project/context: project_path os.getenv(GMS2_PROJECT_PATH) context generate_project_context(project_path) # 生成JSON摘要的函数 return json.dumps(context) raise ValueError(f未知资源: {uri})这个generate_project_context函数会遍历项目资源提取关键信息如对象名、精灵名、房间名形成一个简洁的JSON文档。AI在每次对话时可以自动获取或引用这份文档从而对项目了如指掌做出更准确的决策。5. 在Cursor IDE中的集成与智能工作流实践服务器开发完成后真正的魔法发生在Cursor IDE中。我们需要将服务器无缝集成进去并设计高效的交互工作流。5.1 服务器连接与验证首先确保你的服务器脚本能正常运行。在项目目录下设置好环境变量并启动服务器进行测试# 设置项目路径环境变量 export GMS2_PROJECT_PATH/path/to/your/gamemaker/project # 激活虚拟环境后运行 python -m your_server_module.main如果服务器启动成功它会进入等待标准输入的状态。此时在Cursor中你需要确保MCP配置正确。通常Cursor会在启动时自动加载配置的MCP服务器。你可以通过Cursor的命令面板Ctrl/Cmd Shift P搜索“MCP”来查看已连接的服务器列表。一个成功的连接标志是你在Cursor的Agent对话中输入/mcp或类似的指令能看到gamemaker-operator及其提供的工具列表。如果没看到请检查Cursor配置文件中服务器启动命令的路径是否正确。环境变量GMS2_PROJECT_PATH是否在配置中正确传递。服务器进程是否在Cursor启动前就已经在运行对于stdio模式通常需要常驻。5.2 自然语言驱动开发的典型场景连接成功后你就可以体验全新的开发模式了。以下是一些典型场景场景一快速搭建游戏原型你“创建一个名为spr_hero的精灵使用C:\art\hero.png图片原点在中心。”AI理解指令调用create_sprite工具 “已创建精灵spr_hero。”你“再创建一个名为obj_player的对象使用刚才创建的spr_hero精灵。”AI调用create_object工具并查询到spr_hero的GUID “已创建对象obj_player并关联精灵。”你“为obj_player添加一个Create事件设置speed 5; direction 90;。”AI调用add_event_to_object工具 “代码已添加。”短短几句对话一个可移动的玩家对象就从无到有创建完毕并且写入了初始逻辑。场景二批量操作与重构你“列出项目中所有类型为GMObject的资源。”AI调用list_resources工具 “以下是所有对象obj_player, obj_enemy_slime, obj_enemy_bat, obj_coin...”你“为所有名字中包含 ‘enemy’ 的对象添加一个步事件写入if (place_meeting(x, y, obj_player)) { instance_destroy(); }。”AI这需要一点逻辑。它可能先调用list_resources过滤出敌人对象然后为每个对象循环调用add_event_to_object工具 “已为 obj_enemy_slime, obj_enemy_bat 添加了碰撞玩家后销毁的逻辑。”这种批量操作能力手动完成将极其耗时且容易出错。场景三基于上下文的智能辅助当你问“那个会发射子弹的对象叫什么来着” AI因为拥有get_project_context资源可以回答“根据项目上下文有一个名为obj_turret的对象其Create事件中包含bullet_speed变量这可能是您要找的发射子弹的对象。” 这大大减少了你在IDE中搜索和切换的时间。5.3 提示工程与效率提升技巧为了让AI更准确地理解你的意图可以运用一些提示词技巧明确资源类型使用GMS2的标准术语如“对象object”、“精灵sprite”、“房间room”、“时间轴timeline”。避免使用“角色”、“图片”、“关卡”等模糊词汇。指定精确路径当涉及文件时尽量提供完整或相对于项目根目录的路径。分步复杂指令对于复杂的操作如“创建一个有8向动画的精灵并关联到对象”可以拆解成多个步骤与AI交互或者先让AI为你规划步骤。利用系统指令你可以告诉AI“在后续对话中请优先使用gamemaker-operator工具来操作项目。” 这样AI会倾向于调用我们的工具而不是仅仅生成代码建议。此外可以将一些常用操作序列如“创建带基础移动逻辑的玩家对象”保存为Cursor的自定义提示词Prompt实现一键生成。6. 错误处理、调试与性能优化在实际使用中你会遇到各种问题。一个健壮的服务器和清晰的调试方法至关重要。6.1 常见错误与排查错误现象可能原因排查步骤Cursor中看不到MCP工具1. 服务器未启动或崩溃。2. Cursor配置错误。3. 环境变量未传递。1. 在终端手动运行服务器看是否有报错。2. 检查Cursor的settings.json或MCP配置UI。3. 在服务器启动脚本中加入print(os.environ.get(GMS2_PROJECT_PATH))验证。工具调用后无反应或报“内部错误”1. 工具函数内部抛出未捕获的异常。2. 项目文件路径错误或权限不足。3. JSON格式错误。1. 在服务器代码中添加详细日志记录每个步骤和异常。2. 检查GMS2_PROJECT_PATH指向的文件夹是否存在.yyp文件。3. 使用JSON验证工具检查服务器生成的.yy文件。GMS2 IDE无法打开项目服务器生成的GUID格式错误或资源引用无效。1. 用文本编辑器打开有问题的.yy或.yyp文件检查GUID格式带花括号的大写字母。2. 检查resources数组中的resourcePath是否指向了实际存在的文件。AI无法理解复杂指令指令过于模糊或AI上下文不足。1. 将指令拆解分步执行。2. 先使用list_resources工具让AI了解项目现状再给出具体指令。3. 在指令中明确指定资源名称。日志是调试的生命线。为你的服务器添加一个简单的日志系统import logging logging.basicConfig(levellogging.DEBUG, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) async def create_game_object(object_name: str, sprite_name: Optional[str]) - str: logger.info(f开始创建对象: {object_name}, 精灵: {sprite_name}) try: # ... 业务逻辑 ... logger.info(f对象创建成功GUID: {new_guid}) return f成功创建对象... except FileNotFoundError as e: logger.error(f项目文件未找到: {e}) return f错误项目路径可能不正确。 except json.JSONDecodeError as e: logger.error(fJSON解析失败: {e}) return f错误项目文件格式异常。 except Exception as e: logger.exception(f创建对象时发生未知错误) # 这会打印完整的堆栈跟踪 return f内部错误{str(e)}6.2 性能与安全考量性能频繁的文件IO操作可能成为瓶颈。可以考虑对项目资源列表进行缓存只有在检测到项目文件变更使用watchfiles时才更新缓存。对于复杂的批量操作实现为单个“批量创建”工具减少MCP的往返通信。安全这是重中之重。服务器拥有直接修改项目文件的能力。输入验证对所有工具参数进行严格的验证和清理防止路径遍历攻击如object_name: ../../../etc/passwd。操作确认对于删除、覆盖等危险操作可以在工具中设计“模拟运行”或“确认”步骤或者要求AI在调用前必须明确获得用户确认。备份在执行任何修改操作前自动备份当前的项目文件如复制到backups/目录并加上时间戳。这能提供最后的安全网。权限限制在服务器设计上只暴露必要的、安全的工具。避免提供直接执行系统命令或访问项目目录之外文件的工具。6.3 扩展性与未来方向本项目只是一个起点有巨大的扩展空间更多工具create_room: 创建房间并设置背景、实例层。manage_assets: 批量导入声音、背景图片。run_game: 调用GMS2的命令行工具如Runtime.exe来编译和运行游戏并将编译日志反馈给AI。query_gml_docs: 提供一个资源包含GML语言的函数和变量文档让AI的代码建议更准确。更智能的上下文解析对象的变量定义Variable Definitions和事件代码构建更丰富的项目语义图。让AI能回答“哪个对象使用了global.score变量”这类问题。与GMS2 IDE实时同步目前的方案要求GMS2 IDE关闭。更高级的方案是研究GMS2的插件系统或外部编辑器协议实现与正在运行的IDE实时通信做到“边改边看”。多模型支持将MCP服务器设计为与AI模型无关可以同时服务于CursorClaude、VSCodeContinueGPT等任何支持MCP的客户端。这个项目展示了AI如何从“代码生成助手”进化为“项目操作伙伴”。它改变的不仅是写代码的速度更是游戏原型设计和迭代的整个思维流程。当你能够用语言直接塑造游戏世界时创意和实现之间的壁垒就被极大地削弱了。开始构建你的AI驱动开发流程吧从自动化一个简单的对象创建开始你会发现整个开发过程都变得前所未有的流畅。