{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 278,\n \"uuid\": \"28a6ecca-8fb2-4e3f-8baa-68b67f5f8636\",\n \"title\": \"Code-Intelligenz: MCP-Server mcp-code (minimal, SOLID)\",\n \"description\": \"## Ziel\\nMCP-Server für Code-Analyse-Abfragen. Minimal, DRY, SOLID-konform.\\n\\n## Prinzipien-Einhaltung\\n\\n### DRY\\n- **Keine Duplikation**: Queries aus bestehendem PHP-Repository übernehmen\\n- DB-Connection-Pattern von mcp-db kopieren (nicht neu erfinden)\\n\\n### SRP (Single Responsibility)\\n- Jedes Tool: Eine Datei, eine Aufgabe\\n- Server: Nur Tool-Registrierung\\n- Kein Business-Logic im Server\\n\\n### KISS\\n- 6 Tools, keine verschachtelten Abstraktionen\\n- Direkte DB-Queries, kein ORM\\n- Keine unnötigen Wrapper\\n\\n### YAGNI\\n- Kein Caching (DB ist schnell genug)\\n- Keine Pagination (max 100 Ergebnisse reicht)\\n- Keine Auth (lokaler Server)\\n\\n### OCP (Open-Closed)\\n- Neue Tools durch neue Dateien, nicht durch Änderung bestehender\\n\\n### DIP (Dependency Inversion)\\n- Tools bekommen DB-Connection injiziert\\n- Keine hardcoded Dependencies\\n\\n---\\n\\n## Struktur (minimal)\\n\\n```\\n\/opt\/mcp-servers\/mcp-code\/\\n├── server.py # 40 LOC - FastMCP + Tool-Registration\\n├── config.py # 15 LOC - DB-Config aus .env\\n├── .env # DB_HOST, DB_USER, DB_PASSWORD, DB_NAME\\n├── requirements.txt # fastmcp, mysql-connector-python, python-dotenv\\n└── tools\/\\n ├── __init__.py\\n ├── search.py # code_search\\n ├── class_info.py # code_class \\n ├── dependencies.py # code_dependencies\\n ├── dependents.py # code_dependents\\n ├── impact.py # code_impact\\n └── stats.py # code_stats\\n```\\n\\n**Keine domain\/, infrastructure\/, validators\/ Ordner** - YAGNI!\\n\\n---\\n\\n## Tool-Spezifikationen\\n\\n### 1. code_search(query, namespace?, type?)\\n```python\\n\\\"\\\"\\\"Sucht Klassen\/Interfaces\/Traits nach Name.\\\"\\\"\\\"\\n# SQL: SELECT id, namespace, classes FROM code_analysis \\n# WHERE file_name LIKE ? OR namespace LIKE ?\\n# Returns: [{fqcn, type, file_id, file_name}]\\n```\\n\\n### 2. code_class(fqcn)\\n```python\\n\\\"\\\"\\\"Holt Klassen-Details per FQCN.\\\"\\\"\\\"\\n# SQL: SELECT * FROM code_analysis WHERE namespace = ? AND file_name LIKE ?\\n# + Dependents-Count via code_dependencies\\n# Returns: {fqcn, type, file_path, namespace, methods[], \\n# dependencies[], dependents_count}\\n```\\n\\n### 3. code_dependencies(fqcn, type?)\\n```python\\n\\\"\\\"\\\"Was nutzt diese Klasse? (outgoing)\\\"\\\"\\\"\\n# SQL: SELECT * FROM code_dependencies \\n# WHERE analysis_id = (SELECT id FROM code_analysis WHERE ...)\\n# Returns: [{target_fqcn, dependency_type}]\\n```\\n\\n### 4. code_dependents(fqcn, type?)\\n```python\\n\\\"\\\"\\\"Wer nutzt diese Klasse? (incoming) - Wichtigste Funktion!\\\"\\\"\\\"\\n# SQL: Bereits in PHP Repository:290 implementiert - GLEICHE Query!\\n# SELECT ca.id, ca.file_name, ca.namespace, cd.dependency_type\\n# FROM code_dependencies cd\\n# JOIN code_analysis ca ON cd.analysis_id = ca.id\\n# WHERE cd.target_fqcn = ?\\n# Returns: [{file_id, file_name, namespace, dependency_type}]\\n```\\n\\n### 5. code_impact(fqcn)\\n```python\\n\\\"\\\"\\\"Impact-Analyse bei Änderung.\\\"\\\"\\\"\\n# Nutzt code_dependents() intern\\n# Berechnet: direct_count, risk_level, affected_layers\\n# Returns: {fqcn, direct_dependents: int, risk_level: low|medium|high|critical,\\n# affected_namespaces: [], recommendation: string}\\n```\\n\\nRisk-Level-Logik:\\n- 0 Dependents → low\\n- 1-5 Dependents → medium \\n- 6-15 Dependents → high\\n- >15 Dependents → critical\\n\\n### 6. code_stats()\\n```python\\n\\\"\\\"\\\"Projekt-Statistiken.\\\"\\\"\\\"\\n# SQL: Bereits in PHP Repository:212 implementiert - GLEICHE Query!\\n# Returns: {total_classes, total_interfaces, total_traits,\\n# dependencies_by_type: {extends, implements, constructor, use, trait},\\n# top_used_classes: [{fqcn, count}]}\\n```\\n\\n---\\n\\n## Implementierung (Copy from PHP)\\n\\nDiese Queries aus CodeAnalysisRepository.php übernehmen:\\n\\n| PHP-Methode | Python-Tool | Zeile |\\n|-------------|-------------|-------|\\n| `findDependents()` | `code_dependents` | 290-311 |\\n| `getStatistics()` | `code_stats` | 212-251 |\\n| `getDependencyStatistics()` | `code_stats` | 336-368 |\\n| `findAll()` | `code_search` | 25-79 |\\n| `findById()` | `code_class` | 84-91 |\\n| `getDependencies()` | `code_dependencies` | 318-329 |\\n\\n---\\n\\n## Qualitätskriterien\\n\\n- [ ] Alle 6 Tools funktionieren\\n- [ ] Type Hints überall\\n- [ ] Prepared Statements (keine SQL-Injection)\\n- [ ] Max 100 Ergebnisse pro Query\\n- [ ] Logging zu stderr (MCP-konform)\\n- [ ] Fehler geben sinnvolle Messages\\n- [ ] \/opt\/scripts\/python-check.sh besteht\\n\\n---\\n\\n## Claude Code Integration\\n\\nNach Implementierung in `~\/.claude\/settings.json`:\\n```json\\n{\\n \\\"mcpServers\\\": {\\n \\\"mcp-code\\\": {\\n \\\"command\\\": \\\"\/opt\/mcp-servers\/mcp-code\/venv\/bin\/python\\\",\\n \\\"args\\\": [\\\"-u\\\", \\\"\/opt\/mcp-servers\/mcp-code\/server.py\\\"]\\n }\\n }\\n}\\n```\\n\\n---\\n\\n## CLAUDE.md Ergänzung (5 Zeilen)\\n\\n```markdown\\n## Code-Analyse (MCP-Code)\\n\\nVor Refactoring: `code_dependents(fqcn)` und `code_impact(fqcn)` nutzen.\\nVerfügbare Tools: code_search, code_class, code_dependencies, code_dependents, code_impact, code_stats\\n```\\n\\n---\\n\\n## Nicht implementieren (YAGNI)\\n\\n- ❌ REST-API (MCP reicht)\\n- ❌ Pre-Hooks (zu komplex)\\n- ❌ Auto-Scan (manuell reicht)\\n- ❌ Contracts (bestehende reichen)\\n- ❌ Graph-Tool (Web-UI existiert)\\n- ❌ Caching\\n- ❌ Rate-Limiting\\n- ❌ Systemd-Service (läuft via Claude Code)\",\n \"type\": \"ai_task\",\n \"status\": \"in_progress\",\n \"created_by\": \"mcp-tasks\",\n \"created_by_type\": \"ai\",\n \"parent_task_id\": null,\n \"due_date\": null,\n \"created_at\": \"2025-12-23T16:19:03.633415\",\n \"updated_at\": \"2025-12-23T16:20:26.109925\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #278 status changed: pending -> in_progress\"\n}"
}
]
}