Dein freundlicher Kritiker für KI-erzeugten PHP Code

Was ist der MCP PHP Server und was kann der?


Wer heute mit KI-Assistenten wie Claude Code PHP-Anwendungen entwickelt, kennt vielleicht diese Situation: Die KI schlägt eine Lösung vor, Du nimmst sie an, der Code läuft. Aber dann kommen die Fragen:

Genau hier setzt der MCP PHP Server an. Er ist im Grunde ein spezialisierter Werkzeugkasten, der direkt mit KI-Assistenten kommunizieren kann (über das sogenannte Model Context Protocol (MCP)). Das bedeutet: Während Du mit Claude Code an Deinem PHP-Projekt arbeitest, kann die KI den Code automatisch prüfen lassen, ohne dass Du zwischen verschiedenen Tools hin- und herspringen musst. Die Analyseergebnisse bleiben im Kontext, die KI kann direkt darauf reagieren und Verbesserungen vorschlagen.

Das klingt erstmal abstrakt. Lass uns das konkreter machen.

Was ist hier eigentlich das Besondere – und warum braucht man dafür einen eigenen Server?

Der Kern ist dieser: Normalerweise laufen Code-Analyse-Werkzeuge wie PHPStan oder PHP-CS-Fixer in Deinem Terminal. Tools sind Werkzeuge. Du startest sie manuell, sie geben textuellen Output zurück, Du interpretierst ihn, kopierst Fehler-Meldungen raus, passt Code an, startest erneut.

Das ist ein Kontextwechsel. Du verlässt Dein Gespräch mit der KI, gehst ins Terminal, kommst zurück, erklärst der KI was Du gefunden hast.

Der MCP PHP Server macht etwas anderes: Er läuft als eigenständiger Prozess im Hintergrund und kommuniziert direkt mit der KI über eine strukturierte Schnittstelle. Das Model Context Protocol ist ein JSON-basiertes Frage-Antwort-System.

Das bedeutet: Die KI kann während ihr beide an Code arbeitet selbstständig Analyse-Anfragen stellen ("Wie steht es um die Qualität dieser Datei?") und bekommt strukturierte Antworten zurück. JSON enthält Metriken, Findings und Scores.

Kein Kontextwechsel, kein manuelles Kopieren von Terminal-Output, kein Interpretieren unterschiedlicher Ausgabe-Formate verschiedener Werkzeuge. Alles bleibt im Fluss des Gesprächs.

Der Server ist also eine Art Übersetzer zwischen klassischen PHP-Analyse-Werkzeugen und KI-Assistenten: Er bündelt unterschiedliche Checks, standardisiert die Ausgabe und macht sie für KI-Systeme direkt nutzbar.

Wo das im Alltag hilft (und wo nicht)

Stell Dir vor, Du entwickelst gerade einen internen Prototypen für eine neue Idee. Die KI hat Dir eine Funktion generiert, die Kundendaten in die Datenbank schreibt. Der Code funktioniert, die Grundidee steht. Soweit so gut. Aber: Enthält die Funktion vielleicht eine SQL-Injection-Schwachstelle? Ist sie nach PSR-12-Standard formatiert? Wird Code dupliziert, den man besser in eine wiederverwendbare Methode auslagern sollte?

Normalerweise würdest Du jetzt PHPStan starten, dann Psalm für die Security-Analyse, dann PHP-CS-Fixer für die Formatierung, dann noch mal PHP_CodeSniffer für PSR-Compliance. Jedes Tool hat seine eigene Konfiguration, seine eigenen Log-Dateien, seine eigene Ausgabe. Du kopierst Fehler zwischen Tools hin und her, interpretierst Warnungen, passt Code an, startest von vorn.

Der MCP PHP Server bündelt diese Analysen in einer einheitlichen Schnittstelle. Die KI kann direkt fragen: "Wie sieht die Code-Qualität dieser Datei aus?" oder "Gibt es Security-Probleme in diesem Modul?" und bekommt strukturierte Antworten zurück, mit denen sie weiterarbeiten kann. Das spart nicht nur Zeit, sondern hält den Workflow im Fluss: Du bleibst im Gespräch mit der KI, statt manuell Tools zu orchestrieren.

Wichtig dabei: Dieses System ersetzt nicht spezialisierte Static-Analysis-Tools wie PHPStan oder RIPS. Es nutzt eigene Analyse-Logik, die auf pattern-basierter Heuristik beruht. Anders als bei PHPStan gibt es keine vollständige AST-Analyse. Das bedeutet: Für tiefgehende statische Analysen oder komplexe Dataflow-Tracking greifst Du weiterhin zu den spezialisierten Tools. Der MCP PHP Server ist eher ein erster Filter, ein schneller Qualitäts-Check, der Dir offensichtliche Probleme und Verbesserungspotenziale zeigt, direkt im KI-gestützten Entwicklungs-Workflow.

Dieses Werkzeug ist in erster Linie dafür gedacht, einem KI-System iterativ Feedback zu geben, um damit

Code zu erzeugen. Für regulierte Produktionsumgebungen mit höchsten Security-Anforderungen sind die spezialisierten Analyse-Tools weiterhin unverzichtbar. Aber für iterative Prototyp-Entwicklung, schnelles Refactoring oder erste Code-Reviews im KI-Workflow ist das System sehr gut geeignet.

Was das System konkret macht

Dieser MCP Server stellt in diesem Praxis-Beispiel 17 spezialisierte Funktionen bereit, die verschiedene Aspekte von PHP-Code analysieren. Ich nutze ihn selbst. Die ursprünglich 86 Einzelfunktionen wurden konsolidiert:

Alle diese Analysen werden nachvollziehbar in einer Datenbank geloggt. Das heißt: Du kannst später nachsehen, welche Dateien wann analysiert wurden, wie lange die Analyse gedauert hat, ob Fehler aufgetreten sind. Das ist besonders in Teams oder regulierten Umgebungen wichtig, wo Nachvollziehbarkeit gefordert wird.

Wann setzt man das ein?

Das System ist speziell für Workflows gedacht, in denen Du mit KI-Assistenten wie Claude Code arbeitest. Die typischen Szenarien:

Beim Refactoring: Du lässt die KI Code umstrukturieren. Vor und nach dem Refactoring analysiert der Server die Code-Qualität. Hat sich der DRY-Score verbessert? Ist die Complexity gesunken? Die KI sieht die Zahlen und kann iterieren. Das ist besonders wertvoll, wenn Du nicht sicher bist, ob eine Änderung wirklich eine Verbesserung war.

Bei Code-Reviews: Die KI schlägt neuen Code vor. Bevor Du ihn annimmst, lässt Du ihn automatisch analysieren. Gibt es Security-Warnungen? PSR-Verstöße? Die KI kann direkt Fixes vorschlagen. So bekommst Du schnelles Feedback, ohne den Workflow zu unterbrechen.

Bei Legacy-Code-Modernisierung: Du arbeitest an einer alten PHP-Anwendung, die schrittweise auf moderne Standards gebracht werden soll. Der Server zeigt Dir für jede Datei den aktuellen Stand: PSR-Compliance, Code-Duplizierung, Security-Findings. So kannst Du priorisieren, welche Dateien zuerst angefasst werden sollten. Die KI hilft Dir dann gezielt bei den problematischsten Stellen.

Bei Lernprojekten: Wenn Du PHP lernst (oder mit Leuten arbeitest, die es lernen), gibt der Server konkretes, strukturiertes Feedback: "Diese Funktion ist zu komplex (Complexity: 15), CRUD-Operationen unvollständig, PSR-1-Verstöße in Zeile 42." Das ist didaktisch wertvoller als vage Hinweise und hilft, systematisch besseren Code zu schreiben.

Wo liegen die Grenzen?

