#!/usr/bin/env python3 """ Common CLI functionality for the GitLab Python MCP server. """ import argparse import asyncio import logging import os import sys import mcp_server_gitlab_python from .server import main logger = logging.getLogger("mcp_gitlab_python_server") def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="GitLab Python MCP Server") parser.add_argument( "--transport", choices=["stdio", "remote"], default="stdio", help="Transport type (stdio or remote)", ) parser.add_argument( "--host", default="127.0.0.1", help="Host to bind to for remote transport (default: 127.0.0.1)", ) parser.add_argument( "--port", type=int, default=8080, help="Port to bind to for remote transport (default: 8080)", ) parser.add_argument( "--log-level", choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], default="INFO", help="Set the logging level (default: INFO)", ) return parser.parse_args() def validate_args(args: argparse.Namespace) -> argparse.Namespace: if (args.transport == "remote" and args.port < 1024 and not sys.platform.startswith("win")): logger.warning( "Using a port below 1024 may require root privileges on Unix-like systems." ) return args def setup_logging(level: str, transport: str) -> None: os.makedirs("logs", exist_ok=True) file_handler = logging.FileHandler("logs/mcp_server.log") file_handler.setLevel(getattr(logging, level)) file_handler.setFormatter(logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" )) console_handler = logging.StreamHandler() if transport == "stdio": console_handler.setLevel(logging.WARNING) else: console_handler.setLevel(getattr(logging, level)) console_handler.setFormatter(logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" )) root_logger = logging.getLogger() root_logger.setLevel(getattr(logging, level)) root_logger.handlers = [] root_logger.addHandler(file_handler) root_logger.addHandler(console_handler) def run_server() -> None: logger.error(f"MCP GitLab Python Server CLI starting, version: {mcp_server_gitlab_python.__version__}") args = validate_args(parse_args()) setup_logging(args.log_level, args.transport) try: asyncio.run(main(args.transport, args.host, args.port)) except KeyboardInterrupt: logger.info("Server stopped by user") except Exception as e: logger.error(f"Error running server: {e}") sys.exit(1)