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
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| unattended | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| error | No | ||
| result | No | ||
| success | Yes |
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}")