Es ist mir ganz wichtig, das verständlich zu kommunizieren: Das System hat klare Limitationen, die Du kennen solltest.

Keine vollständige Static Analysis: Tools wie PHPStan bauen einen abstrakten Syntaxbaum (AST) auf und analysieren Datenflüsse durch Deinen Code. Der MCP PHP Server nutzt pattern-basierte Heuristiken, also Regex-Matches und Zeilen-Analysen. Das heißt: Komplexe Injection-Pfade über mehrere Funktionen hinweg werden nicht erkannt. Für tiefgehende Analysen brauchst Du weiterhin die spezialisierten Tools. Aber für iteratives Prototyping, schnelle Refactorings im KI-Workflow oder erste Code-Reviews ist es sehr gut geeignet, weil Du sofort im Kontext bleibst.

False Positives UND False Negatives: Bei Security-Scans findet das System offensichtliche Probleme, aber subtile Schwachstellen können durchrutschen. Etwa $_GET direkt in SQL wird erkannt. Und manchmal werden harmlose Code-Stellen als problematisch markiert. Jedes Finding solltest Du manuell verifizieren. Für Produktions-Code mit hohen Security-Anforderungen sind spezialisierte Tools wie RIPS oder SonarQube unverzichtbar. Aber für Entwicklungs-Prototypen oder initiales Code-Feedback im KI-Dialog ist das System gut geeignet.

PSR-12-Formatter: Die Formatierung deckt grundlegende Regeln ab (Tabs, Whitespace, Braces), aber nicht das vollständige PSR-12-Regelwerk. Für produktionsreife Formatierung nutzt Du php-cs-fixer. Aber für schnelle Korrekturen während der Entwicklung reicht es meist aus.

Rate Limiting: Der Server begrenzt Anfragen auf 100 pro Minute. Das schützt vor Überlastung, kann aber bei großen Batch-Analysen zum Engpass werden. Das ist eine bewusste Design-Entscheidung für den Einsatz mit einzelnen Entwicklern oder kleinen Teams, nicht für CI/CD-Pipelines mit hunderten Dateien pro Durchlauf.

Dateigröße: Maximale Dateigröße ist 5MB. Größere Dateien werden abgelehnt. Das ist eine bewusste Entscheidung zur DoS-Prävention. Es bedeutet aber: Monolithische Legacy-Dateien musst Du vor der Analyse aufteilen.

Warum diese Grenzen so klar dokumentieren?

Weil transparente Limitationen besser sind als versteckte Enttäuschungen.

Wenn Du dieses Werkzeug für hochkritische Produktions-Systeme einsetzt, Security-Schwachstellen mit absoluter Zuverlässigkeit finden musst und dann feststellst, dass pattern-basierte Heuristiken subtile Dataflow-Injection-Pfade übersehen, dann hast Du ein echtes Problem.

Wenn Du es stattdessen für iteratives Prototyping mit KI-Assistenten nutzt, schnelles Feedback zu Code-Qualität bekommen willst und dabei weißt, dass spezialisierte Werkzeuge für tiefgehende Analysen weiterhin nötig sind, dann passt es perfekt.

Die Abwägung hier ist: Vollständigkeit der Analyse versus Geschwindigkeit und KI-Integration.

Spezialisierte Werkzeuge wie PHPStan bauen einen vollständigen abstrakten Syntaxbaum auf und verfolgen Datenflüsse über mehrere Funktionen hinweg. Das ist präzise, aber langsam (mehrere Sekunden bis Minuten für größere Projekte) und komplex in der Integration.

Der MCP PHP Server nutzt regex-basierte Pattern-Erkennung und Zeilen-Analysen. Das ist circa 10-fach bis 50-fach schneller (Millisekunden bis einstellige Sekunden), aber weniger tiefgehend.

Für KI-gestützten Entwicklungs-Arbeitsablauf, wo Du iterativ arbeitest und sofortiges Feedback brauchst, überwiegt die Geschwindigkeit. Für finale Security-Audits oder regulierte Produktions-Freigaben sind die spezialisierten Werkzeuge unverzichtbar.

Beide Ansätze haben ihre Berechtigung für unterschiedliche Szenarien. Die dokumentierten Grenzen helfen Dir, das richtige Werkzeug für die richtige Situation zu wählen.

Wie das technisch funktioniert

Unter der Haube ist das ein Python-Server, der auf dem FastMCP Framework basiert. Dieses Framework implementiert das Model Context Protocol, einen Standard von Anthropic, der es KI-Modellen ermöglicht, mit externen Tools zu kommunizieren. Der Server läuft als eigenständiger Prozess, die KI schickt strukturierte Anfragen (JSON), bekommt strukturierte Antworten zurück.

Die Architektur besteht aus mehreren Schichten: MCP Protocol Layer (Kommunikation mit der KI), Core Analysis Engine (die eigentliche Code-Analyse), Analysis Modules (Quality, Security, Formatter) und PSR Standards Analyzers (11 spezialisierte Prüfer für verschiedene PSR-Standards). Dazu kommen Security-Layer: Path-Traversal-Protection (nur Dateien in /var/xyz dürfen analysiert werden), Rate Limiting (Sliding Window), File-Size-Limits, Audit-Logging.

Ein wichtiges Detail für die Performance: Der Server nutzt einen LRU-Cache (Least Recently Used), der Analyseergebnisse zwischenspeichert. Der Cache-Key basiert auf Dateipfad plus Änderungszeitpunkt. Wird die Datei geändert, invalidiert sich der Cache automatisch. In Messungen hat das eine 11,7-fache Beschleunigung bei Cache-Hits gebracht (von 1,87ms auf 0,16ms für eine Testdatei). Das macht iteratives Arbeiten deutlich flüssiger.

Was macht das anders als existierende Tools?

Der Hauptunterschied: Integration statt Isolation. PHPStan, Psalm, PHP-CS-Fixer sind exzellente Tools, aber sie leben in ihrer eigenen Welt. Du startest sie manuell, interpretierst ihre Ausgabe, passt Code an, startest neu. Der MCP PHP Server bringt das in den KI-Kontext. Die KI sieht die Analyseergebnisse, versteht sie im Zusammenhang mit Deiner Frage, schlägt Verbesserungen vor, analysiert erneut.

Dazu kommt: Einheitliches Logging für alle Operationen. Traditionelle Tools schreiben Logs in verschiedene Dateien, verschiedene Formate. Hier läuft alles über eine zentrale Datenbank-Tabelle mit strukturierten Feldern. Das ermöglicht später Trend-Analysen: "Wie hat sich die Code-Qualität in Modul X über die letzten 3 Monate entwickelt?"

Und schließlich: Framework-Agnostik. Viele Analyse-Tools sind auf bestimmte Frameworks zugeschnitten (Larastan für Laravel zum Beispiel). Dieser Server analysiert pures PHP, egal ob Du mit Laravel, Symfony, eigenen Frameworks oder legacy Code arbeitest.

Token-Einsparung im KI-Workflow

Circa 60 bis 75 Prozent Token-Reduktion gegenüber textueller Tool-Output-Übertragung.

Statt 500 bis 2000 Tokens pro Datei (bei textuellem PHPStan-Output) nur circa 200 bis 500 Tokens durch strukturiertes JSON-Format.

Wer sollte das nutzen (und wer nicht)?

Dieses System macht Sinn, wenn Du bereits mit KI-Assistenten entwickelst und die Code-Qualität systematisch im Blick behalten willst, ohne ständig zwischen Tools zu wechseln. Es ist besonders nützlich für:

Es macht weniger Sinn, wenn Du hauptsächlich manuell entwickelst (dann sind die klassischen Tools direkter), wenn Du AST-basierte Deep Analysis brauchst (dann PHPStan/Psalm), oder wenn Du vollautomatische CI/CD-Pipelines ohne KI-Interaktion aufsetzen willst (dann eher spezialisierte Scanner).

