{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 42,
"content": "<nav class=\"breadcrumb\">\n <a href=\"\/docs\">Dokumentation<\/a> » <a href=\"\/docs\/mcp\/mcp-db\">MCP-DB<\/a> » Contracts\n<\/nav>\n\n<h1>MCP-DB Contracts<\/h1>\n<p>Typisierte Datenstrukturen für Request und Response.<\/p>\n\n<h2>QueryRequest<\/h2>\n<p>Immutable Request-Objekt für Datenbankabfragen.<\/p>\n\n<pre><code>from dataclasses import dataclass\nfrom typing import Optional\n\n@dataclass(frozen=True)\nclass QueryRequest:\n \"\"\"Immutable Query Request - SRP: Nur Query-Daten\"\"\"\n query: str\n params: Optional[tuple] = None\n database: str = \"ki_dev\"\n max_rows: int = 100<\/code><\/pre>\n\n<table>\n <tr><th>Feld<\/th><th>Typ<\/th><th>Default<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td>query<\/td><td>str<\/td><td>-<\/td><td>SQL SELECT Statement<\/td><\/tr>\n <tr><td>params<\/td><td>Optional[tuple]<\/td><td>None<\/td><td>Prepared Statement Parameter<\/td><\/tr>\n <tr><td>database<\/td><td>str<\/td><td>\"ki_dev\"<\/td><td>Zieldatenbank<\/td><\/tr>\n <tr><td>max_rows<\/td><td>int<\/td><td>100<\/td><td>Maximale Ergebniszeilen<\/td><\/tr>\n<\/table>\n\n<h2>QueryStatus<\/h2>\n<p>Enum für Query-Ergebnisse.<\/p>\n\n<pre><code>from enum import Enum\n\nclass QueryStatus(Enum):\n SUCCESS = \"success\"\n ERROR = \"error\"\n DENIED = \"denied\"<\/code><\/pre>\n\n<table>\n <tr><th>Status<\/th><th>Bedeutung<\/th><\/tr>\n <tr><td>SUCCESS<\/td><td>Query erfolgreich ausgeführt<\/td><\/tr>\n <tr><td>ERROR<\/td><td>Technischer Fehler bei Ausführung<\/td><\/tr>\n <tr><td>DENIED<\/td><td>Query durch Validator abgelehnt<\/td><\/tr>\n<\/table>\n\n<h2>QueryResponse<\/h2>\n<p>Strukturierte Antwort auf Datenbankabfragen.<\/p>\n\n<pre><code>@dataclass\nclass QueryResponse:\n \"\"\"Structured Response - SRP: Nur Response-Daten\"\"\"\n status: QueryStatus\n data: Optional[List[dict]] = None\n row_count: int = 0\n error: Optional[str] = None\n execution_ms: float = 0.0<\/code><\/pre>\n\n<table>\n <tr><th>Feld<\/th><th>Typ<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td>status<\/td><td>QueryStatus<\/td><td>Ergebnis-Status<\/td><\/tr>\n <tr><td>data<\/td><td>Optional[List[dict]]<\/td><td>Ergebniszeilen<\/td><\/tr>\n <tr><td>row_count<\/td><td>int<\/td><td>Anzahl Zeilen<\/td><\/tr>\n <tr><td>error<\/td><td>Optional[str]<\/td><td>Fehlermeldung (gekürzt)<\/td><\/tr>\n <tr><td>execution_ms<\/td><td>float<\/td><td>Ausführungszeit in ms<\/td><\/tr>\n<\/table>\n\n<h2>ExecuteContract<\/h2>\n<p>Contract für DDL-Operationen (db_execute Tool).<\/p>\n\n<pre><code>@dataclass(frozen=True)\nclass ExecuteRequest:\n \"\"\"Request für DDL-Statements\"\"\"\n statement: str\n database: str = \"ki_dev\"\n params: Optional[tuple] = None\n\n@dataclass\nclass ExecuteResponse:\n \"\"\"Response für DDL-Statements\"\"\"\n status: str # success, error, denied\n affected_rows: int = 0\n error: Optional[str] = None\n execution_ms: float = 0.0<\/code><\/pre>\n\n<h2>Beispiel-Nutzung<\/h2>\n<pre><code># Request erstellen\nrequest = QueryRequest(\n query=\"SELECT * FROM mcp_log WHERE status = %s\",\n params=(\"success\",),\n database=\"ki_dev\",\n max_rows=50\n)\n\n# Response auswerten\nif response.status == QueryStatus.SUCCESS:\n for row in response.data:\n print(row)\nelse:\n print(f\"Fehler: {response.error}\")<\/code><\/pre>\n\n<h2>Logging<\/h2>\n<p>Alle Operationen werden direkt in <code>ki_dev.mcp_log<\/code> protokolliert. Die Logging-Struktur entspricht der mcp_log Tabelle:<\/p>\n\n<table>\n <tr><th>Feld<\/th><th>Typ<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td>client_name<\/td><td>VARCHAR(50)<\/td><td>Client-Identifikation (mcp-db)<\/td><\/tr>\n <tr><td>request<\/td><td>TEXT<\/td><td>Query-Text (gekürzt)<\/td><\/tr>\n <tr><td>status<\/td><td>ENUM<\/td><td>success, error, denied<\/td><\/tr>\n <tr><td>duration_ms<\/td><td>INT<\/td><td>Ausführungsdauer<\/td><\/tr>\n <tr><td>error_message<\/td><td>TEXT<\/td><td>Fehlerdetails (optional)<\/td><\/tr>\n<\/table>\n\n<h2>Verwandte Kapitel<\/h2>\n<ul>\n <li><a href=\"\/docs\/mcp\/mcp-db-architektur\">Architektur<\/a> - Gesamtstruktur<\/li>\n <li><a href=\"\/docs\/mcp\/mcp-db-tools\">Tools<\/a> - Nutzung der Contracts<\/li>\n<\/ul>"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 42,\n \"parent_id\": 36,\n \"slug\": \"mcp-db-contracts\",\n \"path\": \"\/mcp\/mcp-db\/mcp-db-contracts\",\n \"title\": \"Contracts\",\n \"description\": \"Typisierte Datenstrukturen für Request, Response und Logging.\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/mcp\/mcp-db\\\">MCP-DB<\/a> » Contracts\\n<\/nav>\\n\\n<h1>MCP-DB Contracts<\/h1>\\n<p>Typisierte Datenstrukturen für Request und Response.<\/p>\\n\\n<h2>QueryRequest<\/h2>\\n<p>Immutable Request-Objekt für Datenbankabfragen.<\/p>\\n\\n<pre><code>from dataclasses import dataclass\\nfrom typing import Optional\\n\\n@dataclass(frozen=True)\\nclass QueryRequest:\\n \\\"\\\"\\\"Immutable Query Request - SRP: Nur Query-Daten\\\"\\\"\\\"\\n query: str\\n params: Optional[tuple] = None\\n database: str = \\\"ki_dev\\\"\\n max_rows: int = 100<\/code><\/pre>\\n\\n<table>\\n <tr><th>Feld<\/th><th>Typ<\/th><th>Default<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td>query<\/td><td>str<\/td><td>-<\/td><td>SQL SELECT Statement<\/td><\/tr>\\n <tr><td>params<\/td><td>Optional[tuple]<\/td><td>None<\/td><td>Prepared Statement Parameter<\/td><\/tr>\\n <tr><td>database<\/td><td>str<\/td><td>\\\"ki_dev\\\"<\/td><td>Zieldatenbank<\/td><\/tr>\\n <tr><td>max_rows<\/td><td>int<\/td><td>100<\/td><td>Maximale Ergebniszeilen<\/td><\/tr>\\n<\/table>\\n\\n<h2>QueryStatus<\/h2>\\n<p>Enum für Query-Ergebnisse.<\/p>\\n\\n<pre><code>from enum import Enum\\n\\nclass QueryStatus(Enum):\\n SUCCESS = \\\"success\\\"\\n ERROR = \\\"error\\\"\\n DENIED = \\\"denied\\\"<\/code><\/pre>\\n\\n<table>\\n <tr><th>Status<\/th><th>Bedeutung<\/th><\/tr>\\n <tr><td>SUCCESS<\/td><td>Query erfolgreich ausgeführt<\/td><\/tr>\\n <tr><td>ERROR<\/td><td>Technischer Fehler bei Ausführung<\/td><\/tr>\\n <tr><td>DENIED<\/td><td>Query durch Validator abgelehnt<\/td><\/tr>\\n<\/table>\\n\\n<h2>QueryResponse<\/h2>\\n<p>Strukturierte Antwort auf Datenbankabfragen.<\/p>\\n\\n<pre><code>@dataclass\\nclass QueryResponse:\\n \\\"\\\"\\\"Structured Response - SRP: Nur Response-Daten\\\"\\\"\\\"\\n status: QueryStatus\\n data: Optional[List[dict]] = None\\n row_count: int = 0\\n error: Optional[str] = None\\n execution_ms: float = 0.0<\/code><\/pre>\\n\\n<table>\\n <tr><th>Feld<\/th><th>Typ<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td>status<\/td><td>QueryStatus<\/td><td>Ergebnis-Status<\/td><\/tr>\\n <tr><td>data<\/td><td>Optional[List[dict]]<\/td><td>Ergebniszeilen<\/td><\/tr>\\n <tr><td>row_count<\/td><td>int<\/td><td>Anzahl Zeilen<\/td><\/tr>\\n <tr><td>error<\/td><td>Optional[str]<\/td><td>Fehlermeldung (gekürzt)<\/td><\/tr>\\n <tr><td>execution_ms<\/td><td>float<\/td><td>Ausführungszeit in ms<\/td><\/tr>\\n<\/table>\\n\\n<h2>ExecuteContract<\/h2>\\n<p>Contract für DDL-Operationen (db_execute Tool).<\/p>\\n\\n<pre><code>@dataclass(frozen=True)\\nclass ExecuteRequest:\\n \\\"\\\"\\\"Request für DDL-Statements\\\"\\\"\\\"\\n statement: str\\n database: str = \\\"ki_dev\\\"\\n params: Optional[tuple] = None\\n\\n@dataclass\\nclass ExecuteResponse:\\n \\\"\\\"\\\"Response für DDL-Statements\\\"\\\"\\\"\\n status: str # success, error, denied\\n affected_rows: int = 0\\n error: Optional[str] = None\\n execution_ms: float = 0.0<\/code><\/pre>\\n\\n<h2>Beispiel-Nutzung<\/h2>\\n<pre><code># Request erstellen\\nrequest = QueryRequest(\\n query=\\\"SELECT * FROM mcp_log WHERE status = %s\\\",\\n params=(\\\"success\\\",),\\n database=\\\"ki_dev\\\",\\n max_rows=50\\n)\\n\\n# Response auswerten\\nif response.status == QueryStatus.SUCCESS:\\n for row in response.data:\\n print(row)\\nelse:\\n print(f\\\"Fehler: {response.error}\\\")<\/code><\/pre>\\n\\n<h2>Logging<\/h2>\\n<p>Alle Operationen werden direkt in <code>ki_dev.mcp_log<\/code> protokolliert. Die Logging-Struktur entspricht der mcp_log Tabelle:<\/p>\\n\\n<table>\\n <tr><th>Feld<\/th><th>Typ<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td>client_name<\/td><td>VARCHAR(50)<\/td><td>Client-Identifikation (mcp-db)<\/td><\/tr>\\n <tr><td>request<\/td><td>TEXT<\/td><td>Query-Text (gekürzt)<\/td><\/tr>\\n <tr><td>status<\/td><td>ENUM<\/td><td>success, error, denied<\/td><\/tr>\\n <tr><td>duration_ms<\/td><td>INT<\/td><td>Ausführungsdauer<\/td><\/tr>\\n <tr><td>error_message<\/td><td>TEXT<\/td><td>Fehlerdetails (optional)<\/td><\/tr>\\n<\/table>\\n\\n<h2>Verwandte Kapitel<\/h2>\\n<ul>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db-architektur\\\">Architektur<\/a> - Gesamtstruktur<\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db-tools\\\">Tools<\/a> - Nutzung der Contracts<\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 6,\n \"depth\": 2,\n \"created_at\": \"2025-12-20T11:13:58\",\n \"updated_at\": \"2025-12-31T05:05:52\"\n },\n \"message\": \"Document #42 updated\"\n}"
}
]
}