Das Claude Agent SDK bietet leistungsstarke Berechtigungskontrollen, mit denen Sie verwalten können, wie Claude Werkzeuge in Ihrer Anwendung nutzt.
Dieser Leitfaden behandelt die Implementierung von Berechtigungssystemen mithilfe des canUseTool-Callbacks, Hooks und settings.json-Berechtigungsregeln. Für die vollständige API-Dokumentation siehe die TypeScript SDK-Referenz.
Das Claude Agent SDK bietet vier komplementäre Möglichkeiten zur Steuerung der Werkzeugnutzung:
Anwendungsfälle für jeden Ansatz:
canUseTool - Dynamische Genehmigung für nicht abgedeckte Fälle, fordert Benutzer zur Genehmigung aufVerarbeitungsreihenfolge: PreToolUse Hook → Deny Rules → Allow Rules → Ask Rules → Permission Mode Check → canUseTool Callback → PostToolUse Hook
Berechtigungsmodi bieten globale Kontrolle darüber, wie Claude Werkzeuge nutzt. Sie können den Berechtigungsmodus beim Aufrufen von query() festlegen oder ihn während Streaming-Sitzungen dynamisch ändern.
Das SDK unterstützt vier Berechtigungsmodi, jeder mit unterschiedlichem Verhalten:
| Modus | Beschreibung | Werkzeugverhalten |
|---|---|---|
default | Standardberechtigungsverhalten | Normale Berechtigungsprüfungen gelten |
plan | Planungsmodus - keine Ausführung | Claude kann nur schreibgeschützte Werkzeuge verwenden; präsentiert einen Plan vor der Ausführung (Wird derzeit im SDK nicht unterstützt) |
acceptEdits | Automatisches Akzeptieren von Dateibearbeitungen | Dateibearbeitungen und Dateisystemoperationen werden automatisch genehmigt |
bypassPermissions | Alle Berechtigungsprüfungen umgehen | Alle Werkzeuge werden ohne Berechtigungsaufforderungen ausgeführt (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: "Help me refactor this code",
options: {
permissionMode: 'default' // Standard permission mode
}
});Ändern Sie den Modus während einer Streaming-Sitzung:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Create an async generator for streaming input
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "Let's start with default permissions"
}
};
// Later in the conversation...
yield {
type: 'user',
message: {
role: 'user',
content: "Now let's speed up development"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // Start in default mode
}
});
// Change mode dynamically
await q.setPermissionMode('acceptEdits');
// Process messages
for await (const message of q) {
console.log(message);
}acceptEdits)Im Modus "Bearbeitungen akzeptieren":
Automatisch genehmigte Operationen:
bypassPermissions)Im Modus "Berechtigungen umgehen":
Berechtigungsmodi werden an einem bestimmten Punkt im Berechtigungsfluss ausgewertet:
bypassPermissions-Modus - Falls aktiv, erlaubt alle verbleibenden WerkzeugecanUseTool-CallbackcanUseTool-Callback - Behandelt verbleibende FälleDies bedeutet:
bypassPermissions-ModusbypassPermissions-Modus überschreibt den canUseTool-Callback für nicht übereinstimmende WerkzeugeBeispiel für Modusfortschritt:
// Start in default mode for controlled execution
permissionMode: 'default'
// Switch to acceptEdits for rapid iteration
await q.setPermissionMode('acceptEdits')Der canUseTool-Callback wird als Option beim Aufrufen der query-Funktion übergeben. Er empfängt den Werkzeugnamen und Eingabeparameter und muss eine Entscheidung zurückgeben - entweder zulassen oder verweigern.
canUseTool wird immer dann ausgelöst, wenn Claude Code einem Benutzer eine Berechtigungsaufforderung anzeigen würde, z. B. wenn Hooks und Berechtigungsregeln es nicht abdecken und es nicht im acceptEdits-Modus ist.
Hier ist ein vollständiges Beispiel, das zeigt, wie Sie interaktive Werkzeugzustimmung implementieren:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 Tool Request:");
console.log(` Tool: ${toolName}`);
// Display tool parameters
if (input && Object.keys(input).length > 0) {
console.log(" Parameters:");
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}`);
}
}
// Get user approval (replace with your UI logic)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ Approved\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ Denied\n");
return {
behavior: "deny",
message: "User denied permission for this tool"
};
}
}
// Use the permission callback
const result = await query({
prompt: "Help me analyze this codebase",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});Das AskUserQuestion-Werkzeug ermöglicht es Claude, dem Benutzer während eines Gesprächs Klärungsfragen zu stellen. Wenn dieses Werkzeug aufgerufen wird, empfängt Ihr canUseTool-Callback die Fragen und muss die Antworten des Benutzers zurückgeben.
Wenn canUseTool mit toolName: "AskUserQuestion" aufgerufen wird, enthält die Eingabe:
{
questions: [
{
question: "Which database should we use?",
header: "Database",
options: [
{ label: "PostgreSQL", description: "Relational, ACID compliant" },
{ label: "MongoDB", description: "Document-based, flexible schema" }
],
multiSelect: false
},
{
question: "Which features should we enable?",
header: "Features",
options: [
{ label: "Authentication", description: "User login and sessions" },
{ label: "Logging", description: "Request and error logging" },
{ label: "Caching", description: "Redis-based response caching" }
],
multiSelect: true
}
]
}Geben Sie die Antworten in updatedInput.answers als Datensatz zurück, der Fragentext den ausgewählten Optionslabeln zuordnet:
return {
behavior: "allow",
updatedInput: {
questions: input.questions, // Pass through original questions
answers: {
"Which database should we use?": "PostgreSQL",
"Which features should we enable?": "Authentication, Caching"
}
}
}Multi-Select-Antworten sind durch Kommas getrennte Zeichenketten (z. B. "Authentication, Caching").