Bevor es gleich ins Detail geht

Die folgenden Kapitel dieser Dokumentation zeigen Dir im Detail, wie Du den Server installierst, konfigurierst und nutzt. Du findest konkrete Code-Beispiele, Performance-Benchmarks, Security-Konzepte und Troubleshooting-Anleitungen. Die Dokumentation ist so strukturiert, dass Du entweder gezielt nach einem Thema suchst (zum Beispiel "PSR-Standards") oder Dich schrittweise durcharbeitest.

Manchmal braucht es ein paar Iterationen, bis man versteht, wo so ein Tool hilft und wo nicht. Vielleicht probierst Du es erstmal mit einer kleineren Datei aus, lässt die KI analysieren, schaust Dir die Ergebnisse an. Wenn es passt, kannst Du das Schritt für Schritt ausweiten. Und wenn es nicht passt, dann sind die klassischen Tools vielleicht besser für Deinen Workflow geeignet ;-)

Technischer Kontext: MCP PHP Server vs. klassische Tools

Um das Ganze einzuordnen: Hier eine Gegenüberstellung, wie klassische PHP-Analyse-Ansätze funktionieren und wo dieser Server sich positioniert.

Analyse-Typ Klassischer Ansatz MCP PHP Server
Code-Analyse PHPStan, Psalm (AST-basierte Static Analysis, tiefgehend) Pattern-basierte Heuristik via php_analyze_file() (schneller Filter, keine vollständige Static Analysis)
Security Scanning RIPS, SonarQube (kommerzielle Tools, komplexes Setup, Dataflow-Tracking) Pattern-basierte Analyse via php_analyze_security() (regex-basiert, False Positives/Negatives möglich)
Code Formatting PHP-CS-Fixer (vollständige PSR-12-Formatierung, manuell gestartet) Integriert via php_format_code() (grundlegende PSR-12-Regeln, für vollständige Compliance weiterhin php-cs-fixer nutzen)
PSR Compliance PHP_CodeSniffer (separate Konfiguration pro Standard, detaillierte Regel-Checks) 11 PSR-Standards via einzelne Funktionen (granulare Sub-Checks, aber nicht vollständig deckungsgleich mit PHP_CodeSniffer)
Metrics & Complexity PHPLOC, PhpMetrics (separate Installationen, unterschiedliche Report-Formate) Einheitliches Metrics-Format in allen Analysen (Lines of Code, Complexity, Function/Class Count)

Zusammengefasst: Die klassischen Tools bieten tiefgehendere Analysen und vollständigere Abdeckung. Der MCP PHP Server bietet schnellere Integration in KI-Workflows, einheitliches Logging und einen kompakten Werkzeugkasten für die häufigsten Code-Qualitäts-Checks, ohne manuelle Tool-Orchestrierung.

Warum 17 konsolidierte Werkzeuge statt 86 Einzelfunktionen?

Kurz gesagt: Token-Overhead und API-Kosten. Bei 86 einzelnen Werkzeugen schickt der KI-Assistent bei jedem Aufruf circa 35.000 Tokens nur für Tool-Beschreibungen mit. Das summiert sich schnell.

Die ausführliche Geschichte dazu (inklusive meiner monatlichen API-Rechnung, die mich zur Konsolidierung motiviert hat) findest Du im Kapitel Architektur unter "Tool Consolidation".

Audit-Logging: Nachvollziehbarkeit statt Manipulation

Alle Operationen werden in einer Datenbank-Tabelle protokolliert. Das umfasst: Welches Tool wurde aufgerufen, auf welche Datei, war die Operation erfolgreich, wie lange hat sie gedauert, wann fand sie statt. Diese Logs sind nachvollziehbar, das heißt, Du kannst später sehen, was passiert ist. Das ist besonders wichtig, wenn Du in Teams arbeitest oder Compliance-Anforderungen erfüllen musst. Etwa ISO 27001 oder SOC 2.

Wichtig zu verstehen: "Nachvollziehbar" bedeutet nicht automatisch "manipulationssicher". Die Logs liegen in einer MariaDB-Datenbank. Wer Schreibzugriff auf diese Datenbank hat, könnte theoretisch Einträge ändern oder löschen. Manipulationsschutz hängt vom Datenbank-Hardening und Access Control ab. Es gibt keine WORM-Logs oder kryptografisch signierte Log-Einträge. WORM bedeutet Write Once, Read Many. Für höchste Sicherheitsanforderungen müsstest Du zusätzliche Maßnahmen implementieren. Etwa externe Log-Aggregation mit Signing.

Trotzdem: Für die meisten Szenarien reicht dieses Logging aus. Du kannst Trends analysieren ("Wie oft wurde Datei X in den letzten 30 Tagen analysiert?"), Performance-Probleme identifizieren ("Welche Analysen dauern am längsten?") und im Nachhinein nachvollziehen, welche Qualitäts-Checks wann durchgeführt wurden.

Performance: Caching macht den Unterschied

Ein Detail, das im Alltag spürbar wird: Der Server nutzt einen LRU-Cache (Least Recently Used), der Analyseergebnisse zwischenspeichert. Wenn Du dieselbe Datei mehrfach analysieren lässt (zum Beispiel während iterativem Refactoring), kommt das Ergebnis aus dem Cache, solange sich die Datei nicht geändert hat. In konkreten Messungen brachte das eine Beschleunigung um Faktor 11,7 (von 1,87ms auf 0,16ms für eine Testdatei).

Der Cache-Key basiert auf Dateipfad plus Änderungszeitpunkt. Mtime ist modification time. Ändert sich die Datei, ändert sich mtime, der Cache wird ungültig, eine neue Analyse startet. Das ist ein einfaches, aber robustes System. Der Cache hält maximal 100 Dateien. Bei größeren Projekten werden ältere Einträge automatisch entfernt (Least Recently Used).

Ressourcen-Verbrauch: Der Server benötigt circa 2 bis 20MB RAM. Der Verbrauch hängt ab von Cache-Füllstand und Analyse-Komplexität. Das ist bewusst sparsam gehalten, keine vollständigen ASTs im Speicher, nur Metadaten. Für die meisten Systeme ist das vernachlässigbar.

Security: Mehrschichtige Absicherung

Code-Analyse-Tools haben per Definition Zugriff auf Dein Dateisystem. Das ist ein Sicherheitsrisiko, wenn nicht sorgfältig implementiert. Der MCP PHP Server nutzt mehrere Security-Layer:

Zusätzlich: Die Whitelist deckt nur klassische Filesystem-Pfade ab. PHP Stream-Wrapper werden nicht unterstützt und müssen separat gefiltert werden, falls Du externe Pfad-Eingaben erlaubst. Stream-Wrapper sind etwa php://, data:// oder zlib://.

Was das Ganze bringt (und was es kostet)

Technisch gesehen: Der Server spart Dir manuelle Tool-Orchestrierung, hält Analyse-Ergebnisse im KI-Kontext, ermöglicht iterative Qualitäts-Verbesserung ohne Workflow-Unterbrechung. Er loggt nachvollziehbar, cached intelligent, arbeitet framework-agnostisch.

Menschlich gesehen: Du bekommst schnelleres Feedback zu Code-Qualität, ohne zwischen Tools zu springen. Das kann frustrierend sein, wenn man gerade im Flow ist und dann in drei verschiedene Terminals schauen muss. Hier bleibt man im Gespräch mit der KI.

Organisatorisch gesehen: Teams bekommen nachvollziehbare Audit-Trails, können Trends analysieren, haben einheitliche Qualitäts-Metriken über Projekte hinweg. Das hilft bei Code-Reviews, bei Compliance-Audits, bei der Priorisierung von Refactoring-Aufgaben.

