"""code_search - Sucht Klassen/Interfaces/Traits nach Name."""
import json
from db import execute_query
def register_search_tool(mcp):
"""Registriert code_search Tool."""
@mcp.tool()
def code_search(
query: str,
namespace: str = None,
class_type: str = None,
) -> dict:
"""
Sucht Klassen/Interfaces/Traits nach Name.
Args:
query: Suchbegriff (Name oder Teil davon)
namespace: Filter nach Namespace (optional)
class_type: Filter nach Typ: class, interface, trait (optional)
Returns:
Dict mit results: [{fqcn, type, file_id, file_name}]
"""
# SQL aus PHP CodeAnalysisRepository::findAll() (Zeile 50-54)
sql = """
SELECT id, file_name, namespace, classes
FROM code_analysis
WHERE (file_name LIKE %s OR namespace LIKE %s)
AND classes IS NOT NULL AND classes != '[]'
"""
params = [f"%{query}%", f"%{query}%"]
if namespace:
sql += " AND namespace = %s"
params.append(namespace)
sql += " ORDER BY namespace, file_name LIMIT 100"
rows = execute_query(sql, tuple(params))
results = []
for row in rows:
classes = json.loads(row["classes"] or "[]")
for cls in classes:
# Filter by type if specified
if class_type and cls.get("type") != class_type:
continue
fqcn = f"{row['namespace']}\\{cls['name']}" if row["namespace"] else cls["name"]
# Filter by query in class name
if query.lower() not in cls["name"].lower() and query.lower() not in (row["namespace"] or "").lower():
continue
results.append({
"fqcn": fqcn,
"type": cls.get("type", "class"),
"file_id": row["id"],
"file_name": row["file_name"],
})
return {"results": results, "count": len(results)}