{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 72,
"content": "<![CDATA[<nav class=\"breadcrumb\">\n <a href=\"\/docs\">Dokumentation<\/a> » <a href=\"\/docs\/mcp\">MCP<\/a> » <a href=\"\/docs\/mcp\/mcp-docs\">MCP-Docs<\/a> » Architektur\n<\/nav>\n\n<h1>MCP-Docs Architektur<\/h1>\n<p class=\"doc-meta\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\n\n<p>Verzeichnisstruktur und Komponenten des MCP-Docs Servers.<\/p>\n\n<h2>Verzeichnisstruktur<\/h2>\n<pre><code>\/var\/www\/mcp-servers\/mcp_docs\/\n├── server.py # Entry Point (FastMCP)\n├── config.py # Konfiguration\n├── .env # Credentials (DB_HOST, DB_USER, etc.)\n├── requirements.txt # Dependencies (mcp, pymysql, python-dotenv)\n├── venv\/ # Python Virtual Environment\n├── __pycache__\/ # Python Cache\n│\n├── domain\/\n│ ├── __init__.py\n│ └── dokumentation.py # Entities (Dokumentation, DocStatus, LogEntry)\n│\n├── infrastructure\/\n│ ├── __init__.py\n│ └── docs_repository.py # CRUD-Operationen (nutzt shared.db_connection)\n│\n└── tools\/\n ├── __init__.py\n └── docs_tools\/ # MCP-Tools Verzeichnis\n ├── __init__.py\n └── tools.py # 9 MCP-Tools<\/code><\/pre>\n\n<p><strong>Hinweis:<\/strong> Die Datenbankverbindung und Logging werden aus dem <code>shared<\/code>-Modul importiert (<code>\/var\/www\/mcp-servers\/shared\/<\/code>), nicht lokal definiert.<\/p>\n\n<h2>Layer-Architektur<\/h2>\n<table>\n <tr><th>Layer<\/th><th>Verantwortung<\/th><th>Dateien<\/th><\/tr>\n <tr><td><strong>Tools<\/strong><\/td><td>MCP-Tool-Definitionen<\/td><td>tools\/docs_tools\/<\/td><\/tr>\n <tr><td><strong>Domain<\/strong><\/td><td>Entities, Dataclasses<\/td><td>domain\/dokumentation.py<\/td><\/tr>\n <tr><td><strong>Infrastructure<\/strong><\/td><td>Repository<\/td><td>infrastructure\/docs_repository.py<\/td><\/tr>\n <tr><td><strong>Shared<\/strong><\/td><td>DB-Connection, Logging<\/td><td>\/var\/www\/mcp-servers\/shared\/<\/td><\/tr>\n<\/table>\n\n<h2>Komponenten<\/h2>\n\n<h3>server.py<\/h3>\n<p>Entry Point mit FastMCP-Initialisierung:<\/p>\n<pre><code>from mcp.server.fastmcp import FastMCP\nfrom tools.docs_tools import register_docs_tools\n\nmcp = FastMCP(\"mcp-docs\", instructions=\"...\")\nregister_docs_tools(mcp)\n\nif __name__ == \"__main__\":\n mcp.run(transport=\"stdio\")<\/code><\/pre>\n\n<h3>domain\/dokumentation.py<\/h3>\n<p>Dataclasses für Dokumentations-Entities:<\/p>\n<pre><code>@dataclass\nclass Dokumentation:\n id: int\n parent_id: Optional[int]\n slug: str\n path: str\n title: str\n description: Optional[str]\n content: str\n status: str # draft, published, archived\n sort_order: int\n depth: int\n created_at: datetime\n updated_at: datetime\n\n def to_dict(self) -> dict\n def to_dict_compact(self) -> dict # ohne content<\/code><\/pre>\n\n<h3>infrastructure\/docs_repository.py<\/h3>\n<p>CRUD-Operationen auf ki_dev.dokumentation:<\/p>\n<ul>\n <li><code>find_by_id()<\/code>, <code>find_by_path()<\/code><\/li>\n <li><code>find_all()<\/code> mit Filtern<\/li>\n <li><code>find_children()<\/code> - Kind-Dokumente<\/li>\n <li><code>get_hierarchy()<\/code> - Vollständiger Baum<\/li>\n <li><code>get_breadcrumb()<\/code> - Pfad zum Dokument<\/li>\n <li><code>create()<\/code>, <code>update()<\/code>, <code>delete()<\/code><\/li>\n <li><code>move()<\/code> - Parent ändern<\/li>\n <li><code>get_statistics()<\/code><\/li>\n<\/ul>\n\n<h2>Datenbank-Schema<\/h2>\n<pre><code>-- ki_dev.dokumentation\nCREATE TABLE dokumentation (\n id INT AUTO_INCREMENT PRIMARY KEY,\n parent_id INT DEFAULT NULL,\n depth TINYINT UNSIGNED DEFAULT 0,\n sort_order INT UNSIGNED DEFAULT 0,\n slug VARCHAR(100) NOT NULL,\n path VARCHAR(500) NOT NULL UNIQUE,\n title VARCHAR(200) NOT NULL,\n description VARCHAR(500),\n content LONGTEXT NOT NULL,\n content_format ENUM('html','markdown') DEFAULT 'html',\n status ENUM('draft','published','archived') DEFAULT 'published',\n version INT UNSIGNED DEFAULT 1,\n created_by VARCHAR(100) DEFAULT 'system',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_by VARCHAR(100),\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n \n FOREIGN KEY (parent_id) REFERENCES dokumentation(id) ON DELETE SET NULL\n);<\/code><\/pre>\n\n<h2>Hierarchie-Konzept<\/h2>\n<table>\n <tr><th>Feld<\/th><th>Beschreibung<\/th><th>Beispiel<\/th><\/tr>\n <tr><td><code>parent_id<\/code><\/td><td>Verweis auf Eltern-Dokument<\/td><td>1 (oder NULL für Root)<\/td><\/tr>\n <tr><td><code>depth<\/code><\/td><td>Tiefe im Baum<\/td><td>0=Root, 1=Kapitel, 2=Unterkapitel<\/td><\/tr>\n <tr><td><code>path<\/code><\/td><td>Vollständiger URL-Pfad<\/td><td>\/server\/ssh<\/td><\/tr>\n <tr><td><code>slug<\/code><\/td><td>URL-Segment<\/td><td>ssh<\/td><\/tr>\n <tr><td><code>sort_order<\/code><\/td><td>Sortierung innerhalb Parent<\/td><td>1, 2, 3...<\/td><\/tr>\n<\/table>\n\n<h2>Datenfluss<\/h2>\n<pre><code>Claude Code\n ↓ MCP Tool Call\nFastMCP (server.py)\n ↓ docs_get()\ndocs_tools.py\n ↓ Repository\ndocs_repository.py\n ↓ SQL (shared.db_connection)\nki_dev.dokumentation + ki_protokoll.mcp_log<\/code><\/pre>\n\n<h2>Besonderheiten<\/h2>\n<ul>\n <li><strong>Zwei Datenbanken:<\/strong> Daten in ki_dev, Logging in ki_protokoll<\/li>\n <li><strong>Shared Module:<\/strong> DB-Connection und Logging aus \/var\/www\/mcp-servers\/shared\/<\/li>\n <li><strong>Pfad-Berechnung:<\/strong> Automatisch aus Parent-Pfad + Slug<\/li>\n <li><strong>Depth-Berechnung:<\/strong> Parent-Depth + 1<\/li>\n <li><strong>Token-Optimierung:<\/strong> <code>to_dict_compact()<\/code> ohne Content<\/li>\n<\/ul>]]>"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 72,\n \"parent_id\": 66,\n \"slug\": \"mcp-docs-architektur\",\n \"path\": \"\/mcp\/mcp-docs\/mcp-docs-architektur\",\n \"title\": \"Architektur\",\n \"description\": null,\n \"content\": \"<![CDATA[<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/mcp\\\">MCP<\/a> » <a href=\\\"\/docs\/mcp\/mcp-docs\\\">MCP-Docs<\/a> » Architektur\\n<\/nav>\\n\\n<h1>MCP-Docs Architektur<\/h1>\\n<p class=\\\"doc-meta\\\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\\n\\n<p>Verzeichnisstruktur und Komponenten des MCP-Docs Servers.<\/p>\\n\\n<h2>Verzeichnisstruktur<\/h2>\\n<pre><code>\/var\/www\/mcp-servers\/mcp_docs\/\\n├── server.py # Entry Point (FastMCP)\\n├── config.py # Konfiguration\\n├── .env # Credentials (DB_HOST, DB_USER, etc.)\\n├── requirements.txt # Dependencies (mcp, pymysql, python-dotenv)\\n├── venv\/ # Python Virtual Environment\\n├── __pycache__\/ # Python Cache\\n│\\n├── domain\/\\n│ ├── __init__.py\\n│ └── dokumentation.py # Entities (Dokumentation, DocStatus, LogEntry)\\n│\\n├── infrastructure\/\\n│ ├── __init__.py\\n│ └── docs_repository.py # CRUD-Operationen (nutzt shared.db_connection)\\n│\\n└── tools\/\\n ├── __init__.py\\n └── docs_tools\/ # MCP-Tools Verzeichnis\\n ├── __init__.py\\n └── tools.py # 9 MCP-Tools<\/code><\/pre>\\n\\n<p><strong>Hinweis:<\/strong> Die Datenbankverbindung und Logging werden aus dem <code>shared<\/code>-Modul importiert (<code>\/var\/www\/mcp-servers\/shared\/<\/code>), nicht lokal definiert.<\/p>\\n\\n<h2>Layer-Architektur<\/h2>\\n<table>\\n <tr><th>Layer<\/th><th>Verantwortung<\/th><th>Dateien<\/th><\/tr>\\n <tr><td><strong>Tools<\/strong><\/td><td>MCP-Tool-Definitionen<\/td><td>tools\/docs_tools\/<\/td><\/tr>\\n <tr><td><strong>Domain<\/strong><\/td><td>Entities, Dataclasses<\/td><td>domain\/dokumentation.py<\/td><\/tr>\\n <tr><td><strong>Infrastructure<\/strong><\/td><td>Repository<\/td><td>infrastructure\/docs_repository.py<\/td><\/tr>\\n <tr><td><strong>Shared<\/strong><\/td><td>DB-Connection, Logging<\/td><td>\/var\/www\/mcp-servers\/shared\/<\/td><\/tr>\\n<\/table>\\n\\n<h2>Komponenten<\/h2>\\n\\n<h3>server.py<\/h3>\\n<p>Entry Point mit FastMCP-Initialisierung:<\/p>\\n<pre><code>from mcp.server.fastmcp import FastMCP\\nfrom tools.docs_tools import register_docs_tools\\n\\nmcp = FastMCP(\\\"mcp-docs\\\", instructions=\\\"...\\\")\\nregister_docs_tools(mcp)\\n\\nif __name__ == \\\"__main__\\\":\\n mcp.run(transport=\\\"stdio\\\")<\/code><\/pre>\\n\\n<h3>domain\/dokumentation.py<\/h3>\\n<p>Dataclasses für Dokumentations-Entities:<\/p>\\n<pre><code>@dataclass\\nclass Dokumentation:\\n id: int\\n parent_id: Optional[int]\\n slug: str\\n path: str\\n title: str\\n description: Optional[str]\\n content: str\\n status: str # draft, published, archived\\n sort_order: int\\n depth: int\\n created_at: datetime\\n updated_at: datetime\\n\\n def to_dict(self) -> dict\\n def to_dict_compact(self) -> dict # ohne content<\/code><\/pre>\\n\\n<h3>infrastructure\/docs_repository.py<\/h3>\\n<p>CRUD-Operationen auf ki_dev.dokumentation:<\/p>\\n<ul>\\n <li><code>find_by_id()<\/code>, <code>find_by_path()<\/code><\/li>\\n <li><code>find_all()<\/code> mit Filtern<\/li>\\n <li><code>find_children()<\/code> - Kind-Dokumente<\/li>\\n <li><code>get_hierarchy()<\/code> - Vollständiger Baum<\/li>\\n <li><code>get_breadcrumb()<\/code> - Pfad zum Dokument<\/li>\\n <li><code>create()<\/code>, <code>update()<\/code>, <code>delete()<\/code><\/li>\\n <li><code>move()<\/code> - Parent ändern<\/li>\\n <li><code>get_statistics()<\/code><\/li>\\n<\/ul>\\n\\n<h2>Datenbank-Schema<\/h2>\\n<pre><code>-- ki_dev.dokumentation\\nCREATE TABLE dokumentation (\\n id INT AUTO_INCREMENT PRIMARY KEY,\\n parent_id INT DEFAULT NULL,\\n depth TINYINT UNSIGNED DEFAULT 0,\\n sort_order INT UNSIGNED DEFAULT 0,\\n slug VARCHAR(100) NOT NULL,\\n path VARCHAR(500) NOT NULL UNIQUE,\\n title VARCHAR(200) NOT NULL,\\n description VARCHAR(500),\\n content LONGTEXT NOT NULL,\\n content_format ENUM('html','markdown') DEFAULT 'html',\\n status ENUM('draft','published','archived') DEFAULT 'published',\\n version INT UNSIGNED DEFAULT 1,\\n created_by VARCHAR(100) DEFAULT 'system',\\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\\n updated_by VARCHAR(100),\\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\\n \\n FOREIGN KEY (parent_id) REFERENCES dokumentation(id) ON DELETE SET NULL\\n);<\/code><\/pre>\\n\\n<h2>Hierarchie-Konzept<\/h2>\\n<table>\\n <tr><th>Feld<\/th><th>Beschreibung<\/th><th>Beispiel<\/th><\/tr>\\n <tr><td><code>parent_id<\/code><\/td><td>Verweis auf Eltern-Dokument<\/td><td>1 (oder NULL für Root)<\/td><\/tr>\\n <tr><td><code>depth<\/code><\/td><td>Tiefe im Baum<\/td><td>0=Root, 1=Kapitel, 2=Unterkapitel<\/td><\/tr>\\n <tr><td><code>path<\/code><\/td><td>Vollständiger URL-Pfad<\/td><td>\/server\/ssh<\/td><\/tr>\\n <tr><td><code>slug<\/code><\/td><td>URL-Segment<\/td><td>ssh<\/td><\/tr>\\n <tr><td><code>sort_order<\/code><\/td><td>Sortierung innerhalb Parent<\/td><td>1, 2, 3...<\/td><\/tr>\\n<\/table>\\n\\n<h2>Datenfluss<\/h2>\\n<pre><code>Claude Code\\n ↓ MCP Tool Call\\nFastMCP (server.py)\\n ↓ docs_get()\\ndocs_tools.py\\n ↓ Repository\\ndocs_repository.py\\n ↓ SQL (shared.db_connection)\\nki_dev.dokumentation + ki_protokoll.mcp_log<\/code><\/pre>\\n\\n<h2>Besonderheiten<\/h2>\\n<ul>\\n <li><strong>Zwei Datenbanken:<\/strong> Daten in ki_dev, Logging in ki_protokoll<\/li>\\n <li><strong>Shared Module:<\/strong> DB-Connection und Logging aus \/var\/www\/mcp-servers\/shared\/<\/li>\\n <li><strong>Pfad-Berechnung:<\/strong> Automatisch aus Parent-Pfad + Slug<\/li>\\n <li><strong>Depth-Berechnung:<\/strong> Parent-Depth + 1<\/li>\\n <li><strong>Token-Optimierung:<\/strong> <code>to_dict_compact()<\/code> ohne Content<\/li>\\n<\/ul>]]>\",\n \"status\": \"published\",\n \"sort_order\": 2,\n \"depth\": 2,\n \"created_at\": \"2025-12-20T13:03:42\",\n \"updated_at\": \"2025-12-31T04:21:43\"\n },\n \"message\": \"Document #72 updated\"\n}"
}
]
}