execute-python
Run Python code remotely in Unreal Engine environments using the MCP Unreal Server, enabling automated node discovery and management for efficient scripting and task execution.
Instructions
在Unreal中执行Python代码
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| unattended | No |
Implementation Reference
- src/mcp_server_unreal/server.py:185-257 (handler)Main handler function for the 'execute-python' tool. Validates connection to Unreal Engine, executes the provided Python code using RemoteExecution.run_command on the first available node, handles errors, and returns JSON-formatted results via TextContent.async def _handle_execute_python(self, arguments: dict) -> list[types.TextContent]: """处理Python代码执行请求。""" global _unreal_connection # 确保连接存在且有效 try: if not _unreal_connection or not _unreal_connection.remote_nodes: _unreal_connection = get_unreal_connection() # 等待一小段时间以确保连接建立 await asyncio.sleep(1) if not _unreal_connection or not _unreal_connection.remote_nodes: return [types.TextContent(type="text", text=json.dumps({ "success": False, "error": "无法连接到Unreal实例,请确保Unreal正在运行并启用了远程执行" }))] except Exception as e: return [types.TextContent(type="text", text=json.dumps({ "success": False, "error": f"连接Unreal失败: {str(e)}" }))] code = arguments.get("code") if not code: return [types.TextContent(type="text", text=json.dumps({ "success": False, "error": "未提供Python代码" }))] unattended = arguments.get("unattended", True) exec_mode = MODE_EXEC_STATEMENT # exec_mode = MODE_EXEC_FILE try: # 获取第一个可用节点 nodes = _unreal_connection.remote_nodes if not nodes: return [types.TextContent(type="text", text=json.dumps({ "success": False, "error": "未发现任何Unreal节点" }))] node_id = nodes[0]["node_id"] _unreal_connection.open_command_connection(node_id) result = _unreal_connection.run_command( code, unattended=unattended, exec_mode=exec_mode ) _unreal_connection.close_command_connection() # 处理Unreal返回的结果 if not result.get("success", False): return [types.TextContent(type="text", text=json.dumps({ "success": False, "error": result.get("result", "未知错误") }))] # 成功执行,返回结果 return [types.TextContent(type="text", text=json.dumps({ "success": True, "result": result.get("result", "") }))] except Exception as e: if _unreal_connection: try: _unreal_connection.close_command_connection() except: pass return [types.TextContent(type="text", text=json.dumps({ "success": False, "error": f"执行失败: {str(e)}" }))]
- Schema definition for 'execute-python' tool within the list_tools handler, specifying input (code string required, optional unattended boolean) and output (success boolean required, optional result/error strings).types.Tool( name="execute-python", description="在Unreal中执行Python代码", inputSchema={ "type": "object", "properties": { "code": {"type": "string"}, "unattended": {"type": "boolean", "default": True}, }, "required": ["code"], }, outputSchema={ "type": "object", "properties": { "success": {"type": "boolean"}, "result": {"type": "string"}, "error": {"type": "string"} }, "required": ["success"] } ), ]
- src/mcp_server_unreal/server.py:95-121 (registration)Registers the 'execute-python' tool via @server.list_tools() decorator in McpUnrealServer._setup_handlers(), returning the tool definition with schema.@self.server.list_tools() async def handle_list_tools() -> list[types.Tool]: """列出可用的工具。""" return [ types.Tool( name="execute-python", description="在Unreal中执行Python代码", inputSchema={ "type": "object", "properties": { "code": {"type": "string"}, "unattended": {"type": "boolean", "default": True}, }, "required": ["code"], }, outputSchema={ "type": "object", "properties": { "success": {"type": "boolean"}, "result": {"type": "string"}, "error": {"type": "string"} }, "required": ["success"] } ), ]
- src/mcp_server_unreal/server.py:128-137 (registration)Dispatches 'execute-python' tool calls via @server.call_tool() to the _handle_execute_python method.@self.server.call_tool() async def handle_call_tool( name: str, arguments: dict | None ) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]: """处理工具执行请求。""" if name == "connect-unreal": return await self._handle_connect_unreal(arguments or {}) elif name == "execute-python": return await self._handle_execute_python(arguments or {}) raise ValueError(f"未知的工具: {name}")