Was es kostet: Setup-Aufwand (Python-Umgebung, Datenbank-Konfiguration, MCP-Integration), Learning Curve (Du musst verstehen, wo die Grenzen liegen), gelegentliche False Positives/Negatives (die Du manuell verifizieren musst). Und: Es ist kein Ersatz für spezialisierte Tools bei kritischen Analysen.

Ob sich das lohnt, hängt von Deinem Workflow ab. Wenn Du sowieso mit KI-Assistenten entwickelst und Code-Qualität im Blick behalten willst, ist es eine sinnvolle Ergänzung. Wenn Du hauptsächlich manuell arbeitest oder bereits gut eingespielte CI/CD-Pipelines mit den klassischen Tools hast, bringt es vielleicht weniger.

Alternative Ansätze und wo dieser Server sich positioniert

Vielleicht fragst Du Dich: "Könnte ich nicht einfach die klassischen Tools direkt nutzen?" Lass uns das durchgehen.

Direkte Tool-Integration (PHPStan, Psalm per Shell)

Du könntest die KI anweisen, phpstan analyze via Shell auszuführen und den Output zu interpretieren. Das funktioniert technisch. Aber: Der Output ist textuell, nicht strukturiert. Jedes Tool hat sein eigenes Format. Die KI muss parsieren, interpretieren, viel Kontext verbrauchen. Und zwischen verschiedenen Analyse-Typen gibt es keine Integration. Kein Audit-Trail für Analyse-Operationen. Jedes Projekt braucht manuelle Tool-Installation und Konfiguration. Token-Verbrauch ist höher durch verbose Output.

Der MCP-Ansatz löst das mit strukturierten JSON-Antworten, einheitlichem Format, automatischem Audit-Trail und zentraler Installation für alle Projekte.

SaaS Code-Analyse (SonarCloud, Codacy)

Du könntest Code zu einem externen Service hochladen, Analyse in der Cloud laufen lassen. Das funktioniert für CI/CD-Pipelines gut. Aber: Datenschutz-Problematik bei proprietärem Code. Netzwerk-Latenz bei jeder Analyse. Kosten pro analysierter Zeile/Datei. Keine Integration in lokale Entwicklungs-Workflows. Limitierte Anpassbarkeit der Analyse-Regeln.

Der MCP-Ansatz läuft komplett lokal, kein Code verlässt Dein System, keine Latenzen, keine Usage-based Costs, vollständige Anpassbarkeit.

IDE-integrierte Analyse (PHPStorm Inspections)

Du könntest die IDE-native Code-Analyse während Entwicklung nutzen. PHPStorm macht das sehr gut. Aber: Keine programmierbare Schnittstelle für AI-Integration. IDE-spezifisch, nicht portabel. Keine Batch-Verarbeitung größerer Codebases. Kein zentrales Audit-Logging. Manuelle Interpretation der Ergebnisse erforderlich.

Der MCP-Ansatz bietet eine programmierbare API, ist IDE-unabhängig, unterstützt Batch-Operationen, loggt zentral und liefert strukturierte Daten direkt an die KI.

Warum überhaupt MCP-Integration statt direkte Werkzeug-Aufrufe?

Weil direkte Werkzeug-Aufrufe per Shell zwar technisch funktionieren, aber drei kritische Probleme haben.

Erstens: Textueller, nicht strukturierter Output.

Wenn Du phpstan analyze via Shell ausführst, bekommst Du 50 bis 500 Zeilen Text zurück, unterschiedlich formatiert je nach Werkzeug. Tool ist englisch für Werkzeug. PHPStan gibt Fehler mit Datei:Zeile:Beschreibung aus, Psalm nutzt ein anderes Format, PHP-CS-Fixer wieder ein anderes.

Die KI muss diesen Text parsen, Zeilen-Nummern extrahieren, Fehler-Typen kategorisieren. Parsen bedeutet interpretieren. Das verbraucht Tokens und ist fehleranfällig. Jede Zeile Output wird ins KI-Kontext-Fenster geladen. Format-Änderungen bei Werkzeug-Updates brechen die Interpretation.

Mit MCP bekommst Du strukturiertes JSON zurück: {"file_path": "/var/www/...", "metrics": {...}, "security_issues": [...]}. Die KI kann direkt auf security_issues[0].severity zugreifen, ohne Text-Parsing.

Das spart circa 60 bis 75 Prozent Tokens (von 500 bis 2000 Tokens pro Datei-Analyse bei textuellem Output auf 200 bis 500 Tokens bei JSON).

Zweitens: Keine Integration zwischen verschiedenen Werkzeugen.

Wenn Du PHPStan für Static Analysis, RIPS für Security und PHP-CS-Fixer für Formatierung nutzt, bekommst Du drei separate Output-Formate, drei verschiedene Werkzeug-Aufrufe, keine gemeinsamen Metriken.

Mit MCP-Integration ruft die KI ein Werkzeug auf (php_analyze_file) und bekommt Metriken, Security-Findings, PSR-Compliance und Code-Struktur in einer Antwort, alles aufeinander abgestimmt, mit einheitlichen Schweregrad-Bewertungen. Severity-Levels sind low, medium, high und critical.

Drittens: Kein Audit-Trail.

Audit-Trail ist ein Prüfpfad zur nachvollziehbaren Protokollierung. Direkte Shell-Aufrufe hinterlassen keine strukturierten Logs.

Wer hat wann welche Datei analysiert? Wie lange hat die Analyse gedauert? War sie erfolgreich?

Mit MCP werden alle Operationen automatisch in einer Datenbank protokolliert (ki_protokoll.php_operations). Du kannst später nachvollziehen: "Welche Dateien wurden in den letzten 30 Tagen analysiert?" oder "Welche Analysen dauern am längsten?".

Das ist besonders wichtig in regulierten Umgebungen (ISO 27001, SOC 2), wo Audit-Trails gefordert werden.

Die Abwägung:

Trade-off bedeutet Kompromiss zwischen Alternativen. Setup-Aufwand ist Python-Umgebung, Datenbank-Konfiguration, MCP-Integration, circa 30 bis 60 Minuten einmalig. Langfristige Effizienz-Gewinne sind 60 bis 75 Prozent Token-Reduktion bei jedem Aufruf, strukturierte Logs, einheitliche Schnittstelle für alle Werkzeuge.

Wenn Du nur gelegentlich eine Datei analysierst, lohnt sich der Aufwand vielleicht nicht.

Wenn Du intensiv mit KI-Assistenten entwickelst und täglich dutzende Analysen durchführst, amortisiert sich der Setup-Aufwand nach circa 1 bis 2 Wochen durch eingesparte Kosten und Zeit.

Typische Einsatzszenarien (konkret)

KI-gestützte Code Reviews

Die KI analysiert Code mit php_analyze_file(), identifiziert Quality-Issues, schlägt Verbesserungen vor, validiert Fixes via erneute Analyse. Das schließt den Feedback-Loop ohne manuellen Tool-Wechsel. Besonders wertvoll, wenn Du schnelles Feedback brauchst und nicht jedes Mal PHPStan starten willst.

Legacy Code Refactoring

Batch-Analyse via php_analyze_directory(), Priorisierung nach Quality-Scores, iteratives Refactoring mit Trend-Tracking. Du siehst objektiv, welche Dateien am dringendsten Aufmerksamkeit brauchen. Die KI hilft Dir gezielt bei den problematischsten Stellen. Nach jedem Refactoring-Schritt siehst Du, ob sich die Metriken verbessert haben.

Security Audits (erste Iteration)

