claude-code-notifier
so funktioniert's Guides faq
◐Deutsch
English العربية Deutsch Español Français עברית Italiano 日本語 한국어 Nederlands Polski Português (Brasil) Русский Türkçe Tiếng Việt 简体中文 繁體中文
Loslegen
Alle Guides

Berechtigungsanfragen per Hook beantworten (PermissionRequest)

Aktualisiert am 31. Oktober 2026 · 6 Min. Lesezeit
Auf dieser Seite 01PermissionRequest im Vergleich zu PreToolUse und Notification 02Was der Hook bekommt 03Das Decision-Objekt 04Beispiel: einen Prompt automatisch genehmigen 05Beispiel: anhand des Befehls entscheiden 06Beispiel: erlauben und für die Session merken 07Oft ist eine Permission-Regel das bessere Werkzeug 08Typische Stolperfallen 09Wo Claude Code Notifier ins Spiel kommt 10FAQ

Der PermissionRequest-Hook von Claude Code läuft genau dann, wenn Claude Code dir gleich einen Permission-Prompt zeigen würde, und kann diesen Prompt für dich beantworten. Zum Erlauben beendet sich der Hook mit 0 und gibt {"hookSpecificOutput": {"hookEventName": "PermissionRequest", "decision": {"behavior": "allow"}}} aus; zum Ablehnen nutzt er "behavior": "deny" mit einer message für Claude. Er matcht auf den Tool-Namen, kann deine Deny-Regeln nicht aushebeln, und Exit-Code 2 bewirkt bei diesem Event nichts. Gibt der Hook keine Entscheidung aus, erscheint der normale Prompt.

01PermissionRequest im Vergleich zu PreToolUse und Notification

Drei Hook-Events haben mit Berechtigungen zu tun, und sie erfüllen unterschiedliche Aufgaben:

EventWann er läuftKann er entscheiden?
PreToolUseVor jedem Tool-Aufruf, egal ob eine Berechtigung nötig ist oder nichtJa: allow, deny, ask oder defer
PermissionRequestNur wenn Claude Code dich gleich fragen würdeJa: allow oder deny
Notification (permission_prompt)Nachdem ein Prompt etwa sechs Sekunden gewartet hat, während du weg bistNein

Nimm PermissionRequest, wenn es dir um die Prompts selbst geht: sie beantworten, loggen oder irgendwohin schicken. Er feuert sofort, ohne sechs Sekunden Verzögerung. Nimm PreToolUse für Regeln, die für jeden Aufruf gelten sollen, etwa „nie rm -rf ausführen“, denn er läuft auch, wenn gar kein Prompt erscheinen würde. Der Notification hook-Guide erklärt das Timing dieses Events.

02Was der Hook bekommt

Neben den gemeinsamen Feldern bekommt ein PermissionRequest-Hook tool_name und tool_input des Aufrufs, den Claude machen will, sowie ein optionales permission_suggestions-Array:

{
  "session_id": "abc123",
  "cwd": "/Users/...",
  "permission_mode": "default",
  "hook_event_name": "PermissionRequest",
  "tool_name": "Bash",
  "tool_input": {
    "command": "rm -rf node_modules",
    "description": "Remove node_modules directory"
  },
  "permission_suggestions": [
    {
      "type": "addRules",
      "rules": [{ "toolName": "Bash", "ruleContent": "rm -rf node_modules" }],
      "behavior": "allow",
      "destination": "localSettings"
    }
  ]
}

permission_suggestions enthält die Regeländerungen, die Claude Code für diese Anfrage vorschlagen würde. Es ist keine exakte Kopie der Optionen im Dialog, denn jeder Dialog baut seine eigenen Optionen.

03Das Decision-Objekt

Gib eine decision innerhalb von hookSpecificOutput zurück:

FeldNimm
behavior"allow" oder "deny"
updatedInputNur bei allow. Ersetzt den kompletten Input des Tools, also gib auch unveränderte Felder mit
updatedPermissionsNur bei allow. Anzuwendende Berechtigungsänderungen, z. B. eine Regel hinzufügen oder den Modus wechseln
messageNur bei deny. Erklärt Claude den Grund
interruptNur bei deny. true stoppt zusätzlich Claude

Zwei Regeln solltest du dir merken:

  • Deny- und Ask-Regeln gelten weiterhin. Ein Hook, der "allow" zurückgibt, setzt keine passende Deny-Regel in deinen Settings außer Kraft, und geänderter Input wird erneut gegen diese Regeln geprüft.
  • Exit-Code 2 wird hier ignoriert. Bei den meisten Events blockiert Exit 2, aber ein PermissionRequest-Hook, der ohne decision-Objekt mit 2 beendet, lässt den Prompt unverändert. Wenn du ablehnen willst, gib die Entscheidung zurück.

04Beispiel: einen Prompt automatisch genehmigen

