{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 41,
"content": "<nav class=\"breadcrumb\">\n <a href=\"\/docs\">Dokumentation<\/a> » <a href=\"\/docs\/mcp\/mcp-db\">MCP-DB<\/a> » Konfiguration\n<\/nav>\n\n<h1>MCP-DB Konfiguration<\/h1>\n<p>Konfiguration mit <strong>Hot-Reload<\/strong> aus JSON-Datei - Änderungen werden sofort wirksam ohne Neustart.<\/p>\n\n<h2>Übersicht<\/h2>\n<table>\n <tr><th>Bereich<\/th><th>Datei<\/th><th>Hot-Reload<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td>JSON-Config<\/td><td><code>\/etc\/mcp-db\/config.json<\/code><\/td><td>Ja<\/td><td>Allowlists, Limits, Keywords<\/td><\/tr>\n <tr><td>Environment<\/td><td><code>\/var\/www\/mcp-servers\/mcp_db\/.env<\/code><\/td><td>Nein<\/td><td>DB-Credentials<\/td><\/tr>\n <tr><td>Claude Hooks<\/td><td><code>\/root\/.claude\/settings.json<\/code><\/td><td>Nein<\/td><td>Blocking-Hook<\/td><\/tr>\n<\/table>\n\n<p class=\"alert alert-success\"><strong>Neu:<\/strong> Änderungen an <code>\/etc\/mcp-db\/config.json<\/code> werden bei jedem Tool-Aufruf automatisch geladen - kein Claude-Neustart nötig!<\/p>\n\n<h2>JSON-Konfiguration (Hot-Reload)<\/h2>\n<p>Pfad: <code>\/etc\/mcp-db\/config.json<\/code><\/p>\n\n<pre><code>{\n \"_comment\": \"MCP-DB Konfiguration - Änderungen werden sofort wirksam\",\n\n \"allowed_databases\": [\n \"ki_dev\",\n \"ki_content\"\n ],\n\n \"allowed_tables\": {\n \"ki_dev\": [\n \"mcp_log\", \"protokoll\", \"file_backup_history\",\n \"tasks\", \"task_assignments\", \"task_results\", \"task_comments\",\n \"contracts\", \"contract_history\", \"contract_validations\",\n \"dokumentation\", \"dokumentation_chunks\", \"dokumentation_history\",\n \"pipeline_log\", \"pipeline_queue\", \"llm_requests\", \"rag_collections\",\n \"ai_models\", \"audit_log\", \"code_analysis\", \"code_dependencies\",\n \"code_quality\", \"code_scan_config\", \"prompts\"\n ],\n \"ki_content\": [\n \"content_orders\", \"content_versions\", \"content_critiques\",\n \"content_sources\", \"content_config\", \"content_config_history\",\n \"documents\", \"chunks\", \"chunk_semantics\", \"chunk_entities\",\n \"chunk_taxonomy\", \"document_taxonomy\", \"document_entities\",\n \"document_pages\", \"entity_semantics\", \"entity_taxonomy_mapping\",\n \"entity_types\", \"generated_questions\",\n \"pipeline_configs\", \"pipeline_queue\", \"pipeline_runs\", \"pipeline_steps\",\n \"provenance\", \"semantic_queue\", \"stopwords\",\n \"chat_sessions\", \"chat_messages\",\n \"entities\", \"entity_relations\", \"entity_classifications\",\n \"taxonomy_terms\", \"ontology_classes\", \"search_history\"\n ]\n },\n\n \"blocked_keywords\": [\n \"DROP\", \"DELETE\", \"INSERT\", \"UPDATE\", \"TRUNCATE\",\n \"ALTER\", \"CREATE\", \"RENAME\", \"GRANT\", \"REVOKE\",\n \"LOAD_FILE\", \"INTO OUTFILE\", \"INTO DUMPFILE\",\n \"BENCHMARK\", \"SLEEP\"\n ],\n\n \"limits\": {\n \"max_query_length\": 2000,\n \"max_rows\": 100,\n \"query_timeout_sec\": 30\n }\n}<\/code><\/pre>\n\n<h2>Datenbank hinzufügen<\/h2>\n<pre><code># \/etc\/mcp-db\/config.json bearbeiten\n{\n \"allowed_databases\": [\n \"ki_dev\",\n \"ki_content\",\n \"neue_datenbank\" \/\/ NEU\n ],\n \"allowed_tables\": {\n \/\/ ...\n \"neue_datenbank\": [ \/\/ NEU\n \"tabelle1\",\n \"tabelle2\"\n ]\n }\n}\n\n# Sofort wirksam - kein Neustart nötig!<\/code><\/pre>\n\n<h2>Environment Variables (.env)<\/h2>\n<p>Pfad: <code>\/var\/www\/mcp-servers\/mcp_db\/.env<\/code><\/p>\n<p class=\"alert alert-warning\">Änderungen an .env erfordern einen Claude-Neustart!<\/p>\n\n<table>\n <tr><th>Variable<\/th><th>Beschreibung<\/th><th>Default<\/th><\/tr>\n <tr><td>DB_HOST<\/td><td>Datenbank-Host für Queries<\/td><td>localhost<\/td><\/tr>\n <tr><td>DB_USER<\/td><td>User für Queries<\/td><td>mcp_readonly<\/td><\/tr>\n <tr><td>DB_PASSWORD<\/td><td>Passwort für Query-User<\/td><td>-<\/td><\/tr>\n <tr><td>LOG_DB_HOST<\/td><td>Datenbank-Host für Logging<\/td><td>localhost<\/td><\/tr>\n <tr><td>LOG_DB_NAME<\/td><td>Datenbank für Logging<\/td><td>ki_dev<\/td><\/tr>\n <tr><td>LOG_DB_USER<\/td><td>User für Logging (nur INSERT)<\/td><td>mcp_logger<\/td><\/tr>\n <tr><td>LOG_DB_PASSWORD<\/td><td>Passwort für Logger-User<\/td><td>-<\/td><\/tr>\n<\/table>\n\n<h2>Claude Code Hook<\/h2>\n<p>Der Blocking-Hook verhindert direkte mysql\/mariadb-Befehle.<\/p>\n<p>Pfad: <code>\/root\/.claude\/settings.json<\/code><\/p>\n\n<pre><code>{\n \"hooks\": {\n \"PreToolUse\": [{\n \"matcher\": \"Bash\",\n \"hooks\": [{\n \"type\": \"command\",\n \"command\": \"\/var\/www\/scripts\/hooks\/block_direct_db.py\",\n \"timeout\": 5\n }]\n }]\n }\n}<\/code><\/pre>\n\n<h3>Exit-Codes<\/h3>\n<table>\n <tr><th>Exit Code<\/th><th>Bedeutung<\/th><th>Aktion<\/th><\/tr>\n <tr><td>0<\/td><td>Erlauben<\/td><td>Befehl wird ausgeführt<\/td><\/tr>\n <tr><td>2<\/td><td>Blockieren<\/td><td>Befehl wird abgelehnt<\/td><\/tr>\n<\/table>\n\n<h2>config.py Implementierung<\/h2>\n<p>Die Config-Klasse lädt bei jedem Zugriff die JSON-Datei neu (Metaclass mit Properties):<\/p>\n\n<pre><code>\"\"\"config.py - Hot-Reload aus JSON\"\"\"\nimport json\nfrom pathlib import Path\n\nCONFIG_PATH = Path(\"\/etc\/mcp-db\/config.json\")\n\ndef _load_json_config() -> dict:\n \"\"\"Lädt JSON-Config bei jedem Aufruf.\"\"\"\n if CONFIG_PATH.exists():\n with open(CONFIG_PATH, \"r\") as f:\n return json.load(f)\n return {}\n\nclass _ConfigMeta(type):\n @property\n def ALLOWED_DATABASES(cls) -> list:\n cfg = _load_json_config()\n return cfg.get(\"allowed_databases\", [\"ki_dev\", \"ki_content\"])\n\n @property\n def ALLOWED_TABLES(cls) -> list:\n cfg = _load_json_config()\n tables_dict = cfg.get(\"allowed_tables\", {})\n return [t for tables in tables_dict.values() \n if isinstance(tables, list) for t in tables]\n # ... weitere Properties\n\nclass Config(metaclass=_ConfigMeta):\n # Statische Werte aus Environment\n DB_HOST = os.getenv(\"DB_HOST\", \"localhost\")\n DB_USER = os.getenv(\"DB_USER\", \"mcp_readonly\")\n # ...<\/code><\/pre>\n\n<h2>Keyword Blocklist<\/h2>\n<table>\n <tr><th>Kategorie<\/th><th>Keywords<\/th><\/tr>\n <tr><td>DML<\/td><td>DELETE, INSERT, UPDATE<\/td><\/tr>\n <tr><td>DDL<\/td><td>DROP, TRUNCATE, ALTER, CREATE, RENAME<\/td><\/tr>\n <tr><td>DCL<\/td><td>GRANT, REVOKE<\/td><\/tr>\n <tr><td>File-Ops<\/td><td>LOAD_FILE, INTO OUTFILE, INTO DUMPFILE<\/td><\/tr>\n <tr><td>DoS<\/td><td>BENCHMARK, SLEEP<\/td><\/tr>\n<\/table>\n\n<h2>Limits<\/h2>\n<table>\n <tr><th>Limit<\/th><th>Wert<\/th><th>Beschreibung<\/th><\/tr>\n <tr><td>max_query_length<\/td><td>2000<\/td><td>Maximale Query-Länge in Zeichen<\/td><\/tr>\n <tr><td>max_rows<\/td><td>100<\/td><td>Maximale Ergebniszeilen<\/td><\/tr>\n <tr><td>query_timeout_sec<\/td><td>30<\/td><td>Query-Timeout in Sekunden<\/td><\/tr>\n<\/table>\n\n<h2>Verwandte Kapitel<\/h2>\n<ul>\n <li><a href=\"\/docs\/mcp\/mcp-db\/mcp-db-security\">Sicherheit<\/a> - DB-User Hardening<\/li>\n <li><a href=\"\/docs\/mcp\/mcp-db\/mcp-db-installation\">Installation<\/a> - .env Setup<\/li>\n <li><a href=\"\/docs\/betrieb\/claude-hooks\">Claude Hooks<\/a> - Hook-Dokumentation<\/li>\n<\/ul>"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 41,\n \"parent_id\": 36,\n \"slug\": \"mcp-db-config\",\n \"path\": \"\/mcp\/mcp-db\/mcp-db-config\",\n \"title\": \"Konfiguration\",\n \"description\": \"Zentrale Konfiguration über Environment Variables und Config-Klasse.\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/mcp\/mcp-db\\\">MCP-DB<\/a> » Konfiguration\\n<\/nav>\\n\\n<h1>MCP-DB Konfiguration<\/h1>\\n<p>Konfiguration mit <strong>Hot-Reload<\/strong> aus JSON-Datei - Änderungen werden sofort wirksam ohne Neustart.<\/p>\\n\\n<h2>Übersicht<\/h2>\\n<table>\\n <tr><th>Bereich<\/th><th>Datei<\/th><th>Hot-Reload<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td>JSON-Config<\/td><td><code>\/etc\/mcp-db\/config.json<\/code><\/td><td>Ja<\/td><td>Allowlists, Limits, Keywords<\/td><\/tr>\\n <tr><td>Environment<\/td><td><code>\/var\/www\/mcp-servers\/mcp_db\/.env<\/code><\/td><td>Nein<\/td><td>DB-Credentials<\/td><\/tr>\\n <tr><td>Claude Hooks<\/td><td><code>\/root\/.claude\/settings.json<\/code><\/td><td>Nein<\/td><td>Blocking-Hook<\/td><\/tr>\\n<\/table>\\n\\n<p class=\\\"alert alert-success\\\"><strong>Neu:<\/strong> Änderungen an <code>\/etc\/mcp-db\/config.json<\/code> werden bei jedem Tool-Aufruf automatisch geladen - kein Claude-Neustart nötig!<\/p>\\n\\n<h2>JSON-Konfiguration (Hot-Reload)<\/h2>\\n<p>Pfad: <code>\/etc\/mcp-db\/config.json<\/code><\/p>\\n\\n<pre><code>{\\n \\\"_comment\\\": \\\"MCP-DB Konfiguration - Änderungen werden sofort wirksam\\\",\\n\\n \\\"allowed_databases\\\": [\\n \\\"ki_dev\\\",\\n \\\"ki_content\\\"\\n ],\\n\\n \\\"allowed_tables\\\": {\\n \\\"ki_dev\\\": [\\n \\\"mcp_log\\\", \\\"protokoll\\\", \\\"file_backup_history\\\",\\n \\\"tasks\\\", \\\"task_assignments\\\", \\\"task_results\\\", \\\"task_comments\\\",\\n \\\"contracts\\\", \\\"contract_history\\\", \\\"contract_validations\\\",\\n \\\"dokumentation\\\", \\\"dokumentation_chunks\\\", \\\"dokumentation_history\\\",\\n \\\"pipeline_log\\\", \\\"pipeline_queue\\\", \\\"llm_requests\\\", \\\"rag_collections\\\",\\n \\\"ai_models\\\", \\\"audit_log\\\", \\\"code_analysis\\\", \\\"code_dependencies\\\",\\n \\\"code_quality\\\", \\\"code_scan_config\\\", \\\"prompts\\\"\\n ],\\n \\\"ki_content\\\": [\\n \\\"content_orders\\\", \\\"content_versions\\\", \\\"content_critiques\\\",\\n \\\"content_sources\\\", \\\"content_config\\\", \\\"content_config_history\\\",\\n \\\"documents\\\", \\\"chunks\\\", \\\"chunk_semantics\\\", \\\"chunk_entities\\\",\\n \\\"chunk_taxonomy\\\", \\\"document_taxonomy\\\", \\\"document_entities\\\",\\n \\\"document_pages\\\", \\\"entity_semantics\\\", \\\"entity_taxonomy_mapping\\\",\\n \\\"entity_types\\\", \\\"generated_questions\\\",\\n \\\"pipeline_configs\\\", \\\"pipeline_queue\\\", \\\"pipeline_runs\\\", \\\"pipeline_steps\\\",\\n \\\"provenance\\\", \\\"semantic_queue\\\", \\\"stopwords\\\",\\n \\\"chat_sessions\\\", \\\"chat_messages\\\",\\n \\\"entities\\\", \\\"entity_relations\\\", \\\"entity_classifications\\\",\\n \\\"taxonomy_terms\\\", \\\"ontology_classes\\\", \\\"search_history\\\"\\n ]\\n },\\n\\n \\\"blocked_keywords\\\": [\\n \\\"DROP\\\", \\\"DELETE\\\", \\\"INSERT\\\", \\\"UPDATE\\\", \\\"TRUNCATE\\\",\\n \\\"ALTER\\\", \\\"CREATE\\\", \\\"RENAME\\\", \\\"GRANT\\\", \\\"REVOKE\\\",\\n \\\"LOAD_FILE\\\", \\\"INTO OUTFILE\\\", \\\"INTO DUMPFILE\\\",\\n \\\"BENCHMARK\\\", \\\"SLEEP\\\"\\n ],\\n\\n \\\"limits\\\": {\\n \\\"max_query_length\\\": 2000,\\n \\\"max_rows\\\": 100,\\n \\\"query_timeout_sec\\\": 30\\n }\\n}<\/code><\/pre>\\n\\n<h2>Datenbank hinzufügen<\/h2>\\n<pre><code># \/etc\/mcp-db\/config.json bearbeiten\\n{\\n \\\"allowed_databases\\\": [\\n \\\"ki_dev\\\",\\n \\\"ki_content\\\",\\n \\\"neue_datenbank\\\" \/\/ NEU\\n ],\\n \\\"allowed_tables\\\": {\\n \/\/ ...\\n \\\"neue_datenbank\\\": [ \/\/ NEU\\n \\\"tabelle1\\\",\\n \\\"tabelle2\\\"\\n ]\\n }\\n}\\n\\n# Sofort wirksam - kein Neustart nötig!<\/code><\/pre>\\n\\n<h2>Environment Variables (.env)<\/h2>\\n<p>Pfad: <code>\/var\/www\/mcp-servers\/mcp_db\/.env<\/code><\/p>\\n<p class=\\\"alert alert-warning\\\">Änderungen an .env erfordern einen Claude-Neustart!<\/p>\\n\\n<table>\\n <tr><th>Variable<\/th><th>Beschreibung<\/th><th>Default<\/th><\/tr>\\n <tr><td>DB_HOST<\/td><td>Datenbank-Host für Queries<\/td><td>localhost<\/td><\/tr>\\n <tr><td>DB_USER<\/td><td>User für Queries<\/td><td>mcp_readonly<\/td><\/tr>\\n <tr><td>DB_PASSWORD<\/td><td>Passwort für Query-User<\/td><td>-<\/td><\/tr>\\n <tr><td>LOG_DB_HOST<\/td><td>Datenbank-Host für Logging<\/td><td>localhost<\/td><\/tr>\\n <tr><td>LOG_DB_NAME<\/td><td>Datenbank für Logging<\/td><td>ki_dev<\/td><\/tr>\\n <tr><td>LOG_DB_USER<\/td><td>User für Logging (nur INSERT)<\/td><td>mcp_logger<\/td><\/tr>\\n <tr><td>LOG_DB_PASSWORD<\/td><td>Passwort für Logger-User<\/td><td>-<\/td><\/tr>\\n<\/table>\\n\\n<h2>Claude Code Hook<\/h2>\\n<p>Der Blocking-Hook verhindert direkte mysql\/mariadb-Befehle.<\/p>\\n<p>Pfad: <code>\/root\/.claude\/settings.json<\/code><\/p>\\n\\n<pre><code>{\\n \\\"hooks\\\": {\\n \\\"PreToolUse\\\": [{\\n \\\"matcher\\\": \\\"Bash\\\",\\n \\\"hooks\\\": [{\\n \\\"type\\\": \\\"command\\\",\\n \\\"command\\\": \\\"\/var\/www\/scripts\/hooks\/block_direct_db.py\\\",\\n \\\"timeout\\\": 5\\n }]\\n }]\\n }\\n}<\/code><\/pre>\\n\\n<h3>Exit-Codes<\/h3>\\n<table>\\n <tr><th>Exit Code<\/th><th>Bedeutung<\/th><th>Aktion<\/th><\/tr>\\n <tr><td>0<\/td><td>Erlauben<\/td><td>Befehl wird ausgeführt<\/td><\/tr>\\n <tr><td>2<\/td><td>Blockieren<\/td><td>Befehl wird abgelehnt<\/td><\/tr>\\n<\/table>\\n\\n<h2>config.py Implementierung<\/h2>\\n<p>Die Config-Klasse lädt bei jedem Zugriff die JSON-Datei neu (Metaclass mit Properties):<\/p>\\n\\n<pre><code>\\\"\\\"\\\"config.py - Hot-Reload aus JSON\\\"\\\"\\\"\\nimport json\\nfrom pathlib import Path\\n\\nCONFIG_PATH = Path(\\\"\/etc\/mcp-db\/config.json\\\")\\n\\ndef _load_json_config() -> dict:\\n \\\"\\\"\\\"Lädt JSON-Config bei jedem Aufruf.\\\"\\\"\\\"\\n if CONFIG_PATH.exists():\\n with open(CONFIG_PATH, \\\"r\\\") as f:\\n return json.load(f)\\n return {}\\n\\nclass _ConfigMeta(type):\\n @property\\n def ALLOWED_DATABASES(cls) -> list:\\n cfg = _load_json_config()\\n return cfg.get(\\\"allowed_databases\\\", [\\\"ki_dev\\\", \\\"ki_content\\\"])\\n\\n @property\\n def ALLOWED_TABLES(cls) -> list:\\n cfg = _load_json_config()\\n tables_dict = cfg.get(\\\"allowed_tables\\\", {})\\n return [t for tables in tables_dict.values() \\n if isinstance(tables, list) for t in tables]\\n # ... weitere Properties\\n\\nclass Config(metaclass=_ConfigMeta):\\n # Statische Werte aus Environment\\n DB_HOST = os.getenv(\\\"DB_HOST\\\", \\\"localhost\\\")\\n DB_USER = os.getenv(\\\"DB_USER\\\", \\\"mcp_readonly\\\")\\n # ...<\/code><\/pre>\\n\\n<h2>Keyword Blocklist<\/h2>\\n<table>\\n <tr><th>Kategorie<\/th><th>Keywords<\/th><\/tr>\\n <tr><td>DML<\/td><td>DELETE, INSERT, UPDATE<\/td><\/tr>\\n <tr><td>DDL<\/td><td>DROP, TRUNCATE, ALTER, CREATE, RENAME<\/td><\/tr>\\n <tr><td>DCL<\/td><td>GRANT, REVOKE<\/td><\/tr>\\n <tr><td>File-Ops<\/td><td>LOAD_FILE, INTO OUTFILE, INTO DUMPFILE<\/td><\/tr>\\n <tr><td>DoS<\/td><td>BENCHMARK, SLEEP<\/td><\/tr>\\n<\/table>\\n\\n<h2>Limits<\/h2>\\n<table>\\n <tr><th>Limit<\/th><th>Wert<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td>max_query_length<\/td><td>2000<\/td><td>Maximale Query-Länge in Zeichen<\/td><\/tr>\\n <tr><td>max_rows<\/td><td>100<\/td><td>Maximale Ergebniszeilen<\/td><\/tr>\\n <tr><td>query_timeout_sec<\/td><td>30<\/td><td>Query-Timeout in Sekunden<\/td><\/tr>\\n<\/table>\\n\\n<h2>Verwandte Kapitel<\/h2>\\n<ul>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\/mcp-db-security\\\">Sicherheit<\/a> - DB-User Hardening<\/li>\\n <li><a href=\\\"\/docs\/mcp\/mcp-db\/mcp-db-installation\\\">Installation<\/a> - .env Setup<\/li>\\n <li><a href=\\\"\/docs\/betrieb\/claude-hooks\\\">Claude Hooks<\/a> - Hook-Dokumentation<\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 5,\n \"depth\": 2,\n \"created_at\": \"2025-12-20T11:13:58\",\n \"updated_at\": \"2025-12-31T05:09:01\"\n },\n \"message\": \"Document #41 updated\"\n}"
}
]
}