Das Claude Agent SDK bietet leistungsstarke Berechtigungskontrollen, mit denen Sie verwalten können, wie Claude Tools in Ihrer Anwendung verwendet.
Dieser Leitfaden behandelt die Implementierung von Berechtigungssystemen mit dem canUseTool-Callback, Hooks und settings.json-Berechtigungsregeln. Für die vollständige API-Dokumentation siehe die TypeScript SDK-Referenz.
Das Claude Agent SDK bietet vier ergänzende Möglichkeiten zur Kontrolle der Tool-Nutzung:
Anwendungsfälle für jeden Ansatz:
canUseTool - Dynamische Genehmigung für nicht abgedeckte Fälle, fordert Benutzer zur Berechtigung aufVerarbeitungsreihenfolge: PreToolUse Hook → Verweigerungs-Regeln → Erlaubnis-Regeln → Frage-Regeln → Berechtigungsmodus-Prüfung → canUseTool Callback → PostToolUse Hook
Berechtigungsmodi bieten globale Kontrolle darüber, wie Claude Tools verwendet. Sie können den Berechtigungsmodus beim Aufruf von query() festlegen oder ihn während Streaming-Sitzungen dynamisch ändern.
Das SDK unterstützt vier Berechtigungsmodi, jeder mit unterschiedlichem Verhalten:
| Modus | Beschreibung | Tool-Verhalten |
|---|---|---|
default | Standard-Berechtigungsverhalten | Normale Berechtigungsprüfungen gelten |
plan | Planungsmodus - keine Ausführung | Claude kann nur schreibgeschützte Tools verwenden; präsentiert einen Plan vor der Ausführung (Derzeit nicht im SDK unterstützt) |
acceptEdits | Datei-Bearbeitungen automatisch akzeptieren | Datei-Bearbeitungen und Dateisystem-Operationen werden automatisch genehmigt |
bypassPermissions | Alle Berechtigungsprüfungen umgehen | Alle Tools laufen ohne Berechtigungsaufforderungen (mit Vorsicht verwenden) |
Sie können den Berechtigungsmodus auf zwei Arten festlegen:
Legen Sie den Modus beim Erstellen einer Abfrage fest:
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "Hilf mir, diesen Code zu refaktorieren",
options: {
permissionMode: 'default' // Standard-Berechtigungsmodus
}
});Ändern Sie den Modus während einer Streaming-Sitzung:
acceptEdits)Im Bearbeitungen akzeptieren-Modus:
Automatisch genehmigte Operationen:
bypassPermissions)Im Berechtigungen umgehen-Modus:
Berechtigungsmodi werden an einem bestimmten Punkt im Berechtigungsfluss bewertet:
bypassPermissions-Modus - Wenn aktiv, erlaubt alle verbleibenden ToolscanUseTool-CallbackcanUseTool-Callback - Behandelt verbleibende FälleDas bedeutet:
bypassPermissions-ModusbypassPermissions-Modus überschreibt den canUseTool-Callback für nicht übereinstimmende ToolsBeispiel für Modus-Progression:
// Im Standard-Modus für kontrollierte Ausführung beginnen
permissionMode: 'default'
// Zu acceptEdits für schnelle Iteration wechseln
await q.setPermissionMode('acceptEdits')Der canUseTool-Callback wird als Option beim Aufruf der query-Funktion übergeben. Er erhält den Tool-Namen und Eingabeparameter und muss eine Entscheidung zurückgeben - entweder erlauben oder verweigern.
canUseTool wird ausgelöst, wann immer Claude Code eine Berechtigungsaufforderung an einen Benutzer zeigen würde, z.B. Hooks und Berechtigungsregeln decken es nicht ab und es ist nicht im acceptEdits-Modus.
Hier ist ein vollständiges Beispiel, das zeigt, wie interaktive Tool-Genehmigung implementiert wird:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Erstellen Sie einen asynchronen Generator für Streaming-Eingabe
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "Lass uns mit Standard-Berechtigungen beginnen"
}
};
// Später im Gespräch...
yield {
type: 'user',
message: {
role: 'user',
content: "Jetzt lass uns die Entwicklung beschleunigen"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // Im Standard-Modus beginnen
}
});
// Modus dynamisch ändern
await q.setPermissionMode('acceptEdits');
// Nachrichten verarbeiten
for await (const message of q) {
console.log(message);
}import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 Tool-Anfrage:");
console.log(` Tool: ${toolName}`);
// Tool-Parameter anzeigen
if (input && Object.keys(input).length > 0) {
console.log(" Parameter:");
for (const [key, value] of Object.entries(input)) {
let displayValue = value;
if (typeof value === 'string' && value.length > 100) {
displayValue = value.substring(0, 100) + "...";
} else if (typeof value === 'object') {
displayValue = JSON.stringify(value, null, 2);
}
console.log(` ${key}: ${displayValue}`);
}
}
// Benutzer-Genehmigung einholen (ersetzen Sie durch Ihre UI-Logik)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ Genehmigt\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ Verweigert\n");
return {
behavior: "deny",
message: "Benutzer hat die Berechtigung für dieses Tool verweigert"
};
}
}
// Den Berechtigungs-Callback verwenden
const result = await query({
prompt: "Hilf mir, diese Codebasis zu analysieren",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});