schema_tool.py

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 5

Funktionen 1

Code

"""Schema Tool - Tabellen-Struktur abfragen"""

from datetime import datetime

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


def register_schema_tool(mcp):
    """Registriert db_schema Tool"""

    logger = get_logger("mcp-db", Config)

    @mcp.tool()
    def db_schema(database: str = "ki_protokoll") -> dict:
        """
        Zeigt alle Tabellen in einer Datenbank.

        Args:
            database: Zieldatenbank (ki_protokoll oder ki_system)

        Returns:
            Dict mit tables (List[dict])
        """
        # Database Allowlist pruefen
        if database not in Config.ALLOWED_DATABASES:
            error = f"Database '{database}' not allowed"
            try:
                logger.log(
                    LogEntry(
                        timestamp=datetime.now(),
                        client_name="mcp-db",
                        tool_name="db_schema",
                        request=f"db_schema({database})",
                        status="denied",
                        error_message=error,
                    )
                )
            except Exception:
                pass
            return {"error": error, "tables": []}

        try:
            with DatabaseConnection.get_connection(database) as conn:
                # buffered=True verhindert "Unread result found" Fehler
                cursor = conn.cursor(dictionary=True, buffered=True)
                cursor.execute(
                    """SELECT TABLE_NAME, TABLE_ROWS, CREATE_TIME
                       FROM information_schema.TABLES
                       WHERE TABLE_SCHEMA = %s
                       AND TABLE_TYPE = 'BASE TABLE'
                       ORDER BY TABLE_NAME""",
                    (database,),
                )
                tables = cursor.fetchall()
                cursor.close()

                try:
                    logger.log(
                        LogEntry(
                            timestamp=datetime.now(),
                            client_name="mcp-db",
                            tool_name="db_schema",
                            request=f"db_schema({database})",
                            status="success",
                        )
                    )
                except Exception:
                    pass

                return {"tables": tables, "database": database}

        except Exception as e:
            try:
                logger.log(
                    LogEntry(
                        timestamp=datetime.now(),
                        client_name="mcp-db",
                        tool_name="db_schema",
                        request=f"db_schema({database})",
                        status="error",
                        error_message=str(e)[:200],
                    )
                )
            except Exception:
                pass
            return {"error": str(e), "tables": []}
← Übersicht