MCP-DB Contracts

Typisierte Datenstrukturen für Request und Response.

QueryRequest

Immutable Request-Objekt für Datenbankabfragen.

from dataclasses import dataclass
from typing import Optional

@dataclass(frozen=True)
class QueryRequest:
    """Immutable Query Request - SRP: Nur Query-Daten"""
    query: str
    params: Optional[tuple] = None
    database: str = "ki_dev"
    max_rows: int = 100
FeldTypDefaultBeschreibung
querystr-SQL SELECT Statement
paramsOptional[tuple]NonePrepared Statement Parameter
databasestr"ki_dev"Zieldatenbank
max_rowsint100Maximale Ergebniszeilen

QueryStatus

Enum für Query-Ergebnisse.

from enum import Enum

class QueryStatus(Enum):
    SUCCESS = "success"
    ERROR = "error"
    DENIED = "denied"
StatusBedeutung
SUCCESSQuery erfolgreich ausgeführt
ERRORTechnischer Fehler bei Ausführung
DENIEDQuery durch Validator abgelehnt

QueryResponse

Strukturierte Antwort auf Datenbankabfragen.

@dataclass
class QueryResponse:
    """Structured Response - SRP: Nur Response-Daten"""
    status: QueryStatus
    data: Optional[List[dict]] = None
    row_count: int = 0
    error: Optional[str] = None
    execution_ms: float = 0.0
FeldTypBeschreibung
statusQueryStatusErgebnis-Status
dataOptional[List[dict]]Ergebniszeilen
row_countintAnzahl Zeilen
errorOptional[str]Fehlermeldung (gekürzt)
execution_msfloatAusführungszeit in ms

ExecuteContract

Contract für DDL-Operationen (db_execute Tool).

@dataclass(frozen=True)
class ExecuteRequest:
    """Request für DDL-Statements"""
    statement: str
    database: str = "ki_dev"
    params: Optional[tuple] = None

@dataclass
class ExecuteResponse:
    """Response für DDL-Statements"""
    status: str  # success, error, denied
    affected_rows: int = 0
    error: Optional[str] = None
    execution_ms: float = 0.0

Beispiel-Nutzung

# Request erstellen
request = QueryRequest(
    query="SELECT * FROM mcp_log WHERE status = %s",
    params=("success",),
    database="ki_dev",
    max_rows=50
)

# Response auswerten
if response.status == QueryStatus.SUCCESS:
    for row in response.data:
        print(row)
else:
    print(f"Fehler: {response.error}")

Logging

Alle Operationen werden direkt in ki_dev.mcp_log protokolliert. Die Logging-Struktur entspricht der mcp_log Tabelle:

FeldTypBeschreibung
client_nameVARCHAR(50)Client-Identifikation (mcp-db)
requestTEXTQuery-Text (gekürzt)
statusENUMsuccess, error, denied
duration_msINTAusführungsdauer
error_messageTEXTFehlerdetails (optional)

Verwandte Kapitel