{
"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>\/opt\/mcp-servers\/mcp-db\/.env<\/code><\/td><td>Nein<\/td><td>DB-Credentials<\/td><\/tr>\\n <tr><td>Claude Hooks<\/td><td><code>\/var\/www\/.claude\/settings.local.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 \\\"ki_system\\\"\\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 ],\\n \\\"ki_content\\\": [\\n \\\"content_orders\\\", \\\"content_versions\\\", \\\"content_contracts\\\",\\n \\\"content_critiques\\\", \\\"content_sources\\\", \\\"content_structures\\\",\\n \\\"content_config\\\", \\\"content_config_history\\\", \\\"author_profiles\\\",\\n \\\"documents\\\", \\\"chunks\\\", \\\"chunk_semantics\\\", \\\"chunk_entities\\\",\\n \\\"chunk_taxonomy\\\", \\\"document_taxonomy\\\",\\n \\\"chat_sessions\\\", \\\"chat_messages\\\",\\n \\\"entities\\\", \\\"entity_relations\\\", \\\"entity_synonyms\\\",\\n \\\"entity_classifications\\\", \\\"taxonomy_terms\\\", \\\"ontology_classes\\\",\\n \\\"search_history\\\"\\n ],\\n \\\"ki_system\\\": [\\n \\\"prompts\\\", \\\"prompt_tests\\\", \\\"system_prompts\\\", \\\"critics\\\"\\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 \\\"ki_system\\\",\\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>\/opt\/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 (nur SELECT)<\/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>\/var\/www\/.claude\/settings.local.json<\/code><\/p>\\n\\n<pre><code>{\\n \\\"hooks\\\": {\\n \\\"PreToolUse\\\": [{\\n \\\"matcher\\\": \\\"Bash\\\",\\n \\\"hooks\\\": [{\\n \\\"type\\\": \\\"command\\\",\\n \\\"command\\\": \\\"\/var\/www\/tools\/ki-protokoll\/claude-hook\/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 <li><a href=\\\"\/docs\/server\/hostname\\\">Hostname<\/a> - \/etc\/hosts Konfiguration<\/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-22T08:27:37\"\n }\n}"
}
]
}