Claude Agent SDK는 애플리케이션에서 Claude가 도구를 사용하는 방법을 관리할 수 있는 강력한 권한 제어 기능을 제공합니다.
이 가이드는 canUseTool 콜백, 훅, settings.json 권한 규칙을 사용하여 권한 시스템을 구현하는 방법을 다룹니다. 완전한 API 문서는 TypeScript SDK 참조를 참조하세요.
Claude Agent SDK는 도구 사용을 제어하는 네 가지 보완적인 방법을 제공합니다:
각 접근 방식의 사용 사례:
canUseTool - 다루어지지 않은 경우에 대한 동적 승인, 사용자에게 권한 요청처리 순서: PreToolUse Hook → 거부 규칙 → 허용 규칙 → 문의 규칙 → 권한 모드 확인 → canUseTool Callback → PostToolUse Hook
권한 모드는 Claude가 도구를 사용하는 방법에 대한 전역 제어를 제공합니다. query()를 호출할 때 권한 모드를 설정하거나 스트리밍 세션 중에 동적으로 변경할 수 있습니다.
SDK는 각각 다른 동작을 가진 네 가지 권한 모드를 지원합니다:
| 모드 | 설명 | 도구 동작 |
|---|---|---|
default | 표준 권한 동작 | 일반적인 권한 검사가 적용됩니다 |
plan | 계획 모드 - 실행 없음 | Claude는 읽기 전용 도구만 사용할 수 있으며, 실행 전에 계획을 제시합니다 (현재 SDK에서 지원되지 않음) |
acceptEdits | 파일 편집 자동 승인 | 파일 편집 및 파일시스템 작업이 자동으로 승인됩니다 |
bypassPermissions | 모든 권한 검사 우회 | 모든 도구가 권한 프롬프트 없이 실행됩니다 (주의해서 사용) |
권한 모드를 설정하는 두 가지 방법이 있습니다:
쿼리를 생성할 때 모드를 설정합니다:
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "이 코드를 리팩터링하는 데 도움을 주세요",
options: {
permissionMode: 'default' // 표준 권한 모드
}
});스트리밍 세션 중에 모드를 변경합니다:
import { query } from "@anthropic-ai/claude-agent-sdk";
// 스트리밍 입력을 위한 비동기 제너레이터 생성
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "기본 권한으로 시작해봅시다"
}
};
// 대화 중 나중에...
yield {
type: 'user',
message: {
role: 'user',
content: "이제 개발 속도를 높여봅시다"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // 기본 모드로 시작
}
});
// 동적으로 모드 변경
await q.setPermissionMode('acceptEdits');
// 메시지 처리
for await (const message of q) {
console.log(message);
}acceptEdits)편집 승인 모드에서:
자동 승인되는 작업:
bypassPermissions)권한 우회 모드에서:
권한 모드는 권한 흐름의 특정 지점에서 평가됩니다:
bypassPermissions 모드 - 활성화되면 나머지 모든 도구를 허용합니다canUseTool 콜백에 위임합니다canUseTool 콜백 - 나머지 경우를 처리합니다이는 다음을 의미합니다:
bypassPermissions 모드에서도 항상 도구 사용을 제어할 수 있습니다bypassPermissions 모드는 일치하지 않는 도구에 대해 canUseTool 콜백을 재정의합니다모드 진행 예시:
// 제어된 실행을 위해 기본 모드로 시작
permissionMode: 'default'
// 빠른 반복을 위해 acceptEdits로 전환
await q.setPermissionMode('acceptEdits')canUseTool 콜백은 query 함수를 호출할 때 옵션으로 전달됩니다. 도구 이름과 입력 매개변수를 받고, 허용 또는 거부 결정을 반환해야 합니다.
canUseTool은 Claude Code가 사용자에게 권한 프롬프트를 표시할 때마다 실행됩니다. 예를 들어, 훅과 권한 규칙이 이를 다루지 않고 acceptEdits 모드가 아닐 때입니다.
다음은 대화형 도구 승인을 구현하는 방법을 보여주는 완전한 예시입니다:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 도구 요청:");
console.log(` 도구: ${toolName}`);
// 도구 매개변수 표시
if (input && Object.keys(input).length > 0) {
console.log(" 매개변수:");
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}`);
}
}
// 사용자 승인 받기 (UI 로직으로 교체)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ 승인됨\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ 거부됨\n");
return {
behavior: "deny",
message: "사용자가 이 도구에 대한 권한을 거부했습니다"
};
}
}
// 권한 콜백 사용
const result = await query({
prompt: "이 코드베이스를 분석하는 데 도움을 주세요",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});