MCP-DB Contracts

Typisierte Datenstrukturen für Request, Response und Logging.

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_protokoll"
    max_rows: int = 100
FeldTypDefaultBeschreibung
querystr-SQL SELECT Statement
paramsOptional[tuple]NonePrepared Statement Parameter
databasestr"ki_protokoll"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

LogEntry

Struktur für Protokoll-Einträge in mcp_log.

from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional

@dataclass
class LogEntry:
    """Protokoll-Eintrag für ki_protokoll.mcp_log"""
    client_name: str = "mcp-db"
    request: str = ""
    status: str = "success"
    duration_ms: int = 0
    error_message: Optional[str] = None
    timestamp: datetime = field(default_factory=datetime.now)
FeldTypDefaultBeschreibung
client_namestr"mcp-db"Client-Identifikation
requeststr""Query-Text (gekürzt auf 200 Zeichen)
statusstr"success"success, error, denied
duration_msint0Ausführungsdauer
error_messageOptional[str]NoneFehlerdetails
timestampdatetimenow()Zeitstempel

Beispiel-Nutzung

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

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

Verwandte Kapitel