← Zum Blog
Blog

Hook-Recipes fuer MCP-CRM: Wenn jeder Edit automatisch im CRM landet

Zwei mcp_tool-Hooks die mein CRM fuettern, ohne dass ich dran denke. Plus die eine Stelle wo ich mir selbst ins Knie geschossen hab.

16. Juni 2026
Mein CRM war genau dann leer, wenn ich es am dringendsten gebraucht hab. Kunde ruft an, fragt was wir letzte Woche besprochen hatten, und ich klick mich durch Git-History weil ich vergessen hatte den Call zu loggen. Das Problem war nie das CRM. Das Problem war ich, der das manuelle Eintragen vergisst. Seit Claude Code v2.1.118 (rausgekommen am 23. April 2026) gibt es einen Hook-Typ der das loest: `type: "mcp_tool"`. Statt ein Bash-Script zu wrappen das dann irgendein MCP-Tool aufruft, feuert der Hook das Tool direkt. Ich hab zwei davon scharf gestellt die mein mcp-crm fuettern. Hier sind sie, inklusive der Stelle wo ich eine halbe Stunde gegen eine Wand gelaufen bin. ## Recipe 1: Jeder Code-Edit landet als Interaction im CRM Die Idee ist simpel. Immer wenn Claude eine Datei aendert, soll ein Eintrag ins CRM. Nicht weil jeder Edit weltbewegend ist, sondern weil die Summe ueber zwei Wochen eine echte Spur ergibt was an einem Projekt passiert ist. ```json { "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "mcp_tool", "server": "mcp-crm", "tool": "crm_log_interaction", "input": { "channel": "code", "note": "Datei bearbeitet: ${tool_input.file_path}" } } ] } ] } } ``` Der `matcher` mit `"Edit|Write"` greift nur bei diesen beiden Tools, nicht bei jedem Read oder Grep. Das `${tool_input.file_path}` ist Templating: Claude Code setzt da den echten Pfad der gerade bearbeiteten Datei ein. Und die dokumentierte Eigenschaft die ich am meisten mag steht direkt in den Docs: wenn der Server nicht verbunden ist oder das Tool einen Fehler wirft, laeuft die Ausfuehrung trotzdem weiter. Heisst: wenn mein CRM mal down ist, blockiert das nicht meine ganze Session. ## Recipe 2: CRM-Kontext vor jedem Prompt laden Das zweite Rezept dreht die Richtung um. Bevor ich ueberhaupt was tippe, soll Claude wissen was im CRM zu diesem Kunden steht. ```json { "hooks": { "UserPromptSubmit": [ { "hooks": [ { "type": "mcp_tool", "server": "mcp-crm", "tool": "crm_search" } ] } ] } } ``` Sieht harmlos aus. War es nicht. ## Wo ich mir ins Knie geschossen hab Ich hab eine halbe Stunde nach einem `matcher` fuer UserPromptSubmit gesucht. Wollte den Hook nur feuern lassen wenn meine Prompt das Wort "Kunde" enthaelt. Hab Configs umgebaut, Anfuehrungszeichen verschoben, Doku quergelesen. Nichts. Der Hook feuerte einfach bei jedem einzelnen Prompt. Dann hab ich endlich in die Docs geschaut statt zu raten. UserPromptSubmit hat keinen `matcher`. Das Event-Objekt kennt nur `hookEventName` und `additionalContext`, sonst nichts. Der `matcher` existiert ausschliesslich fuer PreToolUse und PostToolUse, weil da ein Tool-Name zum Matchen da ist. Bei einem Prompt gibt es keinen Tool-Namen, also auch nichts zu matchen. In der halben Stunde hatte ich 14 ueberfluessige CRM-Suchen gefeuert, eine pro Test-Prompt. Die Loesung war nicht in der Hook-Config, sondern im Tool selbst: ich hab `crm_search` server-seitig einen Early-Return verpasst, der nichts tut wenn der Prompt-Kontext offensichtlich kein Kunden-Thema ist. Filterung gehoert dahin wo die Logik sitzt, nicht in die Hook-Config die das gar nicht kann. ## Was mcp_tool-Hooks nicht koennen Beide Rezepte funktionieren weil der Input deterministisch ist. Ich weiss vorher welches Tool mit welchen Feldern aufgerufen wird. Was nicht geht: ein mcp_tool-Hook der erst ueberlegen muss was er eintraegt. Es ist kein LLM in der Schleife, es ist ein fester Tool-Call mit Template-Variablen. Sobald du Urteilsvermoegen brauchst ("fass diesen Call sinnvoll zusammen"), nimmst du wieder einen command-Hook der ein Script mit eigener Logik startet. Fuer Retrieval und Logging ist das aber genau richtig. Ueber zwei Wochen sind so rund 60 CRM-Eintraege automatisch entstanden, keinen davon hab ich von Hand getippt. Das ist der Unterschied zwischen einem CRM das ich pflege und einem das sich selbst pflegt. Wenn du tiefer ins Thema willst, die Mechanik der mcp_tool-Hooks erklaer ich in [Level 4](/levels/4/mcp-tool-hooks), und wenn ein Hook mal gar nicht feuert hilft das [Playbook zum Debuggen](/playbooks/hooks-debuggen-wenn-nichts-feuert). Die offizielle Referenz mit allen Event-Feldern steht in den [Claude Code Hook-Docs](https://code.claude.com/docs/en/hooks).
← Weitere Blog-Posts
Hook-Recipes fuer MCP-CRM: Wenn jeder Edit automatisch im CRM landet — Blog — StudioMeyer Academy