Claude Agent SDK menyediakan kontrol izin yang kuat yang memungkinkan Anda mengelola bagaimana Claude menggunakan alat dalam aplikasi Anda.
Panduan ini mencakup cara mengimplementasikan sistem izin menggunakan callback canUseTool, hooks, dan aturan izin settings.json. Untuk dokumentasi API lengkap, lihat referensi TypeScript SDK.
Claude Agent SDK menyediakan empat cara komplementer untuk mengontrol penggunaan alat:
Kasus penggunaan untuk setiap pendekatan:
canUseTool - Persetujuan dinamis untuk kasus yang tidak tercakup, meminta izin penggunaUrutan Pemrosesan: PreToolUse Hook → Aturan Tolak → Aturan Izinkan → Aturan Tanya → Pemeriksaan Mode Izin → canUseTool Callback → PostToolUse Hook
Mode izin menyediakan kontrol global atas bagaimana Claude menggunakan alat. Anda dapat mengatur mode izin saat memanggil query() atau mengubahnya secara dinamis selama sesi streaming.
SDK mendukung empat mode izin, masing-masing dengan perilaku yang berbeda:
| Mode | Deskripsi | Perilaku Alat |
|---|---|---|
default | Perilaku izin standar | Pemeriksaan izin normal berlaku |
plan | Mode perencanaan - tidak ada eksekusi | Claude hanya dapat menggunakan alat read-only; menyajikan rencana sebelum eksekusi (Saat ini tidak didukung dalam SDK) |
acceptEdits | Otomatis menerima edit file | Edit file dan operasi filesystem secara otomatis disetujui |
bypassPermissions | Melewati semua pemeriksaan izin | Semua alat berjalan tanpa prompt izin (gunakan dengan hati-hati) |
Anda dapat mengatur mode izin dengan dua cara:
Atur mode saat membuat query:
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "Bantu saya refactor kode ini",
options: {
permissionMode: 'default' // Mode izin standar
}
});Ubah mode selama sesi streaming:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Buat async generator untuk input streaming
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "Mari mulai dengan izin default"
}
};
// Nanti dalam percakapan...
yield {
type: 'user',
message: {
role: 'user',
content: "Sekarang mari percepat pengembangan"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // Mulai dalam mode default
}
});
// Ubah mode secara dinamis
await q.setPermissionMode('acceptEdits');
// Proses pesan
for await (const message of q) {
console.log(message);
}acceptEdits)Dalam mode accept edits:
Operasi yang auto-approved:
bypassPermissions)Dalam mode bypass permissions:
Mode izin dievaluasi pada titik tertentu dalam alur izin:
bypassPermissions - Jika aktif, mengizinkan semua alat yang tersisacanUseToolcanUseTool - Menangani kasus yang tersisaIni berarti:
bypassPermissionsbypassPermissions menimpa callback canUseTool untuk alat yang tidak cocokContoh progres mode:
// Mulai dalam mode default untuk eksekusi terkontrol
permissionMode: 'default'
// Beralih ke acceptEdits untuk iterasi cepat
await q.setPermissionMode('acceptEdits')Callback canUseTool diteruskan sebagai opsi saat memanggil fungsi query. Ini menerima nama alat dan parameter input, dan harus mengembalikan keputusan - baik izinkan atau tolak.
canUseTool dipicu setiap kali Claude Code akan menampilkan prompt izin kepada pengguna, misalnya hooks dan aturan izin tidak mencakupnya dan tidak dalam mode acceptEdits.
Berikut adalah contoh lengkap yang menunjukkan cara mengimplementasikan persetujuan alat interaktif:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 Permintaan Alat:");
console.log(` Alat: ${toolName}`);
// Tampilkan parameter alat
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}`);
}
}
// Dapatkan persetujuan pengguna (ganti dengan logika UI Anda)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ Disetujui\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ Ditolak\n");
return {
behavior: "deny",
message: "Pengguna menolak izin untuk alat ini"
};
}
}
// Gunakan callback izin
const result = await query({
prompt: "Bantu saya analisis codebase ini",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});