php_analyze_directory_security() scannt gesamte Codebases auf SQL Injection, XSS, File Inclusion Vulnerabilities. Das ist keine vollständige Security-Analyse (dafür brauchst Du RIPS oder SonarQube), aber ein guter erster Filter. Die Ergebnisse werden geloggt für Compliance-Dokumentation. Die KI kann Dir dann helfen, die Findings zu priorisieren und Fixes vorzuschlagen.

Pre-Commit Quality Gates

Git Hooks rufen MCP Server auf, blockieren Commits bei Quality-Score unterhalb Threshold. So wird Code-Qualität auf Prozess-Ebene durchgesetzt, nicht nur durch Reviews. Das ist besonders in Teams wichtig, wo unterschiedliche Erfahrungsniveaus zusammenarbeiten.

Was sagen die Zahlen?

In produktiven Deployments haben wir folgende Erfahrungswerte gesammelt:

Wichtig: Alle quantitativen Angaben basieren entweder auf dokumentierten Benchmarks (Performance-Messungen) oder Erfahrungswerten aus produktiven Deployments. Sie sind nicht als allgemeingültige Garantien zu verstehen, sondern zeigen, was unter bestimmten Bedingungen möglich ist.

Fazit

Diese MCP-Server-Implementierung adressiert spezifische Limitationen traditioneller PHP-Analyse-Tools im Kontext KI-gestützter Entwicklungs-Workflows. Die Kombination aus einheitlicher API, mehrschichtiger Security, Performance-Optimierung und nachvollziehbarem Audit-Trail macht sie für iterative Entwicklung mit KI-Assistenten gut geeignet.

Für regulierte Produktionsumgebungen mit höchsten Security- und Compliance-Anforderungen sind spezialisierte Tools (PHPStan, RIPS, SonarQube) weiterhin unverzichtbar. Aber für schnelles Prototyping, initiales Code-Feedback im KI-Dialog oder erste Refactoring-Iterationen ist das System sehr gut geeignet.

MCP als Protokoll ist noch vergleichsweise jung und nicht flächendeckend im Enterprise-Einsatz etabliert. Die Entwicklung schreitet aber voran, und es zeigt vielversprechende Ansätze für standardisierte KI-Tool-Integration. Ob sich das langfristig durchsetzt, wird die Zeit zeigen. Aktuell ist es eine praktikable Lösung für Teams, die bereits mit KI-Assistenten arbeiten und ihre Workflows optimieren wollen.

Installation

Der MCP PHP Server ist als Python-basierter Server implementiert und kann auf jedem System mit Python 3.9+ betrieben werden. Die Installation umfasst das Einrichten einer virtuellen Python-Umgebung, die Installation der Dependencies und die Konfiguration der Datenbankverbindung.

Worum geht es in diesem Kapitel?

Dieses Kapitel ist die praktische Anleitung, um den MCP PHP Server auf Deinem System zum Laufen zu bringen. Du lernst, welche Voraussetzungen erfüllt sein müssen (Python 3.9-plus, circa 512 MB Arbeitsspeicher), welche Installations-Methode für Deinen Einsatzzweck passt (dauerhafter Server-Betrieb versus experimentelles Ausprobieren), und wie Du die Installation verifizierst, sodass Du weißt, dass alles funktioniert. Anders als theoretische Kapitel, die erklären wie etwas funktioniert, ist dies eine Schritt-für-Schritt-Anleitung zum Aufsetzen des Systems – vergleichbar mit der Aufbauanleitung für einen Schreibtisch: zuerst die Grundplatte verschrauben, dann die Beine montieren, dann prüfen ob er wackelt. Du kommst hierher zurück, wenn Du den Server auf einer neuen Maschine installieren oder ein Update durchführen möchtest.

Vielleicht fragst Du Dich: Warum Python und nicht PHP selbst für einen PHP-Analyse-Server? Die Antwort liegt in der verfügbaren Infrastruktur. Python bietet mit FastMCP ein ausgereiftes Framework für MCP-Server, das die gesamte Protocol-Komplexität abnimmt. Du könntest natürlich einen MCP-Server in PHP schreiben, aber dann müsstest Du das Protocol selbst implementieren, Async-Handling von Grund auf bauen und Tool-Registration manuell managen. Mit FastMCP ist die Basis-Implementation in circa 40 Zeilen Code erledigt, sodass Du Dich auf die eigentliche Analyse-Logik konzentrieren kannst. Das ist Pragmatismus über Dogmatismus.

Systemvoraussetzungen

Die Anforderungen sind bewusst niedrig gehalten, damit das System auch auf schwächeren Maschinen laufen kann, die Du vielleicht als Entwicklungsserver nutzt. 512 MB RAM reichen aus, weil die Analysen relativ leichtgewichtig sind und keine aufwendigen AST-Parsing-Operationen durchführen. Wenn Du den Cache nutzen möchtest, solltest Du 1 GB einplanen. Der Cache hält bis zu 100 Dateien im Speicher, was bei durchschnittlich 50 KB pro Datei circa 5 MB zusätzlichen Speicherbedarf plus Overhead bedeutet.

Minimale Anforderungen

Optionale Komponenten

Warum nur 512 MB Arbeitsspeicher (RAM) als minimale Anforderung – kann das für realistische Code-Analysen ausreichen?

Weil der MCP PHP Server bewusst auf Speicher-Effizienz optimiert wurde durch drei Architektur-Entscheidungen:

Erstens werden Dateien nicht komplett in den Speicher geladen, sondern Zeile-für-Zeile verarbeitet. Streaming parsing ist fließende Verarbeitung ohne Komplett-Laden.

Eine 5 MB PHP-Datei (die maximale erlaubte Dateigröße) belegt während der Analyse nur circa 200 bis 300 KB Speicher, weil immer nur die aktuelle Zeile plus ein kleiner Kontext-Puffer im RAM liegt.

Zweitens nutzt der Server keinen vollständigen Abstract-Syntax-Tree, sondern Regex-basierte Muster-Erkennung. AST ist ein vollständiges Baum-Modell des Code-Aufbaus im Speicher.

Ein AST für eine 1000-Zeilen-Datei würde circa 5 bis 10 MB Speicher benötigen (jedes Code-Element wird als Objekt mit Metadaten gespeichert).

Regex-Matching braucht nur die aktuelle Zeile (circa 100 bis 200 Bytes) plus kompilierte Muster. Pattern sind einmalig circa 50 KB für alle Muster zusammen.

Drittens ist der LRU-Zwischen-Speicher mit maximal 100 Dateien begrenzt. Cache ist Least Recently Used, also zuletzt genutzte Dateien.

Bei durchschnittlich 50 KB pro gespeicherter Datei sind das 5 MB Zwischen-Speicher, nicht 500 MB.

Die Abwägung:

Du verlierst Präzisions-Tiefe verglichen mit vollständiger AST-Analyse.

Manche komplexe Code-Strukturen können nicht perfekt erkannt werden, etwa verschachtelte anonyme Funktionen in Closures. Closures sind abgeschlossene Funktions-Kontexte mit variadischen Parametern.

Regex-basierte Erkennung kann Falsch-Positive oder Falsch-Negative produzieren. False Positives bedeutet, es meldet ein Problem, wo keines ist. False Negatives bedeutet, es übersieht ein echtes Problem.

Eine andere Möglichkeit wäre gewesen, PHP Parser Extensions wie php-parser (nikic/PHP-Parser) zu nutzen, die vollständige AST-Analysen ermöglichen.

Das hätte perfekte Präzision gebracht – Du könntest exakt unterscheiden ob $this->method() in einem statischen versus Instanz-Kontext steht.

Aber es schafft drei neue Probleme:

Erstens steigt der Speicher-Bedarf auf 2 bis 4 GB RAM für normale Analyse-Workloads (100 Dateien parallel gecacht mit ASTs).

