summaryrefslogtreecommitdiff
path: root/servers/gitlab_python/src/mcp_server_gitlab_python/cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'servers/gitlab_python/src/mcp_server_gitlab_python/cli.py')
-rw-r--r--servers/gitlab_python/src/mcp_server_gitlab_python/cli.py81
1 files changed, 81 insertions, 0 deletions
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