Files
Maya_MCP/loader.py
2025-04-16 22:54:24 +08:00

227 lines
6.3 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Maya MCP Loader
Module for loading and managing the MCP server in Maya.
Version: 1.0.0
Author: Jeffrey Tsai
"""
import os
import sys
import logging
import threading
import time
import maya.cmds as cmds
import maya.utils as utils
# Configure logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger("MayaMCP.Loader")
# Global variables
_mcp_menu = None
def initialize():
"""
Initialize the MCP server
Returns:
int: Port number if server started successfully, None otherwise
"""
try:
# Import server module
from server import start_server, stop_server
# Stop any existing server
stop_server()
# Start server
port = start_server()
if port:
# Print clear message to script editor
message = "=" * 50
message += "\nMCP SERVER STARTED SUCCESSFULLY ON PORT {}\n".format(port)
message += "=" * 50
print(message)
# Show message in Maya viewport
cmds.inViewMessage(
message="MCP Server started on port {}".format(port),
position="topCenter",
fade=True,
fadeOutTime=5.0,
backColor=(0.2, 0.6, 0.2),
fontSize=24
)
logger.info(f"MCP server started on port {port}")
return port
else:
error_msg = "Failed to start MCP server"
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
logger.error(error_msg)
return None
except Exception as e:
error_msg = f"Error initializing MCP server: {e}"
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
logger.error(error_msg)
return None
def create_menu():
"""
Create the MCP menu in Maya
Returns:
str: Menu name if created successfully, None otherwise
"""
global _mcp_menu
try:
# Delete existing menu if it exists
if _mcp_menu and cmds.menu(_mcp_menu, exists=True):
cmds.deleteUI(_mcp_menu)
# Get main window
main_window = "MayaWindow"
# Create menu
_mcp_menu = cmds.menu("MCPMenu", label="MCP", parent=main_window)
# Add menu items
cmds.menuItem(label="Start Server", command=lambda x: start_server_cmd())
cmds.menuItem(label="Stop Server", command=lambda x: stop_server_cmd())
cmds.menuItem(divider=True)
cmds.menuItem(label="About", command=lambda x: about_cmd())
print("MCP menu created successfully")
logger.info("MCP menu created")
return _mcp_menu
except Exception as e:
error_msg = f"Error creating MCP menu: {e}"
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
logger.error(error_msg)
return None
def start_server_cmd():
"""Command to start the MCP server"""
try:
from server import start_server, is_server_running
if is_server_running():
cmds.confirmDialog(
title="MCP Server",
message="MCP server is already running",
button="OK"
)
return
port = start_server()
if port:
cmds.inViewMessage(
message=f"MCP server started on port {port}",
position="topCenter",
fade=True,
fadeOutTime=5.0,
backColor=(0.2, 0.6, 0.2),
fontSize=24
)
else:
cmds.confirmDialog(
title="MCP Server Error",
message="Failed to start MCP server",
button="OK"
)
except Exception as e:
error_msg = f"Error starting MCP server: {e}"
logger.error(error_msg)
cmds.confirmDialog(
title="MCP Server Error",
message=error_msg,
button="OK"
)
def stop_server_cmd():
"""Command to stop the MCP server"""
try:
from server import stop_server, is_server_running
if not is_server_running():
cmds.confirmDialog(
title="MCP Server",
message="MCP server is not running",
button="OK"
)
return
success = stop_server()
if success:
cmds.inViewMessage(
message="MCP server stopped",
position="topCenter",
fade=True,
fadeOutTime=5.0,
backColor=(0.6, 0.2, 0.2),
fontSize=24
)
else:
cmds.confirmDialog(
title="MCP Server Error",
message="Failed to stop MCP server",
button="OK"
)
except Exception as e:
error_msg = f"Error stopping MCP server: {e}"
logger.error(error_msg)
cmds.confirmDialog(
title="MCP Server Error",
message=error_msg,
button="OK"
)
def about_cmd():
"""Command to show about dialog"""
cmds.confirmDialog(
title="About MCP",
message="Maya MCP (Model Context Protocol)\nVersion 1.0.0\n\nAuthor: Jeffrey Tsai",
button="OK"
)
def auto_load():
"""
Automatically load the MCP server and create the menu
Returns:
bool: Whether auto-load was successful
"""
try:
# Create menu
create_menu()
# Start server in a separate thread
def delayed_start():
time.sleep(2) # Wait for Maya to fully initialize
initialize()
thread = threading.Thread(target=delayed_start)
thread.daemon = True
thread.start()
print("\n" + "=" * 50)
print("MCP AUTO-LOAD INITIATED")
print("Menu created and server starting...")
print("=" * 50 + "\n")
return True
except Exception as e:
error_msg = f"Error in auto-load: {e}"
print("\n" + "!" * 50 + f"\n{error_msg}\n" + "!" * 50)
logger.error(error_msg)
return False