Zweitens wird die Analyse 5-fach bis 10-fach langsamer (AST-Parsing dauert 100 bis 500 Millisekunden pro Datei statt 20 bis 50 Millisekunden für Regex).

Drittens entsteht eine Abhängigkeit von PHP selbst – der Server müsste PHP installiert haben, was die Bereitstellungs-Komplexität erhöht. Deployment bedeutet, Du brauchst Python UND PHP auf dem System.

Kurzfristig erscheint vollständige AST-Analyse attraktiv – "Ich will perfekte Erkennung!"

Langfristig gewinnst Du Einsetzbarkeit (läuft auf schwachen Systemen), Performance (20 bis 50 Millisekunden statt 100 bis 500 Millisekunden) und Einfachheit (nur Python, keine PHP-Installation nötig).

Für die überwiegende Mehrheit der Anwendungsfälle (circa 90 Prozent) reicht Regex-basierte Analyse völlig aus – die meisten Quality-Probleme (fehlende Dokumentation, zu hohe Cyclomatic Complexity, Code-Duplikation) sind auf Zeilen-Ebene erkennbar ohne vollständige semantische Analyse.

Installationsmethoden

Es gibt zwei empfohlene Installationsmethoden:

Welche Methode solltest Du wählen? Wenn Du das System dauerhaft nutzen möchtest und einen stabilen Betrieb brauchst, ist das Production Setup mit systemd Service die richtige Wahl. Wenn Du hingegen nur experimentieren oder am Code selbst arbeiten möchtest, bietet sich das Development Setup in einem lokalen Verzeichnis an. Der Hauptunterschied liegt im Startverhalten: Das Production-Setup läuft automatisch nach jedem Server-Reboot neu an, während Du beim Development-Setup den Server manuell starten musst. Technisch funktionieren beide Varianten identisch.

Methode 1: Production Setup (empfohlen für Server)

Diese Methode richtet den Server in einer standardisierten Verzeichnisstruktur ein:

# 1. Verzeichnisstruktur erstellen
sudo mkdir -p /var/www/mcp/php
cd /var/www/mcp/php

# 2. Server-Dateien bereitstellen
# Dateien via Download bereitstellen und entpacken
# Verzeichnisstruktur sollte enthalten:
# - server.py, lib/, modules/, analyzers/, config/, tests/

# 3. Virtual Environment erstellen
python3 -m venv venv

# 4. Dependencies installieren
venv/bin/pip install --upgrade pip
venv/bin/pip install -r requirements.txt

# 5. Konfiguration anpassen
# config/config.json editieren (siehe Konfiguration-Abschnitt)
nano config/config.json

# 6. Permissions setzen
sudo chown -R www-data:www-data /var/www/mcp/php
sudo chmod -R 755 /var/www/mcp/php
sudo chmod 750 /var/www/mcp/php/logs  # Log-Verzeichnis restriktiver
sudo chmod 600 /var/www/mcp/php/config/config.json  # Config nur lesbar für Owner

Dependencies (requirements.txt)

Der Server benötigt folgende Python-Packages:

Methode 2: Development Setup (für lokale Entwicklung)

Für Entwicklung und Testing kann der Server in einem beliebigen Verzeichnis installiert werden:

# 1. Server-Dateien in lokales Verzeichnis bereitstellen
cd ~/projects
mkdir mcp-php-server
cd mcp-php-server
# Dateien via Download bereitstellen und entpacken

# 2. Virtual Environment erstellen
python3 -m venv venv

# 3. Dependencies installieren
source venv/bin/activate  # Linux/macOS
# oder: venv\Scripts\activate  # Windows
pip install --upgrade pip
pip install -r requirements.txt

# 4. Development-Konfiguration erstellen
cp config/config.example.json config/config.json
# config.json editieren: Pfade anpassen

# 5. Tests ausführen (optional)
pytest tests/unit/ -v

Datenbank-Setup (optional)

Für vollständiges Audit-Logging wird eine MariaDB/MySQL-Datenbank benötigt. Dieser Schritt ist optional - der Server funktioniert auch ohne Datenbank (Logging dann nur in Dateien).

Die Frage ist: Brauchst Du das Datenbank-Logging wirklich? Das hängt von Deinem Einsatzszenario ab. Wenn Du alleine entwickelst und nur gelegentlich Analysen durchführst, reichen die Datei-Logs in den meisten Fällen völlig aus. Wenn Du hingegen im Team arbeitest, Trend-Analysen über längere Zeiträume machen möchtest oder Compliance-Anforderungen mit nachweisbaren Audit-Trails erfüllen musst, solltest Du die Datenbank-Variante wählen. Der Performance-Overhead ist minimal (ein einzelnes INSERT pro Analyse), aber Du bekommst dafür strukturierte Logs, die Du mit SQL-Queries abfragen kannst. Statt durch Textdateien zu greppen, kannst Du einfach fragen: "Zeig mir alle Analysen der letzten Woche, die Fehler produziert haben."

Warum doppeltes Logging (Datei UND Datenbank) statt eine zentrale Lösung – ist das nicht redundant?

Weil Datei-Logging und Datenbank-Logging fundamental unterschiedliche Stärken haben und sich gegenseitig ergänzen statt doppeln.

Datei-Logs (/var/www/mcp/php/logs/php_mcp.log) sind unschlagbar für Echtzeit-Debugging: Du kannst tail -f logs/php_mcp.log laufen lassen und siehst sofort jede Operation mit vollständigem Kontext (Stack-Traces, Request-Parameter, Environment-Variablen).

Wenn der Server abstürzt, sind die letzten Zeilen im Datei-Log oft die einzige Informations-Quelle, weil Datenbank-Transaktionen möglicherweise nicht mehr committed wurden.

Datenbank-Logs (Tabelle ki_protokoll.php_operations) hingegen sind unschlagbar für strukturierte Analysen: Du kannst SQL-Queries nutzen wie "Zeige durchschnittliche Ausführungszeit pro Werkzeug gruppiert nach Woche" oder "Finde alle Dateien, die in den letzten 30 Tagen mehr als 3-mal analysiert wurden mit Fehler-Ergebnissen".

Das ist mit Datei-Logs praktisch unmöglich – Du müsstest Gigabytes an Textdateien parsen und manuell aggregieren.

Warum nicht nur Datenbank-Logging?

Weil die Datenbank selbst ausfallen kann (Verbindungs-Timeout, Credentials-Fehler, Speicher voll).

Wenn das Datenbank-Logging fehlschlägt, greift Silent-Fail-Verhalten (siehe Kapitel 11: Audit & Logging) – die Operation läuft trotzdem durch, aber Du hättest keine Spur davon ohne Datei-Logs.

Warum nicht nur Datei-Logging?

Weil Log-Dateien nach 30 Tagen automatisch rotiert werden (gelöscht oder komprimiert), während Datenbank-Einträge dauerhaft bleiben.

Für Compliance-Nachweise (etwa ISO 27001 Audit-Trails) brauchst Du Logs über Jahre hinweg – Datei-Logs würden Terabytes an Speicher belegen.

# 1. Datenbank und Tabelle erstellen
mysql -u root -p

CREATE DATABASE IF NOT EXISTS ki_protokoll;
USE ki_protokoll;

CREATE TABLE IF NOT EXISTS php_operations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    operation VARCHAR(100) NOT NULL,
    file_path TEXT,
    user_context VARCHAR(255),
    execution_time FLOAT,
    success BOOLEAN,
    error_message TEXT,
    parameters JSON,
    result_summary TEXT,
    INDEX idx_timestamp (timestamp),
    INDEX idx_operation (operation),
    INDEX idx_success (success)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

