{
"event": "PreToolUse",
"tool_name": "mcp__mcp-tasks__tasks_create",
"tool_input": {
"title": "Code-Intelligenz: MCP-Server mcp-code (minimal, SOLID)",
"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)",
"type": "ai_task"
}
}
{
"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\": \"pending\",\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:19:03.633417\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #278 created\"\n}"
}
]
}