databases_tool.py

Code Hygiene Score: 90

Keine Issues gefunden.

Dependencies 9

Funktionen 1

Code

"""Databases Tool - Listet verfuegbare Datenbanken auf."""

import time
from datetime import datetime

from shared.constants import LOG_ENTRY_MAX_LENGTH, LOG_QUERY_MAX_LENGTH, MS_PER_SECOND

from config import Config
from infrastructure.db_connection import DatabaseConnection
from shared.domain import LogEntry
from shared.infrastructure import get_logger


def register_databases_tool(mcp) -> None:
    """Registriert db_databases Tool."""
    logger = get_logger("mcp-db", Config)

    @mcp.tool()
    def db_databases() -> dict:
        """
        Listet alle verfuegbaren Datenbanken auf.

        Returns:
            Dict mit databases (Liste der erlaubten DBs mit Tabellen-Count)
        """
        start = time.time()

        try:
            # Verbinde zu einer erlaubten DB um Queries auszufuehren
            with DatabaseConnection.get_connection("ki_dev") as conn:
                cursor = conn.cursor(dictionary=True, buffered=True)

                databases = []
                for db_name in Config.ALLOWED_DATABASES:
                    cursor.execute(
                        """SELECT COUNT(*) as table_count
                           FROM information_schema.tables
                           WHERE table_schema = %s""",
                        (db_name,),
                    )
                    row = cursor.fetchone()
                    table_count = row["table_count"] if row else 0

                    databases.append({
                        "name": db_name,
                        "tables_count": table_count,
                    })

                cursor.close()

                duration = int((time.time() - start) * MS_PER_SECOND)

                # Log
                try:
                    logger.log(
                        LogEntry(
                            timestamp=datetime.now(),
                            client_name="mcp-db",
                            tool_name="db_databases",
                            request="SHOW DATABASES (filtered)",
                            status="success",
                            duration_ms=duration,
                        )
                    )
                except Exception:
                    pass

                return {
                    "status": "success",
                    "databases": databases,
                    "execution_ms": duration,
                }

        except Exception as e:
            duration = int((time.time() - start) * MS_PER_SECOND)

            try:
                logger.log(
                    LogEntry(
                        timestamp=datetime.now(),
                        client_name="mcp-db",
                        tool_name="db_databases",
                        request="SHOW DATABASES",
                        status="error",
                        duration_ms=duration,
                        error_message=str(e)[:LOG_ENTRY_MAX_LENGTH],
                    )
                )
            except Exception:
                pass

            return {
                "status": "error",
                "error": str(e)[:LOG_QUERY_MAX_LENGTH],
                "execution_ms": duration,
            }
← Übersicht