# 2. User für MCP Server erstellen
CREATE USER IF NOT EXISTS 'mcp_db_crud'@'localhost' IDENTIFIED BY 'SICHERES_PASSWORT';
GRANT INSERT, SELECT ON ki_protokoll.php_operations TO 'mcp_db_crud'@'localhost';
FLUSH PRIVILEGES;

# 3. Credentials-Datei erstellen
# Sicherer Speicherort außerhalb von /var/www:
# sudo mkdir -p /etc/mcp
# sudo nano /etc/mcp/credentials.json
{
    "database_users": {
        "mcp_db_crud": {
            "password": "SICHERES_PASSWORT"
        }
    }
}

# Permissions setzen:
# sudo chmod 600 /etc/mcp/credentials.json
# sudo chown www-data:www-data /etc/mcp/credentials.json

Security Note: Credentials

Die Credentials-Datei enthält sensitive Daten und sollte entsprechend geschützt werden:

Diese Vorsichtsmaßnahmen mögen auf den ersten Blick paranoid wirken, aber Credentials-Management ist tatsächlich einer der häufigsten Angriffsvektoren in der Praxis. Die Empfehlung, Credentials nicht unter /var/www zu speichern, hat einen konkreten Grund: Viele Webserver haben Fehlkonfigurationen, die dazu führen können, dass JSON-Dateien direkt ausgeliefert werden. Die Berechtigung chmod 600 stellt sicher, dass ausschließlich der Owner die Datei lesen kann, nicht einmal die Gruppe hat Zugriff. Die Empfehlung von mindestens 20 Zeichen Passwortlänge basiert darauf, dass kürzere Passwörter mit moderner Hardware in vertretbarer Zeit bruteforcebar sind. Das sind keine theoretischen Risiken, sondern praktische Lessons-Learned aus tatsächlichen Security-Breaches.

Konfiguration

Die Hauptkonfiguration erfolgt über config/config.json. Hier ein minimales Beispiel:

Die Entscheidung für JSON statt YAML oder TOML hat praktische Gründe: Python und JSON arbeiten nativ zusammen, sodass kein externer Parser benötigt wird. Dazu kommt, dass JSON von praktisch jedem Tool und jeder Programmiersprache gelesen werden kann. Falls Du das System später über eine API konfigurieren möchtest, brauchst Du keinen zusätzlichen YAML-Parser im Frontend zu integrieren. Auch hier gilt: Einfachheit über zusätzliche Features.

{
    "server": {
        "name": "PHP Code Analysis Tools",
        "version": "2.0.0",
        "host": "localhost",
        "port": 11434
    },
    "security": {
        "allowed_directories": ["/var/www"],
        "max_file_size_mb": 5,
        "rate_limit_requests": 100,
        "rate_limit_window_seconds": 60
    },
    "cache": {
        "enabled": true,
        "max_size": 100
    },
    "logging": {
        "file_logging": true,
        "db_logging": true,
        "log_directory": "/var/www/mcp/php/logs",
        "log_level": "INFO"
    },
    "database": {
        "enabled": true,
        "credentials_file": "/etc/mcp/credentials.json",
        "database_name": "ki_protokoll",
        "table_name": "php_operations"
    }
}

Wichtige Konfigurationsparameter

Server-Start

Nach erfolgreicher Installation und Konfiguration kann der Server gestartet werden:

# Production (als Hintergrund-Prozess)
cd /var/www/mcp/php
mkdir -p logs
nohup venv/bin/python3 server.py &

# Development (mit Console-Output)
cd /var/www/mcp/php
venv/bin/python3 server.py

# Mit Logs in Datei
cd /var/www/mcp/php
mkdir -p logs
venv/bin/python3 server.py >> logs/server.log 2>&1 &

# Server-Status prüfen
ps aux | grep server.py

# Server stoppen
pkill -f "php/server.py"

Erwartete Startup-Ausgabe

PHP MCP Server (Slim) initialized successfully
20 tools available (merged from 86)
~35k tokens saved
Server ready for connections

Verifikation der Installation

Nach dem Server-Start sollten folgende Checks durchgeführt werden:

Die Verifikation der Installation ist kein optionaler Schritt. Viele Installation-Guides enden mit der Anweisung "starte den Server und hoffe das Beste", was keine professionelle Herangehensweise ist. Du solltest systematisch prüfen, dass jede Komponente ordnungsgemäß funktioniert, bevor Du produktiv mit dem System arbeitest. Andernfalls wirst Du später Zeit damit verschwenden, mysteriöse Fehler zu debuggen, die in Wahrheit auf Installations-Probleme zurückzuführen sind. Die vier Checks, die Du gleich siehst, decken die kritischen Pfade ab: Der Prozess läuft, das Logging funktioniert, die Datenbank ist erreichbar, und die Analyse liefert tatsächlich Ergebnisse.

# 1. Server-Prozess läuft
ps aux | grep server.py
# Erwartung: Ein Python-Prozess mit server.py

# 2. Logs prüfen
tail -f /var/www/mcp/php/logs/php_mcp.log
# Erwartung: Keine ERROR-Meldungen

# 3. Datenbank-Verbindung testen (falls aktiviert)
# Via MCP Datenbank Server:
mcp__datenbank__db_query \
    database="ki_protokoll" \
    query="SELECT COUNT(*) FROM php_operations" \
    user_type="mcp_db_crud"

# 4. Test-Datei analysieren
# Erstelle Test-Datei mit printf:
printf '<?php\nclass TestClass {\n    public function testMethod() {\n        return "Hello MCP";\n    }\n}\n' > /tmp/test.php

# Analysiere via MCP Tool (im KI-Assistenten):
# mcp__php__php_analyze_file /tmp/test.php

Erfolgreiche Installation

Die Installation ist erfolgreich, wenn:

Systemd Service (Production)

Für Production-Umgebungen empfiehlt sich ein systemd Service für automatischen Start:

Systemd hat zwar bei manchen Leuten einen schlechten Ruf, aber für diese Art von Service-Management ist es tatsächlich sehr gut geeignet: Es bietet automatischen Start nach einem Server-Reboot, automatischen Restart bei Crashes, integriertes Logging über journald und die Möglichkeit, Resource-Limits zu definieren. Die Alternative wäre ein cronjob mit @reboot oder ein klassisches Init-Script, aber das bedeutet mehr Implementierungsaufwand für deutlich weniger Features. Es ist in den meisten Fällen sinnvoller, existierende, bewährte Tools zu nutzen, statt eigene Lösungen zu bauen.

Warum Systemd Service statt Cron @reboot – ist ein Cronjob nicht einfacher?

Weil Systemd vier kritische Funktionen (Features) bietet, die Cron @reboot nicht hat:

Erstens automatischer Neustart bei Prozess-Abstürzen (Restart=always).

Wenn der MCP-Server durch einen unbehandelten Fehler abstürzt, startet Systemd ihn automatisch nach 10 Sekunden neu (RestartSec=10). Out-of-Memory bedeutet Speicher erschöpft. Python-Exception ist ein Ausnahme-Fehler in Analyse-Code. Mögliche Ursachen sind etwa Out-of-Memory, Netzwerk-Timeout zur Datenbank oder Python-Exception.

Mit Cron @reboot musst Du manuell eingreifen oder einen Wrapper-Script schreiben, der in einer Endlos-Schleife läuft und den Prozess überwacht – das sind mindestens 50 Zeilen Bash-Code mit Signal-Handling und Aufräum-Logik. Cleanup ist die Aufräum-Logik.

Zweitens Abhängigkeits-Verwaltung. Dependency-Management bedeutet After=network.target mariadb.service.

Systemd startet den MCP-Server erst, wenn Netzwerk und Datenbank verfügbar sind.

