{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/mcp-servers\/mcp_code\/tools\/class_info.py",
"content": "\"\"\"code_class - Holt Klassen-Details per FQCN.\"\"\"\n\nimport json\n\nfrom db import execute_query, execute_single\n\n\ndef register_class_tool(mcp):\n \"\"\"Registriert code_class Tool.\"\"\"\n\n @mcp.tool()\n def code_class(fqcn: str) -> dict:\n \"\"\"\n Holt Klassen-Details per FQCN (Fully Qualified Class Name).\n\n Args:\n fqcn: Vollstaendiger Klassenname (z.B. Controller\\\\HomeController)\n\n Returns:\n Dict mit fqcn, type, file_path, namespace, methods,\n dependencies, dependents_count\n \"\"\"\n # FQCN in Namespace und Klassennamen aufteilen\n parts = fqcn.rsplit(\"\\\\\", 1)\n if len(parts) == 2:\n namespace, class_name = parts\n else:\n namespace = None\n class_name = fqcn\n\n # Klasse finden - SQL aus PHP CodeAnalysisRepository::findById()\n if namespace:\n sql = \"\"\"\n SELECT id, file_path, file_name, namespace, classes, functions\n FROM code_analysis\n WHERE namespace = %s AND classes LIKE %s\n LIMIT 1\n \"\"\"\n params = (namespace, f'%\"{class_name}\"%')\n else:\n sql = \"\"\"\n SELECT id, file_path, file_name, namespace, classes, functions\n FROM code_analysis\n WHERE namespace IS NULL AND classes LIKE %s\n LIMIT 1\n \"\"\"\n params = (f'%\"{class_name}\"%',)\n\n row = execute_single(sql, params)\n\n if not row:\n return {\"error\": f\"Klasse nicht gefunden: {fqcn}\"}\n\n classes = json.loads(row[\"classes\"] or \"[]\")\n functions = json.loads(row[\"functions\"] or \"[]\")\n\n # Die richtige Klasse finden (falls mehrere in einer Datei)\n class_info = None\n for cls in classes:\n if cls[\"name\"] == class_name:\n class_info = cls\n break\n\n if not class_info:\n return {\"error\": f\"Klasse nicht in Datei gefunden: {class_name}\"}\n\n # Dependencies laden - SQL aus PHP CodeAnalysisRepository::getDependencies()\n dep_sql = \"\"\"\n SELECT dependency_type, target_fqcn\n FROM code_dependencies\n WHERE analysis_id = %s\n ORDER BY dependency_type, target_fqcn\n \"\"\"\n dependencies = execute_query(dep_sql, (row[\"id\"],))\n\n # Dependents zaehlen\n dep_count_sql = \"\"\"\n SELECT COUNT(*) as cnt FROM code_dependencies WHERE target_fqcn = %s\n \"\"\"\n count_row = execute_single(dep_count_sql, (fqcn,))\n dependents_count = count_row[\"cnt\"] if count_row else 0\n\n return {\n \"fqcn\": fqcn,\n \"type\": class_info.get(\"type\", \"class\"),\n \"file_id\": row[\"id\"],\n \"file_path\": row[\"file_path\"],\n \"file_name\": row[\"file_name\"],\n \"namespace\": row[\"namespace\"],\n \"methods\": functions,\n \"dependencies\": dependencies,\n \"dependents_count\": dependents_count,\n }\n"
}
}
{
"tool_response": {
"type": "update",
"filePath": "\/var\/www\/mcp-servers\/mcp_code\/tools\/class_info.py",
"content": "\"\"\"code_class - Holt Klassen-Details per FQCN.\"\"\"\n\nimport json\n\nfrom db import execute_query, execute_single\n\n\ndef register_class_tool(mcp):\n \"\"\"Registriert code_class Tool.\"\"\"\n\n @mcp.tool()\n def code_class(fqcn: str) -> dict:\n \"\"\"\n Holt Klassen-Details per FQCN (Fully Qualified Class Name).\n\n Args:\n fqcn: Vollstaendiger Klassenname (z.B. Controller\\\\HomeController)\n\n Returns:\n Dict mit fqcn, type, file_path, namespace, methods,\n dependencies, dependents_count\n \"\"\"\n # FQCN in Namespace und Klassennamen aufteilen\n parts = fqcn.rsplit(\"\\\\\", 1)\n if len(parts) == 2:\n namespace, class_name = parts\n else:\n namespace = None\n class_name = fqcn\n\n # Klasse finden - SQL aus PHP CodeAnalysisRepository::findById()\n if namespace:\n sql = \"\"\"\n SELECT id, file_path, file_name, namespace, classes, functions\n FROM code_analysis\n WHERE namespace = %s AND classes LIKE %s\n LIMIT 1\n \"\"\"\n params = (namespace, f'%\"{class_name}\"%')\n else:\n sql = \"\"\"\n SELECT id, file_path, file_name, namespace, classes, functions\n FROM code_analysis\n WHERE namespace IS NULL AND classes LIKE %s\n LIMIT 1\n \"\"\"\n params = (f'%\"{class_name}\"%',)\n\n row = execute_single(sql, params)\n\n if not row:\n return {\"error\": f\"Klasse nicht gefunden: {fqcn}\"}\n\n classes = json.loads(row[\"classes\"] or \"[]\")\n functions = json.loads(row[\"functions\"] or \"[]\")\n\n # Die richtige Klasse finden (falls mehrere in einer Datei)\n class_info = None\n for cls in classes:\n if cls[\"name\"] == class_name:\n class_info = cls\n break\n\n if not class_info:\n return {\"error\": f\"Klasse nicht in Datei gefunden: {class_name}\"}\n\n # Dependencies laden - SQL aus PHP CodeAnalysisRepository::getDependencies()\n dep_sql = \"\"\"\n SELECT dependency_type, target_fqcn\n FROM code_dependencies\n WHERE analysis_id = %s\n ORDER BY dependency_type, target_fqcn\n \"\"\"\n dependencies = execute_query(dep_sql, (row[\"id\"],))\n\n # Dependents zaehlen\n dep_count_sql = \"\"\"\n SELECT COUNT(*) as cnt FROM code_dependencies WHERE target_fqcn = %s\n \"\"\"\n count_row = execute_single(dep_count_sql, (fqcn,))\n dependents_count = count_row[\"cnt\"] if count_row else 0\n\n return {\n \"fqcn\": fqcn,\n \"type\": class_info.get(\"type\", \"class\"),\n \"file_id\": row[\"id\"],\n \"file_path\": row[\"file_path\"],\n \"file_name\": row[\"file_name\"],\n \"namespace\": row[\"namespace\"],\n \"methods\": functions,\n \"dependencies\": dependencies,\n \"dependents_count\": dependents_count,\n }\n",
"structuredPatch": [
{
"oldStart": 1,
"oldLines": 8,
"newStart": 1,
"newLines": 7,
"lines": [
" \"\"\"code_class - Holt Klassen-Details per FQCN.\"\"\"",
"+",
" import json",
"-import sys",
" ",
"-sys.path.insert(0, \"\/var\/www\/mcp-servers\/mcp_code\")",
" from db import execute_query, execute_single",
" ",
" "
]
},
{
"oldStart": 15,
"oldLines": 7,
"newStart": 14,
"newLines": 7,
"lines": [
" Holt Klassen-Details per FQCN (Fully Qualified Class Name).",
" ",
" Args:",
"- fqcn: Vollständiger Klassenname (z.B. Controller\\\\HomeController)",
"+ fqcn: Vollstaendiger Klassenname (z.B. Controller\\\\HomeController)",
" ",
" Returns:",
" Dict mit fqcn, type, file_path, namespace, methods,"
]
},
{
"oldStart": 74,
"oldLines": 7,
"newStart": 73,
"newLines": 7,
"lines": [
" \"\"\"",
" dependencies = execute_query(dep_sql, (row[\"id\"],))",
" ",
"- # Dependents zählen",
"+ # Dependents zaehlen",
" dep_count_sql = \"\"\"",
" SELECT COUNT(*) as cnt FROM code_dependencies WHERE target_fqcn = %s",
" \"\"\""
]
}
],
"originalFile": "\"\"\"code_class - Holt Klassen-Details per FQCN.\"\"\"\nimport json\nimport sys\n\nsys.path.insert(0, \"\/var\/www\/mcp-servers\/mcp_code\")\nfrom db import execute_query, execute_single\n\n\ndef register_class_tool(mcp):\n \"\"\"Registriert code_class Tool.\"\"\"\n\n @mcp.tool()\n def code_class(fqcn: str) -> dict:\n \"\"\"\n Holt Klassen-Details per FQCN (Fully Qualified Class Name).\n\n Args:\n fqcn: Vollständiger Klassenname (z.B. Controller\\\\HomeController)\n\n Returns:\n Dict mit fqcn, type, file_path, namespace, methods,\n dependencies, dependents_count\n \"\"\"\n # FQCN in Namespace und Klassennamen aufteilen\n parts = fqcn.rsplit(\"\\\\\", 1)\n if len(parts) == 2:\n namespace, class_name = parts\n else:\n namespace = None\n class_name = fqcn\n\n # Klasse finden - SQL aus PHP CodeAnalysisRepository::findById()\n if namespace:\n sql = \"\"\"\n SELECT id, file_path, file_name, namespace, classes, functions\n FROM code_analysis\n WHERE namespace = %s AND classes LIKE %s\n LIMIT 1\n \"\"\"\n params = (namespace, f'%\"{class_name}\"%')\n else:\n sql = \"\"\"\n SELECT id, file_path, file_name, namespace, classes, functions\n FROM code_analysis\n WHERE namespace IS NULL AND classes LIKE %s\n LIMIT 1\n \"\"\"\n params = (f'%\"{class_name}\"%',)\n\n row = execute_single(sql, params)\n\n if not row:\n return {\"error\": f\"Klasse nicht gefunden: {fqcn}\"}\n\n classes = json.loads(row[\"classes\"] or \"[]\")\n functions = json.loads(row[\"functions\"] or \"[]\")\n\n # Die richtige Klasse finden (falls mehrere in einer Datei)\n class_info = None\n for cls in classes:\n if cls[\"name\"] == class_name:\n class_info = cls\n break\n\n if not class_info:\n return {\"error\": f\"Klasse nicht in Datei gefunden: {class_name}\"}\n\n # Dependencies laden - SQL aus PHP CodeAnalysisRepository::getDependencies()\n dep_sql = \"\"\"\n SELECT dependency_type, target_fqcn\n FROM code_dependencies\n WHERE analysis_id = %s\n ORDER BY dependency_type, target_fqcn\n \"\"\"\n dependencies = execute_query(dep_sql, (row[\"id\"],))\n\n # Dependents zählen\n dep_count_sql = \"\"\"\n SELECT COUNT(*) as cnt FROM code_dependencies WHERE target_fqcn = %s\n \"\"\"\n count_row = execute_single(dep_count_sql, (fqcn,))\n dependents_count = count_row[\"cnt\"] if count_row else 0\n\n return {\n \"fqcn\": fqcn,\n \"type\": class_info.get(\"type\", \"class\"),\n \"file_id\": row[\"id\"],\n \"file_path\": row[\"file_path\"],\n \"file_name\": row[\"file_name\"],\n \"namespace\": row[\"namespace\"],\n \"methods\": functions,\n \"dependencies\": dependencies,\n \"dependents_count\": dependents_count,\n }\n"
}
}