Le SDK Claude Agent fournit des contrôles de permissions puissants qui vous permettent de gérer comment Claude utilise les outils dans votre application.
Ce guide couvre comment implémenter des systèmes de permissions en utilisant le callback canUseTool, les hooks, et les règles de permissions settings.json. Pour la documentation API complète, voir la référence du SDK TypeScript.
Le SDK Claude Agent fournit quatre façons complémentaires de contrôler l'utilisation des outils :
Cas d'usage pour chaque approche :
canUseTool - Approbation dynamique pour les cas non couverts, demande l'autorisation à l'utilisateurOrdre de Traitement : Hook PreToolUse → Règles de Refus → Règles d'Autorisation → Règles de Demande → Vérification du Mode de Permission → Callback canUseTool → Hook PostToolUse
Les modes de permission fournissent un contrôle global sur la façon dont Claude utilise les outils. Vous pouvez définir le mode de permission lors de l'appel de query() ou le changer dynamiquement pendant les sessions de streaming.
Le SDK prend en charge quatre modes de permission, chacun avec un comportement différent :
| Mode | Description | Comportement des Outils |
|---|---|---|
default | Comportement de permission standard | Les vérifications de permissions normales s'appliquent |
plan | Mode planification - pas d'exécution | Claude ne peut utiliser que des outils en lecture seule ; présente un plan avant l'exécution (Actuellement non pris en charge dans le SDK) |
acceptEdits | Accepter automatiquement les modifications de fichiers | Les modifications de fichiers et les opérations du système de fichiers sont automatiquement approuvées |
bypassPermissions | Contourner toutes les vérifications de permissions | Tous les outils s'exécutent sans invites de permission (à utiliser avec précaution) |
Vous pouvez définir le mode de permission de deux façons :
Définissez le mode lors de la création d'une requête :
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "Aidez-moi à refactoriser ce code",
options: {
permissionMode: 'default' // Mode de permission standard
}
});Changez le mode pendant une session de streaming :
import { query } from "@anthropic-ai/claude-agent-sdk";
// Créer un générateur asynchrone pour l'entrée en streaming
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "Commençons avec les permissions par défaut"
}
};
// Plus tard dans la conversation...
yield {
type: 'user',
message: {
role: 'user',
content: "Maintenant accélérons le développement"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // Commencer en mode par défaut
}
});
// Changer le mode dynamiquement
await q.setPermissionMode('acceptEdits');
// Traiter les messages
for await (const message of q) {
console.log(message);
}acceptEdits)En mode accepter les modifications :
Opérations auto-approuvées :
bypassPermissions)En mode contourner les permissions :
Les modes de permission sont évalués à un point spécifique dans le flux de permissions :
bypassPermissions - Si actif, autorise tous les outils restantscanUseToolcanUseTool - Gère les cas restantsCela signifie :
bypassPermissionsbypassPermissions préempt le callback canUseTool pour les outils non correspondantsExemple de progression de mode :
// Commencer en mode par défaut pour une exécution contrôlée
permissionMode: 'default'
// Passer à acceptEdits pour une itération rapide
await q.setPermissionMode('acceptEdits')Le callback canUseTool est passé comme option lors de l'appel de la fonction query. Il reçoit le nom de l'outil et les paramètres d'entrée, et doit retourner une décision - soit autoriser soit refuser.
canUseTool se déclenche chaque fois que Claude Code afficherait une invite de permission à un utilisateur, par exemple les hooks et les règles de permissions ne le couvrent pas et il n'est pas en mode acceptEdits.
Voici un exemple complet montrant comment implémenter l'approbation interactive d'outils :
import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 Demande d'Outil :");
console.log(` Outil : ${toolName}`);
// Afficher les paramètres de l'outil
if (input && Object.keys(input).length > 0) {
console.log(" Paramètres :");
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}`);
}
}
// Obtenir l'approbation de l'utilisateur (remplacer par votre logique d'interface utilisateur)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ Approuvé\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ Refusé\n");
return {
behavior: "deny",
message: "L'utilisateur a refusé la permission pour cet outil"
};
}
}
// Utiliser le callback de permission
const result = await query({
prompt: "Aidez-moi à analyser cette base de code",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});