Bei Cron @reboot hast Du ein Wettlauf-Problem. Race-Condition bedeutet: Der Cronjob läuft beim Reboot sofort an, aber MariaDB braucht vielleicht noch 3 bis 5 Sekunden zum Starten.

Ergebnis: MCP-Server startet, versucht sich mit Datenbank zu verbinden, scheitert, gibt auf.

Du müsstest im Cronjob ein sleep 10 einbauen oder manuell auf Datenbank-Verfügbarkeit warten. Das erfordert komplexe Wiederholungs-Logik, also Retry-Logik.

Drittens integriertes Logging (StandardOutput/StandardError nach journald).

Systemd loggt automatisch alle Ausgaben mit Zeitstempeln und Schweregrad und Metadaten. Timestamps sind Zeitstempel. Severity level ist die Fehler-Stufe.

Du kannst jederzeit journalctl -u mcp-php-server aufrufen und siehst die komplette Historie inklusive Start-Fehlschlägen, Warnungen und Fehlern.

Bei Cron musst Du manuell in Log-Dateien umleiten (scriptname >> /var/log/custom.log 2>&1) und Log-Rotation selbst implementieren. Log-Rotation ist automatisches Archivieren alter Logs, etwa logrotate konfigurieren. Sonst wachsen Logs unbegrenzt.

Viertens Ressourcen-Grenzen. Resource-Limits sind LimitNOFILE, MemoryLimit, CPUQuota.

Systemd erlaubt, dem Service harte Grenzen zu setzen: "Maximal 1 GB RAM, maximal 50 Prozent einer CPU-Kerne, maximal 1024 offene Dateien gleichzeitig".

Das schützt vor Ressourcen-Erschöpfung, falls der Server durch einen Bug unbegrenzt Speicher alloziert oder zu viele Dateien öffnet.

Bei Cron gibt es diese Limitierungen nicht – der Prozess könnte theoretisch das gesamte System lahmlegen.

Die Abwägung:

Du verlierst Einfachheit – Systemd-Service-Dateien haben eine eigene Syntax, Fehlersuche von Service-Problemen ist komplexer als ein einfacher Bash-Befehl. Debugging ist die Fehlersuche.

Eine andere Möglichkeit wäre ein Supervisor-Tool wie supervisord oder PM2 gewesen.

Das hätte ähnliche Funktionen gebracht (Auto-Restart, Dependency-Management, Logging).

Aber es schafft eine zusätzliche Abhängigkeit – Du musst supervisord installieren, konfigurieren, selbst als Service starten (Henne-Ei-Problem: wer startet den Supervisor beim Reboot?).

Systemd ist auf allen modernen Linux-Distributionen bereits vorhanden, keine zusätzliche Installation nötig.

Kurzfristig erscheint Cron @reboot einfacher – "Einfach @reboot /pfad/zu/server.py in crontab eintragen, fertig!"

Langfristig gewinnst Du Robustheit (automatischer Neustart bei Crashes), Zuverlässigkeit (Abhängigkeits-Verwaltung verhindert Wettlauf-Probleme), Beobachtbarkeit und Sicherheit (Ressourcen-Grenzen schützen vor Ressourcen-Erschöpfung). Observability ist integriertes Logging ohne manuelle Konfiguration.

In 99 Prozent der Production-Umgebungen ist Systemd die richtige Wahl – Cron @reboot ist nur für Wegwerf-Experimente oder persönliche Entwicklungs-Setups akzeptabel, nicht für Systeme, die zuverlässig laufen müssen.

# 1. Service-Datei erstellen
sudo nano /etc/systemd/system/mcp-php-server.service

# 2. Service-Konfiguration
[Unit]
Description=MCP PHP Server - Code Analysis Tools
After=network.target mariadb.service

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/mcp/php
ExecStart=/var/www/mcp/php/venv/bin/python3 /var/www/mcp/php/server.py
Restart=always
RestartSec=10
StandardOutput=append:/var/www/mcp/php/logs/server.log
StandardError=append:/var/www/mcp/php/logs/server-error.log

Environment="PYTHONUNBUFFERED=1"
Environment="HOME=/var/www/mcp/php"

[Install]
WantedBy=multi-user.target

# 3. Service aktivieren und starten
sudo systemctl daemon-reload
sudo systemctl enable mcp-php-server
sudo systemctl start mcp-php-server

# 4. Status prüfen
sudo systemctl status mcp-php-server

# 5. Logs verfolgen
sudo journalctl -u mcp-php-server -f

Häufige Installationsprobleme

Im Folgenden findest Du die drei häufigsten Installationsprobleme mit ihren Ursachen und Lösungen. Diese Liste ist nicht vollständig, deckt aber vermutlich circa 80 Prozent der typischen Installations-Fehler ab. Falls Du ein anderes Problem hast, solltest Du in die Logs schauen (logs/php_mcp.log und journalctl -u mcp-php-server), dort steht in den meisten Fällen genau beschrieben, was schiefgelaufen ist.

Problem: ModuleNotFoundError: No module named 'fastmcp'

Ursache: Dependencies nicht installiert oder falsche Python-Umgebung

Lösung:

cd /var/www/mcp/php
venv/bin/pip install --upgrade pip
venv/bin/pip install -r requirements.txt
# Server mit venv/bin/python3 starten (nicht system python3!)

Problem: Database Connection Failed

Ursache: Credentials falsch oder Datenbank nicht erreichbar

Lösung:

# 1. Credentials prüfen
sudo cat /etc/mcp/credentials.json

# 2. Datenbankverbindung testen
mysql -u mcp_db_crud -p ki_protokoll

# 3. Falls DB-Logging optional: In config.json deaktivieren
"database": { "enabled": false }

Problem: Permission Denied beim Server-Start

Ursache: Falsche Dateirechte

Lösung:

sudo chown -R www-data:www-data /var/www/mcp/php
sudo chmod -R 755 /var/www/mcp/php
sudo chmod 644 /var/www/mcp/php/config/config.json

Updates

Updates werden durch Bereitstellen neuer Dateien und Aktualisierung der Dependencies durchgeführt:

Updates sind immer mit einem gewissen Risiko verbunden, weswegen das Backup an erster Stelle steht und nicht als optionale Randnotiz behandelt werden sollte. Du solltest sowohl das komplette Verzeichnis als auch separat die Config-Dateien sichern, weil neue Versionen möglicherweise andere Konfigurations-Strukturen erwarten. Nach dem Update ist es wichtig, die Tests durchlaufen zu lassen, um Regressionen frühzeitig zu erkennen. Falls dabei etwas schiefgeht, kannst Du das Backup entpacken und bist innerhalb von circa 30 Sekunden wieder im funktionsfähigen Zustand. Das bedeutet: kein Stress, kein Datenverlust.

# Update-Prozess
cd /var/www/mcp/php

# 1. Server stoppen
sudo systemctl stop mcp-php-server

# 2. Backup erstellen
tar -czf ~/mcp-php-backup-$(date +%Y%m%d).tar.gz .

# 3. Config-Dateien sichern
cp config/config.json ~/config.json.backup
cp /etc/mcp/credentials.json ~/credentials.json.backup

# 4. Neue Dateien bereitstellen
# Neue Server-Dateien via Download bereitstellen
# Alte Dateien überschreiben (außer config/)

# 5. Config-Dateien wiederherstellen
cp ~/config.json.backup config/config.json
sudo cp ~/credentials.json.backup /etc/mcp/credentials.json
sudo chmod 600 /etc/mcp/credentials.json
sudo chown www-data:www-data /etc/mcp/credentials.json

# 6. Dependencies aktualisieren
venv/bin/pip install -r requirements.txt --upgrade

# 7. Server starten
sudo systemctl start mcp-php-server

# 8. Status prüfen
sudo systemctl status mcp-php-server
tail -f logs/php_mcp.log

Update-Checklist

---