From b6daa775980253fb9581c891b0c547257339ed88 Mon Sep 17 00:00:00 2001 From: Dawid Rycerz Date: Tue, 15 Jul 2025 11:16:25 +0300 Subject: feat: initial gitlab_python mcp --- .../src/mcp_server_gitlab_python/cli.py | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 servers/gitlab_python/src/mcp_server_gitlab_python/cli.py (limited to 'servers/gitlab_python/src/mcp_server_gitlab_python/cli.py') diff --git a/servers/gitlab_python/src/mcp_server_gitlab_python/cli.py b/servers/gitlab_python/src/mcp_server_gitlab_python/cli.py new file mode 100644 index 0000000..1b4db35 --- /dev/null +++ b/servers/gitlab_python/src/mcp_server_gitlab_python/cli.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +""" +Common CLI functionality for the GitLab Python MCP server. +""" + +import argparse +import asyncio +import logging +import sys +import os + +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: + 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) \ No newline at end of file -- cgit v1.2.3