{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 49,
"content": "<nav class=\"breadcrumb\">\n <a href=\"\/docs\">Dokumentation<\/a> » <a href=\"\/docs\/mcp\">MCP<\/a> » <a href=\"\/docs\/mcp\/mcp-tasks\">MCP-Tasks<\/a> » Architektur\n<\/nav>\n\n<h1>MCP-Tasks Architektur<\/h1>\n<p class=\"doc-meta\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\n\n<p>Verzeichnisstruktur, Komponenten und Design-Prinzipien des MCP-Tasks Servers.<\/p>\n\n<h2>Verzeichnisstruktur<\/h2>\n<pre><code>\/var\/www\/mcp-servers\/mcp_tasks\/\n├── server.py # Hauptdatei, MCP-Server\n├── config.py # Zentrale Konfiguration\n├── requirements.txt # Python Dependencies\n├── venv\/ # Virtual Environment\n│\n├── domain\/ # Domain Layer\n│ ├── __init__.py\n│ └── contracts.py # Dataclasses: Task, TaskAssignment, TaskResult\n│\n├── infrastructure\/ # Infrastructure Layer\n│ ├── __init__.py\n│ └── task_repository.py # CRUD-Operationen\n│\n├── tools\/ # MCP Tools\n│ ├── __init__.py\n│ ├── task_tools.py # Task-Management Tools\n│ └── quality_tools.py # Quality\/Contract Tools\n│\n└── validators\/ # Input-Validierung\n ├── __init__.py\n └── workflow_validator.py # Workflow-Validierung<\/code><\/pre>\n\n<h2>Layer-Architektur<\/h2>\n\n<h3>Domain Layer<\/h3>\n<p>Enthält die Datenstrukturen in <code>domain\/contracts.py<\/code>:<\/p>\n<table>\n <tr><th>Klasse<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td><code>Task<\/code><\/td><td>Task-Entity mit allen Feldern<\/td><\/tr>\n <tr><td><code>TaskAssignment<\/code><\/td><td>Zuweisung an Person\/KI<\/td><\/tr>\n <tr><td><code>TaskResult<\/code><\/td><td>Ergebnis mit Token-Tracking<\/td><\/tr>\n <tr><td><code>TaskStatus<\/code><\/td><td>Enum: pending, in_progress, completed, failed, cancelled<\/td><\/tr>\n <tr><td><code>TaskType<\/code><\/td><td>Enum: human_task, ai_task, mixed<\/td><\/tr>\n <tr><td><code>ExecutorType<\/code><\/td><td>Enum: human, ollama, claude, anthropic_api<\/td><\/tr>\n<\/table>\n\n<h3>Infrastructure Layer<\/h3>\n<p>Datenbankzugriff in <code>infrastructure\/task_repository.py<\/code>:<\/p>\n<table>\n <tr><th>Klasse<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td><code>TaskRepository<\/code><\/td><td>CRUD für tasks, assignments, results<\/td><\/tr>\n<\/table>\n<p><strong>Hinweis:<\/strong> Die Datenbankverbindung wird inline via shared config erstellt. Logging erfolgt direkt in mcp_log ohne separate Logger-Klasse.<\/p>\n\n<h3>Validators Layer<\/h3>\n<p>Input-Validierung in <code>validators\/workflow_validator.py<\/code>:<\/p>\n<ul>\n <li>Workflow-Status-Übergänge validieren<\/li>\n <li>Task-Typ-Validierung<\/li>\n<\/ul>\n\n<h3>Tools Layer<\/h3>\n<p>MCP-Tool-Definitionen:<\/p>\n<table>\n <tr><th>Modul<\/th><th>Tools<\/th><\/tr>\n <tr><td><code>task_tools.py<\/code><\/td><td>tasks_list, tasks_get, tasks_create, tasks_update, tasks_status, tasks_assign, tasks_result, tasks_execute, tasks_delete, tasks_statistics<\/td><\/tr>\n <tr><td><code>quality_tools.py<\/code><\/td><td>contracts_list, contracts_validate, quality_check, quality_report<\/td><\/tr>\n<\/table>\n\n<h2>Datenfluss<\/h2>\n<pre><code>Claude Code\n │\n ▼\n┌─────────────────────────────────────────┐\n│ MCP-Tasks Server (stdio) │\n│ ┌────────────────────────────────────┐ │\n│ │ Tools │ │\n│ │ - tasks_list() │ │\n│ │ - tasks_create() │ │\n│ │ - quality_check() │ │\n│ └──────────────┬─────────────────────┘ │\n│ │ │\n│ ┌──────────────▼─────────────────────┐ │\n│ │ Infrastructure │ │\n│ │ - TaskRepository │ │\n│ └──────────────┬─────────────────────┘ │\n│ │ │\n└─────────────────┼───────────────────────┘\n │\n ┌─────────────┼─────────────┐\n │ │ │\n ▼ ▼ ▼\n┌────────┐ ┌────────┐ ┌─────────┐\n│ tasks │ │mcp_log │ │ Ollama │\n│ (CRUD) │ │(INSERT)│ │ (API) │\n└────────┘ └────────┘ └─────────┘<\/code><\/pre>\n\n<h2>Konfiguration (config.py)<\/h2>\n<pre><code>class Config:\n # Datenbank für Task-Operationen (ki_dev)\n DB_HOST = os.getenv(\"DB_HOST\", \"localhost\")\n DB_PORT = int(os.getenv(\"DB_PORT\", \"3306\"))\n DB_NAME = os.getenv(\"DB_NAME\", \"ki_dev\")\n DB_USER = os.getenv(\"DB_USER\", \"claude_code\")\n DB_PASSWORD = os.getenv(\"DB_PASSWORD\", \"\")\n\n # Ollama\n OLLAMA_HOST = os.getenv(\"OLLAMA_HOST\", \"http:\/\/localhost:11434\")\n OLLAMA_DEFAULT_MODEL = os.getenv(\"OLLAMA_MODEL\", \"mistral\")\n\n # Limits\n MAX_RESULTS = 100\n MAX_DESCRIPTION_LENGTH = 50000\n\n # Gültige Werte\n VALID_STATUSES = [\"pending\", \"in_progress\", \"completed\", \"failed\", \"cancelled\"]\n VALID_TYPES = [\"human_task\", \"ai_task\", \"mixed\"]\n VALID_EXECUTOR_TYPES = [\"human\", \"ollama\", \"claude\", \"anthropic_api\"]<\/code><\/pre>\n\n<h2>Datenbank (ki_dev)<\/h2>\n<p>Task-Tabellen befinden sich in der Datenbank <code>ki_dev<\/code>:<\/p>\n<ul>\n <li><code>tasks<\/code> - Haupttabelle mit uuid, title, description, type, status<\/li>\n <li><code>task_assignments<\/code> - Zuweisungen an Personen\/KI<\/li>\n <li><code>task_results<\/code> - Ergebnisse mit Token-Tracking<\/li>\n<\/ul>\n<p>Logging erfolgt in <code>ki_dev.mcp_log<\/code>.<\/p>\n\n<h2>Design-Prinzipien<\/h2>\n\n<h3>Single Responsibility (SRP)<\/h3>\n<ul>\n <li><strong>Repository:<\/strong> Nur Datenbankzugriff<\/li>\n <li><strong>Tools:<\/strong> Nur MCP-Interface<\/li>\n <li><strong>Validators:<\/strong> Nur Input-Validierung<\/li>\n<\/ul>\n\n<h3>Fail-Safe Logging<\/h3>\n<pre><code>try:\n # Log direkt in mcp_log einfügen\n cursor.execute(\"INSERT INTO mcp_log ...\")\nexcept Exception as e:\n # Nur zu stderr, NICHT an Client\n print(f\"Log failed: {e}\", file=sys.stderr)\n # Tool-Operation fortsetzen!<\/code><\/pre>\n\n<h2>Dependencies<\/h2>\n<pre><code># requirements.txt\nmcp>=1.0.0\npymysql>=1.1.0\npython-dotenv>=1.0.0\nrequests>=2.31.0\npyyaml>=6.0.0<\/code><\/pre>\n\n<h2>Verwandte Themen<\/h2>\n<ul>\n <li><a href=\"\/docs\/mcp\/mcp-tasks\">MCP-Tasks Übersicht<\/a><\/li>\n <li><a href=\"\/docs\/mcp\/mcp-tasks-tools\">Tools im Detail<\/a><\/li>\n <li><a href=\"\/docs\/mcp\/mcp-db-architektur\">MCP-DB Architektur<\/a> (Vergleich)<\/li>\n<\/ul>"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 49,\n \"parent_id\": 47,\n \"slug\": \"mcp-tasks-architektur\",\n \"path\": \"\/mcp\/mcp-tasks\/mcp-tasks-architektur\",\n \"title\": \"Architektur\",\n \"description\": \"Verzeichnisstruktur, Komponenten und Design-Prinzipien des MCP-Tasks Servers.\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/mcp\\\">MCP<\/a> » <a href=\\\"\/docs\/mcp\/mcp-tasks\\\">MCP-Tasks<\/a> » Architektur\\n<\/nav>\\n\\n<h1>MCP-Tasks Architektur<\/h1>\\n<p class=\\\"doc-meta\\\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-31<\/p>\\n\\n<p>Verzeichnisstruktur, Komponenten und Design-Prinzipien des MCP-Tasks Servers.<\/p>\\n\\n<h2>Verzeichnisstruktur<\/h2>\\n<pre><code>\/var\/www\/mcp-servers\/mcp_tasks\/\\n├── server.py # Hauptdatei, MCP-Server\\n├── config.py # Zentrale Konfiguration\\n├── requirements.txt # Python Dependencies\\n├── venv\/ # Virtual Environment\\n│\\n├── domain\/ # Domain Layer\\n│ ├── __init__.py\\n│ └── contracts.py # Dataclasses: Task, TaskAssignment, TaskResult\\n│\\n├── infrastructure\/ # Infrastructure Layer\\n│ ├── __init__.py\\n│ └── task_repository.py # CRUD-Operationen\\n│\\n├── tools\/ # MCP Tools\\n│ ├── __init__.py\\n│ ├── task_tools.py # Task-Management Tools\\n│ └── quality_tools.py # Quality\/Contract Tools\\n│\\n└── validators\/ # Input-Validierung\\n ├── __init__.py\\n └── workflow_validator.py # Workflow-Validierung<\/code><\/pre>\\n\\n<h2>Layer-Architektur<\/h2>\\n\\n<h3>Domain Layer<\/h3>\\n<p>Enthält die Datenstrukturen in <code>domain\/contracts.py<\/code>:<\/p>\\n<table>\\n <tr><th>Klasse<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td><code>Task<\/code><\/td><td>Task-Entity mit allen Feldern<\/td><\/tr>\\n <tr><td><code>TaskAssignment<\/code><\/td><td>Zuweisung an Person\/KI<\/td><\/tr>\\n <tr><td><code>TaskResult<\/code><\/td><td>Ergebnis mit Token-Tracking<\/td><\/tr>\\n <tr><td><code>TaskStatus<\/code><\/td><td>Enum: pending, in_progress, completed, failed, cancelled<\/td><\/tr>\\n <tr><td><code>TaskType<\/code><\/td><td>Enum: human_task, ai_task, mixed<\/td><\/tr>\\n <tr><td><code>ExecutorType<\/code><\/td><td>Enum: human, ollama, claude, anthropic_api<\/td><\/tr>\\n<\/table>\\n\\n<h3>Infrastructure Layer<\/h3>\\n<p>Datenbankzugriff in <code>infrastructure\/task_repository.py<\/code>:<\/p>\\n<table>\\n <tr><th>Klasse<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td><code>TaskRepository<\/code><\/td><td>CRUD für tasks, assignments, results<\/td><\/tr>\\n<\/table>\\n<p><strong>Hinweis:<\/strong> Die Datenbankverbindung wird inline via shared config erstellt. Logging erfolgt direkt in mcp_log ohne separate Logger-Klasse.<\/p>\\n\\n<h3>Validators Layer<\/h3>\\n<p>Input-Validierung in <code>validators\/workflow_validator.py<\/code>:<\/p>\\n<ul>\\n <li>Workflow-Status-Übergänge validieren<\/li>\\n <li>Task-Typ-Validierung<\/li>\\n<\/ul>\\n\\n<h3>Tools Layer<\/h3>\\n<p>MCP-Tool-Definitionen:<\/p>\\n<table>\\n <tr><th>Modul<\/th><th>Tools<\/th><\/tr>\\n <tr><td><code>task_tools.py<\/code><\/td><td>tasks_list, tasks_get, tasks_create, tasks_update, tasks_status, tasks_assign, tasks_result, tasks_execute, tasks_delete, tasks_statistics<\/td><\/tr>\\n <tr><td><code>quality_tools.py<\/code><\/td><td>contracts_list, contracts_validate, quality_check, quality_report<\/td><\/tr>\\n<\/table>\\n\\n<h2>Datenfluss<\/h2>\\n<pre><code>Claude Code\\n │\\n ▼\\n┌─────────────────────────────────────────┐\\n│ MCP-Tasks Server (stdio) │\\n│ ┌────────────────────────────────────┐ │\\n│ │ Tools │ │\\n│ │ - tasks_list() │ │\\n│ │ - tasks_create() │ │\\n│ │ - quality_check() │ │\\n│ └──────────────┬─────────────────────┘ │\\n│ │ │\\n│ ┌──────────────▼─────────────────────┐ │\\n│ │ Infrastructure │ │\\n│ │ - TaskRepository │ │\\n│ └──────────────┬─────────────────────┘ │\\n│ │ │\\n└─────────────────┼───────────────────────┘\\n │\\n ┌─────────────┼─────────────┐\\n │ │ │\\n ▼ ▼ ▼\\n┌────────┐ ┌────────┐ ┌─────────┐\\n│ tasks │ │mcp_log │ │ Ollama │\\n│ (CRUD) │ │(INSERT)│ │ (API) │\\n└────────┘ └────────┘ └─────────┘<\/code><\/pre>\\n\\n<h2>Konfiguration (config.py)<\/h2>\\n<pre><code>class Config:\\n # Datenbank für Task-Operationen (ki_dev)\\n DB_HOST = os.getenv(\\\"DB_HOST\\\", \\\"localhost\\\")\\n DB_PORT = int(os.getenv(\\\"DB_PORT\\\", \\\"3306\\\"))\\n DB_NAME = os.getenv(\\\"DB_NAME\\\", \\\"ki_dev\\\")\\n DB_USER = os.getenv(\\\"DB_USER\\\", \\\"claude_code\\\")\\n DB_PASSWORD = os.getenv(\\\"DB_PASSWORD\\\", \\\"\\\")\\n\\n # Ollama\\n OLLAMA_HOST = os.getenv(\\\"OLLAMA_HOST\\\", \\\"http:\/\/localhost:11434\\\")\\n OLLAMA_DEFAULT_MODEL = os.getenv(\\\"OLLAMA_MODEL\\\", \\\"mistral\\\")\\n\\n # Limits\\n MAX_RESULTS = 100\\n MAX_DESCRIPTION_LENGTH = 50000\\n\\n # Gültige Werte\\n VALID_STATUSES = [\\\"pending\\\", \\\"in_progress\\\", \\\"completed\\\", \\\"failed\\\", \\\"cancelled\\\"]\\n VALID_TYPES = [\\\"human_task\\\", \\\"ai_task\\\", \\\"mixed\\\"]\\n VALID_EXECUTOR_TYPES = [\\\"human\\\", \\\"ollama\\\", \\\"claude\\\", \\\"anthropic_api\\\"]<\/code><\/pre>\\n\\n<h2>Datenbank (ki_dev)<\/h2>\\n<p>Task-Tabellen befinden sich in der Datenbank <code>ki_dev<\/code>:<\/p>\\n<ul>\\n <li><code>tasks<\/code> - Haupttabelle mit uuid, title, description, type, status<\/li>\\n <li><code>task_assignments<\/code> - Zuweisungen an Personen\/KI<\/li>\\n <li><code>task_results<\/code> - Ergebnisse mit Token-Tracking<\/li>\\n<\/ul>\\n<p>Logging erfolgt in <code>ki_dev.mcp_log<\/code>.<\/p>\\n\\n<h2>Design-Prinzipien<\/h2>\\n\\n<h3>Single Responsibility (SRP)<\/h3>\\n<ul>\\n <li><strong>Repository:<\/strong> Nur Datenbankzugriff<\/li>\\n <li><strong>Tools:<\/strong> Nur MCP-Interface<\/li>\\n <li><strong>Validators:<\/strong> Nur Input-Validierung<\/li>\\n<\/ul>\\n\\n<h3>Fail-Safe Logging<\/h3>\\n<pre><code>try:\\n # Log direkt in mcp_log einfügen\\n cursor.execute(\\\"INSERT INTO mcp_log ...\\\")\\nexcept Exception as e:\\n # Nur zu stderr, NICHT an Client\\n print(f\\\"Log failed: {e}\\\", file=sys.stderr)\\n # Tool-Operation fortsetzen!<\/code><\/pre>\\n\\n<h2>Dependencies<\/h2>\\n<pre><code># requirements.txt\\nmcp>=1.0.0\\npymysql>=1.1.0\\npython-dotenv>=1.0.0\\nrequests>=2.31.0\\npyyaml>=6.0.0<\/code><\/pre>\\n\\n<h2>Verwandte Themen<\/h2>\\n<ul>\\n <li><a href=\\\"\/docs\/mcp\/mcp-tasks\\\">MCP-Tasks Übersicht<\/a><\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-tasks-tools\\\">Tools im Detail<\/a><\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db-architektur\\\">MCP-DB Architektur<\/a> (Vergleich)<\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 2,\n \"depth\": 2,\n \"created_at\": \"2025-12-20T11:13:58\",\n \"updated_at\": \"2025-12-31T05:13:49\"\n },\n \"message\": \"Document #49 updated\"\n}"
}
]
}