Das Beispiel von Anthropic selbst genehmigt ExitPlanMode, also den Prompt, der erscheint, wenn Claude einen Plan fertig hat – so wirst du nicht jedes Mal gefragt:

{
  "hooks": {
    "PermissionRequest": [
      {
        "matcher": "ExitPlanMode",
        "hooks": [
          {
            "type": "command",
            "command": "echo '{\"hookSpecificOutput\": {\"hookEventName\": \"PermissionRequest\", \"decision\": {\"behavior\": \"allow\"}}}'"
          }
        ]
      }
    ]
  }
}

Halte Matcher eng. Ein leerer Matcher oder .* mit pauschalem Allow würde jeden Prompt genehmigen, inklusive Dateischreibzugriffen und Shell-Befehlen.

05Beispiel: anhand des Befehls entscheiden

Dieses Skript (braucht jq) lehnt alles ab, was git push betrifft, mit einer Begründung, die Claude lesen kann, und überlässt dir alle anderen Prompts, indem es nichts ausgibt:

#!/bin/bash
# ~/.claude/hooks/permission-check.sh
input=$(cat)
cmd=$(jq -r '.tool_input.command // empty' <<<"$input")

case "$cmd" in
  *"git push"*)
    jq -nc '{hookSpecificOutput: {hookEventName: "PermissionRequest",
             decision: {behavior: "deny",
                        message: "Pushing is not allowed from this session. Commit and stop."}}}'
    ;;
esac
exit 0
{
  "hooks": {
    "PermissionRequest": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "~/.claude/hooks/permission-check.sh" }]
      }
    ]
  }
}

Bau das JSON mit jq statt durch String-Verkettung, damit Anführungszeichen in der Nachricht es nicht kaputt machen. Und stell sicher, dass sonst nichts auf stdout landet. Gibt dein Shell-Profil eine Zeile aus, liest Claude Code die Entscheidung nicht.

06Beispiel: erlauben und für die Session merken

Um eine Anfrage zu genehmigen und zu verhindern, dass Claude bis zum Ende der Session erneut fragt, füge einen updatedPermissions-Eintrag mit destination: "session" hinzu. Ein Hook kann einen der erhaltenen permission_suggestions zurückgeben und nur die Destination ändern:

#!/bin/bash
input=$(cat)
jq -c '{hookSpecificOutput: {hookEventName: "PermissionRequest",
        decision: {behavior: "allow",
                   updatedPermissions: [(.permission_suggestions // [])[]
                                        | select(.type == "addRules")
                                        | .destination = "session"]}}}' <<<"$input"

So wie es dasteht, erlaubt das jede Anfrage, die es sieht – kombiniere es also mit einem engen Matcher. Die Destination kann auch localSettings, projectSettings oder userSettings sein; dann wird die Regel in eine Settings-Datei geschrieben, statt nur im Speicher zu bleiben.

07Oft ist eine Permission-Regel das bessere Werkzeug

Wenn die Antwort immer gleich ist, brauchst du keinen Hook. Schreib die Regel in settings.json, und Claude Code wendet sie an, ohne etwas auszuführen:

{
  "permissions": {
    "allow": ["Bash(npm run *)"],
    "deny": ["Bash(git push *)"]
  }
}

Regeln werden in der Reihenfolge Deny, dann Ask, dann Allow ausgewertet. Ein Hook lohnt sich, wenn die Entscheidung von etwas abhängt, das eine Regel nicht sehen kann – etwa der Uhrzeit, dem aktuellen Branch oder einer Person, die von woanders antwortet. Permission-Modi erklärt behandelt die anderen eingebauten Optionen.

08Typische Stolperfallen

  • Nicht-interaktive Läufe. Mit claude -p gibt es niemanden, den man fragen kann. PermissionRequest-Hooks laufen trotzdem, und wenn keiner eine Entscheidung zurückgibt, wird der Aufruf abgelehnt.
  • Timeouts. Ein Command-Hook darf standardmäßig bis zu 600 Sekunden laufen, und Claude wartet. Setz timeout (in Sekunden), wenn dein Hook auf etwas Langsames wartet, zum Beispiel auf eine Person.
  • Manche Prompts lösen ihn nicht aus. Die Netzwerkanfrage eines Befehls in der Sandbox führt PermissionRequest nicht aus. Nutz dafür den Notification-Typ permission_prompt.
  • Sicherheit. Ein Hook, der "allow" zurückgibt, genehmigt Aktionen in deinem Namen mit den Rechten deines Users. Prüf ihn wie jeden anderen Code, der Befehle ausführen kann.

09Wo Claude Code Notifier ins Spiel kommt

Der häufigste Grund für einen PermissionRequest-Hook ist, Prompts zu beantworten, wenn du nicht an der Tastatur sitzt. Eine selbstgebaute Lösung muss die Anfrage irgendwohin schicken, auf eine Antwort warten und sie vor dem Timeout zurückgeben. Das ist machbar, und manche bauen es mit einem Chatbot.

