main.py•2.13 kB
#!/usr/bin/env python3
"""Main entry point for NIX MCP Server"""
import sys
import logging
import os
from pathlib import Path
from logging.handlers import RotatingFileHandler
# Configure logging based on environment
log_level = os.getenv("NIX_MCP_DEBUG", "INFO")
# Create logs directory in project root
log_dir = Path(__file__).parent / ".logs"
log_dir.mkdir(parents=True, exist_ok=True)
log_file = log_dir / "nix-mcp.log"
# Configure logging with both file and stderr handlers
handlers = []
# Always log to file for debugging
file_handler = RotatingFileHandler(
log_file,
maxBytes=10*1024*1024, # 10MB
backupCount=3
)
file_handler.setFormatter(
logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
)
handlers.append(file_handler)
# Also log to stderr if not in production
if log_level.upper() == "DEBUG":
handlers.append(logging.StreamHandler(sys.stderr))
logging.basicConfig(
level=getattr(logging, log_level.upper()),
handlers=handlers
)
logger = logging.getLogger(__name__)
# Log the log file location on startup
logger.info(f"NIX MCP Server logs: {log_file}")
# Add src to path
sys.path.insert(0, str(Path(__file__).parent / "src"))
try:
from nix_mcp.server_fastmcp import mcp
logger.info("Successfully imported MCP modules")
except ImportError as e:
logger.error(f"Failed to import required modules: {e}")
sys.exit(1)
def main():
"""Run the MCP server"""
logger.info("Starting NIX MCP Server...")
logger.debug(f"Python version: {sys.version}")
logger.debug(f"Working directory: {os.getcwd()}")
logger.debug(f"Script path: {__file__}")
try:
# FastMCP handles its own event loop
mcp.run("stdio")
except Exception as e:
logger.error(f"Server error: {e}", exc_info=True)
raise
if __name__ == "__main__":
try:
logger.info("NIX MCP Server starting up...")
main()
except KeyboardInterrupt:
logger.info("Server stopped by user")
sys.exit(0)
except Exception as e:
logger.error(f"Fatal error: {e}", exc_info=True)
sys.exit(1)