← Zum Blog
Blog

GEO- und Crew-Hooks: wenn Claude Code nach jedem Edit selbst auditiert

Zwei mcp_tool Hooks für mcp-geo und mcp-crew. Stop feuert geo_check nach Markdown-Edits, SessionStart aktiviert die Default-Persona pro Projekt. Zahlen aus zwei Wochen Realbetrieb plus die zwei Stellen an denen ich mir ins Knie geschossen hab.

22. Mai 2026
Zwei Wochen ist es her dass ich CRM-Hooks aufgesetzt hab, davor Memory-Hooks, davor der Erklaer-Post zum `mcp_tool` Hook-Type. Jetzt sind die beiden anderen hauseigenen MCP-Server dran. `mcp-geo`, unser AI-Citation-Auditor. Und `mcp-crew`, der Persona-Router der für jedes Projekt das passende System-Prompt-Setup zieht. Beides sind keine offensichtlichen Hook-Kandidaten. Im Gegensatz zu Memory (das willst du staendig automatisch fuettern) und CRM (das willst du bei jedem Kunden-Touchpoint automatisch ziehen) sind GEO und Crew eher Werkzeuge die du explizit aufrufst. Habe ich auch lange so gehalten. Bis ich gemerkt hab dass genau dieser explizite Aufruf der Engpass ist. Du vergisst ihn. Oder du laesst ihn lieber sein weil es gerade nicht passt. Und damit verlierst du genau die kontinuierliche Disziplin die einen Hook überhaupt sinnvoll macht. ## Hook eins, Stop mit Edit-Matcher auf geo_check Setup: ich editiere ein MDX-File irgendwo im Academy-Content-Tree. Sobald die Session den `Stop`-State erreicht (also der Turn ist abgeschlossen), pruefe ich ob in diesem Turn ein `Edit`, `Write` oder `MultiEdit` auf einem MDX-File gelaufen ist. Wenn ja, feuert `mcp_tool` mit `server: mcp-geo`, `tool: geo_check`, und uebergibt den File-Pfad. `geo_check` macht dann das was ich vorher manuell aufrief. Headline-Density pruefen, FAQ-Block vorhanden, Citation-Score gegen die letzten Bing- und ChatGPT-Crawl-Logs, und der Pfad rein in unser Score-Dashboard. Latenz median 4.1 Sekunden, weil das Tool intern noch externe APIs anstoesst. Das ist OK weil es asynchron zur Session laeuft, ich sehe die Audit-Score-Diff in der Statusline auftauchen waehrend ich schon den naechsten Prompt tippe. In 14 Tagen haben wir 47 Lesson- und Playbook-Edits durchgezogen. Bei 43 lief der Hook sauber durch. Vier Mal hat der Stop-Hook das Edit nicht gesehen weil das Tool ein `MultiEdit` war, und mein Matcher war initial `Edit|Write` ohne `MultiEdit`. Klassisch. Hab den Matcher auf `Edit|Write|MultiEdit` erweitert, jetzt sind es null Misses. Was sich an meiner Praxis ändert: ich pflege keine Audit-Routine mehr. Frueher hatte ich einen `/audit-lesson` Slash-Command, den ich mal jeden zweiten Tag laufen liess. Mal vergessen, mal zu spaet. Jetzt habe ich pro Lesson-Edit innerhalb von 5 Sekunden einen Score und sehe sofort wenn ich was kaputt gemacht hab. Drei Lessons hab ich in den 14 Tagen rueckgaengig gemacht weil der Score eingebrochen ist, das waeren sonst stille Drift gewesen. Wichtig: der Hook gibt nur Signal, er blockiert nichts. Wenn `geo_check` einen schlechten Score zurueckgibt erscheint der in der Statusline, aber Claude Code laeuft weiter und der Edit bleibt. Ich wollte keinen Hard-Gate weil 60 Prozent der "schlechten" Scores legitime In-Progress-Zustaende sind die ich gleich noch fertigstelle. Ein Reminder reicht, ein Block waere Friction-Overkill. ## Hook zwei, SessionStart mit crew_activate Der zweite Hook ist trivialer aber strategisch wichtig. `SessionStart`, `mcp_tool` auf `mcp-crew`, Tool ist `crew_activate`, Argument ist `cwd: $CLAUDE_CWD`. Was crew_activate macht: es schaut welches Projekt in dem Working-Directory liegt, holt die passende Persona aus dem Crew-Registry, und injiziert das System-Prompt-Setup als `additionalContext`. Starte ich Claude Code im Academy-Repo, kriege ich den Academy-Content-Verantwortlichen mit Audit-Pflicht und Tonalitaets-Doku. Starte ich im StudioMeyer-Repo, kommt der SM-Operator mit Stripe- und Brevo-Kontext. Starte ich im nex-hq-Repo, kommt der Memory-Architekt mit Postgres-Pfaden und Container-Mapping. Vor dem Hook hatte ich das über meinen globalen `CLAUDE.md` Setup geloest, da stand für alles was hilfreich war drin. Hat funktioniert solange ich vier Projekte hatte. Bei mittlerweile 42 Projekten ist das nicht mehr tragfaehig, der Default-Prompt war ein 18-Kilobyte-Monster und 90 Prozent davon irrelevant für den aktuellen Cwd. Jetzt sind es median 2.3 Kilobyte System-Prompt pro Session, perfekt auf das Projekt zugeschnitten. Session-Start-Latenz ist um 180 Millisekunden gestiegen, das ist der Tool-Call selbst plus das Lesen des Registry-Eintrags. Merke ich kaum. Was ich sehr wohl merke: weniger Drift in den Antworten, weniger "kannst du bitte den Kontext beachten" Korrekturen meinerseits. ## Wo ich mir ins Knie geschossen hab Failure eins, Tag fuenf. Mein Stop-Hook feuerte auch bei reinen Test-Edits, also Files in `/tmp` oder in `node_modules`. Geo-Check brauchte 4 Sekunden pro Call und ich hatte ploetzlich 20 Calls pro Session in Tests die nie ein echtes Lesson-File anfassten. Bug war dass mein Matcher nur auf File-Extension matchte, nicht auf Pfad. Habe einen zweiten Check eingebaut: nur wenn der Pfad `content/` oder `playbooks/` als Segment enthaelt. Seit dem null falsche Trigger. Failure zwei, Tag zwoelf. crew_activate hat eine Zeit lang die falsche Persona gezogen weil ich im Crew-Registry zwei Projekte mit aehnlichem Pfad-Praefix hatte und das Matching der ersten zugriff. Resultat: ich hab eine Stunde im Academy-Repo editiert mit dem SM-Operator-Prompt aktiv, und mich gewundert warum der Output staendig in Marketing-Sprech kippte. Path-Matching auf exakt umgestellt, jetzt stabil. Nebenbei: das Crew-Registry ist jetzt sortiert nach Pfad-Tiefe absteigend, damit spezifische Pfade vor generischen matchen. Failure drei, eher ein Beinahe-Unfall. An Tag neun hatte ich kurz ueberlegt den Stop-Hook so umzubauen dass er Edits auch direkt committed wenn der Score ok ist. Hab ich gelassen. Auto-Commits aus einem Hook heraus sind die Sorte Bequemlichkeit die dich irgendwann den falschen Branch in Production schiebt. Bleibt manuell. ## Was als naechstes Wenn dich die Hooks-Sache interessiert, hier die Pfade durch unsere Inhalte: Lesson L4-10 [mcp-tool-hooks](/levels/4/mcp-tool-hooks) erklaert das Pattern strukturell, der Playbook [hooks-gegen-halluzinationen](/playbooks/hooks-gegen-halluzinationen) zeigt die defensive Variante mit Pre-Tool-Verifikation. Die offizielle Hook-Referenz von Anthropic findest du auf https://code.claude.com/docs/en/hooks, da sind alle Event-Typen plus die `mcp_tool` Field-Liste dokumentiert. Naechster Post in der Serie ist der Meta-Post: warum direkte `mcp_tool` Hooks die Bash-Wrapper-Ära beenden. Wenn du dich gefragt hast warum wir die letzten Jahre alle mit `bash -c 'curl ... | jq ...'` Hooks gearbeitet haben und das jetzt nicht mehr brauchen, kommt das demnaechst.
← Weitere Blog-Posts