Skip to main content
Glama

MySQL Hub MCP Server

by CHOIJun-0613
common.pyโ€ข6.27 kB
from pydantic import BaseModel, Field from typing import Dict, Any, List, Optional import logging import os import sys #from database import db_manager #from ai_provider import ai_manager #from config import config logger = logging.getLogger(__name__) # Pydantic ๋ชจ๋ธ๋“ค class SQLQueryRequest(BaseModel): query: str class NaturalLanguageRequest(BaseModel): question: str class TableSchemaRequest(BaseModel): table_name: str class AIProviderRequest(BaseModel): provider: str = Field(..., description="AI Provider ์ด๋ฆ„", pattern="^(groq|ollama|google)$") class Response(BaseModel): success: bool data: Any = None error: Optional[str] = None def model_dump(self, **kwargs): """UTF-8 ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ปค์Šคํ…€ model_dump""" try: return super().model_dump(**kwargs) except UnicodeDecodeError as e: # UTF-8 ์ธ์ฝ”๋”ฉ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ logger.warning(f"UTF-8 ์ธ์ฝ”๋”ฉ ์˜ค๋ฅ˜ ๋ฐœ์ƒ, ๋ฐ์ดํ„ฐ ์ •๋ฆฌ ์ค‘: {e}") # ๋ฐ์ดํ„ฐ ์ •๋ฆฌ cleaned_data = self._clean_data(self.data) cleaned_error = self._clean_string(self.error) if self.error else None return { "success": self.success, "data": cleaned_data, "error": cleaned_error } def _clean_data(self, data): """๋ฐ์ดํ„ฐ์—์„œ UTF-8 ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ •๋ฆฌ""" if isinstance(data, str): return self._clean_string(data) elif isinstance(data, dict): return {k: self._clean_data(v) for k, v in data.items()} elif isinstance(data, list): return [self._clean_data(item) for item in data] else: return data def _clean_string(self, text): """๋ฌธ์ž์—ด์—์„œ UTF-8 ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ •๋ฆฌ""" if not isinstance(text, str): return str(text) try: # UTF-8๋กœ ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉํ•˜์—ฌ ๋ฌธ์ œ ์žˆ๋Š” ๋ฌธ์ž ์ œ๊ฑฐ return text.encode('utf-8', errors='ignore').decode('utf-8') except Exception: # ์ตœํ›„์˜ ์ˆ˜๋‹จ: ASCII๋กœ ๋ณ€ํ™˜ return text.encode('ascii', errors='ignore').decode('ascii') def clear_screen(): """ํ™”๋ฉด์„ ์ง€์šฐ๋Š” ํ•จ์ˆ˜""" if os.name == 'nt': # Windows ํ™˜๊ฒฝ์ด์ง€๋งŒ Git Bash ๋“ฑ์—์„œ๋Š” 'clear'๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ if 'MSYSTEM' in os.environ or 'MINGW64' in os.environ or 'MINGW32' in os.environ: os.system('clear') else: os.system('cls') else: os.system('clear') def init_environment(db_manager, ai_manager): """์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก DB connection ์ƒ์„ฑ ๋ฐ AI Provider ์ƒ์„ฑ""" try: # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ดˆ๊ธฐํ™” db_manager.constructor() # AI Provider ์ดˆ๊ธฐํ™” ai_manager.constructor() logger.info("ํ™˜๊ฒฝ ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.") except Exception as e: logger.error(f"ํ™˜๊ฒฝ ์ดˆ๊ธฐํ™” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {e}") raise def convert_for_json_serialization(obj): """JSON ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜""" if obj is None: return None # ๋‚ ์งœ/์‹œ๊ฐ„ ํƒ€์ž…์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ import datetime if isinstance(obj, (datetime.date, datetime.datetime)): return obj.isoformat() # Decimal ํƒ€์ž…์„ float๋กœ ๋ณ€ํ™˜ from decimal import Decimal if isinstance(obj, Decimal): return float(obj) # ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ if isinstance(obj, bytes): return obj.hex() # ๋”•์…”๋„ˆ๋ฆฌ์™€ ๋ฆฌ์ŠคํŠธ๋Š” ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌ elif isinstance(obj, dict): return {k: convert_for_json_serialization(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_for_json_serialization(item) for item in obj] # ๋‹ค๋ฅธ ํƒ€์ž…์€ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ else: return obj def convert_decimal_in_result(obj): """๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ์—์„œ Decimal ํƒ€์ž…์„ float๋กœ, date ํƒ€์ž…์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ (๊ธฐ์กด ํ˜ธํ™˜์„ฑ ์œ ์ง€)""" return convert_for_json_serialization(obj) import datetime if isinstance(obj, Decimal): return float(obj) elif isinstance(obj, (datetime.date, datetime.datetime)): return obj.isoformat() elif isinstance(obj, dict): return {k: convert_decimal_in_result(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_decimal_in_result(item) for item in obj] else: return obj def check_init_environment(db_manager, args, ai_manager, config): # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ™•์ธ if not db_manager.is_connected(): logger.error("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") logger.error("ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ .env ํŒŒ์ผ์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.") sys.exit(1) logger.info("MySQL Hub Server๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.") logger.info(f"์‹คํ–‰ ๋ชจ๋“œ: {args}") logger.info(f"AI Provider: {ai_manager.get_current_provider()}") logger.info(f"HTTP ์„œ๋ฒ„: http://{config.HTTP_SERVER_HOST}:{config.HTTP_SERVER_PORT}") logger.info(f"log level : {config.LOG_LEVEL}") # json์„ ์ž…๋ ฅ๋ฐ›์•„ json format์— ๋งž๊ฒŒ string์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ def json_to_pretty_string(data): """ json ๊ฐ์ฒด๋ฅผ ์˜ˆ์˜๊ฒŒ ํฌ๋งท๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Args: data (dict or list): JSON ๊ฐ์ฒด Returns: str: ์˜ˆ์˜๊ฒŒ ํฌ๋งท๋œ JSON ๋ฌธ์ž์—ด """ try: import json # Response ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ model_dump() ์‚ฌ์šฉ if hasattr(data, 'model_dump'): data = data.model_dump() # ๊ณตํ†ต ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€ํ™˜ converted_data = convert_for_json_serialization(data) return json.dumps(converted_data, ensure_ascii=False, indent=2, sort_keys=True) except Exception as e: return f"JSON ๋ณ€ํ™˜ ์˜ค๋ฅ˜: {e}"

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CHOIJun-0613/mysql-hub-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server