227 lines
6.3 KiB
Python
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
|