"""
MCP4DRL Standalone Server
Runs without needing mcp4drl as an installed module.
"""
import sys
import os
from pathlib import Path
# Redirect stdout to stderr temporarily to suppress PM4Py progress bars
# MCP requires stdout to be reserved for JSON communication only
_original_stdout = sys.stdout
sys.stdout = sys.stderr
# Add project root to path so we can import mcp4drl
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
# Now we can import from mcp4drl
from mcp4drl.config import CONFIG
from mcp4drl.core.simulator_wrapper import SimulatorWrapper
from mcp4drl.core.agent_wrapper import AgentWrapper
from mcp4drl.tools.state_tools import register_state_tools
from mcp4drl.tools.agent_tools import register_agent_tools
from mcp4drl.tools.comparison_tools import register_comparison_tools
from mcp4drl.tools.simulation_tools import register_simulation_tools
from fastmcp import FastMCP
# Initialize FastMCP server
mcp = FastMCP("mcp4drl")
# Global instances
simulator = None
agent = None
def initialize_server():
"""Initialize simulator and agent wrappers"""
global simulator, agent
# Initialize simulator
simulator = SimulatorWrapper(
event_log_path=CONFIG.event_log_path,
available_resources=CONFIG.available_resources,
queue_capacity_modifier=CONFIG.queue_capacity_modifier,
num_initial_cases=CONFIG.num_initial_cases,
state_repr=CONFIG.state_repr
)
# Initialize agent
agent = AgentWrapper(
model_path=CONFIG.model_path,
simulator_wrapper=simulator
)
# Register tools
register_state_tools(mcp, simulator)
register_agent_tools(mcp, agent)
register_comparison_tools(mcp, simulator, agent)
register_simulation_tools(mcp, simulator, agent)
if __name__ == "__main__":
# Initialize server components
initialize_server()
# Restore stdout for MCP JSON communication
sys.stdout = _original_stdout
# Run server with configured transport
if CONFIG.transport == "stdio":
mcp.run(transport="stdio")
elif CONFIG.transport == "sse":
mcp.run(
transport="sse",
host=CONFIG.host,
port=CONFIG.port
)
else:
raise ValueError(f"Unknown transport: {CONFIG.transport}")