server_app.pyβ’4.4 kB
"""
μλ² λ©μΈ μ ν리μΌμ΄μ
HTTP μλ²μ MCP μλ²λ₯Ό κ΄λ¦¬ν©λλ€.
"""
import asyncio
import logging
import argparse
import sys
from typing import Optional
from config import config
from database import db_manager
from ai_provider import ai_manager
from mcp_server import run_mcp_server
from http_server import run_http_server
from common import clear_screen, init_environment
#stdoutμ clearνκ³ μμ
clear_screen()
logger = logging.getLogger(__name__)
class ServerApp:
"""μλ² μ ν리μΌμ΄μ
ν΄λμ€"""
def __init__(self):
self.http_task: Optional[asyncio.Task] = None
self.mcp_task: Optional[asyncio.Task] = None
async def start_http_server(self):
"""HTTP μλ²λ₯Ό μμν©λλ€."""
try:
await run_http_server()
except Exception as e:
logger.error(f"HTTP μλ² μμ μ€ν¨: {e}")
raise
async def start_mcp_server(self):
"""MCP μλ²λ₯Ό μμν©λλ€."""
try:
await run_mcp_server()
except Exception as e:
logger.error(f"MCP μλ² μμ μ€ν¨: {e}")
raise
async def run_both_servers(self):
"""HTTP μλ²μ MCP μλ²λ₯Ό λμμ μ€νν©λλ€."""
try:
# λ μλ²λ₯Ό λμμ μ€ν
self.http_task = asyncio.create_task(self.start_http_server())
self.mcp_task = asyncio.create_task(self.start_mcp_server())
logger.info("HTTP μλ²μ MCP μλ²κ° μμλμμ΅λλ€.")
logger.info(f"HTTP μλ²: http://{config.SERVER_HOST}:{config.SERVER_PORT}")
logger.info("MCP μλ²: stdio ν΅μ μ€λΉ μλ£")
# λ μλ²κ° μλ£λ λκΉμ§ λκΈ°
await asyncio.gather(self.http_task, self.mcp_task)
except Exception as e:
logger.error(f"μλ² μ€ν μ€ μ€λ₯: {e}")
raise
finally:
await self.cleanup()
async def run_http_only(self):
"""HTTP μλ²λ§ μ€νν©λλ€."""
try:
logger.info("\n\nπ¨===== MySQL Hub HTTP Server μμ =====\n")
logger.debug("HTTP μλ²λ§ μμν©λλ€.")
await self.start_http_server()
except Exception as e:
logger.error(f"HTTP μλ² μ€ν μ€ μ€λ₯: {e}")
raise
finally:
await self.cleanup()
async def run_mcp_only(self):
"""MCP μλ²λ§ μ€νν©λλ€."""
try:
logger.info("\n\nπ¨===== MySQL Hub MCP Server μμ =====\n")
logger.debug("MCP μλ²λ§ μμν©λλ€.")
await self.start_mcp_server()
except Exception as e:
logger.error(f"MCP μλ² μ€ν μ€ μ€λ₯: {e}")
raise
finally:
await self.cleanup()
async def cleanup(self):
"""리μμ€λ₯Ό μ 리ν©λλ€."""
if self.http_task and not self.http_task.done():
self.http_task.cancel()
if self.mcp_task and not self.mcp_task.done():
self.mcp_task.cancel()
logger.info("μλ²κ° μ’
λ£λμμ΅λλ€.")
def main():
"""λ©μΈ ν¨μ"""
parser = argparse.ArgumentParser(description="MySQL Hub MCP Server")
parser.add_argument(
"--mode",
choices=["both", "http", "mcp"],
default="both",
help="μ€ν λͺ¨λ (κΈ°λ³Έκ°: both)"
)
parser.add_argument(
"--config",
help="μ€μ νμΌ κ²½λ‘"
)
args = parser.parse_args()
try:
# λ‘κΉ
μ€μ
#config.setup_logging()
# μλ² μ ν리μΌμ΄μ
μμ±
app = ServerApp()
# λͺ¨λμ λ°λΌ μλ² μ€ν
if args.mode == "both":
asyncio.run(app.run_both_servers())
elif args.mode == "http":
asyncio.run(app.run_http_only())
elif args.mode == "mcp":
asyncio.run(app.run_mcp_only())
except KeyboardInterrupt:
logger.info("μ¬μ©μμ μν΄ μλ²κ° μ€λ¨λμμ΅λλ€.")
except Exception as e:
logger.error(f"μλ² μ€ν μ€ μ€λ₯κ° λ°μνμ΅λλ€: {e}")
sys.exit(1)
if __name__ == "__main__":
main()