{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 39,
"content": "<nav class=\"breadcrumb\">\n <a href=\"\/docs\">Dokumentation<\/a> » <a href=\"\/docs\/mcp\/mcp-db\">MCP-DB<\/a> » Architektur\n<\/nav>\n\n<h1>MCP-DB Architektur<\/h1>\n<p class=\"doc-meta\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\n\n<p>Aufbau und Struktur des MCP-DB Servers nach OOP, SRP, KISS, YAGNI Prinzipien.<\/p>\n\n<h2>Verzeichnisstruktur<\/h2>\n<pre><code>\/var\/www\/mcp-servers\/mcp_db\/\n├── server.py # MCP Server Entrypoint\n├── config.py # Zentrale Konfiguration\n├── .env # Credentials (chmod 600)\n├── .env.example # Template\n├── requirements.txt # Dependencies\n├── requirements-test.txt # Test Dependencies\n├── ruff.toml # Linter Config\n├── pytest.ini # Test Config\n├── run_tests.sh # Test Runner\n├── venv\/ # Virtual Environment\n├── tests\/ # Unit Tests\n│\n├── domain\/ # Contracts (Dataclasses)\n│ ├── __init__.py\n│ ├── query_contract.py # QueryRequest, QueryResponse\n│ └── execute_contract.py # ExecuteContract für DDL\n│\n├── validators\/ # SRP: Separate Validierung\n│ ├── __init__.py\n│ ├── query_validator.py # SELECT Validierung\n│ └── execute_validator.py # DDL Validierung (ALTER, CREATE, DROP, TRUNCATE)\n│\n├── infrastructure\/ # Implementierungen\n│ ├── __init__.py\n│ └── db_connection.py # MariaDB Connection Pool\n│\n└── tools\/ # MCP Tools (10 Dateien)\n ├── __init__.py\n ├── select_tool.py # db_select\n ├── schema_tool.py # db_schema\n ├── stats_tool.py # db_stats\n ├── databases_tool.py # db_databases\n ├── tables_tool.py # db_tables\n ├── describe_tool.py # db_describe\n ├── insert_tool.py # db_insert\n ├── update_tool.py # db_update\n ├── delete_tool.py # db_delete\n └── execute_tool.py # db_execute (DDL)<\/code><\/pre>\n\n<h2>Komponenten-Diagramm<\/h2>\n<pre><code>┌─────────────────────────────────────────────────────────────┐\n│ Claude Code │\n│ │ │\n│ MCP Protocol │\n│ │ │\n│ ▼ │\n│ ┌──────────────────────────────────────────────────────┐ │\n│ │ server.py │ │\n│ │ (Entrypoint) │ │\n│ └──────────────────────┬───────────────────────────────┘ │\n│ │ │\n│ ┌─────────────┼─────────────┐ │\n│ ▼ ▼ ▼ │\n│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │\n│ │ 6 Read │ │ 3 Write │ │ 1 DDL │ │\n│ │ Tools │ │ Tools │ │ Tool │ │\n│ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │\n│ │ │ │ │\n│ └──────────────┼──────────────┘ │\n│ ▼ │\n│ ┌──────────────────────────────────────────────────────┐ │\n│ │ QueryValidator \/ ExecuteValidator │ │\n│ │ (Blocklist, Allowlist, Limits, DDL-Prüfung) │ │\n│ └──────────────────────┬───────────────────────────────┘ │\n│ │ │\n│ ▼ │\n│ ┌────────────────────────────────────────────────────┐ │\n│ │ DatabaseConnection (Connection Pool) │ │\n│ └─────────────────────┬──────────────────────────────┘ │\n│ │ │\n│ ▼ │\n│ ┌────────────────────────┐ │\n│ │ MariaDB (ki_dev, │ │\n│ │ ki_content, mcp_log) │ │\n│ └────────────────────────┘ │\n└─────────────────────────────────────────────────────────────┘<\/code><\/pre>\n\n<h2>Design-Prinzipien<\/h2>\n<table>\n <tr><th>Prinzip<\/th><th>Umsetzung<\/th><\/tr>\n <tr>\n <td><strong>SRP<\/strong><\/td>\n <td>Jede Klasse hat eine Verantwortung: Validator validiert, Tool führt aus<\/td>\n <\/tr>\n <tr>\n <td><strong>OOP<\/strong><\/td>\n <td>Klassen mit klarer Kapselung, keine globalen Funktionen<\/td>\n <\/tr>\n <tr>\n <td><strong>KISS<\/strong><\/td>\n <td>Minimale Komplexität, kein Over-Engineering<\/td>\n <\/tr>\n <tr>\n <td><strong>Immutability<\/strong><\/td>\n <td>QueryRequest ist frozen (unveränderlich)<\/td>\n <\/tr>\n <tr>\n <td><strong>Fail-Safe<\/strong><\/td>\n <td>Exceptions statt silent failures<\/td>\n <\/tr>\n<\/table>\n\n<h2>Datenfluss<\/h2>\n<pre><code>1. Claude Code ruft db_select(query, database, max_rows, params)\n2. Tool empfängt Request\n3. QueryValidator.validate_query() prüft:\n - SELECT-Only\n - Keyword-Blocklist\n - Database-Allowlist\n - Table-Allowlist\n - Query-Länge\n - Max-Rows\n4. Bei Fehler: DENIED Response + Log\n5. Bei Erfolg: Tool führt Query aus\n - Connection aus Pool\n - SET max_statement_time (MariaDB)\n - cursor.execute(query, params)\n - fetchmany(max_rows)\n6. Logging in ki_dev.mcp_log\n7. Response zurück an Claude Code<\/code><\/pre>\n\n<h2>Validators<\/h2>\n<table>\n <tr><th>Validator<\/th><th>Prüft<\/th><th>Verwendet von<\/th><\/tr>\n <tr>\n <td><code>QueryValidator<\/code><\/td>\n <td>SELECT-Queries, Blocklist, Allowlist<\/td>\n <td>db_select<\/td>\n <\/tr>\n <tr>\n <td><code>ExecuteValidator<\/code><\/td>\n <td>DDL-Statements (ALTER, CREATE, DROP, TRUNCATE)<\/td>\n <td>db_execute<\/td>\n <\/tr>\n<\/table>\n\n<h2>Logging<\/h2>\n<p>Alle Operationen werden in <code>ki_dev.mcp_log<\/code> protokolliert:<\/p>\n<ul>\n <li>Tool-Name, Operation, Datenbank<\/li>\n <li>Ausführungsdauer, betroffene Rows<\/li>\n <li>Erfolg\/Fehler Status<\/li>\n<\/ul>\n\n<h2>Verwandte Kapitel<\/h2>\n<ul>\n <li><a href=\"\/docs\/mcp\/mcp-db\/mcp-db-contracts\">Contracts<\/a> - QueryRequest, QueryResponse, ExecuteContract<\/li>\n <li><a href=\"\/docs\/mcp\/mcp-db\/mcp-db-validators\">Validators<\/a> - QueryValidator, ExecuteValidator<\/li>\n <li><a href=\"\/docs\/mcp\/mcp-db\/mcp-db-infrastructure\">Infrastructure<\/a> - DatabaseConnection<\/li>\n <li><a href=\"\/docs\/mcp\/mcp-db\/mcp-db-tools\">Tools<\/a> - 10 MCP Tools<\/li>\n<\/ul>"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 39,\n \"parent_id\": 36,\n \"slug\": \"mcp-db-architektur\",\n \"path\": \"\/mcp\/mcp-db\/mcp-db-architektur\",\n \"title\": \"Architektur\",\n \"description\": \"Aufbau und Struktur des MCP-DB Servers nach OOP, SRP, KISS, YAGNI Prinzipien.\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/mcp\/mcp-db\\\">MCP-DB<\/a> » Architektur\\n<\/nav>\\n\\n<h1>MCP-DB Architektur<\/h1>\\n<p class=\\\"doc-meta\\\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\\n\\n<p>Aufbau und Struktur des MCP-DB Servers nach OOP, SRP, KISS, YAGNI Prinzipien.<\/p>\\n\\n<h2>Verzeichnisstruktur<\/h2>\\n<pre><code>\/var\/www\/mcp-servers\/mcp_db\/\\n├── server.py # MCP Server Entrypoint\\n├── config.py # Zentrale Konfiguration\\n├── .env # Credentials (chmod 600)\\n├── .env.example # Template\\n├── requirements.txt # Dependencies\\n├── requirements-test.txt # Test Dependencies\\n├── ruff.toml # Linter Config\\n├── pytest.ini # Test Config\\n├── run_tests.sh # Test Runner\\n├── venv\/ # Virtual Environment\\n├── tests\/ # Unit Tests\\n│\\n├── domain\/ # Contracts (Dataclasses)\\n│ ├── __init__.py\\n│ ├── query_contract.py # QueryRequest, QueryResponse\\n│ └── execute_contract.py # ExecuteContract für DDL\\n│\\n├── validators\/ # SRP: Separate Validierung\\n│ ├── __init__.py\\n│ ├── query_validator.py # SELECT Validierung\\n│ └── execute_validator.py # DDL Validierung (ALTER, CREATE, DROP, TRUNCATE)\\n│\\n├── infrastructure\/ # Implementierungen\\n│ ├── __init__.py\\n│ └── db_connection.py # MariaDB Connection Pool\\n│\\n└── tools\/ # MCP Tools (10 Dateien)\\n ├── __init__.py\\n ├── select_tool.py # db_select\\n ├── schema_tool.py # db_schema\\n ├── stats_tool.py # db_stats\\n ├── databases_tool.py # db_databases\\n ├── tables_tool.py # db_tables\\n ├── describe_tool.py # db_describe\\n ├── insert_tool.py # db_insert\\n ├── update_tool.py # db_update\\n ├── delete_tool.py # db_delete\\n └── execute_tool.py # db_execute (DDL)<\/code><\/pre>\\n\\n<h2>Komponenten-Diagramm<\/h2>\\n<pre><code>┌─────────────────────────────────────────────────────────────┐\\n│ Claude Code │\\n│ │ │\\n│ MCP Protocol │\\n│ │ │\\n│ ▼ │\\n│ ┌──────────────────────────────────────────────────────┐ │\\n│ │ server.py │ │\\n│ │ (Entrypoint) │ │\\n│ └──────────────────────┬───────────────────────────────┘ │\\n│ │ │\\n│ ┌─────────────┼─────────────┐ │\\n│ ▼ ▼ ▼ │\\n│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │\\n│ │ 6 Read │ │ 3 Write │ │ 1 DDL │ │\\n│ │ Tools │ │ Tools │ │ Tool │ │\\n│ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │\\n│ │ │ │ │\\n│ └──────────────┼──────────────┘ │\\n│ ▼ │\\n│ ┌──────────────────────────────────────────────────────┐ │\\n│ │ QueryValidator \/ ExecuteValidator │ │\\n│ │ (Blocklist, Allowlist, Limits, DDL-Prüfung) │ │\\n│ └──────────────────────┬───────────────────────────────┘ │\\n│ │ │\\n│ ▼ │\\n│ ┌────────────────────────────────────────────────────┐ │\\n│ │ DatabaseConnection (Connection Pool) │ │\\n│ └─────────────────────┬──────────────────────────────┘ │\\n│ │ │\\n│ ▼ │\\n│ ┌────────────────────────┐ │\\n│ │ MariaDB (ki_dev, │ │\\n│ │ ki_content, mcp_log) │ │\\n│ └────────────────────────┘ │\\n└─────────────────────────────────────────────────────────────┘<\/code><\/pre>\\n\\n<h2>Design-Prinzipien<\/h2>\\n<table>\\n <tr><th>Prinzip<\/th><th>Umsetzung<\/th><\/tr>\\n <tr>\\n <td><strong>SRP<\/strong><\/td>\\n <td>Jede Klasse hat eine Verantwortung: Validator validiert, Tool führt aus<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>OOP<\/strong><\/td>\\n <td>Klassen mit klarer Kapselung, keine globalen Funktionen<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>KISS<\/strong><\/td>\\n <td>Minimale Komplexität, kein Over-Engineering<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>Immutability<\/strong><\/td>\\n <td>QueryRequest ist frozen (unveränderlich)<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>Fail-Safe<\/strong><\/td>\\n <td>Exceptions statt silent failures<\/td>\\n <\/tr>\\n<\/table>\\n\\n<h2>Datenfluss<\/h2>\\n<pre><code>1. Claude Code ruft db_select(query, database, max_rows, params)\\n2. Tool empfängt Request\\n3. QueryValidator.validate_query() prüft:\\n - SELECT-Only\\n - Keyword-Blocklist\\n - Database-Allowlist\\n - Table-Allowlist\\n - Query-Länge\\n - Max-Rows\\n4. Bei Fehler: DENIED Response + Log\\n5. Bei Erfolg: Tool führt Query aus\\n - Connection aus Pool\\n - SET max_statement_time (MariaDB)\\n - cursor.execute(query, params)\\n - fetchmany(max_rows)\\n6. Logging in ki_dev.mcp_log\\n7. Response zurück an Claude Code<\/code><\/pre>\\n\\n<h2>Validators<\/h2>\\n<table>\\n <tr><th>Validator<\/th><th>Prüft<\/th><th>Verwendet von<\/th><\/tr>\\n <tr>\\n <td><code>QueryValidator<\/code><\/td>\\n <td>SELECT-Queries, Blocklist, Allowlist<\/td>\\n <td>db_select<\/td>\\n <\/tr>\\n <tr>\\n <td><code>ExecuteValidator<\/code><\/td>\\n <td>DDL-Statements (ALTER, CREATE, DROP, TRUNCATE)<\/td>\\n <td>db_execute<\/td>\\n <\/tr>\\n<\/table>\\n\\n<h2>Logging<\/h2>\\n<p>Alle Operationen werden in <code>ki_dev.mcp_log<\/code> protokolliert:<\/p>\\n<ul>\\n <li>Tool-Name, Operation, Datenbank<\/li>\\n <li>Ausführungsdauer, betroffene Rows<\/li>\\n <li>Erfolg\/Fehler Status<\/li>\\n<\/ul>\\n\\n<h2>Verwandte Kapitel<\/h2>\\n<ul>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\/mcp-db-contracts\\\">Contracts<\/a> - QueryRequest, QueryResponse, ExecuteContract<\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\/mcp-db-validators\\\">Validators<\/a> - QueryValidator, ExecuteValidator<\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\/mcp-db-infrastructure\\\">Infrastructure<\/a> - DatabaseConnection<\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\/mcp-db-tools\\\">Tools<\/a> - 10 MCP Tools<\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 3,\n \"depth\": 2,\n \"created_at\": \"2025-12-20T11:13:58\",\n \"updated_at\": \"2025-12-31T05:17:40\"\n },\n \"message\": \"Document #39 updated\"\n}"
}
]
}