Claude Code Notifier nimmt dir das ab. Das kostenlose Kommandozeilen-Tool ccn läuft auf Mac, Windows und Linux und installiert seine Hooks in ~/.claude/settings.json. Ist die iPhone- oder Android-App gekoppelt, landet eine Permission-Anfrage auf deinem Handy, und du kannst einmal erlauben, für die Session erlauben oder ablehnen; ccn gibt diese Entscheidung aus dem PermissionRequest-Hook zurück. Hast du in den letzten 30 Sekunden getippt, wartet nichts und das Terminal fragt wie gewohnt. Bist du weg, wartet das Terminal auf das Handy bis zu einer von dir gewählten Obergrenze (hold_ceiling_seconds, Standard 600) und hört sofort auf zu warten, sobald du die Tastatur berührst. Es ist unabhängig und nicht von Anthropic. Zum Workflow siehe Permissions vom Handy genehmigen, zur Sicherheit Ist Remote-Freigabe sicher?.

10FAQ

Wie genehmige ich Permissions automatisch mit einem Hook?

Füge einen PermissionRequest-Hook mit engem Matcher hinzu, lass ihn eine JSON-Entscheidung mit "behavior": "allow" innerhalb von hookSpecificOutput ausgeben und mit 0 beenden. Soll derselbe Befehl immer erlaubt sein, ist eine permissions.allow-Regel in settings.json einfacher und braucht keinen Hook.

Warum lehnt Exit-Code 2 die Anfrage nicht ab?

PermissionRequest gehört zu den Events, bei denen Exit 2 nicht berücksichtigt wird. Claude Code ignoriert ihn und zeigt den normalen Prompt. Gib stattdessen "behavior": "deny" im Decision-Objekt zurück.

Kann ein PermissionRequest-Hook meine Deny-Regeln aushebeln?

Nein. Deny- und Ask-Regeln werden weiterhin ausgewertet, ein "allow" aus einem Hook kommt also nicht an einer passenden Deny-Regel vorbei. Auch jedes zurückgegebene updatedInput wird gegen diese Regeln geprüft.

Was ist der Unterschied zwischen PermissionRequest und PreToolUse?

PreToolUse läuft vor jedem Tool-Aufruf und kann erlauben, ablehnen, nachfragen oder aufschieben. PermissionRequest läuft nur, wenn Claude Code gleich einen Prompt anzeigen will, und kann ihn erlauben oder ablehnen. Nutz PreToolUse für Policies und PermissionRequest zum Beantworten von Prompts.

Was passiert, wenn mein Hook nichts ausgibt?

Nichts ändert sich. Claude Code zeigt den üblichen Permission-Prompt im Terminal, als gäbe es den Hook nicht.

Claude Code Notifier Bekomm einen Push aufs Handy, wenn Claude Code fertig ist oder dich braucht, und genehmige, lehne ab oder antworte direkt von dort. Das Kommandozeilentool ccn ist kostenlos für Mac, Windows und Linux.
Für iOS laden Für Android laden ccn installieren

Ähnliche Guides

  • Claude Code-Permission-Anfragen vom Handy genehmigenDer PermissionRequest-Hook von Claude Code kann Allow oder Deny zurückgeben. So beantwortest du Permission-Prompts vom Handy aus – selbstgebaut oder mit ccn.
  • Claude Code-Hooks erklärt: alle Events und wofür sie gut sindWas Claude Code-Hooks sind, wo sie in der settings.json stehen, wie Matcher, Input und Exit-Codes funktionieren und wofür jedes Hook-Event da ist.
  • Claude Code-Permission-Modi erklärt (default, acceptEdits, plan, bypassPermissions)Was die einzelnen Claude Code-Permission-Modi machen (default, acceptEdits, plan, auto, dontAsk, bypassPermissions), wie du wechselst und wann welcher sicher ist.
  • Ist es sicher, Claude Code-Aktionen vom Handy aus freizugeben?Wie Remote-Freigaben für Claude Code funktionieren, was schiefgehen kann, welche Daten deinen Computer verlassen und mit welchen Einstellungen es sicher bleibt.
claude-code-notifier

Claude Code Notifier ist eine unabhängige Drittanbieter-Anwendung. Sie steht in keiner Verbindung zu Anthropic, PBC und wird von Anthropic, PBC weder unterstützt noch gesponsert. „Claude“ und „Claude Code“ sind Marken von Anthropic, PBC.

apps iOS-App Android-App ccn für macOS, Windows & Linux Alle Guides
rechtliches Datenschutzerklärung Nutzungsbedingungen Weitere Sprachen © 2026 touchtap. Alle Rechte vorbehalten. TouchTap Ltd ist in England und Wales eingetragen, Registernummer 13942589.